@subwallet/extension-base 1.3.4-0 → 1.3.6-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 (42) hide show
  1. package/background/KoniTypes.d.ts +1 -1
  2. package/cjs/koni/api/nft/config.js +1 -1
  3. package/cjs/koni/api/nft/index.js +9 -0
  4. package/cjs/koni/api/nft/rari/index.js +87 -0
  5. package/cjs/koni/api/yield/helper/utils.js +1 -1
  6. package/cjs/packageInfo.js +1 -1
  7. package/cjs/services/balance-service/helpers/subscribe/index.js +5 -0
  8. package/cjs/services/balance-service/index.js +1 -1
  9. package/cjs/services/chain-service/constants.js +2 -1
  10. package/cjs/services/chain-service/handler/EvmChainHandler.js +0 -2
  11. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +58 -54
  12. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +1 -1
  13. package/cjs/services/earning-service/handlers/native-staking/astar.js +1 -1
  14. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +1 -1
  15. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +1 -1
  16. package/cjs/services/earning-service/handlers/native-staking/tao.js +1 -1
  17. package/cjs/services/earning-service/handlers/nomination-pool/index.js +5 -8
  18. package/cjs/services/transaction-service/index.js +5 -4
  19. package/cjs/services/transaction-service/utils.js +3 -0
  20. package/koni/api/contract-handler/utils/index.d.ts +3 -2
  21. package/koni/api/nft/config.js +1 -1
  22. package/koni/api/nft/index.js +9 -0
  23. package/koni/api/nft/rari/index.d.ts +7 -0
  24. package/koni/api/nft/rari/index.js +80 -0
  25. package/koni/api/yield/helper/utils.js +1 -1
  26. package/package.json +11 -6
  27. package/packageInfo.js +1 -1
  28. package/services/balance-service/helpers/subscribe/index.js +5 -0
  29. package/services/balance-service/index.js +2 -2
  30. package/services/chain-service/constants.d.ts +1 -0
  31. package/services/chain-service/constants.js +2 -1
  32. package/services/chain-service/handler/EvmChainHandler.js +0 -2
  33. package/services/chain-service/handler/SubstrateChainHandler.d.ts +1 -2
  34. package/services/chain-service/handler/SubstrateChainHandler.js +58 -54
  35. package/services/earning-service/handlers/native-staking/amplitude.js +1 -1
  36. package/services/earning-service/handlers/native-staking/astar.js +1 -1
  37. package/services/earning-service/handlers/native-staking/para-chain.js +1 -1
  38. package/services/earning-service/handlers/native-staking/relay-chain.js +1 -1
  39. package/services/earning-service/handlers/native-staking/tao.js +1 -1
  40. package/services/earning-service/handlers/nomination-pool/index.js +5 -8
  41. package/services/transaction-service/index.js +5 -4
  42. package/services/transaction-service/utils.js +3 -0
@@ -1428,7 +1428,7 @@ export interface KoniRequestSignatures {
1428
1428
  'pri(bonding.subscribeNominatorMetadata)': [null, NominatorMetadata[], NominatorMetadata[]];
1429
1429
  'pri(bonding.getBondingOptions)': [BondingOptionParams, ValidatorInfo[]];
1430
1430
  'pri(bonding.getNominationPoolOptions)': [string, NominationPoolInfo[]];
1431
- 'pri(bonding.nominationPool.submitBonding)': [RequestStakePoolingBonding, SWTransactionResponse];
1431
+ 'pri(bonding.nominationPool.submitBonding)': [RequestYieldStepSubmit, SWTransactionResponse];
1432
1432
  'pri(bonding.nominationPool.submitUnbonding)': [RequestStakePoolingUnbonding, SWTransactionResponse];
1433
1433
  'pri(chainService.subscribeChainInfoMap)': [null, Record<string, any>, Record<string, any>];
1434
1434
  'pri(chainService.subscribeChainStateMap)': [null, Record<string, any>, Record<string, any>];
@@ -124,7 +124,7 @@ exports.SUPPORTED_TRANSFER_EVM_CHAIN_NAME = SUPPORTED_TRANSFER_EVM_CHAIN_NAME;
124
124
  })(SUPPORTED_TRANSFER_EVM_CHAIN_NAME || (exports.SUPPORTED_TRANSFER_EVM_CHAIN_NAME = SUPPORTED_TRANSFER_EVM_CHAIN_NAME = {}));
125
125
  const SUPPORTED_TRANSFER_EVM_CHAIN = [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbeam, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonriver, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.astarEvm, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shiden, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shibuya];
126
126
  exports.SUPPORTED_TRANSFER_EVM_CHAIN = SUPPORTED_TRANSFER_EVM_CHAIN;
127
- const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm'];
127
+ const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm', 'rari'];
128
128
  exports.UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME;
129
129
  const TRANSFER_CHAIN_ID = {
130
130
  [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase]: 1287,
@@ -20,6 +20,7 @@ var _constants = require("@subwallet/extension-base/services/chain-service/const
20
20
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
21
21
  var _utils2 = require("@subwallet/extension-base/utils");
22
22
  var _assethub_nft = _interopRequireDefault(require("./assethub_nft"));
23
+ var _rari = require("./rari");
23
24
  var _ternoa_nft = require("./ternoa_nft");
24
25
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
25
26
  // SPDX-License-Identifier: Apache-2.0
@@ -53,6 +54,8 @@ function createSubstrateNftApi(chain, substrateApi, addresses) {
53
54
  return [new _blobinscription.BlobInscriptionApi(chain, substrateAddresses)];
54
55
  } else if (_constants._NFT_CHAIN_GROUP.ternoa.includes(chain)) {
55
56
  return [new _ternoa_nft.TernoaNftApi(substrateApi, substrateAddresses, chain)];
57
+ } else if (_constants._NFT_CHAIN_GROUP.rari.includes(chain)) {
58
+ return [new _rari.RariNftApi(chain, evmAddresses)];
56
59
  }
57
60
  return null;
58
61
  }
@@ -151,6 +154,12 @@ class NftHandler {
151
154
  this.handlers.push(...handlers);
152
155
  }
153
156
  }
157
+ if (chain === 'rari') {
158
+ const handlers = createSubstrateNftApi(chain, null, evmAddresses);
159
+ if (handlers && !!handlers.length) {
160
+ this.handlers.push(...handlers);
161
+ }
162
+ }
154
163
  if (chain === 'ternoa') {
155
164
  const handlers = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
156
165
  if (handlers && !!handlers.length) {
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RariNftApi = void 0;
7
+ var _nft = require("../nft");
8
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
9
+ // SPDX-License-Identifier: Apache-2.0
10
+
11
+ const options = {
12
+ method: 'GET',
13
+ headers: {
14
+ accept: 'application/json',
15
+ 'X-API-KEY': 'ed9df6bf-7eba-4ca2-8a42-9006706be064'
16
+ }
17
+ };
18
+ class RariNftApi extends _nft.BaseNftApi {
19
+ constructor(chain, addresses) {
20
+ super(chain, undefined, addresses);
21
+ }
22
+ wait(ms) {
23
+ return new Promise(resolve => setTimeout(resolve, ms));
24
+ }
25
+ async handleNfts(params) {
26
+ const collectionMap = new Map();
27
+ const size = 4;
28
+ const waitTime = 1000;
29
+ for (let i = 0; i < this.addresses.length; i += size) {
30
+ const group = this.addresses.slice(i, i + size);
31
+ await Promise.all(group.map(async address => {
32
+ const nftResponse = await fetch(`https://api.rarible.org/v0.1/items/byOwner?blockchains=RARI&owner=ETHEREUM%3A${address}&size=5000`, options).then(response => response.json()).catch(err => {
33
+ console.error(err);
34
+ return null;
35
+ });
36
+ if (!nftResponse || !nftResponse.items) {
37
+ return;
38
+ }
39
+ const nftItems = nftResponse.items;
40
+
41
+ // eslint-disable-next-line @typescript-eslint/require-await
42
+ await Promise.all(nftItems.map(async nft => {
43
+ var _NftMetadata$content$;
44
+ const collectionId = nft.collection;
45
+ const collectionName = nft.itemCollection.name;
46
+ const NftMetadata = nft.meta;
47
+ const NFTimageUrl = ((_NftMetadata$content$ = NftMetadata.content[0]) === null || _NftMetadata$content$ === void 0 ? void 0 : _NftMetadata$content$.url) || '';
48
+ const formatCollectionId = collectionId.replace(/^RARI:/, '');
49
+ const parsedNft = {
50
+ id: nft.tokenId,
51
+ name: NftMetadata.name,
52
+ description: NftMetadata.description || '',
53
+ image: NFTimageUrl,
54
+ collectionId: formatCollectionId,
55
+ chain: this.chain,
56
+ owner: address
57
+ };
58
+ params.updateItem(this.chain, parsedNft, address);
59
+ if (!collectionMap.has(formatCollectionId)) {
60
+ collectionMap.set(formatCollectionId, collectionName);
61
+ }
62
+ }));
63
+ }));
64
+ if (i + size < this.addresses.length) {
65
+ await this.wait(waitTime);
66
+ }
67
+ }
68
+ for (const [formatCollectionId, collectionName] of collectionMap.entries()) {
69
+ const parsedCollection = {
70
+ collectionId: formatCollectionId,
71
+ chain: this.chain,
72
+ collectionName,
73
+ image: ''
74
+ };
75
+ params.updateCollection(this.chain, parsedCollection);
76
+ }
77
+ }
78
+ async fetchNfts(params) {
79
+ try {
80
+ await this.handleNfts(params);
81
+ } catch (e) {
82
+ return 0;
83
+ }
84
+ return 1;
85
+ }
86
+ }
87
+ exports.RariNftApi = RariNftApi;
@@ -13,7 +13,7 @@ var _bignumber = _interopRequireDefault(require("bignumber.js"));
13
13
  // Copyright 2019-2022 @subwallet/extension-base
14
14
  // SPDX-License-Identifier: Apache-2.0
15
15
 
16
- const YIELD_EXTRINSIC_TYPES = [_KoniTypes.ExtrinsicType.MINT_VDOT, _KoniTypes.ExtrinsicType.MINT_LDOT, _KoniTypes.ExtrinsicType.MINT_SDOT, _KoniTypes.ExtrinsicType.MINT_QDOT, _KoniTypes.ExtrinsicType.MINT_STDOT, _KoniTypes.ExtrinsicType.REDEEM_QDOT, _KoniTypes.ExtrinsicType.REDEEM_SDOT, _KoniTypes.ExtrinsicType.REDEEM_VDOT, _KoniTypes.ExtrinsicType.REDEEM_LDOT, _KoniTypes.ExtrinsicType.REDEEM_STDOT, _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL, _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW];
16
+ const YIELD_EXTRINSIC_TYPES = [_KoniTypes.ExtrinsicType.MINT_VDOT, _KoniTypes.ExtrinsicType.MINT_LDOT, _KoniTypes.ExtrinsicType.MINT_SDOT, _KoniTypes.ExtrinsicType.MINT_QDOT, _KoniTypes.ExtrinsicType.MINT_STDOT, _KoniTypes.ExtrinsicType.REDEEM_QDOT, _KoniTypes.ExtrinsicType.REDEEM_SDOT, _KoniTypes.ExtrinsicType.REDEEM_VDOT, _KoniTypes.ExtrinsicType.REDEEM_LDOT, _KoniTypes.ExtrinsicType.REDEEM_STDOT, _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL];
17
17
  exports.YIELD_EXTRINSIC_TYPES = YIELD_EXTRINSIC_TYPES;
18
18
  const YIELD_POOL_STAT_REFRESH_INTERVAL = 90000;
19
19
  exports.YIELD_POOL_STAT_REFRESH_INTERVAL = YIELD_POOL_STAT_REFRESH_INTERVAL;
@@ -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.3.4-0'
16
+ version: '1.3.6-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -138,6 +138,11 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
138
138
  tonApi
139
139
  });
140
140
  }
141
+
142
+ // If the chain is not ready, return pending state
143
+ if (!substrateApiMap[chainSlug].isApiReady) {
144
+ handleUnsupportedOrPendingAddresses(useAddresses, chainSlug, chainAssetMap, _KoniTypes.APIItemState.PENDING, callback);
145
+ }
141
146
  const substrateApi = await substrateApiMap[chainSlug].isReady;
142
147
  return (0, _substrate.subscribeSubstrateBalance)(useAddresses, chainInfo, chainAssetMap, substrateApi, evmApi, callback, extrinsicType);
143
148
  });
@@ -199,7 +199,7 @@ class BalanceService {
199
199
  let unsub = _util.noop;
200
200
  unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, result => {
201
201
  const rs = result[0];
202
- if (rs.tokenSlug === tSlug) {
202
+ if (rs.tokenSlug === tSlug && rs.state !== _KoniTypes.APIItemState.PENDING) {
203
203
  hasError = false;
204
204
  const balance = {
205
205
  value: rs.free,
@@ -65,7 +65,8 @@ const _NFT_CHAIN_GROUP = {
65
65
  bitcountry: ['bitcountry', 'pioneer', 'continuum_network'],
66
66
  vara: ['vara_network'],
67
67
  avail: ['avail_mainnet'],
68
- ternoa: ['ternoa', 'ternoa_alphanet']
68
+ ternoa: ['ternoa', 'ternoa_alphanet'],
69
+ rari: ['rari']
69
70
  };
70
71
 
71
72
  // Staking--------------------------------------------------------------------------------------------------------------
@@ -118,7 +118,6 @@ class EvmChainHandler extends _AbstractChainHandler.AbstractChainHandler {
118
118
  const evmApi = this.getEvmApiByChain(originChain);
119
119
  try {
120
120
  if (tokenType === _types._AssetType.ERC721) {
121
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access
122
121
  tokenContract = new evmApi.api.eth.Contract(_utils._ERC721_ABI, contractAddress);
123
122
  const [_name, _symbol] = await Promise.all([
124
123
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
@@ -128,7 +127,6 @@ class EvmChainHandler extends _AbstractChainHandler.AbstractChainHandler {
128
127
  name = _name;
129
128
  symbol = _symbol;
130
129
  } else {
131
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access
132
130
  tokenContract = new evmApi.api.eth.Contract(_utils._ERC20_ABI, contractAddress);
133
131
  const [_decimals, _symbol, _name] = await Promise.all([
134
132
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
@@ -114,6 +114,12 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
114
114
  }
115
115
  async getPsp22TokenInfo(apiPromise, contractAddress, contractCaller) {
116
116
  const tokenContract = new _apiContract.ContractPromise(apiPromise, _utils3._PSP22_ABI, contractAddress);
117
+ const tokenSmartContract = {
118
+ name: '',
119
+ decimals: -1,
120
+ symbol: '',
121
+ contractError: false
122
+ };
117
123
  const [nameResp, symbolResp, decimalsResp] = await Promise.all([tokenContract.query['psp22Metadata::tokenName'](contractCaller || contractAddress, {
118
124
  gasLimit: (0, _utils.getDefaultWeightV2)(apiPromise)
119
125
  }),
@@ -124,67 +130,72 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
124
130
  gasLimit: (0, _utils.getDefaultWeightV2)(apiPromise)
125
131
  })]);
126
132
  if (!(nameResp.result.isOk && symbolResp.result.isOk && decimalsResp.result.isOk) || !nameResp.output || !decimalsResp.output || !symbolResp.output) {
127
- return ['', 1, '', true];
133
+ tokenSmartContract.contractError = true;
134
+ return tokenSmartContract;
128
135
  } else {
129
136
  var _symbolResp$output, _decimalsResp$output, _nameResp$output;
130
- let contractError = false;
131
137
  const symbolObj = (_symbolResp$output = symbolResp.output) === null || _symbolResp$output === void 0 ? void 0 : _symbolResp$output.toHuman();
132
138
  const decimalsObj = (_decimalsResp$output = decimalsResp.output) === null || _decimalsResp$output === void 0 ? void 0 : _decimalsResp$output.toHuman();
133
139
  const nameObj = (_nameResp$output = nameResp.output) === null || _nameResp$output === void 0 ? void 0 : _nameResp$output.toHuman();
134
- const name = nameResp.output ? nameObj.Ok || nameObj.ok : '';
135
- const decimals = decimalsResp.output ? new _util.BN(decimalsObj.Ok || decimalsObj.ok).toNumber() : 0;
136
- const symbol = decimalsResp.output ? symbolObj.Ok || symbolObj.ok : '';
137
- if (!name || !symbol || typeof name === 'object' || typeof symbol === 'object') {
138
- contractError = true;
140
+ tokenSmartContract.name = nameResp.output ? nameObj.Ok || nameObj.ok : '';
141
+ tokenSmartContract.decimals = decimalsResp.output ? new _util.BN(decimalsObj.Ok || decimalsObj.ok).toNumber() : 0;
142
+ tokenSmartContract.symbol = decimalsResp.output ? symbolObj.Ok || symbolObj.ok : '';
143
+ if (!tokenSmartContract.name || !tokenSmartContract.symbol || typeof tokenSmartContract.name === 'object' || typeof tokenSmartContract.symbol === 'object') {
144
+ tokenSmartContract.contractError = true;
139
145
  }
140
- return [name, decimals, symbol, contractError];
146
+ return tokenSmartContract;
141
147
  }
142
148
  }
143
149
  async getPsp34TokenInfo(apiPromise, contractAddress, contractCaller) {
144
150
  const tokenContract = new _apiContract.ContractPromise(apiPromise, _utils3._PSP34_ABI, contractAddress);
151
+ const tokenSmartContract = {
152
+ name: '',
153
+ decimals: -1,
154
+ symbol: '',
155
+ contractError: false
156
+ };
145
157
  const collectionIdResp = await tokenContract.query['psp34::collectionId'](contractCaller || contractAddress, {
146
158
  gasLimit: (0, _utils.getDefaultWeightV2)(apiPromise)
147
159
  }); // read-only operation so no gas limit
148
160
 
149
161
  if (!collectionIdResp.result.isOk || !collectionIdResp.output) {
150
- return ['', -1, '', true];
162
+ tokenSmartContract.contractError = true;
163
+ return tokenSmartContract;
151
164
  } else {
152
165
  var _collectionIdResp$out;
153
- let contractError = false;
154
166
  const collectionIdDict = (_collectionIdResp$out = collectionIdResp.output) === null || _collectionIdResp$out === void 0 ? void 0 : _collectionIdResp$out.toHuman();
155
167
  if (collectionIdDict.Bytes === '') {
156
- contractError = true;
168
+ tokenSmartContract.contractError = true;
157
169
  }
158
- return ['', -1, '', contractError];
159
- }
160
- }
161
- async getGrc20TokenInfo(apiPromise, contractAddress) {
162
- if (!(apiPromise instanceof _api.GearApi)) {
163
- console.warn('Cannot subscribe GRC20 balance without GearApi instance');
164
- return ['', -1, '', true];
165
- }
166
- let contractError = false;
167
- const tokenContract = (0, _utils2.getGRC20ContractPromise)(apiPromise, contractAddress);
168
- const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(_utils2.GEAR_DEFAULT_ADDRESS)]);
169
- const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
170
- if (!nameRes || !symbolRes) {
171
- contractError = true;
170
+ return tokenSmartContract;
172
171
  }
173
- return [nameRes, decimals, symbolRes, contractError];
174
172
  }
175
- async getVftTokenInfo(apiPromise, contractAddress) {
173
+ async getVaraFungibleTokenInfo(apiPromise, contractAddress, tokenType) {
174
+ const tokenSmartContract = {
175
+ name: '',
176
+ decimals: -1,
177
+ symbol: '',
178
+ contractError: false
179
+ };
176
180
  if (!(apiPromise instanceof _api.GearApi)) {
177
- console.warn('Cannot subscribe VFT balance without GearApi instance');
178
- return ['', -1, '', true];
181
+ if (tokenType === _types._AssetType.GRC20) {
182
+ console.warn('Cannot subscribe GRC20 balance without GearApi instance');
183
+ } else if (tokenType === _types._AssetType.VFT) {
184
+ console.warn('Cannot subscribe VFT balance without GearApi instance');
185
+ }
186
+ tokenSmartContract.contractError = true;
187
+ return tokenSmartContract;
179
188
  }
180
- let contractError = false;
181
- const tokenContract = (0, _utils2.getVFTContractPromise)(apiPromise, contractAddress);
189
+ const tokenContract = tokenType === _types._AssetType.GRC20 ? (0, _utils2.getGRC20ContractPromise)(apiPromise, contractAddress) : (0, _utils2.getVFTContractPromise)(apiPromise, contractAddress);
182
190
  const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(_utils2.GEAR_DEFAULT_ADDRESS)]);
183
- const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
191
+ const decimals = parseInt(decimalsRes.toString());
192
+ tokenSmartContract.name = nameRes;
193
+ tokenSmartContract.decimals = decimals;
194
+ tokenSmartContract.symbol = symbolRes;
184
195
  if (!nameRes || !symbolRes) {
185
- contractError = true;
196
+ tokenSmartContract.contractError = true;
186
197
  }
187
- return [nameRes, decimals, symbolRes, contractError];
198
+ return tokenSmartContract;
188
199
  }
189
200
  async getLocalTokenInfo(apiPromise, assetId) {
190
201
  const _metadata = await apiPromise.query.assets.metadata(assetId);
@@ -198,40 +209,33 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
198
209
  async getSubstrateContractTokenInfo(contractAddress, tokenType, originChain, contractCaller) {
199
210
  // todo: improve this funtion later
200
211
 
201
- let name = '';
202
- let decimals = -1;
203
- let symbol = '';
204
- let contractError = false;
212
+ let tokenSmartContract = {
213
+ name: '',
214
+ decimals: -1,
215
+ symbol: '',
216
+ contractError: false
217
+ };
205
218
  const apiPromise = this.getSubstrateApiByChain(originChain).api;
206
219
  try {
207
220
  switch (tokenType) {
208
221
  case _types._AssetType.PSP22:
209
- [name, decimals, symbol, contractError] = await this.getPsp22TokenInfo(apiPromise, contractAddress, contractCaller);
222
+ tokenSmartContract = await this.getPsp22TokenInfo(apiPromise, contractAddress, contractCaller);
210
223
  break;
211
224
  case _types._AssetType.PSP34:
212
- [name, decimals, symbol, contractError] = await this.getPsp34TokenInfo(apiPromise, contractAddress, contractCaller);
225
+ tokenSmartContract = await this.getPsp34TokenInfo(apiPromise, contractAddress, contractCaller);
213
226
  break;
214
227
  case _types._AssetType.GRC20:
215
- [name, decimals, symbol, contractError] = await this.getGrc20TokenInfo(apiPromise, contractAddress);
228
+ tokenSmartContract = await this.getVaraFungibleTokenInfo(apiPromise, contractAddress, tokenType);
216
229
  break;
217
230
  case _types._AssetType.VFT:
218
- [name, decimals, symbol, contractError] = await this.getVftTokenInfo(apiPromise, contractAddress);
231
+ tokenSmartContract = await this.getVaraFungibleTokenInfo(apiPromise, contractAddress, tokenType);
219
232
  break;
220
233
  }
221
- return {
222
- name,
223
- decimals,
224
- symbol,
225
- contractError
226
- };
234
+ return tokenSmartContract;
227
235
  } catch (e) {
228
236
  this.logger.error(e);
229
- return {
230
- name: '',
231
- decimals: -1,
232
- symbol: '',
233
- contractError: true
234
- };
237
+ tokenSmartContract.contractError = true;
238
+ return tokenSmartContract;
235
239
  }
236
240
  }
237
241
  async getSubstrateAssetIdTokenInfo(assetId, originChain) {
@@ -456,7 +456,7 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
456
456
  } else {
457
457
  extrinsic = chainApi.api.tx.parachainStaking.leaveDelegators();
458
458
  }
459
- return [_KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
459
+ return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
460
460
  }
461
461
 
462
462
  /* Leave pool action */
@@ -408,7 +408,7 @@ class AstarNativeStakingPoolHandler extends _basePara.default {
408
408
  Wasm: selectedTarget
409
409
  };
410
410
  const extrinsic = chainApi.api.tx.dappsStaking.unbondAndUnstake(dappParam, binaryAmount);
411
- return [_KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
411
+ return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
412
412
  }
413
413
 
414
414
  /* Leave pool action */
@@ -479,7 +479,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
479
479
  } else {
480
480
  extrinsic = apiPromise.api.tx.parachainStaking.scheduleRevokeDelegation(selectedTarget);
481
481
  }
482
- return [_KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
482
+ return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
483
483
  }
484
484
 
485
485
  /* Leave pool action */
@@ -642,7 +642,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
642
642
  } else {
643
643
  extrinsic = chainApi.api.tx.staking.unbond(binaryAmount);
644
644
  }
645
- return [_KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
645
+ return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
646
646
  }
647
647
 
648
648
  /* Leave pool action */
@@ -394,7 +394,7 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
394
394
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
395
395
  }
396
396
  const extrinsic = apiPromise.api.tx.subtensorModule.removeStake(selectedTarget, binaryAmount);
397
- return [_KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
397
+ return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
398
398
  }
399
399
 
400
400
  /* Leave pool action */
@@ -481,21 +481,18 @@ class NominationPoolHandler extends _base.default {
481
481
  const data = _data;
482
482
  const {
483
483
  address,
484
- amount,
485
- selectedPool
484
+ amount
486
485
  } = data;
487
486
  const positionInfo = await this.getPoolPosition(address);
488
487
  const [extrinsic] = await this.createJoinExtrinsic(data, positionInfo);
489
488
  const joinPoolData = {
490
- poolPosition: positionInfo,
491
- slug: this.slug,
492
- selectedPool,
493
- amount,
494
- address
489
+ path,
490
+ data: data,
491
+ currentStep
495
492
  };
496
493
  return {
497
494
  txChain: this.chain,
498
- extrinsicType: _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL,
495
+ extrinsicType: _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL,
499
496
  extrinsic,
500
497
  txData: joinPoolData,
501
498
  transferNativeAmount: amount,
@@ -371,14 +371,15 @@ class TransactionService {
371
371
  };
372
372
  }
373
373
  break;
374
- case _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL:
374
+ case _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL:
375
375
  {
376
376
  const data = (0, _utils3.parseTransactionData)(transaction.data);
377
+ const poolData = data.data;
377
378
  historyItem.amount = {
378
379
  ...baseNativeAmount,
379
- value: data.amount || '0'
380
+ value: poolData.amount || '0'
380
381
  };
381
- historyItem.to = data.selectedPool.name || data.selectedPool.id.toString();
382
+ historyItem.to = poolData.selectedPool.name || poolData.selectedPool.id.toString();
382
383
  }
383
384
  break;
384
385
  case _KoniTypes.ExtrinsicType.STAKING_UNBOND:
@@ -692,7 +693,7 @@ class TransactionService {
692
693
  } catch (e) {
693
694
  console.error(e);
694
695
  }
695
- } else if ([_KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.STAKING_UNBOND, _KoniTypes.ExtrinsicType.STAKING_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) {
696
+ } else if ([_KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.STAKING_UNBOND, _KoniTypes.ExtrinsicType.STAKING_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) {
696
697
  this.state.eventService.emit('transaction.submitStaking', transaction.chain);
697
698
  } else if (transaction.extrinsicType === _KoniTypes.ExtrinsicType.SWAP) {
698
699
  const inputData = (0, _utils3.parseTransactionData)(transaction.data);
@@ -36,6 +36,9 @@ function getBlockExplorerAccountRoute(explorerLink) {
36
36
  if (explorerLink.includes('invarch.statescan.io')) {
37
37
  return '#/accounts';
38
38
  }
39
+ if (explorerLink.includes('tangle.statescan.io')) {
40
+ return '#/accounts';
41
+ }
39
42
  if (explorerLink.includes('explorer.zkverify.io')) {
40
43
  return 'account';
41
44
  }
@@ -1,6 +1,7 @@
1
1
  import { _Address } from '@subwallet/extension-base/background/KoniTypes';
2
- export declare const _ERC20_ABI: any;
3
- export declare const _ERC721_ABI: any;
2
+ import { AbiItem } from 'web3-utils';
3
+ export declare const _ERC20_ABI: AbiItem[] | AbiItem;
4
+ export declare const _ERC721_ABI: AbiItem[] | AbiItem;
4
5
  export declare const _TEST_ERC721_ABI: any;
5
6
  export declare const _PSP22_ABI: Record<string, any>;
6
7
  export declare const _PSP34_ABI: Record<string, any>;
@@ -82,7 +82,7 @@ export let SUPPORTED_TRANSFER_EVM_CHAIN_NAME;
82
82
  SUPPORTED_TRANSFER_EVM_CHAIN_NAME["shibuya"] = "shibuya";
83
83
  })(SUPPORTED_TRANSFER_EVM_CHAIN_NAME || (SUPPORTED_TRANSFER_EVM_CHAIN_NAME = {}));
84
84
  export const SUPPORTED_TRANSFER_EVM_CHAIN = [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbeam, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonriver, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.astarEvm, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shiden, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shibuya];
85
- export const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm'];
85
+ export const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm', 'rari'];
86
86
  export const TRANSFER_CHAIN_ID = {
87
87
  [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase]: 1287,
88
88
  [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbeam]: 1284,
@@ -17,6 +17,7 @@ import { _NFT_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-servi
17
17
  import { _isChainSupportEvmNft, _isChainSupportNativeNft, _isChainSupportWasmNft, _isSupportOrdinal } from '@subwallet/extension-base/services/chain-service/utils';
18
18
  import { categoryAddresses, targetIsWeb } from '@subwallet/extension-base/utils';
19
19
  import AssetHubNftsPalletApi from "./assethub_nft/index.js";
20
+ import { RariNftApi } from "./rari/index.js";
20
21
  import { TernoaNftApi } from "./ternoa_nft/index.js";
21
22
  function createSubstrateNftApi(chain, substrateApi, addresses) {
22
23
  const {
@@ -45,6 +46,8 @@ function createSubstrateNftApi(chain, substrateApi, addresses) {
45
46
  return [new BlobInscriptionApi(chain, substrateAddresses)];
46
47
  } else if (_NFT_CHAIN_GROUP.ternoa.includes(chain)) {
47
48
  return [new TernoaNftApi(substrateApi, substrateAddresses, chain)];
49
+ } else if (_NFT_CHAIN_GROUP.rari.includes(chain)) {
50
+ return [new RariNftApi(chain, evmAddresses)];
48
51
  }
49
52
  return null;
50
53
  }
@@ -142,6 +145,12 @@ export class NftHandler {
142
145
  this.handlers.push(...handlers);
143
146
  }
144
147
  }
148
+ if (chain === 'rari') {
149
+ const handlers = createSubstrateNftApi(chain, null, evmAddresses);
150
+ if (handlers && !!handlers.length) {
151
+ this.handlers.push(...handlers);
152
+ }
153
+ }
145
154
  if (chain === 'ternoa') {
146
155
  const handlers = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
147
156
  if (handlers && !!handlers.length) {
@@ -0,0 +1,7 @@
1
+ import { BaseNftApi, HandleNftParams } from '../nft';
2
+ export declare class RariNftApi extends BaseNftApi {
3
+ constructor(chain: string, addresses: string[]);
4
+ private wait;
5
+ handleNfts(params: HandleNftParams): Promise<void>;
6
+ fetchNfts(params: HandleNftParams): Promise<number>;
7
+ }
@@ -0,0 +1,80 @@
1
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { BaseNftApi } from "../nft.js";
5
+ const options = {
6
+ method: 'GET',
7
+ headers: {
8
+ accept: 'application/json',
9
+ 'X-API-KEY': 'ed9df6bf-7eba-4ca2-8a42-9006706be064'
10
+ }
11
+ };
12
+ export class RariNftApi extends BaseNftApi {
13
+ constructor(chain, addresses) {
14
+ super(chain, undefined, addresses);
15
+ }
16
+ wait(ms) {
17
+ return new Promise(resolve => setTimeout(resolve, ms));
18
+ }
19
+ async handleNfts(params) {
20
+ const collectionMap = new Map();
21
+ const size = 4;
22
+ const waitTime = 1000;
23
+ for (let i = 0; i < this.addresses.length; i += size) {
24
+ const group = this.addresses.slice(i, i + size);
25
+ await Promise.all(group.map(async address => {
26
+ const nftResponse = await fetch(`https://api.rarible.org/v0.1/items/byOwner?blockchains=RARI&owner=ETHEREUM%3A${address}&size=5000`, options).then(response => response.json()).catch(err => {
27
+ console.error(err);
28
+ return null;
29
+ });
30
+ if (!nftResponse || !nftResponse.items) {
31
+ return;
32
+ }
33
+ const nftItems = nftResponse.items;
34
+
35
+ // eslint-disable-next-line @typescript-eslint/require-await
36
+ await Promise.all(nftItems.map(async nft => {
37
+ var _NftMetadata$content$;
38
+ const collectionId = nft.collection;
39
+ const collectionName = nft.itemCollection.name;
40
+ const NftMetadata = nft.meta;
41
+ const NFTimageUrl = ((_NftMetadata$content$ = NftMetadata.content[0]) === null || _NftMetadata$content$ === void 0 ? void 0 : _NftMetadata$content$.url) || '';
42
+ const formatCollectionId = collectionId.replace(/^RARI:/, '');
43
+ const parsedNft = {
44
+ id: nft.tokenId,
45
+ name: NftMetadata.name,
46
+ description: NftMetadata.description || '',
47
+ image: NFTimageUrl,
48
+ collectionId: formatCollectionId,
49
+ chain: this.chain,
50
+ owner: address
51
+ };
52
+ params.updateItem(this.chain, parsedNft, address);
53
+ if (!collectionMap.has(formatCollectionId)) {
54
+ collectionMap.set(formatCollectionId, collectionName);
55
+ }
56
+ }));
57
+ }));
58
+ if (i + size < this.addresses.length) {
59
+ await this.wait(waitTime);
60
+ }
61
+ }
62
+ for (const [formatCollectionId, collectionName] of collectionMap.entries()) {
63
+ const parsedCollection = {
64
+ collectionId: formatCollectionId,
65
+ chain: this.chain,
66
+ collectionName,
67
+ image: ''
68
+ };
69
+ params.updateCollection(this.chain, parsedCollection);
70
+ }
71
+ }
72
+ async fetchNfts(params) {
73
+ try {
74
+ await this.handleNfts(params);
75
+ } catch (e) {
76
+ return 0;
77
+ }
78
+ return 1;
79
+ }
80
+ }
@@ -5,7 +5,7 @@ import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
5
5
  import { _getAssetDecimals } from '@subwallet/extension-base/services/chain-service/utils';
6
6
  import { BN_TEN } from '@subwallet/extension-base/utils';
7
7
  import BigN from 'bignumber.js';
8
- export const YIELD_EXTRINSIC_TYPES = [ExtrinsicType.MINT_VDOT, ExtrinsicType.MINT_LDOT, ExtrinsicType.MINT_SDOT, ExtrinsicType.MINT_QDOT, ExtrinsicType.MINT_STDOT, ExtrinsicType.REDEEM_QDOT, ExtrinsicType.REDEEM_SDOT, ExtrinsicType.REDEEM_VDOT, ExtrinsicType.REDEEM_LDOT, ExtrinsicType.REDEEM_STDOT, ExtrinsicType.STAKING_JOIN_POOL, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.STAKING_LEAVE_POOL, ExtrinsicType.STAKING_POOL_WITHDRAW];
8
+ export const YIELD_EXTRINSIC_TYPES = [ExtrinsicType.MINT_VDOT, ExtrinsicType.MINT_LDOT, ExtrinsicType.MINT_SDOT, ExtrinsicType.MINT_QDOT, ExtrinsicType.MINT_STDOT, ExtrinsicType.REDEEM_QDOT, ExtrinsicType.REDEEM_SDOT, ExtrinsicType.REDEEM_VDOT, ExtrinsicType.REDEEM_LDOT, ExtrinsicType.REDEEM_STDOT, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.STAKING_LEAVE_POOL];
9
9
  export const YIELD_POOL_STAT_REFRESH_INTERVAL = 90000;
10
10
  export function convertDerivativeToOriginToken(amount, poolInfo, derivativeTokenInfo, originTokenInfo) {
11
11
  var _poolInfo$statistic, _poolInfo$statistic$a;
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.3.4-0",
20
+ "version": "1.3.6-0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -390,6 +390,11 @@
390
390
  "require": "./cjs/koni/api/nft/quartz_nft/protobuf.js",
391
391
  "default": "./koni/api/nft/quartz_nft/protobuf.js"
392
392
  },
393
+ "./koni/api/nft/rari": {
394
+ "types": "./koni/api/nft/rari/index.d.ts",
395
+ "require": "./cjs/koni/api/nft/rari/index.js",
396
+ "default": "./koni/api/nft/rari/index.js"
397
+ },
393
398
  "./koni/api/nft/rmrk_nft": {
394
399
  "types": "./koni/api/nft/rmrk_nft/index.d.ts",
395
400
  "require": "./cjs/koni/api/nft/rmrk_nft/index.js",
@@ -2429,11 +2434,11 @@
2429
2434
  "@reduxjs/toolkit": "^1.9.1",
2430
2435
  "@sora-substrate/type-definitions": "^1.17.7",
2431
2436
  "@substrate/connect": "^0.8.9",
2432
- "@subwallet/chain-list": "0.2.91",
2433
- "@subwallet/extension-base": "^1.3.4-0",
2434
- "@subwallet/extension-chains": "^1.3.4-0",
2435
- "@subwallet/extension-dapp": "^1.3.4-0",
2436
- "@subwallet/extension-inject": "^1.3.4-0",
2437
+ "@subwallet/chain-list": "0.2.93",
2438
+ "@subwallet/extension-base": "^1.3.6-0",
2439
+ "@subwallet/extension-chains": "^1.3.6-0",
2440
+ "@subwallet/extension-dapp": "^1.3.6-0",
2441
+ "@subwallet/extension-inject": "^1.3.6-0",
2437
2442
  "@subwallet/keyring": "^0.1.8-beta.0",
2438
2443
  "@subwallet/ui-keyring": "^0.1.8-beta.0",
2439
2444
  "@ton/core": "^0.56.3",
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.3.4-0'
10
+ version: '1.3.6-0'
11
11
  };
@@ -124,6 +124,11 @@ export function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _cha
124
124
  tonApi
125
125
  });
126
126
  }
127
+
128
+ // If the chain is not ready, return pending state
129
+ if (!substrateApiMap[chainSlug].isApiReady) {
130
+ handleUnsupportedOrPendingAddresses(useAddresses, chainSlug, chainAssetMap, APIItemState.PENDING, callback);
131
+ }
127
132
  const substrateApi = await substrateApiMap[chainSlug].isReady;
128
133
  return subscribeSubstrateBalance(useAddresses, chainInfo, chainAssetMap, substrateApi, evmApi, callback, extrinsicType);
129
134
  });
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { BalanceError } from '@subwallet/extension-base/background/errors/BalanceError';
5
- import { BalanceErrorType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
5
+ import { APIItemState, BalanceErrorType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
6
6
  import { ALL_ACCOUNT_KEY } from '@subwallet/extension-base/constants';
7
7
  import { _isXcmWithinSameConsensus } from '@subwallet/extension-base/core/substrate/xcm-parser';
8
8
  import { getDefaultTransferProcess, getSnowbridgeTransferProcessFromEvm } from '@subwallet/extension-base/services/balance-service/helpers/process';
@@ -193,7 +193,7 @@ export class BalanceService {
193
193
  let unsub = noop;
194
194
  unsub = subscribeBalance([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, result => {
195
195
  const rs = result[0];
196
- if (rs.tokenSlug === tSlug) {
196
+ if (rs.tokenSlug === tSlug && rs.state !== APIItemState.PENDING) {
197
197
  hasError = false;
198
198
  const balance = {
199
199
  value: rs.free,
@@ -37,6 +37,7 @@ export declare const _NFT_CHAIN_GROUP: {
37
37
  vara: string[];
38
38
  avail: string[];
39
39
  ternoa: string[];
40
+ rari: string[];
40
41
  };
41
42
  export declare const _STAKING_ERA_LENGTH_MAP: Record<string, number>;
42
43
  export declare const _EXPECTED_BLOCK_TIME: Record<string, number>;
@@ -52,7 +52,8 @@ export const _NFT_CHAIN_GROUP = {
52
52
  bitcountry: ['bitcountry', 'pioneer', 'continuum_network'],
53
53
  vara: ['vara_network'],
54
54
  avail: ['avail_mainnet'],
55
- ternoa: ['ternoa', 'ternoa_alphanet']
55
+ ternoa: ['ternoa', 'ternoa_alphanet'],
56
+ rari: ['rari']
56
57
  };
57
58
 
58
59
  // Staking--------------------------------------------------------------------------------------------------------------
@@ -110,7 +110,6 @@ export class EvmChainHandler extends AbstractChainHandler {
110
110
  const evmApi = this.getEvmApiByChain(originChain);
111
111
  try {
112
112
  if (tokenType === _AssetType.ERC721) {
113
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access
114
113
  tokenContract = new evmApi.api.eth.Contract(_ERC721_ABI, contractAddress);
115
114
  const [_name, _symbol] = await Promise.all([
116
115
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
@@ -120,7 +119,6 @@ export class EvmChainHandler extends AbstractChainHandler {
120
119
  name = _name;
121
120
  symbol = _symbol;
122
121
  } else {
123
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access
124
122
  tokenContract = new evmApi.api.eth.Contract(_ERC20_ABI, contractAddress);
125
123
  const [_decimals, _symbol, _name] = await Promise.all([
126
124
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
@@ -17,8 +17,7 @@ export declare class SubstrateChainHandler extends AbstractChainHandler {
17
17
  getChainSpec(substrateApi: _SubstrateApi): Promise<_SubstrateChainSpec>;
18
18
  private getPsp22TokenInfo;
19
19
  private getPsp34TokenInfo;
20
- private getGrc20TokenInfo;
21
- private getVftTokenInfo;
20
+ private getVaraFungibleTokenInfo;
22
21
  private getLocalTokenInfo;
23
22
  getSubstrateContractTokenInfo(contractAddress: string, tokenType: _AssetType, originChain: string, contractCaller?: string): Promise<_SmartContractTokenInfo>;
24
23
  getSubstrateAssetIdTokenInfo(assetId: string, originChain: string): Promise<_SmartContractTokenInfo>;
@@ -107,6 +107,12 @@ export class SubstrateChainHandler extends AbstractChainHandler {
107
107
  }
108
108
  async getPsp22TokenInfo(apiPromise, contractAddress, contractCaller) {
109
109
  const tokenContract = new ContractPromise(apiPromise, _PSP22_ABI, contractAddress);
110
+ const tokenSmartContract = {
111
+ name: '',
112
+ decimals: -1,
113
+ symbol: '',
114
+ contractError: false
115
+ };
110
116
  const [nameResp, symbolResp, decimalsResp] = await Promise.all([tokenContract.query['psp22Metadata::tokenName'](contractCaller || contractAddress, {
111
117
  gasLimit: getDefaultWeightV2(apiPromise)
112
118
  }),
@@ -117,67 +123,72 @@ export class SubstrateChainHandler extends AbstractChainHandler {
117
123
  gasLimit: getDefaultWeightV2(apiPromise)
118
124
  })]);
119
125
  if (!(nameResp.result.isOk && symbolResp.result.isOk && decimalsResp.result.isOk) || !nameResp.output || !decimalsResp.output || !symbolResp.output) {
120
- return ['', 1, '', true];
126
+ tokenSmartContract.contractError = true;
127
+ return tokenSmartContract;
121
128
  } else {
122
129
  var _symbolResp$output, _decimalsResp$output, _nameResp$output;
123
- let contractError = false;
124
130
  const symbolObj = (_symbolResp$output = symbolResp.output) === null || _symbolResp$output === void 0 ? void 0 : _symbolResp$output.toHuman();
125
131
  const decimalsObj = (_decimalsResp$output = decimalsResp.output) === null || _decimalsResp$output === void 0 ? void 0 : _decimalsResp$output.toHuman();
126
132
  const nameObj = (_nameResp$output = nameResp.output) === null || _nameResp$output === void 0 ? void 0 : _nameResp$output.toHuman();
127
- const name = nameResp.output ? nameObj.Ok || nameObj.ok : '';
128
- const decimals = decimalsResp.output ? new BN(decimalsObj.Ok || decimalsObj.ok).toNumber() : 0;
129
- const symbol = decimalsResp.output ? symbolObj.Ok || symbolObj.ok : '';
130
- if (!name || !symbol || typeof name === 'object' || typeof symbol === 'object') {
131
- contractError = true;
133
+ tokenSmartContract.name = nameResp.output ? nameObj.Ok || nameObj.ok : '';
134
+ tokenSmartContract.decimals = decimalsResp.output ? new BN(decimalsObj.Ok || decimalsObj.ok).toNumber() : 0;
135
+ tokenSmartContract.symbol = decimalsResp.output ? symbolObj.Ok || symbolObj.ok : '';
136
+ if (!tokenSmartContract.name || !tokenSmartContract.symbol || typeof tokenSmartContract.name === 'object' || typeof tokenSmartContract.symbol === 'object') {
137
+ tokenSmartContract.contractError = true;
132
138
  }
133
- return [name, decimals, symbol, contractError];
139
+ return tokenSmartContract;
134
140
  }
135
141
  }
136
142
  async getPsp34TokenInfo(apiPromise, contractAddress, contractCaller) {
137
143
  const tokenContract = new ContractPromise(apiPromise, _PSP34_ABI, contractAddress);
144
+ const tokenSmartContract = {
145
+ name: '',
146
+ decimals: -1,
147
+ symbol: '',
148
+ contractError: false
149
+ };
138
150
  const collectionIdResp = await tokenContract.query['psp34::collectionId'](contractCaller || contractAddress, {
139
151
  gasLimit: getDefaultWeightV2(apiPromise)
140
152
  }); // read-only operation so no gas limit
141
153
 
142
154
  if (!collectionIdResp.result.isOk || !collectionIdResp.output) {
143
- return ['', -1, '', true];
155
+ tokenSmartContract.contractError = true;
156
+ return tokenSmartContract;
144
157
  } else {
145
158
  var _collectionIdResp$out;
146
- let contractError = false;
147
159
  const collectionIdDict = (_collectionIdResp$out = collectionIdResp.output) === null || _collectionIdResp$out === void 0 ? void 0 : _collectionIdResp$out.toHuman();
148
160
  if (collectionIdDict.Bytes === '') {
149
- contractError = true;
161
+ tokenSmartContract.contractError = true;
150
162
  }
151
- return ['', -1, '', contractError];
152
- }
153
- }
154
- async getGrc20TokenInfo(apiPromise, contractAddress) {
155
- if (!(apiPromise instanceof GearApi)) {
156
- console.warn('Cannot subscribe GRC20 balance without GearApi instance');
157
- return ['', -1, '', true];
158
- }
159
- let contractError = false;
160
- const tokenContract = getGRC20ContractPromise(apiPromise, contractAddress);
161
- const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(GEAR_DEFAULT_ADDRESS)]);
162
- const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
163
- if (!nameRes || !symbolRes) {
164
- contractError = true;
163
+ return tokenSmartContract;
165
164
  }
166
- return [nameRes, decimals, symbolRes, contractError];
167
165
  }
168
- async getVftTokenInfo(apiPromise, contractAddress) {
166
+ async getVaraFungibleTokenInfo(apiPromise, contractAddress, tokenType) {
167
+ const tokenSmartContract = {
168
+ name: '',
169
+ decimals: -1,
170
+ symbol: '',
171
+ contractError: false
172
+ };
169
173
  if (!(apiPromise instanceof GearApi)) {
170
- console.warn('Cannot subscribe VFT balance without GearApi instance');
171
- return ['', -1, '', true];
174
+ if (tokenType === _AssetType.GRC20) {
175
+ console.warn('Cannot subscribe GRC20 balance without GearApi instance');
176
+ } else if (tokenType === _AssetType.VFT) {
177
+ console.warn('Cannot subscribe VFT balance without GearApi instance');
178
+ }
179
+ tokenSmartContract.contractError = true;
180
+ return tokenSmartContract;
172
181
  }
173
- let contractError = false;
174
- const tokenContract = getVFTContractPromise(apiPromise, contractAddress);
182
+ const tokenContract = tokenType === _AssetType.GRC20 ? getGRC20ContractPromise(apiPromise, contractAddress) : getVFTContractPromise(apiPromise, contractAddress);
175
183
  const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(GEAR_DEFAULT_ADDRESS)]);
176
- const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
184
+ const decimals = parseInt(decimalsRes.toString());
185
+ tokenSmartContract.name = nameRes;
186
+ tokenSmartContract.decimals = decimals;
187
+ tokenSmartContract.symbol = symbolRes;
177
188
  if (!nameRes || !symbolRes) {
178
- contractError = true;
189
+ tokenSmartContract.contractError = true;
179
190
  }
180
- return [nameRes, decimals, symbolRes, contractError];
191
+ return tokenSmartContract;
181
192
  }
182
193
  async getLocalTokenInfo(apiPromise, assetId) {
183
194
  const _metadata = await apiPromise.query.assets.metadata(assetId);
@@ -191,40 +202,33 @@ export class SubstrateChainHandler extends AbstractChainHandler {
191
202
  async getSubstrateContractTokenInfo(contractAddress, tokenType, originChain, contractCaller) {
192
203
  // todo: improve this funtion later
193
204
 
194
- let name = '';
195
- let decimals = -1;
196
- let symbol = '';
197
- let contractError = false;
205
+ let tokenSmartContract = {
206
+ name: '',
207
+ decimals: -1,
208
+ symbol: '',
209
+ contractError: false
210
+ };
198
211
  const apiPromise = this.getSubstrateApiByChain(originChain).api;
199
212
  try {
200
213
  switch (tokenType) {
201
214
  case _AssetType.PSP22:
202
- [name, decimals, symbol, contractError] = await this.getPsp22TokenInfo(apiPromise, contractAddress, contractCaller);
215
+ tokenSmartContract = await this.getPsp22TokenInfo(apiPromise, contractAddress, contractCaller);
203
216
  break;
204
217
  case _AssetType.PSP34:
205
- [name, decimals, symbol, contractError] = await this.getPsp34TokenInfo(apiPromise, contractAddress, contractCaller);
218
+ tokenSmartContract = await this.getPsp34TokenInfo(apiPromise, contractAddress, contractCaller);
206
219
  break;
207
220
  case _AssetType.GRC20:
208
- [name, decimals, symbol, contractError] = await this.getGrc20TokenInfo(apiPromise, contractAddress);
221
+ tokenSmartContract = await this.getVaraFungibleTokenInfo(apiPromise, contractAddress, tokenType);
209
222
  break;
210
223
  case _AssetType.VFT:
211
- [name, decimals, symbol, contractError] = await this.getVftTokenInfo(apiPromise, contractAddress);
224
+ tokenSmartContract = await this.getVaraFungibleTokenInfo(apiPromise, contractAddress, tokenType);
212
225
  break;
213
226
  }
214
- return {
215
- name,
216
- decimals,
217
- symbol,
218
- contractError
219
- };
227
+ return tokenSmartContract;
220
228
  } catch (e) {
221
229
  this.logger.error(e);
222
- return {
223
- name: '',
224
- decimals: -1,
225
- symbol: '',
226
- contractError: true
227
- };
230
+ tokenSmartContract.contractError = true;
231
+ return tokenSmartContract;
228
232
  }
229
233
  }
230
234
  async getSubstrateAssetIdTokenInfo(assetId, originChain) {
@@ -448,7 +448,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
448
448
  } else {
449
449
  extrinsic = chainApi.api.tx.parachainStaking.leaveDelegators();
450
450
  }
451
- return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
451
+ return [ExtrinsicType.STAKING_UNBOND, extrinsic];
452
452
  }
453
453
 
454
454
  /* Leave pool action */
@@ -399,7 +399,7 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
399
399
  Wasm: selectedTarget
400
400
  };
401
401
  const extrinsic = chainApi.api.tx.dappsStaking.unbondAndUnstake(dappParam, binaryAmount);
402
- return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
402
+ return [ExtrinsicType.STAKING_UNBOND, extrinsic];
403
403
  }
404
404
 
405
405
  /* Leave pool action */
@@ -472,7 +472,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
472
472
  } else {
473
473
  extrinsic = apiPromise.api.tx.parachainStaking.scheduleRevokeDelegation(selectedTarget);
474
474
  }
475
- return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
475
+ return [ExtrinsicType.STAKING_UNBOND, extrinsic];
476
476
  }
477
477
 
478
478
  /* Leave pool action */
@@ -634,7 +634,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
634
634
  } else {
635
635
  extrinsic = chainApi.api.tx.staking.unbond(binaryAmount);
636
636
  }
637
- return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
637
+ return [ExtrinsicType.STAKING_UNBOND, extrinsic];
638
638
  }
639
639
 
640
640
  /* Leave pool action */
@@ -375,7 +375,7 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
375
375
  return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS));
376
376
  }
377
377
  const extrinsic = apiPromise.api.tx.subtensorModule.removeStake(selectedTarget, binaryAmount);
378
- return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
378
+ return [ExtrinsicType.STAKING_UNBOND, extrinsic];
379
379
  }
380
380
 
381
381
  /* Leave pool action */
@@ -472,21 +472,18 @@ export default class NominationPoolHandler extends BasePoolHandler {
472
472
  const data = _data;
473
473
  const {
474
474
  address,
475
- amount,
476
- selectedPool
475
+ amount
477
476
  } = data;
478
477
  const positionInfo = await this.getPoolPosition(address);
479
478
  const [extrinsic] = await this.createJoinExtrinsic(data, positionInfo);
480
479
  const joinPoolData = {
481
- poolPosition: positionInfo,
482
- slug: this.slug,
483
- selectedPool,
484
- amount,
485
- address
480
+ path,
481
+ data: data,
482
+ currentStep
486
483
  };
487
484
  return {
488
485
  txChain: this.chain,
489
- extrinsicType: ExtrinsicType.STAKING_JOIN_POOL,
486
+ extrinsicType: ExtrinsicType.JOIN_YIELD_POOL,
490
487
  extrinsic,
491
488
  txData: joinPoolData,
492
489
  transferNativeAmount: amount,
@@ -364,14 +364,15 @@ export default class TransactionService {
364
364
  };
365
365
  }
366
366
  break;
367
- case ExtrinsicType.STAKING_JOIN_POOL:
367
+ case ExtrinsicType.JOIN_YIELD_POOL:
368
368
  {
369
369
  const data = parseTransactionData(transaction.data);
370
+ const poolData = data.data;
370
371
  historyItem.amount = {
371
372
  ...baseNativeAmount,
372
- value: data.amount || '0'
373
+ value: poolData.amount || '0'
373
374
  };
374
- historyItem.to = data.selectedPool.name || data.selectedPool.id.toString();
375
+ historyItem.to = poolData.selectedPool.name || poolData.selectedPool.id.toString();
375
376
  }
376
377
  break;
377
378
  case ExtrinsicType.STAKING_UNBOND:
@@ -682,7 +683,7 @@ export default class TransactionService {
682
683
  } catch (e) {
683
684
  console.error(e);
684
685
  }
685
- } else if ([ExtrinsicType.STAKING_BOND, ExtrinsicType.STAKING_UNBOND, ExtrinsicType.STAKING_WITHDRAW, ExtrinsicType.STAKING_CANCEL_UNSTAKE, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.STAKING_JOIN_POOL, ExtrinsicType.STAKING_POOL_WITHDRAW, ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) {
686
+ } else if ([ExtrinsicType.STAKING_BOND, ExtrinsicType.STAKING_UNBOND, ExtrinsicType.STAKING_WITHDRAW, ExtrinsicType.STAKING_CANCEL_UNSTAKE, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) {
686
687
  this.state.eventService.emit('transaction.submitStaking', transaction.chain);
687
688
  } else if (transaction.extrinsicType === ExtrinsicType.SWAP) {
688
689
  const inputData = parseTransactionData(transaction.data);
@@ -28,6 +28,9 @@ function getBlockExplorerAccountRoute(explorerLink) {
28
28
  if (explorerLink.includes('invarch.statescan.io')) {
29
29
  return '#/accounts';
30
30
  }
31
+ if (explorerLink.includes('tangle.statescan.io')) {
32
+ return '#/accounts';
33
+ }
31
34
  if (explorerLink.includes('explorer.zkverify.io')) {
32
35
  return 'account';
33
36
  }