@subwallet/extension-base 1.0.12-0 → 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.
- package/background/KoniTypes.d.ts +52 -0
- package/background/KoniTypes.js +10 -18
- package/background/handlers/State.d.ts +0 -1
- package/background/handlers/State.js +4 -8
- package/cjs/background/KoniTypes.js +12 -10
- package/cjs/background/handlers/State.js +4 -8
- package/cjs/koni/api/nft/config.js +11 -6
- package/cjs/koni/api/xcm/polkadotXcm.js +1 -1
- package/cjs/koni/api/xcm/xTokens.js +2 -2
- package/cjs/koni/background/handlers/Extension.js +150 -1
- package/cjs/koni/background/handlers/State.js +14 -3
- package/cjs/koni/background/handlers/Tabs.js +61 -9
- package/cjs/packageInfo.js +1 -1
- package/cjs/page/Metadata.js +3 -0
- package/cjs/services/chain-service/utils.js +28 -1
- package/cjs/services/request-service/handler/AuthRequestHandler.js +4 -9
- package/cjs/services/request-service/handler/SubstrateRequestHandler.js +2 -2
- package/cjs/services/request-service/handler/WalletConnectRequestHandler.js +71 -0
- package/cjs/services/request-service/index.js +24 -6
- package/cjs/services/transaction-service/helpers/index.js +3 -2
- package/cjs/services/transaction-service/index.js +2 -1
- package/cjs/services/wallet-connect-service/constants.js +38 -0
- package/cjs/services/wallet-connect-service/handler/Eip155RequestHandler.js +113 -0
- package/cjs/services/wallet-connect-service/handler/PolkadotRequestHandler.js +123 -0
- package/cjs/services/wallet-connect-service/helpers.js +81 -0
- package/cjs/services/wallet-connect-service/index.js +273 -0
- package/cjs/services/wallet-connect-service/types.js +27 -0
- package/cjs/utils/array.js +17 -0
- package/cjs/utils/environment.js +66 -0
- package/cjs/utils/index.js +66 -1
- package/koni/api/nft/config.js +11 -6
- package/koni/api/xcm/polkadotXcm.js +1 -1
- package/koni/api/xcm/xTokens.js +2 -2
- package/koni/background/handlers/Extension.d.ts +6 -0
- package/koni/background/handlers/Extension.js +144 -2
- package/koni/background/handlers/State.d.ts +2 -0
- package/koni/background/handlers/State.js +14 -3
- package/koni/background/handlers/Tabs.d.ts +2 -0
- package/koni/background/handlers/Tabs.js +58 -7
- package/package.json +55 -6
- package/packageInfo.js +1 -1
- package/page/Metadata.d.ts +2 -0
- package/page/Metadata.js +3 -0
- package/services/chain-service/utils.d.ts +2 -0
- package/services/chain-service/utils.js +25 -1
- package/services/request-service/handler/AuthRequestHandler.d.ts +0 -1
- package/services/request-service/handler/AuthRequestHandler.js +5 -10
- package/services/request-service/handler/SubstrateRequestHandler.d.ts +1 -1
- package/services/request-service/handler/SubstrateRequestHandler.js +2 -2
- package/services/request-service/handler/WalletConnectRequestHandler.d.ts +15 -0
- package/services/request-service/handler/WalletConnectRequestHandler.js +62 -0
- package/services/request-service/index.d.ts +7 -2
- package/services/request-service/index.js +24 -6
- package/services/transaction-service/helpers/index.d.ts +1 -1
- package/services/transaction-service/helpers/index.js +2 -2
- package/services/transaction-service/index.js +2 -1
- package/services/transaction-service/types.d.ts +2 -1
- package/services/wallet-connect-service/constants.d.ts +11 -0
- package/services/wallet-connect-service/constants.js +23 -0
- package/services/wallet-connect-service/handler/Eip155RequestHandler.d.ts +8 -0
- package/services/wallet-connect-service/handler/Eip155RequestHandler.js +106 -0
- package/services/wallet-connect-service/handler/PolkadotRequestHandler.d.ts +8 -0
- package/services/wallet-connect-service/handler/PolkadotRequestHandler.js +114 -0
- package/services/wallet-connect-service/helpers.d.ts +12 -0
- package/services/wallet-connect-service/helpers.js +67 -0
- package/services/wallet-connect-service/index.d.ts +20 -0
- package/services/wallet-connect-service/index.js +265 -0
- package/services/wallet-connect-service/types.d.ts +46 -0
- package/services/wallet-connect-service/types.js +20 -0
- package/utils/array.d.ts +1 -0
- package/utils/array.js +10 -0
- package/utils/environment.d.ts +2 -0
- package/utils/environment.js +59 -0
- package/utils/index.d.ts +3 -0
- package/utils/index.js +9 -2
package/page/Metadata.js
CHANGED
|
@@ -63,3 +63,5 @@ export declare function _isAssetFungibleToken(chainAsset: _ChainAsset): boolean;
|
|
|
63
63
|
export declare function _getCrowdloanUrlFromChain(chainInfo: _ChainInfo): string;
|
|
64
64
|
export declare function _isCustomProvider(providerKey: string): boolean;
|
|
65
65
|
export declare function _generateCustomProviderKey(index: number): string;
|
|
66
|
+
export declare const findChainInfoByHalfGenesisHash: (chainMap: Record<string, _ChainInfo>, halfGenesisHash?: string) => _ChainInfo | null;
|
|
67
|
+
export declare const findChainInfoByChainId: (chainMap: Record<string, _ChainInfo>, chainId?: number) => _ChainInfo | null;
|
|
@@ -330,4 +330,28 @@ export function _isCustomProvider(providerKey) {
|
|
|
330
330
|
}
|
|
331
331
|
export function _generateCustomProviderKey(index) {
|
|
332
332
|
return `${_CUSTOM_PREFIX}provider-${index}`;
|
|
333
|
-
}
|
|
333
|
+
}
|
|
334
|
+
export const findChainInfoByHalfGenesisHash = (chainMap, halfGenesisHash) => {
|
|
335
|
+
if (!halfGenesisHash) {
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
for (const chainInfo of Object.values(chainMap)) {
|
|
339
|
+
var _getSubstrateGenesisH;
|
|
340
|
+
if (((_getSubstrateGenesisH = _getSubstrateGenesisHash(chainInfo)) === null || _getSubstrateGenesisH === void 0 ? void 0 : _getSubstrateGenesisH.toLowerCase().substring(2, 2 + 32)) === halfGenesisHash.toLowerCase()) {
|
|
341
|
+
return chainInfo;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return null;
|
|
345
|
+
};
|
|
346
|
+
export const findChainInfoByChainId = (chainMap, chainId) => {
|
|
347
|
+
if (!chainId) {
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
for (const chainInfo of Object.values(chainMap)) {
|
|
351
|
+
var _chainInfo$evmInfo5;
|
|
352
|
+
if (((_chainInfo$evmInfo5 = chainInfo.evmInfo) === null || _chainInfo$evmInfo5 === void 0 ? void 0 : _chainInfo$evmInfo5.evmChainId) === chainId) {
|
|
353
|
+
return chainInfo;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return null;
|
|
357
|
+
};
|
|
@@ -15,7 +15,6 @@ export default class AuthRequestHandler {
|
|
|
15
15
|
private readonly evmChainSubject;
|
|
16
16
|
readonly authSubjectV2: BehaviorSubject<AuthorizeRequest[]>;
|
|
17
17
|
constructor(requestService: RequestService, chainService: ChainService, keyringService: KeyringService);
|
|
18
|
-
stripUrl(url: string): string;
|
|
19
18
|
private getAddressList;
|
|
20
19
|
get numAuthRequestsV2(): number;
|
|
21
20
|
private get allAuthRequestsV2();
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
|
|
5
5
|
import { PREDEFINED_CHAIN_DAPP_CHAIN_MAP } from '@subwallet/extension-base/services/request-service/constants';
|
|
6
6
|
import AuthorizeStore from '@subwallet/extension-base/stores/Authorize';
|
|
7
|
-
import { getDomainFromUrl } from '@subwallet/extension-base/utils';
|
|
7
|
+
import { getDomainFromUrl, stripUrl } from '@subwallet/extension-base/utils';
|
|
8
8
|
import { getId } from '@subwallet/extension-base/utils/getId';
|
|
9
9
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
10
10
|
import { assert } from '@polkadot/util';
|
|
@@ -24,11 +24,6 @@ export default class AuthRequestHandler {
|
|
|
24
24
|
this.#requestService = requestService;
|
|
25
25
|
this.#chainService = chainService;
|
|
26
26
|
}
|
|
27
|
-
stripUrl(url) {
|
|
28
|
-
assert(url && (url.startsWith('http:') || url.startsWith('https:') || url.startsWith('ipfs:') || url.startsWith('ipns:')), `Invalid url ${url}, expected to start with http: or https: or ipfs: or ipns:`);
|
|
29
|
-
const parts = url.split('/');
|
|
30
|
-
return parts[2];
|
|
31
|
-
}
|
|
32
27
|
getAddressList(value = false) {
|
|
33
28
|
const addressList = Object.keys(this.keyringService.accounts);
|
|
34
29
|
return addressList.reduce((addressList, v) => ({
|
|
@@ -161,7 +156,7 @@ export default class AuthRequestHandler {
|
|
|
161
156
|
if (value) {
|
|
162
157
|
authorizeList = value;
|
|
163
158
|
}
|
|
164
|
-
const existed = authorizeList[
|
|
159
|
+
const existed = authorizeList[stripUrl(url)];
|
|
165
160
|
|
|
166
161
|
// On cancel don't save anything
|
|
167
162
|
if (isCancelled) {
|
|
@@ -170,7 +165,7 @@ export default class AuthRequestHandler {
|
|
|
170
165
|
cb();
|
|
171
166
|
return;
|
|
172
167
|
}
|
|
173
|
-
authorizeList[
|
|
168
|
+
authorizeList[stripUrl(url)] = {
|
|
174
169
|
count: 0,
|
|
175
170
|
id: idStr,
|
|
176
171
|
isAllowed,
|
|
@@ -210,7 +205,7 @@ export default class AuthRequestHandler {
|
|
|
210
205
|
if (!authList) {
|
|
211
206
|
authList = {};
|
|
212
207
|
}
|
|
213
|
-
const idStr =
|
|
208
|
+
const idStr = stripUrl(url);
|
|
214
209
|
// Do not enqueue duplicate authorization requests.
|
|
215
210
|
const isDuplicate = Object.values(this.#authRequestsV2).some(request => request.idStr === idStr);
|
|
216
211
|
assert(!isDuplicate, `The source ${url} has a pending authorization request`);
|
|
@@ -265,7 +260,7 @@ export default class AuthRequestHandler {
|
|
|
265
260
|
return this.authorizeUrlSubject;
|
|
266
261
|
}
|
|
267
262
|
ensureUrlAuthorizedV2(url) {
|
|
268
|
-
const idStr =
|
|
263
|
+
const idStr = stripUrl(url);
|
|
269
264
|
return new Promise((resolve, reject) => {
|
|
270
265
|
this.getAuthorize(value => {
|
|
271
266
|
if (!value) {
|
|
@@ -12,7 +12,7 @@ export default class SubstrateRequestHandler {
|
|
|
12
12
|
private updateIconSign;
|
|
13
13
|
private signComplete;
|
|
14
14
|
get numSubstrateRequests(): number;
|
|
15
|
-
sign(url: string, request: RequestSign, account: AccountJson): Promise<ResponseSigning>;
|
|
15
|
+
sign(url: string, request: RequestSign, account: AccountJson, _id?: string): Promise<ResponseSigning>;
|
|
16
16
|
signTransaction(id: string, address: string, url: string, payload: SignerPayloadJSON): Promise<ResponseSigning>;
|
|
17
17
|
resetWallet(): void;
|
|
18
18
|
}
|
|
@@ -57,8 +57,8 @@ export default class SubstrateRequestHandler {
|
|
|
57
57
|
get numSubstrateRequests() {
|
|
58
58
|
return Object.keys(this.#substrateRequests).length;
|
|
59
59
|
}
|
|
60
|
-
sign(url, request, account) {
|
|
61
|
-
const id = getId();
|
|
60
|
+
sign(url, request, account, _id) {
|
|
61
|
+
const id = _id || getId();
|
|
62
62
|
return new Promise((resolve, reject) => {
|
|
63
63
|
this.#substrateRequests[id] = {
|
|
64
64
|
...this.signComplete(id, resolve, reject),
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import RequestService from '@subwallet/extension-base/services/request-service';
|
|
2
|
+
import { RequestWalletConnectSession, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types';
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
|
+
export default class WalletConnectRequestHandler {
|
|
5
|
+
#private;
|
|
6
|
+
readonly connectWCSubject: BehaviorSubject<WalletConnectSessionRequest[]>;
|
|
7
|
+
constructor(requestService: RequestService);
|
|
8
|
+
get allConnectWCRequests(): WalletConnectSessionRequest[];
|
|
9
|
+
get numConnectWCRequests(): number;
|
|
10
|
+
getConnectWCRequest(id: string): RequestWalletConnectSession;
|
|
11
|
+
private updateIconConnectWC;
|
|
12
|
+
private connectWCComplete;
|
|
13
|
+
addConnectWCRequest(request: WalletConnectSessionRequest): void;
|
|
14
|
+
resetWallet(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { BehaviorSubject } from 'rxjs';
|
|
5
|
+
|
|
6
|
+
// WC = WalletConnect
|
|
7
|
+
export default class WalletConnectRequestHandler {
|
|
8
|
+
#requestService;
|
|
9
|
+
#walletConnectSessionRequests = {};
|
|
10
|
+
connectWCSubject = new BehaviorSubject([]);
|
|
11
|
+
constructor(requestService) {
|
|
12
|
+
this.#requestService = requestService;
|
|
13
|
+
}
|
|
14
|
+
get allConnectWCRequests() {
|
|
15
|
+
return Object.values(this.#walletConnectSessionRequests)
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
17
|
+
.map(({
|
|
18
|
+
reject,
|
|
19
|
+
resolve,
|
|
20
|
+
...data
|
|
21
|
+
}) => data);
|
|
22
|
+
}
|
|
23
|
+
get numConnectWCRequests() {
|
|
24
|
+
return Object.keys(this.#walletConnectSessionRequests).length;
|
|
25
|
+
}
|
|
26
|
+
getConnectWCRequest(id) {
|
|
27
|
+
return this.#walletConnectSessionRequests[id];
|
|
28
|
+
}
|
|
29
|
+
updateIconConnectWC(shouldClose) {
|
|
30
|
+
this.connectWCSubject.next(this.allConnectWCRequests);
|
|
31
|
+
this.#requestService.updateIconV2(shouldClose);
|
|
32
|
+
}
|
|
33
|
+
connectWCComplete = id => {
|
|
34
|
+
const complete = shouldClose => {
|
|
35
|
+
delete this.#walletConnectSessionRequests[id];
|
|
36
|
+
this.updateIconConnectWC(shouldClose);
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
reject: () => {
|
|
40
|
+
complete(true);
|
|
41
|
+
},
|
|
42
|
+
resolve: () => {
|
|
43
|
+
complete(true);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
addConnectWCRequest(request) {
|
|
48
|
+
const id = request.id;
|
|
49
|
+
this.#walletConnectSessionRequests[id] = {
|
|
50
|
+
...this.connectWCComplete(id),
|
|
51
|
+
...request
|
|
52
|
+
};
|
|
53
|
+
this.updateIconConnectWC();
|
|
54
|
+
this.#requestService.popupOpen();
|
|
55
|
+
}
|
|
56
|
+
resetWallet() {
|
|
57
|
+
for (const request of Object.values(this.#walletConnectSessionRequests)) {
|
|
58
|
+
request.reject(new Error('Reset wallet'));
|
|
59
|
+
}
|
|
60
|
+
this.connectWCSubject.next([]);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -4,6 +4,7 @@ import { ChainService } from '@subwallet/extension-base/services/chain-service';
|
|
|
4
4
|
import { KeyringService } from '@subwallet/extension-base/services/keyring-service';
|
|
5
5
|
import { AuthUrls, MetaRequest } from '@subwallet/extension-base/services/request-service/types';
|
|
6
6
|
import SettingService from '@subwallet/extension-base/services/setting-service/SettingService';
|
|
7
|
+
import { WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types';
|
|
7
8
|
import { MetadataDef } from '@subwallet/extension-inject/types';
|
|
8
9
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
9
10
|
import { SignerPayloadJSON } from '@polkadot/types/types/extrinsic';
|
|
@@ -14,7 +15,6 @@ export default class RequestService {
|
|
|
14
15
|
constructor(chainService: ChainService, settingService: SettingService, keyringService: KeyringService);
|
|
15
16
|
get numAllRequests(): number;
|
|
16
17
|
updateIconV2(shouldClose?: boolean): void;
|
|
17
|
-
stripUrl(url: string): string;
|
|
18
18
|
getAddressList(value?: boolean): Record<string, boolean>;
|
|
19
19
|
get popup(): number[];
|
|
20
20
|
popupClose(): void;
|
|
@@ -43,7 +43,7 @@ export default class RequestService {
|
|
|
43
43
|
ensureUrlAuthorizedV2(url: string): Promise<boolean>;
|
|
44
44
|
get signSubject(): BehaviorSubject<SigningRequest[]>;
|
|
45
45
|
get allSubstrateRequests(): SigningRequest[];
|
|
46
|
-
sign(url: string, request: RequestSign, account: AccountJson): Promise<ResponseSigning>;
|
|
46
|
+
sign(url: string, request: RequestSign, account: AccountJson, id?: string): Promise<ResponseSigning>;
|
|
47
47
|
get numSubstrateRequests(): number;
|
|
48
48
|
get numEvmRequests(): number;
|
|
49
49
|
get confirmationsQueueSubject(): BehaviorSubject<ConfirmationsQueue>;
|
|
@@ -52,6 +52,11 @@ export default class RequestService {
|
|
|
52
52
|
addConfirmation<CT extends ConfirmationType>(id: string, url: string, type: CT, payload: ConfirmationDefinitions[CT][0]['payload'], options?: ConfirmationsQueueItemOptions, validator?: (input: ConfirmationDefinitions[CT][1]) => Error | undefined): Promise<ConfirmationDefinitions[CT][1]>;
|
|
53
53
|
completeConfirmation(request: RequestConfirmationComplete): Promise<boolean>;
|
|
54
54
|
updateConfirmation<CT extends ConfirmationType>(id: string, type: CT, payload: ConfirmationDefinitions[CT][0]['payload'], options?: ConfirmationsQueueItemOptions, validator?: (input: ConfirmationDefinitions[CT][1]) => Error | undefined): void;
|
|
55
|
+
getConnectWCRequest(id: string): import("@subwallet/extension-base/services/wallet-connect-service/types").RequestWalletConnectSession;
|
|
56
|
+
get connectWCSubject(): BehaviorSubject<WalletConnectSessionRequest[]>;
|
|
57
|
+
get allConnectWCRequests(): WalletConnectSessionRequest[];
|
|
58
|
+
get numConnectWCRequests(): number;
|
|
59
|
+
addConnectWCRequest(request: WalletConnectSessionRequest): void;
|
|
55
60
|
get numRequests(): number;
|
|
56
61
|
resetWallet(): void;
|
|
57
62
|
}
|
|
@@ -6,6 +6,7 @@ import EvmRequestHandler from '@subwallet/extension-base/services/request-servic
|
|
|
6
6
|
import MetadataRequestHandler from '@subwallet/extension-base/services/request-service/handler/MetadataRequestHandler';
|
|
7
7
|
import PopupHandler from '@subwallet/extension-base/services/request-service/handler/PopupHandler';
|
|
8
8
|
import SubstrateRequestHandler from '@subwallet/extension-base/services/request-service/handler/SubstrateRequestHandler';
|
|
9
|
+
import WalletConnectRequestHandler from '@subwallet/extension-base/services/request-service/handler/WalletConnectRequestHandler';
|
|
9
10
|
export default class RequestService {
|
|
10
11
|
// Common
|
|
11
12
|
#chainService;
|
|
@@ -14,6 +15,7 @@ export default class RequestService {
|
|
|
14
15
|
#authRequestHandler;
|
|
15
16
|
#substrateRequestHandler;
|
|
16
17
|
#evmRequestHandler;
|
|
18
|
+
#walletConnectRequestHandler;
|
|
17
19
|
|
|
18
20
|
// Common
|
|
19
21
|
constructor(chainService, settingService, keyringService) {
|
|
@@ -25,6 +27,7 @@ export default class RequestService {
|
|
|
25
27
|
this.#authRequestHandler = new AuthRequestHandler(this, this.#chainService, this.keyringService);
|
|
26
28
|
this.#substrateRequestHandler = new SubstrateRequestHandler(this);
|
|
27
29
|
this.#evmRequestHandler = new EvmRequestHandler(this);
|
|
30
|
+
this.#walletConnectRequestHandler = new WalletConnectRequestHandler(this);
|
|
28
31
|
|
|
29
32
|
// Reset icon on start service
|
|
30
33
|
this.updateIconV2();
|
|
@@ -35,9 +38,6 @@ export default class RequestService {
|
|
|
35
38
|
updateIconV2(shouldClose) {
|
|
36
39
|
this.#popupHandler.updateIconV2(shouldClose);
|
|
37
40
|
}
|
|
38
|
-
stripUrl(url) {
|
|
39
|
-
return this.#authRequestHandler.stripUrl(url);
|
|
40
|
-
}
|
|
41
41
|
getAddressList(value = false) {
|
|
42
42
|
const addressList = Object.keys(this.keyringService.accounts);
|
|
43
43
|
return addressList.reduce((addressList, v) => ({
|
|
@@ -128,8 +128,8 @@ export default class RequestService {
|
|
|
128
128
|
get allSubstrateRequests() {
|
|
129
129
|
return this.#substrateRequestHandler.allSubstrateRequests;
|
|
130
130
|
}
|
|
131
|
-
sign(url, request, account) {
|
|
132
|
-
return this.#substrateRequestHandler.sign(url, request, account);
|
|
131
|
+
sign(url, request, account, id) {
|
|
132
|
+
return this.#substrateRequestHandler.sign(url, request, account, id);
|
|
133
133
|
}
|
|
134
134
|
get numSubstrateRequests() {
|
|
135
135
|
return this.#substrateRequestHandler.numSubstrateRequests;
|
|
@@ -158,14 +158,32 @@ export default class RequestService {
|
|
|
158
158
|
return this.#evmRequestHandler.updateConfirmation(id, type, payload, options, validator);
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
+
// Wallet Connect requests
|
|
162
|
+
getConnectWCRequest(id) {
|
|
163
|
+
return this.#walletConnectRequestHandler.getConnectWCRequest(id);
|
|
164
|
+
}
|
|
165
|
+
get connectWCSubject() {
|
|
166
|
+
return this.#walletConnectRequestHandler.connectWCSubject;
|
|
167
|
+
}
|
|
168
|
+
get allConnectWCRequests() {
|
|
169
|
+
return this.#walletConnectRequestHandler.allConnectWCRequests;
|
|
170
|
+
}
|
|
171
|
+
get numConnectWCRequests() {
|
|
172
|
+
return this.#walletConnectRequestHandler.numConnectWCRequests;
|
|
173
|
+
}
|
|
174
|
+
addConnectWCRequest(request) {
|
|
175
|
+
return this.#walletConnectRequestHandler.addConnectWCRequest(request);
|
|
176
|
+
}
|
|
177
|
+
|
|
161
178
|
// General methods
|
|
162
179
|
get numRequests() {
|
|
163
|
-
return this.numMetaRequests + this.numAuthRequests + this.numSubstrateRequests + this.numEvmRequests;
|
|
180
|
+
return this.numMetaRequests + this.numAuthRequests + this.numSubstrateRequests + this.numEvmRequests + this.numConnectWCRequests;
|
|
164
181
|
}
|
|
165
182
|
resetWallet() {
|
|
166
183
|
this.#authRequestHandler.resetWallet();
|
|
167
184
|
this.#substrateRequestHandler.resetWallet();
|
|
168
185
|
this.#evmRequestHandler.resetWallet();
|
|
169
186
|
this.#metadataRequestHandler.resetWallet();
|
|
187
|
+
this.#walletConnectRequestHandler.resetWallet();
|
|
170
188
|
}
|
|
171
189
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { _ChainInfo } from '@subwallet/chain-list/types';
|
|
2
2
|
import { SWTransaction } from '@subwallet/extension-base/services/transaction-service/types';
|
|
3
3
|
import { SubmittableExtrinsic } from '@polkadot/api/promise/types';
|
|
4
|
-
export declare const getTransactionId: (chainType: string, chain: string, isInternal: boolean) => string;
|
|
4
|
+
export declare const getTransactionId: (chainType: string, chain: string, isInternal: boolean, isWalletConnect?: boolean) => string;
|
|
5
5
|
export declare const getValidationId: (chainType: string, chain: string) => string;
|
|
6
6
|
export declare const isSubstrateTransaction: (tx: SWTransaction['transaction']) => tx is SubmittableExtrinsic;
|
|
7
7
|
export declare const getBaseTransactionInfo: (transaction: SWTransaction, chainInfoMap: Record<string, _ChainInfo>) => string;
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
5
5
|
let transactionCount = 0;
|
|
6
6
|
let validationCount = 0;
|
|
7
|
-
export const getTransactionId = (chainType, chain, isInternal) => {
|
|
8
|
-
return `${isInternal ? 'internal' : 'external'}.${chainType}.${chain}.${Date.now()}.${++transactionCount}`;
|
|
7
|
+
export const getTransactionId = (chainType, chain, isInternal, isWalletConnect = false) => {
|
|
8
|
+
return `${isInternal ? 'internal' : !isWalletConnect ? 'external' : 'wallet-connect'}.${chainType}.${chain}.${Date.now()}.${++transactionCount}`;
|
|
9
9
|
};
|
|
10
10
|
export const getValidationId = (chainType, chain) => {
|
|
11
11
|
return `${chainType}.${chain}.${Date.now()}.${++validationCount}`;
|
|
@@ -13,6 +13,7 @@ import { TRANSACTION_TIMEOUT } from '@subwallet/extension-base/services/transact
|
|
|
13
13
|
import { parseTransferEventLogs, parseXcmEventLogs } from '@subwallet/extension-base/services/transaction-service/event-parser';
|
|
14
14
|
import { getBaseTransactionInfo, getTransactionId, isSubstrateTransaction } from '@subwallet/extension-base/services/transaction-service/helpers';
|
|
15
15
|
import { getExplorerLink, parseTransactionData } from '@subwallet/extension-base/services/transaction-service/utils';
|
|
16
|
+
import { isWalletConnectRequest } from '@subwallet/extension-base/services/wallet-connect-service/helpers';
|
|
16
17
|
import { anyNumberToBN } from '@subwallet/extension-base/utils/eth';
|
|
17
18
|
import { mergeTransactionAndSignature } from '@subwallet/extension-base/utils/eth/mergeTransactionAndSignature';
|
|
18
19
|
import { isContractAddress, parseContractInput } from '@subwallet/extension-base/utils/eth/parseTransaction';
|
|
@@ -170,7 +171,7 @@ export default class TransactionService {
|
|
|
170
171
|
}
|
|
171
172
|
fillTransactionDefaultInfo(transaction) {
|
|
172
173
|
const isInternal = !transaction.url;
|
|
173
|
-
const transactionId = getTransactionId(transaction.chainType, transaction.chain, isInternal);
|
|
174
|
+
const transactionId = getTransactionId(transaction.chainType, transaction.chain, isInternal, isWalletConnectRequest(transaction.id));
|
|
174
175
|
return {
|
|
175
176
|
...transaction,
|
|
176
177
|
createdAt: new Date().getTime(),
|
|
@@ -23,7 +23,8 @@ export interface SWTransaction extends ValidateTransactionResponse, Partial<Pick
|
|
|
23
23
|
}
|
|
24
24
|
export declare type SWTransactionResult = Omit<SWTransaction, 'transaction' | 'additionalValidator' | 'eventsHandler'>;
|
|
25
25
|
declare type SwInputBase = Pick<SWTransaction, 'address' | 'url' | 'data' | 'extrinsicType' | 'chain' | 'chainType' | 'ignoreWarnings' | 'transferNativeAmount'> & Partial<Pick<SWTransaction, 'additionalValidator' | 'eventsHandler'>>;
|
|
26
|
-
export interface SWTransactionInput extends SwInputBase {
|
|
26
|
+
export interface SWTransactionInput extends SwInputBase, Partial<Pick<SWTransaction, 'estimateFee'>> {
|
|
27
|
+
id?: string;
|
|
27
28
|
transaction?: SWTransaction['transaction'] | null;
|
|
28
29
|
warnings?: SWTransaction['warnings'];
|
|
29
30
|
errors?: SWTransaction['errors'];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WalletConnectSigningMethod } from '@subwallet/extension-base/services/wallet-connect-service/types';
|
|
2
|
+
import { SignClientTypes } from '@walletconnect/types';
|
|
3
|
+
export declare const PROJECT_ID = "6da34c0b48164d27681924dd9a46d6be";
|
|
4
|
+
export declare const RELAY_URL = "wss://relay.walletconnect.com";
|
|
5
|
+
export declare const DEFAULT_WALLET_CONNECT_OPTIONS: SignClientTypes.Options;
|
|
6
|
+
export declare const ALL_WALLET_CONNECT_EVENT: SignClientTypes.Event[];
|
|
7
|
+
export declare const WALLET_CONNECT_SUPPORTED_METHODS: WalletConnectSigningMethod[];
|
|
8
|
+
export declare const WALLET_CONNECT_REQUEST_KEY = "wallet-connect";
|
|
9
|
+
export declare const WALLET_CONNECT_EIP155_NAMESPACE = "eip155";
|
|
10
|
+
export declare const WALLET_CONNECT_POLKADOT_NAMESPACE = "polkadot";
|
|
11
|
+
export declare const WALLET_CONNECT_SUPPORT_NAMESPACES: string[];
|
|
@@ -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
|
+
}
|