@subwallet/extension-base 1.1.43-0 → 1.1.44-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 +5 -4
- package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +63 -0
- package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting.js +21 -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/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 +5 -4
- package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.d.ts +4 -0
- package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +54 -0
- package/services/migration-service/scripts/databases/MigrateAssetSetting.js +21 -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/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
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export declare const GET_EVENT_LIST_API = "https://{{chain}}.api.subscan.io/api/v2/scan/events";
|
|
2
|
-
export declare const GET_EXTRINSIC_PARAMS_API = "https://{{chain}}.api.subscan.io/api/scan/extrinsic/params";
|
|
3
1
|
export declare const BASE_FETCH_ORDINAL_EVENT_DATA: {
|
|
4
2
|
event_id: string;
|
|
5
3
|
module: string;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
export const GET_EVENT_LIST_API = 'https://{{chain}}.api.subscan.io/api/v2/scan/events';
|
|
5
|
-
export const GET_EXTRINSIC_PARAMS_API = 'https://{{chain}}.api.subscan.io/api/scan/extrinsic/params';
|
|
6
4
|
export const BASE_FETCH_ORDINAL_EVENT_DATA = {
|
|
7
5
|
event_id: 'Remarked',
|
|
8
6
|
module: 'system',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseNftApi, HandleNftParams } from '
|
|
1
|
+
import { BaseNftApi, HandleNftParams } from '../nft';
|
|
2
2
|
export default class OrdinalNftApi extends BaseNftApi {
|
|
3
3
|
subscanChain: string;
|
|
4
4
|
constructor(addresses: string[], chain: string, subscanChain: string);
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import { ORDINAL_COLLECTION } from '@subwallet/extension-base/constants';
|
|
5
|
-
import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
6
|
-
import { fetchExtrinsicParams, fetchRemarkEvent } from '@subwallet/extension-base/koni/api/nft/ordinal_nft/utils';
|
|
7
5
|
import { state } from '@subwallet/extension-base/koni/background/handlers';
|
|
6
|
+
import { BaseNftApi } from "../nft.js";
|
|
8
7
|
const parseParamData = (param, event, chain, address) => {
|
|
9
8
|
const ordinalData = JSON.parse(param.value);
|
|
10
9
|
if ('p' in ordinalData) {
|
|
@@ -46,14 +45,10 @@ export default class OrdinalNftApi extends BaseNftApi {
|
|
|
46
45
|
this.subscanChain = subscanChain;
|
|
47
46
|
}
|
|
48
47
|
async handleNft(address, handleNftParams) {
|
|
49
|
-
const events = await state.subscanService.
|
|
50
|
-
return await fetchRemarkEvent(this.subscanChain, address);
|
|
51
|
-
});
|
|
48
|
+
const events = await state.subscanService.getAccountRemarkEvents(this.subscanChain, address);
|
|
52
49
|
if (events && events.length) {
|
|
53
50
|
const extrinsicIds = events.map(data => data.extrinsic_index);
|
|
54
|
-
const extrinsicParams = await state.subscanService.
|
|
55
|
-
return await fetchExtrinsicParams(this.subscanChain, extrinsicIds);
|
|
56
|
-
});
|
|
51
|
+
const extrinsicParams = await state.subscanService.getExtrinsicParams(this.subscanChain, extrinsicIds);
|
|
57
52
|
const items = [];
|
|
58
53
|
for (const data of extrinsicParams) {
|
|
59
54
|
const {
|
|
@@ -2,7 +2,7 @@ import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/
|
|
|
2
2
|
export declare function isRecipientSelf(currentAddress: string, recipientAddress: string): boolean;
|
|
3
3
|
export declare function acalaGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
4
4
|
export declare function rmrkGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
5
|
-
export declare function uniqueGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null
|
|
5
|
+
export declare function uniqueGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): Promise<import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null>;
|
|
6
6
|
export declare function statemineGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
7
7
|
export declare function statemintGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
8
|
-
export declare function getNftTransferExtrinsic(networkKey: string, substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null
|
|
8
|
+
export declare function getNftTransferExtrinsic(networkKey: string, substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): Promise<import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null>;
|
package/koni/api/nft/transfer.js
CHANGED
|
@@ -29,13 +29,24 @@ export function rmrkGetExtrinsic(substrateApi, senderAddress, recipientAddress,
|
|
|
29
29
|
return null;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
export function uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
32
|
+
export async function uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
33
33
|
try {
|
|
34
34
|
const itemId = params.itemId;
|
|
35
35
|
const collectionId = params.collectionId;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
|
|
37
|
+
// @ts-ignore
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
39
|
+
const collectionInfo = (await substrateApi.api.rpc.unique.collectionById(collectionId)).toHuman();
|
|
40
|
+
const isTransfersEnabled = collectionInfo.limits.transfersEnabled;
|
|
41
|
+
|
|
42
|
+
// isTransfersEnabled equal to null mean that it's set as default (enable transfer)
|
|
43
|
+
if (isTransfersEnabled || isTransfersEnabled === null) {
|
|
44
|
+
return substrateApi.api.tx.unique.transfer({
|
|
45
|
+
Substrate: recipientAddress
|
|
46
|
+
}, collectionId, itemId, 1);
|
|
47
|
+
} else {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
39
50
|
} catch (e) {
|
|
40
51
|
console.error(e);
|
|
41
52
|
return null;
|
|
@@ -61,7 +72,7 @@ export function statemintGetExtrinsic(substrateApi, senderAddress, recipientAddr
|
|
|
61
72
|
return null;
|
|
62
73
|
}
|
|
63
74
|
}
|
|
64
|
-
export function getNftTransferExtrinsic(networkKey, substrateApi, senderAddress, recipientAddress, params) {
|
|
75
|
+
export async function getNftTransferExtrinsic(networkKey, substrateApi, senderAddress, recipientAddress, params) {
|
|
65
76
|
switch (networkKey) {
|
|
66
77
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.acala:
|
|
67
78
|
return acalaGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
@@ -69,13 +80,12 @@ export function getNftTransferExtrinsic(networkKey, substrateApi, senderAddress,
|
|
|
69
80
|
return acalaGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
70
81
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.kusama:
|
|
71
82
|
return rmrkGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
// return uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
83
|
+
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.uniqueNft:
|
|
84
|
+
return await uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
85
|
+
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.quartz:
|
|
86
|
+
return await uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
87
|
+
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
|
|
88
|
+
return await uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
79
89
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemine:
|
|
80
90
|
return statemineGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
81
91
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemint:
|
|
@@ -18,18 +18,19 @@ export class UniqueNftApi extends BaseNftApi {
|
|
|
18
18
|
const attRecord = nft.attributes;
|
|
19
19
|
if (attRecord) {
|
|
20
20
|
for (const item in attRecord) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
const attName = attRecord[item].name._;
|
|
22
|
+
const attInfo = attRecord[item].value;
|
|
23
|
+
if (Array.isArray(attInfo)) {
|
|
24
|
+
const attList = [];
|
|
25
|
+
for (const trait of attInfo) {
|
|
26
|
+
attList.push(trait._);
|
|
26
27
|
}
|
|
27
|
-
propertiesMap
|
|
28
|
-
value:
|
|
28
|
+
propertiesMap[attName] = {
|
|
29
|
+
value: attList
|
|
29
30
|
};
|
|
30
31
|
} else {
|
|
31
|
-
propertiesMap[
|
|
32
|
-
value:
|
|
32
|
+
propertiesMap[attName] = {
|
|
33
|
+
value: attInfo._
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
36
|
}
|
|
@@ -2005,7 +2005,7 @@ export default class KoniExtension {
|
|
|
2005
2005
|
const isPSP34 = params === null || params === void 0 ? void 0 : params.isPsp34;
|
|
2006
2006
|
const networkKey = params === null || params === void 0 ? void 0 : params.networkKey;
|
|
2007
2007
|
const apiProps = this.#koniState.getSubstrateApi(networkKey);
|
|
2008
|
-
const extrinsic = !isPSP34 ? getNftTransferExtrinsic(networkKey, apiProps, senderAddress, recipientAddress, params || {}) : await getPSP34TransferExtrinsic(networkKey, apiProps, senderAddress, recipientAddress, params || {});
|
|
2008
|
+
const extrinsic = !isPSP34 ? await getNftTransferExtrinsic(networkKey, apiProps, senderAddress, recipientAddress, params || {}) : await getPSP34TransferExtrinsic(networkKey, apiProps, senderAddress, recipientAddress, params || {});
|
|
2009
2009
|
|
|
2010
2010
|
// this.addContact(recipientAddress);
|
|
2011
2011
|
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"./cjs/detectPackage.js"
|
|
18
18
|
],
|
|
19
19
|
"type": "module",
|
|
20
|
-
"version": "1.1.
|
|
20
|
+
"version": "1.1.44-0",
|
|
21
21
|
"main": "./cjs/index.js",
|
|
22
22
|
"module": "./index.js",
|
|
23
23
|
"types": "./index.d.ts",
|
|
@@ -234,11 +234,6 @@
|
|
|
234
234
|
"require": "./cjs/koni/api/nft/ordinal_nft/constants.js",
|
|
235
235
|
"default": "./koni/api/nft/ordinal_nft/constants.js"
|
|
236
236
|
},
|
|
237
|
-
"./koni/api/nft/ordinal_nft/utils": {
|
|
238
|
-
"types": "./koni/api/nft/ordinal_nft/utils.d.ts",
|
|
239
|
-
"require": "./cjs/koni/api/nft/ordinal_nft/utils.js",
|
|
240
|
-
"default": "./koni/api/nft/ordinal_nft/utils.js"
|
|
241
|
-
},
|
|
242
237
|
"./koni/api/nft/quartz_nft": {
|
|
243
238
|
"types": "./koni/api/nft/quartz_nft/index.d.ts",
|
|
244
239
|
"require": "./cjs/koni/api/nft/quartz_nft/index.js",
|
|
@@ -1030,6 +1025,11 @@
|
|
|
1030
1025
|
"require": "./cjs/services/migration-service/scripts/MigrateTransactionHistory.js",
|
|
1031
1026
|
"default": "./services/migration-service/scripts/MigrateTransactionHistory.js"
|
|
1032
1027
|
},
|
|
1028
|
+
"./services/migration-service/scripts/MigrateTransactionHistoryBySymbol": {
|
|
1029
|
+
"types": "./services/migration-service/scripts/MigrateTransactionHistoryBySymbol.d.ts",
|
|
1030
|
+
"require": "./cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js",
|
|
1031
|
+
"default": "./services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js"
|
|
1032
|
+
},
|
|
1033
1033
|
"./services/migration-service/scripts/MigrateWalletReference": {
|
|
1034
1034
|
"types": "./services/migration-service/scripts/MigrateWalletReference.d.ts",
|
|
1035
1035
|
"require": "./cjs/services/migration-service/scripts/MigrateWalletReference.js",
|
|
@@ -1791,11 +1791,11 @@
|
|
|
1791
1791
|
"@reduxjs/toolkit": "^1.9.1",
|
|
1792
1792
|
"@sora-substrate/type-definitions": "^1.17.7",
|
|
1793
1793
|
"@substrate/connect": "^0.7.26",
|
|
1794
|
-
"@subwallet/chain-list": "0.2.
|
|
1795
|
-
"@subwallet/extension-base": "^1.1.
|
|
1796
|
-
"@subwallet/extension-chains": "^1.1.
|
|
1797
|
-
"@subwallet/extension-dapp": "^1.1.
|
|
1798
|
-
"@subwallet/extension-inject": "^1.1.
|
|
1794
|
+
"@subwallet/chain-list": "0.2.45",
|
|
1795
|
+
"@subwallet/extension-base": "^1.1.44-0",
|
|
1796
|
+
"@subwallet/extension-chains": "^1.1.44-0",
|
|
1797
|
+
"@subwallet/extension-dapp": "^1.1.44-0",
|
|
1798
|
+
"@subwallet/extension-inject": "^1.1.44-0",
|
|
1799
1799
|
"@subwallet/keyring": "^0.1.3",
|
|
1800
1800
|
"@subwallet/ui-keyring": "^0.1.3",
|
|
1801
1801
|
"@walletconnect/sign-client": "^2.8.4",
|
package/packageInfo.js
CHANGED
|
@@ -7,5 +7,5 @@ export const packageInfo = {
|
|
|
7
7
|
name: '@subwallet/extension-base',
|
|
8
8
|
path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
|
|
9
9
|
type: 'esm',
|
|
10
|
-
version: '1.1.
|
|
10
|
+
version: '1.1.44-0'
|
|
11
11
|
};
|
|
@@ -29,7 +29,7 @@ export const _BALANCE_CHAIN_GROUP = {
|
|
|
29
29
|
genshiro: ['genshiro_testnet', 'genshiro'],
|
|
30
30
|
equilibrium_parachain: ['equilibrium_parachain'],
|
|
31
31
|
bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'pendulum', 'amplitude', 'continuum_network'],
|
|
32
|
-
statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network', 'rococo_assethub', 'liberlandTest', 'liberland', 'dentnet'],
|
|
32
|
+
statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network', 'rococo_assethub', 'liberlandTest', 'liberland', 'dentnet', 'pangolin'],
|
|
33
33
|
kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'],
|
|
34
34
|
// perhaps there are some runtime updates
|
|
35
35
|
centrifuge: ['centrifuge'],
|
|
@@ -201,7 +201,7 @@ export const _TRANSFER_CHAIN_GROUP = {
|
|
|
201
201
|
acala: ['karura', 'acala', 'acala_testnet'],
|
|
202
202
|
kintsugi: ['kintsugi', 'kintsugi_test', 'interlay', 'mangatax_para'],
|
|
203
203
|
genshiro: ['genshiro_testnet', 'genshiro', 'equilibrium_parachain'],
|
|
204
|
-
crab: ['crab', 'pangolin'],
|
|
204
|
+
// crab: ['crab', 'pangolin'],
|
|
205
205
|
bitcountry: ['pioneer', 'bitcountry', 'bifrost', 'bifrost_dot'],
|
|
206
206
|
statemine: ['statemint', 'statemine', 'darwinia2', 'astar', 'shiden', 'shibuya', 'parallel', 'liberland', 'liberlandTest', 'dentnet'],
|
|
207
207
|
riochain: ['riochain'],
|
|
@@ -209,7 +209,7 @@ export const _TRANSFER_CHAIN_GROUP = {
|
|
|
209
209
|
avail: ['kate', 'goldberg_testnet'],
|
|
210
210
|
pendulum: ['pendulum', 'amplitude', 'amplitude_test', 'hydradx_main'],
|
|
211
211
|
centrifuge: ['centrifuge'],
|
|
212
|
-
disable_transfer: ['invarch']
|
|
212
|
+
disable_transfer: ['invarch', 'crab', 'pangolin']
|
|
213
213
|
};
|
|
214
214
|
export const _BALANCE_PARSING_CHAIN_GROUP = {
|
|
215
215
|
bobabeam: ['bobabeam', 'bobabase']
|
|
@@ -237,7 +237,8 @@ export const _XCM_TYPE = {
|
|
|
237
237
|
export const _DEFAULT_ACTIVE_CHAINS = [..._DEFAULT_CHAINS, 'vara_network'];
|
|
238
238
|
export const EVM_PASS_CONNECT_STATUS = {
|
|
239
239
|
arbitrum_one: ['*'],
|
|
240
|
-
okxTest: ['*']
|
|
240
|
+
okxTest: ['*'],
|
|
241
|
+
astarZkEvm: ['*']
|
|
241
242
|
};
|
|
242
243
|
export const EVM_REFORMAT_DECIMALS = {
|
|
243
244
|
acala: ['acala_evm', 'karura_evm']
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
|
|
5
|
+
export default class MigrateTransactionHistoryBySymbol extends BaseMigrationJob {
|
|
6
|
+
async run() {
|
|
7
|
+
const state = this.state;
|
|
8
|
+
try {
|
|
9
|
+
const changeSlugsMap = {
|
|
10
|
+
'ethereum-ERC20-WFTM-0x4E15361FD6b4BB609Fa63C81A2be19d873717870': 'ethereum-ERC20-FTM-0x4E15361FD6b4BB609Fa63C81A2be19d873717870',
|
|
11
|
+
'moonbeam-ERC20-CSG-0x2Dfc76901bB2ac2A5fA5fc479590A490BBB10a5F': 'moonbeam-ERC20-CGS-0x2Dfc76901bB2ac2A5fA5fc479590A490BBB10a5F',
|
|
12
|
+
'astar-LOCAL-aUSD': 'astar-LOCAL-aSEED',
|
|
13
|
+
'astarEvm-ERC20-aUSD-0xfFFFFfFF00000000000000010000000000000001': 'astarEvm-ERC20-aSEED-0xfFFFFfFF00000000000000010000000000000001',
|
|
14
|
+
'moonriver-LOCAL-xcaUSD': 'moonriver-LOCAL-xcaSeed',
|
|
15
|
+
'moonriver-LOCAL-xckBTC': 'moonriver-LOCAL-xcKBTC',
|
|
16
|
+
'bifrost-LOCAL-aUSD': 'bifrost-LOCAL-KUSD',
|
|
17
|
+
'calamari-LOCAL-aUSD': 'calamari-LOCAL-AUSD',
|
|
18
|
+
'shiden-LOCAL-aUSD': 'shiden-LOCAL-aSEED',
|
|
19
|
+
'shidenEvm-ERC20-aUSD-0xfFFfFFfF00000000000000010000000000000000': 'shidenEvm-ERC20-aSEED-0xfFFfFFfF00000000000000010000000000000000',
|
|
20
|
+
'ethereum_goerli-NATIVE-GoerliETH': 'ethereum_goerli-NATIVE-ETH',
|
|
21
|
+
'binance_test-NATIVE-BNB': 'binance_test-NATIVE-tBNB',
|
|
22
|
+
'pangolin-LOCAL-CKTON': 'pangolin-LOCAL-PKTON',
|
|
23
|
+
'zeta_test-NATIVE-aZETA': 'zeta_test-NATIVE-ZETA',
|
|
24
|
+
'origintrail-NATIVE-OTP': 'origintrail-NATIVE-NEURO',
|
|
25
|
+
'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC'
|
|
26
|
+
};
|
|
27
|
+
const allTxs = [];
|
|
28
|
+
await Promise.all(Object.entries(changeSlugsMap).map(async ([oldSlug, newSlug], i) => {
|
|
29
|
+
const oldSlugSplit = oldSlug.split('-');
|
|
30
|
+
const oldChainSlug = oldSlugSplit[0];
|
|
31
|
+
const oldSymbolSlug = oldSlugSplit[2];
|
|
32
|
+
const newSlugSplit = newSlug.split('-');
|
|
33
|
+
const newSymbolSlug = newSlugSplit[2];
|
|
34
|
+
const filterTransactions = await state.dbService.stores.transaction.table.where({
|
|
35
|
+
chain: oldChainSlug
|
|
36
|
+
}).and(tx => {
|
|
37
|
+
var _tx$amount;
|
|
38
|
+
return ((_tx$amount = tx.amount) === null || _tx$amount === void 0 ? void 0 : _tx$amount.symbol) === oldSymbolSlug;
|
|
39
|
+
}).toArray();
|
|
40
|
+
if (filterTransactions.length > 0) {
|
|
41
|
+
for (const transaction of filterTransactions) {
|
|
42
|
+
if (transaction.amount && transaction.amount.symbol === oldSymbolSlug) {
|
|
43
|
+
transaction.amount.symbol = newSymbolSlug;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
allTxs.push(...filterTransactions);
|
|
48
|
+
}));
|
|
49
|
+
await state.dbService.stores.transaction.table.bulkPut(allTxs);
|
|
50
|
+
} catch (e) {
|
|
51
|
+
this.logger.error(e);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -5,27 +5,29 @@ import BaseMigrationJob from '@subwallet/extension-base/services/migration-servi
|
|
|
5
5
|
export default class MigrateAssetSetting extends BaseMigrationJob {
|
|
6
6
|
async run() {
|
|
7
7
|
try {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
const changeSlugsMap = {
|
|
9
|
+
'ethereum-ERC20-WFTM-0x4E15361FD6b4BB609Fa63C81A2be19d873717870': 'ethereum-ERC20-FTM-0x4E15361FD6b4BB609Fa63C81A2be19d873717870',
|
|
10
|
+
'moonbeam-ERC20-CSG-0x2Dfc76901bB2ac2A5fA5fc479590A490BBB10a5F': 'moonbeam-ERC20-CGS-0x2Dfc76901bB2ac2A5fA5fc479590A490BBB10a5F',
|
|
11
|
+
'astar-LOCAL-aUSD': 'astar-LOCAL-aSEED',
|
|
12
|
+
'astarEvm-ERC20-aUSD-0xfFFFFfFF00000000000000010000000000000001': 'astarEvm-ERC20-aSEED-0xfFFFFfFF00000000000000010000000000000001',
|
|
13
|
+
'moonriver-LOCAL-xcaUSD': 'moonriver-LOCAL-xcaSeed',
|
|
14
|
+
'moonriver-LOCAL-xckBTC': 'moonriver-LOCAL-xcKBTC',
|
|
15
|
+
'bifrost-LOCAL-aUSD': 'bifrost-LOCAL-KUSD',
|
|
16
|
+
'calamari-LOCAL-aUSD': 'calamari-LOCAL-AUSD',
|
|
17
|
+
'shiden-LOCAL-aUSD': 'shiden-LOCAL-aSEED',
|
|
18
|
+
'shidenEvm-ERC20-aUSD-0xfFFfFFfF00000000000000010000000000000000': 'shidenEvm-ERC20-aSEED-0xfFFfFFfF00000000000000010000000000000000',
|
|
19
|
+
'ethereum_goerli-NATIVE-GoerliETH': 'ethereum_goerli-NATIVE-ETH',
|
|
20
|
+
'binance_test-NATIVE-BNB': 'binance_test-NATIVE-tBNB',
|
|
21
|
+
'pangolin-LOCAL-CKTON': 'pangolin-LOCAL-PKTON',
|
|
22
|
+
'zeta_test-NATIVE-aZETA': 'zeta_test-NATIVE-ZETA',
|
|
23
|
+
'origintrail-NATIVE-OTP': 'origintrail-NATIVE-NEURO',
|
|
24
|
+
'moonbeam-LOCAL-xciBTC': 'moonbeam-LOCAL-xcIBTC'
|
|
25
|
+
};
|
|
22
26
|
const assetSetting = await this.state.chainService.getAssetSettings();
|
|
23
27
|
const migratedAssetSetting = {};
|
|
24
|
-
for (
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const isVisible = assetSetting[slug].visible;
|
|
28
|
-
const newSlug = newSlugs[i];
|
|
28
|
+
for (const [oldSlug, newSlug] of Object.entries(changeSlugsMap)) {
|
|
29
|
+
if (Object.keys(assetSetting).includes(oldSlug)) {
|
|
30
|
+
const isVisible = assetSetting[oldSlug].visible;
|
|
29
31
|
migratedAssetSetting[newSlug] = {
|
|
30
32
|
visible: isVisible
|
|
31
33
|
};
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import DeleteEarningData from '@subwallet/extension-base/services/migration-service/scripts/DeleteEarningData';
|
|
5
|
-
|
|
5
|
+
import MigrateTransactionHistoryBySymbol from '@subwallet/extension-base/services/migration-service/scripts/MigrateTransactionHistoryBySymbol';
|
|
6
|
+
import MigrateAssetSetting from "./databases/MigrateAssetSetting.js";
|
|
6
7
|
import MigrateEarningVersion from "./databases/MigrateEarningVersion.js";
|
|
7
8
|
import MigrateEthProvider from "./providers/MigrateEthProvider.js";
|
|
8
9
|
import MigratePioneerProvider from "./providers/MigratePioneerProvider.js";
|
|
@@ -44,7 +45,9 @@ export default {
|
|
|
44
45
|
'1.1.24-01': MigrateProvidersV1M1P24,
|
|
45
46
|
'1.1.26-01': MigratePolygonUSDCProvider,
|
|
46
47
|
'1.1.28-01': MigrateEarningVersion,
|
|
47
|
-
'1.1.41-01': DeleteChainStaking
|
|
48
|
-
|
|
48
|
+
'1.1.41-01': DeleteChainStaking,
|
|
49
|
+
'1.1.44-01': MigrateAssetSetting,
|
|
50
|
+
'1.1.44-02': MigrateTransactionHistoryBySymbol
|
|
51
|
+
// [`${EVERYTIME}-1.1.42-02`]: MigrateTransactionHistoryBySymbol
|
|
49
52
|
// [`${EVERYTIME}-1`]: AutoEnableChainsTokens
|
|
50
53
|
};
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { CrowdloanContributionsResponse, ExtrinsicItem, ExtrinsicsListResponse, IMultiChainBalance, RequestBlockRange, RewardHistoryListResponse, SubscanRequest, TransferItem, TransfersListResponse } from '@subwallet/extension-base/services/subscan-service/types';
|
|
2
|
+
import { SubscanEventBaseItemData, SubscanExtrinsicParam } from '@subwallet/extension-base/types';
|
|
2
3
|
export declare class SubscanService {
|
|
3
4
|
private subscanChainMap;
|
|
5
|
+
private callRate;
|
|
4
6
|
private limitRate;
|
|
5
7
|
private intervalCheck;
|
|
6
8
|
private maxRetry;
|
|
9
|
+
private rollbackRateTime;
|
|
10
|
+
private timeoutRollbackRate;
|
|
7
11
|
private requestMap;
|
|
8
12
|
private nextId;
|
|
9
13
|
private isRunning;
|
|
@@ -13,9 +17,10 @@ export declare class SubscanService {
|
|
|
13
17
|
intervalCheck?: number;
|
|
14
18
|
maxRetry?: number;
|
|
15
19
|
});
|
|
20
|
+
private reduceLimitRate;
|
|
16
21
|
private getApiUrl;
|
|
17
22
|
private postRequest;
|
|
18
|
-
addRequest<T>(run: SubscanRequest<T>['run']): Promise<T>;
|
|
23
|
+
addRequest<T>(run: SubscanRequest<T>['run'], ordinal: number): Promise<T>;
|
|
19
24
|
private process;
|
|
20
25
|
checkSupportedSubscanChain(chain: string): boolean;
|
|
21
26
|
setSubscanChainMap(subscanChainMap: Record<string, string>): void;
|
|
@@ -32,4 +37,6 @@ export declare class SubscanService {
|
|
|
32
37
|
record: number;
|
|
33
38
|
}): Promise<Record<string, TransferItem[]>>;
|
|
34
39
|
getRewardHistoryList(chain: string, address: string, page?: number): Promise<RewardHistoryListResponse>;
|
|
40
|
+
getAccountRemarkEvents(chain: string, address: string): Promise<SubscanEventBaseItemData[]>;
|
|
41
|
+
getExtrinsicParams(chain: string, extrinsicIndexes: string[], ordinal?: number): Promise<SubscanExtrinsicParam[]>;
|
|
35
42
|
}
|
|
@@ -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
|
}
|