@subwallet/extension-base 1.1.35-beta.2 → 1.1.36-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 +12 -0
- package/background/KoniTypes.js +3 -0
- package/cjs/background/KoniTypes.js +3 -0
- package/cjs/koni/api/nft/config.js +11 -6
- package/cjs/koni/api/nft/index.js +4 -2
- package/cjs/koni/api/nft/transfer.js +7 -19
- package/cjs/koni/api/nft/unique_network_nft/index.js +154 -0
- package/cjs/koni/api/staking/bonding/utils.js +44 -0
- package/cjs/koni/api/tokens/evm/transfer.js +35 -19
- package/cjs/koni/api/yield/helper/utils.js +6 -3
- package/cjs/koni/background/handlers/Extension.js +20 -12
- package/cjs/koni/background/handlers/State.js +15 -5
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/index.js +1 -1
- package/cjs/services/chain-service/constants.js +1 -1
- package/cjs/services/chain-service/index.js +3 -5
- package/cjs/services/earning-service/handlers/liquid-staking/base.js +2 -1
- package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
- package/cjs/services/earning-service/handlers/liquid-staking/index.js +7 -0
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +10 -2
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +10 -2
- package/cjs/services/earning-service/handlers/special.js +7 -3
- package/cjs/services/earning-service/service.js +38 -14
- package/cjs/services/notification-service/NotificationService.js +7 -4
- package/cjs/services/request-service/handler/EvmRequestHandler.js +46 -29
- package/cjs/services/transaction-service/constants.js +1 -1
- package/cjs/services/transaction-service/index.js +44 -15
- package/cjs/signers/web3/QrSigner.js +2 -0
- package/cjs/types/yield/actions/join/step.js +1 -0
- package/cjs/utils/eth/mergeTransactionAndSignature.js +25 -10
- package/cjs/utils/eth.js +60 -2
- package/cjs/utils/number.js +5 -1
- package/koni/api/nft/config.d.ts +3 -2
- package/koni/api/nft/config.js +8 -3
- package/koni/api/nft/index.js +3 -2
- package/koni/api/nft/transfer.d.ts +0 -1
- package/koni/api/nft/transfer.js +7 -18
- package/koni/api/nft/unique_network_nft/index.d.ts +9 -0
- package/koni/api/nft/unique_network_nft/index.js +146 -0
- package/koni/api/staking/bonding/utils.d.ts +5 -0
- package/koni/api/staking/bonding/utils.js +40 -0
- package/koni/api/tokens/evm/transfer.js +36 -21
- package/koni/api/yield/helper/utils.d.ts +1 -1
- package/koni/api/yield/helper/utils.js +5 -3
- package/koni/background/handlers/Extension.js +21 -13
- package/koni/background/handlers/State.js +16 -6
- package/package.json +21 -12
- package/packageInfo.js +1 -1
- package/services/balance-service/index.js +1 -1
- package/services/chain-service/constants.js +1 -1
- package/services/chain-service/index.js +4 -6
- package/services/earning-service/handlers/liquid-staking/base.d.ts +1 -1
- package/services/earning-service/handlers/liquid-staking/base.js +2 -1
- package/services/earning-service/handlers/liquid-staking/bifrost-manta.d.ts +37 -0
- package/services/earning-service/handlers/liquid-staking/bifrost-manta.js +132 -0
- package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +3 -3
- package/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
- package/services/earning-service/handlers/liquid-staking/index.d.ts +1 -0
- package/services/earning-service/handlers/liquid-staking/index.js +1 -0
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
- package/services/earning-service/handlers/native-staking/relay-chain.js +11 -3
- package/services/earning-service/handlers/nomination-pool/index.js +11 -3
- package/services/earning-service/handlers/special.js +7 -3
- package/services/earning-service/service.d.ts +4 -2
- package/services/earning-service/service.js +40 -16
- package/services/notification-service/NotificationService.js +7 -4
- package/services/request-service/handler/EvmRequestHandler.d.ts +2 -2
- package/services/request-service/handler/EvmRequestHandler.js +46 -29
- package/services/transaction-service/constants.js +1 -1
- package/services/transaction-service/index.js +45 -16
- package/services/transaction-service/types.d.ts +2 -2
- package/signers/types.d.ts +2 -0
- package/signers/web3/QrSigner.js +2 -0
- package/types/yield/actions/join/step.d.ts +1 -0
- package/types/yield/actions/join/step.js +1 -0
- package/utils/eth/mergeTransactionAndSignature.js +25 -10
- package/utils/eth.d.ts +14 -0
- package/utils/eth.js +57 -0
- package/utils/number.d.ts +2 -0
- package/utils/number.js +2 -0
- package/cjs/koni/api/dotsama/balance.js +0 -464
- package/cjs/services/migration-service/scripts/MigrateEthProvider.js +0 -17
- package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +0 -17
- package/cjs/services/migration-service/scripts/MigrateProvider.js +0 -29
- package/cjs/services/storage-service/index.js +0 -241
- package/cjs/types.js +0 -1
- package/cjs/utils/address.js +0 -34
- package/cjs/utils/keyring.js +0 -57
|
@@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
|
-
var _common =
|
|
8
|
+
var _common = require("@ethereumjs/common");
|
|
9
|
+
var _tx = require("@ethereumjs/tx");
|
|
9
10
|
var _types = require("@subwallet/chain-list/types");
|
|
10
11
|
var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
|
|
11
12
|
var _Extension = require("@subwallet/extension-base/background/handlers/Extension");
|
|
@@ -42,7 +43,6 @@ var _keyring = require("@subwallet/keyring");
|
|
|
42
43
|
var _uiKeyring = require("@subwallet/ui-keyring");
|
|
43
44
|
var _utils4 = require("@walletconnect/utils");
|
|
44
45
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
45
|
-
var _ethereumjsTx = require("ethereumjs-tx");
|
|
46
46
|
var _i18next = require("i18next");
|
|
47
47
|
var _types4 = require("@polkadot/types");
|
|
48
48
|
var _util = require("@polkadot/util");
|
|
@@ -1938,10 +1938,15 @@ class KoniExtension {
|
|
|
1938
1938
|
// null address
|
|
1939
1939
|
from: address
|
|
1940
1940
|
};
|
|
1941
|
-
const _price = await web3.api.eth.getGasPrice();
|
|
1942
|
-
const gasPrice = (0, _eth.recalculateGasPrice)(_price, networkKey);
|
|
1943
1941
|
const gasLimit = await web3.api.eth.estimateGas(transaction);
|
|
1944
|
-
|
|
1942
|
+
const priority = await (0, _eth.calculateGasFeeParams)(web3, networkKey);
|
|
1943
|
+
if (priority.baseGasFee) {
|
|
1944
|
+
const priorityFee = priority.baseGasFee.plus(priority.maxPriorityFeePerGas);
|
|
1945
|
+
const maxFee = priority.maxFeePerGas.gte(priorityFee) ? priority.maxFeePerGas : priorityFee;
|
|
1946
|
+
estimatedFee = maxFee.multipliedBy(gasLimit).toFixed(0);
|
|
1947
|
+
} else {
|
|
1948
|
+
estimatedFee = new _bignumber.default(priority.gasPrice).multipliedBy(gasLimit).toFixed(0);
|
|
1949
|
+
}
|
|
1945
1950
|
} else {
|
|
1946
1951
|
var _paymentInfo$partialF2;
|
|
1947
1952
|
const [mockTx] = await (0, _transfer.createTransferExtrinsic)({
|
|
@@ -2480,6 +2485,7 @@ class KoniExtension {
|
|
|
2480
2485
|
}
|
|
2481
2486
|
signed = await pair.evmSigner.signMessage(data, 'personal_sign');
|
|
2482
2487
|
} else {
|
|
2488
|
+
var _signedTranaction$r, _signedTranaction$s, _signedTranaction$v;
|
|
2483
2489
|
const tx = (0, _eth.createTransactionFromRLP)(message);
|
|
2484
2490
|
if (!tx) {
|
|
2485
2491
|
throw new Error((0, _i18next.t)('Failed to decode data. Please use a valid QR code'));
|
|
@@ -2492,21 +2498,23 @@ class KoniExtension {
|
|
|
2492
2498
|
nonce: new _bignumber.default(tx.nonce).toNumber(),
|
|
2493
2499
|
gas: new _bignumber.default(tx.gas).toNumber()
|
|
2494
2500
|
};
|
|
2495
|
-
const common = _common.
|
|
2501
|
+
const common = _common.Common.custom({
|
|
2496
2502
|
name: network.name,
|
|
2497
2503
|
networkId: (0, _utils2._getEvmChainId)(network),
|
|
2498
2504
|
chainId: (0, _utils2._getEvmChainId)(network)
|
|
2499
|
-
},
|
|
2505
|
+
}, {
|
|
2506
|
+
hardfork: 'petersburg'
|
|
2507
|
+
});
|
|
2500
2508
|
|
|
2501
2509
|
// @ts-ignore
|
|
2502
|
-
const transaction = new
|
|
2510
|
+
const transaction = new _tx.LegacyTransaction(txObject, {
|
|
2503
2511
|
common
|
|
2504
2512
|
});
|
|
2505
|
-
pair.evmSigner.signTransaction(transaction);
|
|
2513
|
+
const signedTranaction = _tx.LegacyTransaction.fromSerializedTx((0, _util.hexToU8a)(pair.evmSigner.signTransaction(transaction)));
|
|
2506
2514
|
signed = (0, _eth.signatureToHex)({
|
|
2507
|
-
r: (0
|
|
2508
|
-
s: (0
|
|
2509
|
-
v: (0
|
|
2515
|
+
r: ((_signedTranaction$r = signedTranaction.r) === null || _signedTranaction$r === void 0 ? void 0 : _signedTranaction$r.toString(16)) || '',
|
|
2516
|
+
s: ((_signedTranaction$s = signedTranaction.s) === null || _signedTranaction$s === void 0 ? void 0 : _signedTranaction$s.toString(16)) || '',
|
|
2517
|
+
v: ((_signedTranaction$v = signedTranaction.v) === null || _signedTranaction$v === void 0 ? void 0 : _signedTranaction$v.toString(16)) || ''
|
|
2510
2518
|
});
|
|
2511
2519
|
}
|
|
2512
2520
|
return {
|
|
@@ -40,6 +40,7 @@ var _parseTransaction = require("@subwallet/extension-base/utils/eth/parseTransa
|
|
|
40
40
|
var _promise = require("@subwallet/extension-base/utils/promise");
|
|
41
41
|
var _decode = require("@subwallet/keyring/pair/decode");
|
|
42
42
|
var _uiKeyring = require("@subwallet/ui-keyring");
|
|
43
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
43
44
|
var _ethSimpleKeyring = _interopRequireDefault(require("eth-simple-keyring"));
|
|
44
45
|
var _i18next = require("i18next");
|
|
45
46
|
var _rxjs = require("rxjs");
|
|
@@ -1261,10 +1262,17 @@ class KoniState {
|
|
|
1261
1262
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
1262
1263
|
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, e === null || e === void 0 ? void 0 : e.message);
|
|
1263
1264
|
}
|
|
1264
|
-
const
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1265
|
+
const priority = await (0, _eth.calculateGasFeeParams)(evmApi, networkKey);
|
|
1266
|
+
let estimateGas;
|
|
1267
|
+
if (priority.baseGasFee) {
|
|
1268
|
+
transaction.maxPriorityFeePerGas = priority.maxPriorityFeePerGas.toString();
|
|
1269
|
+
transaction.maxFeePerGas = priority.maxFeePerGas.toString();
|
|
1270
|
+
const priorityFee = priority.baseGasFee.plus(priority.maxPriorityFeePerGas);
|
|
1271
|
+
const maxFee = priority.maxFeePerGas.lte(priorityFee) ? priority.maxFeePerGas : priorityFee;
|
|
1272
|
+
estimateGas = maxFee.multipliedBy(transaction.gas).toFixed(0);
|
|
1273
|
+
} else {
|
|
1274
|
+
estimateGas = new _bignumber.default(priority.gasPrice).multipliedBy(transaction.gas).toFixed(0);
|
|
1275
|
+
}
|
|
1268
1276
|
|
|
1269
1277
|
// Address is validated in before step
|
|
1270
1278
|
const fromAddress = allowedAccounts.find(account => account.toLowerCase() === transaction.from.toLowerCase());
|
|
@@ -1282,7 +1290,7 @@ class KoniState {
|
|
|
1282
1290
|
|
|
1283
1291
|
// Validate balance
|
|
1284
1292
|
const balance = new _util.BN((await web3.eth.getBalance(fromAddress)) || 0);
|
|
1285
|
-
if (balance.lt(new _util.BN(
|
|
1293
|
+
if (balance.lt(new _util.BN(estimateGas).add(new _util.BN(autoFormatNumber(transactionParams.value) || '0')))) {
|
|
1286
1294
|
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, (0, _i18next.t)('Insufficient balance'));
|
|
1287
1295
|
}
|
|
1288
1296
|
transaction.nonce = await web3.eth.getTransactionCount(fromAddress);
|
|
@@ -1595,6 +1603,8 @@ class KoniState {
|
|
|
1595
1603
|
await this.keyringService.resetWallet(resetAll);
|
|
1596
1604
|
this.requestService.resetWallet();
|
|
1597
1605
|
this.transactionService.resetWallet();
|
|
1606
|
+
await this.handleResetBalance(_constants.ALL_ACCOUNT_KEY, true);
|
|
1607
|
+
await this.earningService.resetWallet();
|
|
1598
1608
|
await this.dbService.resetWallet(resetAll);
|
|
1599
1609
|
this.accountRefStore.set('refList', []);
|
|
1600
1610
|
if (resetAll) {
|
package/cjs/packageInfo.js
CHANGED
|
@@ -44,7 +44,7 @@ class BalanceService {
|
|
|
44
44
|
if (!chainInfo || !chainState || !chainState.active) {
|
|
45
45
|
return Promise.reject(new _BalanceError.BalanceError(_KoniTypes.BalanceErrorType.NETWORK_ERROR, (0, _i18next.t)('{{chain}} is inactive. Please enable network', {
|
|
46
46
|
replace: {
|
|
47
|
-
chain
|
|
47
|
+
chain: chainInfo.name
|
|
48
48
|
}
|
|
49
49
|
})));
|
|
50
50
|
}
|
|
@@ -58,7 +58,7 @@ const _NFT_CHAIN_GROUP = {
|
|
|
58
58
|
rmrk: ['kusama'],
|
|
59
59
|
statemine: ['statemine'],
|
|
60
60
|
statemint: ['statemint'],
|
|
61
|
-
unique_network: ['unique_network'],
|
|
61
|
+
unique_network: ['unique_network', 'quartz', 'opal'],
|
|
62
62
|
bitcountry: ['bitcountry', 'pioneer'],
|
|
63
63
|
vara: ['vara_network']
|
|
64
64
|
};
|
|
@@ -417,7 +417,6 @@ class ChainService {
|
|
|
417
417
|
|
|
418
418
|
await this.initChains();
|
|
419
419
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
420
|
-
this.updateChainStateMapSubscription();
|
|
421
420
|
this.assetRegistrySubject.next(this.getAssetRegistry());
|
|
422
421
|
this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
|
|
423
422
|
await this.initApis();
|
|
@@ -447,9 +446,6 @@ class ChainService {
|
|
|
447
446
|
checkLatestData() {
|
|
448
447
|
clearInterval(this.refreshLatestChainDataTimeOut);
|
|
449
448
|
this.handleLatestData();
|
|
450
|
-
this.handleLatestData();
|
|
451
|
-
this.handleLatestData();
|
|
452
|
-
this.handleLatestData();
|
|
453
449
|
this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestData.bind(this), _constants.LATEST_CHAIN_DATA_FETCHING_INTERVAL);
|
|
454
450
|
}
|
|
455
451
|
stopCheckLatestChainData() {
|
|
@@ -932,7 +928,9 @@ class ChainService {
|
|
|
932
928
|
}
|
|
933
929
|
}
|
|
934
930
|
updateChainStateMapSubscription() {
|
|
935
|
-
|
|
931
|
+
(0, _utils2.addLazy)('updateChainStateMapSubscription', () => {
|
|
932
|
+
this.chainStateMapSubject.next(this.getChainStateMap());
|
|
933
|
+
}, 300, 900);
|
|
936
934
|
}
|
|
937
935
|
updateChainInfoMapSubscription() {
|
|
938
936
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
@@ -10,6 +10,7 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
|
10
10
|
var _utils = require("@subwallet/extension-base/koni/api/yield/helper/utils");
|
|
11
11
|
var _types = require("@subwallet/extension-base/types");
|
|
12
12
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
13
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
13
14
|
var _i18next = require("i18next");
|
|
14
15
|
var _util = require("@polkadot/util");
|
|
15
16
|
var _special = _interopRequireDefault(require("../special"));
|
|
@@ -38,7 +39,7 @@ class BaseLiquidStakingPoolHandler extends _special.default {
|
|
|
38
39
|
return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS));
|
|
39
40
|
}
|
|
40
41
|
const formattedMinAmount = (0, _utils.convertDerivativeToOriginToken)(amount, poolInfo, derivativeTokenInfo, originTokenInfo);
|
|
41
|
-
return
|
|
42
|
+
return new _bignumber.default(formattedMinAmount).multipliedBy(this.minAmountPercent).toFixed(0);
|
|
42
43
|
}
|
|
43
44
|
async validateYieldLeave(amount, address, fastLeave, selectedTarget) {
|
|
44
45
|
const poolInfo = await this.getPoolInfo();
|
|
@@ -41,7 +41,7 @@ class BifrostLiquidStakingPoolHandler extends _base.default {
|
|
|
41
41
|
super(state, chain);
|
|
42
42
|
const chainInfo = this.chainInfo;
|
|
43
43
|
this.slug = `DOT___liquid_staking___${chain}`;
|
|
44
|
-
this.name = `${chainInfo.name} Liquid Staking`;
|
|
44
|
+
this.name = `${chainInfo.name} Liquid Staking DOT`;
|
|
45
45
|
this.shortName = chainInfo.name.replaceAll(' Relay Chain', '');
|
|
46
46
|
}
|
|
47
47
|
getDescription() {
|
|
@@ -100,6 +100,7 @@ class BifrostLiquidStakingPoolHandler extends _base.default {
|
|
|
100
100
|
unstakingPeriod: 24 * 28,
|
|
101
101
|
maxCandidatePerFarmer: 1,
|
|
102
102
|
maxWithdrawalRequestPerFarmer: 1,
|
|
103
|
+
farmerCount: vDOTStats.holders,
|
|
103
104
|
earningThreshold: {
|
|
104
105
|
join: minimumMint,
|
|
105
106
|
defaultUnstake: minimumRedeem,
|
|
@@ -16,6 +16,12 @@ Object.defineProperty(exports, "BifrostLiquidStakingPoolHandler", {
|
|
|
16
16
|
return _bifrost.default;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
|
+
Object.defineProperty(exports, "BifrostMantaLiquidStakingPoolHandler", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () {
|
|
22
|
+
return _bifrostManta.default;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
19
25
|
Object.defineProperty(exports, "ParallelLiquidStakingPoolHandler", {
|
|
20
26
|
enumerable: true,
|
|
21
27
|
get: function () {
|
|
@@ -30,5 +36,6 @@ Object.defineProperty(exports, "StellaSwapLiquidStakingPoolHandler", {
|
|
|
30
36
|
});
|
|
31
37
|
var _acala = _interopRequireDefault(require("./acala"));
|
|
32
38
|
var _bifrost = _interopRequireDefault(require("./bifrost"));
|
|
39
|
+
var _bifrostManta = _interopRequireDefault(require("./bifrost-manta"));
|
|
33
40
|
var _parallel = _interopRequireDefault(require("./parallel"));
|
|
34
41
|
var _stellaSwap = _interopRequireDefault(require("./stella-swap"));
|
|
@@ -47,9 +47,9 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
|
|
|
47
47
|
constructor(state, chain) {
|
|
48
48
|
super(state, chain);
|
|
49
49
|
this.slug = 'xcDOT___liquid_staking___stellaswap';
|
|
50
|
-
this.name = '
|
|
50
|
+
this.name = 'StellaSwap Liquid Staking';
|
|
51
51
|
this._logo = 'stellaswap';
|
|
52
|
-
this.shortName = '
|
|
52
|
+
this.shortName = 'StellaSwap';
|
|
53
53
|
}
|
|
54
54
|
getDescription() {
|
|
55
55
|
return 'Earn rewards by staking xcDOT for stDOT';
|
|
@@ -60,7 +60,15 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
60
60
|
const maxNominations = ((_substrateApi$api$con = substrateApi.api.consts.staking) === null || _substrateApi$api$con === void 0 ? void 0 : (_substrateApi$api$con2 = _substrateApi$api$con.maxNominations) === null || _substrateApi$api$con2 === void 0 ? void 0 : _substrateApi$api$con2.toString()) || '16'; // TODO
|
|
61
61
|
const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
|
|
62
62
|
const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();
|
|
63
|
-
const
|
|
63
|
+
const maxSupportedEras = substrateApi.api.consts.staking.historyDepth.toString();
|
|
64
|
+
const erasPerDay = 24 / _constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug]; // Can be exactly calculate from epochDuration, blockTime, sessionsPerEra
|
|
65
|
+
|
|
66
|
+
const supportedDays = (0, _utils.getSupportedDaysByHistoryDepth)(erasPerDay, parseInt(maxSupportedEras));
|
|
67
|
+
const startEra = parseInt(currentEra) - supportedDays * erasPerDay;
|
|
68
|
+
const [_EraStakeInfo, _totalIssuance, _auctionCounter, _minNominatorBond, _counterForNominators, _minimumActiveStake, ..._eraReward] = await Promise.all([substrateApi.api.query.staking.erasTotalStake.multi([parseInt(currentEra), parseInt(currentEra) - 1]), substrateApi.api.query.balances.totalIssuance(), (_substrateApi$api$que2 = substrateApi.api.query.auctions) === null || _substrateApi$api$que2 === void 0 ? void 0 : _substrateApi$api$que2.auctionCounter(), substrateApi.api.query.staking.minNominatorBond(), substrateApi.api.query.staking.counterForNominators(), ((_substrateApi$api$que3 = substrateApi.api.query) === null || _substrateApi$api$que3 === void 0 ? void 0 : (_substrateApi$api$que4 = _substrateApi$api$que3.staking) === null || _substrateApi$api$que4 === void 0 ? void 0 : _substrateApi$api$que4.minimumActiveStake) && ((_substrateApi$api$que5 = substrateApi.api.query) === null || _substrateApi$api$que5 === void 0 ? void 0 : (_substrateApi$api$que6 = _substrateApi$api$que5.staking) === null || _substrateApi$api$que6 === void 0 ? void 0 : _substrateApi$api$que6.minimumActiveStake()), substrateApi.api.query.staking.erasValidatorReward.multi([...Array(supportedDays).keys()].map(i => i + startEra))]);
|
|
69
|
+
const [_totalEraStake, _lastTotalStaked] = _EraStakeInfo;
|
|
70
|
+
const validatorEraReward = (0, _utils.getAvgValidatorEraReward)(supportedDays, _eraReward[0]);
|
|
71
|
+
const lastTotalStaked = _lastTotalStaked.toString();
|
|
64
72
|
const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
|
|
65
73
|
const minNominatorBond = _minNominatorBond.toString();
|
|
66
74
|
const bnMinActiveStake = new _util.BN(minActiveStake);
|
|
@@ -72,7 +80,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
72
80
|
const bnTotalEraStake = new _util.BN(rawTotalEraStake);
|
|
73
81
|
const bnTotalIssuance = new _util.BN(rawTotalIssuance);
|
|
74
82
|
const inflation = (0, _utils.calculateInflation)(bnTotalEraStake, bnTotalIssuance, numAuctions, chainInfo.slug);
|
|
75
|
-
const expectedReturn = (0, _utils.
|
|
83
|
+
const expectedReturn = (0, _utils.calculateChainStakedReturnV2)(chainInfo, rawTotalIssuance, erasPerDay, lastTotalStaked, validatorEraReward, true);
|
|
76
84
|
const eraTime = _constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _constants._STAKING_ERA_LENGTH_MAP.default; // in hours
|
|
77
85
|
const unlockingPeriod = parseInt(unlockingEras) * eraTime; // in hours
|
|
78
86
|
const farmerCount = _counterForNominators.toPrimitive();
|
|
@@ -86,7 +86,15 @@ class NominationPoolHandler extends _base.default {
|
|
|
86
86
|
const currentEra = _currentEra.toString();
|
|
87
87
|
const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
|
|
88
88
|
const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();
|
|
89
|
-
const
|
|
89
|
+
const maxSupportedEras = substrateApi.api.consts.staking.historyDepth.toString();
|
|
90
|
+
const erasPerDay = 24 / _constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug]; // Can be exactly calculate from epochDuration, blockTime, sessionsPerEra
|
|
91
|
+
|
|
92
|
+
const supportedDays = (0, _utils.getSupportedDaysByHistoryDepth)(erasPerDay, parseInt(maxSupportedEras));
|
|
93
|
+
const startEra = parseInt(currentEra) - supportedDays * erasPerDay;
|
|
94
|
+
const [_EraStakeInfo, _totalIssuance, _auctionCounter, _minPoolJoin, ..._eraReward] = await Promise.all([substrateApi.api.query.staking.erasTotalStake.multi([parseInt(currentEra), parseInt(currentEra) - 1]), substrateApi.api.query.balances.totalIssuance(), (_substrateApi$api$que2 = substrateApi.api.query.auctions) === null || _substrateApi$api$que2 === void 0 ? void 0 : _substrateApi$api$que2.auctionCounter(), (_substrateApi$api$que3 = substrateApi.api.query) === null || _substrateApi$api$que3 === void 0 ? void 0 : (_substrateApi$api$que4 = _substrateApi$api$que3.nominationPools) === null || _substrateApi$api$que4 === void 0 ? void 0 : _substrateApi$api$que4.minJoinBond(), substrateApi.api.query.staking.erasValidatorReward.multi([...Array(supportedDays).keys()].map(i => i + startEra))]);
|
|
95
|
+
const [_totalEraStake, _lastTotalStaked] = _EraStakeInfo;
|
|
96
|
+
const validatorEraReward = (0, _utils.getAvgValidatorEraReward)(supportedDays, _eraReward[0]);
|
|
97
|
+
const lastTotalStaked = _lastTotalStaked.toString();
|
|
90
98
|
const rawTotalEraStake = _totalEraStake.toString();
|
|
91
99
|
const rawTotalIssuance = _totalIssuance.toString();
|
|
92
100
|
const numAuctions = _auctionCounter ? _auctionCounter.toHuman() : 0;
|
|
@@ -94,7 +102,7 @@ class NominationPoolHandler extends _base.default {
|
|
|
94
102
|
const bnTotalIssuance = new _util.BN(rawTotalIssuance);
|
|
95
103
|
const inflation = (0, _utils.calculateInflation)(bnTotalEraStake, bnTotalIssuance, numAuctions, chainInfo.slug);
|
|
96
104
|
const minPoolJoin = (_minPoolJoin === null || _minPoolJoin === void 0 ? void 0 : _minPoolJoin.toString()) || undefined;
|
|
97
|
-
const expectedReturn = (0, _utils.
|
|
105
|
+
const expectedReturn = (0, _utils.calculateChainStakedReturnV2)(chainInfo, rawTotalIssuance, erasPerDay, lastTotalStaked, validatorEraReward, true);
|
|
98
106
|
const eraTime = _constants._STAKING_ERA_LENGTH_MAP[this.chain] || _constants._STAKING_ERA_LENGTH_MAP.default; // in hours
|
|
99
107
|
const unlockingPeriod = parseInt(unlockingEras) * eraTime; // in hours
|
|
100
108
|
|
|
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
|
-
var _chainList = require("@subwallet/chain-list");
|
|
9
8
|
var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
|
|
10
9
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
11
10
|
var _constants = require("@subwallet/extension-base/constants");
|
|
@@ -208,13 +207,16 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
208
207
|
const altInputTokenBalance = await this.state.balanceService.getTokenFreeBalance(address, altInputTokenInfo.originChain, altInputTokenSlug);
|
|
209
208
|
const bnAltInputTokenBalance = new _util.BN(altInputTokenBalance.value || '0');
|
|
210
209
|
if (bnAltInputTokenBalance.gt(_util.BN_ZERO)) {
|
|
210
|
+
const altChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
|
|
211
|
+
const symbol = altInputTokenInfo.symbol;
|
|
212
|
+
const networkName = altChainInfo.name;
|
|
211
213
|
const step = {
|
|
212
214
|
metadata: {
|
|
213
215
|
sendingValue: bnAmount.toString(),
|
|
214
216
|
originTokenInfo: altInputTokenInfo,
|
|
215
217
|
destinationTokenInfo: inputTokenInfo
|
|
216
218
|
},
|
|
217
|
-
name:
|
|
219
|
+
name: `Transfer ${symbol} from ${networkName}`,
|
|
218
220
|
type: _types.YieldStepType.XCM
|
|
219
221
|
};
|
|
220
222
|
const xcmOriginSubstrateApi = await this.state.getSubstrateApi(altInputTokenInfo.originChain).isReady;
|
|
@@ -411,7 +413,9 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
411
413
|
amount
|
|
412
414
|
} = data;
|
|
413
415
|
const destinationTokenSlug = this.inputAsset;
|
|
414
|
-
const
|
|
416
|
+
const altInputTokenSlug = this.altInputAsset || '';
|
|
417
|
+
const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
|
|
418
|
+
const originChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
|
|
415
419
|
const originTokenSlug = (0, _utils2._getChainNativeTokenSlug)(originChainInfo);
|
|
416
420
|
const originTokenInfo = this.state.getAssetBySlug(originTokenSlug);
|
|
417
421
|
const destinationTokenInfo = this.state.getAssetBySlug(destinationTokenSlug);
|
|
@@ -74,6 +74,7 @@ class EarningService {
|
|
|
74
74
|
if (_constants2._STAKING_CHAIN_GROUP.liquidStaking.includes(chain)) {
|
|
75
75
|
if (chain === 'bifrost_dot') {
|
|
76
76
|
handlers.push(new _handlers.BifrostLiquidStakingPoolHandler(this.state, chain));
|
|
77
|
+
handlers.push(new _handlers.BifrostMantaLiquidStakingPoolHandler(this.state, chain));
|
|
77
78
|
}
|
|
78
79
|
if (chain === 'acala') {
|
|
79
80
|
handlers.push(new _handlers.AcalaLiquidStakingPoolHandler(this.state, chain));
|
|
@@ -410,12 +411,11 @@ class EarningService {
|
|
|
410
411
|
return Promise.resolve(this.yieldPositionListSubject.getValue());
|
|
411
412
|
}
|
|
412
413
|
yieldPositionPersistQueue = [];
|
|
413
|
-
|
|
414
|
-
this.yieldPositionPersistQueue = [];
|
|
415
|
-
}
|
|
416
|
-
resetYieldPosition() {
|
|
414
|
+
async resetYieldPosition() {
|
|
417
415
|
this.yieldPositionSubject.next({});
|
|
418
416
|
this.yieldPositionPersistQueue = [];
|
|
417
|
+
(0, _utils2.removeLazy)('persistYieldPositionInfo');
|
|
418
|
+
await this.dbService.stores.yieldPosition.clear();
|
|
419
419
|
}
|
|
420
420
|
_getYieldPositionKey(slug, address) {
|
|
421
421
|
return `${slug}---${address}`;
|
|
@@ -443,7 +443,7 @@ class EarningService {
|
|
|
443
443
|
this.runUnsubscribePoolsPosition();
|
|
444
444
|
this.runUnsubscribeStakingRewardInterval();
|
|
445
445
|
this.runUnsubscribeEarningRewardHistoryInterval();
|
|
446
|
-
reset && this.resetYieldPosition();
|
|
446
|
+
reset && (await this.resetYieldPosition());
|
|
447
447
|
await this.runSubscribePoolsPosition();
|
|
448
448
|
this.runSubscribeStakingRewardInterval();
|
|
449
449
|
this.runSubscribeEarningRewardHistoryInterval();
|
|
@@ -461,6 +461,7 @@ class EarningService {
|
|
|
461
461
|
runUnsubscribePoolsPosition() {
|
|
462
462
|
var _this$yieldPositionUn;
|
|
463
463
|
(_this$yieldPositionUn = this.yieldPositionUnsub) === null || _this$yieldPositionUn === void 0 ? void 0 : _this$yieldPositionUn.call(this);
|
|
464
|
+
(0, _utils2.removeLazy)('persistYieldPositionInfo');
|
|
464
465
|
this.yieldPositionPersistQueue = [];
|
|
465
466
|
}
|
|
466
467
|
|
|
@@ -468,12 +469,19 @@ class EarningService {
|
|
|
468
469
|
|
|
469
470
|
/* Get pools' reward */
|
|
470
471
|
|
|
472
|
+
earningsRewardQueue = [];
|
|
471
473
|
updateEarningReward(stakingRewardData) {
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
474
|
+
this.earningsRewardQueue.push(stakingRewardData);
|
|
475
|
+
(0, _utils2.addLazy)('updateEarningReward', () => {
|
|
476
|
+
const stakingRewardState = this.earningRewardSubject.getValue();
|
|
477
|
+
this.earningsRewardQueue.forEach(item => {
|
|
478
|
+
const key = `${item.slug}---${item.address}`;
|
|
479
|
+
stakingRewardState.data[key] = item;
|
|
480
|
+
});
|
|
481
|
+
stakingRewardState.ready = true;
|
|
482
|
+
this.earningRewardSubject.next(stakingRewardState);
|
|
483
|
+
this.earningsRewardQueue = [];
|
|
484
|
+
});
|
|
477
485
|
}
|
|
478
486
|
async getPoolReward(addresses, callback) {
|
|
479
487
|
let cancel = false;
|
|
@@ -522,6 +530,8 @@ class EarningService {
|
|
|
522
530
|
}, _constants.CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL);
|
|
523
531
|
}
|
|
524
532
|
runUnsubscribeStakingRewardInterval() {
|
|
533
|
+
(0, _utils2.removeLazy)('updateEarningReward');
|
|
534
|
+
this.earningsRewardQueue = [];
|
|
525
535
|
this.earningsRewardInterval && clearInterval(this.earningsRewardInterval);
|
|
526
536
|
}
|
|
527
537
|
async fetchPoolRewardHistory(addresses, callback) {
|
|
@@ -550,11 +560,18 @@ class EarningService {
|
|
|
550
560
|
});
|
|
551
561
|
};
|
|
552
562
|
}
|
|
563
|
+
earningRewardHistoryQueue = [];
|
|
553
564
|
updateEarningRewardHistory(earningRewardHistory) {
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
565
|
+
this.earningRewardHistoryQueue.push(earningRewardHistory);
|
|
566
|
+
(0, _utils2.addLazy)('updateEarningRewardHistory', () => {
|
|
567
|
+
const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
|
|
568
|
+
this.earningRewardHistoryQueue.forEach(item => {
|
|
569
|
+
const key = `${item.slug}---${item.address}---${item.eventIndex}`;
|
|
570
|
+
earningRewardHistoryState[key] = item;
|
|
571
|
+
});
|
|
572
|
+
this.earningRewardHistorySubject.next(earningRewardHistoryState);
|
|
573
|
+
this.earningRewardHistoryQueue = [];
|
|
574
|
+
}, 300, 1800);
|
|
558
575
|
}
|
|
559
576
|
subscribeEarningRewardHistory() {
|
|
560
577
|
return this.earningRewardHistorySubject;
|
|
@@ -578,6 +595,8 @@ class EarningService {
|
|
|
578
595
|
}, _constants.CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL);
|
|
579
596
|
}
|
|
580
597
|
runUnsubscribeEarningRewardHistoryInterval() {
|
|
598
|
+
(0, _utils2.removeLazy)('updateEarningRewardHistory');
|
|
599
|
+
this.earningRewardHistoryQueue = [];
|
|
581
600
|
this.earningsRewardHistoryInterval && clearInterval(this.earningsRewardHistoryInterval);
|
|
582
601
|
}
|
|
583
602
|
|
|
@@ -729,5 +748,10 @@ class EarningService {
|
|
|
729
748
|
/* Other */
|
|
730
749
|
|
|
731
750
|
/* Handle actions */
|
|
751
|
+
|
|
752
|
+
// Clear wallet data
|
|
753
|
+
async resetWallet() {
|
|
754
|
+
await this.resetYieldPosition();
|
|
755
|
+
}
|
|
732
756
|
}
|
|
733
757
|
exports.default = EarningService;
|
|
@@ -36,15 +36,18 @@ class NotificationService {
|
|
|
36
36
|
const link = action === null || action === void 0 ? void 0 : action.url;
|
|
37
37
|
const onClick = action === null || action === void 0 ? void 0 : action.click;
|
|
38
38
|
const onButtonClick = action === null || action === void 0 ? void 0 : action.buttonClick;
|
|
39
|
-
|
|
39
|
+
const options = {
|
|
40
40
|
type: 'basic',
|
|
41
41
|
title,
|
|
42
42
|
message,
|
|
43
43
|
iconUrl: '/images/icon-128.png',
|
|
44
44
|
priority: 2,
|
|
45
|
-
isClickable: !!link || !!onClick
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
isClickable: !!link || !!onClick
|
|
46
|
+
};
|
|
47
|
+
if (!_utils.isFirefox) {
|
|
48
|
+
options.buttons = buttons;
|
|
49
|
+
}
|
|
50
|
+
(_chrome = chrome) === null || _chrome === void 0 ? void 0 : (_chrome$notifications = _chrome.notifications) === null || _chrome$notifications === void 0 ? void 0 : _chrome$notifications.create(options, notificationId => {
|
|
48
51
|
if (link || onClick) {
|
|
49
52
|
chrome.notifications.onClicked.addListener(nId => {
|
|
50
53
|
if (nId === notificationId) {
|
|
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
|
-
var _common =
|
|
8
|
+
var _common = require("@ethereumjs/common");
|
|
9
|
+
var _tx = require("@ethereumjs/tx");
|
|
9
10
|
var _EvmProviderError = require("@subwallet/extension-base/background/errors/EvmProviderError");
|
|
10
11
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
11
12
|
var _eth = require("@subwallet/extension-base/utils/eth");
|
|
12
13
|
var _request = require("@subwallet/extension-base/utils/request");
|
|
13
14
|
var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
|
|
14
|
-
var
|
|
15
|
-
var _ethereumjsTx = require("ethereumjs-tx");
|
|
15
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
16
16
|
var _ethereumjsUtil = require("ethereumjs-util");
|
|
17
17
|
var _i18next = require("i18next");
|
|
18
18
|
var _rxjs = require("rxjs");
|
|
@@ -137,35 +137,48 @@ class EvmRequestHandler {
|
|
|
137
137
|
}
|
|
138
138
|
configToTransaction(config) {
|
|
139
139
|
function formatField(input) {
|
|
140
|
-
if (typeof input === 'string') {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return new _bn.default(input);
|
|
145
|
-
}
|
|
140
|
+
if (typeof input === 'string' || typeof input === 'number') {
|
|
141
|
+
return (0, _util.hexAddPrefix)(new _bignumber.default(input).toString(16));
|
|
142
|
+
} else if (typeof input === 'undefined') {
|
|
143
|
+
return undefined;
|
|
146
144
|
}
|
|
147
|
-
return input;
|
|
145
|
+
return (0, _util.bnToHex)(input);
|
|
148
146
|
}
|
|
149
|
-
|
|
150
|
-
// Convert any string, number to number with BigN exclude hex string
|
|
151
|
-
const txData = {
|
|
152
|
-
from: config.from,
|
|
153
|
-
nonce: formatField(config.nonce),
|
|
154
|
-
gasPrice: formatField(config.gasPrice),
|
|
155
|
-
gasLimit: formatField(config.gas),
|
|
156
|
-
to: config.to,
|
|
157
|
-
value: formatField(config.value),
|
|
158
|
-
data: (0, _ethereumjsUtil.toBuffer)(config.data)
|
|
159
|
-
};
|
|
160
|
-
const common = _common.default.custom({
|
|
147
|
+
const common = _common.Common.custom({
|
|
161
148
|
chainId: config.chainId,
|
|
162
|
-
defaultHardfork: '
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
return new _ethereumjsTx.Transaction(txData, {
|
|
167
|
-
common
|
|
149
|
+
defaultHardfork: 'london',
|
|
150
|
+
networkId: config.chainId
|
|
151
|
+
}, {
|
|
152
|
+
eips: [1559]
|
|
168
153
|
});
|
|
154
|
+
if (config.maxFeePerGas) {
|
|
155
|
+
const txData = {
|
|
156
|
+
nonce: formatField(config.nonce),
|
|
157
|
+
gasLimit: formatField(config.gas),
|
|
158
|
+
to: config.to,
|
|
159
|
+
value: formatField(config.value),
|
|
160
|
+
data: (0, _ethereumjsUtil.toBuffer)(config.data),
|
|
161
|
+
maxFeePerGas: formatField(config.maxFeePerGas),
|
|
162
|
+
maxPriorityFeePerGas: formatField(config.maxPriorityFeePerGas),
|
|
163
|
+
chainId: config.chainId
|
|
164
|
+
};
|
|
165
|
+
return new _tx.FeeMarketEIP1559Transaction(txData, {
|
|
166
|
+
common
|
|
167
|
+
});
|
|
168
|
+
} else {
|
|
169
|
+
// Convert any string, number to number with BigN exclude hex string
|
|
170
|
+
const txData = {
|
|
171
|
+
nonce: formatField(config.nonce),
|
|
172
|
+
gasLimit: formatField(config.gas),
|
|
173
|
+
gasPrice: formatField(config.gasPrice),
|
|
174
|
+
to: config.to,
|
|
175
|
+
value: formatField(config.value),
|
|
176
|
+
data: (0, _ethereumjsUtil.toBuffer)(config.data)
|
|
177
|
+
};
|
|
178
|
+
return new _tx.LegacyTransaction(txData, {
|
|
179
|
+
common
|
|
180
|
+
});
|
|
181
|
+
}
|
|
169
182
|
}
|
|
170
183
|
async signTransaction(confirmation) {
|
|
171
184
|
const transaction = confirmation.payload;
|
|
@@ -174,6 +187,8 @@ class EvmRequestHandler {
|
|
|
174
187
|
from,
|
|
175
188
|
gas,
|
|
176
189
|
gasPrice,
|
|
190
|
+
maxFeePerGas,
|
|
191
|
+
maxPriorityFeePerGas,
|
|
177
192
|
value
|
|
178
193
|
} = transaction;
|
|
179
194
|
const pair = _uiKeyring.default.getPair(from);
|
|
@@ -182,7 +197,9 @@ class EvmRequestHandler {
|
|
|
182
197
|
gas: (0, _eth.anyNumberToBN)(gas).toNumber(),
|
|
183
198
|
value: (0, _eth.anyNumberToBN)(value).toNumber(),
|
|
184
199
|
gasPrice: (0, _eth.anyNumberToBN)(gasPrice).toNumber(),
|
|
185
|
-
gasLimit: (0, _eth.anyNumberToBN)(estimateGas).toNumber()
|
|
200
|
+
gasLimit: (0, _eth.anyNumberToBN)(estimateGas).toNumber(),
|
|
201
|
+
maxFeePerGas: (0, _eth.anyNumberToBN)(maxFeePerGas).toNumber(),
|
|
202
|
+
maxPriorityFeePerGas: (0, _eth.anyNumberToBN)(maxPriorityFeePerGas).toNumber()
|
|
186
203
|
// nonce: await web3.eth.getTransactionCount(from) // Todo: fill this value from transaction service
|
|
187
204
|
};
|
|
188
205
|
|
|
@@ -7,5 +7,5 @@ exports.TRANSACTION_TIMEOUT = void 0;
|
|
|
7
7
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
8
8
|
// SPDX-License-Identifier: Apache-2.0
|
|
9
9
|
|
|
10
|
-
const TRANSACTION_TIMEOUT =
|
|
10
|
+
const TRANSACTION_TIMEOUT = 5 * 60 * 1000;
|
|
11
11
|
exports.TRANSACTION_TIMEOUT = TRANSACTION_TIMEOUT;
|