@subwallet/extension-base 1.0.11-2 → 1.0.13-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/background/KoniTypes.d.ts +52 -0
  2. package/background/KoniTypes.js +10 -18
  3. package/background/handlers/State.d.ts +0 -1
  4. package/background/handlers/State.js +4 -8
  5. package/cjs/background/KoniTypes.js +12 -10
  6. package/cjs/background/handlers/State.js +4 -8
  7. package/cjs/koni/api/nft/config.js +11 -6
  8. package/cjs/koni/api/xcm/polkadotXcm.js +1 -1
  9. package/cjs/koni/api/xcm/xTokens.js +2 -2
  10. package/cjs/koni/background/handlers/Extension.js +150 -1
  11. package/cjs/koni/background/handlers/State.js +14 -3
  12. package/cjs/koni/background/handlers/Tabs.js +61 -9
  13. package/cjs/packageInfo.js +1 -1
  14. package/cjs/page/Metadata.js +3 -0
  15. package/cjs/services/chain-service/utils.js +28 -1
  16. package/cjs/services/migration-service/scripts/MigrateEthProvider.js +32 -0
  17. package/cjs/services/migration-service/scripts/index.js +12 -10
  18. package/cjs/services/request-service/handler/AuthRequestHandler.js +4 -9
  19. package/cjs/services/request-service/handler/SubstrateRequestHandler.js +2 -2
  20. package/cjs/services/request-service/handler/WalletConnectRequestHandler.js +71 -0
  21. package/cjs/services/request-service/index.js +24 -6
  22. package/cjs/services/transaction-service/helpers/index.js +3 -2
  23. package/cjs/services/transaction-service/index.js +2 -1
  24. package/cjs/services/wallet-connect-service/constants.js +38 -0
  25. package/cjs/services/wallet-connect-service/handler/Eip155RequestHandler.js +113 -0
  26. package/cjs/services/wallet-connect-service/handler/PolkadotRequestHandler.js +123 -0
  27. package/cjs/services/wallet-connect-service/helpers.js +81 -0
  28. package/cjs/services/wallet-connect-service/index.js +273 -0
  29. package/cjs/services/wallet-connect-service/types.js +27 -0
  30. package/cjs/utils/array.js +17 -0
  31. package/cjs/utils/environment.js +66 -0
  32. package/cjs/utils/index.js +66 -1
  33. package/koni/api/nft/config.js +11 -6
  34. package/koni/api/xcm/polkadotXcm.js +1 -1
  35. package/koni/api/xcm/xTokens.js +2 -2
  36. package/koni/background/handlers/Extension.d.ts +6 -0
  37. package/koni/background/handlers/Extension.js +144 -2
  38. package/koni/background/handlers/State.d.ts +2 -0
  39. package/koni/background/handlers/State.js +14 -3
  40. package/koni/background/handlers/Tabs.d.ts +2 -0
  41. package/koni/background/handlers/Tabs.js +58 -7
  42. package/package.json +72 -18
  43. package/packageInfo.js +1 -1
  44. package/page/Metadata.d.ts +2 -0
  45. package/page/Metadata.js +3 -0
  46. package/services/chain-service/utils.d.ts +2 -0
  47. package/services/chain-service/utils.js +25 -1
  48. package/services/migration-service/scripts/MigrateEthProvider.d.ts +4 -0
  49. package/services/migration-service/scripts/MigrateEthProvider.js +24 -0
  50. package/services/migration-service/scripts/index.js +12 -10
  51. package/services/request-service/handler/AuthRequestHandler.d.ts +0 -1
  52. package/services/request-service/handler/AuthRequestHandler.js +5 -10
  53. package/services/request-service/handler/SubstrateRequestHandler.d.ts +1 -1
  54. package/services/request-service/handler/SubstrateRequestHandler.js +2 -2
  55. package/services/request-service/handler/WalletConnectRequestHandler.d.ts +15 -0
  56. package/services/request-service/handler/WalletConnectRequestHandler.js +62 -0
  57. package/services/request-service/index.d.ts +7 -2
  58. package/services/request-service/index.js +24 -6
  59. package/services/transaction-service/helpers/index.d.ts +1 -1
  60. package/services/transaction-service/helpers/index.js +2 -2
  61. package/services/transaction-service/index.js +2 -1
  62. package/services/transaction-service/types.d.ts +2 -1
  63. package/services/wallet-connect-service/constants.d.ts +11 -0
  64. package/services/wallet-connect-service/constants.js +23 -0
  65. package/services/wallet-connect-service/handler/Eip155RequestHandler.d.ts +8 -0
  66. package/services/wallet-connect-service/handler/Eip155RequestHandler.js +106 -0
  67. package/services/wallet-connect-service/handler/PolkadotRequestHandler.d.ts +8 -0
  68. package/services/wallet-connect-service/handler/PolkadotRequestHandler.js +114 -0
  69. package/services/wallet-connect-service/helpers.d.ts +12 -0
  70. package/services/wallet-connect-service/helpers.js +67 -0
  71. package/services/wallet-connect-service/index.d.ts +20 -0
  72. package/services/wallet-connect-service/index.js +265 -0
  73. package/services/wallet-connect-service/types.d.ts +46 -0
  74. package/services/wallet-connect-service/types.js +20 -0
  75. package/utils/array.d.ts +1 -0
  76. package/utils/array.js +10 -0
  77. package/utils/environment.d.ts +2 -0
  78. package/utils/environment.js +59 -0
  79. package/utils/index.d.ts +3 -0
  80. package/utils/index.js +9 -2
@@ -0,0 +1,23 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { EIP155_SIGNING_METHODS, POLKADOT_SIGNING_METHODS } from '@subwallet/extension-base/services/wallet-connect-service/types';
5
+ export const PROJECT_ID = '6da34c0b48164d27681924dd9a46d6be';
6
+ export const RELAY_URL = 'wss://relay.walletconnect.com';
7
+ export const DEFAULT_WALLET_CONNECT_OPTIONS = {
8
+ logger: 'debug',
9
+ projectId: PROJECT_ID,
10
+ relayUrl: RELAY_URL,
11
+ metadata: {
12
+ name: 'SubWallet',
13
+ description: 'React Wallet for WalletConnect',
14
+ url: 'https://www.subwallet.app/',
15
+ icons: ['https://1570604715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lh39Kwxa1xxZM9WX_Bs%2Ficon%2FiETEgi1ykXUQRW63vPnL%2FLogo%3DWhite%2C%20Background%3DGradient.jpg?alt=media&token=46c5dafa-ce09-4576-bcd9-a5c796786f1a']
16
+ }
17
+ };
18
+ export const ALL_WALLET_CONNECT_EVENT = ['session_proposal', 'session_update', 'session_extend', 'session_ping', 'session_delete', 'session_expire', 'session_request', 'session_request_sent', 'session_event', 'proposal_expire'];
19
+ export const WALLET_CONNECT_SUPPORTED_METHODS = [POLKADOT_SIGNING_METHODS.POLKADOT_SIGN_MESSAGE, POLKADOT_SIGNING_METHODS.POLKADOT_SIGN_TRANSACTION, EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION, EIP155_SIGNING_METHODS.PERSONAL_SIGN, EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V1, EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3, EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4];
20
+ export const WALLET_CONNECT_REQUEST_KEY = 'wallet-connect';
21
+ export const WALLET_CONNECT_EIP155_NAMESPACE = 'eip155';
22
+ export const WALLET_CONNECT_POLKADOT_NAMESPACE = 'polkadot';
23
+ export const WALLET_CONNECT_SUPPORT_NAMESPACES = [WALLET_CONNECT_EIP155_NAMESPACE, WALLET_CONNECT_POLKADOT_NAMESPACE];
@@ -0,0 +1,8 @@
1
+ import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
2
+ import WalletConnectService from '@subwallet/extension-base/services/wallet-connect-service';
3
+ import { SignClientTypes } from '@walletconnect/types';
4
+ export default class Eip155RequestHandler {
5
+ #private;
6
+ constructor(koniState: KoniState, walletConnectService: WalletConnectService);
7
+ handleRequest(requestEvent: SignClientTypes.EventArguments['session_request']): void;
8
+ }
@@ -0,0 +1,106 @@
1
+ import _classPrivateFieldLooseBase from "@babel/runtime/helpers/esm/classPrivateFieldLooseBase";
2
+ import _classPrivateFieldLooseKey from "@babel/runtime/helpers/esm/classPrivateFieldLooseKey";
3
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
4
+ // SPDX-License-Identifier: Apache-2.0
5
+
6
+ import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils';
7
+ import { getEip155MessageAddress, getWCId, parseRequestParams } from '@subwallet/extension-base/services/wallet-connect-service/helpers';
8
+ import { EIP155_SIGNING_METHODS } from '@subwallet/extension-base/services/wallet-connect-service/types';
9
+ import { isSameAddress } from '@subwallet/extension-base/utils';
10
+ import { getSdkError } from '@walletconnect/utils';
11
+ var _walletConnectService = /*#__PURE__*/_classPrivateFieldLooseKey("walletConnectService");
12
+ var _koniState = /*#__PURE__*/_classPrivateFieldLooseKey("koniState");
13
+ var _checkAccount = /*#__PURE__*/_classPrivateFieldLooseKey("checkAccount");
14
+ var _handleError = /*#__PURE__*/_classPrivateFieldLooseKey("handleError");
15
+ export default class Eip155RequestHandler {
16
+ constructor(koniState, walletConnectService) {
17
+ Object.defineProperty(this, _handleError, {
18
+ value: _handleError2
19
+ });
20
+ Object.defineProperty(this, _checkAccount, {
21
+ value: _checkAccount2
22
+ });
23
+ Object.defineProperty(this, _walletConnectService, {
24
+ writable: true,
25
+ value: void 0
26
+ });
27
+ Object.defineProperty(this, _koniState, {
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ _classPrivateFieldLooseBase(this, _koniState)[_koniState] = koniState;
32
+ _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService] = walletConnectService;
33
+ }
34
+ handleRequest(requestEvent) {
35
+ const {
36
+ id,
37
+ params,
38
+ topic
39
+ } = requestEvent;
40
+ const {
41
+ chainId: _chainId,
42
+ request
43
+ } = params;
44
+ const method = request.method;
45
+ const requestSession = _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService].getSession(topic);
46
+ const url = requestSession.peer.metadata.url;
47
+ const sessionAccounts = requestSession.namespaces.eip155.accounts.map(account => account.split(':')[2]);
48
+ if ([EIP155_SIGNING_METHODS.PERSONAL_SIGN, EIP155_SIGNING_METHODS.ETH_SIGN, EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA, EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3, EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4].includes(method)) {
49
+ const address = getEip155MessageAddress(method, request.params);
50
+ _classPrivateFieldLooseBase(this, _checkAccount)[_checkAccount](address, sessionAccounts);
51
+ _classPrivateFieldLooseBase(this, _koniState)[_koniState].evmSign(getWCId(id), url, method === EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA ? EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4 : method, request.params, sessionAccounts).then(async signature => {
52
+ await _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService].responseRequest({
53
+ topic: topic,
54
+ response: formatJsonRpcResult(id, signature)
55
+ });
56
+ }).catch(e => {
57
+ _classPrivateFieldLooseBase(this, _handleError)[_handleError](topic, id, e);
58
+ });
59
+ } else if (method === EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION) {
60
+ const [tx] = parseRequestParams(request.params);
61
+ const address = tx.from;
62
+ _classPrivateFieldLooseBase(this, _checkAccount)[_checkAccount](address, sessionAccounts);
63
+ const chainId = parseInt(_chainId.split(':')[1]);
64
+ const [networkKey, chainInfo] = _classPrivateFieldLooseBase(this, _koniState)[_koniState].findNetworkKeyByChainId(chainId);
65
+ if (!networkKey || !chainInfo) {
66
+ throw new Error(getSdkError('UNSUPPORTED_CHAINS').message + ' ' + address);
67
+ }
68
+ const chainState = _classPrivateFieldLooseBase(this, _koniState)[_koniState].getChainStateByKey(networkKey);
69
+ const createRequest = () => {
70
+ _classPrivateFieldLooseBase(this, _koniState)[_koniState].evmSendTransaction(getWCId(id), url, networkKey, sessionAccounts, tx).then(async signature => {
71
+ await _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService].responseRequest({
72
+ topic: topic,
73
+ response: formatJsonRpcResult(id, signature)
74
+ });
75
+ }).catch(e => {
76
+ _classPrivateFieldLooseBase(this, _handleError)[_handleError](topic, id, e);
77
+ });
78
+ };
79
+ if (!chainState.active) {
80
+ _classPrivateFieldLooseBase(this, _koniState)[_koniState].chainService.enableChain(networkKey).then(createRequest).catch(() => {
81
+ throw new Error(getSdkError('USER_REJECTED').message + ' Can not active chain: ' + chainInfo.name);
82
+ });
83
+ } else {
84
+ createRequest();
85
+ }
86
+ } else {
87
+ throw Error(getSdkError('INVALID_METHOD').message + ' ' + method);
88
+ }
89
+ }
90
+ }
91
+ function _checkAccount2(address, accounts) {
92
+ if (!accounts.find(account => isSameAddress(account, address))) {
93
+ throw new Error(getSdkError('UNSUPPORTED_ACCOUNTS').message + ' ' + address);
94
+ }
95
+ }
96
+ function _handleError2(topic, id, e) {
97
+ console.log(e);
98
+ let message = e.message;
99
+ if (message.includes('User Rejected Request')) {
100
+ message = getSdkError('USER_REJECTED').message;
101
+ }
102
+ _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService].responseRequest({
103
+ topic: topic,
104
+ response: formatJsonRpcError(id, message)
105
+ }).catch(console.error);
106
+ }
@@ -0,0 +1,8 @@
1
+ import RequestService from '@subwallet/extension-base/services/request-service';
2
+ import WalletConnectService from '@subwallet/extension-base/services/wallet-connect-service';
3
+ import { SignClientTypes } from '@walletconnect/types';
4
+ export default class PolkadotRequestHandler {
5
+ #private;
6
+ constructor(walletConnectService: WalletConnectService, requestService: RequestService);
7
+ handleRequest(requestEvent: SignClientTypes.EventArguments['session_request']): void;
8
+ }
@@ -0,0 +1,114 @@
1
+ import _classPrivateFieldLooseBase from "@babel/runtime/helpers/esm/classPrivateFieldLooseBase";
2
+ import _classPrivateFieldLooseKey from "@babel/runtime/helpers/esm/classPrivateFieldLooseKey";
3
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
4
+ // SPDX-License-Identifier: Apache-2.0
5
+
6
+ import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils';
7
+ import RequestBytesSign from '@subwallet/extension-base/background/RequestBytesSign';
8
+ import RequestExtrinsicSign from '@subwallet/extension-base/background/RequestExtrinsicSign';
9
+ import { getWCId, parseRequestParams } from '@subwallet/extension-base/services/wallet-connect-service/helpers';
10
+ import { POLKADOT_SIGNING_METHODS } from '@subwallet/extension-base/services/wallet-connect-service/types';
11
+ import { isSameAddress } from '@subwallet/extension-base/utils';
12
+ import keyring from '@subwallet/ui-keyring';
13
+ import { getSdkError } from '@walletconnect/utils';
14
+ var _walletConnectService = /*#__PURE__*/_classPrivateFieldLooseKey("walletConnectService");
15
+ var _requestService = /*#__PURE__*/_classPrivateFieldLooseKey("requestService");
16
+ var _checkAccount = /*#__PURE__*/_classPrivateFieldLooseKey("checkAccount");
17
+ var _handleError = /*#__PURE__*/_classPrivateFieldLooseKey("handleError");
18
+ export default class PolkadotRequestHandler {
19
+ constructor(walletConnectService, requestService) {
20
+ Object.defineProperty(this, _handleError, {
21
+ value: _handleError2
22
+ });
23
+ Object.defineProperty(this, _checkAccount, {
24
+ value: _checkAccount2
25
+ });
26
+ Object.defineProperty(this, _walletConnectService, {
27
+ writable: true,
28
+ value: void 0
29
+ });
30
+ Object.defineProperty(this, _requestService, {
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+ _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService] = walletConnectService;
35
+ _classPrivateFieldLooseBase(this, _requestService)[_requestService] = requestService;
36
+ }
37
+ handleRequest(requestEvent) {
38
+ const {
39
+ id,
40
+ params,
41
+ topic
42
+ } = requestEvent;
43
+ const {
44
+ request
45
+ } = params;
46
+ const method = request.method;
47
+ const requestSession = _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService].getSession(topic);
48
+ const url = requestSession.peer.metadata.url;
49
+ const sessionAccounts = requestSession.namespaces.polkadot.accounts.map(account => account.split(':')[2]);
50
+ if (method === POLKADOT_SIGNING_METHODS.POLKADOT_SIGN_MESSAGE) {
51
+ const param = parseRequestParams(request.params);
52
+ _classPrivateFieldLooseBase(this, _checkAccount)[_checkAccount](param.address, sessionAccounts);
53
+ const pair = keyring.getPair(param.address);
54
+ const address = pair.address;
55
+ _classPrivateFieldLooseBase(this, _requestService)[_requestService].sign(url, new RequestBytesSign({
56
+ address: address,
57
+ data: param.message,
58
+ type: 'bytes'
59
+ }), {
60
+ address,
61
+ ...pair.meta
62
+ }, getWCId(id)).then(async ({
63
+ signature
64
+ }) => {
65
+ await _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService].responseRequest({
66
+ topic: topic,
67
+ response: formatJsonRpcResult(id, {
68
+ signature
69
+ })
70
+ });
71
+ }).catch(e => {
72
+ _classPrivateFieldLooseBase(this, _handleError)[_handleError](topic, id, e);
73
+ });
74
+ } else if (method === POLKADOT_SIGNING_METHODS.POLKADOT_SIGN_TRANSACTION) {
75
+ const param = parseRequestParams(request.params);
76
+ _classPrivateFieldLooseBase(this, _checkAccount)[_checkAccount](param.address, sessionAccounts);
77
+ const pair = keyring.getPair(param.address);
78
+ const address = pair.address;
79
+ _classPrivateFieldLooseBase(this, _requestService)[_requestService].sign(url, new RequestExtrinsicSign(param.transactionPayload), {
80
+ address,
81
+ ...pair.meta
82
+ }, getWCId(id)).then(async ({
83
+ signature
84
+ }) => {
85
+ await _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService].responseRequest({
86
+ topic: topic,
87
+ response: formatJsonRpcResult(id, {
88
+ signature
89
+ })
90
+ });
91
+ }).catch(e => {
92
+ _classPrivateFieldLooseBase(this, _handleError)[_handleError](topic, id, e);
93
+ });
94
+ } else {
95
+ throw Error(`${getSdkError('INVALID_METHOD').message} ${method}`);
96
+ }
97
+ }
98
+ }
99
+ function _checkAccount2(address, accounts) {
100
+ if (!accounts.find(account => isSameAddress(account, address))) {
101
+ throw new Error(getSdkError('UNSUPPORTED_ACCOUNTS').message + ' ' + address);
102
+ }
103
+ }
104
+ function _handleError2(topic, id, e) {
105
+ console.log(e);
106
+ let message = e.message;
107
+ if (message.includes('User Rejected Request')) {
108
+ message = getSdkError('USER_REJECTED').message;
109
+ }
110
+ _classPrivateFieldLooseBase(this, _walletConnectService)[_walletConnectService].responseRequest({
111
+ topic: topic,
112
+ response: formatJsonRpcError(id, message)
113
+ }).catch(console.error);
114
+ }
@@ -0,0 +1,12 @@
1
+ import { _ChainInfo } from '@subwallet/chain-list/types';
2
+ import { SignClientTypes } from '@walletconnect/types';
3
+ import { ProposalTypes } from '@walletconnect/types/dist/types/sign-client/proposal';
4
+ import { EIP155_SIGNING_METHODS, WalletConnectParamMap, WalletConnectSessionRequest, WalletConnectSigningMethod } from './types';
5
+ export declare const getWCId: (id: number) => string;
6
+ export declare const convertConnectRequest: (request: SignClientTypes.EventArguments['session_proposal']) => WalletConnectSessionRequest;
7
+ export declare const parseRequestParams: <T extends WalletConnectSigningMethod>(params: unknown) => WalletConnectParamMap[T];
8
+ export declare const getEip155MessageAddress: (method: EIP155_SIGNING_METHODS, param: unknown) => string;
9
+ export declare const isWalletConnectRequest: (id?: string) => boolean;
10
+ export declare const isProposalExpired: (params: ProposalTypes.Struct) => boolean;
11
+ export declare const isSupportWalletConnectNamespace: (namespace: string) => boolean;
12
+ export declare const isSupportWalletConnectChain: (chain: string, chainInfoMap: Record<string, _ChainInfo>) => boolean;
@@ -0,0 +1,67 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { findChainInfoByChainId, findChainInfoByHalfGenesisHash } from '@subwallet/extension-base/services/chain-service/utils';
5
+ import { isEthereumAddress } from '@polkadot/util-crypto';
6
+ import { WALLET_CONNECT_EIP155_NAMESPACE, WALLET_CONNECT_POLKADOT_NAMESPACE, WALLET_CONNECT_REQUEST_KEY, WALLET_CONNECT_SUPPORT_NAMESPACES } from "./constants.js";
7
+ import { EIP155_SIGNING_METHODS } from "./types.js";
8
+ export const getWCId = id => {
9
+ return [WALLET_CONNECT_REQUEST_KEY, Date.now(), id].join('.');
10
+ };
11
+ export const convertConnectRequest = request => {
12
+ return {
13
+ id: getWCId(request.id),
14
+ isInternal: false,
15
+ request: request,
16
+ url: request.params.proposer.metadata.url
17
+ };
18
+ };
19
+ export const parseRequestParams = params => {
20
+ // @ts-ignore
21
+ return params;
22
+ };
23
+ export const getEip155MessageAddress = (method, param) => {
24
+ switch (method) {
25
+ case EIP155_SIGNING_METHODS.PERSONAL_SIGN:
26
+ case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA:
27
+ case EIP155_SIGNING_METHODS.ETH_SIGN:
28
+ case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3:
29
+ case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4:
30
+ // eslint-disable-next-line no-case-declarations
31
+ const [p1, p2] = parseRequestParams(param);
32
+ if (typeof p1 === 'string' && isEthereumAddress(p1)) {
33
+ return p1;
34
+ } else if (typeof p2 === 'string' && isEthereumAddress(p2)) {
35
+ return p2;
36
+ }
37
+ return '';
38
+ default:
39
+ return '';
40
+ }
41
+ };
42
+ export const isWalletConnectRequest = id => {
43
+ if (!id) {
44
+ return false;
45
+ }
46
+ const [prefix] = id.split('.');
47
+ return prefix === WALLET_CONNECT_REQUEST_KEY;
48
+ };
49
+ export const isProposalExpired = params => {
50
+ const timeNum = params.expiry;
51
+ const expireTime = new Date(timeNum > 10 ** 12 ? timeNum : timeNum * 1000);
52
+ const now = new Date();
53
+ return now.getTime() >= expireTime.getTime();
54
+ };
55
+ export const isSupportWalletConnectNamespace = namespace => {
56
+ return WALLET_CONNECT_SUPPORT_NAMESPACES.includes(namespace);
57
+ };
58
+ export const isSupportWalletConnectChain = (chain, chainInfoMap) => {
59
+ const [namespace, info] = chain.split(':');
60
+ if (namespace === WALLET_CONNECT_POLKADOT_NAMESPACE) {
61
+ return !!findChainInfoByHalfGenesisHash(chainInfoMap, info);
62
+ } else if (namespace === WALLET_CONNECT_EIP155_NAMESPACE) {
63
+ return !!findChainInfoByChainId(chainInfoMap, parseInt(info));
64
+ } else {
65
+ return false;
66
+ }
67
+ };
@@ -0,0 +1,20 @@
1
+ import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
2
+ import RequestService from '@subwallet/extension-base/services/request-service';
3
+ import { EngineTypes, SessionTypes, SignClientTypes } from '@walletconnect/types';
4
+ import { BehaviorSubject } from 'rxjs';
5
+ import { ResultApproveWalletConnectSession } from './types';
6
+ export default class WalletConnectService {
7
+ #private;
8
+ readonly sessionSubject: BehaviorSubject<SessionTypes.Struct[]>;
9
+ constructor(koniState: KoniState, requestService: RequestService, option?: SignClientTypes.Options);
10
+ get sessions(): SessionTypes.Struct[];
11
+ getSession(topic: string): SessionTypes.Struct;
12
+ changeOption(newOption: Omit<SignClientTypes.Options, 'projectId'>): Promise<void>;
13
+ getSessions(): void;
14
+ connect(uri: string): Promise<void>;
15
+ approveSession(result: ResultApproveWalletConnectSession): Promise<void>;
16
+ rejectSession(id: number): Promise<void>;
17
+ responseRequest(response: EngineTypes.RespondParams): Promise<void>;
18
+ resetWallet(resetAll: boolean): Promise<void>;
19
+ disconnect(topic: string): Promise<void>;
20
+ }
@@ -0,0 +1,265 @@
1
+ import _classPrivateFieldLooseBase from "@babel/runtime/helpers/esm/classPrivateFieldLooseBase";
2
+ import _classPrivateFieldLooseKey from "@babel/runtime/helpers/esm/classPrivateFieldLooseKey";
3
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
4
+ // SPDX-License-Identifier: Apache-2.0
5
+
6
+ import { formatJsonRpcError } from '@json-rpc-tools/utils';
7
+ import Eip155RequestHandler from '@subwallet/extension-base/services/wallet-connect-service/handler/Eip155RequestHandler';
8
+ import SignClient from '@walletconnect/sign-client';
9
+ import { getInternalError, getSdkError } from '@walletconnect/utils';
10
+ import { BehaviorSubject } from 'rxjs';
11
+ import PolkadotRequestHandler from "./handler/PolkadotRequestHandler.js";
12
+ import { ALL_WALLET_CONNECT_EVENT, DEFAULT_WALLET_CONNECT_OPTIONS, WALLET_CONNECT_SUPPORTED_METHODS } from "./constants.js";
13
+ import { convertConnectRequest, isSupportWalletConnectChain } from "./helpers.js";
14
+ import { EIP155_SIGNING_METHODS, POLKADOT_SIGNING_METHODS } from "./types.js";
15
+ var _requestService = /*#__PURE__*/_classPrivateFieldLooseKey("requestService");
16
+ var _polkadotRequestHandler = /*#__PURE__*/_classPrivateFieldLooseKey("polkadotRequestHandler");
17
+ var _eip155RequestHandler = /*#__PURE__*/_classPrivateFieldLooseKey("eip155RequestHandler");
18
+ var _koniState = /*#__PURE__*/_classPrivateFieldLooseKey("koniState");
19
+ var _client = /*#__PURE__*/_classPrivateFieldLooseKey("client");
20
+ var _option = /*#__PURE__*/_classPrivateFieldLooseKey("option");
21
+ var _initClient = /*#__PURE__*/_classPrivateFieldLooseKey("initClient");
22
+ var _updateSessions = /*#__PURE__*/_classPrivateFieldLooseKey("updateSessions");
23
+ var _onSessionProposal = /*#__PURE__*/_classPrivateFieldLooseKey("onSessionProposal");
24
+ var _onSessionRequest = /*#__PURE__*/_classPrivateFieldLooseKey("onSessionRequest");
25
+ var _createListener = /*#__PURE__*/_classPrivateFieldLooseKey("createListener");
26
+ var _removeListener = /*#__PURE__*/_classPrivateFieldLooseKey("removeListener");
27
+ var _checkClient = /*#__PURE__*/_classPrivateFieldLooseKey("checkClient");
28
+ export default class WalletConnectService {
29
+ constructor(koniState, requestService, option = DEFAULT_WALLET_CONNECT_OPTIONS) {
30
+ Object.defineProperty(this, _checkClient, {
31
+ value: _checkClient2
32
+ });
33
+ Object.defineProperty(this, _removeListener, {
34
+ value: _removeListener2
35
+ });
36
+ Object.defineProperty(this, _createListener, {
37
+ value: _createListener2
38
+ });
39
+ Object.defineProperty(this, _onSessionRequest, {
40
+ value: _onSessionRequest2
41
+ });
42
+ Object.defineProperty(this, _onSessionProposal, {
43
+ value: _onSessionProposal2
44
+ });
45
+ Object.defineProperty(this, _updateSessions, {
46
+ value: _updateSessions2
47
+ });
48
+ Object.defineProperty(this, _initClient, {
49
+ value: _initClient2
50
+ });
51
+ Object.defineProperty(this, _requestService, {
52
+ writable: true,
53
+ value: void 0
54
+ });
55
+ Object.defineProperty(this, _polkadotRequestHandler, {
56
+ writable: true,
57
+ value: void 0
58
+ });
59
+ Object.defineProperty(this, _eip155RequestHandler, {
60
+ writable: true,
61
+ value: void 0
62
+ });
63
+ Object.defineProperty(this, _koniState, {
64
+ writable: true,
65
+ value: void 0
66
+ });
67
+ Object.defineProperty(this, _client, {
68
+ writable: true,
69
+ value: void 0
70
+ });
71
+ Object.defineProperty(this, _option, {
72
+ writable: true,
73
+ value: void 0
74
+ });
75
+ this.sessionSubject = new BehaviorSubject([]);
76
+ _classPrivateFieldLooseBase(this, _koniState)[_koniState] = koniState;
77
+ _classPrivateFieldLooseBase(this, _requestService)[_requestService] = requestService;
78
+ _classPrivateFieldLooseBase(this, _option)[_option] = option;
79
+ _classPrivateFieldLooseBase(this, _polkadotRequestHandler)[_polkadotRequestHandler] = new PolkadotRequestHandler(this, requestService);
80
+ _classPrivateFieldLooseBase(this, _eip155RequestHandler)[_eip155RequestHandler] = new Eip155RequestHandler(_classPrivateFieldLooseBase(this, _koniState)[_koniState], this);
81
+ _classPrivateFieldLooseBase(this, _initClient)[_initClient]().catch(console.error);
82
+ }
83
+ get sessions() {
84
+ var _classPrivateFieldLoo;
85
+ return ((_classPrivateFieldLoo = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo === void 0 ? void 0 : _classPrivateFieldLoo.session.values) || [];
86
+ }
87
+ getSession(topic) {
88
+ var _classPrivateFieldLoo2;
89
+ const session = (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.session.get(topic);
90
+ if (!session) {
91
+ throw new Error(getInternalError('MISMATCHED_TOPIC').message);
92
+ } else {
93
+ return session;
94
+ }
95
+ }
96
+ async changeOption(newOption) {
97
+ _classPrivateFieldLooseBase(this, _option)[_option] = Object.assign({}, _classPrivateFieldLooseBase(this, _option)[_option], newOption);
98
+ await _classPrivateFieldLooseBase(this, _initClient)[_initClient]();
99
+ }
100
+ getSessions() {
101
+ var _classPrivateFieldLoo3;
102
+ _classPrivateFieldLooseBase(this, _checkClient)[_checkClient]();
103
+ console.log((_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.session.values);
104
+ }
105
+ async connect(uri) {
106
+ var _classPrivateFieldLoo4;
107
+ _classPrivateFieldLooseBase(this, _checkClient)[_checkClient]();
108
+ await ((_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo4 === void 0 ? void 0 : _classPrivateFieldLoo4.pair({
109
+ uri
110
+ }));
111
+ }
112
+ async approveSession(result) {
113
+ var _classPrivateFieldLoo5;
114
+ _classPrivateFieldLooseBase(this, _checkClient)[_checkClient]();
115
+ await ((_classPrivateFieldLoo5 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo5 === void 0 ? void 0 : _classPrivateFieldLoo5.approve(result));
116
+ _classPrivateFieldLooseBase(this, _updateSessions)[_updateSessions]();
117
+ }
118
+ async rejectSession(id) {
119
+ var _classPrivateFieldLoo6;
120
+ _classPrivateFieldLooseBase(this, _checkClient)[_checkClient]();
121
+ await ((_classPrivateFieldLoo6 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo6 === void 0 ? void 0 : _classPrivateFieldLoo6.reject({
122
+ id: id,
123
+ reason: getSdkError('USER_REJECTED')
124
+ }));
125
+ }
126
+ async responseRequest(response) {
127
+ var _classPrivateFieldLoo7;
128
+ _classPrivateFieldLooseBase(this, _checkClient)[_checkClient]();
129
+ await ((_classPrivateFieldLoo7 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo7 === void 0 ? void 0 : _classPrivateFieldLoo7.respond(response));
130
+ }
131
+ async resetWallet(resetAll) {
132
+ var _classPrivateFieldLoo8, _classPrivateFieldLoo10, _classPrivateFieldLoo12;
133
+ _classPrivateFieldLooseBase(this, _removeListener)[_removeListener]();
134
+
135
+ // Disconnect session
136
+ const sessions = ((_classPrivateFieldLoo8 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo8 === void 0 ? void 0 : _classPrivateFieldLoo8.session.values) || [];
137
+ for (const session of sessions) {
138
+ var _classPrivateFieldLoo9;
139
+ (_classPrivateFieldLoo9 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo9 === void 0 ? void 0 : _classPrivateFieldLoo9.disconnect({
140
+ topic: session.topic,
141
+ reason: getSdkError('USER_DISCONNECTED')
142
+ }).catch(console.error);
143
+ }
144
+
145
+ // Disconnect pair
146
+ const pairs = ((_classPrivateFieldLoo10 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo10 === void 0 ? void 0 : _classPrivateFieldLoo10.pairing.values) || [];
147
+ for (const pair of pairs) {
148
+ var _classPrivateFieldLoo11;
149
+ (_classPrivateFieldLoo11 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo11 === void 0 ? void 0 : _classPrivateFieldLoo11.disconnect({
150
+ topic: pair.topic,
151
+ reason: getSdkError('USER_DISCONNECTED')
152
+ }).catch(console.error);
153
+ }
154
+ const keys = (await ((_classPrivateFieldLoo12 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo12 === void 0 ? void 0 : _classPrivateFieldLoo12.core.storage.getKeys())) || [];
155
+ const deleteKeys = resetAll ? keys : keys.filter(key => key.startsWith('wc@'));
156
+ for (const key of deleteKeys) {
157
+ try {
158
+ var _classPrivateFieldLoo13;
159
+ await ((_classPrivateFieldLoo13 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo13 === void 0 ? void 0 : _classPrivateFieldLoo13.core.storage.removeItem(key));
160
+ } catch (e) {
161
+ console.error(e);
162
+ }
163
+ }
164
+ await _classPrivateFieldLooseBase(this, _initClient)[_initClient]();
165
+ }
166
+ async disconnect(topic) {
167
+ var _classPrivateFieldLoo14;
168
+ await ((_classPrivateFieldLoo14 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo14 === void 0 ? void 0 : _classPrivateFieldLoo14.disconnect({
169
+ topic: topic,
170
+ reason: getSdkError('USER_DISCONNECTED')
171
+ }));
172
+ _classPrivateFieldLooseBase(this, _updateSessions)[_updateSessions]();
173
+ }
174
+ }
175
+ async function _initClient2() {
176
+ _classPrivateFieldLooseBase(this, _removeListener)[_removeListener]();
177
+ _classPrivateFieldLooseBase(this, _client)[_client] = await SignClient.init(_classPrivateFieldLooseBase(this, _option)[_option]);
178
+ _classPrivateFieldLooseBase(this, _updateSessions)[_updateSessions]();
179
+ _classPrivateFieldLooseBase(this, _createListener)[_createListener]();
180
+ }
181
+ function _updateSessions2() {
182
+ this.sessionSubject.next(this.sessions);
183
+ }
184
+ function _onSessionProposal2(proposal) {
185
+ _classPrivateFieldLooseBase(this, _checkClient)[_checkClient]();
186
+ _classPrivateFieldLooseBase(this, _requestService)[_requestService].addConnectWCRequest(convertConnectRequest(proposal));
187
+ }
188
+ function _onSessionRequest2(requestEvent) {
189
+ _classPrivateFieldLooseBase(this, _checkClient)[_checkClient]();
190
+ const {
191
+ id,
192
+ params,
193
+ topic
194
+ } = requestEvent;
195
+ const {
196
+ chainId,
197
+ request
198
+ } = params;
199
+ const method = request.method;
200
+ try {
201
+ const requestSession = this.getSession(topic);
202
+ const namespaces = Object.keys(requestSession.namespaces);
203
+ const chains = Object.values(requestSession.namespaces).map(namespace => namespace.chains).flat();
204
+ const methods = Object.values(requestSession.namespaces).map(namespace => namespace.methods).flat();
205
+ const chainInfoMap = _classPrivateFieldLooseBase(this, _koniState)[_koniState].getChainInfoMap();
206
+ const [requestNamespace] = chainId.split(':');
207
+ if (!namespaces.includes(requestNamespace)) {
208
+ throw Error(getSdkError('UNSUPPORTED_NAMESPACE_KEY').message);
209
+ }
210
+ if (!chains.includes(chainId)) {
211
+ throw Error(getSdkError('UNSUPPORTED_CHAINS').message + ' ' + chainId);
212
+ }
213
+ if (!isSupportWalletConnectChain(chainId, chainInfoMap)) {
214
+ throw Error(getSdkError('UNSUPPORTED_CHAINS').message + ' ' + chainId);
215
+ }
216
+ if (!methods.includes(method)) {
217
+ throw Error(getSdkError('UNAUTHORIZED_METHOD').message + ' ' + method);
218
+ }
219
+ if (!WALLET_CONNECT_SUPPORTED_METHODS.includes(method)) {
220
+ throw Error(getSdkError('UNSUPPORTED_METHODS').message + ' ' + method);
221
+ }
222
+ switch (method) {
223
+ case POLKADOT_SIGNING_METHODS.POLKADOT_SIGN_MESSAGE:
224
+ case POLKADOT_SIGNING_METHODS.POLKADOT_SIGN_TRANSACTION:
225
+ _classPrivateFieldLooseBase(this, _polkadotRequestHandler)[_polkadotRequestHandler].handleRequest(requestEvent);
226
+ break;
227
+ case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION:
228
+ case EIP155_SIGNING_METHODS.PERSONAL_SIGN:
229
+ case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA:
230
+ case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3:
231
+ case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4:
232
+ case EIP155_SIGNING_METHODS.ETH_SIGN:
233
+ _classPrivateFieldLooseBase(this, _eip155RequestHandler)[_eip155RequestHandler].handleRequest(requestEvent);
234
+ break;
235
+ default:
236
+ throw Error(getSdkError('INVALID_METHOD').message + ' ' + method);
237
+ }
238
+ } catch (e) {
239
+ console.log(e);
240
+ this.responseRequest({
241
+ topic: topic,
242
+ response: formatJsonRpcError(id, e.message)
243
+ }).catch(console.error);
244
+ }
245
+ }
246
+ function _createListener2() {
247
+ var _classPrivateFieldLoo15, _classPrivateFieldLoo16, _classPrivateFieldLoo17, _classPrivateFieldLoo18, _classPrivateFieldLoo19, _classPrivateFieldLoo20;
248
+ (_classPrivateFieldLoo15 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo15 === void 0 ? void 0 : _classPrivateFieldLoo15.on('session_proposal', _classPrivateFieldLooseBase(this, _onSessionProposal)[_onSessionProposal].bind(this));
249
+ (_classPrivateFieldLoo16 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo16 === void 0 ? void 0 : _classPrivateFieldLoo16.on('session_request', _classPrivateFieldLooseBase(this, _onSessionRequest)[_onSessionRequest].bind(this));
250
+ (_classPrivateFieldLoo17 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo17 === void 0 ? void 0 : _classPrivateFieldLoo17.on('session_ping', data => console.log('ping', data));
251
+ (_classPrivateFieldLoo18 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo18 === void 0 ? void 0 : _classPrivateFieldLoo18.on('session_event', data => console.log('event', data));
252
+ (_classPrivateFieldLoo19 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo19 === void 0 ? void 0 : _classPrivateFieldLoo19.on('session_update', data => console.log('update', data));
253
+ (_classPrivateFieldLoo20 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo20 === void 0 ? void 0 : _classPrivateFieldLoo20.on('session_delete', _classPrivateFieldLooseBase(this, _updateSessions)[_updateSessions].bind(this));
254
+ }
255
+ function _removeListener2() {
256
+ ALL_WALLET_CONNECT_EVENT.forEach(event => {
257
+ var _classPrivateFieldLoo21;
258
+ (_classPrivateFieldLoo21 = _classPrivateFieldLooseBase(this, _client)[_client]) === null || _classPrivateFieldLoo21 === void 0 ? void 0 : _classPrivateFieldLoo21.removeAllListeners(event);
259
+ });
260
+ }
261
+ function _checkClient2() {
262
+ if (!_classPrivateFieldLooseBase(this, _client)[_client]) {
263
+ throw new Error(getInternalError('NOT_INITIALIZED').message);
264
+ }
265
+ }