@subwallet/extension-base 1.3.7-0 → 1.3.9-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 -5
- package/background/KoniTypes.js +1 -1
- package/cjs/background/KoniTypes.js +1 -1
- package/cjs/core/logic-validation/transfer.js +35 -24
- package/cjs/core/substrate/system-pallet.js +1 -1
- package/cjs/core/substrate/xcm-parser.js +16 -2
- package/cjs/core/utils.js +2 -2
- package/cjs/koni/api/contract-handler/utils/index.js +15 -1
- package/cjs/koni/background/handlers/Extension.js +158 -86
- package/cjs/koni/background/handlers/State.js +11 -2
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/index.js +24 -2
- package/cjs/services/balance-service/transfer/smart-contract.js +16 -5
- package/cjs/services/balance-service/transfer/xcm/index.js +31 -1
- package/cjs/services/balance-service/transfer/xcm/polygonBridge.js +108 -0
- package/cjs/services/chain-online-service/constants.js +32 -0
- package/cjs/services/chain-online-service/index.js +190 -0
- package/cjs/services/chain-service/constants.js +3 -1
- package/cjs/services/chain-service/index.js +87 -127
- package/cjs/services/chain-service/utils/index.js +0 -2
- package/cjs/services/chain-service/utils/patch.js +7 -3
- package/cjs/services/fee-service/utils/index.js +14 -0
- package/cjs/services/inapp-notification-service/consts.js +6 -4
- package/cjs/services/inapp-notification-service/index.js +110 -6
- package/cjs/services/inapp-notification-service/interfaces.js +9 -1
- package/cjs/services/inapp-notification-service/utils/avail.js +88 -0
- package/cjs/services/inapp-notification-service/{utils.js → utils/common.js} +1 -84
- package/cjs/services/inapp-notification-service/utils/index.js +38 -0
- package/cjs/services/inapp-notification-service/utils/polygon.js +66 -0
- package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBridge.js +37 -0
- package/cjs/services/migration-service/scripts/index.js +3 -1
- package/cjs/services/setting-service/SettingService.js +8 -0
- package/cjs/services/setting-service/constants.js +2 -1
- package/cjs/services/storage-service/DatabaseService.js +3 -0
- package/cjs/services/transaction-service/index.js +1 -1
- package/cjs/stores/ChainlistStore.js +18 -0
- package/cjs/types/index.js +11 -0
- package/cjs/types/transaction/error.js +1 -0
- package/cjs/utils/account/transform.js +1 -1
- package/core/logic-validation/transfer.d.ts +2 -1
- package/core/logic-validation/transfer.js +36 -25
- package/core/substrate/system-pallet.js +1 -1
- package/core/substrate/xcm-parser.d.ts +1 -0
- package/core/substrate/xcm-parser.js +15 -2
- package/core/types.d.ts +1 -0
- package/core/utils.js +2 -2
- package/koni/api/contract-handler/utils/index.d.ts +2 -0
- package/koni/api/contract-handler/utils/index.js +12 -0
- package/koni/api/contract-handler/utils/polygon_bridge_abi.json +1004 -0
- package/koni/background/handlers/Extension.d.ts +4 -0
- package/koni/background/handlers/Extension.js +93 -22
- package/koni/background/handlers/State.d.ts +2 -0
- package/koni/background/handlers/State.js +11 -2
- package/package.json +56 -14
- package/packageInfo.js +1 -1
- package/services/balance-service/index.d.ts +3 -0
- package/services/balance-service/index.js +21 -2
- package/services/balance-service/transfer/smart-contract.js +16 -5
- package/services/balance-service/transfer/xcm/index.d.ts +1 -0
- package/services/balance-service/transfer/xcm/index.js +29 -1
- package/services/balance-service/transfer/xcm/polygonBridge.d.ts +22 -0
- package/services/balance-service/transfer/xcm/polygonBridge.js +95 -0
- package/services/chain-online-service/constants.d.ts +4 -0
- package/services/chain-online-service/constants.js +23 -0
- package/services/chain-online-service/index.d.ts +22 -0
- package/services/chain-online-service/index.js +182 -0
- package/services/chain-service/constants.d.ts +1 -0
- package/services/chain-service/constants.js +1 -0
- package/services/chain-service/index.d.ts +6 -7
- package/services/chain-service/index.js +78 -116
- package/services/chain-service/utils/index.js +0 -2
- package/services/chain-service/utils/patch.d.ts +16 -1
- package/services/chain-service/utils/patch.js +7 -3
- package/services/fee-service/utils/index.js +14 -0
- package/services/inapp-notification-service/consts.d.ts +3 -1
- package/services/inapp-notification-service/consts.js +6 -4
- package/services/inapp-notification-service/index.d.ts +10 -2
- package/services/inapp-notification-service/index.js +111 -7
- package/services/inapp-notification-service/interfaces.d.ts +27 -3
- package/services/inapp-notification-service/interfaces.js +7 -0
- package/services/inapp-notification-service/utils/avail.d.ts +40 -0
- package/services/inapp-notification-service/utils/avail.js +73 -0
- package/services/inapp-notification-service/utils/common.d.ts +11 -0
- package/services/inapp-notification-service/{utils.js → utils/common.js} +1 -72
- package/services/inapp-notification-service/utils/index.d.ts +3 -0
- package/services/inapp-notification-service/utils/index.js +6 -0
- package/services/inapp-notification-service/utils/polygon.d.ts +71 -0
- package/services/inapp-notification-service/utils/polygon.js +54 -0
- package/services/migration-service/scripts/MigrateTransactionHistoryBridge.d.ts +4 -0
- package/services/migration-service/scripts/MigrateTransactionHistoryBridge.js +29 -0
- package/services/migration-service/scripts/index.js +3 -1
- package/services/setting-service/SettingService.d.ts +4 -0
- package/services/setting-service/SettingService.js +8 -0
- package/services/setting-service/constants.js +2 -1
- package/services/storage-service/DatabaseService.d.ts +1 -0
- package/services/storage-service/DatabaseService.js +3 -0
- package/services/transaction-service/index.js +1 -1
- package/stores/ChainlistStore.d.ts +7 -0
- package/stores/ChainlistStore.js +10 -0
- package/types/{avail-bridge → bridge}/index.d.ts +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.js +1 -0
- package/types/notification/index.d.ts +5 -0
- package/types/transaction/error.d.ts +2 -1
- package/types/transaction/error.js +1 -0
- package/utils/account/transform.js +1 -1
- package/services/inapp-notification-service/utils.d.ts +0 -55
- /package/cjs/types/{avail-bridge → bridge}/index.js +0 -0
- /package/types/{avail-bridge → bridge}/index.js +0 -0
package/cjs/packageInfo.js
CHANGED
|
@@ -17,6 +17,7 @@ var _utils2 = require("@subwallet/extension-base/utils");
|
|
|
17
17
|
var _keyring = require("@subwallet/keyring");
|
|
18
18
|
var _types2 = require("@subwallet/keyring/types");
|
|
19
19
|
var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
|
|
20
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
20
21
|
var _i18next = require("i18next");
|
|
21
22
|
var _rxjs = require("rxjs");
|
|
22
23
|
var _util = require("@polkadot/util");
|
|
@@ -170,7 +171,10 @@ class BalanceService {
|
|
|
170
171
|
}
|
|
171
172
|
|
|
172
173
|
/** Subscribe token free balance of an address on chain */
|
|
173
|
-
async
|
|
174
|
+
async subscribeBalance(address, chain, tokenSlug) {
|
|
175
|
+
let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'transferable';
|
|
176
|
+
let extrinsicType = arguments.length > 4 ? arguments[4] : undefined;
|
|
177
|
+
let callback = arguments.length > 5 ? arguments[5] : undefined;
|
|
174
178
|
const chainInfo = this.state.chainService.getChainInfoByKey(chain);
|
|
175
179
|
const chainState = this.state.chainService.getChainStateByKey(chain);
|
|
176
180
|
if (!chainInfo || !chainState || !chainState.active) {
|
|
@@ -199,10 +203,18 @@ class BalanceService {
|
|
|
199
203
|
let unsub = _util.noop;
|
|
200
204
|
unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, result => {
|
|
201
205
|
const rs = result[0];
|
|
206
|
+
let value;
|
|
207
|
+
switch (balanceType) {
|
|
208
|
+
case 'total':
|
|
209
|
+
value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).toFixed();
|
|
210
|
+
break;
|
|
211
|
+
default:
|
|
212
|
+
value = rs.free;
|
|
213
|
+
}
|
|
202
214
|
if (rs.tokenSlug === tSlug && rs.state !== _KoniTypes.APIItemState.PENDING) {
|
|
203
215
|
hasError = false;
|
|
204
216
|
const balance = {
|
|
205
|
-
value
|
|
217
|
+
value,
|
|
206
218
|
decimals: tokenInfo.decimals || 0,
|
|
207
219
|
symbol: tokenInfo.symbol,
|
|
208
220
|
metadata: rs.metadata
|
|
@@ -226,6 +238,12 @@ class BalanceService {
|
|
|
226
238
|
}, 9999);
|
|
227
239
|
});
|
|
228
240
|
}
|
|
241
|
+
async subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType, callback) {
|
|
242
|
+
return this.subscribeBalance(address, chain, tokenSlug, 'transferable', extrinsicType, callback);
|
|
243
|
+
}
|
|
244
|
+
async subscribeTotalBalance(address, chain, tokenSlug, extrinsicType, callback) {
|
|
245
|
+
return this.subscribeBalance(address, chain, tokenSlug, 'total', extrinsicType, callback);
|
|
246
|
+
}
|
|
229
247
|
|
|
230
248
|
/**
|
|
231
249
|
* @public
|
|
@@ -242,6 +260,10 @@ class BalanceService {
|
|
|
242
260
|
const [, balance] = await this.subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType);
|
|
243
261
|
return balance;
|
|
244
262
|
}
|
|
263
|
+
async getTotalBalance(address, chain, tokenSlug, extrinsicType) {
|
|
264
|
+
const [, balance] = await this.subscribeTotalBalance(address, chain, tokenSlug, extrinsicType);
|
|
265
|
+
return balance;
|
|
266
|
+
}
|
|
245
267
|
|
|
246
268
|
/** Remove balance from the subject object by addresses */
|
|
247
269
|
removeBalanceByAddresses(addresses) {
|
|
@@ -15,6 +15,7 @@ var _utils2 = require("@subwallet/extension-base/koni/api/contract-handler/wasm/
|
|
|
15
15
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
16
16
|
var _utils3 = require("@subwallet/extension-base/services/fee-service/utils");
|
|
17
17
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
18
|
+
var _i18next = require("i18next");
|
|
18
19
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
19
20
|
// SPDX-License-Identifier: Apache-2.0
|
|
20
21
|
|
|
@@ -88,11 +89,21 @@ async function getERC721Transaction(web3Api, chain, contractAddress, senderAddre
|
|
|
88
89
|
var _priority$maxFeePerGa3, _priority$maxPriority3;
|
|
89
90
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
90
91
|
const contract = new web3Api.api.eth.Contract(_utils._ERC721_ABI, contractAddress);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
let gasLimit;
|
|
93
|
+
let priority;
|
|
94
|
+
try {
|
|
95
|
+
[gasLimit, priority] = await Promise.all([
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
97
|
+
contract.methods.safeTransferFrom(senderAddress, recipientAddress, tokenId).estimateGas({
|
|
98
|
+
from: senderAddress
|
|
99
|
+
}), (0, _utils3.calculateGasFeeParams)(web3Api, chain)]);
|
|
100
|
+
} catch (e) {
|
|
101
|
+
const error = e;
|
|
102
|
+
if (error.message.includes('transfer to non ERC721Receiver implementer')) {
|
|
103
|
+
error.message = (0, _i18next.t)('Unable to send. NFT not supported on recipient address');
|
|
104
|
+
}
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
96
107
|
return {
|
|
97
108
|
from: senderAddress,
|
|
98
109
|
gasPrice: priority.gasPrice,
|
|
@@ -4,10 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.getXcmMockTxFee = exports.createXcmExtrinsic = exports.createSnowBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = void 0;
|
|
7
|
+
exports.getXcmMockTxFee = exports.createXcmExtrinsic = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = void 0;
|
|
8
8
|
var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
|
|
9
9
|
var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
|
|
10
10
|
var _polkadotXcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polkadotXcm");
|
|
11
|
+
var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
|
|
11
12
|
var _snowBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/snowBridge");
|
|
12
13
|
var _xcmPallet = require("@subwallet/extension-base/services/balance-service/transfer/xcm/xcmPallet");
|
|
13
14
|
var _xTokens = require("@subwallet/extension-base/services/balance-service/transfer/xcm/xTokens");
|
|
@@ -100,6 +101,35 @@ const createAvailBridgeExtrinsicFromAvail = async _ref4 => {
|
|
|
100
101
|
return await (0, _availBridge.getAvailBridgeExtrinsicFromAvail)(recipient, sendingValue, substrateApi);
|
|
101
102
|
};
|
|
102
103
|
exports.createAvailBridgeExtrinsicFromAvail = createAvailBridgeExtrinsicFromAvail;
|
|
104
|
+
const createPolygonBridgeExtrinsic = async _ref5 => {
|
|
105
|
+
let {
|
|
106
|
+
chainInfoMap,
|
|
107
|
+
destinationTokenInfo,
|
|
108
|
+
evmApi,
|
|
109
|
+
originTokenInfo,
|
|
110
|
+
recipient,
|
|
111
|
+
sender,
|
|
112
|
+
sendingValue
|
|
113
|
+
} = _ref5;
|
|
114
|
+
const originChainInfo = chainInfoMap[originTokenInfo.originChain];
|
|
115
|
+
const destinationChainInfo = chainInfoMap[destinationTokenInfo.originChain];
|
|
116
|
+
if (!(0, _xcmParser._isPolygonBridgeXcm)(originChainInfo, destinationChainInfo)) {
|
|
117
|
+
throw new Error('This is not a valid PolygonBridge transfer');
|
|
118
|
+
}
|
|
119
|
+
if (!evmApi) {
|
|
120
|
+
throw Error('Evm API is not available');
|
|
121
|
+
}
|
|
122
|
+
if (!sender) {
|
|
123
|
+
throw Error('Sender is required');
|
|
124
|
+
}
|
|
125
|
+
const sourceChain = originChainInfo.slug;
|
|
126
|
+
if (sourceChain === 'polygonzkEvm_cardona' || sourceChain === 'polygonZkEvm') {
|
|
127
|
+
return (0, _polygonBridge._createPolygonBridgeL2toL1Extrinsic)(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi);
|
|
128
|
+
} else {
|
|
129
|
+
return (0, _polygonBridge._createPolygonBridgeL1toL2Extrinsic)(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
exports.createPolygonBridgeExtrinsic = createPolygonBridgeExtrinsic;
|
|
103
133
|
const getXcmMockTxFee = async (substrateApi, chainInfoMap, originTokenInfo, destinationTokenInfo) => {
|
|
104
134
|
try {
|
|
105
135
|
var _paymentInfo$partialF;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.POLYGON_PROOF_INDEXER = exports.POLYGON_GAS_INDEXER = void 0;
|
|
7
|
+
exports._createPolygonBridgeL1toL2Extrinsic = _createPolygonBridgeL1toL2Extrinsic;
|
|
8
|
+
exports._createPolygonBridgeL2toL1Extrinsic = _createPolygonBridgeL2toL1Extrinsic;
|
|
9
|
+
exports._isPolygonChainBridge = _isPolygonChainBridge;
|
|
10
|
+
exports.getClaimPolygonBridge = getClaimPolygonBridge;
|
|
11
|
+
exports.isClaimedPolygonBridge = isClaimedPolygonBridge;
|
|
12
|
+
var _chainList = require("@subwallet/chain-list");
|
|
13
|
+
var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
|
|
14
|
+
var _utils = require("@subwallet/extension-base/koni/api/contract-handler/utils");
|
|
15
|
+
var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
|
|
16
|
+
var _utils3 = require("@subwallet/extension-base/services/fee-service/utils");
|
|
17
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
18
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
19
|
+
|
|
20
|
+
const POLYGON_PROOF_INDEXER = {
|
|
21
|
+
MAINNET: 'https://api-gateway.polygon.technology/api/v3/proof/mainnet/merkle-proof',
|
|
22
|
+
TESTNET: 'https://api-gateway.polygon.technology/api/v3/proof/testnet/merkle-proof'
|
|
23
|
+
};
|
|
24
|
+
exports.POLYGON_PROOF_INDEXER = POLYGON_PROOF_INDEXER;
|
|
25
|
+
const POLYGON_GAS_INDEXER = {
|
|
26
|
+
MAINNET: 'https://gasstation.polygon.technology/zkevm',
|
|
27
|
+
TESTNET: 'https://gasstation.polygon.technology/zkevm/cardona'
|
|
28
|
+
};
|
|
29
|
+
exports.POLYGON_GAS_INDEXER = POLYGON_GAS_INDEXER;
|
|
30
|
+
async function createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, destinationNetwork, evmApi) {
|
|
31
|
+
var _priority$maxFeePerGa, _priority$maxPriority;
|
|
32
|
+
const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(originChainInfo.slug);
|
|
33
|
+
const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
|
|
34
|
+
const tokenContract = (0, _utils2._getContractAddressOfToken)(tokenInfo) || '0x0000000000000000000000000000000000000000'; // FOR Ethereum: use null address
|
|
35
|
+
|
|
36
|
+
if (tokenContract !== '0x0000000000000000000000000000000000000000') {
|
|
37
|
+
throw new Error('Only native token transfer is supported');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
|
|
41
|
+
const transferCall = polygonBridgeContract.methods.bridgeAsset(destinationNetwork, recipientAddress, value, tokenContract, true, '0x');
|
|
42
|
+
const transferEncodedCall = transferCall.encodeABI();
|
|
43
|
+
const priority = await (0, _utils3.calculateGasFeeParams)(evmApi, evmApi.chainSlug);
|
|
44
|
+
const transactionConfig = {
|
|
45
|
+
from: sender,
|
|
46
|
+
to: polygonBridgeContractAddress,
|
|
47
|
+
value: value,
|
|
48
|
+
data: transferEncodedCall,
|
|
49
|
+
gasPrice: priority.gasPrice,
|
|
50
|
+
maxFeePerGas: priority === null || priority === void 0 ? void 0 : (_priority$maxFeePerGa = priority.maxFeePerGas) === null || _priority$maxFeePerGa === void 0 ? void 0 : _priority$maxFeePerGa.toString(),
|
|
51
|
+
maxPriorityFeePerGas: priority === null || priority === void 0 ? void 0 : (_priority$maxPriority = priority.maxPriorityFeePerGas) === null || _priority$maxPriority === void 0 ? void 0 : _priority$maxPriority.toString()
|
|
52
|
+
};
|
|
53
|
+
const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000);
|
|
54
|
+
transactionConfig.gas = gasLimit.toString();
|
|
55
|
+
return transactionConfig;
|
|
56
|
+
}
|
|
57
|
+
async function _createPolygonBridgeL1toL2Extrinsic(tokenInfo, originChainInfo, sender, recipientAddress, value, evmApi) {
|
|
58
|
+
return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 1, evmApi);
|
|
59
|
+
}
|
|
60
|
+
async function _createPolygonBridgeL2toL1Extrinsic(tokenInfo, originChainInfo, sender, recipientAddress, value, evmApi) {
|
|
61
|
+
return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 0, evmApi);
|
|
62
|
+
}
|
|
63
|
+
async function getClaimPolygonBridge(chainSlug, notification, evmApi) {
|
|
64
|
+
var _priority$maxFeePerGa2, _priority$maxPriority2;
|
|
65
|
+
const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(chainSlug);
|
|
66
|
+
const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
|
|
67
|
+
const metadata = notification.metadata;
|
|
68
|
+
const isTestnet = chainSlug === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA;
|
|
69
|
+
const proofDomain = isTestnet ? POLYGON_PROOF_INDEXER.TESTNET : POLYGON_PROOF_INDEXER.MAINNET;
|
|
70
|
+
const proofResponse = await fetch(`${proofDomain}?networkId=${metadata.sourceNetwork}&depositCount=${metadata.counter}`).then(res => res.json());
|
|
71
|
+
const proof = proofResponse.proof;
|
|
72
|
+
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
|
|
74
|
+
const transferCall = polygonBridgeContract.methods.claimAsset(proof.merkle_proof, proof.rollup_merkle_proof, metadata.counter, proof.main_exit_root, proof.rollup_exit_root, metadata.originTokenNetwork, metadata.originTokenAddress, metadata.destinationNetwork, metadata.receiver, metadata.amounts[0], '0x');
|
|
75
|
+
const transferEncodedCall = transferCall.encodeABI();
|
|
76
|
+
const priority = await (0, _utils3.calculateGasFeeParams)(evmApi, evmApi.chainSlug);
|
|
77
|
+
const transactionConfig = {
|
|
78
|
+
from: metadata.userAddress,
|
|
79
|
+
to: polygonBridgeContractAddress,
|
|
80
|
+
value: '0',
|
|
81
|
+
data: transferEncodedCall,
|
|
82
|
+
gasPrice: priority.gasPrice,
|
|
83
|
+
maxFeePerGas: (_priority$maxFeePerGa2 = priority.maxFeePerGas) === null || _priority$maxFeePerGa2 === void 0 ? void 0 : _priority$maxFeePerGa2.toString(),
|
|
84
|
+
maxPriorityFeePerGas: (_priority$maxPriority2 = priority.maxPriorityFeePerGas) === null || _priority$maxPriority2 === void 0 ? void 0 : _priority$maxPriority2.toString()
|
|
85
|
+
};
|
|
86
|
+
const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000);
|
|
87
|
+
transactionConfig.gas = gasLimit.toString();
|
|
88
|
+
return transactionConfig;
|
|
89
|
+
}
|
|
90
|
+
async function isClaimedPolygonBridge(chainSlug, counter, sourceNetwork, evmApi) {
|
|
91
|
+
const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(chainSlug);
|
|
92
|
+
const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
|
|
93
|
+
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-member-access
|
|
95
|
+
return await polygonBridgeContract.methods.isClaimed(counter, sourceNetwork).call();
|
|
96
|
+
}
|
|
97
|
+
function _isPolygonChainBridge(srcChain, destChain) {
|
|
98
|
+
if (srcChain === 'polygonzkEvm_cardona' && destChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) {
|
|
99
|
+
return true;
|
|
100
|
+
} else if (srcChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA && destChain === 'polygonzkEvm_cardona') {
|
|
101
|
+
return true;
|
|
102
|
+
} else if (srcChain === 'polygonZkEvm' && destChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM) {
|
|
103
|
+
return true;
|
|
104
|
+
} else if (srcChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM && destChain === 'polygonZkEvm') {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.LATEST_CHAIN_PATCH_FETCHING_INTERVAL = void 0;
|
|
7
|
+
exports.md5HashChainAsset = md5HashChainAsset;
|
|
8
|
+
exports.md5HashChainInfo = md5HashChainInfo;
|
|
9
|
+
var _tsMd = require("ts-md5");
|
|
10
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
11
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
12
|
+
|
|
13
|
+
const LATEST_CHAIN_PATCH_FETCHING_INTERVAL = 180000;
|
|
14
|
+
exports.LATEST_CHAIN_PATCH_FETCHING_INTERVAL = LATEST_CHAIN_PATCH_FETCHING_INTERVAL;
|
|
15
|
+
function md5HashChainInfo(data) {
|
|
16
|
+
// todo: use from chain list package later
|
|
17
|
+
const {
|
|
18
|
+
chainStatus,
|
|
19
|
+
icon,
|
|
20
|
+
providers,
|
|
21
|
+
...chainBaseInfo
|
|
22
|
+
} = data;
|
|
23
|
+
return _tsMd.Md5.hashStr(JSON.stringify(chainBaseInfo));
|
|
24
|
+
}
|
|
25
|
+
function md5HashChainAsset(data) {
|
|
26
|
+
// todo: use from chain list package later
|
|
27
|
+
const {
|
|
28
|
+
icon,
|
|
29
|
+
...assetBaseInfo
|
|
30
|
+
} = data;
|
|
31
|
+
return _tsMd.Md5.hashStr(JSON.stringify(assetBaseInfo));
|
|
32
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ChainOnlineService = void 0;
|
|
7
|
+
var _chainList = require("@subwallet/chain-list");
|
|
8
|
+
var _constants = require("@subwallet/extension-base/services/chain-online-service/constants");
|
|
9
|
+
var _chainService = require("@subwallet/extension-base/services/chain-service");
|
|
10
|
+
var _types = require("@subwallet/extension-base/services/chain-service/types");
|
|
11
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
12
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
13
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
14
|
+
|
|
15
|
+
class ChainOnlineService {
|
|
16
|
+
constructor(chainService, settingService, eventService, dbService) {
|
|
17
|
+
this.chainService = chainService;
|
|
18
|
+
this.settingService = settingService;
|
|
19
|
+
this.eventService = eventService;
|
|
20
|
+
this.dbService = dbService;
|
|
21
|
+
this.firstApplied = false;
|
|
22
|
+
}
|
|
23
|
+
validatePatchWithHash(latestPatch) {
|
|
24
|
+
const {
|
|
25
|
+
ChainAsset,
|
|
26
|
+
ChainAssetHashMap,
|
|
27
|
+
ChainInfo,
|
|
28
|
+
ChainInfoHashMap
|
|
29
|
+
} = latestPatch;
|
|
30
|
+
for (const [chainSlug, chain] of Object.entries(ChainInfo)) {
|
|
31
|
+
if ((0, _constants.md5HashChainInfo)(chain) !== ChainInfoHashMap[chainSlug]) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (const [assetSlug, asset] of Object.entries(ChainAsset)) {
|
|
36
|
+
if ((0, _constants.md5HashChainAsset)(asset) !== ChainAssetHashMap[assetSlug]) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
validatePatchBeforeStore(candidateChainInfoMap, candidateAssetRegistry, latestPatch) {
|
|
43
|
+
for (const [chainSlug, chainHash] of Object.entries(latestPatch.ChainInfoHashMap)) {
|
|
44
|
+
if ((0, _constants.md5HashChainInfo)(candidateChainInfoMap[chainSlug]) !== chainHash) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
for (const [assetSlug, assetHash] of Object.entries(latestPatch.ChainAssetHashMap)) {
|
|
49
|
+
if (!candidateAssetRegistry[assetSlug]) {
|
|
50
|
+
if (!latestPatch.ChainInfo[assetSlug]) {
|
|
51
|
+
// assets are not existed in case chain is removed
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if ((0, _constants.md5HashChainAsset)(candidateAssetRegistry[assetSlug]) !== assetHash) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
async handleLatestPatch(latestPatch) {
|
|
63
|
+
try {
|
|
64
|
+
var _await$this$settingSe;
|
|
65
|
+
// 1. validate fetch data with its hash
|
|
66
|
+
const isSafePatch = this.validatePatchWithHash(latestPatch);
|
|
67
|
+
const {
|
|
68
|
+
AssetLogoMap: latestAssetLogoMap,
|
|
69
|
+
ChainAsset: latestAssetInfo,
|
|
70
|
+
ChainInfo: latestChainInfo,
|
|
71
|
+
ChainLogoMap: latestChainLogoMap,
|
|
72
|
+
patchVersion: latestPatchVersion
|
|
73
|
+
} = latestPatch;
|
|
74
|
+
const currentPatchVersion = ((_await$this$settingSe = await this.settingService.getChainlistSetting()) === null || _await$this$settingSe === void 0 ? void 0 : _await$this$settingSe.patchVersion) || '';
|
|
75
|
+
const oldChainInfoMap = structuredClone(this.chainService.getChainInfoMap());
|
|
76
|
+
const oldAssetRegistry = structuredClone(this.chainService.getAssetRegistry());
|
|
77
|
+
let chainInfoMap = structuredClone(this.chainService.getChainInfoMap());
|
|
78
|
+
let assetRegistry = structuredClone(this.chainService.getAssetRegistry());
|
|
79
|
+
const currentChainStateMap = structuredClone(this.chainService.getChainStateMap());
|
|
80
|
+
const currentChainStatusMap = structuredClone(this.chainService.getChainStatusMap());
|
|
81
|
+
let addedChain = [];
|
|
82
|
+
if (isSafePatch && (!this.firstApplied || currentPatchVersion !== latestPatchVersion)) {
|
|
83
|
+
this.firstApplied = true;
|
|
84
|
+
|
|
85
|
+
// 2. merge data map
|
|
86
|
+
if (latestChainInfo && Object.keys(latestChainInfo).length > 0) {
|
|
87
|
+
chainInfoMap = Object.assign({}, oldChainInfoMap, latestChainInfo);
|
|
88
|
+
const [currentChainStateKey, newChainKey] = [Object.keys(currentChainStateMap), Object.keys(chainInfoMap)];
|
|
89
|
+
addedChain = newChainKey.filter(chain => !currentChainStateKey.includes(chain));
|
|
90
|
+
addedChain.forEach(key => {
|
|
91
|
+
currentChainStateMap[key] = {
|
|
92
|
+
active: false,
|
|
93
|
+
currentProvider: (0, _utils.randomizeProvider)(chainInfoMap[key].providers).providerKey,
|
|
94
|
+
manualTurnOff: false,
|
|
95
|
+
slug: key
|
|
96
|
+
};
|
|
97
|
+
currentChainStatusMap[key] = {
|
|
98
|
+
slug: key,
|
|
99
|
+
connectionStatus: _types._ChainConnectionStatus.DISCONNECTED,
|
|
100
|
+
lastUpdated: Date.now()
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (latestAssetInfo && Object.keys(latestAssetInfo).length > 0) {
|
|
105
|
+
assetRegistry = (0, _chainService.filterAssetInfoMap)(oldChainInfoMap, Object.assign({}, oldAssetRegistry, latestAssetInfo), addedChain);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// 3. validate data before write
|
|
109
|
+
const isCorrectPatch = this.validatePatchBeforeStore(chainInfoMap, assetRegistry, latestPatch);
|
|
110
|
+
|
|
111
|
+
// 4. write to subject
|
|
112
|
+
if (isCorrectPatch) {
|
|
113
|
+
this.chainService.setChainInfoMap(chainInfoMap);
|
|
114
|
+
this.chainService.subscribeChainInfoMap().next(chainInfoMap);
|
|
115
|
+
this.chainService.setAssetRegistry(assetRegistry);
|
|
116
|
+
this.chainService.subscribeAssetRegistry().next(assetRegistry);
|
|
117
|
+
this.chainService.autoEnableTokens().then(() => {
|
|
118
|
+
this.eventService.emit('asset.updateState', '');
|
|
119
|
+
}).catch(console.error);
|
|
120
|
+
this.chainService.setChainStateMap(currentChainStateMap);
|
|
121
|
+
this.chainService.subscribeChainStateMap().next(currentChainStateMap);
|
|
122
|
+
this.chainService.subscribeChainStatusMap().next(currentChainStatusMap);
|
|
123
|
+
const storedChainInfoList = Object.keys(chainInfoMap).map(chainSlug => {
|
|
124
|
+
return {
|
|
125
|
+
...chainInfoMap[chainSlug],
|
|
126
|
+
...currentChainStateMap[chainSlug]
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
await this.dbService.bulkUpdateChainStore(storedChainInfoList);
|
|
130
|
+
const addedAssets = [];
|
|
131
|
+
|
|
132
|
+
// todo: the stored asset is lack of adding new assets and edited assets of old chain, update to tracking exactly updated assets from patch online.
|
|
133
|
+
Object.entries(assetRegistry).forEach(_ref => {
|
|
134
|
+
let [slug, asset] = _ref;
|
|
135
|
+
if (addedChain.includes(asset.originChain)) {
|
|
136
|
+
addedAssets.push(asset);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
await this.dbService.bulkUpdateAssetsStore(addedAssets);
|
|
140
|
+
if (latestChainLogoMap) {
|
|
141
|
+
const logoMap = Object.assign({}, _chainList.ChainLogoMap, latestChainLogoMap);
|
|
142
|
+
this.chainService.subscribeChainLogoMap().next(logoMap);
|
|
143
|
+
}
|
|
144
|
+
if (latestAssetLogoMap) {
|
|
145
|
+
const logoMap = Object.assign({}, _chainList.AssetLogoMap, latestAssetLogoMap);
|
|
146
|
+
this.chainService.subscribeAssetLogoMap().next(logoMap);
|
|
147
|
+
}
|
|
148
|
+
this.settingService.setChainlist({
|
|
149
|
+
patchVersion: latestPatchVersion
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
} catch (e) {
|
|
154
|
+
console.error('Error fetching latest patch data');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async fetchLatestPatchData() {
|
|
158
|
+
return await (0, _utils.fetchPatchData)();
|
|
159
|
+
}
|
|
160
|
+
handleLatestPatchData() {
|
|
161
|
+
this.fetchLatestPatchData().then(latestPatch => {
|
|
162
|
+
return new Promise(resolve => {
|
|
163
|
+
if (latestPatch && !this.chainService.getlockChainInfoMap()) {
|
|
164
|
+
this.eventService.waitAssetReady.then(() => {
|
|
165
|
+
this.chainService.setLockChainInfoMap(true);
|
|
166
|
+
this.handleLatestPatch(latestPatch).then(() => this.chainService.setLockChainInfoMap(false)).catch(e => {
|
|
167
|
+
this.chainService.setLockChainInfoMap(false);
|
|
168
|
+
console.error('Error update latest patch', e);
|
|
169
|
+
}).finally(resolve);
|
|
170
|
+
}).catch(e => {
|
|
171
|
+
console.error('Asset fail to ready', e);
|
|
172
|
+
resolve();
|
|
173
|
+
});
|
|
174
|
+
} else {
|
|
175
|
+
resolve();
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}).catch(e => {
|
|
179
|
+
console.error('Error get latest patch or data map is locking', e);
|
|
180
|
+
}).finally(() => {
|
|
181
|
+
this.eventService.emit('asset.online.ready', true);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
checkLatestData() {
|
|
185
|
+
clearInterval(this.refreshLatestChainDataTimeOut);
|
|
186
|
+
this.handleLatestPatchData();
|
|
187
|
+
this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestPatchData.bind(this), _constants.LATEST_CHAIN_PATCH_FETCHING_INTERVAL);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.ChainOnlineService = ChainOnlineService;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
|
|
6
|
+
exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.SUFFICIENT_CHAIN = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
|
|
7
7
|
var _chainList = require("@subwallet/chain-list");
|
|
8
8
|
var _types = require("@subwallet/chain-list/types");
|
|
9
9
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
@@ -292,6 +292,8 @@ const _XCM_CHAIN_GROUP = {
|
|
|
292
292
|
// default is xTokens pallet
|
|
293
293
|
};
|
|
294
294
|
exports._XCM_CHAIN_GROUP = _XCM_CHAIN_GROUP;
|
|
295
|
+
const SUFFICIENT_CHAIN = ['astar', 'calamari', 'parallel', 'darwinia2', 'crabParachain', 'pangolin', 'statemint', 'moonriver', 'shiden', 'moonbeam', 'statemine', 'liberland', 'dentnet', 'phala', 'crust', 'dbcchain', 'rococo_assethub'];
|
|
296
|
+
exports.SUFFICIENT_CHAIN = SUFFICIENT_CHAIN;
|
|
295
297
|
const _XCM_TYPE = {
|
|
296
298
|
RP: `${_types._SubstrateChainType.RELAYCHAIN}-${_types._SubstrateChainType.PARACHAIN}`,
|
|
297
299
|
// DMP
|