dev
dart 88 lines 2.37 KB
Raw
1 import 'dart:convert';
2
3 import 'package:cake_wallet/di.dart';
4 import 'package:cake_wallet/src/screens/wallet_connect/services/walletkit_service.dart';
5 import 'package:convert/convert.dart';
6 import 'package:flutter/foundation.dart';
7 import 'package:reown_walletkit/reown_walletkit.dart';
8
9 class EthUtils {
10 static String getUtf8Message(String maybeHex) {
11 if (maybeHex.startsWith('0x')) {
12 final List<int> decoded = hex.decode(
13 maybeHex.substring(2),
14 );
15 return utf8.decode(decoded);
16 }
17
18 return maybeHex;
19 }
20
21 static String? getAddressFromSessionRequest(SessionRequest request) {
22 try {
23 final paramsList = List<String?>.from((request.params as List));
24 if (request.method == 'personal_sign') {
25 // for `personal_sign` first value in params has to be always the message
26 paramsList.removeAt(0);
27 }
28
29 return paramsList.firstWhere((p) {
30 try {
31 EthereumAddress.fromHex(p ?? '');
32 return true;
33 } catch (e) {
34 return false;
35 }
36 });
37 } catch (e) {
38 debugPrint(e.toString());
39 return null;
40 }
41 }
42
43 static dynamic getDataFromSessionRequest(SessionRequest request) {
44 try {
45 final paramsList = List.from((request.params as List));
46 if (request.method == 'personal_sign') {
47 return paramsList.first;
48 }
49 return paramsList.firstWhere((p) {
50 final address = getAddressFromSessionRequest(request);
51 return p != address;
52 });
53 } catch (e) {
54 debugPrint('getDataFromSessionRequest $e');
55 return null;
56 }
57 }
58
59 static Map<String, dynamic>? getTransactionFromSessionRequest(
60 SessionRequest request,
61 ) {
62 try {
63 final param = (request.params as List<dynamic>).first;
64 return param as Map<String, dynamic>;
65 } catch (e) {
66 debugPrint('getTransactionFromSessionRequest $e');
67 return null;
68 }
69 }
70
71 static Future<dynamic> decodeMessageEvent(MessageEvent event) async {
72 final walletKit = getIt<WalletKitService>().walletKit;
73
74 final payloadString = await walletKit.core.crypto.decode(
75 event.topic,
76 event.message,
77 );
78
79 if (payloadString == null) return null;
80
81 final data = jsonDecode(payloadString) as Map<String, dynamic>;
82 if (data.containsKey('method')) {
83 return JsonRpcRequest.fromJson(data);
84 } else {
85 return JsonRpcResponse.fromJson(data);
86 }
87 }
88 }