walletConnect.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:polkawallet_sdk/service/index.dart';
  4. class ServiceWalletConnect {
  5. ServiceWalletConnect(this.serviceRoot);
  6. final SubstrateService serviceRoot;
  7. void initClient(
  8. String uri,
  9. String address,
  10. int chainId, {
  11. Map? cachedSession,
  12. }) {
  13. if (cachedSession != null) {
  14. serviceRoot.webView!.evalJavascript(
  15. 'walletConnect.reConnectSession(${jsonEncode(cachedSession)})');
  16. } else {
  17. serviceRoot.webView!.evalJavascript(
  18. 'walletConnect.initConnect("$uri", "$address", $chainId)');
  19. }
  20. }
  21. void subscribeEvents({
  22. required Function(Map) onPairing,
  23. required Function(Map) onPaired,
  24. required Function(Map) onCallRequest,
  25. required Function(String) onDisconnect,
  26. String? uri,
  27. bool isV2 = false,
  28. }) {
  29. serviceRoot.webView!
  30. .addMsgHandler("wallet_connect_message${isV2 ? '_v2' : ''}", (data) {
  31. final event = data['event'];
  32. switch (event) {
  33. case 'session_request':
  34. case 'session_proposal':
  35. onPairing(data);
  36. break;
  37. case 'connect':
  38. onPaired(data['session']);
  39. break;
  40. case 'call_request':
  41. onCallRequest(data);
  42. break;
  43. case 'disconnect':
  44. onDisconnect(uri == null ? data['topic'] : uri);
  45. break;
  46. }
  47. });
  48. }
  49. Future<void> disconnect() async {
  50. await serviceRoot.webView!.evalJavascript('walletConnect.disconnect()');
  51. }
  52. Future<void> confirmPairing(bool approve) async {
  53. await serviceRoot.webView!
  54. .evalJavascript('walletConnect.confirmConnect($approve)');
  55. }
  56. Future<void> confirmPairingV2(bool approve, String address) async {
  57. await serviceRoot.webView!
  58. .evalJavascript('walletConnect.confirmConnectV2($approve, "$address")');
  59. }
  60. Future<Map> confirmPayload(
  61. int id, bool approve, String password, Map gasOptions) async {
  62. final Map? res = await serviceRoot.webView!.evalJavascript(
  63. 'walletConnect.confirmCallRequest($id, $approve, "$password", ${jsonEncode(gasOptions)})');
  64. return res ?? {};
  65. }
  66. Future<Map> confirmPayloadV2(
  67. int id, bool approve, String password, Map gasOptions) async {
  68. final Map? res = await serviceRoot.webView!.evalJavascript(
  69. 'walletConnect.confirmCallRequestV2($id, $approve, "$password", ${jsonEncode(gasOptions)})');
  70. return res ?? {};
  71. }
  72. Future<void> changeAccount(String address) async {
  73. await serviceRoot.webView!
  74. .evalJavascript('walletConnect.updateSession({address: "$address"})');
  75. }
  76. Future<Map> changeAccountV2(String address) async {
  77. final Map res = await serviceRoot.webView!
  78. .evalJavascript('walletConnect.updateSessionV2({address: "$address"})');
  79. return res;
  80. }
  81. Future<void> changeNetwork(String chainId, String address) async {
  82. await serviceRoot.webView!.evalJavascript(
  83. 'walletConnect.updateSession({address: "$address", chainId: $chainId})');
  84. }
  85. Future<Map> changeNetworkV2(String chainId, String address) async {
  86. final Map res = await serviceRoot.webView!.evalJavascript(
  87. 'walletConnect.updateSessionV2({address: "$address", chainId: "$chainId"})');
  88. return res;
  89. }
  90. Future<void> injectCacheDataV2(Map cache, String address) async {
  91. await serviceRoot.webView!.evalJavascript(
  92. 'walletConnect.injectCacheDataV2(${jsonEncode(cache)}, "$address")');
  93. }
  94. Future<void> deletePairingV2(String topic) async {
  95. await serviceRoot.webView!
  96. .evalJavascript('walletConnect.deletePairingV2("$topic")');
  97. }
  98. Future<void> disconnectV2(String topic) async {
  99. await serviceRoot.webView!
  100. .evalJavascript('walletConnect.disconnectV2("$topic")');
  101. }
  102. }