@subwallet/extension-base 1.1.55-0 → 1.1.56-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 (30) hide show
  1. package/background/KoniTypes.d.ts +9 -1
  2. package/background/KoniTypes.js +5 -0
  3. package/cjs/background/KoniTypes.js +7 -1
  4. package/cjs/koni/api/nft/{statemint_nft → assethub_nft}/index.js +5 -3
  5. package/cjs/koni/api/nft/{statemine_nft → assethub_unique}/index.js +5 -3
  6. package/cjs/koni/api/nft/index.js +13 -13
  7. package/cjs/koni/api/nft/nft.js +1 -1
  8. package/cjs/koni/api/nft/transfer.js +11 -15
  9. package/cjs/packageInfo.js +1 -1
  10. package/cjs/services/chain-service/constants.js +17 -3
  11. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +7 -9
  12. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +11 -8
  13. package/cjs/services/earning-service/handlers/nomination-pool/index.js +19 -5
  14. package/cjs/services/earning-service/service.js +0 -1
  15. package/koni/api/nft/{statemint_nft → assethub_nft}/index.d.ts +1 -1
  16. package/koni/api/nft/{statemint_nft → assethub_nft}/index.js +4 -2
  17. package/koni/api/nft/{statemine_nft → assethub_unique}/index.d.ts +1 -1
  18. package/koni/api/nft/{statemine_nft → assethub_unique}/index.js +4 -2
  19. package/koni/api/nft/index.js +13 -13
  20. package/koni/api/nft/nft.js +1 -1
  21. package/koni/api/nft/transfer.d.ts +1 -2
  22. package/koni/api/nft/transfer.js +10 -13
  23. package/package.json +26 -26
  24. package/packageInfo.js +1 -1
  25. package/services/chain-service/constants.js +17 -3
  26. package/services/earning-service/handlers/native-staking/amplitude.js +7 -9
  27. package/services/earning-service/handlers/native-staking/para-chain.js +12 -9
  28. package/services/earning-service/handlers/nomination-pool/index.js +19 -5
  29. package/services/earning-service/service.js +0 -1
  30. package/types/yield/info/pallet.d.ts +4 -0
@@ -159,7 +159,7 @@ export declare enum CrowdloanParaState {
159
159
  COMPLETED = "completed",
160
160
  FAILED = "failed"
161
161
  }
162
- export interface NftItem {
162
+ export interface NftItem extends NftItemExtraInfo {
163
163
  id: string;
164
164
  chain: string;
165
165
  collectionId: string;
@@ -171,9 +171,16 @@ export interface NftItem {
171
171
  rarity?: string;
172
172
  description?: string;
173
173
  properties?: Record<any, any> | null;
174
+ }
175
+ interface NftItemExtraInfo {
174
176
  type?: _AssetType.ERC721 | _AssetType.PSP34 | RMRK_VER;
175
177
  rmrk_ver?: RMRK_VER;
176
178
  onChainOption?: any;
179
+ assetHubType?: AssetHubNftType;
180
+ }
181
+ export declare enum AssetHubNftType {
182
+ NFTS = "nfts",
183
+ UNIQUES = "uniques"
177
184
  }
178
185
  export interface NftCollection {
179
186
  collectionId: string;
@@ -1874,3 +1881,4 @@ export interface ApplicationMetadataType {
1874
1881
  }
1875
1882
  export declare type OSType = 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | 'Unknown';
1876
1883
  export declare const MobileOS: OSType[];
1884
+ export {};
@@ -38,6 +38,11 @@ export let CrowdloanParaState;
38
38
  CrowdloanParaState["COMPLETED"] = "completed";
39
39
  CrowdloanParaState["FAILED"] = "failed";
40
40
  })(CrowdloanParaState || (CrowdloanParaState = {}));
41
+ export let AssetHubNftType;
42
+ (function (AssetHubNftType) {
43
+ AssetHubNftType["NFTS"] = "nfts";
44
+ AssetHubNftType["UNIQUES"] = "uniques";
45
+ })(AssetHubNftType || (AssetHubNftType = {}));
41
46
  export let ContractType;
42
47
  (function (ContractType) {
43
48
  ContractType["wasm"] = "wasm";
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WalletUnlockType = exports.TransferTxErrorType = exports.TransactionDirection = exports.ThemeNames = exports.StakingType = exports.StakingTxErrorType = exports.RuntimeEnvironment = exports.RMRK_VER = exports.ProviderErrorType = exports.NotificationType = exports.NETWORK_STATUS = exports.NETWORK_ERROR = exports.MobileOS = exports.MantaPayEnableMessage = exports.ExtrinsicType = exports.ExtrinsicStatus = exports.ExternalRequestPromiseStatus = exports.EvmProviderErrorType = exports.CrowdloanParaState = exports.ContractType = exports.ChainType = exports.ChainEditStandard = exports.CampaignDataType = exports.BasicTxWarningCode = exports.BasicTxErrorType = exports.BalanceErrorType = exports.AccountExternalErrorCode = exports.APIItemState = void 0;
6
+ exports.WalletUnlockType = exports.TransferTxErrorType = exports.TransactionDirection = exports.ThemeNames = exports.StakingType = exports.StakingTxErrorType = exports.RuntimeEnvironment = exports.RMRK_VER = exports.ProviderErrorType = exports.NotificationType = exports.NETWORK_STATUS = exports.NETWORK_ERROR = exports.MobileOS = exports.MantaPayEnableMessage = exports.ExtrinsicType = exports.ExtrinsicStatus = exports.ExternalRequestPromiseStatus = exports.EvmProviderErrorType = exports.CrowdloanParaState = exports.ContractType = exports.ChainType = exports.ChainEditStandard = exports.CampaignDataType = exports.BasicTxWarningCode = exports.BasicTxErrorType = exports.BalanceErrorType = exports.AssetHubNftType = exports.AccountExternalErrorCode = exports.APIItemState = void 0;
7
7
  // Copyright 2019-2022 @polkadot/extension-koni authors & contributors
8
8
  // SPDX-License-Identifier: Apache-2.0
9
9
  let RuntimeEnvironment;
@@ -47,6 +47,12 @@ exports.CrowdloanParaState = CrowdloanParaState;
47
47
  CrowdloanParaState["COMPLETED"] = "completed";
48
48
  CrowdloanParaState["FAILED"] = "failed";
49
49
  })(CrowdloanParaState || (exports.CrowdloanParaState = CrowdloanParaState = {}));
50
+ let AssetHubNftType;
51
+ exports.AssetHubNftType = AssetHubNftType;
52
+ (function (AssetHubNftType) {
53
+ AssetHubNftType["NFTS"] = "nfts";
54
+ AssetHubNftType["UNIQUES"] = "uniques";
55
+ })(AssetHubNftType || (exports.AssetHubNftType = AssetHubNftType = {}));
50
56
  let ContractType;
51
57
  exports.ContractType = ContractType;
52
58
  (function (ContractType) {
@@ -5,13 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
9
  var _nft = require("@subwallet/extension-base/koni/api/nft/nft");
9
10
  var _utils = require("@subwallet/extension-base/utils");
10
11
  var _crossFetch = _interopRequireDefault(require("cross-fetch"));
11
12
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
12
13
  // SPDX-License-Identifier: Apache-2.0
13
14
 
14
- class StatemintNftApi extends _nft.BaseNftApi {
15
+ class AssetHubNftsPalletApi extends _nft.BaseNftApi {
15
16
  // eslint-disable-next-line no-useless-constructor
16
17
  constructor(api, addresses, chain) {
17
18
  super(chain, api, addresses);
@@ -112,7 +113,8 @@ class StatemintNftApi extends _nft.BaseNftApi {
112
113
  image: tokenInfo && tokenInfo.image ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image) : undefined,
113
114
  collectionId: this.parseTokenId(parsedClassId),
114
115
  chain: this.chain,
115
- owner: address
116
+ owner: address,
117
+ assetHubType: _KoniTypes.AssetHubNftType.NFTS
116
118
  };
117
119
  params.updateItem(this.chain, parsedNft, address);
118
120
  const parsedCollection = {
@@ -140,4 +142,4 @@ class StatemintNftApi extends _nft.BaseNftApi {
140
142
  return 1;
141
143
  }
142
144
  }
143
- exports.default = StatemintNftApi;
145
+ exports.default = AssetHubNftsPalletApi;
@@ -5,13 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
9
  var _nft = require("@subwallet/extension-base/koni/api/nft/nft");
9
10
  var _utils = require("@subwallet/extension-base/utils");
10
11
  var _crossFetch = _interopRequireDefault(require("cross-fetch"));
11
12
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
12
13
  // SPDX-License-Identifier: Apache-2.0
13
14
 
14
- class StatemineNftApi extends _nft.BaseNftApi {
15
+ class AssetHubUniquesPalletApi extends _nft.BaseNftApi {
15
16
  // eslint-disable-next-line no-useless-constructor
16
17
  constructor(api, addresses, chain) {
17
18
  super(chain, api, addresses);
@@ -112,7 +113,8 @@ class StatemineNftApi extends _nft.BaseNftApi {
112
113
  image: tokenInfo && tokenInfo.image ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image) : undefined,
113
114
  collectionId: this.parseTokenId(parsedClassId),
114
115
  chain: this.chain,
115
- owner: address
116
+ owner: address,
117
+ assetHubType: _KoniTypes.AssetHubNftType.UNIQUES
116
118
  };
117
119
  params.updateItem(this.chain, parsedNft, address);
118
120
  const parsedCollection = {
@@ -140,4 +142,4 @@ class StatemineNftApi extends _nft.BaseNftApi {
140
142
  return 1;
141
143
  }
142
144
  }
143
- exports.default = StatemineNftApi;
145
+ exports.default = AssetHubUniquesPalletApi;
@@ -6,19 +6,19 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.NftHandler = void 0;
8
8
  var _acala_nft = require("@subwallet/extension-base/koni/api/nft/acala_nft");
9
+ var _assethub_unique = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/assethub_unique"));
9
10
  var _bit = require("@subwallet/extension-base/koni/api/nft/bit.country");
10
11
  var _evm_nft = require("@subwallet/extension-base/koni/api/nft/evm_nft");
11
12
  var _karura_nft = require("@subwallet/extension-base/koni/api/nft/karura_nft");
12
13
  var _ordinal_nft = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/ordinal_nft"));
13
14
  var _rmrk_nft = require("@subwallet/extension-base/koni/api/nft/rmrk_nft");
14
- var _statemine_nft = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/statemine_nft"));
15
15
  var _unique_network_nft = require("@subwallet/extension-base/koni/api/nft/unique_network_nft");
16
16
  var _vara_nft = require("@subwallet/extension-base/koni/api/nft/vara_nft");
17
17
  var _wasm_nft = require("@subwallet/extension-base/koni/api/nft/wasm_nft");
18
18
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
19
19
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
20
20
  var _utils2 = require("@subwallet/extension-base/utils");
21
- var _statemint_nft = _interopRequireDefault(require("./statemint_nft"));
21
+ var _assethub_nft = _interopRequireDefault(require("./assethub_nft"));
22
22
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
23
23
  // SPDX-License-Identifier: Apache-2.0
24
24
 
@@ -27,21 +27,21 @@ var _statemint_nft = _interopRequireDefault(require("./statemint_nft"));
27
27
  function createSubstrateNftApi(chain, substrateApi, addresses) {
28
28
  const [substrateAddresses] = (0, _utils2.categoryAddresses)(addresses);
29
29
  if (_constants._NFT_CHAIN_GROUP.acala.includes(chain)) {
30
- return new _acala_nft.AcalaNftApi(substrateApi, substrateAddresses, chain);
30
+ return [new _acala_nft.AcalaNftApi(substrateApi, substrateAddresses, chain)];
31
31
  } else if (_constants._NFT_CHAIN_GROUP.karura.includes(chain)) {
32
- return new _karura_nft.KaruraNftApi(substrateApi, substrateAddresses, chain);
32
+ return [new _karura_nft.KaruraNftApi(substrateApi, substrateAddresses, chain)];
33
33
  } else if (_constants._NFT_CHAIN_GROUP.rmrk.includes(chain)) {
34
- return new _rmrk_nft.RmrkNftApi(substrateAddresses, chain);
34
+ return [new _rmrk_nft.RmrkNftApi(substrateAddresses, chain)];
35
35
  } else if (_constants._NFT_CHAIN_GROUP.statemine.includes(chain)) {
36
- return new _statemine_nft.default(substrateApi, substrateAddresses, chain);
36
+ return [new _assethub_unique.default(substrateApi, substrateAddresses, chain), new _assethub_nft.default(substrateApi, substrateAddresses, chain)];
37
37
  } else if (_constants._NFT_CHAIN_GROUP.statemint.includes(chain)) {
38
- return new _statemint_nft.default(substrateApi, substrateAddresses, chain);
38
+ return [new _assethub_unique.default(substrateApi, substrateAddresses, chain), new _assethub_nft.default(substrateApi, substrateAddresses, chain)];
39
39
  } else if (_constants._NFT_CHAIN_GROUP.unique_network.includes(chain)) {
40
- return new _unique_network_nft.UniqueNftApi(chain, substrateAddresses);
40
+ return [new _unique_network_nft.UniqueNftApi(chain, substrateAddresses)];
41
41
  } else if (_constants._NFT_CHAIN_GROUP.bitcountry.includes(chain)) {
42
- return new _bit.BitCountryNftApi(substrateApi, substrateAddresses, chain);
42
+ return [new _bit.BitCountryNftApi(substrateApi, substrateAddresses, chain)];
43
43
  } else if (_constants._NFT_CHAIN_GROUP.vara.includes(chain)) {
44
- return new _vara_nft.VaraNftApi(chain, substrateAddresses);
44
+ return [new _vara_nft.VaraNftApi(chain, substrateAddresses)];
45
45
  }
46
46
  return null;
47
47
  }
@@ -114,9 +114,9 @@ class NftHandler {
114
114
  let [chain, chainInfo] = _ref;
115
115
  if ((0, _utils._isChainSupportNativeNft)(chainInfo)) {
116
116
  if (this.substrateApiMap[chain]) {
117
- const handler = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
118
- if (handler) {
119
- this.handlers.push(handler);
117
+ const handlers = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
118
+ if (handlers && !!handlers.length) {
119
+ this.handlers.push(...handlers);
120
120
  }
121
121
  }
122
122
  }
@@ -65,7 +65,7 @@ class BaseNftApi {
65
65
  }
66
66
  parseTokenId(tokenId) {
67
67
  if (tokenId.includes(',')) {
68
- return tokenId.replace(',', '');
68
+ return tokenId.replaceAll(',', '');
69
69
  }
70
70
  return tokenId;
71
71
  }
@@ -4,12 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.acalaGetExtrinsic = acalaGetExtrinsic;
7
+ exports.assetHubGetExtrinsic = assetHubGetExtrinsic;
7
8
  exports.getNftTransferExtrinsic = getNftTransferExtrinsic;
8
9
  exports.isRecipientSelf = isRecipientSelf;
9
10
  exports.rmrkGetExtrinsic = rmrkGetExtrinsic;
10
- exports.statemineGetExtrinsic = statemineGetExtrinsic;
11
- exports.statemintGetExtrinsic = statemintGetExtrinsic;
12
11
  exports.uniqueGetExtrinsic = uniqueGetExtrinsic;
12
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
13
13
  var _config = require("@subwallet/extension-base/koni/api/nft/config");
14
14
  var _utils = require("@subwallet/extension-base/utils");
15
15
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
@@ -64,21 +64,17 @@ async function uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress,
64
64
  return null;
65
65
  }
66
66
  }
67
- function statemineGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
67
+ function assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
68
68
  try {
69
69
  const itemId = params.itemId;
70
70
  const collectionId = params.collectionId;
71
- return substrateApi.api.tx.uniques.transfer(collectionId, itemId, recipientAddress);
72
- } catch (e) {
73
- console.error(e);
71
+ const nftType = params.assetHubType;
72
+ if (nftType === _KoniTypes.AssetHubNftType.NFTS) {
73
+ return substrateApi.api.tx.nfts.transfer(collectionId, itemId, recipientAddress);
74
+ } else if (nftType === _KoniTypes.AssetHubNftType.UNIQUES) {
75
+ return substrateApi.api.tx.uniques.transfer(collectionId, itemId, recipientAddress);
76
+ }
74
77
  return null;
75
- }
76
- }
77
- function statemintGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
78
- try {
79
- const itemId = params.itemId;
80
- const collectionId = params.collectionId;
81
- return substrateApi.api.tx.nfts.transfer(collectionId, itemId, recipientAddress);
82
78
  } catch (e) {
83
79
  console.error(e);
84
80
  return null;
@@ -99,9 +95,9 @@ async function getNftTransferExtrinsic(networkKey, substrateApi, senderAddress,
99
95
  case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
100
96
  return await uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
101
97
  case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemine:
102
- return statemineGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
98
+ return assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
103
99
  case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemint:
104
- return statemintGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
100
+ return assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
105
101
  case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.bitcountry:
106
102
  return acalaGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
107
103
  case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.pioneer:
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.1.55-0'
16
+ version: '1.1.56-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -84,7 +84,8 @@ const _STAKING_ERA_LENGTH_MAP = {
84
84
  shiden: 24,
85
85
  shibuya: 24,
86
86
  bifrost_testnet: 0.5,
87
- bifrost: 2,
87
+ bifrost: 13 * 600 / 3600,
88
+ // real blocktime of bifros ksm = 13s
88
89
  bifrost_dot: 24,
89
90
  ternoa: 24,
90
91
  calamari: 6,
@@ -101,7 +102,8 @@ const _STAKING_ERA_LENGTH_MAP = {
101
102
  goldberg_testnet: 24,
102
103
  manta_network: 6,
103
104
  krest_network: 4,
104
- polimec: 6
105
+ polimec: 6,
106
+ enjin_relaychain: 24
105
107
  };
106
108
  exports._STAKING_ERA_LENGTH_MAP = _STAKING_ERA_LENGTH_MAP;
107
109
  const _EXPECTED_BLOCK_TIME = {
@@ -119,7 +121,19 @@ const _EXPECTED_BLOCK_TIME = {
119
121
  creditcoin: 12,
120
122
  vara_network: 3,
121
123
  goldberg_testnet: 20,
122
- polimec: 12
124
+ polimec: 12,
125
+ bifrost: 13,
126
+ // expect 12 but actual 13
127
+ moonbeam: 12,
128
+ moonriver: 12,
129
+ moonbase: 6,
130
+ turing: 12,
131
+ turingStaging: 12,
132
+ bifrost_testnet: 3,
133
+ calamari: 12,
134
+ calamari_test: 12,
135
+ manta_network: 12,
136
+ enjin_relaychain: 6
123
137
  };
124
138
  exports._EXPECTED_BLOCK_TIME = _EXPECTED_BLOCK_TIME;
125
139
  const _PARACHAIN_INFLATION_DISTRIBUTION = {
@@ -137,27 +137,25 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
137
137
  });
138
138
  }
139
139
  if (hasUnstakingInfo) {
140
- const _currentBlockInfo = await substrateApi.api.rpc.chain.getHeader();
141
- const currentBlockInfo = _currentBlockInfo.toPrimitive();
142
- const currentBlockNumber = currentBlockInfo.number;
140
+ const [_currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
141
+ const currentBlock = _currentBlock.toPrimitive();
142
+ const currentTimestamp = _currentTimestamp.toPrimitive();
143
143
  const _blockPerRound = substrateApi.api.consts.parachainStaking.defaultBlocksPerRound.toString();
144
144
  const blockPerRound = parseFloat(_blockPerRound);
145
145
  for (const [unstakingBlock, unstakingAmount] of Object.entries(unstakingInfo)) {
146
146
  const blockDuration = (_constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _constants._STAKING_ERA_LENGTH_MAP.default) / blockPerRound; // in hours
147
147
 
148
- const isClaimable = parseInt(unstakingBlock) - currentBlockNumber < 0;
149
- const remainingBlock = parseInt(unstakingBlock) - currentBlockNumber;
148
+ const isClaimable = parseInt(unstakingBlock) - currentBlock <= 0;
149
+ const remainingBlock = parseInt(unstakingBlock) - currentBlock;
150
150
  const waitingTime = remainingBlock * blockDuration;
151
- // const currentTimestampMs = Date.now();
152
- // const targetTimestampMs = currentTimestampMs + waitingTime * 60 * 60 * 1000;
153
-
151
+ const targetTimestampMs = remainingBlock * blockDuration * 3600 * 1000 + currentTimestamp;
154
152
  unstakingBalance = unstakingAmount.toString();
155
153
  unstakingList.push({
156
154
  chain: chainInfo.slug,
157
155
  status: isClaimable ? _types.UnstakingStatus.CLAIMABLE : _types.UnstakingStatus.UNLOCKING,
158
156
  claimable: unstakingAmount.toString(),
159
157
  waitingTime,
160
- // targetTimestampMs: targetTimestampMs,
158
+ targetTimestampMs: targetTimestampMs,
161
159
  validatorAddress: undefined
162
160
  });
163
161
  }
@@ -144,7 +144,9 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
144
144
  const roundInfo = _roundInfo.toPrimitive();
145
145
  const currentRound = roundInfo.current;
146
146
  await Promise.all(delegatorState.delegations.map(async delegation => {
147
- const [_delegationScheduledRequests, [identity], _collatorInfo] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), (0, _utils2.parseIdentity)(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner)]);
147
+ const [_delegationScheduledRequests, [identity], _collatorInfo, _currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), (0, _utils2.parseIdentity)(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner), substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
148
+ const currentBlock = _currentBlock.toPrimitive();
149
+ const currentTimestamp = _currentTimestamp.toPrimitive();
148
150
  const collatorInfo = _collatorInfo.toPrimitive();
149
151
  const minDelegation = collatorInfo === null || collatorInfo === void 0 ? void 0 : collatorInfo.lowestTopDelegationAmount.toString();
150
152
  const delegationScheduledRequests = _delegationScheduledRequests.toPrimitive();
@@ -156,22 +158,23 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
156
158
  for (const scheduledRequest of delegationScheduledRequests) {
157
159
  if ((0, _utils3.reformatAddress)(scheduledRequest.delegator, 0) === (0, _utils3.reformatAddress)(address, 0)) {
158
160
  // add network prefix
159
- const isClaimable = scheduledRequest.whenExecutable - currentRound <= 0;
160
- const remainingEra = scheduledRequest.whenExecutable - currentRound;
161
+ const isClaimable = scheduledRequest.whenExecutable - parseInt(currentRound) <= 0;
162
+ const remainingEra = scheduledRequest.whenExecutable - parseInt(currentRound);
161
163
  const waitingTime = remainingEra * _constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug];
162
164
  const claimable = Object.values(scheduledRequest.action)[0];
163
- // const currentTimestampMs = Date.now();
164
- // const targetTimestampMs = currentTimestampMs + waitingTime * 60 * 60 * 1000;
165
165
 
166
+ // noted: target timestamp in parachainStaking easily volatile if block time volatile
167
+ const targetBlock = remainingEra * parseInt(roundInfo.length) + parseInt(roundInfo.first);
168
+ const remainingBlock = targetBlock - currentBlock;
169
+ const targetTimestampMs = remainingBlock * _constants._EXPECTED_BLOCK_TIME[chainInfo.slug] * 1000 + currentTimestamp;
166
170
  unstakingMap[delegation.owner] = {
167
171
  chain: chainInfo.slug,
168
172
  status: isClaimable ? _types.UnstakingStatus.CLAIMABLE : _types.UnstakingStatus.UNLOCKING,
169
173
  validatorAddress: delegation.owner,
170
174
  claimable: claimable.toString(),
171
- waitingTime
172
- // targetTimestampMs: targetTimestampMs
175
+ waitingTime,
176
+ targetTimestampMs: targetTimestampMs
173
177
  };
174
-
175
178
  hasUnstaking = true;
176
179
  break; // only handle 1 scheduledRequest per collator
177
180
  }
@@ -166,11 +166,25 @@ class NominationPoolHandler extends _base.default {
166
166
  if (nominations) {
167
167
  const validatorList = nominations.targets;
168
168
  await Promise.all(validatorList.map(async validatorAddress => {
169
- const _eraStaker = await substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress);
170
- const eraStaker = _eraStaker.toPrimitive();
171
- const sortedNominators = eraStaker.others.sort((a, b) => {
172
- return new _bignumber.default(b.value).minus(a.value).toNumber();
173
- });
169
+ let sortedNominators = [];
170
+ if (['kusama'].includes(this.chain)) {
171
+ // todo: hot fix for kusama first, we'll review all relaychains later
172
+ const _eraStaker = await substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress);
173
+ const eraStakerOtherList = [];
174
+ _eraStaker.forEach(paged => {
175
+ const pagedExposure = paged[1].toPrimitive();
176
+ eraStakerOtherList.push(...pagedExposure.others);
177
+ });
178
+ sortedNominators = eraStakerOtherList.sort((a, b) => {
179
+ return new _bignumber.default(b.value).minus(a.value).toNumber();
180
+ });
181
+ } else {
182
+ const _eraStaker = await substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress);
183
+ const eraStaker = _eraStaker.toPrimitive();
184
+ sortedNominators = eraStaker.others.sort((a, b) => {
185
+ return new _bignumber.default(b.value).minus(a.value).toNumber();
186
+ });
187
+ }
174
188
  const topNominators = sortedNominators.map(nominator => {
175
189
  return nominator.who;
176
190
  }).slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator);
@@ -404,7 +404,6 @@ class EarningService {
404
404
  const removeKeys = [];
405
405
  chains && chains.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(_ref => {
406
406
  let [key, value] = _ref;
407
- console.log('removeYieldPositions', key, value.chain, chains.indexOf(value.chain) > -1);
408
407
  if (chains.indexOf(value.chain) > -1 && !removeKeys.includes(key)) {
409
408
  removeKeys.push(key);
410
409
  }
@@ -1,6 +1,6 @@
1
1
  import { BaseNftApi, HandleNftParams } from '@subwallet/extension-base/koni/api/nft/nft';
2
2
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
3
- export default class StatemintNftApi extends BaseNftApi {
3
+ export default class AssetHubNftsPalletApi extends BaseNftApi {
4
4
  constructor(api: _SubstrateApi | null, addresses: string[], chain: string);
5
5
  private getMetadata;
6
6
  /**
@@ -1,10 +1,11 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { AssetHubNftType } from '@subwallet/extension-base/background/KoniTypes';
4
5
  import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
5
6
  import { isUrl } from '@subwallet/extension-base/utils';
6
7
  import fetch from 'cross-fetch';
7
- export default class StatemintNftApi extends BaseNftApi {
8
+ export default class AssetHubNftsPalletApi extends BaseNftApi {
8
9
  // eslint-disable-next-line no-useless-constructor
9
10
  constructor(api, addresses, chain) {
10
11
  super(chain, api, addresses);
@@ -105,7 +106,8 @@ export default class StatemintNftApi extends BaseNftApi {
105
106
  image: tokenInfo && tokenInfo.image ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image) : undefined,
106
107
  collectionId: this.parseTokenId(parsedClassId),
107
108
  chain: this.chain,
108
- owner: address
109
+ owner: address,
110
+ assetHubType: AssetHubNftType.NFTS
109
111
  };
110
112
  params.updateItem(this.chain, parsedNft, address);
111
113
  const parsedCollection = {
@@ -1,6 +1,6 @@
1
1
  import { BaseNftApi, HandleNftParams } from '@subwallet/extension-base/koni/api/nft/nft';
2
2
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
3
- export default class StatemineNftApi extends BaseNftApi {
3
+ export default class AssetHubUniquesPalletApi extends BaseNftApi {
4
4
  constructor(api: _SubstrateApi | null, addresses: string[], chain: string);
5
5
  private getMetadata;
6
6
  /**
@@ -1,10 +1,11 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { AssetHubNftType } from '@subwallet/extension-base/background/KoniTypes';
4
5
  import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
5
6
  import { isUrl } from '@subwallet/extension-base/utils';
6
7
  import fetch from 'cross-fetch';
7
- export default class StatemineNftApi extends BaseNftApi {
8
+ export default class AssetHubUniquesPalletApi extends BaseNftApi {
8
9
  // eslint-disable-next-line no-useless-constructor
9
10
  constructor(api, addresses, chain) {
10
11
  super(chain, api, addresses);
@@ -105,7 +106,8 @@ export default class StatemineNftApi extends BaseNftApi {
105
106
  image: tokenInfo && tokenInfo.image ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image) : undefined,
106
107
  collectionId: this.parseTokenId(parsedClassId),
107
108
  chain: this.chain,
108
- owner: address
109
+ owner: address,
110
+ assetHubType: AssetHubNftType.UNIQUES
109
111
  };
110
112
  params.updateItem(this.chain, parsedNft, address);
111
113
  const parsedCollection = {
@@ -2,12 +2,12 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { AcalaNftApi } from '@subwallet/extension-base/koni/api/nft/acala_nft';
5
+ import AssetHubUniquesPalletApi from '@subwallet/extension-base/koni/api/nft/assethub_unique';
5
6
  import { BitCountryNftApi } from '@subwallet/extension-base/koni/api/nft/bit.country';
6
7
  import { EvmNftApi } from '@subwallet/extension-base/koni/api/nft/evm_nft';
7
8
  import { KaruraNftApi } from '@subwallet/extension-base/koni/api/nft/karura_nft';
8
9
  import OrdinalNftApi from '@subwallet/extension-base/koni/api/nft/ordinal_nft';
9
10
  import { RmrkNftApi } from '@subwallet/extension-base/koni/api/nft/rmrk_nft';
10
- import StatemineNftApi from '@subwallet/extension-base/koni/api/nft/statemine_nft';
11
11
  import { UniqueNftApi } from '@subwallet/extension-base/koni/api/nft/unique_network_nft';
12
12
  // import UniqueNftApi from '@subwallet/extension-base/koni/api/nft/unique_nft';
13
13
  import { VaraNftApi } from '@subwallet/extension-base/koni/api/nft/vara_nft';
@@ -15,25 +15,25 @@ import { WasmNftApi } from '@subwallet/extension-base/koni/api/nft/wasm_nft';
15
15
  import { _NFT_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
16
16
  import { _isChainSupportEvmNft, _isChainSupportNativeNft, _isChainSupportWasmNft, _isSupportOrdinal } from '@subwallet/extension-base/services/chain-service/utils';
17
17
  import { categoryAddresses, targetIsWeb } from '@subwallet/extension-base/utils';
18
- import StatemintNftApi from "./statemint_nft/index.js";
18
+ import AssetHubNftsPalletApi from "./assethub_nft/index.js";
19
19
  function createSubstrateNftApi(chain, substrateApi, addresses) {
20
20
  const [substrateAddresses] = categoryAddresses(addresses);
21
21
  if (_NFT_CHAIN_GROUP.acala.includes(chain)) {
22
- return new AcalaNftApi(substrateApi, substrateAddresses, chain);
22
+ return [new AcalaNftApi(substrateApi, substrateAddresses, chain)];
23
23
  } else if (_NFT_CHAIN_GROUP.karura.includes(chain)) {
24
- return new KaruraNftApi(substrateApi, substrateAddresses, chain);
24
+ return [new KaruraNftApi(substrateApi, substrateAddresses, chain)];
25
25
  } else if (_NFT_CHAIN_GROUP.rmrk.includes(chain)) {
26
- return new RmrkNftApi(substrateAddresses, chain);
26
+ return [new RmrkNftApi(substrateAddresses, chain)];
27
27
  } else if (_NFT_CHAIN_GROUP.statemine.includes(chain)) {
28
- return new StatemineNftApi(substrateApi, substrateAddresses, chain);
28
+ return [new AssetHubUniquesPalletApi(substrateApi, substrateAddresses, chain), new AssetHubNftsPalletApi(substrateApi, substrateAddresses, chain)];
29
29
  } else if (_NFT_CHAIN_GROUP.statemint.includes(chain)) {
30
- return new StatemintNftApi(substrateApi, substrateAddresses, chain);
30
+ return [new AssetHubUniquesPalletApi(substrateApi, substrateAddresses, chain), new AssetHubNftsPalletApi(substrateApi, substrateAddresses, chain)];
31
31
  } else if (_NFT_CHAIN_GROUP.unique_network.includes(chain)) {
32
- return new UniqueNftApi(chain, substrateAddresses);
32
+ return [new UniqueNftApi(chain, substrateAddresses)];
33
33
  } else if (_NFT_CHAIN_GROUP.bitcountry.includes(chain)) {
34
- return new BitCountryNftApi(substrateApi, substrateAddresses, chain);
34
+ return [new BitCountryNftApi(substrateApi, substrateAddresses, chain)];
35
35
  } else if (_NFT_CHAIN_GROUP.vara.includes(chain)) {
36
- return new VaraNftApi(chain, substrateAddresses);
36
+ return [new VaraNftApi(chain, substrateAddresses)];
37
37
  }
38
38
  return null;
39
39
  }
@@ -105,9 +105,9 @@ export class NftHandler {
105
105
  Object.entries(this.chainInfoMap).forEach(([chain, chainInfo]) => {
106
106
  if (_isChainSupportNativeNft(chainInfo)) {
107
107
  if (this.substrateApiMap[chain]) {
108
- const handler = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
109
- if (handler) {
110
- this.handlers.push(handler);
108
+ const handlers = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
109
+ if (handlers && !!handlers.length) {
110
+ this.handlers.push(...handlers);
111
111
  }
112
112
  }
113
113
  }
@@ -59,7 +59,7 @@ export class BaseNftApi {
59
59
  }
60
60
  parseTokenId(tokenId) {
61
61
  if (tokenId.includes(',')) {
62
- return tokenId.replace(',', '');
62
+ return tokenId.replaceAll(',', '');
63
63
  }
64
64
  return tokenId;
65
65
  }
@@ -3,6 +3,5 @@ export declare function isRecipientSelf(currentAddress: string, recipientAddress
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
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
- 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
- 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;
6
+ export declare function assetHubGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
8
7
  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>;
@@ -1,6 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { AssetHubNftType } from '@subwallet/extension-base/background/KoniTypes';
4
5
  import { SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME } from '@subwallet/extension-base/koni/api/nft/config';
5
6
  import { reformatAddress } from '@subwallet/extension-base/utils';
6
7
  export function isRecipientSelf(currentAddress, recipientAddress) {
@@ -52,21 +53,17 @@ export async function uniqueGetExtrinsic(substrateApi, senderAddress, recipientA
52
53
  return null;
53
54
  }
54
55
  }
55
- export function statemineGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
56
+ export function assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
56
57
  try {
57
58
  const itemId = params.itemId;
58
59
  const collectionId = params.collectionId;
59
- return substrateApi.api.tx.uniques.transfer(collectionId, itemId, recipientAddress);
60
- } catch (e) {
61
- console.error(e);
60
+ const nftType = params.assetHubType;
61
+ if (nftType === AssetHubNftType.NFTS) {
62
+ return substrateApi.api.tx.nfts.transfer(collectionId, itemId, recipientAddress);
63
+ } else if (nftType === AssetHubNftType.UNIQUES) {
64
+ return substrateApi.api.tx.uniques.transfer(collectionId, itemId, recipientAddress);
65
+ }
62
66
  return null;
63
- }
64
- }
65
- export function statemintGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
66
- try {
67
- const itemId = params.itemId;
68
- const collectionId = params.collectionId;
69
- return substrateApi.api.tx.nfts.transfer(collectionId, itemId, recipientAddress);
70
67
  } catch (e) {
71
68
  console.error(e);
72
69
  return null;
@@ -87,9 +84,9 @@ export async function getNftTransferExtrinsic(networkKey, substrateApi, senderAd
87
84
  case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
88
85
  return await uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
89
86
  case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemine:
90
- return statemineGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
87
+ return assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
91
88
  case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemint:
92
- return statemintGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
89
+ return assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
93
90
  case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.bitcountry:
94
91
  return acalaGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
95
92
  case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.pioneer:
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.1.55-0",
20
+ "version": "1.1.56-0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -204,6 +204,16 @@
204
204
  "require": "./cjs/koni/api/nft/acala_nft/index.js",
205
205
  "default": "./koni/api/nft/acala_nft/index.js"
206
206
  },
207
+ "./koni/api/nft/assethub_nft": {
208
+ "types": "./koni/api/nft/assethub_nft/index.d.ts",
209
+ "require": "./cjs/koni/api/nft/assethub_nft/index.js",
210
+ "default": "./koni/api/nft/assethub_nft/index.js"
211
+ },
212
+ "./koni/api/nft/assethub_unique": {
213
+ "types": "./koni/api/nft/assethub_unique/index.d.ts",
214
+ "require": "./cjs/koni/api/nft/assethub_unique/index.js",
215
+ "default": "./koni/api/nft/assethub_unique/index.js"
216
+ },
207
217
  "./koni/api/nft/bit.country": {
208
218
  "types": "./koni/api/nft/bit.country/index.d.ts",
209
219
  "require": "./cjs/koni/api/nft/bit.country/index.js",
@@ -254,16 +264,6 @@
254
264
  "require": "./cjs/koni/api/nft/rmrk_nft/index.js",
255
265
  "default": "./koni/api/nft/rmrk_nft/index.js"
256
266
  },
257
- "./koni/api/nft/statemine_nft": {
258
- "types": "./koni/api/nft/statemine_nft/index.d.ts",
259
- "require": "./cjs/koni/api/nft/statemine_nft/index.js",
260
- "default": "./koni/api/nft/statemine_nft/index.js"
261
- },
262
- "./koni/api/nft/statemint_nft": {
263
- "types": "./koni/api/nft/statemint_nft/index.d.ts",
264
- "require": "./cjs/koni/api/nft/statemint_nft/index.js",
265
- "default": "./koni/api/nft/statemint_nft/index.js"
266
- },
267
267
  "./koni/api/nft/transfer": {
268
268
  "types": "./koni/api/nft/transfer.d.ts",
269
269
  "require": "./cjs/koni/api/nft/transfer.js",
@@ -1856,28 +1856,28 @@
1856
1856
  "@metamask/safe-event-emitter": "^2.0.0",
1857
1857
  "@metaverse-network-sdk/type-definitions": "^0.0.1-13",
1858
1858
  "@oak-foundation/types": "^0.0.23",
1859
- "@polkadot/api": "^10.11.2",
1859
+ "@polkadot/api": "^10.12.4",
1860
1860
  "@polkadot/api-base": "^10.11.2",
1861
- "@polkadot/api-contract": "^10.11.2",
1862
- "@polkadot/api-derive": "^10.11.2",
1863
- "@polkadot/apps-config": "^0.133.1",
1861
+ "@polkadot/api-contract": "^10.12.4",
1862
+ "@polkadot/api-derive": "^10.12.4",
1863
+ "@polkadot/apps-config": "^0.135.1",
1864
1864
  "@polkadot/hw-ledger": "^12.6.2",
1865
1865
  "@polkadot/networks": "^12.6.2",
1866
- "@polkadot/phishing": "^0.22.1",
1867
- "@polkadot/rpc-provider": "^10.11.2",
1868
- "@polkadot/types": "^10.11.2",
1869
- "@polkadot/types-augment": "^10.11.2",
1870
- "@polkadot/ui-settings": "^3.6.4",
1866
+ "@polkadot/phishing": "^0.22.4",
1867
+ "@polkadot/rpc-provider": "^10.12.4",
1868
+ "@polkadot/types": "^10.12.4",
1869
+ "@polkadot/types-augment": "^10.12.4",
1870
+ "@polkadot/ui-settings": "^3.6.5",
1871
1871
  "@polkadot/util": "^12.6.2",
1872
1872
  "@polkadot/util-crypto": "^12.6.2",
1873
1873
  "@reduxjs/toolkit": "^1.9.1",
1874
1874
  "@sora-substrate/type-definitions": "^1.17.7",
1875
- "@substrate/connect": "^0.7.26",
1876
- "@subwallet/chain-list": "0.2.55",
1877
- "@subwallet/extension-base": "^1.1.55-0",
1878
- "@subwallet/extension-chains": "^1.1.55-0",
1879
- "@subwallet/extension-dapp": "^1.1.55-0",
1880
- "@subwallet/extension-inject": "^1.1.55-0",
1875
+ "@substrate/connect": "^0.8.9",
1876
+ "@subwallet/chain-list": "0.2.56",
1877
+ "@subwallet/extension-base": "^1.1.56-0",
1878
+ "@subwallet/extension-chains": "^1.1.56-0",
1879
+ "@subwallet/extension-dapp": "^1.1.56-0",
1880
+ "@subwallet/extension-inject": "^1.1.56-0",
1881
1881
  "@subwallet/keyring": "^0.1.5",
1882
1882
  "@subwallet/ui-keyring": "^0.1.5",
1883
1883
  "@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.55-0'
10
+ version: '1.1.56-0'
11
11
  };
@@ -71,7 +71,8 @@ export const _STAKING_ERA_LENGTH_MAP = {
71
71
  shiden: 24,
72
72
  shibuya: 24,
73
73
  bifrost_testnet: 0.5,
74
- bifrost: 2,
74
+ bifrost: 13 * 600 / 3600,
75
+ // real blocktime of bifros ksm = 13s
75
76
  bifrost_dot: 24,
76
77
  ternoa: 24,
77
78
  calamari: 6,
@@ -88,7 +89,8 @@ export const _STAKING_ERA_LENGTH_MAP = {
88
89
  goldberg_testnet: 24,
89
90
  manta_network: 6,
90
91
  krest_network: 4,
91
- polimec: 6
92
+ polimec: 6,
93
+ enjin_relaychain: 24
92
94
  };
93
95
  export const _EXPECTED_BLOCK_TIME = {
94
96
  // in seconds
@@ -105,7 +107,19 @@ export const _EXPECTED_BLOCK_TIME = {
105
107
  creditcoin: 12,
106
108
  vara_network: 3,
107
109
  goldberg_testnet: 20,
108
- polimec: 12
110
+ polimec: 12,
111
+ bifrost: 13,
112
+ // expect 12 but actual 13
113
+ moonbeam: 12,
114
+ moonriver: 12,
115
+ moonbase: 6,
116
+ turing: 12,
117
+ turingStaging: 12,
118
+ bifrost_testnet: 3,
119
+ calamari: 12,
120
+ calamari_test: 12,
121
+ manta_network: 12,
122
+ enjin_relaychain: 6
109
123
  };
110
124
  export const _PARACHAIN_INFLATION_DISTRIBUTION = {
111
125
  moonbeam: {
@@ -130,27 +130,25 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
130
130
  });
131
131
  }
132
132
  if (hasUnstakingInfo) {
133
- const _currentBlockInfo = await substrateApi.api.rpc.chain.getHeader();
134
- const currentBlockInfo = _currentBlockInfo.toPrimitive();
135
- const currentBlockNumber = currentBlockInfo.number;
133
+ const [_currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
134
+ const currentBlock = _currentBlock.toPrimitive();
135
+ const currentTimestamp = _currentTimestamp.toPrimitive();
136
136
  const _blockPerRound = substrateApi.api.consts.parachainStaking.defaultBlocksPerRound.toString();
137
137
  const blockPerRound = parseFloat(_blockPerRound);
138
138
  for (const [unstakingBlock, unstakingAmount] of Object.entries(unstakingInfo)) {
139
139
  const blockDuration = (_STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _STAKING_ERA_LENGTH_MAP.default) / blockPerRound; // in hours
140
140
 
141
- const isClaimable = parseInt(unstakingBlock) - currentBlockNumber < 0;
142
- const remainingBlock = parseInt(unstakingBlock) - currentBlockNumber;
141
+ const isClaimable = parseInt(unstakingBlock) - currentBlock <= 0;
142
+ const remainingBlock = parseInt(unstakingBlock) - currentBlock;
143
143
  const waitingTime = remainingBlock * blockDuration;
144
- // const currentTimestampMs = Date.now();
145
- // const targetTimestampMs = currentTimestampMs + waitingTime * 60 * 60 * 1000;
146
-
144
+ const targetTimestampMs = remainingBlock * blockDuration * 3600 * 1000 + currentTimestamp;
147
145
  unstakingBalance = unstakingAmount.toString();
148
146
  unstakingList.push({
149
147
  chain: chainInfo.slug,
150
148
  status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
151
149
  claimable: unstakingAmount.toString(),
152
150
  waitingTime,
153
- // targetTimestampMs: targetTimestampMs,
151
+ targetTimestampMs: targetTimestampMs,
154
152
  validatorAddress: undefined
155
153
  });
156
154
  }
@@ -4,7 +4,7 @@
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
5
  import { BasicTxErrorType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
6
6
  import { getBondedValidators, getEarningStatusByNominations, getParaCurrentInflation, isUnstakeAll } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
7
- import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
7
+ import { _EXPECTED_BLOCK_TIME, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
8
8
  import { _STAKING_CHAIN_GROUP, MANTA_MIN_DELEGATION, MANTA_VALIDATOR_POINTS_PER_BLOCK } from '@subwallet/extension-base/services/earning-service/constants';
9
9
  import { parseIdentity } from '@subwallet/extension-base/services/earning-service/utils';
10
10
  import { EarningStatus, UnstakingStatus } from '@subwallet/extension-base/types';
@@ -137,7 +137,9 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
137
137
  const roundInfo = _roundInfo.toPrimitive();
138
138
  const currentRound = roundInfo.current;
139
139
  await Promise.all(delegatorState.delegations.map(async delegation => {
140
- const [_delegationScheduledRequests, [identity], _collatorInfo] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), parseIdentity(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner)]);
140
+ const [_delegationScheduledRequests, [identity], _collatorInfo, _currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), parseIdentity(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner), substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
141
+ const currentBlock = _currentBlock.toPrimitive();
142
+ const currentTimestamp = _currentTimestamp.toPrimitive();
141
143
  const collatorInfo = _collatorInfo.toPrimitive();
142
144
  const minDelegation = collatorInfo === null || collatorInfo === void 0 ? void 0 : collatorInfo.lowestTopDelegationAmount.toString();
143
145
  const delegationScheduledRequests = _delegationScheduledRequests.toPrimitive();
@@ -149,22 +151,23 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
149
151
  for (const scheduledRequest of delegationScheduledRequests) {
150
152
  if (reformatAddress(scheduledRequest.delegator, 0) === reformatAddress(address, 0)) {
151
153
  // add network prefix
152
- const isClaimable = scheduledRequest.whenExecutable - currentRound <= 0;
153
- const remainingEra = scheduledRequest.whenExecutable - currentRound;
154
+ const isClaimable = scheduledRequest.whenExecutable - parseInt(currentRound) <= 0;
155
+ const remainingEra = scheduledRequest.whenExecutable - parseInt(currentRound);
154
156
  const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug];
155
157
  const claimable = Object.values(scheduledRequest.action)[0];
156
- // const currentTimestampMs = Date.now();
157
- // const targetTimestampMs = currentTimestampMs + waitingTime * 60 * 60 * 1000;
158
158
 
159
+ // noted: target timestamp in parachainStaking easily volatile if block time volatile
160
+ const targetBlock = remainingEra * parseInt(roundInfo.length) + parseInt(roundInfo.first);
161
+ const remainingBlock = targetBlock - currentBlock;
162
+ const targetTimestampMs = remainingBlock * _EXPECTED_BLOCK_TIME[chainInfo.slug] * 1000 + currentTimestamp;
159
163
  unstakingMap[delegation.owner] = {
160
164
  chain: chainInfo.slug,
161
165
  status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
162
166
  validatorAddress: delegation.owner,
163
167
  claimable: claimable.toString(),
164
- waitingTime
165
- // targetTimestampMs: targetTimestampMs
168
+ waitingTime,
169
+ targetTimestampMs: targetTimestampMs
166
170
  };
167
-
168
171
  hasUnstaking = true;
169
172
  break; // only handle 1 scheduledRequest per collator
170
173
  }
@@ -158,11 +158,25 @@ export default class NominationPoolHandler extends BasePoolHandler {
158
158
  if (nominations) {
159
159
  const validatorList = nominations.targets;
160
160
  await Promise.all(validatorList.map(async validatorAddress => {
161
- const _eraStaker = await substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress);
162
- const eraStaker = _eraStaker.toPrimitive();
163
- const sortedNominators = eraStaker.others.sort((a, b) => {
164
- return new BigN(b.value).minus(a.value).toNumber();
165
- });
161
+ let sortedNominators = [];
162
+ if (['kusama'].includes(this.chain)) {
163
+ // todo: hot fix for kusama first, we'll review all relaychains later
164
+ const _eraStaker = await substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress);
165
+ const eraStakerOtherList = [];
166
+ _eraStaker.forEach(paged => {
167
+ const pagedExposure = paged[1].toPrimitive();
168
+ eraStakerOtherList.push(...pagedExposure.others);
169
+ });
170
+ sortedNominators = eraStakerOtherList.sort((a, b) => {
171
+ return new BigN(b.value).minus(a.value).toNumber();
172
+ });
173
+ } else {
174
+ const _eraStaker = await substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress);
175
+ const eraStaker = _eraStaker.toPrimitive();
176
+ sortedNominators = eraStaker.others.sort((a, b) => {
177
+ return new BigN(b.value).minus(a.value).toNumber();
178
+ });
179
+ }
166
180
  const topNominators = sortedNominators.map(nominator => {
167
181
  return nominator.who;
168
182
  }).slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator);
@@ -396,7 +396,6 @@ export default class EarningService {
396
396
  async removeYieldPositions(chains, addresses) {
397
397
  const removeKeys = [];
398
398
  chains && chains.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(([key, value]) => {
399
- console.log('removeYieldPositions', key, value.chain, chains.indexOf(value.chain) > -1);
400
399
  if (chains.indexOf(value.chain) > -1 && !removeKeys.includes(key)) {
401
400
  removeKeys.push(key);
402
401
  }
@@ -9,6 +9,10 @@ export interface PalletStakingExposureItem {
9
9
  who: string;
10
10
  value: number;
11
11
  }
12
+ export interface SpStakingExposurePage {
13
+ pageTotal: number;
14
+ others: PalletStakingExposureItem[];
15
+ }
12
16
  export interface PalletStakingExposure {
13
17
  total: number;
14
18
  own: number;