@subwallet/extension-base 1.3.77-0 → 1.3.78-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 +2 -0
- package/cjs/core/logic-validation/index.js +1 -1
- package/cjs/core/substrate/xcm-parser.js +10 -1
- package/cjs/koni/background/handlers/Extension.js +35 -8
- package/cjs/koni/background/handlers/State.js +20 -0
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/evm.js +85 -6
- package/cjs/services/balance-service/helpers/subscribe/index.js +2 -1
- package/cjs/services/balance-service/index.js +6 -2
- package/cjs/services/balance-service/transfer/token.js +15 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/index.js +27 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +58 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/utils.js +36 -0
- package/cjs/services/balance-service/transfer/xcm/index.js +61 -2
- package/cjs/services/balance-service/transfer/xcm/utils.js +94 -6
- package/cjs/services/chain-service/constants.js +4 -2
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/constants/chains.js +4 -2
- package/cjs/services/earning-service/handlers/special.js +82 -65
- package/cjs/services/earning-service/service.js +1 -0
- package/cjs/services/swap-service/handler/bittensor-handler.js +197 -0
- package/cjs/services/swap-service/index.js +7 -0
- package/cjs/services/transaction-service/index.js +1 -0
- package/cjs/types/balance/index.js +1 -0
- package/cjs/types/swap/index.js +3 -1
- package/cjs/utils/fee/transfer.js +20 -5
- package/core/logic-validation/index.js +1 -1
- package/core/substrate/xcm-parser.d.ts +2 -0
- package/core/substrate/xcm-parser.js +8 -1
- package/koni/background/handlers/Extension.js +36 -9
- package/koni/background/handlers/State.d.ts +1 -0
- package/koni/background/handlers/State.js +20 -0
- package/package.json +26 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/evm.d.ts +1 -0
- package/services/balance-service/helpers/subscribe/evm.js +76 -1
- package/services/balance-service/helpers/subscribe/index.js +2 -1
- package/services/balance-service/index.js +6 -2
- package/services/balance-service/transfer/token.d.ts +2 -1
- package/services/balance-service/transfer/token.js +15 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/index.d.ts +2 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/index.js +5 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.d.ts +6 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +50 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/utils.d.ts +8 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/utils.js +29 -0
- package/services/balance-service/transfer/xcm/index.d.ts +5 -0
- package/services/balance-service/transfer/xcm/index.js +57 -2
- package/services/balance-service/transfer/xcm/utils.d.ts +3 -2
- package/services/balance-service/transfer/xcm/utils.js +87 -1
- package/services/chain-service/constants.d.ts +2 -0
- package/services/chain-service/constants.js +4 -2
- package/services/chain-service/utils/patch.d.ts +1 -1
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/constants/chains.d.ts +1 -0
- package/services/earning-service/constants/chains.js +2 -1
- package/services/earning-service/handlers/special.d.ts +1 -1
- package/services/earning-service/handlers/special.js +85 -68
- package/services/earning-service/service.js +1 -0
- package/services/swap-service/handler/bittensor-handler.d.ts +21 -0
- package/services/swap-service/handler/bittensor-handler.js +189 -0
- package/services/swap-service/index.js +7 -0
- package/services/transaction-service/index.js +1 -0
- package/services/transaction-service/types.d.ts +4 -3
- package/types/balance/index.d.ts +3 -1
- package/types/balance/index.js +1 -0
- package/types/balance/transfer.d.ts +7 -0
- package/types/fee/base.d.ts +1 -0
- package/types/swap/index.d.ts +3 -1
- package/types/swap/index.js +3 -1
- package/types/yield/actions/join/step.d.ts +6 -0
- package/types/yield/actions/join/submit.d.ts +1 -0
- package/utils/fee/transfer.d.ts +1 -0
- package/utils/fee/transfer.js +21 -6
|
@@ -570,6 +570,7 @@ export interface XCMTransactionAdditionalInfo {
|
|
|
570
570
|
destinationChain: string;
|
|
571
571
|
originalChain: string;
|
|
572
572
|
fee?: AmountData;
|
|
573
|
+
sendingTokenInfo?: _ChainAsset;
|
|
573
574
|
}
|
|
574
575
|
export interface NFTTransactionAdditionalInfo {
|
|
575
576
|
collectionName: string;
|
|
@@ -629,6 +630,7 @@ export interface TransactionHistoryItem<ET extends ExtrinsicType = ExtrinsicType
|
|
|
629
630
|
addressPrefix?: number;
|
|
630
631
|
processId?: string;
|
|
631
632
|
apiTxIndex?: number;
|
|
633
|
+
crossChainFeeInfo?: AmountData;
|
|
632
634
|
substrateProxyAddresses?: string[];
|
|
633
635
|
}
|
|
634
636
|
export interface SWWarning {
|
|
@@ -73,7 +73,7 @@ function validateSpendingAndFeePayment(spendingToken, feeToken, bnSpendingAmount
|
|
|
73
73
|
}))];
|
|
74
74
|
}
|
|
75
75
|
} else {
|
|
76
|
-
if (bnFromTokenBalance.
|
|
76
|
+
if (bnFromTokenBalance.lt(bnSpendingAmount.plus((0, _utils._isNativeToken)(spendingToken) ? '0' : (0, _utils._getTokenMinAmount)(spendingToken)))) {
|
|
77
77
|
return [new _TransactionError.TransactionError(_types.BasicTxErrorType.NOT_ENOUGH_BALANCE, (0, _i18next.t)('bg.core.validation.insufficientSpendingTokenBalance', {
|
|
78
78
|
replace: {
|
|
79
79
|
spendingTokenSymbol: spendingToken.symbol
|
|
@@ -8,15 +8,18 @@ exports._getXcmUnstableWarning = _getXcmUnstableWarning;
|
|
|
8
8
|
exports._isAcrossBridgeXcm = _isAcrossBridgeXcm;
|
|
9
9
|
exports._isAssetHubBridgeXcm = _isAssetHubBridgeXcm;
|
|
10
10
|
exports._isAvailBridgeXcm = _isAvailBridgeXcm;
|
|
11
|
+
exports._isBittensorToSubtensorEvmBridge = _isBittensorToSubtensorEvmBridge;
|
|
11
12
|
exports._isMythosFromHydrationToMythos = _isMythosFromHydrationToMythos;
|
|
12
13
|
exports._isPolygonBridgeXcm = _isPolygonBridgeXcm;
|
|
13
14
|
exports._isPosBridgeXcm = _isPosBridgeXcm;
|
|
14
15
|
exports._isSnowBridgeXcm = _isSnowBridgeXcm;
|
|
16
|
+
exports._isSubtensorEvmtoBittensorBridge = _isSubtensorEvmtoBittensorBridge;
|
|
15
17
|
exports._isXcmTransferUnstable = _isXcmTransferUnstable;
|
|
16
18
|
exports._isXcmWithinSameConsensus = _isXcmWithinSameConsensus;
|
|
17
19
|
var _chainList = require("@subwallet/chain-list");
|
|
18
20
|
var _acrossBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge");
|
|
19
21
|
var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
|
|
22
|
+
var _nativeTokenBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge");
|
|
20
23
|
var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
|
|
21
24
|
var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
|
|
22
25
|
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
@@ -24,7 +27,7 @@ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
|
24
27
|
// SPDX-License-Identifier: Apache-2.0
|
|
25
28
|
|
|
26
29
|
function _isXcmTransferUnstable(originChainInfo, destChainInfo, assetSlug) {
|
|
27
|
-
return !_isXcmWithinSameConsensus(originChainInfo, destChainInfo) && !_isAssetHubBridgeXcm || _isMythosFromHydrationToMythos(originChainInfo, destChainInfo, assetSlug) || _isPolygonBridgeXcm(originChainInfo, destChainInfo) || _isPosBridgeXcm(originChainInfo, destChainInfo);
|
|
30
|
+
return !_isBittensorToSubtensorEvmBridge(originChainInfo, destChainInfo) && !_isSubtensorEvmtoBittensorBridge(originChainInfo, destChainInfo) && !_isXcmWithinSameConsensus(originChainInfo, destChainInfo) && !_isAssetHubBridgeXcm(originChainInfo, destChainInfo) || _isMythosFromHydrationToMythos(originChainInfo, destChainInfo, assetSlug) || _isPolygonBridgeXcm(originChainInfo, destChainInfo) || _isPosBridgeXcm(originChainInfo, destChainInfo);
|
|
28
31
|
}
|
|
29
32
|
function getDefaultUnstableWarning() {
|
|
30
33
|
return 'Cross-chain transfer of this token is not recommended as it is in beta and incurs a large transaction fee. Continue at your own risk';
|
|
@@ -97,6 +100,12 @@ function _isPosBridgeXcm(originChainInfo, destChainInfo) {
|
|
|
97
100
|
function _isAcrossBridgeXcm(originChainInfo, destChainInfo) {
|
|
98
101
|
return (0, _acrossBridge._isAcrossChainBridge)(originChainInfo.slug, destChainInfo.slug);
|
|
99
102
|
}
|
|
103
|
+
function _isBittensorToSubtensorEvmBridge(originChainInfo, destChainInfo) {
|
|
104
|
+
return (0, _nativeTokenBridge._isBittensorToSubtensorBridge)(originChainInfo.slug, destChainInfo.slug);
|
|
105
|
+
}
|
|
106
|
+
function _isSubtensorEvmtoBittensorBridge(originChainInfo, destChainInfo) {
|
|
107
|
+
return (0, _nativeTokenBridge._isSubtensorToBittensorBridge)(originChainInfo.slug, destChainInfo.slug);
|
|
108
|
+
}
|
|
100
109
|
function _isAssetHubBridgeXcm(originChainInfo, destChainInfo) {
|
|
101
110
|
return originChainInfo.slug === 'statemint' && destChainInfo.slug === 'statemine' || originChainInfo.slug === 'statemine' && destChainInfo.slug === 'statemint';
|
|
102
111
|
}
|
|
@@ -40,6 +40,7 @@ var _tonTransfer = require("@subwallet/extension-base/services/balance-service/t
|
|
|
40
40
|
var _xcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm");
|
|
41
41
|
var _acrossBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge");
|
|
42
42
|
var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
|
|
43
|
+
var _nativeTokenBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge");
|
|
43
44
|
var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
|
|
44
45
|
var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
|
|
45
46
|
var _utils5 = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
|
|
@@ -1308,6 +1309,7 @@ class KoniExtension {
|
|
|
1308
1309
|
feeCustom,
|
|
1309
1310
|
feeOption,
|
|
1310
1311
|
from,
|
|
1312
|
+
metadata,
|
|
1311
1313
|
to,
|
|
1312
1314
|
tokenPayFeeSlug,
|
|
1313
1315
|
tokenSlug,
|
|
@@ -1448,7 +1450,8 @@ class KoniExtension {
|
|
|
1448
1450
|
networkKey: chain,
|
|
1449
1451
|
tokenInfo: transferTokenInfo,
|
|
1450
1452
|
to: to,
|
|
1451
|
-
substrateApi
|
|
1453
|
+
substrateApi,
|
|
1454
|
+
metadata
|
|
1452
1455
|
});
|
|
1453
1456
|
if (_constants._SUPPORT_TOKEN_PAY_FEE_GROUP.hydration.includes(chain)) {
|
|
1454
1457
|
var _this$koniState$chain, _substrateApi$api$que;
|
|
@@ -1575,11 +1578,18 @@ class KoniExtension {
|
|
|
1575
1578
|
const isPolygonBridgeTransfer = (0, _polygonBridge._isPolygonChainBridge)(originNetworkKey, destinationNetworkKey);
|
|
1576
1579
|
const isPosBridgeTransfer = (0, _posBridge._isPosChainBridge)(originNetworkKey, destinationNetworkKey);
|
|
1577
1580
|
const isAcrossBridgeTransfer = (0, _acrossBridge._isAcrossChainBridge)(originNetworkKey, destinationNetworkKey);
|
|
1581
|
+
const isBittensorBridgeTransfer = (0, _nativeTokenBridge._isBittensorToSubtensorBridge)(originNetworkKey, destinationNetworkKey);
|
|
1582
|
+
const isSubtensorEvmBridgeTransfer = (0, _nativeTokenBridge._isSubtensorToBittensorBridge)(originNetworkKey, destinationNetworkKey);
|
|
1578
1583
|
const extrinsicType = _KoniTypes.ExtrinsicType.TRANSFER_XCM;
|
|
1579
|
-
const
|
|
1584
|
+
const isSubstrateParaspellXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer || isAcrossBridgeTransfer || isBittensorBridgeTransfer || isSubtensorEvmBridgeTransfer);
|
|
1580
1585
|
const isTransferNative = this.#koniState.getNativeTokenInfo(originNetworkKey).slug === tokenSlug;
|
|
1581
1586
|
const isTransferLocalTokenAndPayThatTokenAsFee = !isTransferNative && tokenSlug === tokenPayFeeSlug;
|
|
1582
1587
|
let xcmFeeDryRun;
|
|
1588
|
+
const xcmDestinationFee = {
|
|
1589
|
+
symbol: (destinationTokenInfo === null || destinationTokenInfo === void 0 ? void 0 : destinationTokenInfo.symbol) || '',
|
|
1590
|
+
decimals: (destinationTokenInfo === null || destinationTokenInfo === void 0 ? void 0 : destinationTokenInfo.decimals) || 0,
|
|
1591
|
+
value: '0'
|
|
1592
|
+
};
|
|
1583
1593
|
let additionalValidator;
|
|
1584
1594
|
let eventsHandler;
|
|
1585
1595
|
if (fromKeyPair && destinationTokenInfo) {
|
|
@@ -1590,6 +1600,9 @@ class KoniExtension {
|
|
|
1590
1600
|
if (isPosBridgeTransfer || isPolygonBridgeTransfer) {
|
|
1591
1601
|
funcCreateExtrinsic = _xcm.createPolygonBridgeExtrinsic;
|
|
1592
1602
|
type = 'evm';
|
|
1603
|
+
} else if (isSubtensorEvmBridgeTransfer) {
|
|
1604
|
+
funcCreateExtrinsic = _xcm.createSubtensorEvmToBittensorExtrinsic;
|
|
1605
|
+
type = 'evm';
|
|
1593
1606
|
} else if (isAcrossBridgeTransfer) {
|
|
1594
1607
|
funcCreateExtrinsic = _xcm.createAcrossBridgeExtrinsic;
|
|
1595
1608
|
type = 'evm';
|
|
@@ -1599,6 +1612,9 @@ class KoniExtension {
|
|
|
1599
1612
|
} else if (isAvailBridgeFromEvm) {
|
|
1600
1613
|
funcCreateExtrinsic = _xcm.createAvailBridgeTxFromEth;
|
|
1601
1614
|
type = 'evm';
|
|
1615
|
+
} else if (isBittensorBridgeTransfer) {
|
|
1616
|
+
funcCreateExtrinsic = _xcm.createBittensorToSubtensorEvmExtrinsic;
|
|
1617
|
+
type = 'substrate';
|
|
1602
1618
|
} else if (isAvailBridgeFromAvail) {
|
|
1603
1619
|
funcCreateExtrinsic = _xcm.createAvailBridgeExtrinsicFromAvail;
|
|
1604
1620
|
type = 'substrate';
|
|
@@ -1619,10 +1635,11 @@ class KoniExtension {
|
|
|
1619
1635
|
evmApi,
|
|
1620
1636
|
feeCustom,
|
|
1621
1637
|
feeOption,
|
|
1622
|
-
feeInfo
|
|
1638
|
+
feeInfo,
|
|
1639
|
+
transferAll
|
|
1623
1640
|
};
|
|
1624
1641
|
extrinsic = await funcCreateExtrinsic(params);
|
|
1625
|
-
if (
|
|
1642
|
+
if (isSubstrateParaspellXcm) {
|
|
1626
1643
|
const xcmFeeInfo = await (0, _utils5.estimateXcmFee)({
|
|
1627
1644
|
fromChainInfo: params.originChain,
|
|
1628
1645
|
fromTokenInfo: params.originTokenInfo,
|
|
@@ -1631,7 +1648,11 @@ class KoniExtension {
|
|
|
1631
1648
|
sender: params.sender,
|
|
1632
1649
|
value: params.sendingValue
|
|
1633
1650
|
});
|
|
1651
|
+
|
|
1652
|
+
// todo: refactor name
|
|
1653
|
+
// todo: check to use full interface to has full AmountData, include symbol, decimal
|
|
1634
1654
|
xcmFeeDryRun = (xcmFeeInfo === null || xcmFeeInfo === void 0 ? void 0 : xcmFeeInfo.origin.fee) || '0';
|
|
1655
|
+
xcmDestinationFee.value = (xcmFeeInfo === null || xcmFeeInfo === void 0 ? void 0 : xcmFeeInfo.destination.fee) || '0';
|
|
1635
1656
|
}
|
|
1636
1657
|
if (isAcrossBridgeTransfer) {
|
|
1637
1658
|
const data = await (0, _acrossBridge.getAcrossQuote)(params);
|
|
@@ -1699,7 +1720,7 @@ class KoniExtension {
|
|
|
1699
1720
|
warning.length && inputTransaction.warnings.push(...warning);
|
|
1700
1721
|
error.length && inputTransaction.errors.push(...error);
|
|
1701
1722
|
}
|
|
1702
|
-
if (
|
|
1723
|
+
if (isSubstrateParaspellXcm) {
|
|
1703
1724
|
const isDryRunSuccess = await (0, _xcm.dryRunXcmExtrinsicV2)(params, false);
|
|
1704
1725
|
if (!isDryRunSuccess) {
|
|
1705
1726
|
inputTransaction.errors.push(new _TransactionError.TransactionError(_types5.BasicTxErrorType.UNABLE_TO_SEND, 'Unable to perform transaction. Select another token or destination chain and try again'));
|
|
@@ -1737,7 +1758,7 @@ class KoniExtension {
|
|
|
1737
1758
|
transaction: extrinsic,
|
|
1738
1759
|
data: inputData,
|
|
1739
1760
|
extrinsicType,
|
|
1740
|
-
chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer && !isPosBridgeTransfer && !isAcrossBridgeTransfer ? _KoniTypes.ChainType.SUBSTRATE : _KoniTypes.ChainType.EVM,
|
|
1761
|
+
chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer && !isPosBridgeTransfer && !isAcrossBridgeTransfer && !isSubtensorEvmBridgeTransfer ? _KoniTypes.ChainType.SUBSTRATE : _KoniTypes.ChainType.EVM,
|
|
1741
1762
|
transferNativeAmount: (0, _utils6._isNativeToken)(originTokenInfo) ? value : '0',
|
|
1742
1763
|
ignoreWarnings,
|
|
1743
1764
|
tokenPayFeeSlug,
|
|
@@ -1745,6 +1766,7 @@ class KoniExtension {
|
|
|
1745
1766
|
isTransferLocalTokenAndPayThatTokenAsFee,
|
|
1746
1767
|
isPassConfirmation,
|
|
1747
1768
|
xcmFeeDryRun,
|
|
1769
|
+
xcmDestinationFee,
|
|
1748
1770
|
errors,
|
|
1749
1771
|
additionalValidator: additionalValidator,
|
|
1750
1772
|
eventsHandler: eventsHandler
|
|
@@ -2216,6 +2238,7 @@ class KoniExtension {
|
|
|
2216
2238
|
destChain: _destChain,
|
|
2217
2239
|
feeCustom,
|
|
2218
2240
|
feeOption,
|
|
2241
|
+
metadata,
|
|
2219
2242
|
to,
|
|
2220
2243
|
token,
|
|
2221
2244
|
tokenPayFeeSlug,
|
|
@@ -2257,7 +2280,8 @@ class KoniExtension {
|
|
|
2257
2280
|
isTransferLocalTokenAndPayThatTokenAsFee,
|
|
2258
2281
|
isTransferNativeTokenAndPayLocalTokenAsFee,
|
|
2259
2282
|
nativeToken,
|
|
2260
|
-
transferAll
|
|
2283
|
+
transferAll,
|
|
2284
|
+
metadata
|
|
2261
2285
|
};
|
|
2262
2286
|
const subscription = (0, _rxjs.combineLatest)({
|
|
2263
2287
|
freeBalance: freeBalanceSubject,
|
|
@@ -4611,7 +4635,8 @@ class KoniExtension {
|
|
|
4611
4635
|
errorOnTimeOut,
|
|
4612
4636
|
...this.createPassConfirmationParams(isPassConfirmation),
|
|
4613
4637
|
eventsHandler,
|
|
4614
|
-
step
|
|
4638
|
+
step,
|
|
4639
|
+
xcmFeeDryRun: extrinsicType === _KoniTypes.ExtrinsicType.TRANSFER_XCM ? submitData.xcmStepFee : undefined
|
|
4615
4640
|
});
|
|
4616
4641
|
}
|
|
4617
4642
|
async handleYieldLeave(params) {
|
|
@@ -5918,6 +5943,8 @@ class KoniExtension {
|
|
|
5918
5943
|
return await this.reconnectChain(request);
|
|
5919
5944
|
case 'pri(chainService.disableChain)':
|
|
5920
5945
|
return await this.disableChain(request);
|
|
5946
|
+
case 'pri(chainService.disableAllChains)':
|
|
5947
|
+
return await this.#koniState.disableAllChains();
|
|
5921
5948
|
case 'pri(chainService.removeChain)':
|
|
5922
5949
|
return this.removeCustomChain(request);
|
|
5923
5950
|
case 'pri(chainService.validateCustomChain)':
|
|
@@ -762,6 +762,26 @@ class KoniState {
|
|
|
762
762
|
}
|
|
763
763
|
return this.chainService.disableChain(chainSlug);
|
|
764
764
|
}
|
|
765
|
+
async disableAllChains() {
|
|
766
|
+
const chainStateMap = this.chainService.getChainStateMap();
|
|
767
|
+
const activeChainSlugs = Object.keys(chainStateMap).filter(slug => chainStateMap[slug].active);
|
|
768
|
+
const failedChainSlugs = [];
|
|
769
|
+
for (const chainSlug of activeChainSlugs) {
|
|
770
|
+
try {
|
|
771
|
+
const isDisabled = await this.disableChain(chainSlug);
|
|
772
|
+
if (!isDisabled) {
|
|
773
|
+
failedChainSlugs.push(chainSlug);
|
|
774
|
+
}
|
|
775
|
+
} catch (error) {
|
|
776
|
+
failedChainSlugs.push(chainSlug);
|
|
777
|
+
this.logger.error(`Failed to disable chain ${chainSlug}`, error);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
if (failedChainSlugs.length) {
|
|
781
|
+
throw new Error('Unable to turn off all networks. Please try again later');
|
|
782
|
+
}
|
|
783
|
+
return true;
|
|
784
|
+
}
|
|
765
785
|
async enableChain(chainSlug) {
|
|
766
786
|
let enableTokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
767
787
|
if (enableTokens) {
|
package/cjs/packageInfo.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
7
|
exports.subscribeERC20Interval = subscribeERC20Interval;
|
|
8
|
+
exports.subscribeERC20IntervalForSubtensorEvm = subscribeERC20IntervalForSubtensorEvm;
|
|
7
9
|
exports.subscribeEVMBalance = subscribeEVMBalance;
|
|
8
10
|
var _types = require("@subwallet/chain-list/types");
|
|
9
11
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
10
12
|
var _constants = require("@subwallet/extension-base/constants");
|
|
11
13
|
var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
|
|
14
|
+
var _utils = require("@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/utils");
|
|
12
15
|
var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
|
|
13
|
-
var
|
|
14
|
-
var
|
|
16
|
+
var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
|
|
17
|
+
var _utils3 = require("@subwallet/extension-base/utils");
|
|
18
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
15
19
|
var _util = require("@polkadot/util");
|
|
16
20
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
17
21
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -25,15 +29,15 @@ function subscribeERC20Interval(_ref) {
|
|
|
25
29
|
evmApi
|
|
26
30
|
} = _ref;
|
|
27
31
|
const chain = chainInfo.slug;
|
|
28
|
-
let tokenList = (0,
|
|
32
|
+
let tokenList = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.ERC20]);
|
|
29
33
|
if (_constants2._BALANCE_CHAIN_GROUP.moonbeam.includes(chain)) {
|
|
30
|
-
const moonbeamLocal = (0,
|
|
34
|
+
const moonbeamLocal = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.LOCAL]);
|
|
31
35
|
tokenList = Object.assign({}, tokenList, moonbeamLocal);
|
|
32
36
|
}
|
|
33
37
|
const erc20ContractMap = {};
|
|
34
38
|
Object.entries(tokenList).forEach(_ref2 => {
|
|
35
39
|
let [slug, tokenInfo] = _ref2;
|
|
36
|
-
erc20ContractMap[slug] = (0, _web.getERC20Contract)((0,
|
|
40
|
+
erc20ContractMap[slug] = (0, _web.getERC20Contract)((0, _utils2._getContractAddressOfToken)(tokenInfo), evmApi);
|
|
37
41
|
});
|
|
38
42
|
const getTokenBalances = () => {
|
|
39
43
|
Object.values(tokenList).map(async tokenInfo => {
|
|
@@ -69,6 +73,79 @@ function subscribeERC20Interval(_ref) {
|
|
|
69
73
|
clearInterval(interval);
|
|
70
74
|
};
|
|
71
75
|
}
|
|
76
|
+
function subscribeERC20IntervalForSubtensorEvm(_ref3) {
|
|
77
|
+
let {
|
|
78
|
+
addresses,
|
|
79
|
+
assetMap,
|
|
80
|
+
callback,
|
|
81
|
+
chainInfo,
|
|
82
|
+
evmApi,
|
|
83
|
+
substrateApiMap
|
|
84
|
+
} = _ref3;
|
|
85
|
+
const chain = chainInfo.slug;
|
|
86
|
+
const tokenList = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.ERC20]);
|
|
87
|
+
let cancel = false;
|
|
88
|
+
const getTokenBalances = () => {
|
|
89
|
+
Object.values(tokenList).map(async tokenInfo => {
|
|
90
|
+
try {
|
|
91
|
+
var _tokenInfo$metadata;
|
|
92
|
+
if ((_tokenInfo$metadata = tokenInfo.metadata) !== null && _tokenInfo$metadata !== void 0 && _tokenInfo$metadata.isAlphaToken && substrateApiMap) {
|
|
93
|
+
const ss58ToEvmMap = {};
|
|
94
|
+
const subtensorEvmSs58Address = [];
|
|
95
|
+
addresses.forEach(address => {
|
|
96
|
+
const ss58Address = (0, _utils.evmToSs58)(address);
|
|
97
|
+
subtensorEvmSs58Address.push(ss58Address);
|
|
98
|
+
ss58ToEvmMap[ss58Address] = address;
|
|
99
|
+
});
|
|
100
|
+
if (cancel) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const substrateApi = await substrateApiMap.bittensor.isReady;
|
|
104
|
+
const rawData = await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkeys(subtensorEvmSs58Address);
|
|
105
|
+
const values = rawData.toPrimitive();
|
|
106
|
+
const converted = {};
|
|
107
|
+
for (let i = 0; i < values.length; i++) {
|
|
108
|
+
const [, stakes] = values[i];
|
|
109
|
+
const s58Address = subtensorEvmSs58Address[i];
|
|
110
|
+
const address = ss58ToEvmMap[s58Address];
|
|
111
|
+
converted[address] = {};
|
|
112
|
+
stakes.forEach(stakeInfo => {
|
|
113
|
+
const {
|
|
114
|
+
netuid,
|
|
115
|
+
stake
|
|
116
|
+
} = stakeInfo;
|
|
117
|
+
const currentValue = converted[address][netuid] || (0, _bignumber.default)(0);
|
|
118
|
+
converted[address][netuid] = currentValue.plus(stake);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
const netuid = (0, _utils2._getAssetNetuid)(tokenInfo);
|
|
122
|
+
const items = Object.entries(converted).map(_ref4 => {
|
|
123
|
+
let [address, stakeMap] = _ref4;
|
|
124
|
+
const value = stakeMap[netuid] || (0, _bignumber.default)(0);
|
|
125
|
+
return {
|
|
126
|
+
address: address,
|
|
127
|
+
tokenSlug: tokenInfo.slug,
|
|
128
|
+
state: _KoniTypes.APIItemState.READY,
|
|
129
|
+
free: value.toFixed(0),
|
|
130
|
+
locked: '0'
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
if (!cancel) {
|
|
134
|
+
callback(items);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
} catch (err) {
|
|
138
|
+
console.log(tokenInfo.slug, err);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
getTokenBalances();
|
|
143
|
+
const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
|
|
144
|
+
return () => {
|
|
145
|
+
cancel = true;
|
|
146
|
+
clearInterval(interval);
|
|
147
|
+
};
|
|
148
|
+
}
|
|
72
149
|
async function getEVMBalance(addresses, web3Api) {
|
|
73
150
|
return await Promise.all(addresses.map(async address => {
|
|
74
151
|
try {
|
|
@@ -88,7 +165,7 @@ function subscribeEVMBalance(params) {
|
|
|
88
165
|
evmApi
|
|
89
166
|
} = params;
|
|
90
167
|
const chain = chainInfo.slug;
|
|
91
|
-
const nativeTokenInfo = (0,
|
|
168
|
+
const nativeTokenInfo = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.NATIVE]);
|
|
92
169
|
const nativeTokenSlug = ((_Object$values$ = Object.values(nativeTokenInfo)[0]) === null || _Object$values$ === void 0 ? void 0 : _Object$values$.slug) || '';
|
|
93
170
|
function getBalance() {
|
|
94
171
|
getEVMBalance(addresses, evmApi).then(balances => {
|
|
@@ -119,8 +196,10 @@ function subscribeEVMBalance(params) {
|
|
|
119
196
|
getBalance();
|
|
120
197
|
const interval = setInterval(getBalance, _constants.ASTAR_REFRESH_BALANCE_INTERVAL);
|
|
121
198
|
const unsub2 = subscribeERC20Interval(params);
|
|
199
|
+
const unsub3 = subscribeERC20IntervalForSubtensorEvm(params);
|
|
122
200
|
return () => {
|
|
123
201
|
clearInterval(interval);
|
|
124
202
|
unsub2 && unsub2();
|
|
203
|
+
unsub3 && unsub3();
|
|
125
204
|
};
|
|
126
205
|
}
|
|
@@ -216,12 +216,16 @@ class BalanceService {
|
|
|
216
216
|
const bitcoinApiMap = this.state.chainService.getBitcoinApiMap();
|
|
217
217
|
let unsub = _util.noop;
|
|
218
218
|
unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, result => {
|
|
219
|
+
var _rs$lockedDetails;
|
|
219
220
|
const rs = result[0];
|
|
220
221
|
let value;
|
|
221
222
|
switch (balanceType) {
|
|
222
223
|
case _types2.BalanceType.TOTAL:
|
|
223
224
|
value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).toFixed();
|
|
224
225
|
break;
|
|
226
|
+
case _types2.BalanceType.STAKING:
|
|
227
|
+
value = ((_rs$lockedDetails = rs.lockedDetails) === null || _rs$lockedDetails === void 0 ? void 0 : _rs$lockedDetails.staking) || '0';
|
|
228
|
+
break;
|
|
225
229
|
case _types2.BalanceType.TOTAL_MINUS_RESERVED:
|
|
226
230
|
if (_constants2._BALANCE_CHAIN_GROUP.notSupportGetBalanceByType.includes(chainInfo.slug)) {
|
|
227
231
|
// TODO: Currently Vara and Avail staking from nomination pools is not fully supported.
|
|
@@ -229,8 +233,8 @@ class BalanceService {
|
|
|
229
233
|
// Improve later when full staking breakdown is available.
|
|
230
234
|
value = rs.free;
|
|
231
235
|
} else {
|
|
232
|
-
var _rs$
|
|
233
|
-
value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).minus(_bignumber.default.max(new _bignumber.default(((_rs$
|
|
236
|
+
var _rs$lockedDetails2, _rs$lockedDetails3;
|
|
237
|
+
value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).minus(_bignumber.default.max(new _bignumber.default(((_rs$lockedDetails2 = rs.lockedDetails) === null || _rs$lockedDetails2 === void 0 ? void 0 : _rs$lockedDetails2.reserved) || 0), new _bignumber.default(((_rs$lockedDetails3 = rs.lockedDetails) === null || _rs$lockedDetails3 === void 0 ? void 0 : _rs$lockedDetails3.staking) || 0))).toFixed();
|
|
234
238
|
}
|
|
235
239
|
break;
|
|
236
240
|
default:
|
|
@@ -28,6 +28,7 @@ const createSubstrateExtrinsic = async _ref => {
|
|
|
28
28
|
var _tokenInfo$metadata;
|
|
29
29
|
let {
|
|
30
30
|
from,
|
|
31
|
+
metadata,
|
|
31
32
|
networkKey,
|
|
32
33
|
substrateApi,
|
|
33
34
|
to,
|
|
@@ -129,6 +130,20 @@ const createSubstrateExtrinsic = async _ref => {
|
|
|
129
130
|
}
|
|
130
131
|
} else if (_constants._TRANSFER_CHAIN_GROUP.truth.includes(networkKey)) {
|
|
131
132
|
transfer = api.tx.assetManager.transfer(to, (0, _utils3._getTokenOnChainInfo)(tokenInfo), value);
|
|
133
|
+
} else if (_constants._TRANSFER_CHAIN_GROUP.bittensor.includes(networkKey) && !!metadata) {
|
|
134
|
+
const {
|
|
135
|
+
fromValidator,
|
|
136
|
+
netuid,
|
|
137
|
+
toValidator
|
|
138
|
+
} = metadata;
|
|
139
|
+
const formatToValidator = toValidator === null || toValidator === void 0 ? void 0 : toValidator.split('___')[0];
|
|
140
|
+
if (fromValidator === formatToValidator) {
|
|
141
|
+
transfer = substrateApi.api.tx.subtensorModule.transferStake(to, fromValidator, netuid, netuid, value);
|
|
142
|
+
} else {
|
|
143
|
+
const moveStakeTx = substrateApi.api.tx.subtensorModule.moveStake(fromValidator, formatToValidator, netuid, netuid, value);
|
|
144
|
+
const transferStakeTx = substrateApi.api.tx.subtensorModule.transferStake(to, formatToValidator, netuid, netuid, value);
|
|
145
|
+
transfer = substrateApi.api.tx.utility.batchAll([moveStakeTx, transferStakeTx]);
|
|
146
|
+
}
|
|
132
147
|
}
|
|
133
148
|
return [transfer, transferAmount || value];
|
|
134
149
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _nativeTokenBridge = require("./nativeTokenBridge");
|
|
7
|
+
Object.keys(_nativeTokenBridge).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _nativeTokenBridge[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _nativeTokenBridge[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _utils = require("./utils");
|
|
18
|
+
Object.keys(_utils).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _utils[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _utils[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports._isBittensorToSubtensorBridge = _isBittensorToSubtensorBridge;
|
|
7
|
+
exports._isSubtensorToBittensorBridge = _isSubtensorToBittensorBridge;
|
|
8
|
+
exports.getSubtensorEvmtoBittensorExtrinsic = getSubtensorEvmtoBittensorExtrinsic;
|
|
9
|
+
var _chainList = require("@subwallet/chain-list");
|
|
10
|
+
var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
|
|
11
|
+
var _utils = require("@subwallet/extension-base/utils");
|
|
12
|
+
var _util = require("@polkadot/util");
|
|
13
|
+
var _utilCrypto = require("@polkadot/util-crypto");
|
|
14
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
15
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
16
|
+
|
|
17
|
+
const NATIVE_SUBTENSOR_ABI = [{
|
|
18
|
+
inputs: [{
|
|
19
|
+
internalType: 'bytes32',
|
|
20
|
+
name: 'data',
|
|
21
|
+
type: 'bytes32'
|
|
22
|
+
}],
|
|
23
|
+
name: 'transfer',
|
|
24
|
+
outputs: [],
|
|
25
|
+
stateMutability: 'payable',
|
|
26
|
+
type: 'function'
|
|
27
|
+
}];
|
|
28
|
+
const nativeSubtensorEvmContractAddress = '0x0000000000000000000000000000000000000800';
|
|
29
|
+
async function getSubtensorEvmtoBittensorExtrinsic(sender, recipientAddress, sendingValue, evmApi, _feeInfo, feeCustom, feeOption) {
|
|
30
|
+
const contract = (0, _web.getWeb3Contract)(nativeSubtensorEvmContractAddress, evmApi, NATIVE_SUBTENSOR_ABI);
|
|
31
|
+
const toAccountId = (0, _utilCrypto.decodeAddress)(recipientAddress);
|
|
32
|
+
const amountSubstrate = new _util.BN(sendingValue).div(new _util.BN(10).pow(new _util.BN(9)));
|
|
33
|
+
const amountU8a = (0, _util.compactToU8a)(amountSubstrate);
|
|
34
|
+
const scaleEncoded = (0, _util.u8aConcat)(toAccountId, amountU8a);
|
|
35
|
+
const dataU8a = scaleEncoded.slice(0, 32);
|
|
36
|
+
const dataHex = (0, _util.u8aToHex)(dataU8a);
|
|
37
|
+
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
39
|
+
const transferCall = contract.methods.transfer(dataHex);
|
|
40
|
+
const txData = transferCall.encodeABI();
|
|
41
|
+
const feeInfo = _feeInfo;
|
|
42
|
+
const feeCombine = (0, _utils.combineEthFee)(feeInfo, feeOption, feeCustom);
|
|
43
|
+
const transactionConfig = {
|
|
44
|
+
from: sender,
|
|
45
|
+
to: nativeSubtensorEvmContractAddress,
|
|
46
|
+
value: sendingValue,
|
|
47
|
+
data: txData,
|
|
48
|
+
...feeCombine
|
|
49
|
+
};
|
|
50
|
+
transactionConfig.gas = (await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 30000)).toString();
|
|
51
|
+
return transactionConfig;
|
|
52
|
+
}
|
|
53
|
+
function _isBittensorToSubtensorBridge(srcChain, destChain) {
|
|
54
|
+
return srcChain === _chainList.COMMON_CHAIN_SLUGS.BITTENSOR && destChain === _chainList.COMMON_CHAIN_SLUGS.SUBTENSOR_EVM || srcChain === _chainList.COMMON_CHAIN_SLUGS.BITTENSOR_TESTNET && destChain === _chainList.COMMON_CHAIN_SLUGS.SUBTENSOR_EVM_TESTNET;
|
|
55
|
+
}
|
|
56
|
+
function _isSubtensorToBittensorBridge(srcChain, destChain) {
|
|
57
|
+
return srcChain === _chainList.COMMON_CHAIN_SLUGS.SUBTENSOR_EVM && destChain === _chainList.COMMON_CHAIN_SLUGS.BITTENSOR || srcChain === _chainList.COMMON_CHAIN_SLUGS.SUBTENSOR_EVM_TESTNET && destChain === _chainList.COMMON_CHAIN_SLUGS.BITTENSOR_TESTNET;
|
|
58
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.evmToSs58 = evmToSs58;
|
|
7
|
+
var _util = require("@polkadot/util");
|
|
8
|
+
var _utilCrypto = require("@polkadot/util-crypto");
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
const EVM_PREFIX = new TextEncoder().encode('evm:');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Convert an EVM address (0x...) into a Substrate SS58 address
|
|
16
|
+
*
|
|
17
|
+
* @param evmAddress EVM address, with or without the "0x" prefix
|
|
18
|
+
* @param ss58Prefix SS58 network prefix (default is 42 – generic Substrate)
|
|
19
|
+
* @returns SS58-encoded Substrate address
|
|
20
|
+
*/
|
|
21
|
+
function evmToSs58(evmAddress) {
|
|
22
|
+
let ss58Prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 42;
|
|
23
|
+
// Normalize input: ensure "0x" prefix and convert to Uint8Array
|
|
24
|
+
const addressBytes = (0, _util.hexToU8a)(evmAddress.startsWith('0x') ? evmAddress : '0x' + evmAddress);
|
|
25
|
+
|
|
26
|
+
// Build the input buffer: "evm:" prefix + 20-byte EVM address
|
|
27
|
+
const combined = new Uint8Array(EVM_PREFIX.length + addressBytes.length);
|
|
28
|
+
combined.set(EVM_PREFIX);
|
|
29
|
+
combined.set(addressBytes, EVM_PREFIX.length);
|
|
30
|
+
|
|
31
|
+
// Hash using blake2b-256 to derive a Substrate AccountId
|
|
32
|
+
const hash = (0, _utilCrypto.blake2AsU8a)(combined);
|
|
33
|
+
|
|
34
|
+
// Encode the hash into an SS58 address with the given prefix
|
|
35
|
+
return (0, _utilCrypto.encodeAddress)(hash, ss58Prefix);
|
|
36
|
+
}
|