@subwallet/extension-base 1.3.50-0 → 1.3.52-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 (63) hide show
  1. package/cjs/constants/environment.js +3 -1
  2. package/cjs/koni/background/handlers/State.js +1 -5
  3. package/cjs/packageInfo.js +1 -1
  4. package/cjs/services/balance-service/index.js +3 -4
  5. package/cjs/services/balance-service/transfer/cardano-transfer.js +43 -11
  6. package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +13 -92
  7. package/cjs/services/balance-service/transfer/xcm/index.js +12 -4
  8. package/cjs/services/chain-service/handler/bitcoin/BitcoinApi.js +3 -1
  9. package/cjs/services/chain-service/utils/patch.js +3 -2
  10. package/cjs/services/earning-service/handlers/native-staking/dtao.js +28 -301
  11. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +4 -4
  12. package/cjs/services/earning-service/handlers/native-staking/tao.js +174 -148
  13. package/cjs/services/earning-service/handlers/nomination-pool/index.js +11 -5
  14. package/cjs/services/earning-service/service.js +5 -2
  15. package/cjs/services/fee-service/utils/tokenPayFee.js +17 -13
  16. package/cjs/services/price-service/coingecko.js +3 -3
  17. package/cjs/services/swap-service/handler/base-handler.js +5 -2
  18. package/cjs/services/swap-service/handler/chainflip-handler.js +35 -12
  19. package/cjs/services/swap-service/handler/hydradx-handler.js +19 -13
  20. package/cjs/services/swap-service/index.js +8 -5
  21. package/cjs/services/transaction-service/utils.js +31 -22
  22. package/cjs/utils/account/common.js +1 -0
  23. package/cjs/utils/account/transform.js +1 -1
  24. package/cjs/utils/index.js +12 -0
  25. package/cjs/utils/setup-api-sdk.js +27 -0
  26. package/constants/environment.d.ts +1 -0
  27. package/constants/environment.js +1 -0
  28. package/koni/background/handlers/State.js +3 -7
  29. package/package.json +13 -7
  30. package/packageInfo.js +1 -1
  31. package/services/balance-service/index.js +3 -4
  32. package/services/balance-service/transfer/cardano-transfer.js +42 -10
  33. package/services/balance-service/transfer/xcm/acrossBridge/index.js +14 -93
  34. package/services/balance-service/transfer/xcm/index.js +12 -4
  35. package/services/chain-service/handler/bitcoin/BitcoinApi.js +3 -1
  36. package/services/chain-service/utils/patch.d.ts +1 -0
  37. package/services/chain-service/utils/patch.js +1 -1
  38. package/services/earning-service/handlers/native-staking/dtao.d.ts +4 -36
  39. package/services/earning-service/handlers/native-staking/dtao.js +24 -298
  40. package/services/earning-service/handlers/native-staking/relay-chain.d.ts +1 -2
  41. package/services/earning-service/handlers/native-staking/relay-chain.js +4 -4
  42. package/services/earning-service/handlers/native-staking/tao.d.ts +25 -5
  43. package/services/earning-service/handlers/native-staking/tao.js +169 -149
  44. package/services/earning-service/handlers/nomination-pool/index.d.ts +1 -2
  45. package/services/earning-service/handlers/nomination-pool/index.js +11 -5
  46. package/services/earning-service/service.d.ts +1 -0
  47. package/services/earning-service/service.js +4 -2
  48. package/services/fee-service/utils/tokenPayFee.js +17 -13
  49. package/services/price-service/coingecko.js +2 -3
  50. package/services/swap-service/handler/base-handler.js +6 -3
  51. package/services/swap-service/handler/chainflip-handler.js +34 -13
  52. package/services/swap-service/handler/hydradx-handler.js +19 -13
  53. package/services/swap-service/index.js +8 -5
  54. package/services/transaction-service/utils.d.ts +0 -1
  55. package/services/transaction-service/utils.js +31 -21
  56. package/types/swap/index.d.ts +1 -1
  57. package/types/yield/info/chain/info.d.ts +1 -0
  58. package/utils/account/common.js +1 -0
  59. package/utils/account/transform.js +1 -1
  60. package/utils/index.d.ts +1 -0
  61. package/utils/index.js +2 -1
  62. package/utils/setup-api-sdk.d.ts +1 -0
  63. package/utils/setup-api-sdk.js +20 -0
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = exports.BittensorCache = void 0;
7
+ exports.getAlphaToTaoRate = exports.default = exports.DEFAULT_DTAO_MINBOND = exports.BittensorCache = void 0;
8
8
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
10
  var _constants = require("@subwallet/extension-base/constants");
@@ -16,11 +16,16 @@ var _environment = require("@subwallet/extension-base/types/environment");
16
16
  var _utils3 = require("@subwallet/extension-base/utils");
17
17
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
18
18
  var _i18next = require("i18next");
19
+ var _rxjs = require("rxjs");
19
20
  var _util = require("@polkadot/util");
21
+ var _service = require("../../service");
20
22
  // Copyright 2019-2022 @subwallet/extension-base
21
23
  // SPDX-License-Identifier: Apache-2.0
22
24
 
25
+ const DEFAULT_BITTENSOR_SLIPPAGE = 0.005;
26
+ const DEFAULT_DTAO_MINBOND = '21000000';
23
27
  /* Fetch data */
28
+ exports.DEFAULT_DTAO_MINBOND = DEFAULT_DTAO_MINBOND;
24
29
  class BittensorCache {
25
30
  static instance = null;
26
31
  cache = null;
@@ -136,6 +141,16 @@ class BittensorCache {
136
141
  // }
137
142
  // };
138
143
  exports.BittensorCache = BittensorCache;
144
+ const getAlphaToTaoRate = async (substrateApi, netuid) => {
145
+ const subnetInfo = (await substrateApi.api.call.subnetInfoRuntimeApi.getDynamicInfo(netuid)).toJSON();
146
+ if (!subnetInfo) {
147
+ return '1';
148
+ }
149
+ const taoIn = subnetInfo.taoIn ? new _bignumber.default(subnetInfo.taoIn) : new _bignumber.default(0);
150
+ const alphaIn = subnetInfo.alphaIn ? new _bignumber.default(subnetInfo.alphaIn) : new _bignumber.default(0);
151
+ return netuid === 0 || alphaIn.lte(0) ? '1' : taoIn.dividedBy(alphaIn).toString();
152
+ };
153
+ exports.getAlphaToTaoRate = getAlphaToTaoRate;
139
154
  class TaoNativeStakingPoolHandler extends _basePara.default {
140
155
  availableMethod = {
141
156
  join: true,
@@ -146,6 +161,36 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
146
161
  claimReward: false,
147
162
  changeValidator: true
148
163
  };
164
+ async getMinBond(netuid) {
165
+ var _cachedPool$metadata2, _cachedPool$statistic, _cachedPool$statistic2, _onlinePool$metadata2, _onlinePool$statistic, _onlinePool$statistic2;
166
+ // @ts-ignore
167
+ if (this.type === _types.YieldPoolType.SUBNET_STAKING) {
168
+ var _cachedPool$metadata, _onlinePool$metadata;
169
+ if (!netuid) {
170
+ return new _bignumber.default(DEFAULT_DTAO_MINBOND);
171
+ }
172
+ const subnetSlug = `${this.slug}__subnet_${netuid.toString().padStart(2, '0')}`;
173
+ const cachedPool = await this.getPoolInfo(subnetSlug);
174
+ if (cachedPool !== null && cachedPool !== void 0 && (_cachedPool$metadata = cachedPool.metadata) !== null && _cachedPool$metadata !== void 0 && _cachedPool$metadata.minValidate) {
175
+ return new _bignumber.default(cachedPool.metadata.minValidate);
176
+ }
177
+
178
+ // If can't get from cached -> get data online
179
+ const onlineData = await (0, _service.fetchPoolsData)();
180
+ const onlinePool = onlineData[subnetSlug];
181
+ return new _bignumber.default((onlinePool === null || onlinePool === void 0 ? void 0 : (_onlinePool$metadata = onlinePool.metadata) === null || _onlinePool$metadata === void 0 ? void 0 : _onlinePool$metadata.minValidate) || DEFAULT_DTAO_MINBOND);
182
+ }
183
+ const cachedPool = await this.getPoolInfo(this.slug);
184
+ if (cachedPool !== null && cachedPool !== void 0 && (_cachedPool$metadata2 = cachedPool.metadata) !== null && _cachedPool$metadata2 !== void 0 && _cachedPool$metadata2.minValidate || cachedPool !== null && cachedPool !== void 0 && (_cachedPool$statistic = cachedPool.statistic) !== null && _cachedPool$statistic !== void 0 && (_cachedPool$statistic2 = _cachedPool$statistic.earningThreshold) !== null && _cachedPool$statistic2 !== void 0 && _cachedPool$statistic2.join) {
185
+ var _cachedPool$metadata3, _cachedPool$statistic3, _cachedPool$statistic4;
186
+ return new _bignumber.default(((_cachedPool$metadata3 = cachedPool.metadata) === null || _cachedPool$metadata3 === void 0 ? void 0 : _cachedPool$metadata3.minValidate) || ((_cachedPool$statistic3 = cachedPool.statistic) === null || _cachedPool$statistic3 === void 0 ? void 0 : (_cachedPool$statistic4 = _cachedPool$statistic3.earningThreshold) === null || _cachedPool$statistic4 === void 0 ? void 0 : _cachedPool$statistic4.join) || 0);
187
+ }
188
+
189
+ // If can get from cached -> get data online
190
+ const onlineData = await (0, _service.fetchPoolsData)();
191
+ const onlinePool = onlineData[this.slug];
192
+ return new _bignumber.default((onlinePool === null || onlinePool === void 0 ? void 0 : (_onlinePool$metadata2 = onlinePool.metadata) === null || _onlinePool$metadata2 === void 0 ? void 0 : _onlinePool$metadata2.minValidate) || (onlinePool === null || onlinePool === void 0 ? void 0 : (_onlinePool$statistic = onlinePool.statistic) === null || _onlinePool$statistic === void 0 ? void 0 : (_onlinePool$statistic2 = _onlinePool$statistic.earningThreshold) === null || _onlinePool$statistic2 === void 0 ? void 0 : _onlinePool$statistic2.join) || 0);
193
+ }
149
194
  constructor(state, chain) {
150
195
  super(state, chain);
151
196
  this.bittensorCache = BittensorCache.getInstance();
@@ -171,83 +216,98 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
171
216
 
172
217
  async subscribePoolInfo(callback) {
173
218
  let cancel = false;
174
- const substrateApi = this.substrateApi;
175
- const updateStakingInfo = async () => {
219
+ const substrateApi = await this.substrateApi.isReady;
220
+ const aprSubject = new _rxjs.BehaviorSubject(0);
221
+ const fetchAPR = async () => {
176
222
  try {
223
+ const _topValidator = await this.bittensorCache.fetchApr(0);
224
+ const validators = _topValidator.data;
225
+ const highestApr = validators === null || validators === void 0 ? void 0 : validators[0];
226
+ const apr = this.chain === 'bittensor' ? Number((highestApr === null || highestApr === void 0 ? void 0 : highestApr.thirty_day_apy) || 0) * 100 : 0;
227
+ aprSubject.next(apr);
228
+ } catch (e) {
229
+ console.error('Fetch APR error:', e);
230
+ }
231
+ };
232
+ await fetchAPR();
233
+ const interval = setInterval(() => {
234
+ fetchAPR().catch(console.error);
235
+ }, _constants.BITTENSOR_REFRESH_STAKE_APY);
236
+ const rxSubnetTAO = substrateApi.api.rx.query.subtensorModule.subnetTAO(0);
237
+ const rxMinDelegatorStake = substrateApi.api.rx.query.subtensorModule.nominatorMinRequiredStake();
238
+ const rxMaxValidators = substrateApi.api.rx.query.subtensorModule.maxAllowedValidators(0);
239
+ const subscription = (0, _rxjs.combineLatest)([rxMinDelegatorStake, rxMaxValidators, rxSubnetTAO, aprSubject]).subscribe({
240
+ next: _ref => {
241
+ let [minDelegatorStake, maxValidators, taoIn, apr] = _ref;
177
242
  if (cancel) {
178
243
  return;
179
244
  }
180
- const minDelegatorStake = (await substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
181
- const maxValidatorPerNominator = (await substrateApi.api.query.subtensorModule.maxAllowedValidators(0)).toPrimitive();
182
- const taoIn = (await substrateApi.api.query.subtensorModule.subnetTAO(0)).toPrimitive();
183
- const _topValidator = await this.bittensorCache.fetchApr(0);
184
- const validators = _topValidator.data;
185
- const highestApr = validators[0];
186
- const bnTaoIn = new _bignumber.default(taoIn);
187
- const BNminDelegatorStake = new _bignumber.default(minDelegatorStake.toString());
188
- const apr = this.chain === 'bittensor' ? Number(highestApr.thirty_day_apy) * 100 : 0;
189
- const data = {
190
- ...this.baseInfo,
191
- type: this.type,
192
- metadata: {
193
- ...this.metadataInfo,
194
- description: this.getDescription((0, _utils3.formatNumber)(BNminDelegatorStake, (0, _utils2._getAssetDecimals)(this.nativeToken)))
195
- },
196
- statistic: {
197
- assetEarning: [{
198
- slug: this.nativeToken.slug
199
- }],
200
- maxCandidatePerFarmer: Number(maxValidatorPerNominator),
201
- maxWithdrawalRequestPerFarmer: 1,
202
- earningThreshold: {
203
- join: BNminDelegatorStake.toString(),
204
- defaultUnstake: '0',
205
- fastUnstake: '0'
245
+ try {
246
+ const bnTaoIn = new _bignumber.default(taoIn.toString());
247
+ const bnMinStake = new _bignumber.default(minDelegatorStake.toString());
248
+ const minStake = bnMinStake.toString();
249
+ const data = {
250
+ ...this.baseInfo,
251
+ type: this.type,
252
+ metadata: {
253
+ ...this.metadataInfo,
254
+ description: this.getDescription((0, _utils3.formatNumber)(bnMinStake, (0, _utils2._getAssetDecimals)(this.nativeToken))),
255
+ minValidate: minStake
206
256
  },
207
- eraTime: 24,
208
- era: 0,
209
- unstakingPeriod: 1.2,
210
- tvl: bnTaoIn.toString(),
211
- totalApy: apr
212
- }
213
- };
214
- callback(data);
215
- } catch (error) {
216
- console.log(error);
257
+ statistic: {
258
+ assetEarning: [{
259
+ slug: this.nativeToken.slug
260
+ }],
261
+ maxCandidatePerFarmer: Number(maxValidators.toString()),
262
+ maxWithdrawalRequestPerFarmer: 1,
263
+ earningThreshold: {
264
+ join: minStake,
265
+ defaultUnstake: '0',
266
+ fastUnstake: '0'
267
+ },
268
+ eraTime: 24,
269
+ era: 0,
270
+ unstakingPeriod: 1.2,
271
+ tvl: bnTaoIn.toString(),
272
+ totalApy: apr
273
+ }
274
+ };
275
+ callback(data);
276
+ } catch (err) {
277
+ console.error(err);
278
+ }
217
279
  }
218
- };
219
- const subscribeStakingMetadataInterval = () => {
220
- updateStakingInfo().catch(console.error);
221
- };
222
- await substrateApi.isReady;
223
- subscribeStakingMetadataInterval();
224
- const interval = setInterval(subscribeStakingMetadataInterval, _constants.BITTENSOR_REFRESH_STAKE_APY);
280
+ });
225
281
  return () => {
226
282
  cancel = true;
283
+ aprSubject.complete();
284
+ subscription.unsubscribe();
227
285
  clearInterval(interval);
228
286
  };
229
287
  }
230
288
 
231
289
  /* Subscribe pool position */
232
290
 
233
- async parseNominatorMetadata(chainInfo, address, delegatorState) {
291
+ parseNominatorMetadataBase(chainInfo, delegatorState, minBond) {
292
+ let applyRate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
234
293
  const nominationList = [];
235
- const getMinDelegatorStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
236
- const minDelegatorStake = (await getMinDelegatorStake).toString();
237
294
  let allActiveStake = _util.BN_ZERO;
238
295
  for (const delegate of delegatorState) {
239
- const activeStake = delegate.amount;
240
- const bnActiveStake = new _util.BN(activeStake);
296
+ const stake = new _bignumber.default(delegate.amount);
297
+ const originActiveStake = applyRate ? stake.multipliedBy(delegate.rate || 1).toFixed(0) : stake.toFixed(0);
298
+ const bnActiveStake = new _util.BN(originActiveStake);
241
299
  if (bnActiveStake.gt(_util.BN_ZERO)) {
242
- const delegationStatus = _types.EarningStatus.EARNING_REWARD;
243
300
  allActiveStake = allActiveStake.add(bnActiveStake);
244
301
  nominationList.push({
245
- status: delegationStatus,
302
+ status: _types.EarningStatus.EARNING_REWARD,
246
303
  chain: chainInfo.slug,
247
304
  validatorAddress: delegate.owner,
248
- activeStake: activeStake,
249
- validatorMinStake: minDelegatorStake,
250
- validatorIdentity: delegate.identity
305
+ activeStake: delegate.amount,
306
+ validatorMinStake: minBond,
307
+ validatorIdentity: delegate.identity,
308
+ ...(applyRate ? {
309
+ originActiveStake
310
+ } : {})
251
311
  });
252
312
  }
253
313
  }
@@ -263,6 +323,10 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
263
323
  unstakings: []
264
324
  };
265
325
  }
326
+ async parseNominatorMetadata(chainInfo, delegatorState) {
327
+ const bnMinBond = await this.getMinBond();
328
+ return this.parseNominatorMetadataBase(chainInfo, delegatorState, bnMinBond.toString());
329
+ }
266
330
  async subscribePoolPosition(useAddresses, rsCallback) {
267
331
  let cancel = false;
268
332
  const substrateApi = await this.substrateApi.isReady;
@@ -305,7 +369,7 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
305
369
  });
306
370
  }
307
371
  if (delegateStateInfo && delegateStateInfo.length > 0) {
308
- this.parseNominatorMetadata(chainInfo, owner, delegatorState).then(nominatorMetadata => {
372
+ this.parseNominatorMetadata(chainInfo, delegatorState).then(nominatorMetadata => {
309
373
  rsCallback({
310
374
  ...defaultInfo,
311
375
  ...nominatorMetadata,
@@ -331,61 +395,6 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
331
395
  });
332
396
  }
333
397
  };
334
-
335
- // const getMainnetPoolPosition = async () => {
336
- // const rawDelegateStateInfos = await Promise.all(
337
- // useAddresses.map((address) => fetchTaoDelegateState(address))
338
- // );
339
-
340
- // if (rawDelegateStateInfos.length > 0) {
341
- // rawDelegateStateInfos.forEach((rawDelegateStateInfo, i) => {
342
- // const owner = reformatAddress(useAddresses[i], 42);
343
- // const delegatorState: TaoStakingStakeOption[] = [];
344
- // let bnTotalBalance = BN_ZERO;
345
- // const delegateStateInfo = rawDelegateStateInfo.data;
346
-
347
- // for (const delegate of delegateStateInfo) {
348
- // const name = delegate.hotkey_name || delegate.hotkey.ss58;
349
-
350
- // bnTotalBalance = bnTotalBalance.add(new BN(delegate.stake));
351
-
352
- // delegatorState.push({
353
- // owner: delegate.hotkey.ss58,
354
- // amount: delegate.stake,
355
- // identity: name
356
- // });
357
- // }
358
-
359
- // if (delegateStateInfo && delegateStateInfo.length > 0) {
360
- // this.parseNominatorMetadata(chainInfo, owner, delegatorState)
361
- // .then((nominatorMetadata) => {
362
- // rsCallback({
363
- // ...defaultInfo,
364
- // ...nominatorMetadata,
365
- // address: owner,
366
- // type: this.type
367
- // });
368
- // })
369
- // .catch(console.error);
370
- // } else {
371
- // rsCallback({
372
- // ...defaultInfo,
373
- // type: this.type,
374
- // address: owner,
375
- // balanceToken: this.nativeToken.slug,
376
- // totalStake: '0',
377
- // activeStake: '0',
378
- // unstakeBalance: '0',
379
- // status: EarningStatus.NOT_STAKING,
380
- // isBondedBefore: false,
381
- // nominations: [],
382
- // unstakings: []
383
- // });
384
- // }
385
- // });
386
- // }
387
- // };
388
-
389
398
  const getStakingPositionInterval = async () => {
390
399
  if (cancel) {
391
400
  return;
@@ -410,14 +419,14 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
410
419
  /* Subscribe pool position */
411
420
 
412
421
  /* Get pool targets */
413
-
414
422
  // eslint-disable-next-line @typescript-eslint/require-await
415
- async getDevnetPoolTargets() {
423
+ async getDevnetPoolTargets(netuid) {
416
424
  const testnetDelegate = (await this.substrateApi.api.call.delegateInfoRuntimeApi.getDelegates()).toJSON();
417
- const getNominatorMinRequiredStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
418
- const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
419
- const bnMinBond = new _bignumber.default(nominatorMinRequiredStake);
420
- return testnetDelegate.map(delegate => ({
425
+ const bnMinBond = await this.getMinBond(netuid);
426
+ const filteredDelegates = testnetDelegate.filter(delegate => {
427
+ return delegate.returnPer1000 !== 0;
428
+ });
429
+ return filteredDelegates.map(delegate => ({
421
430
  address: delegate.delegateSs58,
422
431
  totalStake: '0',
423
432
  ownStake: '0',
@@ -431,14 +440,12 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
431
440
  isCrowded: false
432
441
  }));
433
442
  }
434
- async getMainnetPoolTargets() {
443
+ async getMainnetPoolTargets(netuid) {
435
444
  const _topValidator = await this.bittensorCache.get();
436
445
  const topValidator = _topValidator;
437
- const getNominatorMinRequiredStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
438
- const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
439
- const bnMinBond = new _bignumber.default(nominatorMinRequiredStake);
446
+ const bnMinBond = await this.getMinBond();
440
447
  const validatorList = topValidator.data;
441
- const aprResponse = await this.bittensorCache.fetchApr(0);
448
+ const aprResponse = await this.bittensorCache.fetchApr(netuid);
442
449
  const aprMap = {};
443
450
  aprResponse.data.forEach(item => {
444
451
  aprMap[item.hotkey.ss58] = item.thirty_day_apy;
@@ -473,11 +480,11 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
473
480
  }));
474
481
  return results;
475
482
  }
476
- async getPoolTargets() {
483
+ async getPoolTargets(netuid) {
477
484
  if (this.chain === 'bittensor') {
478
- return this.getMainnetPoolTargets();
485
+ return this.getMainnetPoolTargets(netuid !== null && netuid !== void 0 ? netuid : 0);
479
486
  } else {
480
- return this.getDevnetPoolTargets();
487
+ return this.getDevnetPoolTargets(netuid);
481
488
  }
482
489
  }
483
490
 
@@ -486,16 +493,23 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
486
493
  /* Join pool action */
487
494
 
488
495
  async createJoinExtrinsic(data, positionInfo) {
496
+ var _subnetData$netuid, _subnetData$slippage;
489
497
  let bondDest = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'Staked';
490
498
  const {
491
499
  amount,
492
- selectedValidators: targetValidators
500
+ selectedValidators: targetValidators,
501
+ subnetData
493
502
  } = data;
494
503
  const chainApi = await this.substrateApi.isReady;
495
504
  const binaryAmount = new _bignumber.default(amount);
496
505
  const selectedValidatorInfo = targetValidators[0];
497
506
  const hotkey = selectedValidatorInfo.address;
498
- const extrinsic = chainApi.api.tx.subtensorModule.addStake(hotkey, 0, binaryAmount.toFixed());
507
+ const netuid = (_subnetData$netuid = subnetData === null || subnetData === void 0 ? void 0 : subnetData.netuid) !== null && _subnetData$netuid !== void 0 ? _subnetData$netuid : 0;
508
+ const slippage = (_subnetData$slippage = subnetData === null || subnetData === void 0 ? void 0 : subnetData.slippage) !== null && _subnetData$slippage !== void 0 ? _subnetData$slippage : DEFAULT_BITTENSOR_SLIPPAGE;
509
+ const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid));
510
+ const limitPrice = alphaToTaoPrice.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).multipliedBy(1 + slippage);
511
+ const BNlimitPrice = new _bignumber.default(limitPrice.integerValue(_bignumber.default.ROUND_CEIL).toFixed());
512
+ const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
499
513
  return [extrinsic, {
500
514
  slug: this.nativeToken.slug,
501
515
  amount: '0'
@@ -509,10 +523,10 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
509
523
  return baseErrors;
510
524
  }
511
525
  const {
512
- amount
526
+ amount,
527
+ subnetData
513
528
  } = data;
514
- const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
515
- const bnMinStake = minDelegatorStake.toString();
529
+ const bnMinStake = await this.getMinBond(subnetData === null || subnetData === void 0 ? void 0 : subnetData.netuid);
516
530
  if (new _bignumber.default(amount).lt(bnMinStake)) {
517
531
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Insufficient stake. You need to stake at least ${(0, _utils3.formatNumber)(bnMinStake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to earn rewards`))];
518
532
  }
@@ -524,16 +538,21 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
524
538
  /* Leave pool action */
525
539
 
526
540
  async handleYieldUnstake(amount, address, selectedTarget) {
541
+ let netuid = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
542
+ let slippage = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : DEFAULT_BITTENSOR_SLIPPAGE;
527
543
  const apiPromise = await this.substrateApi.isReady;
528
- const binaryAmount = new _bignumber.default(amount);
529
- const poolPosition = await this.getPoolPosition(address);
530
- if (!selectedTarget || !poolPosition) {
544
+ if (!selectedTarget) {
531
545
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
532
546
  }
533
- const extrinsic = apiPromise.api.tx.subtensorModule.removeStake(selectedTarget, 0, binaryAmount.toFixed());
547
+ const binaryAmount = new _bignumber.default(amount);
548
+ const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid));
549
+ const limitPrice = alphaToTaoPrice.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).multipliedBy(1 - slippage);
550
+ const BNlimitPrice = new _bignumber.default(limitPrice.integerValue(_bignumber.default.ROUND_CEIL).toFixed());
551
+ const extrinsic = apiPromise.api.tx.subtensorModule.removeStakeLimit(selectedTarget, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
534
552
  return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
535
553
  }
536
554
  async validateYieldLeave(amount, address, fastLeave, selectedTarget, slug, poolInfo) {
555
+ var _poolInfo$metadata$su;
537
556
  const baseErrors = await super.validateYieldLeave(amount, address, fastLeave, selectedTarget, slug);
538
557
  if (baseErrors.length > 0) {
539
558
  return baseErrors;
@@ -541,10 +560,13 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
541
560
  if (!poolInfo) {
542
561
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS)];
543
562
  }
544
- const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
545
- const bnMinUnstake = new _bignumber.default(minDelegatorStake.toString());
546
- if (new _bignumber.default(amount).lt(bnMinUnstake)) {
547
- return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to unstake at least ${(0, _utils3.formatNumber)(bnMinUnstake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)}`))];
563
+ const netuid = (_poolInfo$metadata$su = poolInfo.metadata.subnetData) === null || _poolInfo$metadata$su === void 0 ? void 0 : _poolInfo$metadata$su.netuid;
564
+ const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
565
+ const minDelegatorStake = await this.getMinBond(netuid);
566
+ const minUnstake = minDelegatorStake.dividedBy(alphaToTaoPrice);
567
+ if (new _bignumber.default(amount).lt(minUnstake)) {
568
+ var _poolInfo$metadata$su2;
569
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to unstake at least ${(0, _utils3.formatNumber)(minUnstake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${((_poolInfo$metadata$su2 = poolInfo.metadata.subnetData) === null || _poolInfo$metadata$su2 === void 0 ? void 0 : _poolInfo$metadata$su2.subnetSymbol) || (0, _utils2._getAssetSymbol)(this.nativeToken)}`))];
548
570
  }
549
571
  return baseErrors;
550
572
  }
@@ -557,14 +579,15 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
557
579
  const {
558
580
  amount,
559
581
  maxAmount,
582
+ metadata,
560
583
  originValidator,
561
- selectedValidators: targetValidators
584
+ selectedValidators: targetValidators,
585
+ subnetData
562
586
  } = data;
563
587
  if (!originValidator) {
564
588
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
565
589
  }
566
-
567
- // Bittensor only supports changing 1 validator at a time, not multiple
590
+ const netuid = (subnetData === null || subnetData === void 0 ? void 0 : subnetData.netuid) || 0;
568
591
  const selectedValidatorInfo = targetValidators[0];
569
592
  const destValidator = selectedValidatorInfo.address;
570
593
  if (new _bignumber.default(amount).lte(0)) {
@@ -573,17 +596,20 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
573
596
  if (originValidator === destValidator) {
574
597
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'From validator is the same with to validator'));
575
598
  }
576
- const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
577
- const bnMinMoveStake = new _bignumber.default(minDelegatorStake.toString());
578
- if (new _bignumber.default(maxAmount).lt(bnMinMoveStake)) {
579
- return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to move at least ${(0, _utils3.formatNumber)(bnMinMoveStake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)}`)));
599
+ const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid));
600
+ const bnMinStake = await this.getMinBond(netuid);
601
+ const minUnstake = bnMinStake.dividedBy(alphaToTaoPrice);
602
+ const formattedMinUnstake = minUnstake.dividedBy(1000000).integerValue(_bignumber.default.ROUND_CEIL).dividedBy(1000);
603
+ const bnMinMoveStake = formattedMinUnstake.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken));
604
+ if (new _bignumber.default(amount).lt(bnMinMoveStake)) {
605
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to move at least ${formattedMinUnstake.toString()} ${(metadata === null || metadata === void 0 ? void 0 : metadata.subnetSymbol) || ''}`)));
580
606
  }
581
607
 
582
608
  // Avoid remaining amount too low -> can't do anything with that amount
583
609
  if (!(maxAmount === amount) && new _bignumber.default(maxAmount).minus(new _bignumber.default(amount)).lt(bnMinMoveStake)) {
584
- return Promise.reject(new _TransactionError.TransactionError(_types.StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW, (0, _i18next.t)(`Your remaining stake on the initial validator will fall below minimum active stake and cannot be unstaked if you proceed with the chosen amount. Hit "Move all" to move all ${(0, _utils3.formatNumber)(maxAmount, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to the new validator, or "Cancel" and lower the amount, then try again`)));
610
+ return Promise.reject(new _TransactionError.TransactionError(_types.StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW, (0, _i18next.t)(`Your remaining stake on the initial validator will fall below minimum active stake and cannot be unstaked if you proceed with the chosen amount. Hit "Move all" to move all ${(0, _utils3.formatNumber)(maxAmount, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(metadata === null || metadata === void 0 ? void 0 : metadata.subnetSymbol) || (0, _utils2._getAssetSymbol)(this.nativeToken)} to the new validator, or "Cancel" and lower the amount, then try again`)));
585
611
  }
586
- const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, 0, 0, amount);
612
+ const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, netuid, netuid, amount);
587
613
  return extrinsic;
588
614
  }
589
615
  }
@@ -158,7 +158,7 @@ class NominationPoolHandler extends _base.default {
158
158
 
159
159
  /* Subscribe pool position */
160
160
 
161
- async parsePoolMemberMetadata(substrateApi, poolMemberInfo, currentEra, _deriveSessionProgress, address) {
161
+ async parsePoolMemberMetadata(substrateApi, poolMemberInfo, currentEra, address) {
162
162
  const chainInfo = this.chainInfo;
163
163
  const unlimitedNominatorRewarded = substrateApi.api.consts.staking.maxExposurePageSize !== undefined;
164
164
  const _maxNominatorRewardedPerValidator = (substrateApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
@@ -254,14 +254,13 @@ class NominationPoolHandler extends _base.default {
254
254
  return;
255
255
  }
256
256
  if (ledgers) {
257
- var _substrateApi$api$der, _substrateApi$api$der2;
258
- const [_currentEra, _deriveSessionProgress] = await Promise.all([substrateApi.api.query.staking.currentEra(), (_substrateApi$api$der = substrateApi.api.derive) === null || _substrateApi$api$der === void 0 ? void 0 : (_substrateApi$api$der2 = _substrateApi$api$der.session) === null || _substrateApi$api$der2 === void 0 ? void 0 : _substrateApi$api$der2.progress()]);
257
+ const _currentEra = await substrateApi.api.query.staking.currentEra();
259
258
  const currentEra = _currentEra.toString();
260
259
  await Promise.all(ledgers.map(async (_poolMemberInfo, i) => {
261
260
  const poolMemberInfo = _poolMemberInfo.toPrimitive();
262
261
  const owner = (0, _utils3.reformatAddress)(useAddresses[i], 42);
263
262
  if (poolMemberInfo) {
264
- const nominatorMetadata = await this.parsePoolMemberMetadata(substrateApi, poolMemberInfo, currentEra, _deriveSessionProgress, owner);
263
+ const nominatorMetadata = await this.parsePoolMemberMetadata(substrateApi, poolMemberInfo, currentEra, owner);
265
264
  resultCallback({
266
265
  ...defaultInfo,
267
266
  ...nominatorMetadata,
@@ -574,7 +573,14 @@ class NominationPoolHandler extends _base.default {
574
573
  async handleYieldWithdraw(address, unstakingInfo) {
575
574
  const chainApi = await this.substrateApi.isReady;
576
575
  if (chainApi.api.tx.nominationPools.withdrawUnbonded.meta.args.length === 2) {
577
- const slashingSpanCount = await chainApi.api.call.nominationPoolsApi.memberPendingSlash(address);
576
+ var _chainApi$api$call, _chainApi$api$call$no;
577
+ let slashingSpanCount;
578
+ if ((_chainApi$api$call = chainApi.api.call) !== null && _chainApi$api$call !== void 0 && (_chainApi$api$call$no = _chainApi$api$call.nominationPoolsApi) !== null && _chainApi$api$call$no !== void 0 && _chainApi$api$call$no.memberPendingSlash) {
579
+ slashingSpanCount = await chainApi.api.call.nominationPoolsApi.memberPendingSlash(address);
580
+ } else {
581
+ // Incase api call not exists
582
+ slashingSpanCount = chainApi.api.consts.staking.historyDepth.toPrimitive();
583
+ }
578
584
  return chainApi.api.tx.nominationPools.withdrawUnbonded({
579
585
  Id: address
580
586
  }, slashingSpanCount);
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = void 0;
7
+ exports.fetchPoolsData = exports.default = void 0;
8
8
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
10
  var _constants = require("@subwallet/extension-base/constants");
@@ -27,6 +27,7 @@ const fetchPoolsData = async () => {
27
27
  });
28
28
  return fetchData.data;
29
29
  };
30
+ exports.fetchPoolsData = fetchPoolsData;
30
31
  class EarningService {
31
32
  handlers = {};
32
33
  handlerCache = new Map();
@@ -358,7 +359,9 @@ class EarningService {
358
359
  const unsubList = [];
359
360
  for (const handler of Object.values(this.handlers)) {
360
361
  // Force subscribe onchain data
361
- const forceSubscribe = handler.type === _types2.YieldPoolType.LIQUID_STAKING || handler.type === _types2.YieldPoolType.LENDING || !onlineData[handler.slug];
362
+ const forceSubscribe = handler.type === _types2.YieldPoolType.LIQUID_STAKING || handler.type === _types2.YieldPoolType.LENDING ||
363
+ // Skip subscribing for subnet staking handlers because subnet staking slugs are not included in the online cache (only slugs with netuid are cached)
364
+ !onlineData[handler.slug] && handler.type !== _types2.YieldPoolType.SUBNET_STAKING;
362
365
  if (!this.useOnlineCacheOnly || forceSubscribe) {
363
366
  handler.subscribePoolInfo(callback).then(unsub => {
364
367
  if (!cancel) {
@@ -11,7 +11,7 @@ exports.getHydrationTokensCanPayFee = getHydrationTokensCanPayFee;
11
11
  var _types = require("@subwallet/chain-list/types");
12
12
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
13
13
  var _utils2 = require("@subwallet/extension-base/services/swap-service/handler/asset-hub/utils");
14
- var _subwalletApiSdk = _interopRequireDefault(require("@subwallet/subwallet-api-sdk"));
14
+ var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos/subwallet-services-sdk"));
15
15
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
16
16
  // Copyright 2019-2022 @subwallet/extension-base
17
17
  // SPDX-License-Identifier: Apache-2.0
@@ -132,20 +132,24 @@ function batchExtrinsicSetFeeHydration(substrateApi, tx, feeSetting, assetId) {
132
132
  return tx;
133
133
  }
134
134
  async function getHydrationRate(address, hdx, desToken) {
135
- var _subwalletApiSdk$swap;
136
- const quoteRate = await ((_subwalletApiSdk$swap = _subwalletApiSdk.default.swapApi) === null || _subwalletApiSdk$swap === void 0 ? void 0 : _subwalletApiSdk$swap.getHydrationRate({
137
- address,
138
- pair: {
139
- slug: `${hdx.slug}___${desToken.slug}`,
140
- from: hdx.slug,
141
- to: desToken.slug
142
- }
143
- }));
144
- if (!quoteRate) {
145
- return undefined;
146
- } else {
135
+ let quoteRate;
136
+ try {
137
+ const quote = await _subwalletServicesSdk.default.swapApi.getHydrationRate({
138
+ address,
139
+ pair: {
140
+ slug: `${hdx.slug}___${desToken.slug}`,
141
+ from: hdx.slug,
142
+ to: desToken.slug
143
+ }
144
+ });
145
+ quoteRate = quote.rate;
146
+ } catch (error) {
147
+ console.error(`Failed to fetch swap quote: ${error.message}`);
148
+ }
149
+ if (quoteRate) {
147
150
  const hdxDecimal = (0, _utils._getAssetDecimals)(hdx);
148
151
  const desTokenDecimal = (0, _utils._getAssetDecimals)(desToken);
149
152
  return new _bignumber.default(quoteRate).multipliedBy(10 ** (desTokenDecimal - hdxDecimal)).toFixed();
150
153
  }
154
+ return undefined;
151
155
  }
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.getPriceMap = exports.getHistoryPrice = exports.getExchangeRateMap = void 0;
7
8
  var _constants = require("@subwallet/extension-base/constants");
8
9
  var _staticData = require("@subwallet/extension-base/utils/staticData");
9
- var _subwalletApiSdk = require("@subwallet/subwallet-api-sdk");
10
+ var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos/subwallet-services-sdk"));
10
11
  var _util = require("@polkadot/util");
11
12
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
12
13
  // SPDX-License-Identifier: Apache-2.0
@@ -155,8 +156,7 @@ const getPriceMap = async function (priceIds) {
155
156
  exports.getPriceMap = getPriceMap;
156
157
  const getHistoryPrice = async (priceId, type) => {
157
158
  try {
158
- var _subwalletApiSdk$pric;
159
- const response = await ((_subwalletApiSdk$pric = _subwalletApiSdk.subwalletApiSdk.priceHistoryApi) === null || _subwalletApiSdk$pric === void 0 ? void 0 : _subwalletApiSdk$pric.getPriceHistory(priceId, type));
159
+ const response = await _subwalletServicesSdk.default.priceHistoryApi.getPriceHistory(priceId, type);
160
160
  if (response) {
161
161
  return response;
162
162
  }