@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
|
@@ -25,11 +25,6 @@ var _util = require("@polkadot/util");
|
|
|
25
25
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
26
26
|
// SPDX-License-Identifier: Apache-2.0
|
|
27
27
|
|
|
28
|
-
function stripUrl(url) {
|
|
29
|
-
(0, _util.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:`);
|
|
30
|
-
const parts = url.split('/');
|
|
31
|
-
return parts[2];
|
|
32
|
-
}
|
|
33
28
|
function transformAccountsV2(accounts) {
|
|
34
29
|
let anyType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
35
30
|
let authInfo = arguments.length > 2 ? arguments[2] : undefined;
|
|
@@ -227,7 +222,7 @@ class KoniTabs {
|
|
|
227
222
|
});
|
|
228
223
|
}
|
|
229
224
|
checkPassList(_url) {
|
|
230
|
-
const url = stripUrl(_url);
|
|
225
|
+
const url = (0, _utils2.stripUrl)(_url);
|
|
231
226
|
const result = this.#passPhishing[url];
|
|
232
227
|
return result ? !result.pass : true;
|
|
233
228
|
}
|
|
@@ -262,7 +257,7 @@ class KoniTabs {
|
|
|
262
257
|
}
|
|
263
258
|
async getAuthInfo(url) {
|
|
264
259
|
const authList = await this.#koniState.getAuthList();
|
|
265
|
-
const shortenUrl = stripUrl(url);
|
|
260
|
+
const shortenUrl = (0, _utils2.stripUrl)(url);
|
|
266
261
|
return authList[shortenUrl];
|
|
267
262
|
}
|
|
268
263
|
async accountsListV2(url, _ref10) {
|
|
@@ -399,7 +394,7 @@ class KoniTabs {
|
|
|
399
394
|
}
|
|
400
395
|
const [networkKey] = this.#koniState.findNetworkKeyByChainId(parseInt(chainId, 16));
|
|
401
396
|
if (networkKey) {
|
|
402
|
-
await this.#koniState.switchEvmNetworkByUrl(stripUrl(url), networkKey);
|
|
397
|
+
await this.#koniState.switchEvmNetworkByUrl((0, _utils2.stripUrl)(url), networkKey);
|
|
403
398
|
} else {
|
|
404
399
|
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, `Not found chainId ${chainId} in wallet`);
|
|
405
400
|
}
|
|
@@ -444,7 +439,7 @@ class KoniTabs {
|
|
|
444
439
|
tokenInfo.contractError = true;
|
|
445
440
|
} else {
|
|
446
441
|
tokenInfo.slug = validate === null || validate === void 0 ? void 0 : validate.existedSlug;
|
|
447
|
-
tokenInfo.name = validate.name;
|
|
442
|
+
tokenInfo.name = validate.name || tokenInfo.name;
|
|
448
443
|
tokenInfo.symbol = validate.symbol;
|
|
449
444
|
tokenInfo.decimals = validate.decimals;
|
|
450
445
|
}
|
|
@@ -875,6 +870,61 @@ class KoniTabs {
|
|
|
875
870
|
return false;
|
|
876
871
|
}
|
|
877
872
|
}
|
|
873
|
+
async addPspToken(id, url, _ref21) {
|
|
874
|
+
let {
|
|
875
|
+
genesisHash,
|
|
876
|
+
tokenInfo: input
|
|
877
|
+
} = _ref21;
|
|
878
|
+
const _tokenType = input.type;
|
|
879
|
+
if (_tokenType !== 'psp22' && _tokenType !== 'psp34') {
|
|
880
|
+
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, `Assets type ${_tokenType} is not supported`);
|
|
881
|
+
}
|
|
882
|
+
if (!input.address || !input.symbol) {
|
|
883
|
+
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, 'Assets params require address and symbol');
|
|
884
|
+
}
|
|
885
|
+
const [chain] = this.#koniState.findNetworkKeyByGenesisHash(genesisHash);
|
|
886
|
+
if (!chain) {
|
|
887
|
+
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INTERNAL_ERROR, 'Current chain is not available');
|
|
888
|
+
}
|
|
889
|
+
const state = this.#koniState.getChainStateByKey(chain);
|
|
890
|
+
if (!state.active) {
|
|
891
|
+
await this.#koniState.enableChain(chain, false);
|
|
892
|
+
const api = this.#koniState.getSubstrateApi(chain);
|
|
893
|
+
await api.isReady;
|
|
894
|
+
}
|
|
895
|
+
const tokenType = _tokenType === 'psp22' ? _types._AssetType.PSP22 : _types._AssetType.PSP34;
|
|
896
|
+
const tokenInfo = {
|
|
897
|
+
slug: '',
|
|
898
|
+
type: tokenType,
|
|
899
|
+
name: input.symbol || '',
|
|
900
|
+
contractAddress: input.address,
|
|
901
|
+
symbol: input.symbol || '',
|
|
902
|
+
decimals: input.decimals || 0,
|
|
903
|
+
originChain: chain,
|
|
904
|
+
contractError: false,
|
|
905
|
+
validated: false
|
|
906
|
+
};
|
|
907
|
+
this.#koniState.validateCustomAsset({
|
|
908
|
+
type: tokenType,
|
|
909
|
+
contractAddress: input.address,
|
|
910
|
+
originChain: chain
|
|
911
|
+
}).then(validate => {
|
|
912
|
+
if (validate.contractError) {
|
|
913
|
+
tokenInfo.contractError = true;
|
|
914
|
+
} else {
|
|
915
|
+
tokenInfo.slug = validate === null || validate === void 0 ? void 0 : validate.existedSlug;
|
|
916
|
+
tokenInfo.name = validate.name || tokenInfo.name;
|
|
917
|
+
tokenInfo.symbol = validate.symbol;
|
|
918
|
+
tokenInfo.decimals = validate.decimals;
|
|
919
|
+
}
|
|
920
|
+
}).catch(() => {
|
|
921
|
+
tokenInfo.contractError = true;
|
|
922
|
+
}).finally(() => {
|
|
923
|
+
tokenInfo.validated = true;
|
|
924
|
+
this.#koniState.requestService.updateConfirmation(id, 'addTokenRequest', tokenInfo);
|
|
925
|
+
});
|
|
926
|
+
return await this.#koniState.addTokenConfirm(id, url, tokenInfo);
|
|
927
|
+
}
|
|
878
928
|
async handle(id, type, request, url, port) {
|
|
879
929
|
if (type === 'pub(phishing.redirectIfDenied)') {
|
|
880
930
|
return this.redirectIfPhishing(url);
|
|
@@ -910,6 +960,8 @@ class KoniTabs {
|
|
|
910
960
|
return this.rpcSubscribeConnected(request, id, port);
|
|
911
961
|
case 'pub(rpc.unsubscribe)':
|
|
912
962
|
return this.rpcUnsubscribe(request, port);
|
|
963
|
+
case 'pub(token.add)':
|
|
964
|
+
return this.addPspToken(id, url, request);
|
|
913
965
|
|
|
914
966
|
///
|
|
915
967
|
case 'pub(authorize.tabV2)':
|
package/cjs/packageInfo.js
CHANGED
package/cjs/page/Metadata.js
CHANGED
|
@@ -65,6 +65,7 @@ exports._isTokenWasmSmartContract = _isTokenWasmSmartContract;
|
|
|
65
65
|
exports._isXcmPathSupported = _isXcmPathSupported;
|
|
66
66
|
exports._parseAssetRefKey = _parseAssetRefKey;
|
|
67
67
|
exports._parseMetadataForSmartContractAsset = _parseMetadataForSmartContractAsset;
|
|
68
|
+
exports.findChainInfoByHalfGenesisHash = exports.findChainInfoByChainId = void 0;
|
|
68
69
|
var _types = require("@subwallet/chain-list/types");
|
|
69
70
|
var _types2 = require("@subwallet/extension-base/services/chain-service/types");
|
|
70
71
|
var _utilCrypto = require("@polkadot/util-crypto");
|
|
@@ -397,4 +398,30 @@ function _isCustomProvider(providerKey) {
|
|
|
397
398
|
}
|
|
398
399
|
function _generateCustomProviderKey(index) {
|
|
399
400
|
return `${_types2._CUSTOM_PREFIX}provider-${index}`;
|
|
400
|
-
}
|
|
401
|
+
}
|
|
402
|
+
const findChainInfoByHalfGenesisHash = (chainMap, halfGenesisHash) => {
|
|
403
|
+
if (!halfGenesisHash) {
|
|
404
|
+
return null;
|
|
405
|
+
}
|
|
406
|
+
for (const chainInfo of Object.values(chainMap)) {
|
|
407
|
+
var _getSubstrateGenesisH;
|
|
408
|
+
if (((_getSubstrateGenesisH = _getSubstrateGenesisHash(chainInfo)) === null || _getSubstrateGenesisH === void 0 ? void 0 : _getSubstrateGenesisH.toLowerCase().substring(2, 2 + 32)) === halfGenesisHash.toLowerCase()) {
|
|
409
|
+
return chainInfo;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return null;
|
|
413
|
+
};
|
|
414
|
+
exports.findChainInfoByHalfGenesisHash = findChainInfoByHalfGenesisHash;
|
|
415
|
+
const findChainInfoByChainId = (chainMap, chainId) => {
|
|
416
|
+
if (!chainId) {
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
for (const chainInfo of Object.values(chainMap)) {
|
|
420
|
+
var _chainInfo$evmInfo5;
|
|
421
|
+
if (((_chainInfo$evmInfo5 = chainInfo.evmInfo) === null || _chainInfo$evmInfo5 === void 0 ? void 0 : _chainInfo$evmInfo5.evmChainId) === chainId) {
|
|
422
|
+
return chainInfo;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return null;
|
|
426
|
+
};
|
|
427
|
+
exports.findChainInfoByChainId = findChainInfoByChainId;
|
|
@@ -31,11 +31,6 @@ class AuthRequestHandler {
|
|
|
31
31
|
this.#requestService = requestService;
|
|
32
32
|
this.#chainService = chainService;
|
|
33
33
|
}
|
|
34
|
-
stripUrl(url) {
|
|
35
|
-
(0, _util.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:`);
|
|
36
|
-
const parts = url.split('/');
|
|
37
|
-
return parts[2];
|
|
38
|
-
}
|
|
39
34
|
getAddressList() {
|
|
40
35
|
let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
41
36
|
const addressList = Object.keys(this.keyringService.accounts);
|
|
@@ -172,7 +167,7 @@ class AuthRequestHandler {
|
|
|
172
167
|
if (value) {
|
|
173
168
|
authorizeList = value;
|
|
174
169
|
}
|
|
175
|
-
const existed = authorizeList[
|
|
170
|
+
const existed = authorizeList[(0, _utils2.stripUrl)(url)];
|
|
176
171
|
|
|
177
172
|
// On cancel don't save anything
|
|
178
173
|
if (isCancelled) {
|
|
@@ -181,7 +176,7 @@ class AuthRequestHandler {
|
|
|
181
176
|
cb();
|
|
182
177
|
return;
|
|
183
178
|
}
|
|
184
|
-
authorizeList[
|
|
179
|
+
authorizeList[(0, _utils2.stripUrl)(url)] = {
|
|
185
180
|
count: 0,
|
|
186
181
|
id: idStr,
|
|
187
182
|
isAllowed,
|
|
@@ -222,7 +217,7 @@ class AuthRequestHandler {
|
|
|
222
217
|
if (!authList) {
|
|
223
218
|
authList = {};
|
|
224
219
|
}
|
|
225
|
-
const idStr =
|
|
220
|
+
const idStr = (0, _utils2.stripUrl)(url);
|
|
226
221
|
// Do not enqueue duplicate authorization requests.
|
|
227
222
|
const isDuplicate = Object.values(this.#authRequestsV2).some(request => request.idStr === idStr);
|
|
228
223
|
(0, _util.assert)(!isDuplicate, `The source ${url} has a pending authorization request`);
|
|
@@ -280,7 +275,7 @@ class AuthRequestHandler {
|
|
|
280
275
|
return this.authorizeUrlSubject;
|
|
281
276
|
}
|
|
282
277
|
ensureUrlAuthorizedV2(url) {
|
|
283
|
-
const idStr =
|
|
278
|
+
const idStr = (0, _utils2.stripUrl)(url);
|
|
284
279
|
return new Promise((resolve, reject) => {
|
|
285
280
|
this.getAuthorize(value => {
|
|
286
281
|
if (!value) {
|
|
@@ -67,8 +67,8 @@ class SubstrateRequestHandler {
|
|
|
67
67
|
get numSubstrateRequests() {
|
|
68
68
|
return Object.keys(this.#substrateRequests).length;
|
|
69
69
|
}
|
|
70
|
-
sign(url, request, account) {
|
|
71
|
-
const id = (0, _getId.getId)();
|
|
70
|
+
sign(url, request, account, _id) {
|
|
71
|
+
const id = _id || (0, _getId.getId)();
|
|
72
72
|
return new Promise((resolve, reject) => {
|
|
73
73
|
this.#substrateRequests[id] = {
|
|
74
74
|
...this.signComplete(id, resolve, reject),
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _rxjs = require("rxjs");
|
|
8
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
9
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
10
|
+
|
|
11
|
+
// WC = WalletConnect
|
|
12
|
+
class WalletConnectRequestHandler {
|
|
13
|
+
#requestService;
|
|
14
|
+
#walletConnectSessionRequests = {};
|
|
15
|
+
connectWCSubject = new _rxjs.BehaviorSubject([]);
|
|
16
|
+
constructor(requestService) {
|
|
17
|
+
this.#requestService = requestService;
|
|
18
|
+
}
|
|
19
|
+
get allConnectWCRequests() {
|
|
20
|
+
return Object.values(this.#walletConnectSessionRequests)
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
22
|
+
.map(_ref => {
|
|
23
|
+
let {
|
|
24
|
+
reject,
|
|
25
|
+
resolve,
|
|
26
|
+
...data
|
|
27
|
+
} = _ref;
|
|
28
|
+
return data;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
get numConnectWCRequests() {
|
|
32
|
+
return Object.keys(this.#walletConnectSessionRequests).length;
|
|
33
|
+
}
|
|
34
|
+
getConnectWCRequest(id) {
|
|
35
|
+
return this.#walletConnectSessionRequests[id];
|
|
36
|
+
}
|
|
37
|
+
updateIconConnectWC(shouldClose) {
|
|
38
|
+
this.connectWCSubject.next(this.allConnectWCRequests);
|
|
39
|
+
this.#requestService.updateIconV2(shouldClose);
|
|
40
|
+
}
|
|
41
|
+
connectWCComplete = id => {
|
|
42
|
+
const complete = shouldClose => {
|
|
43
|
+
delete this.#walletConnectSessionRequests[id];
|
|
44
|
+
this.updateIconConnectWC(shouldClose);
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
reject: () => {
|
|
48
|
+
complete(true);
|
|
49
|
+
},
|
|
50
|
+
resolve: () => {
|
|
51
|
+
complete(true);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
addConnectWCRequest(request) {
|
|
56
|
+
const id = request.id;
|
|
57
|
+
this.#walletConnectSessionRequests[id] = {
|
|
58
|
+
...this.connectWCComplete(id),
|
|
59
|
+
...request
|
|
60
|
+
};
|
|
61
|
+
this.updateIconConnectWC();
|
|
62
|
+
this.#requestService.popupOpen();
|
|
63
|
+
}
|
|
64
|
+
resetWallet() {
|
|
65
|
+
for (const request of Object.values(this.#walletConnectSessionRequests)) {
|
|
66
|
+
request.reject(new Error('Reset wallet'));
|
|
67
|
+
}
|
|
68
|
+
this.connectWCSubject.next([]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.default = WalletConnectRequestHandler;
|
|
@@ -10,6 +10,7 @@ var _EvmRequestHandler = _interopRequireDefault(require("@subwallet/extension-ba
|
|
|
10
10
|
var _MetadataRequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/MetadataRequestHandler"));
|
|
11
11
|
var _PopupHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/PopupHandler"));
|
|
12
12
|
var _SubstrateRequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/SubstrateRequestHandler"));
|
|
13
|
+
var _WalletConnectRequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/WalletConnectRequestHandler"));
|
|
13
14
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
14
15
|
// SPDX-License-Identifier: Apache-2.0
|
|
15
16
|
|
|
@@ -21,6 +22,7 @@ class RequestService {
|
|
|
21
22
|
#authRequestHandler;
|
|
22
23
|
#substrateRequestHandler;
|
|
23
24
|
#evmRequestHandler;
|
|
25
|
+
#walletConnectRequestHandler;
|
|
24
26
|
|
|
25
27
|
// Common
|
|
26
28
|
constructor(chainService, settingService, keyringService) {
|
|
@@ -32,6 +34,7 @@ class RequestService {
|
|
|
32
34
|
this.#authRequestHandler = new _AuthRequestHandler.default(this, this.#chainService, this.keyringService);
|
|
33
35
|
this.#substrateRequestHandler = new _SubstrateRequestHandler.default(this);
|
|
34
36
|
this.#evmRequestHandler = new _EvmRequestHandler.default(this);
|
|
37
|
+
this.#walletConnectRequestHandler = new _WalletConnectRequestHandler.default(this);
|
|
35
38
|
|
|
36
39
|
// Reset icon on start service
|
|
37
40
|
this.updateIconV2();
|
|
@@ -42,9 +45,6 @@ class RequestService {
|
|
|
42
45
|
updateIconV2(shouldClose) {
|
|
43
46
|
this.#popupHandler.updateIconV2(shouldClose);
|
|
44
47
|
}
|
|
45
|
-
stripUrl(url) {
|
|
46
|
-
return this.#authRequestHandler.stripUrl(url);
|
|
47
|
-
}
|
|
48
48
|
getAddressList() {
|
|
49
49
|
let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
50
50
|
const addressList = Object.keys(this.keyringService.accounts);
|
|
@@ -136,8 +136,8 @@ class RequestService {
|
|
|
136
136
|
get allSubstrateRequests() {
|
|
137
137
|
return this.#substrateRequestHandler.allSubstrateRequests;
|
|
138
138
|
}
|
|
139
|
-
sign(url, request, account) {
|
|
140
|
-
return this.#substrateRequestHandler.sign(url, request, account);
|
|
139
|
+
sign(url, request, account, id) {
|
|
140
|
+
return this.#substrateRequestHandler.sign(url, request, account, id);
|
|
141
141
|
}
|
|
142
142
|
get numSubstrateRequests() {
|
|
143
143
|
return this.#substrateRequestHandler.numSubstrateRequests;
|
|
@@ -170,15 +170,33 @@ class RequestService {
|
|
|
170
170
|
return this.#evmRequestHandler.updateConfirmation(id, type, payload, options, validator);
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
+
// Wallet Connect requests
|
|
174
|
+
getConnectWCRequest(id) {
|
|
175
|
+
return this.#walletConnectRequestHandler.getConnectWCRequest(id);
|
|
176
|
+
}
|
|
177
|
+
get connectWCSubject() {
|
|
178
|
+
return this.#walletConnectRequestHandler.connectWCSubject;
|
|
179
|
+
}
|
|
180
|
+
get allConnectWCRequests() {
|
|
181
|
+
return this.#walletConnectRequestHandler.allConnectWCRequests;
|
|
182
|
+
}
|
|
183
|
+
get numConnectWCRequests() {
|
|
184
|
+
return this.#walletConnectRequestHandler.numConnectWCRequests;
|
|
185
|
+
}
|
|
186
|
+
addConnectWCRequest(request) {
|
|
187
|
+
return this.#walletConnectRequestHandler.addConnectWCRequest(request);
|
|
188
|
+
}
|
|
189
|
+
|
|
173
190
|
// General methods
|
|
174
191
|
get numRequests() {
|
|
175
|
-
return this.numMetaRequests + this.numAuthRequests + this.numSubstrateRequests + this.numEvmRequests;
|
|
192
|
+
return this.numMetaRequests + this.numAuthRequests + this.numSubstrateRequests + this.numEvmRequests + this.numConnectWCRequests;
|
|
176
193
|
}
|
|
177
194
|
resetWallet() {
|
|
178
195
|
this.#authRequestHandler.resetWallet();
|
|
179
196
|
this.#substrateRequestHandler.resetWallet();
|
|
180
197
|
this.#evmRequestHandler.resetWallet();
|
|
181
198
|
this.#metadataRequestHandler.resetWallet();
|
|
199
|
+
this.#walletConnectRequestHandler.resetWallet();
|
|
182
200
|
}
|
|
183
201
|
}
|
|
184
202
|
exports.default = RequestService;
|
|
@@ -10,8 +10,9 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
|
10
10
|
|
|
11
11
|
let transactionCount = 0;
|
|
12
12
|
let validationCount = 0;
|
|
13
|
-
const getTransactionId = (chainType, chain, isInternal)
|
|
14
|
-
|
|
13
|
+
const getTransactionId = function (chainType, chain, isInternal) {
|
|
14
|
+
let isWalletConnect = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
15
|
+
return `${isInternal ? 'internal' : !isWalletConnect ? 'external' : 'wallet-connect'}.${chainType}.${chain}.${Date.now()}.${++transactionCount}`;
|
|
15
16
|
};
|
|
16
17
|
exports.getTransactionId = getTransactionId;
|
|
17
18
|
const getValidationId = (chainType, chain) => {
|
|
@@ -17,6 +17,7 @@ var _constants4 = require("@subwallet/extension-base/services/transaction-servic
|
|
|
17
17
|
var _eventParser = require("@subwallet/extension-base/services/transaction-service/event-parser");
|
|
18
18
|
var _helpers = require("@subwallet/extension-base/services/transaction-service/helpers");
|
|
19
19
|
var _utils2 = require("@subwallet/extension-base/services/transaction-service/utils");
|
|
20
|
+
var _helpers2 = require("@subwallet/extension-base/services/wallet-connect-service/helpers");
|
|
20
21
|
var _eth = require("@subwallet/extension-base/utils/eth");
|
|
21
22
|
var _mergeTransactionAndSignature = require("@subwallet/extension-base/utils/eth/mergeTransactionAndSignature");
|
|
22
23
|
var _parseTransaction = require("@subwallet/extension-base/utils/eth/parseTransaction");
|
|
@@ -177,7 +178,7 @@ class TransactionService {
|
|
|
177
178
|
}
|
|
178
179
|
fillTransactionDefaultInfo(transaction) {
|
|
179
180
|
const isInternal = !transaction.url;
|
|
180
|
-
const transactionId = (0, _helpers.getTransactionId)(transaction.chainType, transaction.chain, isInternal);
|
|
181
|
+
const transactionId = (0, _helpers.getTransactionId)(transaction.chainType, transaction.chain, isInternal, (0, _helpers2.isWalletConnectRequest)(transaction.id));
|
|
181
182
|
return {
|
|
182
183
|
...transaction,
|
|
183
184
|
createdAt: new Date().getTime(),
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.WALLET_CONNECT_SUPPORT_NAMESPACES = exports.WALLET_CONNECT_SUPPORTED_METHODS = exports.WALLET_CONNECT_REQUEST_KEY = exports.WALLET_CONNECT_POLKADOT_NAMESPACE = exports.WALLET_CONNECT_EIP155_NAMESPACE = exports.RELAY_URL = exports.PROJECT_ID = exports.DEFAULT_WALLET_CONNECT_OPTIONS = exports.ALL_WALLET_CONNECT_EVENT = void 0;
|
|
7
|
+
var _types = require("@subwallet/extension-base/services/wallet-connect-service/types");
|
|
8
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
9
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
10
|
+
|
|
11
|
+
const PROJECT_ID = '6da34c0b48164d27681924dd9a46d6be';
|
|
12
|
+
exports.PROJECT_ID = PROJECT_ID;
|
|
13
|
+
const RELAY_URL = 'wss://relay.walletconnect.com';
|
|
14
|
+
exports.RELAY_URL = RELAY_URL;
|
|
15
|
+
const DEFAULT_WALLET_CONNECT_OPTIONS = {
|
|
16
|
+
logger: 'debug',
|
|
17
|
+
projectId: PROJECT_ID,
|
|
18
|
+
relayUrl: RELAY_URL,
|
|
19
|
+
metadata: {
|
|
20
|
+
name: 'SubWallet',
|
|
21
|
+
description: 'React Wallet for WalletConnect',
|
|
22
|
+
url: 'https://www.subwallet.app/',
|
|
23
|
+
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']
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.DEFAULT_WALLET_CONNECT_OPTIONS = DEFAULT_WALLET_CONNECT_OPTIONS;
|
|
27
|
+
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'];
|
|
28
|
+
exports.ALL_WALLET_CONNECT_EVENT = ALL_WALLET_CONNECT_EVENT;
|
|
29
|
+
const WALLET_CONNECT_SUPPORTED_METHODS = [_types.POLKADOT_SIGNING_METHODS.POLKADOT_SIGN_MESSAGE, _types.POLKADOT_SIGNING_METHODS.POLKADOT_SIGN_TRANSACTION, _types.EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION, _types.EIP155_SIGNING_METHODS.PERSONAL_SIGN, _types.EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V1, _types.EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3, _types.EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4];
|
|
30
|
+
exports.WALLET_CONNECT_SUPPORTED_METHODS = WALLET_CONNECT_SUPPORTED_METHODS;
|
|
31
|
+
const WALLET_CONNECT_REQUEST_KEY = 'wallet-connect';
|
|
32
|
+
exports.WALLET_CONNECT_REQUEST_KEY = WALLET_CONNECT_REQUEST_KEY;
|
|
33
|
+
const WALLET_CONNECT_EIP155_NAMESPACE = 'eip155';
|
|
34
|
+
exports.WALLET_CONNECT_EIP155_NAMESPACE = WALLET_CONNECT_EIP155_NAMESPACE;
|
|
35
|
+
const WALLET_CONNECT_POLKADOT_NAMESPACE = 'polkadot';
|
|
36
|
+
exports.WALLET_CONNECT_POLKADOT_NAMESPACE = WALLET_CONNECT_POLKADOT_NAMESPACE;
|
|
37
|
+
const WALLET_CONNECT_SUPPORT_NAMESPACES = [WALLET_CONNECT_EIP155_NAMESPACE, WALLET_CONNECT_POLKADOT_NAMESPACE];
|
|
38
|
+
exports.WALLET_CONNECT_SUPPORT_NAMESPACES = WALLET_CONNECT_SUPPORT_NAMESPACES;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase"));
|
|
9
|
+
var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey"));
|
|
10
|
+
var _utils = require("@json-rpc-tools/utils");
|
|
11
|
+
var _helpers = require("@subwallet/extension-base/services/wallet-connect-service/helpers");
|
|
12
|
+
var _types = require("@subwallet/extension-base/services/wallet-connect-service/types");
|
|
13
|
+
var _utils2 = require("@subwallet/extension-base/utils");
|
|
14
|
+
var _utils3 = require("@walletconnect/utils");
|
|
15
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
var _walletConnectService = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("walletConnectService");
|
|
18
|
+
var _koniState = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("koniState");
|
|
19
|
+
var _checkAccount = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("checkAccount");
|
|
20
|
+
var _handleError = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("handleError");
|
|
21
|
+
class Eip155RequestHandler {
|
|
22
|
+
constructor(koniState, walletConnectService) {
|
|
23
|
+
Object.defineProperty(this, _handleError, {
|
|
24
|
+
value: _handleError2
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(this, _checkAccount, {
|
|
27
|
+
value: _checkAccount2
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(this, _walletConnectService, {
|
|
30
|
+
writable: true,
|
|
31
|
+
value: void 0
|
|
32
|
+
});
|
|
33
|
+
Object.defineProperty(this, _koniState, {
|
|
34
|
+
writable: true,
|
|
35
|
+
value: void 0
|
|
36
|
+
});
|
|
37
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _koniState)[_koniState] = koniState;
|
|
38
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _walletConnectService)[_walletConnectService] = walletConnectService;
|
|
39
|
+
}
|
|
40
|
+
handleRequest(requestEvent) {
|
|
41
|
+
const {
|
|
42
|
+
id,
|
|
43
|
+
params,
|
|
44
|
+
topic
|
|
45
|
+
} = requestEvent;
|
|
46
|
+
const {
|
|
47
|
+
chainId: _chainId,
|
|
48
|
+
request
|
|
49
|
+
} = params;
|
|
50
|
+
const method = request.method;
|
|
51
|
+
const requestSession = (0, _classPrivateFieldLooseBase2.default)(this, _walletConnectService)[_walletConnectService].getSession(topic);
|
|
52
|
+
const url = requestSession.peer.metadata.url;
|
|
53
|
+
const sessionAccounts = requestSession.namespaces.eip155.accounts.map(account => account.split(':')[2]);
|
|
54
|
+
if ([_types.EIP155_SIGNING_METHODS.PERSONAL_SIGN, _types.EIP155_SIGNING_METHODS.ETH_SIGN, _types.EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA, _types.EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3, _types.EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4].includes(method)) {
|
|
55
|
+
const address = (0, _helpers.getEip155MessageAddress)(method, request.params);
|
|
56
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _checkAccount)[_checkAccount](address, sessionAccounts);
|
|
57
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _koniState)[_koniState].evmSign((0, _helpers.getWCId)(id), url, method === _types.EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA ? _types.EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4 : method, request.params, sessionAccounts).then(async signature => {
|
|
58
|
+
await (0, _classPrivateFieldLooseBase2.default)(this, _walletConnectService)[_walletConnectService].responseRequest({
|
|
59
|
+
topic: topic,
|
|
60
|
+
response: (0, _utils.formatJsonRpcResult)(id, signature)
|
|
61
|
+
});
|
|
62
|
+
}).catch(e => {
|
|
63
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _handleError)[_handleError](topic, id, e);
|
|
64
|
+
});
|
|
65
|
+
} else if (method === _types.EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION) {
|
|
66
|
+
const [tx] = (0, _helpers.parseRequestParams)(request.params);
|
|
67
|
+
const address = tx.from;
|
|
68
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _checkAccount)[_checkAccount](address, sessionAccounts);
|
|
69
|
+
const chainId = parseInt(_chainId.split(':')[1]);
|
|
70
|
+
const [networkKey, chainInfo] = (0, _classPrivateFieldLooseBase2.default)(this, _koniState)[_koniState].findNetworkKeyByChainId(chainId);
|
|
71
|
+
if (!networkKey || !chainInfo) {
|
|
72
|
+
throw new Error((0, _utils3.getSdkError)('UNSUPPORTED_CHAINS').message + ' ' + address);
|
|
73
|
+
}
|
|
74
|
+
const chainState = (0, _classPrivateFieldLooseBase2.default)(this, _koniState)[_koniState].getChainStateByKey(networkKey);
|
|
75
|
+
const createRequest = () => {
|
|
76
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _koniState)[_koniState].evmSendTransaction((0, _helpers.getWCId)(id), url, networkKey, sessionAccounts, tx).then(async signature => {
|
|
77
|
+
await (0, _classPrivateFieldLooseBase2.default)(this, _walletConnectService)[_walletConnectService].responseRequest({
|
|
78
|
+
topic: topic,
|
|
79
|
+
response: (0, _utils.formatJsonRpcResult)(id, signature)
|
|
80
|
+
});
|
|
81
|
+
}).catch(e => {
|
|
82
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _handleError)[_handleError](topic, id, e);
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
if (!chainState.active) {
|
|
86
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _koniState)[_koniState].chainService.enableChain(networkKey).then(createRequest).catch(() => {
|
|
87
|
+
throw new Error((0, _utils3.getSdkError)('USER_REJECTED').message + ' Can not active chain: ' + chainInfo.name);
|
|
88
|
+
});
|
|
89
|
+
} else {
|
|
90
|
+
createRequest();
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
throw Error((0, _utils3.getSdkError)('INVALID_METHOD').message + ' ' + method);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.default = Eip155RequestHandler;
|
|
98
|
+
function _checkAccount2(address, accounts) {
|
|
99
|
+
if (!accounts.find(account => (0, _utils2.isSameAddress)(account, address))) {
|
|
100
|
+
throw new Error((0, _utils3.getSdkError)('UNSUPPORTED_ACCOUNTS').message + ' ' + address);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function _handleError2(topic, id, e) {
|
|
104
|
+
console.log(e);
|
|
105
|
+
let message = e.message;
|
|
106
|
+
if (message.includes('User Rejected Request')) {
|
|
107
|
+
message = (0, _utils3.getSdkError)('USER_REJECTED').message;
|
|
108
|
+
}
|
|
109
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _walletConnectService)[_walletConnectService].responseRequest({
|
|
110
|
+
topic: topic,
|
|
111
|
+
response: (0, _utils.formatJsonRpcError)(id, message)
|
|
112
|
+
}).catch(console.error);
|
|
113
|
+
}
|