@subwallet/extension-base 1.3.29-1 → 1.3.31-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 (142) hide show
  1. package/background/KoniTypes.d.ts +16 -4
  2. package/background/errors/SwapError.js +1 -1
  3. package/cjs/background/errors/SwapError.js +1 -1
  4. package/cjs/constants/blocked-actions.js +2 -2
  5. package/cjs/constants/paraspell-chain-map.js +13 -0
  6. package/cjs/constants/remind-notification-time.js +3 -3
  7. package/cjs/core/logic-validation/swap.js +63 -4
  8. package/cjs/core/logic-validation/transfer.js +13 -1
  9. package/cjs/core/substrate/xcm-parser.js +5 -1
  10. package/cjs/core/utils.js +36 -15
  11. package/cjs/koni/background/handlers/Extension.js +141 -172
  12. package/cjs/koni/background/handlers/State.js +8 -1
  13. package/cjs/packageInfo.js +1 -1
  14. package/cjs/services/balance-service/helpers/process.js +27 -0
  15. package/cjs/services/balance-service/index.js +9 -0
  16. package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +229 -0
  17. package/cjs/services/balance-service/transfer/xcm/availBridge.js +6 -6
  18. package/cjs/services/balance-service/transfer/xcm/index.js +96 -7
  19. package/cjs/services/balance-service/transfer/xcm/utils.js +213 -0
  20. package/cjs/services/chain-service/constants.js +2 -4
  21. package/cjs/services/chain-service/index.js +71 -17
  22. package/cjs/services/chain-service/utils/patch.js +1 -1
  23. package/cjs/services/earning-service/handlers/base.js +6 -3
  24. package/cjs/services/earning-service/handlers/native-staking/base.js +4 -1
  25. package/cjs/services/earning-service/handlers/native-staking/dtao.js +68 -50
  26. package/cjs/services/earning-service/handlers/native-staking/tao.js +12 -2
  27. package/cjs/services/earning-service/handlers/special.js +18 -9
  28. package/cjs/services/earning-service/service.js +2 -1
  29. package/cjs/services/fee-service/utils/index.js +16 -4
  30. package/cjs/services/inapp-notification-service/index.js +19 -13
  31. package/cjs/services/keyring-service/context/handlers/Ledger.js +1 -1
  32. package/cjs/services/keyring-service/context/state.js +3 -0
  33. package/cjs/services/migration-service/scripts/DisableZeroBalanceTokens.js +60 -0
  34. package/cjs/services/migration-service/scripts/EnableChain.js +1 -1
  35. package/cjs/services/migration-service/scripts/index.js +3 -2
  36. package/cjs/services/swap-service/handler/asset-hub/handler.js +61 -314
  37. package/cjs/services/swap-service/handler/base-handler.js +406 -231
  38. package/cjs/services/swap-service/handler/chainflip-handler.js +18 -40
  39. package/cjs/services/swap-service/handler/hydradx-handler.js +77 -269
  40. package/cjs/services/swap-service/handler/simpleswap-handler.js +27 -48
  41. package/cjs/services/swap-service/handler/uniswap-handler.js +33 -54
  42. package/cjs/services/swap-service/index.js +154 -143
  43. package/cjs/services/swap-service/utils.js +107 -17
  44. package/cjs/services/transaction-service/index.js +1 -1
  45. package/cjs/services/transaction-service/utils.js +38 -14
  46. package/cjs/types/swap/index.js +13 -1
  47. package/cjs/utils/fee/transfer.js +52 -28
  48. package/cjs/utils/staticData/index.js +7 -2
  49. package/cjs/utils/swap.js +5 -1
  50. package/constants/blocked-actions.d.ts +1 -1
  51. package/constants/blocked-actions.js +1 -1
  52. package/constants/paraspell-chain-map.d.ts +1 -0
  53. package/constants/paraspell-chain-map.js +7 -0
  54. package/constants/remind-notification-time.d.ts +1 -1
  55. package/constants/remind-notification-time.js +1 -1
  56. package/core/logic-validation/swap.d.ts +15 -0
  57. package/core/logic-validation/swap.js +60 -4
  58. package/core/logic-validation/transfer.d.ts +1 -0
  59. package/core/logic-validation/transfer.js +12 -1
  60. package/core/substrate/xcm-parser.d.ts +1 -0
  61. package/core/substrate/xcm-parser.js +4 -1
  62. package/core/utils.d.ts +2 -2
  63. package/core/utils.js +36 -15
  64. package/koni/background/handlers/Extension.d.ts +1 -1
  65. package/koni/background/handlers/Extension.js +66 -98
  66. package/koni/background/handlers/State.d.ts +1 -0
  67. package/koni/background/handlers/State.js +7 -1
  68. package/package.json +23 -13
  69. package/packageInfo.js +1 -1
  70. package/services/balance-service/helpers/process.d.ts +2 -1
  71. package/services/balance-service/helpers/process.js +26 -0
  72. package/services/balance-service/index.js +11 -2
  73. package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +15 -0
  74. package/services/balance-service/transfer/xcm/acrossBridge/index.js +216 -0
  75. package/services/balance-service/transfer/xcm/availBridge.js +6 -6
  76. package/services/balance-service/transfer/xcm/index.d.ts +5 -1
  77. package/services/balance-service/transfer/xcm/index.js +85 -1
  78. package/services/balance-service/transfer/xcm/utils.d.ts +11 -0
  79. package/services/balance-service/transfer/xcm/utils.js +208 -0
  80. package/services/base/types.d.ts +0 -4
  81. package/services/chain-service/constants.d.ts +0 -1
  82. package/services/chain-service/constants.js +1 -2
  83. package/services/chain-service/index.d.ts +9 -2
  84. package/services/chain-service/index.js +72 -18
  85. package/services/chain-service/utils/patch.js +1 -1
  86. package/services/earning-service/handlers/base.d.ts +4 -3
  87. package/services/earning-service/handlers/base.js +6 -4
  88. package/services/earning-service/handlers/native-staking/base.js +4 -1
  89. package/services/earning-service/handlers/native-staking/dtao.d.ts +9 -6
  90. package/services/earning-service/handlers/native-staking/dtao.js +69 -48
  91. package/services/earning-service/handlers/native-staking/tao.js +12 -2
  92. package/services/earning-service/handlers/special.js +19 -10
  93. package/services/earning-service/service.d.ts +2 -1
  94. package/services/earning-service/service.js +2 -1
  95. package/services/fee-service/utils/index.d.ts +1 -0
  96. package/services/fee-service/utils/index.js +14 -4
  97. package/services/inapp-notification-service/index.js +13 -7
  98. package/services/keyring-service/context/handlers/Ledger.js +1 -1
  99. package/services/keyring-service/context/state.d.ts +1 -0
  100. package/services/keyring-service/context/state.js +3 -0
  101. package/services/migration-service/scripts/DisableZeroBalanceTokens.d.ts +4 -0
  102. package/services/migration-service/scripts/DisableZeroBalanceTokens.js +51 -0
  103. package/services/migration-service/scripts/EnableChain.js +1 -1
  104. package/services/migration-service/scripts/index.js +3 -2
  105. package/services/swap-service/handler/asset-hub/handler.d.ts +2 -9
  106. package/services/swap-service/handler/asset-hub/handler.js +64 -317
  107. package/services/swap-service/handler/base-handler.d.ts +6 -9
  108. package/services/swap-service/handler/base-handler.js +405 -230
  109. package/services/swap-service/handler/chainflip-handler.d.ts +2 -4
  110. package/services/swap-service/handler/chainflip-handler.js +15 -37
  111. package/services/swap-service/handler/hydradx-handler.d.ts +3 -10
  112. package/services/swap-service/handler/hydradx-handler.js +78 -270
  113. package/services/swap-service/handler/simpleswap-handler.d.ts +2 -4
  114. package/services/swap-service/handler/simpleswap-handler.js +24 -45
  115. package/services/swap-service/handler/uniswap-handler.d.ts +4 -6
  116. package/services/swap-service/handler/uniswap-handler.js +25 -46
  117. package/services/swap-service/index.d.ts +8 -14
  118. package/services/swap-service/index.js +141 -129
  119. package/services/swap-service/utils.d.ts +11 -3
  120. package/services/swap-service/utils.js +96 -15
  121. package/services/transaction-service/index.js +2 -2
  122. package/services/transaction-service/types.d.ts +3 -2
  123. package/services/transaction-service/utils.d.ts +1 -0
  124. package/services/transaction-service/utils.js +38 -15
  125. package/types/balance/transfer.d.ts +1 -0
  126. package/types/service-base.d.ts +2 -3
  127. package/types/swap/index.d.ts +25 -9
  128. package/types/swap/index.js +10 -0
  129. package/types/transaction/process.d.ts +19 -0
  130. package/types/transaction/request.d.ts +7 -0
  131. package/types/yield/actions/join/submit.d.ts +4 -1
  132. package/types/yield/actions/others.d.ts +2 -0
  133. package/utils/fee/transfer.d.ts +1 -0
  134. package/utils/fee/transfer.js +54 -30
  135. package/utils/staticData/index.d.ts +4 -1
  136. package/utils/staticData/index.js +5 -1
  137. package/utils/staticData/paraSpellChainMap.json +1 -0
  138. package/utils/swap.d.ts +3 -0
  139. package/utils/swap.js +3 -0
  140. package/cjs/services/swap-service/interface.js +0 -14
  141. package/services/swap-service/interface.d.ts +0 -9
  142. package/services/swap-service/interface.js +0 -8
@@ -4,11 +4,224 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.STABLE_XCM_VERSION = void 0;
7
+ exports.buildXcm = buildXcm;
8
+ exports.dryRunXcm = dryRunXcm;
9
+ exports.dryRunXcmV2 = dryRunXcmV2;
10
+ exports.isChainNotSupportDryRun = isChainNotSupportDryRun;
11
+ exports.isChainNotSupportPolkadotApi = isChainNotSupportPolkadotApi;
7
12
  exports.isUseTeleportProtocol = isUseTeleportProtocol;
13
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
14
+ var _paraspellChainMap = require("@subwallet/extension-base/constants/paraspell-chain-map");
15
+ var _types = require("@subwallet/extension-base/types");
16
+ var _util = require("@polkadot/util");
8
17
  // Copyright 2019-2022 @subwallet/extension-base
9
18
  // SPDX-License-Identifier: Apache-2.0
10
19
 
20
+ const paraSpellEndpoint = 'https://api.lightspell.xyz';
21
+ const paraSpellApi = {
22
+ buildXcm: `${paraSpellEndpoint}/x-transfer`,
23
+ dryRunXcm: `${paraSpellEndpoint}/dry-run`
24
+ };
25
+ const paraSpellKey = process.env.PARASPELL_API_KEY || '';
26
+ function txHexToSubmittableExtrinsic(api, hex) {
27
+ try {
28
+ (0, _util.assert)((0, _util.isHex)(hex), 'Expected a hex-encoded call');
29
+ let extrinsicCall;
30
+ let extrinsicPayload = null;
31
+ let decoded = null;
32
+ try {
33
+ // attempt to decode with api.tx
34
+ const tx = api.tx(hex);
35
+
36
+ // ensure that the full data matches here
37
+ (0, _util.assert)(tx.toHex() === hex, 'Cannot decode data as extrinsic, length mismatch');
38
+ decoded = tx;
39
+ extrinsicCall = api.createType('Call', decoded.method);
40
+ } catch {
41
+ try {
42
+ // attempt to decode as Call
43
+ extrinsicCall = api.createType('Call', hex);
44
+ const callHex = extrinsicCall.toHex();
45
+ if (callHex === hex) {
46
+ // ok
47
+ } else if (hex.startsWith(callHex)) {
48
+ // this could be an un-prefixed payload...
49
+ const prefixed = (0, _util.u8aConcat)((0, _util.compactToU8a)(extrinsicCall.encodedLength), hex);
50
+ extrinsicPayload = api.createType('ExtrinsicPayload', prefixed);
51
+ (0, _util.assert)((0, _util.u8aEq)(extrinsicPayload.toU8a(), prefixed), 'Unable to decode data as un-prefixed ExtrinsicPayload');
52
+ extrinsicCall = api.createType('Call', extrinsicPayload.method.toHex());
53
+ } else {
54
+ console.error('Unable to decode data as Call, length mismatch in supplied data');
55
+ }
56
+ } catch {
57
+ // final attempt, we try this as-is as a (prefixed) payload
58
+ extrinsicPayload = api.createType('ExtrinsicPayload', hex);
59
+ (0, _util.assert)(extrinsicPayload.toHex() === hex, 'Unable to decode input data as Call, Extrinsic or ExtrinsicPayload');
60
+ extrinsicCall = api.createType('Call', extrinsicPayload.method.toHex());
61
+ }
62
+ }
63
+ const {
64
+ method,
65
+ section
66
+ } = api.registry.findMetaCall(extrinsicCall.callIndex);
67
+ const extrinsicFn = api.tx[section][method];
68
+ if (!decoded) {
69
+ decoded = extrinsicFn(...extrinsicCall.args);
70
+ }
71
+ return decoded;
72
+ } catch (e) {
73
+ console.error('Failed to decode extrinsic hex', e);
74
+ throw new Error('Failed to decode extrinsic hex');
75
+ }
76
+ }
77
+ async function buildXcm(request) {
78
+ var _originTokenInfo$meta, _originTokenInfo$meta2;
79
+ const {
80
+ destinationChain,
81
+ originChain,
82
+ originTokenInfo,
83
+ recipient,
84
+ sendingValue,
85
+ substrateApi
86
+ } = request;
87
+ if (!substrateApi) {
88
+ return Promise.reject(new Error('Substrate API is not available'));
89
+ }
90
+ const psAssetType = (_originTokenInfo$meta = originTokenInfo.metadata) === null || _originTokenInfo$meta === void 0 ? void 0 : _originTokenInfo$meta.paraSpellAssetType;
91
+ const psAssetValue = (_originTokenInfo$meta2 = originTokenInfo.metadata) === null || _originTokenInfo$meta2 === void 0 ? void 0 : _originTokenInfo$meta2.paraSpellValue;
92
+ if (!psAssetType || !psAssetValue) {
93
+ throw new Error('Token is not support XCM at this time');
94
+ }
95
+ const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
96
+ const bodyData = {
97
+ address: recipient,
98
+ from: paraSpellChainMap[originChain.slug],
99
+ to: paraSpellChainMap[destinationChain.slug],
100
+ currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
101
+ };
102
+ const response = await fetch(paraSpellApi.buildXcm, {
103
+ method: 'POST',
104
+ body: JSON.stringify(bodyData),
105
+ headers: {
106
+ 'Content-Type': 'application/json',
107
+ Accept: 'application/json',
108
+ 'X-API-KEY': paraSpellKey
109
+ }
110
+ });
111
+ if (!response.ok) {
112
+ const error = await response.json();
113
+ throw new Error(error.message);
114
+ }
115
+ const extrinsicHex = await response.text();
116
+ const chainApi = await substrateApi.isReady;
117
+ return txHexToSubmittableExtrinsic(chainApi.api, extrinsicHex);
118
+ }
119
+
120
+ // dry run can fail due to sender address & amount token
121
+ async function dryRunXcm(request) {
122
+ var _originTokenInfo$meta3, _originTokenInfo$meta4;
123
+ const {
124
+ destinationChain,
125
+ originChain,
126
+ originTokenInfo,
127
+ recipient,
128
+ sender,
129
+ sendingValue
130
+ } = request;
131
+ const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
132
+ const psAssetType = (_originTokenInfo$meta3 = originTokenInfo.metadata) === null || _originTokenInfo$meta3 === void 0 ? void 0 : _originTokenInfo$meta3.paraSpellAssetType;
133
+ const psAssetValue = (_originTokenInfo$meta4 = originTokenInfo.metadata) === null || _originTokenInfo$meta4 === void 0 ? void 0 : _originTokenInfo$meta4.paraSpellValue;
134
+ if (!psAssetType || !psAssetValue) {
135
+ throw new Error('Token is not support XCM at this time'); // todo: content
136
+ }
137
+
138
+ let dryRunInfo;
139
+ try {
140
+ const bodyData = {
141
+ senderAddress: sender,
142
+ address: recipient,
143
+ from: paraSpellChainMap[originChain.slug],
144
+ to: paraSpellChainMap[destinationChain.slug],
145
+ currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
146
+ };
147
+ const response = await fetch(paraSpellApi.dryRunXcm, {
148
+ method: 'POST',
149
+ body: JSON.stringify(bodyData),
150
+ headers: {
151
+ 'Content-Type': 'application/json',
152
+ Accept: 'application/json',
153
+ 'X-API-KEY': paraSpellKey
154
+ }
155
+ });
156
+ dryRunInfo = await response.json();
157
+ } catch (e) {
158
+ console.error('Unable to dry run', e);
159
+ }
160
+ if (!dryRunInfo || !dryRunInfo.success) {
161
+ throw new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SEND, 'Unable to perform transaction. Select another token or destination chain and try again');
162
+ }
163
+ return dryRunInfo;
164
+ }
165
+ async function dryRunXcmV2(request) {
166
+ var _originTokenInfo$meta5, _originTokenInfo$meta6;
167
+ const {
168
+ destinationChain,
169
+ originChain,
170
+ originTokenInfo,
171
+ recipient,
172
+ sender,
173
+ sendingValue
174
+ } = request;
175
+ const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
176
+ const psAssetType = (_originTokenInfo$meta5 = originTokenInfo.metadata) === null || _originTokenInfo$meta5 === void 0 ? void 0 : _originTokenInfo$meta5.paraSpellAssetType;
177
+ const psAssetValue = (_originTokenInfo$meta6 = originTokenInfo.metadata) === null || _originTokenInfo$meta6 === void 0 ? void 0 : _originTokenInfo$meta6.paraSpellValue;
178
+ if (!psAssetType || !psAssetValue) {
179
+ throw new Error('Token is not support XCM at this time');
180
+ }
181
+ const bodyData = {
182
+ senderAddress: sender,
183
+ address: recipient,
184
+ from: paraSpellChainMap[originChain.slug],
185
+ to: paraSpellChainMap[destinationChain.slug],
186
+ currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
187
+ };
188
+ const response = await fetch(paraSpellApi.dryRunXcm, {
189
+ method: 'POST',
190
+ body: JSON.stringify(bodyData),
191
+ headers: {
192
+ 'Content-Type': 'application/json',
193
+ Accept: 'application/json',
194
+ 'X-API-KEY': paraSpellKey
195
+ }
196
+ });
197
+ if (!response.ok) {
198
+ const error = await response.json();
199
+ throw new Error(error.message);
200
+ }
201
+ return await response.json();
202
+ }
203
+ function createParaSpellCurrency(assetType, assetValue, amount) {
204
+ // todo: handle complex conditions for asset has same symbol in a chain: Id, Multi-location, ...
205
+ return {
206
+ [assetType]: assetValue,
207
+ amount
208
+ };
209
+ }
210
+ function isChainNotSupportPolkadotApi(str) {
211
+ const regex = /(?=.*not yet supported)(?=.*Polkadot API).*/i; // Example: The node Interlay is not yet supported by the Polkadot API.
212
+
213
+ return regex.test(str);
214
+ }
215
+ function isChainNotSupportDryRun(str) {
216
+ const regex = /(?=.*DryRunApi)(?=.*not available).*/i; // Example: DryRunApi is not available on node Acala
217
+
218
+ return regex.test(str);
219
+ }
220
+
221
+ // todo: remove
11
222
  const STABLE_XCM_VERSION = 3;
223
+
224
+ // todo: remove
12
225
  exports.STABLE_XCM_VERSION = STABLE_XCM_VERSION;
13
226
  function isUseTeleportProtocol(originChainInfo, destChainInfo, tokenSlug) {
14
227
  const relayChainToSystemChain = ['polkadot'].includes(originChainInfo.slug) && ['statemint'].includes(destChainInfo.slug) || ['kusama'].includes(originChainInfo.slug) && ['statemine'].includes(destChainInfo.slug) || ['rococo'].includes(originChainInfo.slug) && ['rococo_assethub'].includes(destChainInfo.slug) || ['westend'].includes(originChainInfo.slug) && ['westend_assethub'].includes(destChainInfo.slug);
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.SUFFICIENT_CHAIN = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
6
+ exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
7
7
  var _chainList = require("@subwallet/chain-list");
8
8
  var _types = require("@subwallet/chain-list/types");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
@@ -40,7 +40,7 @@ const _BALANCE_CHAIN_GROUP = {
40
40
  kintsugi: ['kintsugi', 'interlay', 'kintsugi_test', 'mangatax_para'],
41
41
  genshiro: ['genshiro_testnet', 'genshiro'],
42
42
  equilibrium_parachain: ['equilibrium_parachain'],
43
- bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'hydradx_rococo', 'pendulum', 'amplitude', 'continuum_network'],
43
+ bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'hydradx_rococo', 'pendulum', 'amplitude', 'continuum_network', 'truth_network'],
44
44
  statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network', 'rococo_assethub', 'liberlandTest', 'liberland', 'dentnet', 'pangolin', 'crust', 'phala', 'shibuya', 'dbcchain', 'westend_assethub'],
45
45
  kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'],
46
46
  // perhaps there are some runtime updates
@@ -300,8 +300,6 @@ const _XCM_CHAIN_GROUP = {
300
300
  // default is xTokens pallet
301
301
  };
302
302
  exports._XCM_CHAIN_GROUP = _XCM_CHAIN_GROUP;
303
- const SUFFICIENT_CHAIN = ['astar', 'calamari', 'parallel', 'darwinia2', 'crabParachain', 'pangolin', 'statemint', 'moonriver', 'shiden', 'moonbeam', 'statemine', 'liberland', 'dentnet', 'phala', 'crust', 'dbcchain', 'rococo_assethub'];
304
- exports.SUFFICIENT_CHAIN = SUFFICIENT_CHAIN;
305
303
  const _XCM_TYPE = {
306
304
  RP: `${_types._SubstrateChainType.RELAYCHAIN}-${_types._SubstrateChainType.PARACHAIN}`,
307
305
  // DMP
@@ -64,6 +64,7 @@ class ChainService {
64
64
  chainLogoMapSubject = new _rxjs.BehaviorSubject(_chainList.ChainLogoMap);
65
65
  ledgerGenericAllowChainsSubject = new _rxjs.BehaviorSubject([]);
66
66
  priorityTokensSubject = new _rxjs.BehaviorSubject({});
67
+ sufficientChainsSubject = new _rxjs.BehaviorSubject({});
67
68
 
68
69
  // Todo: Update to new store indexed DB
69
70
  store = new _AssetSetting.default();
@@ -89,24 +90,32 @@ class ChainService {
89
90
  get value() {
90
91
  const ledgerGenericAllowChains = this.ledgerGenericAllowChainsSubject;
91
92
  const priorityTokens = this.priorityTokensSubject;
93
+ const sufficientChains = this.sufficientChainsSubject;
92
94
  return {
93
95
  get ledgerGenericAllowChains() {
94
96
  return ledgerGenericAllowChains.value;
95
97
  },
96
98
  get priorityTokens() {
97
99
  return priorityTokens.value;
100
+ },
101
+ get sufficientChains() {
102
+ return sufficientChains.value;
98
103
  }
99
104
  };
100
105
  }
101
106
  get observable() {
102
107
  const ledgerGenericAllowChains = this.ledgerGenericAllowChainsSubject;
103
108
  const priorityTokens = this.priorityTokensSubject;
109
+ const sufficientChains = this.sufficientChainsSubject;
104
110
  return {
105
111
  get ledgerGenericAllowChains() {
106
112
  return ledgerGenericAllowChains.asObservable();
107
113
  },
108
114
  get priorityTokens() {
109
115
  return priorityTokens.asObservable();
116
+ },
117
+ get sufficientChains() {
118
+ return sufficientChains.asObservable();
110
119
  }
111
120
  };
112
121
  }
@@ -550,7 +559,7 @@ class ChainService {
550
559
  this.initAssetRefMap();
551
560
  this.xcmRefMapSubject.next(this.xcmRefMap);
552
561
  await this.initApis();
553
- await this.initAssetSettings();
562
+ this.initAssetSettings();
554
563
  await this.autoEnableTokens();
555
564
  }
556
565
  initAssetRefMap() {
@@ -629,14 +638,47 @@ class ChainService {
629
638
  }
630
639
  }
631
640
  }
641
+ async enablePopularTokens() {
642
+ const assetSettings = this.assetSettingSubject.value;
643
+ const chainStateMap = this.getChainStateMap();
644
+ const priorityTokensMap = this.priorityTokensSubject.value || {};
645
+ const priorityTokensList = priorityTokensMap.token && typeof priorityTokensMap.token === 'object' ? Object.keys(priorityTokensMap.token) : [];
646
+ for (const assetSlug of priorityTokensList) {
647
+ const assetState = assetSettings[assetSlug];
648
+ const assetInfo = this.getAssetBySlug(assetSlug);
649
+ const chainState = chainStateMap[assetInfo.originChain];
650
+ if (!assetState) {
651
+ // If this asset not has asset setting, this token is not enabled before (not turned off before)
652
+ if (!chainState || !chainState.manualTurnOff) {
653
+ await this.updateAssetSetting(assetSlug, {
654
+ visible: true
655
+ }, true);
656
+ }
657
+ }
658
+ }
659
+ }
632
660
  handleLatestLedgerGenericAllowChains(latestledgerGenericAllowChains) {
633
661
  this.ledgerGenericAllowChainsSubject.next(latestledgerGenericAllowChains);
634
662
  this.eventService.emit('ledger.ready', true);
635
663
  this.logger.log('Finished updating latest ledger generic allow chains');
636
664
  }
637
665
  handleLatestPriorityTokens(latestPriorityTokens) {
666
+ const currentTokens = this.priorityTokensSubject.value || {};
638
667
  this.priorityTokensSubject.next(latestPriorityTokens);
639
668
  this.logger.log('Finished updating latest popular tokens');
669
+ const currentTokenKeys = Object.keys(currentTokens.token || {}); // Extract keys from current tokens
670
+ const newTokenKeys = Object.keys(latestPriorityTokens.token || {}); // Extract keys from new tokens
671
+
672
+ if (JSON.stringify(currentTokenKeys) !== JSON.stringify(newTokenKeys)) {
673
+ // Check if token keys have changed
674
+ this.enablePopularTokens().then(() => this.logger.log('Popular tokens enabled due to priority tokens change')) // Log success after enabling tokens
675
+ .catch(e => console.error('Error enabling popular tokens:', e)); // Log error if enabling fails
676
+ }
677
+ }
678
+
679
+ handleLatestSufficientChains(latestSufficientChains) {
680
+ this.sufficientChainsSubject.next(latestSufficientChains);
681
+ this.logger.log('Finished updating latest supported sufficient chains');
640
682
  }
641
683
  handleLatestData() {
642
684
  this.fetchLatestChainData().then(latestChainInfo => {
@@ -658,6 +700,9 @@ class ChainService {
658
700
  this.fetchLatestPriorityTokens().then(latestPriorityTokens => {
659
701
  this.handleLatestPriorityTokens(latestPriorityTokens);
660
702
  }).catch(console.error);
703
+ this.fetchLatestSufficientChains().then(latestSufficientChains => {
704
+ this.handleLatestSufficientChains(latestSufficientChains);
705
+ }).catch(console.error);
661
706
  }
662
707
  async initApis() {
663
708
  const chainInfoMap = this.getChainInfoMap();
@@ -940,6 +985,9 @@ class ChainService {
940
985
  token: {}
941
986
  };
942
987
  }
988
+ async fetchLatestSufficientChains() {
989
+ return (await (0, _utils2.fetchStaticData)('chains/supported-sufficient-chains')) || [];
990
+ }
943
991
  async initChains() {
944
992
  const storedChainSettings = await this.dbService.getAllChainStore();
945
993
  const defaultChainInfoMap = filterChainInfoMap(_chainList.ChainInfoMap, ignoredList);
@@ -1646,22 +1694,7 @@ class ChainService {
1646
1694
  await Promise.all([this.substrateChainHandler.wakeUp(), this.evmChainHandler.wakeUp(), this.tonChainHandler.wakeUp(), this.cardanoChainHandler.wakeUp()]);
1647
1695
  this.checkLatestData();
1648
1696
  }
1649
- async initAssetSettings() {
1650
- const assetSettings = await this.getAssetSettings();
1651
- const activeChainSlugs = this.getActiveChainSlugs();
1652
- const assetRegistry = this.getAssetRegistry();
1653
- Object.values(assetRegistry).forEach(assetInfo => {
1654
- const isSettingExisted = (assetInfo.slug in assetSettings);
1655
-
1656
- // Set visible for every enabled chains
1657
- if (activeChainSlugs.includes(assetInfo.originChain) && !isSettingExisted) {
1658
- // Setting only exist when set either by chain settings or user
1659
- assetSettings[assetInfo.slug] = {
1660
- visible: true
1661
- };
1662
- }
1663
- });
1664
- this.setAssetSettings(assetSettings, false);
1697
+ initAssetSettings() {
1665
1698
  this.eventService.emit('asset.ready', true);
1666
1699
  }
1667
1700
  setAssetSettings(assetSettings) {
@@ -1750,6 +1783,27 @@ class ChainService {
1750
1783
  });
1751
1784
  this.setAssetSettings(assetSettings);
1752
1785
  }
1786
+ async updatePriorityAssetsByChain(chainSlug, visible) {
1787
+ const currentAssetSettings = await this.getAssetSettings();
1788
+ const assetsByChain = this.getFungibleTokensByChain(chainSlug);
1789
+ const priorityTokensMap = this.priorityTokensSubject.value || {};
1790
+ const priorityTokensList = priorityTokensMap.token && typeof priorityTokensMap.token === 'object' ? Object.keys(priorityTokensMap.token) : [];
1791
+ for (const asset of Object.values(assetsByChain)) {
1792
+ if (visible) {
1793
+ const isPriorityToken = priorityTokensList.includes(asset.slug);
1794
+ if (isPriorityToken || (0, _utils._isNativeToken)(asset)) {
1795
+ currentAssetSettings[asset.slug] = {
1796
+ visible: true
1797
+ };
1798
+ }
1799
+ } else {
1800
+ currentAssetSettings[asset.slug] = {
1801
+ visible: false
1802
+ };
1803
+ }
1804
+ }
1805
+ this.setAssetSettings(currentAssetSettings);
1806
+ }
1753
1807
  subscribeAssetSettings() {
1754
1808
  return this.assetSettingSubject;
1755
1809
  }
@@ -11,7 +11,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
11
11
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
12
12
  const fetchDomain = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev';
13
13
  const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
14
- const ChainListVersion = '0.2.102'; // update this when build chainlist
14
+ const ChainListVersion = '0.2.103'; // update this when build chainlist
15
15
 
16
16
  // todo: move this interface to chainlist
17
17
 
@@ -256,11 +256,11 @@ class BasePoolHandler {
256
256
  /** Validate param to join the pool */
257
257
 
258
258
  /** Create `transaction` to leave the pool */
259
- async handleYieldLeave(fastLeave, amount, address, selectedTarget, netuid) {
259
+ async handleYieldLeave(fastLeave, amount, address, selectedTarget, netuid, slippage) {
260
260
  if (fastLeave) {
261
261
  return this.handleYieldRedeem(amount, address, selectedTarget);
262
262
  } else {
263
- return this.handleYieldUnstake(amount, address, selectedTarget, netuid);
263
+ return this.handleYieldUnstake(amount, address, selectedTarget, netuid, slippage);
264
264
  }
265
265
  }
266
266
 
@@ -275,7 +275,10 @@ class BasePoolHandler {
275
275
  return this.slug === slug;
276
276
  }
277
277
  getEarningSlippage(params) {
278
- return Promise.resolve(0);
278
+ return Promise.resolve({
279
+ slippage: 0,
280
+ rate: 1
281
+ });
279
282
  }
280
283
  /* Other actions */
281
284
  }
@@ -110,7 +110,10 @@ class BaseNativeStakingPoolHandler extends _base.default {
110
110
  address,
111
111
  slug,
112
112
  selectedValidators,
113
- netuid
113
+ subnetData: {
114
+ netuid: netuid || 0,
115
+ slippage: 0
116
+ }
114
117
  };
115
118
  const positionInfo = await this.getPoolPosition(address);
116
119
  const [, fee] = await this.createJoinExtrinsic(data, positionInfo);