@subwallet/extension-base 1.3.27-0 → 1.3.28-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 (45) hide show
  1. package/background/KoniTypes.d.ts +7 -1
  2. package/cjs/constants/index.js +1 -1
  3. package/cjs/koni/background/handlers/Extension.js +13 -0
  4. package/cjs/packageInfo.js +1 -1
  5. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +89 -33
  6. package/cjs/services/chain-service/constants.js +2 -1
  7. package/cjs/services/chain-service/utils/index.js +11 -2
  8. package/cjs/services/chain-service/utils/patch.js +1 -1
  9. package/cjs/services/earning-service/handlers/base.js +3 -0
  10. package/cjs/services/earning-service/handlers/native-staking/dtao.js +97 -36
  11. package/cjs/services/earning-service/handlers/native-staking/tao.js +34 -4
  12. package/cjs/services/earning-service/service.js +13 -1
  13. package/cjs/services/migration-service/index.js +2 -5
  14. package/cjs/services/migration-service/scripts/index.js +4 -8
  15. package/cjs/services/price-service/coingecko.js +49 -0
  16. package/cjs/services/transaction-service/utils.js +4 -1
  17. package/cjs/utils/asset.js +17 -2
  18. package/constants/index.d.ts +1 -1
  19. package/constants/index.js +1 -1
  20. package/koni/background/handlers/Extension.d.ts +1 -0
  21. package/koni/background/handlers/Extension.js +13 -0
  22. package/package.json +7 -7
  23. package/packageInfo.js +1 -1
  24. package/services/balance-service/helpers/subscribe/substrate/index.js +76 -23
  25. package/services/chain-service/constants.d.ts +1 -0
  26. package/services/chain-service/constants.js +2 -1
  27. package/services/chain-service/utils/index.d.ts +1 -0
  28. package/services/chain-service/utils/index.js +6 -0
  29. package/services/chain-service/utils/patch.js +1 -1
  30. package/services/earning-service/handlers/base.d.ts +3 -2
  31. package/services/earning-service/handlers/base.js +3 -0
  32. package/services/earning-service/handlers/native-staking/dtao.d.ts +7 -2
  33. package/services/earning-service/handlers/native-staking/dtao.js +89 -31
  34. package/services/earning-service/handlers/native-staking/tao.d.ts +4 -1
  35. package/services/earning-service/handlers/native-staking/tao.js +31 -1
  36. package/services/earning-service/service.d.ts +2 -1
  37. package/services/earning-service/service.js +13 -1
  38. package/services/migration-service/index.js +2 -5
  39. package/services/migration-service/scripts/index.js +4 -8
  40. package/services/price-service/coingecko.js +48 -0
  41. package/services/transaction-service/utils.js +4 -1
  42. package/types/yield/actions/join/submit.d.ts +3 -0
  43. package/types/yield/actions/others.d.ts +7 -0
  44. package/utils/asset.d.ts +1 -0
  45. package/utils/asset.js +14 -0
@@ -4,22 +4,29 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getTaoToAlphaMapping = exports.default = void 0;
7
+ exports.getAlphaToTaoMapping = exports.default = exports.DEFAULT_DTAO_MINBOND = 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");
11
11
  var _utils = require("@subwallet/extension-base/koni/api/staking/bonding/utils");
12
+ var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
12
13
  var _basePara = _interopRequireDefault(require("@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para"));
13
14
  var _types = require("@subwallet/extension-base/types");
14
- var _utils2 = require("@subwallet/extension-base/utils");
15
- var _bignumber = _interopRequireDefault(require("bignumber.js"));
15
+ var _utils3 = require("@subwallet/extension-base/utils");
16
+ var _bignumber = _interopRequireWildcard(require("bignumber.js"));
17
+ var _i18next = require("i18next");
16
18
  var _util = require("@polkadot/util");
17
- var _utils3 = require("../../utils");
19
+ var _utils4 = require("../../utils");
18
20
  var _tao = require("./tao");
21
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
22
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
23
  // Copyright 2019-2022 @subwallet/extension-base
20
24
  // SPDX-License-Identifier: Apache-2.0
21
25
 
22
- const getTaoToAlphaMapping = async substrateApi => {
26
+ const DEFAULT_BITTENSOR_SLIPPAGE = 0.005;
27
+ const DEFAULT_DTAO_MINBOND = '600000';
28
+ exports.DEFAULT_DTAO_MINBOND = DEFAULT_DTAO_MINBOND;
29
+ const getAlphaToTaoMapping = async substrateApi => {
23
30
  const allSubnets = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
24
31
  if (!allSubnets) {
25
32
  return {};
@@ -38,7 +45,7 @@ const getTaoToAlphaMapping = async substrateApi => {
38
45
  return acc;
39
46
  }, {});
40
47
  };
41
- exports.getTaoToAlphaMapping = getTaoToAlphaMapping;
48
+ exports.getAlphaToTaoMapping = getAlphaToTaoMapping;
42
49
  class SubnetTaoStakingPoolHandler extends _basePara.default {
43
50
  /* Unimplemented function */
44
51
  handleYieldWithdraw(address, unstakingInfo) {
@@ -74,6 +81,30 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
74
81
  canHandleSlug(slug) {
75
82
  return slug.startsWith(`${this.slug}__`);
76
83
  }
84
+ async getEarningSlippage(params) {
85
+ const substrateApi = await this.substrateApi.isReady;
86
+ const subnetInfo = (await substrateApi.api.call.subnetInfoRuntimeApi.getDynamicInfo(params.netuid)).toJSON();
87
+ const alphaIn = new _bignumber.BigNumber((subnetInfo === null || subnetInfo === void 0 ? void 0 : subnetInfo.alphaIn) || 0);
88
+ const taoIn = new _bignumber.BigNumber((subnetInfo === null || subnetInfo === void 0 ? void 0 : subnetInfo.taoIn) || 0);
89
+ const k = alphaIn.multipliedBy(taoIn);
90
+ const value = new _bignumber.BigNumber(params.value);
91
+ if (params.type === _KoniTypes.ExtrinsicType.STAKING_BOND) {
92
+ const newTaoIn = taoIn.plus(value);
93
+ const newAlphaIn = k.dividedBy(newTaoIn);
94
+ const alphaReturned = alphaIn.minus(newAlphaIn);
95
+ const alphaIdeal = value.multipliedBy(alphaIn).dividedBy(taoIn);
96
+ const slippage = alphaIdeal.minus(alphaReturned).dividedBy(alphaIdeal);
97
+ return slippage.toNumber();
98
+ } else if (params.type === _KoniTypes.ExtrinsicType.STAKING_UNBOND) {
99
+ const newAlphaIn = alphaIn.plus(value);
100
+ const newTaoReserve = k.dividedBy(newAlphaIn);
101
+ const taoReturned = taoIn.minus(newTaoReserve);
102
+ const taoIdeal = value.multipliedBy(taoIn).dividedBy(alphaIn);
103
+ const slippage = taoIdeal.minus(taoReturned).dividedBy(taoIdeal);
104
+ return slippage.toNumber();
105
+ }
106
+ return 0;
107
+ }
77
108
  get maintainBalance() {
78
109
  const ed = new _util.BN(this.nativeToken.minAmount || '0');
79
110
  const calculateMaintainBalance = new _util.BN(15).mul(ed).div(_util.BN_TEN);
@@ -82,6 +113,9 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
82
113
  }
83
114
  async init() {
84
115
  try {
116
+ if (this.isInit || !this.substrateApi) {
117
+ return;
118
+ }
85
119
  const substrateApi = await this.substrateApi.isReady;
86
120
  const dynamicInfo = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
87
121
  const subnetsInfo = (await substrateApi.api.call.subnetInfoRuntimeApi.getSubnetsInfoV2()).toJSON();
@@ -118,18 +152,14 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
118
152
  /* Subscribe pool info */
119
153
 
120
154
  async subscribePoolInfo(callback) {
121
- if (!this.isInit) {
122
- await this.init();
123
- }
155
+ await this.init();
124
156
  let cancel = false;
125
- const substrateApi = await this.substrateApi.isReady;
126
157
  const updateStakingInfo = async () => {
158
+ await this.substrateApi.isReady;
127
159
  try {
128
160
  if (cancel) {
129
161
  return;
130
162
  }
131
- const minDelegatorStake = (await substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
132
- const BNminDelegatorStake = new _bignumber.default(minDelegatorStake.toString());
133
163
  this.subnetData.forEach(subnet => {
134
164
  const netuid = subnet.netuid.toString().padStart(2, '0');
135
165
  const subnetSlug = `${this.slug}__subnet_${netuid.padStart(2, '0')}`;
@@ -156,7 +186,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
156
186
  maxCandidatePerFarmer: subnet.maxAllowedValidators,
157
187
  maxWithdrawalRequestPerFarmer: 1,
158
188
  earningThreshold: {
159
- join: BNminDelegatorStake.toString(),
189
+ join: DEFAULT_DTAO_MINBOND,
160
190
  defaultUnstake: '0',
161
191
  fastUnstake: '0'
162
192
  },
@@ -175,7 +205,6 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
175
205
  const subscribeStakingMetadataInterval = () => {
176
206
  updateStakingInfo().catch(console.error);
177
207
  };
178
- await substrateApi.isReady;
179
208
  subscribeStakingMetadataInterval();
180
209
  const interval = setInterval(subscribeStakingMetadataInterval, _constants.BITTENSOR_REFRESH_STAKE_APY);
181
210
  return () => {
@@ -187,9 +216,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
187
216
  /* Subscribe pool position */
188
217
 
189
218
  async parseNominatorMetadata(chainInfo, address, delegatorState) {
219
+ await this.substrateApi.isReady;
190
220
  const nominationList = [];
191
- const getMinDelegatorStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
192
- const minDelegatorStake = (await getMinDelegatorStake).toString();
193
221
  let allActiveStake = _util.BN_ZERO;
194
222
  for (const delegate of delegatorState) {
195
223
  const stake = new _bignumber.default(delegate.amount);
@@ -203,7 +231,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
203
231
  chain: chainInfo.slug,
204
232
  validatorAddress: delegate.owner,
205
233
  activeStake: delegate.amount,
206
- validatorMinStake: minDelegatorStake,
234
+ validatorMinStake: DEFAULT_DTAO_MINBOND,
207
235
  originActiveStake: originActiveStake,
208
236
  validatorIdentity: delegate.identity
209
237
  });
@@ -222,9 +250,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
222
250
  };
223
251
  }
224
252
  async subscribePoolPosition(useAddresses, rsCallback) {
225
- if (!this.isInit) {
226
- await this.init();
227
- }
253
+ await this.init();
228
254
  let cancel = false;
229
255
  const substrateApi = await this.substrateApi.isReady;
230
256
  const defaultInfo = this.baseInfo;
@@ -232,17 +258,17 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
232
258
  const _delegateInfo = await this.bittensorCache.get();
233
259
  const getPoolPosition = async () => {
234
260
  const rawDelegateStateInfos = await Promise.all(useAddresses.map(async address => (await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkey(address)).toJSON()));
235
- const price = await getTaoToAlphaMapping(this.substrateApi);
261
+ const price = await getAlphaToTaoMapping(this.substrateApi);
236
262
  if (rawDelegateStateInfos && rawDelegateStateInfos.length > 0) {
237
263
  rawDelegateStateInfos.forEach((rawDelegateStateInfo, i) => {
238
- const owner = (0, _utils2.reformatAddress)(useAddresses[i], 42);
264
+ const owner = (0, _utils3.reformatAddress)(useAddresses[i], 42);
239
265
  const delegateStateInfo = rawDelegateStateInfo;
240
266
  const subnetPositions = {};
241
267
  for (const delegate of delegateStateInfo) {
242
268
  const hotkey = delegate.hotkey;
243
269
  const netuid = delegate.netuid;
244
270
  const stake = new _bignumber.default(delegate.stake);
245
- const taoToAlphaPrice = new _bignumber.default(price[netuid]);
271
+ const aplhaToTaoPrice = new _bignumber.default(price[netuid]);
246
272
  if (!subnetPositions[netuid]) {
247
273
  subnetPositions[netuid] = {
248
274
  delegatorState: [],
@@ -258,7 +284,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
258
284
  subnetPositions[netuid].delegatorState.push({
259
285
  owner: hotkey,
260
286
  amount: stake.toString(),
261
- rate: taoToAlphaPrice,
287
+ rate: aplhaToTaoPrice,
262
288
  identity: identity
263
289
  });
264
290
  subnetPositions[netuid].totalBalance = subnetPositions[netuid].totalBalance.add(new _util.BN(stake.toString()));
@@ -335,9 +361,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
335
361
  // eslint-disable-next-line @typescript-eslint/require-await
336
362
  async getDevnetPoolTargets() {
337
363
  const testnetDelegate = (await this.substrateApi.api.call.delegateInfoRuntimeApi.getDelegates()).toJSON();
338
- const getNominatorMinRequiredStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
339
- const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
340
- const bnMinBond = new _util.BN(nominatorMinRequiredStake);
364
+ const bnMinBond = new _util.BN(DEFAULT_DTAO_MINBOND);
341
365
  const filteredDelegates = testnetDelegate.filter(delegate => {
342
366
  return delegate.returnPer1000 !== 0;
343
367
  });
@@ -358,9 +382,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
358
382
  async getMainnetPoolTargets() {
359
383
  const _topValidator = await this.bittensorCache.get();
360
384
  const topValidator = _topValidator;
361
- const getNominatorMinRequiredStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
362
- const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
363
- const bnMinBond = new _util.BN(nominatorMinRequiredStake);
385
+ const bnMinBond = new _util.BN(DEFAULT_DTAO_MINBOND);
364
386
  const validatorList = topValidator.data;
365
387
  const validatorAddresses = Object.keys(validatorList);
366
388
  const results = await Promise.all(validatorAddresses.map(i => {
@@ -372,7 +394,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
372
394
  const commission = validatorList[i].take;
373
395
  const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
374
396
  const apr = (parseFloat(validatorList[i].apr) / 10 ** 9 * 100).toFixed(2);
375
- const apyCalculate = (0, _utils3.calculateReward)(parseFloat(apr));
397
+ const apyCalculate = (0, _utils4.calculateReward)(parseFloat(apr));
376
398
  const name = validatorList[i].name || address;
377
399
  return {
378
400
  address: address,
@@ -393,9 +415,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
393
415
  return results;
394
416
  }
395
417
  async getPoolTargets() {
396
- if (!this.isInit) {
397
- await this.init();
398
- }
418
+ await this.init();
399
419
  if (this.chain === 'bittensor') {
400
420
  return this.getMainnetPoolTargets();
401
421
  } else {
@@ -416,14 +436,31 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
416
436
  } = data;
417
437
  const chainApi = await this.substrateApi.isReady;
418
438
  const binaryAmount = new _util.BN(amount);
439
+ const price = await getAlphaToTaoMapping(this.substrateApi);
440
+ const alphaToTaoPrice = new _bignumber.default(price[netuid]);
441
+ const limitPrice = alphaToTaoPrice.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).multipliedBy(1 + DEFAULT_BITTENSOR_SLIPPAGE);
442
+ const BNlimitPrice = new _util.BN(limitPrice.integerValue(_bignumber.BigNumber.ROUND_CEIL).toFixed());
419
443
  const selectedValidatorInfo = targetValidators[0];
420
444
  const hotkey = selectedValidatorInfo.address;
421
- const extrinsic = chainApi.api.tx.subtensorModule.addStake(hotkey, netuid, binaryAmount);
445
+ const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount, BNlimitPrice, false);
422
446
  return [extrinsic, {
423
447
  slug: this.nativeToken.slug,
424
448
  amount: '0'
425
449
  }];
426
450
  }
451
+ async validateYieldJoin(data, path) {
452
+ const baseErrors = await super.validateYieldJoin(data, path);
453
+ if (baseErrors.length > 0) {
454
+ return baseErrors;
455
+ }
456
+ const {
457
+ amount
458
+ } = data;
459
+ if (new _util.BN(amount).lt(new _util.BN(DEFAULT_DTAO_MINBOND))) {
460
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Insufficient stake. You need to stake at least ${(0, _utils3.formatNumber)(DEFAULT_DTAO_MINBOND, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to earn rewards`))];
461
+ }
462
+ return baseErrors;
463
+ }
427
464
 
428
465
  /* Join pool action */
429
466
 
@@ -432,12 +469,36 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
432
469
  async handleYieldUnstake(amount, address, selectedTarget, netuid) {
433
470
  const apiPromise = await this.substrateApi.isReady;
434
471
  const binaryAmount = new _util.BN(amount);
472
+ const price = await getAlphaToTaoMapping(this.substrateApi);
473
+ const alphaToTaoPrice = new _bignumber.default(price[netuid]);
474
+ const limitPrice = alphaToTaoPrice.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).multipliedBy(1 - DEFAULT_BITTENSOR_SLIPPAGE);
475
+ const BNlimitPrice = new _util.BN(limitPrice.integerValue(_bignumber.BigNumber.ROUND_CEIL).toFixed());
435
476
  if (!selectedTarget) {
436
477
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
437
478
  }
438
- const extrinsic = apiPromise.api.tx.subtensorModule.removeStake(selectedTarget, netuid, binaryAmount);
479
+ const extrinsic = apiPromise.api.tx.subtensorModule.removeStakeLimit(selectedTarget, netuid, binaryAmount, BNlimitPrice, false);
439
480
  return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
440
481
  }
482
+ async validateYieldLeave(amount, address, fastLeave, selectedTarget, slug, poolInfo) {
483
+ var _poolInfo$metadata$su;
484
+ const baseErrors = await super.validateYieldLeave(amount, address, fastLeave, selectedTarget, slug);
485
+ if (baseErrors.length > 0) {
486
+ return baseErrors;
487
+ }
488
+ if (!poolInfo) {
489
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS)];
490
+ }
491
+ const netuid = (_poolInfo$metadata$su = poolInfo.metadata.subnetData) === null || _poolInfo$metadata$su === void 0 ? void 0 : _poolInfo$metadata$su.netuid;
492
+ const price = await getAlphaToTaoMapping(this.substrateApi);
493
+ const minUnstake = new _bignumber.default(DEFAULT_DTAO_MINBOND).dividedBy(new _bignumber.default(price[netuid]));
494
+ console.log('minUnstake', minUnstake.dividedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).toString());
495
+ const formattedMinUnstake = minUnstake.dividedBy(1000000).integerValue(_bignumber.BigNumber.ROUND_CEIL).dividedBy(1000);
496
+ if (new _bignumber.default(amount).lt(formattedMinUnstake.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)))) {
497
+ var _poolInfo$metadata$su2;
498
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to unstake at least ${formattedMinUnstake.toString()} ${((_poolInfo$metadata$su2 = poolInfo.metadata.subnetData) === null || _poolInfo$metadata$su2 === void 0 ? void 0 : _poolInfo$metadata$su2.subnetSymbol) || ''}`))];
499
+ }
500
+ return baseErrors;
501
+ }
441
502
 
442
503
  /* Leave pool action */
443
504
  }
@@ -9,12 +9,15 @@ var _TransactionError = require("@subwallet/extension-base/background/errors/Tra
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
10
  var _constants = require("@subwallet/extension-base/constants");
11
11
  var _utils = require("@subwallet/extension-base/koni/api/staking/bonding/utils");
12
+ var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
12
13
  var _basePara = _interopRequireDefault(require("@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para"));
13
14
  var _types = require("@subwallet/extension-base/types");
14
- var _utils2 = require("@subwallet/extension-base/utils");
15
+ var _utils3 = require("@subwallet/extension-base/utils");
15
16
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
17
+ var _i18next = require("i18next");
16
18
  var _util = require("@polkadot/util");
17
- var _utils3 = require("../../utils");
19
+ var _utils4 = require("../../utils");
20
+ var _dtao = require("./dtao");
18
21
  // Copyright 2019-2022 @subwallet/extension-base
19
22
  // SPDX-License-Identifier: Apache-2.0
20
23
 
@@ -279,7 +282,7 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
279
282
  const rawDelegateStateInfos = await Promise.all(useAddresses.map(async address => (await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkey(address)).toJSON()));
280
283
  if (rawDelegateStateInfos && rawDelegateStateInfos.length > 0) {
281
284
  rawDelegateStateInfos.forEach((rawDelegateStateInfo, i) => {
282
- const owner = (0, _utils2.reformatAddress)(useAddresses[i], 42);
285
+ const owner = (0, _utils3.reformatAddress)(useAddresses[i], 42);
283
286
  const delegatorState = [];
284
287
  let bnTotalBalance = _util.BN_ZERO;
285
288
  const delegateStateInfo = rawDelegateStateInfo;
@@ -449,7 +452,7 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
449
452
  const commission = validatorList[i].take;
450
453
  const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
451
454
  const apr = (parseFloat(validatorList[i].apr) / 10 ** 9 * 100).toFixed(2);
452
- const apyCalculate = (0, _utils3.calculateReward)(parseFloat(apr));
455
+ const apyCalculate = (0, _utils4.calculateReward)(parseFloat(apr));
453
456
  const name = validatorList[i].name || address;
454
457
  return {
455
458
  address: address,
@@ -497,6 +500,19 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
497
500
  amount: '0'
498
501
  }];
499
502
  }
503
+ async validateYieldJoin(data, path) {
504
+ const baseErrors = await super.validateYieldJoin(data, path);
505
+ if (baseErrors.length > 0) {
506
+ return baseErrors;
507
+ }
508
+ const {
509
+ amount
510
+ } = data;
511
+ if (new _util.BN(amount).lt(new _util.BN(_dtao.DEFAULT_DTAO_MINBOND))) {
512
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Insufficient stake. You need to stake at least ${(0, _utils3.formatNumber)(_dtao.DEFAULT_DTAO_MINBOND, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to earn rewards`))];
513
+ }
514
+ return baseErrors;
515
+ }
500
516
 
501
517
  /* Join pool action */
502
518
 
@@ -512,6 +528,20 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
512
528
  const extrinsic = apiPromise.api.tx.subtensorModule.removeStake(selectedTarget, 0, binaryAmount);
513
529
  return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
514
530
  }
531
+ async validateYieldLeave(amount, address, fastLeave, selectedTarget, slug, poolInfo) {
532
+ const baseErrors = await super.validateYieldLeave(amount, address, fastLeave, selectedTarget, slug);
533
+ if (baseErrors.length > 0) {
534
+ return baseErrors;
535
+ }
536
+ if (!poolInfo) {
537
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS)];
538
+ }
539
+ const bnMinUnstake = new _bignumber.default(_dtao.DEFAULT_DTAO_MINBOND);
540
+ if (new _bignumber.default(amount).lt(bnMinUnstake)) {
541
+ 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)}`))];
542
+ }
543
+ return baseErrors;
544
+ }
515
545
 
516
546
  /* Leave pool action */
517
547
  }
@@ -752,7 +752,7 @@ class EarningService {
752
752
  } = params;
753
753
  const handler = this.getPoolHandler(slug);
754
754
  if (handler) {
755
- return handler.validateYieldLeave(params.amount, params.address, params.fastLeave, params.selectedTarget, slug);
755
+ return handler.validateYieldLeave(params.amount, params.address, params.fastLeave, params.selectedTarget, slug, params.poolInfo);
756
756
  } else {
757
757
  return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
758
758
  }
@@ -811,6 +811,18 @@ class EarningService {
811
811
  return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
812
812
  }
813
813
  }
814
+ async yieldGetEarningSlippage(params) {
815
+ await this.eventService.waitChainReady;
816
+ const {
817
+ slug
818
+ } = params;
819
+ const handler = this.getPoolHandler(slug);
820
+ if (handler) {
821
+ return handler.getEarningSlippage(params);
822
+ } else {
823
+ return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
824
+ }
825
+ }
814
826
 
815
827
  /* Other */
816
828
 
@@ -25,11 +25,8 @@ class MigrationService {
25
25
  const JobClass = _scripts.default[keys[i]];
26
26
  const key = keys[i];
27
27
  const name = JobClass.name;
28
- const check = await this.state.dbService.stores.migration.table.where({
29
- name,
30
- key
31
- }).first();
32
- if (!check || key.startsWith(_scripts.EVERYTIME)) {
28
+ const existed = await this.state.dbService.hasRunScript(key);
29
+ if (!existed || key.startsWith(_scripts.EVERYTIME)) {
33
30
  const job = new JobClass(this.state);
34
31
  await job.run();
35
32
  await this.state.dbService.stores.migration.table.put({
@@ -19,17 +19,13 @@ var _MigrateEthProvider = _interopRequireDefault(require("./providers/MigrateEth
19
19
  var _MigratePioneerProvider = _interopRequireDefault(require("./providers/MigratePioneerProvider"));
20
20
  var _MigrateProvidersV1M1P = _interopRequireDefault(require("./providers/MigrateProvidersV1M1P24"));
21
21
  var _MigratePolygonUSDCProvider = _interopRequireDefault(require("./tokens/MigratePolygonUSDCProvider"));
22
- var _AutoEnableChainsTokens = _interopRequireDefault(require("./AutoEnableChainsTokens"));
23
22
  var _DeleteChain = _interopRequireDefault(require("./DeleteChain"));
24
23
  var _DeleteChainStaking = _interopRequireDefault(require("./DeleteChainStaking"));
25
24
  var _DeleteEarningData = _interopRequireDefault(require("./DeleteEarningData"));
26
25
  var _EnableVaraChain = _interopRequireDefault(require("./EnableVaraChain"));
27
26
  var _MigrateAuthUrls = _interopRequireDefault(require("./MigrateAuthUrls"));
28
- var _MigrateAutoLock = _interopRequireDefault(require("./MigrateAutoLock"));
29
- var _MigrateChainPatrol = _interopRequireDefault(require("./MigrateChainPatrol"));
30
27
  var _MigrateImportedToken = _interopRequireDefault(require("./MigrateImportedToken"));
31
28
  var _MigrateNetworkSettings = _interopRequireDefault(require("./MigrateNetworkSettings"));
32
- var _MigrateSettings = _interopRequireDefault(require("./MigrateSettings"));
33
29
  var _MigrateTokenDecimals = _interopRequireDefault(require("./MigrateTokenDecimals"));
34
30
  var _MigrateTransactionHistory = _interopRequireDefault(require("./MigrateTransactionHistory"));
35
31
  var _MigrateTransactionHistoryBridge = _interopRequireDefault(require("./MigrateTransactionHistoryBridge"));
@@ -46,11 +42,11 @@ var _default = {
46
42
  '1.0.1-11': _MigrateNetworkSettings.default,
47
43
  '1.0.1-20': _MigrateImportedToken.default,
48
44
  '1.0.1-30': _MigrateTransactionHistory.default,
49
- '1.0.1-40': _AutoEnableChainsTokens.default,
50
- '1.0.1-50': _MigrateSettings.default,
45
+ // '1.0.1-40': AutoEnableChainsTokens,
46
+ // '1.0.1-50': MigrateSettings,
51
47
  '1.0.1-60': _MigrateAuthUrls.default,
52
- '1.0.3-01': _MigrateAutoLock.default,
53
- '1.0.3-02': _MigrateChainPatrol.default,
48
+ // '1.0.3-01': MigrateAutoLock,
49
+ // '1.0.3-02': MigrateChainPatrol,
54
50
  '1.0.9-01': _MigrateLedgerAccount.default,
55
51
  '1.0.12-02': _MigrateEthProvider.default,
56
52
  '1.1.6-01': _MigrateWalletReference.default,
@@ -4,13 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getPriceMap = exports.getExchangeRateMap = void 0;
7
+ var _constants = require("@subwallet/extension-base/constants");
7
8
  var _staticData = require("@subwallet/extension-base/utils/staticData");
8
9
  var _util = require("@polkadot/util");
9
10
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
11
  // SPDX-License-Identifier: Apache-2.0
11
12
 
12
13
  const DEFAULT_CURRENCY = 'USD';
14
+ const DERIVATIVE_TOKEN_SLUG_LIST = ['susds', 'savings-dai'];
13
15
  let useBackupApi = false;
16
+ const apiCacheDomain = _constants.isProductionMode ? 'https://api-cache.subwallet.app' : 'https://api-cache-dev.subwallet.app';
14
17
  const getExchangeRateMap = async () => {
15
18
  let response;
16
19
  try {
@@ -40,12 +43,45 @@ const getExchangeRateMap = async () => {
40
43
  }
41
44
  };
42
45
  exports.getExchangeRateMap = getExchangeRateMap;
46
+ const fetchDerivativeTokenSlugs = async () => {
47
+ try {
48
+ const response = await fetch(`${apiCacheDomain}/api/price/derivative-list`);
49
+ if (!response.ok) {
50
+ throw new Error(`HTTP error! Status: ${response.status}`);
51
+ }
52
+ const data = await response.json();
53
+ const apiSlugs = Array.isArray(data) && data.every(item => typeof item === 'string') ? data : [];
54
+ return new Set(apiSlugs.length > 0 ? apiSlugs : DERIVATIVE_TOKEN_SLUG_LIST);
55
+ } catch (error) {
56
+ console.error('Error fetching derivative token slugs from API:', error);
57
+ return new Set(DERIVATIVE_TOKEN_SLUG_LIST);
58
+ }
59
+ };
43
60
  const getPriceMap = async function (priceIds) {
44
61
  let currency = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'USD';
45
62
  const idStr = Array.from(priceIds).join(',');
46
63
  let response;
47
64
  try {
48
65
  var _response3, _response5;
66
+ const derivativePriceMap = {};
67
+ let derivativeApiError = false;
68
+ try {
69
+ const responseDerivativeTokens = await fetch(`${apiCacheDomain}/api/price/derivative-get`);
70
+ const generateDerivativePriceRaw = (await (responseDerivativeTokens === null || responseDerivativeTokens === void 0 ? void 0 : responseDerivativeTokens.json())) || [];
71
+ if (Array.isArray(generateDerivativePriceRaw)) {
72
+ generateDerivativePriceRaw.forEach(token => {
73
+ if (token.id) {
74
+ derivativePriceMap[token.id] = token.derived_price;
75
+ }
76
+ });
77
+ } else {
78
+ console.warn('Invalid data from derivative API:', generateDerivativePriceRaw);
79
+ derivativeApiError = true;
80
+ }
81
+ } catch (error) {
82
+ console.error('Error fetching derivative API:', error);
83
+ derivativeApiError = true;
84
+ }
49
85
  if (!useBackupApi) {
50
86
  try {
51
87
  response = await fetch(`https://api.coingecko.com/api/v3/coins/markets?vs_currency=${currency.toLowerCase()}&per_page=250&ids=${idStr}`);
@@ -82,6 +118,19 @@ const getPriceMap = async function (priceIds) {
82
118
  priceMap[val.id] = currentPrice;
83
119
  price24hMap[val.id] = price24h;
84
120
  });
121
+ const derivativeTokenSlugs = await fetchDerivativeTokenSlugs();
122
+
123
+ // TODO: The API for derivatives does not provide a 24-hour price change value.
124
+ if (derivativeApiError) {
125
+ derivativeTokenSlugs.forEach(slug => {
126
+ priceMap[slug] = 0;
127
+ });
128
+ } else {
129
+ Object.entries(derivativePriceMap).forEach(_ref2 => {
130
+ let [slug, derivedPrice] = _ref2;
131
+ priceMap[slug] = derivedPrice;
132
+ });
133
+ }
85
134
  return {
86
135
  currency,
87
136
  currencyData,
@@ -44,6 +44,9 @@ function getBlockExplorerAccountRoute(explorerLink) {
44
44
  if (explorerLink.includes('laos.statescan.io')) {
45
45
  return '#/accounts';
46
46
  }
47
+ if (explorerLink.includes('polimec.statescan.io')) {
48
+ return '#/accounts';
49
+ }
47
50
  if (explorerLink.includes('explorer.zkverify.io')) {
48
51
  return 'account';
49
52
  }
@@ -65,7 +68,7 @@ function getBlockExplorerTxRoute(chainInfo) {
65
68
  if (['aventus', 'deeper_network'].includes(chainInfo.slug)) {
66
69
  return 'transaction';
67
70
  }
68
- if (['invarch', 'tangle'].includes(chainInfo.slug)) {
71
+ if (['invarch', 'tangle', 'polimec'].includes(chainInfo.slug)) {
69
72
  return '#/extrinsics';
70
73
  }
71
74
  return 'extrinsic';
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.filterAssetsByChainAndType = void 0;
6
+ exports.filterAssetsByChainAndType = exports.filterAlphaAssetsByChain = void 0;
7
+ var _types = require("@subwallet/chain-list/types");
8
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
7
9
  // Copyright 2019-2022 @subwallet/extension-base
8
10
  // SPDX-License-Identifier: Apache-2.0
9
11
 
@@ -16,4 +18,17 @@ const filterAssetsByChainAndType = (chainAssetMap, chain, assetTypes) => {
16
18
  });
17
19
  return result;
18
20
  };
19
- exports.filterAssetsByChainAndType = filterAssetsByChainAndType;
21
+ exports.filterAssetsByChainAndType = filterAssetsByChainAndType;
22
+ const filterAlphaAssetsByChain = (chainAssetMap, chain) => {
23
+ const result = {};
24
+ Object.values(chainAssetMap).forEach(assetInfo => {
25
+ if (assetInfo.assetType === _types._AssetType.LOCAL && assetInfo.originChain === chain) {
26
+ const netuid = (0, _utils._getAssetNetuid)(assetInfo);
27
+ if (netuid !== -1) {
28
+ result[assetInfo.slug] = assetInfo;
29
+ }
30
+ }
31
+ });
32
+ return result;
33
+ };
34
+ exports.filterAlphaAssetsByChain = filterAlphaAssetsByChain;
@@ -19,7 +19,7 @@ export declare const CRON_RECOVER_HISTORY_INTERVAL = 30000;
19
19
  export declare const CRON_SYNC_MANTA_PAY = 300000;
20
20
  export declare const MANTA_PAY_BALANCE_INTERVAL = 30000;
21
21
  export declare const BITTENSOR_REFRESH_STAKE_INFO = 30000;
22
- export declare const BITTENSOR_REFRESH_STAKE_APY = 300000;
22
+ export declare const BITTENSOR_REFRESH_STAKE_APY = 30000;
23
23
  export declare const CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL: number;
24
24
  export declare const CRON_LISTEN_AVAIL_BRIDGE_CLAIM = 1800000;
25
25
  export declare const ALL_ACCOUNT_KEY = "ALL";
@@ -21,7 +21,7 @@ export const CRON_RECOVER_HISTORY_INTERVAL = 30000;
21
21
  export const CRON_SYNC_MANTA_PAY = 300000;
22
22
  export const MANTA_PAY_BALANCE_INTERVAL = 30000;
23
23
  export const BITTENSOR_REFRESH_STAKE_INFO = 30000;
24
- export const BITTENSOR_REFRESH_STAKE_APY = 300000;
24
+ export const BITTENSOR_REFRESH_STAKE_APY = 30000;
25
25
  export const CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL = 15 * BASE_MINUTE_INTERVAL;
26
26
  export const CRON_LISTEN_AVAIL_BRIDGE_CLAIM = 1800000;
27
27
  export const ALL_ACCOUNT_KEY = 'ALL';
@@ -242,6 +242,7 @@ export default class KoniExtension {
242
242
  private yieldSubmitWithdrawal;
243
243
  private yieldSubmitCancelWithdrawal;
244
244
  private yieldSubmitClaimReward;
245
+ private yieldGetEarningSlippage;
245
246
  private unlockDotCheckCanMint;
246
247
  private unlockDotSubscribeMintedData;
247
248
  private subscribeProcessingBanner;
@@ -3406,6 +3406,17 @@ export default class KoniExtension {
3406
3406
  chainType: (poolHandler === null || poolHandler === void 0 ? void 0 : poolHandler.transactionChainType) || ChainType.SUBSTRATE
3407
3407
  });
3408
3408
  }
3409
+ async yieldGetEarningSlippage(params) {
3410
+ const {
3411
+ slug
3412
+ } = params;
3413
+ const poolHandler = this.#koniState.earningService.getPoolHandler(slug);
3414
+ if (!poolHandler) {
3415
+ return this.#koniState.transactionService.generateBeforeHandleResponseErrors([new TransactionError(BasicTxErrorType.INVALID_PARAMS)]);
3416
+ }
3417
+ const slippage = await this.#koniState.earningService.yieldGetEarningSlippage(params);
3418
+ return slippage;
3419
+ }
3409
3420
 
3410
3421
  /* Campaign */
3411
3422
 
@@ -4320,6 +4331,8 @@ export default class KoniExtension {
4320
4331
  return await this.yieldSubmitCancelWithdrawal(request);
4321
4332
  case 'pri(yield.claimReward.submit)':
4322
4333
  return await this.yieldSubmitClaimReward(request);
4334
+ case 'pri(yield.getEarningSlippage)':
4335
+ return await this.yieldGetEarningSlippage(request);
4323
4336
 
4324
4337
  /* Others */
4325
4338