@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.
- package/cjs/koni/api/dotsama/transfer.js +9 -9
- package/cjs/koni/api/nft/index.js +1 -1
- package/cjs/koni/api/nft/ordinal_nft/constants.js +1 -5
- package/cjs/koni/api/nft/ordinal_nft/index.js +3 -8
- package/cjs/koni/api/nft/transfer.js +22 -12
- package/cjs/koni/api/nft/unique_network_nft/index.js +10 -9
- package/cjs/koni/background/handlers/Extension.js +1 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/constants.js +9 -6
- package/cjs/services/chain-service/index.js +5 -5
- package/cjs/services/earning-service/constants/chains.js +1 -1
- package/cjs/services/earning-service/service.js +1 -1
- package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +67 -0
- package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting.js +22 -19
- package/cjs/services/migration-service/scripts/index.js +6 -4
- package/cjs/services/subscan-service/index.js +80 -18
- package/cjs/services/subscan-service/subscan-chain-map.js +3 -1
- package/cjs/services/transaction-service/utils.js +3 -0
- package/koni/api/dotsama/transfer.js +9 -9
- package/koni/api/nft/index.js +2 -2
- package/koni/api/nft/ordinal_nft/constants.d.ts +0 -2
- package/koni/api/nft/ordinal_nft/constants.js +0 -2
- package/koni/api/nft/ordinal_nft/index.d.ts +1 -1
- package/koni/api/nft/ordinal_nft/index.js +3 -8
- package/koni/api/nft/transfer.d.ts +2 -2
- package/koni/api/nft/transfer.js +22 -12
- package/koni/api/nft/unique_network_nft/index.js +10 -9
- package/koni/background/handlers/Extension.js +1 -1
- package/package.json +11 -11
- package/packageInfo.js +1 -1
- package/services/chain-service/constants.d.ts +0 -1
- package/services/chain-service/constants.js +9 -6
- package/services/chain-service/index.js +5 -5
- package/services/earning-service/constants/chains.js +1 -1
- package/services/earning-service/service.js +1 -1
- package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.d.ts +4 -0
- package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +58 -0
- package/services/migration-service/scripts/databases/MigrateAssetSetting.js +22 -19
- package/services/migration-service/scripts/index.js +6 -3
- package/services/subscan-service/index.d.ts +8 -1
- package/services/subscan-service/index.js +79 -18
- package/services/subscan-service/subscan-chain-map.js +3 -1
- package/services/subscan-service/types.d.ts +7 -0
- package/services/transaction-service/utils.js +3 -0
- package/cjs/koni/api/nft/ordinal_nft/utils.js +0 -41
- package/koni/api/nft/ordinal_nft/utils.d.ts +0 -2
- 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
|
-
|
|
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.
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
|
|
163
|
-
|
|
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 +=
|
|
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
|
-
};
|