@subwallet/extension-base 1.1.43-0 → 1.1.45-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 (47) hide show
  1. package/cjs/koni/api/dotsama/transfer.js +9 -9
  2. package/cjs/koni/api/nft/index.js +1 -1
  3. package/cjs/koni/api/nft/ordinal_nft/constants.js +1 -5
  4. package/cjs/koni/api/nft/ordinal_nft/index.js +3 -8
  5. package/cjs/koni/api/nft/transfer.js +22 -12
  6. package/cjs/koni/api/nft/unique_network_nft/index.js +10 -9
  7. package/cjs/koni/background/handlers/Extension.js +1 -1
  8. package/cjs/packageInfo.js +1 -1
  9. package/cjs/services/chain-service/constants.js +9 -6
  10. package/cjs/services/chain-service/index.js +5 -5
  11. package/cjs/services/earning-service/constants/chains.js +1 -1
  12. package/cjs/services/earning-service/service.js +1 -1
  13. package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +67 -0
  14. package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting.js +22 -19
  15. package/cjs/services/migration-service/scripts/index.js +6 -4
  16. package/cjs/services/subscan-service/index.js +80 -18
  17. package/cjs/services/subscan-service/subscan-chain-map.js +3 -1
  18. package/cjs/services/transaction-service/utils.js +3 -0
  19. package/koni/api/dotsama/transfer.js +9 -9
  20. package/koni/api/nft/index.js +2 -2
  21. package/koni/api/nft/ordinal_nft/constants.d.ts +0 -2
  22. package/koni/api/nft/ordinal_nft/constants.js +0 -2
  23. package/koni/api/nft/ordinal_nft/index.d.ts +1 -1
  24. package/koni/api/nft/ordinal_nft/index.js +3 -8
  25. package/koni/api/nft/transfer.d.ts +2 -2
  26. package/koni/api/nft/transfer.js +22 -12
  27. package/koni/api/nft/unique_network_nft/index.js +10 -9
  28. package/koni/background/handlers/Extension.js +1 -1
  29. package/package.json +11 -11
  30. package/packageInfo.js +1 -1
  31. package/services/chain-service/constants.d.ts +0 -1
  32. package/services/chain-service/constants.js +9 -6
  33. package/services/chain-service/index.js +5 -5
  34. package/services/earning-service/constants/chains.js +1 -1
  35. package/services/earning-service/service.js +1 -1
  36. package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.d.ts +4 -0
  37. package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +58 -0
  38. package/services/migration-service/scripts/databases/MigrateAssetSetting.js +22 -19
  39. package/services/migration-service/scripts/index.js +6 -3
  40. package/services/subscan-service/index.d.ts +8 -1
  41. package/services/subscan-service/index.js +79 -18
  42. package/services/subscan-service/subscan-chain-map.js +3 -1
  43. package/services/subscan-service/types.d.ts +7 -0
  44. package/services/transaction-service/utils.js +3 -0
  45. package/cjs/koni/api/nft/ordinal_nft/utils.js +0 -41
  46. package/koni/api/nft/ordinal_nft/utils.d.ts +0 -2
  47. package/koni/api/nft/ordinal_nft/utils.js +0 -33
@@ -2,13 +2,17 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { SWError } from '@subwallet/extension-base/background/errors/SWError';
5
+ import { BASE_FETCH_ORDINAL_EVENT_DATA } from '@subwallet/extension-base/koni/api/nft/ordinal_nft/constants';
5
6
  import { wait } from '@subwallet/extension-base/utils';
6
7
  import fetch from 'cross-fetch';
7
8
  const QUERY_ROW = 100;
8
9
  export class SubscanService {
9
- limitRate = 2; // limit per interval check
10
+ callRate = 2; // limit per interval check
11
+ limitRate = 2; // max rate per interval check
10
12
  intervalCheck = 1000; // interval check in ms
11
13
  maxRetry = 9; // interval check in ms
14
+ rollbackRateTime = 30 * 1000; // rollback rate time in ms
15
+ timeoutRollbackRate = undefined;
12
16
  requestMap = {};
13
17
  nextId = 0;
14
18
  isRunning = false;
@@ -17,10 +21,18 @@ export class SubscanService {
17
21
  }
18
22
  constructor(subscanChainMap, options) {
19
23
  this.subscanChainMap = subscanChainMap;
24
+ this.callRate = (options === null || options === void 0 ? void 0 : options.limitRate) || this.callRate;
20
25
  this.limitRate = (options === null || options === void 0 ? void 0 : options.limitRate) || this.limitRate;
21
26
  this.intervalCheck = (options === null || options === void 0 ? void 0 : options.intervalCheck) || this.intervalCheck;
22
27
  this.maxRetry = (options === null || options === void 0 ? void 0 : options.maxRetry) || this.maxRetry;
23
28
  }
29
+ reduceLimitRate() {
30
+ clearTimeout(this.timeoutRollbackRate);
31
+ this.callRate = Math.ceil(this.limitRate / 2);
32
+ this.timeoutRollbackRate = setTimeout(() => {
33
+ this.callRate = this.limitRate;
34
+ }, this.rollbackRateTime);
35
+ }
24
36
  getApiUrl(chain, path) {
25
37
  const subscanChain = this.subscanChainMap[chain];
26
38
  if (!subscanChain) {
@@ -37,13 +49,14 @@ export class SubscanService {
37
49
  body: JSON.stringify(body)
38
50
  });
39
51
  }
40
- addRequest(run) {
52
+ addRequest(run, ordinal) {
41
53
  const newId = this.getId();
42
54
  return new Promise((resolve, reject) => {
43
55
  this.requestMap[newId] = {
44
56
  id: newId,
45
57
  status: 'pending',
46
58
  retry: -1,
59
+ ordinal,
47
60
  run,
48
61
  resolve,
49
62
  reject
@@ -65,7 +78,7 @@ export class SubscanService {
65
78
  }
66
79
 
67
80
  // Get first this.limit requests base on id
68
- const requests = remainingRequests.filter(request => request.status !== 'running').sort((a, b) => a.id - b.id).slice(0, this.limitRate);
81
+ const requests = remainingRequests.filter(request => request.status !== 'running').sort((a, b) => a.id - b.id).sort((a, b) => a.ordinal - b.ordinal).slice(0, this.callRate);
69
82
 
70
83
  // Start requests
71
84
  requests.forEach(request => {
@@ -73,12 +86,20 @@ export class SubscanService {
73
86
  request.run().then(rs => {
74
87
  request.resolve(rs);
75
88
  }).catch(e => {
76
- if (request.retry < maxRetry) {
77
- request.status = 'pending';
78
- request.retry++;
89
+ const error = JSON.parse(e.message);
90
+
91
+ // Limit rate
92
+ if (error.code === 20008) {
93
+ if (request.retry < maxRetry) {
94
+ request.status = 'pending';
95
+ request.retry++;
96
+ this.reduceLimitRate();
97
+ } else {
98
+ // Reject request
99
+ request.reject(new SWError('MAX_RETRY', String(e)));
100
+ }
79
101
  } else {
80
- // Reject request
81
- request.reject(new SWError('MAX_RETRY', String(e)));
102
+ request.reject(new SWError('UNKNOWN', String(e)));
82
103
  }
83
104
  });
84
105
  });
@@ -102,7 +123,7 @@ export class SubscanService {
102
123
  }
103
124
  const jsonData = await rs.json();
104
125
  return jsonData.data;
105
- });
126
+ }, 1);
106
127
  }
107
128
  getCrowdloanContributions(relayChain, address, page = 0) {
108
129
  return this.addRequest(async () => {
@@ -117,7 +138,7 @@ export class SubscanService {
117
138
  }
118
139
  const jsonData = await rs.json();
119
140
  return jsonData.data;
120
- });
141
+ }, 2);
121
142
  }
122
143
  getExtrinsicsList(chain, address, page = 0, blockRange) {
123
144
  const _blockRange = (() => {
@@ -127,7 +148,7 @@ export class SubscanService {
127
148
  return `${blockRange.from || 0}-${blockRange.to}`;
128
149
  })();
129
150
  return this.addRequest(async () => {
130
- const rs = await this.postRequest(this.getApiUrl(chain, 'api/scan/extrinsics'), {
151
+ const rs = await this.postRequest(this.getApiUrl(chain, 'api/v2/scan/extrinsics'), {
131
152
  page,
132
153
  row: QUERY_ROW,
133
154
  address,
@@ -138,7 +159,7 @@ export class SubscanService {
138
159
  }
139
160
  const jsonData = await rs.json();
140
161
  return jsonData.data;
141
- });
162
+ }, 0);
142
163
  }
143
164
  async fetchAllPossibleExtrinsicItems(chain, address, cbAfterEachRequest, limit = {
144
165
  page: 10,
@@ -159,11 +180,26 @@ export class SubscanService {
159
180
  if (res.count > maxCount) {
160
181
  maxCount = res.count;
161
182
  }
162
- cbAfterEachRequest === null || cbAfterEachRequest === void 0 ? void 0 : cbAfterEachRequest(res.extrinsics);
163
- res.extrinsics.forEach(item => {
183
+ const extrinsics = res.extrinsics;
184
+ const extrinsicIndexes = extrinsics.map(item => item.extrinsic_index);
185
+ const extrinsicParams = await this.getExtrinsicParams(chain, extrinsicIndexes, 0);
186
+ for (const data of extrinsicParams) {
187
+ const {
188
+ extrinsic_index: extrinsicIndex,
189
+ params
190
+ } = data;
191
+ const extrinsic = extrinsics.find(item => item.extrinsic_index === extrinsicIndex);
192
+ if (extrinsic) {
193
+ extrinsic.params = JSON.stringify(params);
194
+ }
195
+ }
196
+
197
+ // Call callback after each request, for parse data
198
+ cbAfterEachRequest === null || cbAfterEachRequest === void 0 ? void 0 : cbAfterEachRequest(extrinsics);
199
+ for (const item of extrinsics) {
164
200
  resultMap[item.extrinsic_hash] = item;
165
- });
166
- currentCount += res.extrinsics.length;
201
+ }
202
+ currentCount += extrinsics.length;
167
203
  if (page > limit.page || currentCount > limit.record) {
168
204
  return;
169
205
  }
@@ -193,7 +229,7 @@ export class SubscanService {
193
229
  }
194
230
  const jsonData = await rs.json();
195
231
  return jsonData.data;
196
- });
232
+ }, 0);
197
233
  }
198
234
  async fetchAllPossibleTransferItems(chain, address, direction, cbAfterEachRequest, limit = {
199
235
  page: 10,
@@ -250,6 +286,31 @@ export class SubscanService {
250
286
  }
251
287
  const jsonData = await rs.json();
252
288
  return jsonData.data;
253
- });
289
+ }, 2);
290
+ }
291
+ getAccountRemarkEvents(chain, address) {
292
+ return this.addRequest(async () => {
293
+ const rs = await this.postRequest(this.getApiUrl(chain, 'api/v2/scan/events'), {
294
+ ...BASE_FETCH_ORDINAL_EVENT_DATA,
295
+ address
296
+ });
297
+ if (rs.status !== 200) {
298
+ throw new SWError('SubscanService.getAccountRemarkEvents', await rs.text());
299
+ }
300
+ const jsonData = await rs.json();
301
+ return jsonData.data.events;
302
+ }, 3);
303
+ }
304
+ getExtrinsicParams(chain, extrinsicIndexes, ordinal = 3) {
305
+ return this.addRequest(async () => {
306
+ const rs = await this.postRequest(this.getApiUrl(chain, 'api/scan/extrinsic/params'), {
307
+ extrinsic_index: extrinsicIndexes
308
+ });
309
+ if (rs.status !== 200) {
310
+ throw new SWError('SubscanService.getExtrinsicParams', await rs.text());
311
+ }
312
+ const jsonData = await rs.json();
313
+ return jsonData.data;
314
+ }, ordinal);
254
315
  }
255
316
  }
@@ -131,6 +131,8 @@ export const SUBSCAN_BALANCE_CHAIN_MAP = {
131
131
  vara_network: 'vara',
132
132
  bifrost: 'bifrost',
133
133
  creditcoin: 'creditcoin',
134
- joystream: 'joystream'
134
+ joystream: 'joystream',
135
+ manta_network: 'manta',
136
+ continuum_network: 'continuum'
135
137
  };
136
138
  export const SUBSCAN_BALANCE_CHAIN_MAP_REVERSE = Object.fromEntries(Object.entries(SUBSCAN_BALANCE_CHAIN_MAP).map(([k, v]) => [v, k]));
@@ -1,6 +1,8 @@
1
1
  export interface SubscanRequest<T> {
2
2
  id: number;
3
3
  retry: number;
4
+ /** Serve smaller first */
5
+ ordinal: number;
4
6
  status: 'pending' | 'running';
5
7
  run: () => Promise<any>;
6
8
  resolve: (value: any) => T;
@@ -51,9 +53,13 @@ export interface ExtrinsicItem {
51
53
  block_timestamp: number;
52
54
  extrinsic_index: string;
53
55
  call_module_function: string;
56
+ /** Need be called from another api */
54
57
  params: string;
58
+ /** Deprecated */
55
59
  account_id: string;
60
+ /** Deprecated */
56
61
  account_index: string;
62
+ /** Deprecated */
57
63
  signature: string;
58
64
  call_module: string;
59
65
  nonce: number;
@@ -61,6 +67,7 @@ export interface ExtrinsicItem {
61
67
  success: boolean;
62
68
  fee: string;
63
69
  fee_used: string;
70
+ /** Deprecated */
64
71
  from_hex: string;
65
72
  tip: string;
66
73
  finalized: boolean;
@@ -22,6 +22,9 @@ function getBlockExplorerAccountRoute(explorerLink) {
22
22
  if (explorerLink.includes('3dpscan.io')) {
23
23
  return 'account';
24
24
  }
25
+ if (explorerLink.includes('explorer.polimec.org')) {
26
+ return 'account';
27
+ }
25
28
  return 'address';
26
29
  }
27
30
  function getBlockExplorerTxRoute(chainInfo) {
@@ -1,41 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.fetchRemarkEvent = exports.fetchExtrinsicParams = void 0;
7
- var _constants = require("./constants");
8
- // Copyright 2019-2022 @subwallet/extension-base authors & contributors
9
- // SPDX-License-Identifier: Apache-2.0
10
-
11
- const fetchRemarkEvent = async (chain, address) => {
12
- const params = {
13
- ..._constants.BASE_FETCH_ORDINAL_EVENT_DATA,
14
- address
15
- };
16
- const response = await fetch(_constants.GET_EVENT_LIST_API.replace('{{chain}}', chain), {
17
- method: 'POST',
18
- headers: {
19
- 'Content-Type': 'application/json'
20
- },
21
- body: JSON.stringify(params)
22
- });
23
- const data = await response.json();
24
- return data.data.events;
25
- };
26
- exports.fetchRemarkEvent = fetchRemarkEvent;
27
- const fetchExtrinsicParams = async (chain, extrinsicIndexes) => {
28
- const params = {
29
- extrinsic_index: extrinsicIndexes
30
- };
31
- const response = await fetch(_constants.GET_EXTRINSIC_PARAMS_API.replace('{{chain}}', chain), {
32
- method: 'POST',
33
- headers: {
34
- 'Content-Type': 'application/json'
35
- },
36
- body: JSON.stringify(params)
37
- });
38
- const data = await response.json();
39
- return data.data;
40
- };
41
- exports.fetchExtrinsicParams = fetchExtrinsicParams;
@@ -1,2 +0,0 @@
1
- export declare const fetchRemarkEvent: (chain: string, address: string) => Promise<import("@subwallet/extension-base/types").SubscanEventBaseItemData[]>;
2
- export declare const fetchExtrinsicParams: (chain: string, extrinsicIndexes: string[]) => Promise<import("@subwallet/extension-base/types").SubscanExtrinsicParam[]>;
@@ -1,33 +0,0 @@
1
- // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
- // SPDX-License-Identifier: Apache-2.0
3
-
4
- import { BASE_FETCH_ORDINAL_EVENT_DATA, GET_EVENT_LIST_API, GET_EXTRINSIC_PARAMS_API } from "./constants.js";
5
- export const fetchRemarkEvent = async (chain, address) => {
6
- const params = {
7
- ...BASE_FETCH_ORDINAL_EVENT_DATA,
8
- address
9
- };
10
- const response = await fetch(GET_EVENT_LIST_API.replace('{{chain}}', chain), {
11
- method: 'POST',
12
- headers: {
13
- 'Content-Type': 'application/json'
14
- },
15
- body: JSON.stringify(params)
16
- });
17
- const data = await response.json();
18
- return data.data.events;
19
- };
20
- export const fetchExtrinsicParams = async (chain, extrinsicIndexes) => {
21
- const params = {
22
- extrinsic_index: extrinsicIndexes
23
- };
24
- const response = await fetch(GET_EXTRINSIC_PARAMS_API.replace('{{chain}}', chain), {
25
- method: 'POST',
26
- headers: {
27
- 'Content-Type': 'application/json'
28
- },
29
- body: JSON.stringify(params)
30
- });
31
- const data = await response.json();
32
- return data.data;
33
- };