@subwallet/extension-base 1.3.23-0 → 1.3.25-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 (91) hide show
  1. package/background/KoniTypes.d.ts +11 -3
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/EvmProviderError.js +4 -0
  4. package/background/errors/ProviderError.d.ts +1 -1
  5. package/background/errors/ProviderError.js +2 -2
  6. package/cjs/background/KoniTypes.js +1 -0
  7. package/cjs/background/errors/EvmProviderError.js +4 -0
  8. package/cjs/background/errors/ProviderError.js +2 -2
  9. package/cjs/constants/environment.js +1 -1
  10. package/cjs/constants/index.js +21 -4
  11. package/cjs/core/logic-validation/transfer.js +23 -8
  12. package/cjs/koni/background/handlers/Extension.js +109 -89
  13. package/cjs/koni/background/handlers/State.js +2 -2
  14. package/cjs/koni/background/handlers/Tabs.js +4 -3
  15. package/cjs/packageInfo.js +1 -1
  16. package/cjs/page/index.js +1 -1
  17. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +3 -3
  18. package/cjs/services/balance-service/transfer/smart-contract.js +24 -3
  19. package/cjs/services/buy-service/constants/token.js +3 -0
  20. package/cjs/services/chain-service/index.js +11 -0
  21. package/cjs/services/earning-service/constants/chains.js +1 -1
  22. package/cjs/services/earning-service/handlers/base.js +11 -5
  23. package/cjs/services/earning-service/handlers/native-staking/base-para.js +7 -6
  24. package/cjs/services/earning-service/handlers/native-staking/base.js +6 -3
  25. package/cjs/services/earning-service/handlers/native-staking/dtao.js +444 -0
  26. package/cjs/services/earning-service/handlers/native-staking/index.js +8 -1
  27. package/cjs/services/earning-service/handlers/native-staking/tao.js +138 -125
  28. package/cjs/services/earning-service/service.js +14 -4
  29. package/cjs/services/fee-service/utils/tokenPayFee.js +151 -0
  30. package/cjs/services/inapp-notification-service/index.js +3 -0
  31. package/cjs/services/request-service/handler/MetadataRequestHandler.js +5 -13
  32. package/cjs/services/request-service/index.js +2 -2
  33. package/cjs/services/transaction-service/index.js +14 -5
  34. package/cjs/types/yield/info/base.js +1 -0
  35. package/cjs/utils/fee/transfer.js +47 -14
  36. package/cjs/utils/fetchEvmChainInfo.js +10 -5
  37. package/constants/environment.js +1 -1
  38. package/constants/index.d.ts +6 -1
  39. package/constants/index.js +14 -1
  40. package/core/logic-validation/transfer.d.ts +1 -1
  41. package/core/logic-validation/transfer.js +25 -10
  42. package/koni/background/handlers/Extension.js +82 -62
  43. package/koni/background/handlers/State.d.ts +1 -1
  44. package/koni/background/handlers/State.js +2 -2
  45. package/koni/background/handlers/Tabs.js +4 -3
  46. package/package.json +16 -6
  47. package/packageInfo.js +1 -1
  48. package/page/index.js +1 -1
  49. package/services/balance-service/helpers/subscribe/substrate/index.js +2 -2
  50. package/services/balance-service/transfer/smart-contract.d.ts +4 -2
  51. package/services/balance-service/transfer/smart-contract.js +24 -3
  52. package/services/buy-service/constants/token.js +3 -0
  53. package/services/chain-service/index.d.ts +1 -0
  54. package/services/chain-service/index.js +12 -1
  55. package/services/earning-service/constants/chains.js +1 -1
  56. package/services/earning-service/handlers/base.d.ts +7 -5
  57. package/services/earning-service/handlers/base.js +11 -7
  58. package/services/earning-service/handlers/native-staking/base-para.d.ts +1 -1
  59. package/services/earning-service/handlers/native-staking/base-para.js +7 -6
  60. package/services/earning-service/handlers/native-staking/base.d.ts +1 -1
  61. package/services/earning-service/handlers/native-staking/base.js +6 -3
  62. package/services/earning-service/handlers/native-staking/dtao.d.ts +64 -0
  63. package/services/earning-service/handlers/native-staking/dtao.js +434 -0
  64. package/services/earning-service/handlers/native-staking/index.d.ts +1 -0
  65. package/services/earning-service/handlers/native-staking/index.js +2 -1
  66. package/services/earning-service/handlers/native-staking/tao.d.ts +16 -4
  67. package/services/earning-service/handlers/native-staking/tao.js +136 -121
  68. package/services/earning-service/service.d.ts +1 -0
  69. package/services/earning-service/service.js +15 -5
  70. package/services/fee-service/interfaces.d.ts +25 -0
  71. package/services/fee-service/utils/tokenPayFee.d.ts +8 -0
  72. package/services/fee-service/utils/tokenPayFee.js +141 -0
  73. package/services/inapp-notification-service/index.js +3 -0
  74. package/services/request-service/handler/MetadataRequestHandler.d.ts +1 -1
  75. package/services/request-service/handler/MetadataRequestHandler.js +5 -13
  76. package/services/request-service/index.d.ts +1 -1
  77. package/services/request-service/index.js +2 -2
  78. package/services/transaction-service/index.js +16 -7
  79. package/types/bridge/index.d.ts +1 -0
  80. package/types/buy.d.ts +1 -1
  81. package/types/fee/option.d.ts +1 -1
  82. package/types/yield/actions/join/step.d.ts +1 -0
  83. package/types/yield/actions/join/submit.d.ts +1 -0
  84. package/types/yield/info/account/info.d.ts +14 -1
  85. package/types/yield/info/base.d.ts +3 -1
  86. package/types/yield/info/base.js +1 -0
  87. package/types/yield/info/chain/info.d.ts +5 -1
  88. package/utils/fee/transfer.d.ts +1 -1
  89. package/utils/fee/transfer.js +46 -13
  90. package/utils/fetchEvmChainInfo.d.ts +1 -1
  91. package/utils/fetchEvmChainInfo.js +10 -5
@@ -28,6 +28,12 @@ Object.defineProperty(exports, "RelayNativeStakingPoolHandler", {
28
28
  return _relayChain.default;
29
29
  }
30
30
  });
31
+ Object.defineProperty(exports, "SubnetTaoStakingPoolHandler", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _dtao.default;
35
+ }
36
+ });
31
37
  Object.defineProperty(exports, "TaoNativeStakingPoolHandler", {
32
38
  enumerable: true,
33
39
  get: function () {
@@ -38,4 +44,5 @@ var _amplitude = _interopRequireDefault(require("./amplitude"));
38
44
  var _astar = _interopRequireDefault(require("./astar"));
39
45
  var _relayChain = _interopRequireDefault(require("./relay-chain"));
40
46
  var _paraChain = _interopRequireDefault(require("./para-chain"));
41
- var _tao = _interopRequireDefault(require("./tao"));
47
+ var _tao = _interopRequireDefault(require("./tao"));
48
+ var _dtao = _interopRequireDefault(require("./dtao"));
@@ -4,9 +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.bittensorApiKey = exports.BITTENSOR_API_KEY_9 = exports.BITTENSOR_API_KEY_8 = exports.BITTENSOR_API_KEY_7 = exports.BITTENSOR_API_KEY_6 = exports.BITTENSOR_API_KEY_5 = exports.BITTENSOR_API_KEY_4 = exports.BITTENSOR_API_KEY_3 = exports.BITTENSOR_API_KEY_2 = exports.BITTENSOR_API_KEY_10 = exports.BITTENSOR_API_KEY_1 = void 0;
8
- exports.fetchDelegates = fetchDelegates;
9
- exports.getTaoToAlphaMapping = void 0;
7
+ exports.default = exports.bittensorApiKey = exports.BittensorCache = exports.BITTENSOR_API_KEY_9 = exports.BITTENSOR_API_KEY_8 = exports.BITTENSOR_API_KEY_7 = exports.BITTENSOR_API_KEY_6 = exports.BITTENSOR_API_KEY_5 = exports.BITTENSOR_API_KEY_4 = exports.BITTENSOR_API_KEY_3 = exports.BITTENSOR_API_KEY_2 = exports.BITTENSOR_API_KEY_10 = exports.BITTENSOR_API_KEY_1 = void 0;
10
8
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
11
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
12
10
  var _constants = require("@subwallet/extension-base/constants");
@@ -20,26 +18,6 @@ var _utils3 = require("../../utils");
20
18
  // Copyright 2019-2022 @subwallet/extension-base
21
19
  // SPDX-License-Identifier: Apache-2.0
22
20
 
23
- const getTaoToAlphaMapping = async substrateApi => {
24
- const allSubnets = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
25
- if (!allSubnets) {
26
- return {};
27
- }
28
- return allSubnets.reduce((acc, subnet) => {
29
- const netuid = subnet === null || subnet === void 0 ? void 0 : subnet.netuid;
30
- const taoIn = subnet !== null && subnet !== void 0 && subnet.taoIn ? new _bignumber.default(subnet.taoIn) : new _bignumber.default(0);
31
- const alphaIn = subnet !== null && subnet !== void 0 && subnet.alphaIn ? new _bignumber.default(subnet.alphaIn) : new _bignumber.default(0);
32
- if (netuid === 0) {
33
- acc[netuid] = '1';
34
- } else if (alphaIn.gt(0)) {
35
- acc[netuid] = taoIn.dividedBy(alphaIn).toString();
36
- } else {
37
- acc[netuid] = '1';
38
- }
39
- return acc;
40
- }, {});
41
- };
42
- exports.getTaoToAlphaMapping = getTaoToAlphaMapping;
43
21
  const BITTENSOR_API_KEY_1 = process.env.BITTENSOR_API_KEY_1 || '';
44
22
  exports.BITTENSOR_API_KEY_1 = BITTENSOR_API_KEY_1;
45
23
  const BITTENSOR_API_KEY_2 = process.env.BITTENSOR_API_KEY_2 || '';
@@ -74,19 +52,71 @@ const bittensorApiKey = () => {
74
52
 
75
53
  /* Fetch data */
76
54
  exports.bittensorApiKey = bittensorApiKey;
77
- async function fetchDelegates() {
78
- const apiKey = bittensorApiKey();
79
- return new Promise(function (resolve) {
80
- fetch('https://api.taostats.io/api/validator/latest/v1', {
81
- method: 'GET',
82
- headers: {
83
- 'Content-Type': 'application/json',
84
- Authorization: `${apiKey}`
55
+ class BittensorCache {
56
+ static instance = null;
57
+ cache = null;
58
+ cacheTimeout = null;
59
+ promise = null;
60
+
61
+ // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function
62
+ constructor() {}
63
+ static getInstance() {
64
+ if (!BittensorCache.instance) {
65
+ BittensorCache.instance = new BittensorCache();
66
+ }
67
+ return BittensorCache.instance;
68
+ }
69
+ async get() {
70
+ if (this.cache) {
71
+ return this.cache;
72
+ }
73
+ if (this.promise) {
74
+ return this.promise;
75
+ }
76
+ this.promise = this.fetchData();
77
+ return this.promise;
78
+ }
79
+ async fetchData() {
80
+ const apiKey = bittensorApiKey();
81
+ try {
82
+ const resp = await fetch('https://api.taostats.io/api/validator/latest/v1?limit=200', {
83
+ method: 'GET',
84
+ headers: {
85
+ 'Content-Type': 'application/json',
86
+ Authorization: `${apiKey}`
87
+ }
88
+ });
89
+ if (!resp.ok) {
90
+ console.error('Fetch bittensor delegates fail:', resp.status);
91
+ return this.cache || {
92
+ data: []
93
+ };
94
+ }
95
+ const rawData = await resp.json();
96
+ const data = {
97
+ data: rawData.data.filter(validator => parseFloat(validator.apr) > 0.0001)
98
+ };
99
+ this.cache = data;
100
+ this.promise = null;
101
+ if (this.cacheTimeout) {
102
+ clearTimeout(this.cacheTimeout);
85
103
  }
86
- }).then(resp => {
87
- resolve(resp.json());
88
- }).catch(console.error);
89
- });
104
+ this.cacheTimeout = setTimeout(() => {
105
+ this.fetchData().then(newData => {
106
+ if (newData.data.length > 0) {
107
+ this.cache = newData;
108
+ }
109
+ }).catch(console.error);
110
+ }, 60 * 2000);
111
+ return data;
112
+ } catch (error) {
113
+ console.error(error);
114
+ this.promise = null;
115
+ return this.cache || {
116
+ data: []
117
+ };
118
+ }
119
+ }
90
120
  }
91
121
 
92
122
  // export async function fetchTaoDelegateState (address: string): Promise<RawDelegateState> {
@@ -107,17 +137,31 @@ async function fetchDelegates() {
107
137
 
108
138
  /* Fetch data */
109
139
 
110
- const testnetDelegate = {
111
- '5G6wdAdS7hpBuH1tjuZDhpzrGw9Wf71WEVakDCxHDm1cxEQ2': {
112
- name: '0x436c6f776e4e616d65f09fa4a1',
113
- url: 'https://example.com ',
114
- image: 'https://example.com/image.png',
115
- discord: '0xe28094446973636f7264',
116
- description: 'This is an example identity.',
117
- additional: ''
118
- }
119
- };
140
+ // const testnetDelegate = {
141
+ // '5G6wdAdS7hpBuH1tjuZDhpzrGw9Wf71WEVakDCxHDm1cxEQ2': {
142
+ // name: '0x436c6f776e4e616d65f09fa4a1',
143
+ // url: 'https://example.com ',
144
+ // image: 'https://example.com/image.png',
145
+ // discord: '0xe28094446973636f7264',
146
+ // description: 'This is an example identity.',
147
+ // additional: ''
148
+ // }
149
+ // };
150
+ exports.BittensorCache = BittensorCache;
120
151
  class TaoNativeStakingPoolHandler extends _basePara.default {
152
+ availableMethod = {
153
+ join: true,
154
+ defaultUnstake: true,
155
+ fastUnstake: false,
156
+ cancelUnstake: false,
157
+ withdraw: false,
158
+ claimReward: false
159
+ };
160
+ constructor(state, chain) {
161
+ super(state, chain);
162
+ this.bittensorCache = BittensorCache.getInstance();
163
+ }
164
+
121
165
  /* Unimplemented function */
122
166
  handleYieldWithdraw(address, unstakingInfo) {
123
167
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
@@ -144,29 +188,33 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
144
188
  if (cancel) {
145
189
  return;
146
190
  }
147
- const minDelegatorStake = await substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
191
+ const minDelegatorStake = (await substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
192
+ const maxValidatorPerNominator = (await substrateApi.api.query.subtensorModule.maxAllowedValidators(0)).toPrimitive();
193
+ const taoIn = (await substrateApi.api.query.subtensorModule.subnetTAO(0)).toPrimitive();
194
+ const bnTaoIn = new _util.BN(taoIn);
148
195
  const BNminDelegatorStake = new _bignumber.default(minDelegatorStake.toString());
149
196
  const data = {
150
197
  ...this.baseInfo,
151
198
  type: this.type,
152
199
  metadata: {
153
200
  ...this.metadataInfo,
154
- description: this.getDescription('0')
201
+ description: this.getDescription()
155
202
  },
156
203
  statistic: {
157
204
  assetEarning: [{
158
205
  slug: this.nativeToken.slug
159
206
  }],
160
- maxCandidatePerFarmer: 16,
207
+ maxCandidatePerFarmer: Number(maxValidatorPerNominator),
161
208
  maxWithdrawalRequestPerFarmer: 1,
162
209
  earningThreshold: {
163
210
  join: BNminDelegatorStake.toString(),
164
211
  defaultUnstake: '0',
165
212
  fastUnstake: '0'
166
213
  },
167
- eraTime: 1.2,
214
+ eraTime: 24,
168
215
  era: 0,
169
- unstakingPeriod: 1.2
216
+ unstakingPeriod: 1.2,
217
+ tvl: bnTaoIn.toString()
170
218
  }
171
219
  };
172
220
  callback(data);
@@ -204,12 +252,11 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
204
252
  chain: chainInfo.slug,
205
253
  validatorAddress: delegate.owner,
206
254
  activeStake: activeStake,
207
- validatorMinStake: minDelegatorStake
208
- // validatorIdentity: delegate.identity
255
+ validatorMinStake: minDelegatorStake,
256
+ validatorIdentity: delegate.identity
209
257
  });
210
258
  }
211
259
  }
212
-
213
260
  const stakingStatus = (0, _utils.getEarningStatusByNominations)(allActiveStake, nominationList);
214
261
  return {
215
262
  status: stakingStatus,
@@ -227,44 +274,9 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
227
274
  const substrateApi = await this.substrateApi.isReady;
228
275
  const defaultInfo = this.baseInfo;
229
276
  const chainInfo = this.chainInfo;
230
- const getDevnetPoolPosition = async () => {
231
- const testnetAddress = Object.keys(testnetDelegate)[0];
232
- const delegatorState = [];
233
- let bnTotalBalance = _util.BN_ZERO;
234
- const stakePromises = useAddresses.map(async address => {
235
- const stakeAmount = (await substrateApi.api.query.subtensorModule.stake(testnetAddress, address)).toString();
236
- const bnStakeAmount = new _util.BN(stakeAmount);
237
- bnTotalBalance = bnTotalBalance.add(bnStakeAmount);
238
- delegatorState.push({
239
- owner: testnetAddress,
240
- amount: bnStakeAmount.toString()
241
- // identity: testnetAddress
242
- });
243
-
244
- rsCallback({
245
- ...defaultInfo,
246
- type: this.type,
247
- address: address,
248
- balanceToken: this.nativeToken.slug,
249
- totalStake: bnTotalBalance.toString(),
250
- activeStake: bnStakeAmount.toString(),
251
- unstakeBalance: '0',
252
- status: _types.EarningStatus.EARNING_REWARD,
253
- isBondedBefore: true,
254
- nominations: delegatorState.map(delegate => ({
255
- chain: this.chain,
256
- validatorAddress: delegate.owner,
257
- activeStake: delegate.amount,
258
- status: _types.EarningStatus.EARNING_REWARD
259
- })),
260
- unstakings: []
261
- });
262
- });
263
- await Promise.all(stakePromises);
264
- };
265
- const getMainnetPoolPosition = async () => {
277
+ const _delegateInfo = await this.bittensorCache.get();
278
+ const getPoolPosition = async () => {
266
279
  const rawDelegateStateInfos = await Promise.all(useAddresses.map(async address => (await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkey(address)).toJSON()));
267
- const price = await getTaoToAlphaMapping(this.substrateApi);
268
280
  if (rawDelegateStateInfos && rawDelegateStateInfos.length > 0) {
269
281
  rawDelegateStateInfos.forEach((rawDelegateStateInfo, i) => {
270
282
  const owner = (0, _utils2.reformatAddress)(useAddresses[i], 42);
@@ -276,19 +288,26 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
276
288
  const hotkey = delegate.hotkey;
277
289
  const netuid = delegate.netuid;
278
290
  const stake = new _bignumber.default(delegate.stake);
279
- const taoToAlphaPrice = price[netuid] ? new _bignumber.default(price[netuid]) : new _bignumber.default(1);
280
- const taoStake = stake.multipliedBy(taoToAlphaPrice).toFixed(0).toString();
281
- if (totalDelegate[hotkey]) {
282
- totalDelegate[hotkey] = new _bignumber.default(totalDelegate[hotkey]).plus(taoStake).toString();
283
- } else {
284
- totalDelegate[hotkey] = taoStake;
291
+ if (netuid === 0) {
292
+ const taoStake = stake.toFixed(0);
293
+ if (totalDelegate[hotkey]) {
294
+ totalDelegate[hotkey] = new _bignumber.default(totalDelegate[hotkey]).plus(taoStake).toFixed();
295
+ } else {
296
+ totalDelegate[hotkey] = taoStake;
297
+ }
285
298
  }
286
299
  }
287
300
  for (const hotkey in totalDelegate) {
288
301
  bnTotalBalance = bnTotalBalance.add(new _util.BN(totalDelegate[hotkey]));
302
+ let identity = '';
303
+ if (_delegateInfo) {
304
+ const delegateInfo = _delegateInfo.data.find(info => info.hotkey.ss58 === hotkey);
305
+ identity = delegateInfo ? delegateInfo.name : '';
306
+ }
289
307
  delegatorState.push({
290
308
  owner: hotkey,
291
- amount: totalDelegate[hotkey]
309
+ amount: totalDelegate[hotkey],
310
+ identity: identity
292
311
  });
293
312
  }
294
313
  if (delegateStateInfo && delegateStateInfo.length > 0) {
@@ -377,11 +396,7 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
377
396
  if (cancel) {
378
397
  return;
379
398
  }
380
- if (this.chain === 'bittensor_devnet') {
381
- await getDevnetPoolPosition();
382
- } else {
383
- await getMainnetPoolPosition();
384
- }
399
+ await getPoolPosition();
385
400
  };
386
401
  getStakingPositionInterval().catch(console.error);
387
402
  const intervalId = setInterval(() => {
@@ -399,28 +414,26 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
399
414
 
400
415
  // eslint-disable-next-line @typescript-eslint/require-await
401
416
  async getDevnetPoolTargets() {
402
- const _topValidator = testnetDelegate;
403
- const validatorAddresses = Object.keys(_topValidator);
404
- return validatorAddresses.map(address => {
405
- return {
406
- address: address,
407
- totalStake: '0',
408
- ownStake: '0',
409
- otherStake: '0',
410
- minBond: '0',
411
- nominatorCount: 0,
412
- commission: '0',
413
- expectedReturn: 0,
414
- blocked: false,
415
- isVerified: false,
416
- chain: this.chain,
417
- isCrowded: false,
418
- identity: address
419
- };
420
- });
417
+ const testnetDelegate = (await this.substrateApi.api.call.delegateInfoRuntimeApi.getDelegates()).toJSON();
418
+ const getNominatorMinRequiredStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
419
+ const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
420
+ const bnMinBond = new _util.BN(nominatorMinRequiredStake);
421
+ return testnetDelegate.map(delegate => ({
422
+ address: delegate.delegateSs58,
423
+ totalStake: '0',
424
+ ownStake: '0',
425
+ otherStake: '0',
426
+ minBond: bnMinBond.toString(),
427
+ nominatorCount: delegate.nominators.length,
428
+ commission: delegate.take / 1000,
429
+ blocked: false,
430
+ isVerified: false,
431
+ chain: this.chain,
432
+ isCrowded: false
433
+ }));
421
434
  }
422
435
  async getMainnetPoolTargets() {
423
- const _topValidator = await fetchDelegates();
436
+ const _topValidator = await this.bittensorCache.get();
424
437
  const topValidator = _topValidator;
425
438
  const getNominatorMinRequiredStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
426
439
  const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
@@ -457,10 +470,10 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
457
470
  return results;
458
471
  }
459
472
  async getPoolTargets() {
460
- if (this.chain === 'bittensor_devnet') {
461
- return this.getDevnetPoolTargets();
462
- } else {
473
+ if (this.chain === 'bittensor') {
463
474
  return this.getMainnetPoolTargets();
475
+ } else {
476
+ return this.getDevnetPoolTargets();
464
477
  }
465
478
  }
466
479
 
@@ -29,6 +29,7 @@ const fetchPoolsData = async () => {
29
29
  };
30
30
  class EarningService {
31
31
  handlers = {};
32
+ handlerCache = new Map();
32
33
  earningRewardSubject = new _rxjs.BehaviorSubject({
33
34
  ready: false,
34
35
  data: {}
@@ -74,7 +75,10 @@ class EarningService {
74
75
  handlers.push(new _handlers.AmplitudeNativeStakingPoolHandler(this.state, chain));
75
76
  }
76
77
  if (_constants2._STAKING_CHAIN_GROUP.bittensor.includes(chain)) {
78
+ // todo: check support for testnet
79
+ // Mainnet only
77
80
  handlers.push(new _handlers.TaoNativeStakingPoolHandler(this.state, chain));
81
+ handlers.push(new _handlers.SubnetTaoStakingPoolHandler(this.state, chain));
78
82
  }
79
83
  if (_constants2._STAKING_CHAIN_GROUP.mythos.includes(chain)) {
80
84
  handlers.push(new _mythos.default(this.state, chain));
@@ -260,7 +264,12 @@ class EarningService {
260
264
  /* Pools' info methods */
261
265
 
262
266
  getPoolHandler(slug) {
263
- return this.handlers[slug];
267
+ if (this.handlerCache.has(slug)) {
268
+ return this.handlerCache.get(slug);
269
+ }
270
+ const handler = Object.values(this.handlers).find(h => h.canHandleSlug(slug));
271
+ this.handlerCache.set(slug, handler);
272
+ return handler;
264
273
  }
265
274
  isPoolSupportAlternativeFee(slug) {
266
275
  const handler = this.getPoolHandler(slug);
@@ -743,24 +752,25 @@ class EarningService {
743
752
  } = params;
744
753
  const handler = this.getPoolHandler(slug);
745
754
  if (handler) {
746
- return handler.validateYieldLeave(params.amount, params.address, params.fastLeave, params.selectedTarget);
755
+ return handler.validateYieldLeave(params.amount, params.address, params.fastLeave, params.selectedTarget, slug);
747
756
  } else {
748
757
  return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
749
758
  }
750
759
  }
751
760
  async handleYieldLeave(params) {
761
+ var _params$poolInfo$meta;
752
762
  await this.eventService.waitChainReady;
753
763
  const {
754
764
  slug
755
765
  } = params;
756
766
  const handler = this.getPoolHandler(slug);
767
+ const netuid = (_params$poolInfo$meta = params.poolInfo.metadata.subnetData) === null || _params$poolInfo$meta === void 0 ? void 0 : _params$poolInfo$meta.netuid;
757
768
  if (handler) {
758
- return handler.handleYieldLeave(params.fastLeave, params.amount, params.address, params.selectedTarget);
769
+ return handler.handleYieldLeave(params.fastLeave, params.amount, params.address, params.selectedTarget, netuid);
759
770
  } else {
760
771
  return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
761
772
  }
762
773
  }
763
-
764
774
  /* Leave */
765
775
 
766
776
  /* Other */
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.batchExtrinsicSetFeeHydration = batchExtrinsicSetFeeHydration;
8
+ exports.getAssetHubTokensCanPayFee = getAssetHubTokensCanPayFee;
9
+ exports.getHydrationRate = getHydrationRate;
10
+ exports.getHydrationTokensCanPayFee = getHydrationTokensCanPayFee;
11
+ var _types = require("@subwallet/chain-list/types");
12
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
13
+ var _utils2 = require("@subwallet/extension-base/services/swap-service/handler/asset-hub/utils");
14
+ var _subwalletApiSdk = _interopRequireDefault(require("@subwallet/subwallet-api-sdk"));
15
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
16
+ // Copyright 2019-2022 @subwallet/extension-base
17
+ // SPDX-License-Identifier: Apache-2.0
18
+
19
+ async function getAssetHubTokensCanPayFee(request) {
20
+ const {
21
+ chainService,
22
+ feeAmount,
23
+ nativeBalanceInfo,
24
+ nativeTokenInfo,
25
+ substrateApi,
26
+ tokensHasBalanceInfoMap
27
+ } = request;
28
+ const tokensList = [nativeBalanceInfo];
29
+ if (!(nativeTokenInfo.metadata && nativeTokenInfo.metadata.multilocation)) {
30
+ return tokensList;
31
+ }
32
+
33
+ // ensure nativeTokenInfo and localTokenInfo have multi-location metadata beforehand to improve performance.
34
+ const tokensHasBalanceSlug = Object.keys(tokensHasBalanceInfoMap);
35
+ const tokenInfos = tokensHasBalanceSlug.map(tokenSlug => chainService.getAssetBySlug(tokenSlug)).filter(token => token.originChain === substrateApi.chainSlug && token.assetType !== _types._AssetType.NATIVE && token.metadata && token.metadata.multilocation);
36
+ await Promise.all(tokenInfos.map(async tokenInfo => {
37
+ try {
38
+ const tokenSlug = tokenInfo.slug;
39
+ const reserve = await (0, _utils2.getReserveForPool)(substrateApi.api, nativeTokenInfo, tokenInfo);
40
+ if (!reserve || !reserve[0] || !reserve[1] || reserve[0] === '0' || reserve[1] === '0') {
41
+ return;
42
+ }
43
+ const rate = new _bignumber.default(reserve[1]).div(reserve[0]).toFixed();
44
+ const tokenCanPayFee = {
45
+ slug: tokenSlug,
46
+ free: tokensHasBalanceInfoMap[tokenSlug].free,
47
+ rate
48
+ };
49
+ if (feeAmount === undefined) {
50
+ tokensList.push(tokenCanPayFee);
51
+ } else {
52
+ const amount = (0, _utils2.estimateTokensForPool)(feeAmount, reserve);
53
+ const liquidityError = (0, _utils2.checkLiquidityForPool)(amount, reserve[0], reserve[1]);
54
+ if (!liquidityError) {
55
+ tokensList.push(tokenCanPayFee);
56
+ }
57
+ }
58
+ } catch (e) {
59
+ console.error('error when fetching pool with token', tokenInfo.slug, e);
60
+ }
61
+ }));
62
+ return tokensList;
63
+ }
64
+ async function getHydrationTokensCanPayFee(request) {
65
+ const {
66
+ address,
67
+ chainService,
68
+ nativeBalanceInfo,
69
+ nativeTokenInfo,
70
+ substrateApi,
71
+ tokensHasBalanceInfoMap
72
+ } = request;
73
+ const tokensList = [nativeBalanceInfo];
74
+ const _acceptedCurrencies = await substrateApi.api.query.multiTransactionPayment.acceptedCurrencies.entries();
75
+ const supportedAssetIds = _acceptedCurrencies.map(_assetId => {
76
+ const assetId = _assetId[0].toHuman();
77
+ return assetId[0].replaceAll(',', '');
78
+ });
79
+ const nativePriceId = (0, _utils._getAssetPriceId)(nativeTokenInfo);
80
+ if (!nativePriceId) {
81
+ return tokensList;
82
+ }
83
+ const tokenInfos = Object.keys(tokensHasBalanceInfoMap).map(tokenSlug => chainService.getAssetBySlug(tokenSlug)).filter(token => token.originChain === substrateApi.chainSlug && token.assetType !== _types._AssetType.NATIVE && !!token.metadata && !!token.metadata.assetId);
84
+ await Promise.all(tokenInfos.map(async tokenInfo => {
85
+ const priceId = (0, _utils._getAssetPriceId)(tokenInfo);
86
+ const rate = await getHydrationRate(address, nativeTokenInfo, tokenInfo);
87
+ if (priceId && rate) {
88
+ if (supportedAssetIds.includes((0, _utils._getTokenOnChainAssetId)(tokenInfo))) {
89
+ tokensList.push({
90
+ slug: tokenInfo.slug,
91
+ free: tokensHasBalanceInfoMap[tokenInfo.slug].free,
92
+ rate: rate.toString()
93
+ });
94
+ }
95
+ }
96
+ }));
97
+ return tokensList;
98
+ }
99
+ function batchExtrinsicSetFeeHydration(substrateApi, tx, feeSetting, assetId) {
100
+ const api = substrateApi.api;
101
+ const isSettingLocalFee = feeSetting && feeSetting !== 0;
102
+ const isAttendToSetLocalFee = assetId && assetId !== '0';
103
+ if (!tx) {
104
+ return tx;
105
+ }
106
+
107
+ // current native - set native
108
+ if (!isSettingLocalFee && !isAttendToSetLocalFee) {
109
+ return tx;
110
+ }
111
+
112
+ // current native - set local
113
+ if (!isSettingLocalFee && isAttendToSetLocalFee) {
114
+ return api.tx.utility.batchAll([api.tx.multiTransactionPayment.setCurrency(assetId), tx, api.tx.multiTransactionPayment.setCurrency('0')]);
115
+ }
116
+
117
+ // current local - set native
118
+ if (isSettingLocalFee && !isAttendToSetLocalFee) {
119
+ return api.tx.utility.batchAll([api.tx.multiTransactionPayment.setCurrency('0'), tx]);
120
+ }
121
+
122
+ // current local - set local
123
+ if (isSettingLocalFee && isAttendToSetLocalFee) {
124
+ if (assetId === feeSetting.toString()) {
125
+ // current local = set local
126
+ return api.tx.utility.batchAll([tx, api.tx.multiTransactionPayment.setCurrency('0')]);
127
+ } else {
128
+ // current local != set local
129
+ return api.tx.utility.batchAll([api.tx.multiTransactionPayment.setCurrency(assetId), tx, api.tx.multiTransactionPayment.setCurrency('0')]);
130
+ }
131
+ }
132
+ return tx;
133
+ }
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 {
147
+ const hdxDecimal = (0, _utils._getAssetDecimals)(hdx);
148
+ const desTokenDecimal = (0, _utils._getAssetDecimals)(desToken);
149
+ return new _bignumber.default(quoteRate).multipliedBy(10 ** (desTokenDecimal - hdxDecimal)).toFixed();
150
+ }
151
+ }
@@ -390,6 +390,9 @@ class InappNotificationService {
390
390
  case _types2.YieldPoolType.NATIVE_STAKING:
391
391
  method = _constants2._STAKING_CHAIN_GROUP.astar.includes(chain.slug) ? 'dApp staking' : 'Direct nomination';
392
392
  break;
393
+ case _types2.YieldPoolType.SUBNET_STAKING:
394
+ method = 'Subnet staking'; // todo: confirm with tester
395
+ break;
393
396
  }
394
397
  title = '[{{accountName}}] STAKED {{asset}}'.replace('{{asset}}', asset.symbol);
395
398
  description = '{{amount}} {{asset}} on {{chain}} staked via {{method}}. Click to view details'.replace('{{amount}}', (0, _utils2.formatNumber)(amount, asset.decimals || 0)).replace('{{asset}}', asset.symbol).replace('{{chain}}', chain.name).replace('{{method}}', method);
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _helper = require("@subwallet/extension-base/services/request-service/helper");
8
8
  var _stores = require("@subwallet/extension-base/stores");
9
- var _getId = require("@subwallet/extension-base/utils/getId");
10
9
  var _extensionChains = require("@subwallet/extension-chains");
11
10
  var _rxjs = require("rxjs");
12
11
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
@@ -52,6 +51,8 @@ class MetadataRequestHandler {
52
51
  this.metaSubject.next(this.allMetaRequests);
53
52
  this.#requestService.updateIconV2(shouldClose);
54
53
  }
54
+
55
+ // @ts-ignore
55
56
  metaComplete = (id, resolve, reject) => {
56
57
  const complete = () => {
57
58
  delete this.#metaRequests[id];
@@ -68,18 +69,9 @@ class MetadataRequestHandler {
68
69
  }
69
70
  };
70
71
  };
71
- injectMetadata(url, request) {
72
- return new Promise((resolve, reject) => {
73
- const id = (0, _getId.getId)();
74
- this.#metaRequests[id] = {
75
- ...this.metaComplete(id, resolve, reject),
76
- id,
77
- request,
78
- url
79
- };
80
- this.updateIconMeta();
81
- this.#requestService.popupOpen();
82
- });
72
+ injectMetadata(request) {
73
+ this.saveMetadata(request);
74
+ return true;
83
75
  }
84
76
  resetWallet() {
85
77
  for (const request of Object.values(this.#metaRequests)) {
@@ -87,8 +87,8 @@ class RequestService {
87
87
  get numMetaRequests() {
88
88
  return this.#metadataRequestHandler.numMetaRequests;
89
89
  }
90
- injectMetadata(url, request) {
91
- return this.#metadataRequestHandler.injectMetadata(url, request);
90
+ injectMetadata(request) {
91
+ return this.#metadataRequestHandler.injectMetadata(request);
92
92
  }
93
93
  getMetaRequest(id) {
94
94
  return this.#metadataRequestHandler.getMetaRequest(id);