@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.
- package/background/KoniTypes.d.ts +11 -3
- package/background/KoniTypes.js +1 -0
- package/background/errors/EvmProviderError.js +4 -0
- package/background/errors/ProviderError.d.ts +1 -1
- package/background/errors/ProviderError.js +2 -2
- package/cjs/background/KoniTypes.js +1 -0
- package/cjs/background/errors/EvmProviderError.js +4 -0
- package/cjs/background/errors/ProviderError.js +2 -2
- package/cjs/constants/environment.js +1 -1
- package/cjs/constants/index.js +21 -4
- package/cjs/core/logic-validation/transfer.js +23 -8
- package/cjs/koni/background/handlers/Extension.js +109 -89
- package/cjs/koni/background/handlers/State.js +2 -2
- package/cjs/koni/background/handlers/Tabs.js +4 -3
- package/cjs/packageInfo.js +1 -1
- package/cjs/page/index.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +3 -3
- package/cjs/services/balance-service/transfer/smart-contract.js +24 -3
- package/cjs/services/buy-service/constants/token.js +3 -0
- package/cjs/services/chain-service/index.js +11 -0
- package/cjs/services/earning-service/constants/chains.js +1 -1
- package/cjs/services/earning-service/handlers/base.js +11 -5
- package/cjs/services/earning-service/handlers/native-staking/base-para.js +7 -6
- package/cjs/services/earning-service/handlers/native-staking/base.js +6 -3
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +444 -0
- package/cjs/services/earning-service/handlers/native-staking/index.js +8 -1
- package/cjs/services/earning-service/handlers/native-staking/tao.js +138 -125
- package/cjs/services/earning-service/service.js +14 -4
- package/cjs/services/fee-service/utils/tokenPayFee.js +151 -0
- package/cjs/services/inapp-notification-service/index.js +3 -0
- package/cjs/services/request-service/handler/MetadataRequestHandler.js +5 -13
- package/cjs/services/request-service/index.js +2 -2
- package/cjs/services/transaction-service/index.js +14 -5
- package/cjs/types/yield/info/base.js +1 -0
- package/cjs/utils/fee/transfer.js +47 -14
- package/cjs/utils/fetchEvmChainInfo.js +10 -5
- package/constants/environment.js +1 -1
- package/constants/index.d.ts +6 -1
- package/constants/index.js +14 -1
- package/core/logic-validation/transfer.d.ts +1 -1
- package/core/logic-validation/transfer.js +25 -10
- package/koni/background/handlers/Extension.js +82 -62
- package/koni/background/handlers/State.d.ts +1 -1
- package/koni/background/handlers/State.js +2 -2
- package/koni/background/handlers/Tabs.js +4 -3
- package/package.json +16 -6
- package/packageInfo.js +1 -1
- package/page/index.js +1 -1
- package/services/balance-service/helpers/subscribe/substrate/index.js +2 -2
- package/services/balance-service/transfer/smart-contract.d.ts +4 -2
- package/services/balance-service/transfer/smart-contract.js +24 -3
- package/services/buy-service/constants/token.js +3 -0
- package/services/chain-service/index.d.ts +1 -0
- package/services/chain-service/index.js +12 -1
- package/services/earning-service/constants/chains.js +1 -1
- package/services/earning-service/handlers/base.d.ts +7 -5
- package/services/earning-service/handlers/base.js +11 -7
- package/services/earning-service/handlers/native-staking/base-para.d.ts +1 -1
- package/services/earning-service/handlers/native-staking/base-para.js +7 -6
- package/services/earning-service/handlers/native-staking/base.d.ts +1 -1
- package/services/earning-service/handlers/native-staking/base.js +6 -3
- package/services/earning-service/handlers/native-staking/dtao.d.ts +64 -0
- package/services/earning-service/handlers/native-staking/dtao.js +434 -0
- package/services/earning-service/handlers/native-staking/index.d.ts +1 -0
- package/services/earning-service/handlers/native-staking/index.js +2 -1
- package/services/earning-service/handlers/native-staking/tao.d.ts +16 -4
- package/services/earning-service/handlers/native-staking/tao.js +136 -121
- package/services/earning-service/service.d.ts +1 -0
- package/services/earning-service/service.js +15 -5
- package/services/fee-service/interfaces.d.ts +25 -0
- package/services/fee-service/utils/tokenPayFee.d.ts +8 -0
- package/services/fee-service/utils/tokenPayFee.js +141 -0
- package/services/inapp-notification-service/index.js +3 -0
- package/services/request-service/handler/MetadataRequestHandler.d.ts +1 -1
- package/services/request-service/handler/MetadataRequestHandler.js +5 -13
- package/services/request-service/index.d.ts +1 -1
- package/services/request-service/index.js +2 -2
- package/services/transaction-service/index.js +16 -7
- package/types/bridge/index.d.ts +1 -0
- package/types/buy.d.ts +1 -1
- package/types/fee/option.d.ts +1 -1
- package/types/yield/actions/join/step.d.ts +1 -0
- package/types/yield/actions/join/submit.d.ts +1 -0
- package/types/yield/info/account/info.d.ts +14 -1
- package/types/yield/info/base.d.ts +3 -1
- package/types/yield/info/base.js +1 -0
- package/types/yield/info/chain/info.d.ts +5 -1
- package/utils/fee/transfer.d.ts +1 -1
- package/utils/fee/transfer.js +46 -13
- package/utils/fetchEvmChainInfo.d.ts +1 -1
- 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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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(
|
|
201
|
+
description: this.getDescription()
|
|
155
202
|
},
|
|
156
203
|
statistic: {
|
|
157
204
|
assetEarning: [{
|
|
158
205
|
slug: this.nativeToken.slug
|
|
159
206
|
}],
|
|
160
|
-
maxCandidatePerFarmer:
|
|
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:
|
|
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
|
-
|
|
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
|
|
231
|
-
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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
|
-
|
|
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
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
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
|
|
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 === '
|
|
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
|
-
|
|
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(
|
|
72
|
-
|
|
73
|
-
|
|
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(
|
|
91
|
-
return this.#metadataRequestHandler.injectMetadata(
|
|
90
|
+
injectMetadata(request) {
|
|
91
|
+
return this.#metadataRequestHandler.injectMetadata(request);
|
|
92
92
|
}
|
|
93
93
|
getMetaRequest(id) {
|
|
94
94
|
return this.#metadataRequestHandler.getMetaRequest(id);
|