@subwallet/extension-base 1.0.7-2 → 1.0.8-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 +3 -1
- package/background/KoniTypes.js +1 -0
- package/background/errors/TransactionError.js +5 -1
- package/cjs/background/KoniTypes.js +1 -0
- package/cjs/background/errors/TransactionError.js +4 -0
- package/cjs/constants/index.js +6 -3
- package/cjs/koni/api/dotsama/balance.js +2 -1
- package/cjs/koni/api/dotsama/crowdloan.js +1 -1
- package/cjs/koni/api/dotsama/transfer.js +2 -2
- package/cjs/koni/api/xcm/polkadotXcm.js +18 -37
- package/cjs/koni/api/xcm/utils.js +78 -11
- package/cjs/koni/api/xcm/xTokens.js +4 -33
- package/cjs/koni/api/xcm/xcmPallet.js +4 -36
- package/cjs/koni/background/handlers/Extension.js +83 -25
- package/cjs/koni/background/handlers/State.js +1 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/constants.js +5 -5
- package/cjs/services/chain-service/index.js +19 -15
- package/cjs/services/chain-service/utils.js +1 -5
- package/cjs/services/transaction-service/helpers/index.js +45 -2
- package/cjs/services/transaction-service/index.js +58 -24
- package/cjs/utils/number.js +112 -0
- package/constants/index.d.ts +1 -0
- package/constants/index.js +1 -0
- package/koni/api/dotsama/balance.js +2 -1
- package/koni/api/dotsama/crowdloan.js +2 -2
- package/koni/api/dotsama/transfer.js +2 -2
- package/koni/api/xcm/polkadotXcm.js +20 -39
- package/koni/api/xcm/utils.d.ts +36 -3
- package/koni/api/xcm/utils.js +72 -11
- package/koni/api/xcm/xTokens.js +6 -35
- package/koni/api/xcm/xcmPallet.js +5 -35
- package/koni/background/handlers/Extension.js +82 -24
- package/koni/background/handlers/State.js +2 -2
- package/package.json +13 -8
- package/packageInfo.js +1 -1
- package/services/chain-service/constants.js +5 -5
- package/services/chain-service/index.js +13 -8
- package/services/chain-service/utils.d.ts +0 -1
- package/services/chain-service/utils.js +1 -4
- package/services/transaction-service/helpers/index.d.ts +2 -0
- package/services/transaction-service/helpers/index.js +42 -0
- package/services/transaction-service/index.js +54 -20
- package/services/transaction-service/types.d.ts +2 -2
- package/utils/number.d.ts +9 -0
- package/utils/number.js +100 -0
|
@@ -35,8 +35,8 @@ const _BALANCE_CHAIN_GROUP = {
|
|
|
35
35
|
kintsugi: ['kintsugi', 'interlay', 'kintsugi_test'],
|
|
36
36
|
genshiro: ['genshiro_testnet', 'genshiro'],
|
|
37
37
|
equilibrium_parachain: ['equilibrium_parachain'],
|
|
38
|
-
bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry'],
|
|
39
|
-
statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2'],
|
|
38
|
+
bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main'],
|
|
39
|
+
statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel'],
|
|
40
40
|
kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'] // perhaps there are some runtime updates
|
|
41
41
|
};
|
|
42
42
|
exports._BALANCE_CHAIN_GROUP = _BALANCE_CHAIN_GROUP;
|
|
@@ -192,11 +192,11 @@ const _TRANSFER_NOT_SUPPORTED_CHAINS = ['subspace_gemini_3a', 'kulupu', 'joystre
|
|
|
192
192
|
exports._TRANSFER_NOT_SUPPORTED_CHAINS = _TRANSFER_NOT_SUPPORTED_CHAINS;
|
|
193
193
|
const _TRANSFER_CHAIN_GROUP = {
|
|
194
194
|
acala: ['karura', 'acala', 'acala_testnet'],
|
|
195
|
-
kintsugi: ['kintsugi', 'kintsugi_test', 'interlay'],
|
|
195
|
+
kintsugi: ['kintsugi', 'kintsugi_test', 'interlay', 'bifrost_dot', 'hydradx_main'],
|
|
196
196
|
genshiro: ['genshiro_testnet', 'genshiro', 'equilibrium_parachain'],
|
|
197
197
|
crab: ['crab', 'pangolin'],
|
|
198
198
|
bitcountry: ['pioneer', 'bitcountry'],
|
|
199
|
-
statemine: ['statemint', 'statemine', 'darwinia2']
|
|
199
|
+
statemine: ['statemint', 'statemine', 'darwinia2', 'astar', 'parallel']
|
|
200
200
|
};
|
|
201
201
|
exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
|
|
202
202
|
const _BALANCE_PARSING_CHAIN_GROUP = {
|
|
@@ -206,7 +206,7 @@ const _BALANCE_PARSING_CHAIN_GROUP = {
|
|
|
206
206
|
// XCM------------------------------------------------------------------------------------------------------------------
|
|
207
207
|
exports._BALANCE_PARSING_CHAIN_GROUP = _BALANCE_PARSING_CHAIN_GROUP;
|
|
208
208
|
const _XCM_CHAIN_GROUP = {
|
|
209
|
-
polkadotXcm: ['astar', 'shiden', 'statemine', 'statemint'],
|
|
209
|
+
polkadotXcm: ['astar', 'shiden', 'statemine', 'statemint', 'equilibrium_parachain'],
|
|
210
210
|
xcmPallet: ['polkadot', 'kusama']
|
|
211
211
|
// default is xTokens pallet
|
|
212
212
|
};
|
|
@@ -47,22 +47,25 @@ class ChainService {
|
|
|
47
47
|
this.chainInfoMapSubject.next(this.dataMap.chainInfoMap);
|
|
48
48
|
this.chainStateMapSubject.next(this.dataMap.chainStateMap);
|
|
49
49
|
this.assetRegistrySubject.next(this.dataMap.assetRegistry);
|
|
50
|
-
this.xcmRefMapSubject.next(this.
|
|
50
|
+
this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
|
|
51
51
|
this.logger = (0, _logger.logger)('chain-service');
|
|
52
52
|
this.refreshChainStateInterval(3000, 6);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
// Getter
|
|
56
56
|
getXcmRefMap() {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
57
|
+
return this.dataMap.assetRefMap;
|
|
58
|
+
// const result: Record<string, _AssetRef> = {};
|
|
59
|
+
//
|
|
60
|
+
// Object.entries(AssetRefMap).forEach(([key, assetRef]) => {
|
|
61
|
+
// if (assetRef.path === _AssetRefPath.XCM) {
|
|
62
|
+
// result[key] = assetRef;
|
|
63
|
+
// }
|
|
64
|
+
// });
|
|
65
|
+
//
|
|
66
|
+
// return result;
|
|
65
67
|
}
|
|
68
|
+
|
|
66
69
|
getEvmApi(slug) {
|
|
67
70
|
return this.evmChainHandler.getEvmApiByChain(slug);
|
|
68
71
|
}
|
|
@@ -365,13 +368,14 @@ class ChainService {
|
|
|
365
368
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
366
369
|
this.chainStateMapSubject.next(this.getChainStateMap());
|
|
367
370
|
this.assetRegistrySubject.next(this.getAssetRegistry());
|
|
371
|
+
this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
|
|
368
372
|
this.initApis();
|
|
369
373
|
await this.initAssetSettings();
|
|
370
374
|
}
|
|
371
375
|
initApis() {
|
|
372
376
|
// TODO: this might be async
|
|
373
|
-
Object.entries(this.getChainInfoMap()).forEach(
|
|
374
|
-
let [slug, chainInfo] =
|
|
377
|
+
Object.entries(this.getChainInfoMap()).forEach(_ref => {
|
|
378
|
+
let [slug, chainInfo] = _ref;
|
|
375
379
|
if (this.getChainStateByKey(slug).active) {
|
|
376
380
|
this.initApiForChain(chainInfo);
|
|
377
381
|
}
|
|
@@ -617,8 +621,8 @@ class ChainService {
|
|
|
617
621
|
}
|
|
618
622
|
|
|
619
623
|
// Fill in the missing chainState and storageData (new chains never before seen)
|
|
620
|
-
Object.entries(mergedChainInfoMap).forEach(
|
|
621
|
-
let [slug, chainInfo] =
|
|
624
|
+
Object.entries(mergedChainInfoMap).forEach(_ref2 => {
|
|
625
|
+
let [slug, chainInfo] = _ref2;
|
|
622
626
|
if (!(slug in this.dataMap.chainStateMap)) {
|
|
623
627
|
this.dataMap.chainStateMap[slug] = {
|
|
624
628
|
currentProvider: Object.keys(chainInfo.providers)[0],
|
|
@@ -1136,8 +1140,8 @@ class ChainService {
|
|
|
1136
1140
|
update = true;
|
|
1137
1141
|
}
|
|
1138
1142
|
}
|
|
1139
|
-
const promiseList = Object.entries(chainStateMap).map(async
|
|
1140
|
-
let [chain, chainState] =
|
|
1143
|
+
const promiseList = Object.entries(chainStateMap).map(async _ref3 => {
|
|
1144
|
+
let [chain, chainState] = _ref3;
|
|
1141
1145
|
try {
|
|
1142
1146
|
if (chainState.active) {
|
|
1143
1147
|
if (substrateApiMap[chain]) {
|
|
@@ -58,7 +58,6 @@ exports._isPureSubstrateChain = _isPureSubstrateChain;
|
|
|
58
58
|
exports._isSmartContractToken = _isSmartContractToken;
|
|
59
59
|
exports._isSubstrateChain = _isSubstrateChain;
|
|
60
60
|
exports._isSubstrateParaChain = _isSubstrateParaChain;
|
|
61
|
-
exports._isSubstrateParachain = _isSubstrateParachain;
|
|
62
61
|
exports._isSubstrateRelayChain = _isSubstrateRelayChain;
|
|
63
62
|
exports._isTokenEvmSmartContract = _isTokenEvmSmartContract;
|
|
64
63
|
exports._isTokenTransferredByEvm = _isTokenTransferredByEvm;
|
|
@@ -198,9 +197,6 @@ function _isChainSupportSubstrateStaking(chainInfo) {
|
|
|
198
197
|
function _isChainEnabled(chainState) {
|
|
199
198
|
return chainState.active;
|
|
200
199
|
}
|
|
201
|
-
function _isSubstrateParachain(chainInfo) {
|
|
202
|
-
return chainInfo.substrateInfo !== null && chainInfo.substrateInfo.paraId !== null;
|
|
203
|
-
}
|
|
204
200
|
function _getChainSubstrateAddressPrefix(chainInfo) {
|
|
205
201
|
var _chainInfo$substrateI5, _chainInfo$substrateI6;
|
|
206
202
|
return (_chainInfo$substrateI5 = chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI6 = chainInfo.substrateInfo) === null || _chainInfo$substrateI6 === void 0 ? void 0 : _chainInfo$substrateI6.addressPrefix) !== null && _chainInfo$substrateI5 !== void 0 ? _chainInfo$substrateI5 : -1;
|
|
@@ -327,7 +323,7 @@ function _isSubstrateRelayChain(chainInfo) {
|
|
|
327
323
|
}
|
|
328
324
|
function _isSubstrateParaChain(chainInfo) {
|
|
329
325
|
var _chainInfo$substrateI11;
|
|
330
|
-
return ((_chainInfo$substrateI11 = chainInfo.substrateInfo) === null || _chainInfo$substrateI11 === void 0 ? void 0 : _chainInfo$substrateI11.chainType) === _types._SubstrateChainType.PARACHAIN;
|
|
326
|
+
return chainInfo.substrateInfo !== null && chainInfo.substrateInfo.paraId !== null && ((_chainInfo$substrateI11 = chainInfo.substrateInfo) === null || _chainInfo$substrateI11 === void 0 ? void 0 : _chainInfo$substrateI11.chainType) === _types._SubstrateChainType.PARACHAIN;
|
|
331
327
|
}
|
|
332
328
|
function _getEvmAbiExplorer(chainInfo) {
|
|
333
329
|
var _chainInfo$evmInfo3;
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isSubstrateTransaction = exports.getValidationId = exports.getTransactionId = void 0;
|
|
6
|
+
exports.isSubstrateTransaction = exports.getValidationId = exports.getTransactionId = exports.getBaseTransactionInfo = void 0;
|
|
7
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
7
8
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
8
9
|
// SPDX-License-Identifier: Apache-2.0
|
|
9
10
|
|
|
@@ -20,4 +21,46 @@ exports.getValidationId = getValidationId;
|
|
|
20
21
|
const isSubstrateTransaction = tx => {
|
|
21
22
|
return !!tx.send;
|
|
22
23
|
};
|
|
23
|
-
exports.isSubstrateTransaction = isSubstrateTransaction;
|
|
24
|
+
exports.isSubstrateTransaction = isSubstrateTransaction;
|
|
25
|
+
const typeName = type => {
|
|
26
|
+
switch (type) {
|
|
27
|
+
case _KoniTypes.ExtrinsicType.TRANSFER_BALANCE:
|
|
28
|
+
case _KoniTypes.ExtrinsicType.TRANSFER_TOKEN:
|
|
29
|
+
case _KoniTypes.ExtrinsicType.TRANSFER_XCM:
|
|
30
|
+
return 'Transfer';
|
|
31
|
+
case _KoniTypes.ExtrinsicType.SEND_NFT:
|
|
32
|
+
return 'Send NFT';
|
|
33
|
+
case _KoniTypes.ExtrinsicType.CROWDLOAN:
|
|
34
|
+
return 'Crowdloan contribution';
|
|
35
|
+
case _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL:
|
|
36
|
+
return 'Join pool';
|
|
37
|
+
case _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL:
|
|
38
|
+
return 'Leave pool';
|
|
39
|
+
case _KoniTypes.ExtrinsicType.STAKING_BOND:
|
|
40
|
+
return 'Bond';
|
|
41
|
+
case _KoniTypes.ExtrinsicType.STAKING_UNBOND:
|
|
42
|
+
return 'Unbond';
|
|
43
|
+
case _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD:
|
|
44
|
+
return 'Claim reward';
|
|
45
|
+
case _KoniTypes.ExtrinsicType.STAKING_WITHDRAW:
|
|
46
|
+
return 'Withdraw';
|
|
47
|
+
case _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE:
|
|
48
|
+
return 'Cancel unstake';
|
|
49
|
+
case _KoniTypes.ExtrinsicType.STAKING_COMPOUNDING:
|
|
50
|
+
return 'Stake compound';
|
|
51
|
+
case _KoniTypes.ExtrinsicType.EVM_EXECUTE:
|
|
52
|
+
return 'EVM execute';
|
|
53
|
+
case _KoniTypes.ExtrinsicType.STAKING_CANCEL_COMPOUNDING:
|
|
54
|
+
return 'Cancel compounding';
|
|
55
|
+
case _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW:
|
|
56
|
+
return 'Withdraw pool';
|
|
57
|
+
case _KoniTypes.ExtrinsicType.UNKNOWN:
|
|
58
|
+
default:
|
|
59
|
+
return 'unknown';
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const getBaseTransactionInfo = (transaction, chainInfoMap) => {
|
|
63
|
+
var _chainInfoMap$transac;
|
|
64
|
+
return `${typeName(transaction.extrinsicType)} on ${((_chainInfoMap$transac = chainInfoMap[transaction.chain]) === null || _chainInfoMap$transac === void 0 ? void 0 : _chainInfoMap$transac.name) || 'unknown network'}`;
|
|
65
|
+
};
|
|
66
|
+
exports.getBaseTransactionInfo = getBaseTransactionInfo;
|
|
@@ -10,9 +10,10 @@ var _TransactionError = require("@subwallet/extension-base/background/errors/Tra
|
|
|
10
10
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
11
11
|
var _TransactionWarning = require("@subwallet/extension-base/background/warnings/TransactionWarning");
|
|
12
12
|
var _constants = require("@subwallet/extension-base/constants");
|
|
13
|
+
var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
|
|
13
14
|
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
14
|
-
var
|
|
15
|
-
var
|
|
15
|
+
var _constants3 = require("@subwallet/extension-base/services/request-service/constants");
|
|
16
|
+
var _constants4 = require("@subwallet/extension-base/services/transaction-service/constants");
|
|
16
17
|
var _eventParser = require("@subwallet/extension-base/services/transaction-service/event-parser");
|
|
17
18
|
var _helpers = require("@subwallet/extension-base/services/transaction-service/helpers");
|
|
18
19
|
var _utils2 = require("@subwallet/extension-base/services/transaction-service/utils");
|
|
@@ -116,6 +117,10 @@ class TransactionService {
|
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
119
|
} catch (e) {
|
|
120
|
+
const error = e;
|
|
121
|
+
if (error.message.includes('gas required exceeds allowance')) {
|
|
122
|
+
validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
|
|
123
|
+
}
|
|
119
124
|
estimateFee.value = '0';
|
|
120
125
|
}
|
|
121
126
|
}
|
|
@@ -142,16 +147,22 @@ class TransactionService {
|
|
|
142
147
|
const balanceNum = parseInt(balance.value);
|
|
143
148
|
const edNum = parseInt(existentialDeposit);
|
|
144
149
|
const transferNativeNum = parseInt(transferNative);
|
|
145
|
-
if (
|
|
146
|
-
if (
|
|
150
|
+
if (transferNativeNum + feeNum > balanceNum) {
|
|
151
|
+
if (!isTransferAll) {
|
|
147
152
|
validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
|
|
148
153
|
} else {
|
|
149
|
-
if (
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
154
|
+
if ([..._constants2._TRANSFER_CHAIN_GROUP.acala, ..._constants2._TRANSFER_CHAIN_GROUP.genshiro, ..._constants2._TRANSFER_CHAIN_GROUP.bitcountry, ..._constants2._TRANSFER_CHAIN_GROUP.statemine].includes(chain)) {
|
|
155
|
+
// Chain not have transfer all function
|
|
156
|
+
validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (!isTransferAll) {
|
|
161
|
+
if (balanceNum - (transferNativeNum + feeNum) < edNum) {
|
|
162
|
+
if (edAsWarning) {
|
|
163
|
+
validationResponse.warnings.push(new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT, ''));
|
|
164
|
+
} else {
|
|
165
|
+
validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_EXISTENTIAL_DEPOSIT, ''));
|
|
155
166
|
}
|
|
156
167
|
}
|
|
157
168
|
}
|
|
@@ -172,7 +183,7 @@ class TransactionService {
|
|
|
172
183
|
updatedAt: new Date().getTime(),
|
|
173
184
|
errors: transaction.errors || [],
|
|
174
185
|
warnings: transaction.warnings || [],
|
|
175
|
-
url: transaction.url ||
|
|
186
|
+
url: transaction.url || _constants3.EXTENSION_REQUEST_URL,
|
|
176
187
|
status: _KoniTypes.ExtrinsicStatus.QUEUED,
|
|
177
188
|
isInternal,
|
|
178
189
|
id: transactionId,
|
|
@@ -213,6 +224,7 @@ class TransactionService {
|
|
|
213
224
|
// @ts-ignore
|
|
214
225
|
'transaction' in validatedTransaction && delete validatedTransaction.transaction;
|
|
215
226
|
'additionalValidator' in validatedTransaction && delete validatedTransaction.additionalValidator;
|
|
227
|
+
'eventsHandler' in validatedTransaction && delete validatedTransaction.eventsHandler;
|
|
216
228
|
return validatedTransaction;
|
|
217
229
|
}
|
|
218
230
|
validatedTransaction.warnings = [];
|
|
@@ -234,11 +246,15 @@ class TransactionService {
|
|
|
234
246
|
// @ts-ignore
|
|
235
247
|
'transaction' in validatedTransaction && delete validatedTransaction.transaction;
|
|
236
248
|
'additionalValidator' in validatedTransaction && delete validatedTransaction.additionalValidator;
|
|
249
|
+
'eventsHandler' in validatedTransaction && delete validatedTransaction.eventsHandler;
|
|
237
250
|
return validatedTransaction;
|
|
238
251
|
}
|
|
239
252
|
async sendTransaction(transaction) {
|
|
240
253
|
// Send Transaction
|
|
241
254
|
const emitter = transaction.chainType === 'substrate' ? this.signAndSendSubstrateTransaction(transaction) : await this.signAndSendEvmTransaction(transaction);
|
|
255
|
+
const {
|
|
256
|
+
eventsHandler
|
|
257
|
+
} = transaction;
|
|
242
258
|
emitter.on('signed', data => {
|
|
243
259
|
this.onSigned(data);
|
|
244
260
|
});
|
|
@@ -262,6 +278,7 @@ class TransactionService {
|
|
|
262
278
|
|
|
263
279
|
// Todo: handle any event with transaction.eventsHandler
|
|
264
280
|
|
|
281
|
+
eventsHandler === null || eventsHandler === void 0 ? void 0 : eventsHandler(emitter);
|
|
265
282
|
return emitter;
|
|
266
283
|
}
|
|
267
284
|
removeTransaction(id) {
|
|
@@ -288,6 +305,7 @@ class TransactionService {
|
|
|
288
305
|
}
|
|
289
306
|
transactionToHistories(id, startBlock, nonce, eventLogs) {
|
|
290
307
|
const transaction = this.getTransaction(id);
|
|
308
|
+
const extrinsicType = transaction.extrinsicType;
|
|
291
309
|
const historyItem = {
|
|
292
310
|
origin: 'app',
|
|
293
311
|
chain: transaction.chain,
|
|
@@ -318,7 +336,7 @@ class TransactionService {
|
|
|
318
336
|
};
|
|
319
337
|
|
|
320
338
|
// Fill data by extrinsicType
|
|
321
|
-
switch (
|
|
339
|
+
switch (extrinsicType) {
|
|
322
340
|
case _KoniTypes.ExtrinsicType.TRANSFER_BALANCE:
|
|
323
341
|
{
|
|
324
342
|
const inputData = (0, _utils2.parseTransactionData)(transaction.data);
|
|
@@ -357,9 +375,10 @@ class TransactionService {
|
|
|
357
375
|
};
|
|
358
376
|
|
|
359
377
|
// @ts-ignore
|
|
360
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
361
378
|
historyItem.additionalInfo = {
|
|
362
|
-
destinationChain: (inputData === null || inputData === void 0 ? void 0 : inputData.destinationNetworkKey) || ''
|
|
379
|
+
destinationChain: (inputData === null || inputData === void 0 ? void 0 : inputData.destinationNetworkKey) || '',
|
|
380
|
+
originalChain: inputData.originNetworkKey || '',
|
|
381
|
+
fee: transaction.estimateFee
|
|
363
382
|
};
|
|
364
383
|
eventLogs && (0, _eventParser.parseXcmEventLogs)(historyItem, eventLogs, transaction.chain, sendingTokenInfo, chainInfo);
|
|
365
384
|
}
|
|
@@ -458,11 +477,22 @@ class TransactionService {
|
|
|
458
477
|
// Return one more history record if transaction send to account in the wallets
|
|
459
478
|
const toAccount = (historyItem === null || historyItem === void 0 ? void 0 : historyItem.to) && _uiKeyring.default.getPair(historyItem.to);
|
|
460
479
|
if (toAccount) {
|
|
461
|
-
|
|
480
|
+
const receiverHistory = {
|
|
462
481
|
...historyItem,
|
|
463
482
|
address: toAccount.address,
|
|
464
483
|
direction: _KoniTypes.TransactionDirection.RECEIVED
|
|
465
|
-
}
|
|
484
|
+
};
|
|
485
|
+
switch (extrinsicType) {
|
|
486
|
+
case _KoniTypes.ExtrinsicType.TRANSFER_XCM:
|
|
487
|
+
{
|
|
488
|
+
const inputData = (0, _utils2.parseTransactionData)(transaction.data);
|
|
489
|
+
receiverHistory.chain = inputData.destinationNetworkKey;
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
default:
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
return [historyItem, receiverHistory];
|
|
466
496
|
}
|
|
467
497
|
} catch (e) {
|
|
468
498
|
console.warn(e);
|
|
@@ -554,10 +584,11 @@ class TransactionService {
|
|
|
554
584
|
blockNumber: blockNumber || 0,
|
|
555
585
|
blockHash: blockHash || ''
|
|
556
586
|
}).catch(console.error);
|
|
587
|
+
const info = (0, _util.isHex)(extrinsicHash) ? extrinsicHash : (0, _helpers.getBaseTransactionInfo)(transaction, this.chainService.getChainInfoMap());
|
|
557
588
|
this.notificationService.notify({
|
|
558
589
|
type: _KoniTypes.NotificationType.SUCCESS,
|
|
559
590
|
title: 'Transaction completed',
|
|
560
|
-
message: `Transaction ${
|
|
591
|
+
message: `Transaction ${info} completed`,
|
|
561
592
|
action: {
|
|
562
593
|
url: this.getTransactionLink(id)
|
|
563
594
|
},
|
|
@@ -589,10 +620,11 @@ class TransactionService {
|
|
|
589
620
|
blockNumber: blockNumber || 0,
|
|
590
621
|
blockHash: blockHash || ''
|
|
591
622
|
}).catch(console.error);
|
|
623
|
+
const info = (0, _util.isHex)(transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash) ? transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash : (0, _helpers.getBaseTransactionInfo)(transaction, this.chainService.getChainInfoMap());
|
|
592
624
|
this.notificationService.notify({
|
|
593
625
|
type: _KoniTypes.NotificationType.ERROR,
|
|
594
626
|
title: 'Transaction failed',
|
|
595
|
-
message: `Transaction ${
|
|
627
|
+
message: `Transaction ${info} failed`,
|
|
596
628
|
action: {
|
|
597
629
|
url: this.getTransactionLink(id)
|
|
598
630
|
},
|
|
@@ -687,9 +719,10 @@ class TransactionService {
|
|
|
687
719
|
const eventData = {
|
|
688
720
|
id,
|
|
689
721
|
errors: [],
|
|
690
|
-
warnings: []
|
|
722
|
+
warnings: [],
|
|
723
|
+
extrinsicHash: id
|
|
691
724
|
};
|
|
692
|
-
this.requestService.addConfirmation(id, url ||
|
|
725
|
+
this.requestService.addConfirmation(id, url || _constants3.EXTENSION_REQUEST_URL, 'evmSendTransactionRequest', payload, {}).then(async _ref7 => {
|
|
693
726
|
let {
|
|
694
727
|
isApproved,
|
|
695
728
|
payload
|
|
@@ -760,12 +793,13 @@ class TransactionService {
|
|
|
760
793
|
const eventData = {
|
|
761
794
|
id,
|
|
762
795
|
errors: [],
|
|
763
|
-
warnings: []
|
|
796
|
+
warnings: [],
|
|
797
|
+
extrinsicHash: id
|
|
764
798
|
};
|
|
765
799
|
transaction.signAsync(address, {
|
|
766
800
|
signer: {
|
|
767
801
|
signPayload: async payload => {
|
|
768
|
-
const signing = await this.requestService.signInternalTransaction(id, address, url ||
|
|
802
|
+
const signing = await this.requestService.signInternalTransaction(id, address, url || _constants3.EXTENSION_REQUEST_URL, payload);
|
|
769
803
|
return {
|
|
770
804
|
id: new Date().getTime(),
|
|
771
805
|
signature: signing.signature
|
|
@@ -790,7 +824,7 @@ class TransactionService {
|
|
|
790
824
|
}
|
|
791
825
|
if (txState.status.isInBlock) {
|
|
792
826
|
eventData.eventLogs = txState.events;
|
|
793
|
-
if (!eventData.extrinsicHash || eventData.extrinsicHash === '') {
|
|
827
|
+
if (!eventData.extrinsicHash || eventData.extrinsicHash === '' || !(0, _util.isHex)(eventData.extrinsicHash)) {
|
|
794
828
|
eventData.extrinsicHash = txState.txHash.toHex();
|
|
795
829
|
eventData.blockHash = txState.status.asInBlock.toHex();
|
|
796
830
|
emitter.emit('extrinsicHash', eventData);
|
|
@@ -841,7 +875,7 @@ class TransactionService {
|
|
|
841
875
|
emitter.emit('error', eventData);
|
|
842
876
|
clearTimeout(timeout);
|
|
843
877
|
}
|
|
844
|
-
},
|
|
878
|
+
}, _constants4.TRANSACTION_TIMEOUT);
|
|
845
879
|
emitter.once('success', () => {
|
|
846
880
|
clearTimeout(timeout);
|
|
847
881
|
});
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.toBNString = exports.formatNumber = exports.balanceFormatter = exports.PREDEFINED_FORMATTER = exports.BN_TEN = void 0;
|
|
8
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
const BN_TEN = new _bignumber.default(10);
|
|
13
|
+
exports.BN_TEN = BN_TEN;
|
|
14
|
+
// Clear zero from end, use with decimal only
|
|
15
|
+
const clearZero = result => {
|
|
16
|
+
let index = result.length - 1;
|
|
17
|
+
while (result[index] === '0') {
|
|
18
|
+
result = result.slice(0, index);
|
|
19
|
+
index--;
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
const NUM_1T = new _bignumber.default(1e12);
|
|
24
|
+
const TLIM = new _bignumber.default(1e17);
|
|
25
|
+
const NUM_1B = new _bignumber.default(1e9);
|
|
26
|
+
const BLIM = new _bignumber.default(1e14);
|
|
27
|
+
const NUM_1M = new _bignumber.default(1e6);
|
|
28
|
+
const NUM_100M = new _bignumber.default(1e8);
|
|
29
|
+
const balanceFormatter = (input, metadata) => {
|
|
30
|
+
const absGteOne = new _bignumber.default(input).abs().gte(1);
|
|
31
|
+
const minNumberFormat = (metadata === null || metadata === void 0 ? void 0 : metadata.minNumberFormat) || 2;
|
|
32
|
+
const maxNumberFormat = (metadata === null || metadata === void 0 ? void 0 : metadata.maxNumberFormat) || 6;
|
|
33
|
+
const [int, decimal = '0'] = input.split('.');
|
|
34
|
+
let _decimal = '';
|
|
35
|
+
if (absGteOne) {
|
|
36
|
+
const intNumber = new _bignumber.default(int);
|
|
37
|
+
const max = BN_TEN.pow(maxNumberFormat);
|
|
38
|
+
|
|
39
|
+
// If count of number in integer part greater or equal maxNumberFormat, do not show decimal
|
|
40
|
+
if (intNumber.gte(max)) {
|
|
41
|
+
if (intNumber.gte(NUM_100M)) {
|
|
42
|
+
if (intNumber.gte(BLIM)) {
|
|
43
|
+
if (intNumber.gte(TLIM)) {
|
|
44
|
+
return `${intNumber.dividedBy(NUM_1T).toFixed(2)} T`;
|
|
45
|
+
}
|
|
46
|
+
return `${intNumber.dividedBy(NUM_1B).toFixed(2)} B`;
|
|
47
|
+
}
|
|
48
|
+
return `${intNumber.dividedBy(NUM_1M).toFixed(2)} M`;
|
|
49
|
+
}
|
|
50
|
+
return int;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Get only minNumberFormat number at decimal
|
|
54
|
+
if (decimal.length <= minNumberFormat) {
|
|
55
|
+
_decimal = decimal;
|
|
56
|
+
} else {
|
|
57
|
+
_decimal = decimal.slice(0, minNumberFormat);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Clear zero number for decimal
|
|
61
|
+
_decimal = clearZero(_decimal);
|
|
62
|
+
} else {
|
|
63
|
+
// Index of cursor
|
|
64
|
+
let index = 0;
|
|
65
|
+
|
|
66
|
+
// Count of not zero number in decimal
|
|
67
|
+
let current = 0;
|
|
68
|
+
|
|
69
|
+
// Find a not zero number in decimal
|
|
70
|
+
let metNotZero = false;
|
|
71
|
+
|
|
72
|
+
// Get at least minNumberFormat number not 0 from index 0
|
|
73
|
+
// If count of 0 number at prefix greater or equal maxNumberFormat should stop and return 0
|
|
74
|
+
|
|
75
|
+
// current === minNumberFormat: get enough number
|
|
76
|
+
// index === decimal.length: end of decimal
|
|
77
|
+
// index === maxNumberFormat: reach limit of 0 number at prefix
|
|
78
|
+
while (current < minNumberFormat && index < decimal.length && (index < maxNumberFormat || metNotZero)) {
|
|
79
|
+
const _char = decimal[index];
|
|
80
|
+
_decimal += _char;
|
|
81
|
+
index++;
|
|
82
|
+
if (_char !== '0') {
|
|
83
|
+
metNotZero = true;
|
|
84
|
+
}
|
|
85
|
+
if (metNotZero) {
|
|
86
|
+
current++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Clear zero number for decimal
|
|
91
|
+
_decimal = clearZero(_decimal);
|
|
92
|
+
}
|
|
93
|
+
if (_decimal) {
|
|
94
|
+
return `${int}.${_decimal}`;
|
|
95
|
+
}
|
|
96
|
+
return int;
|
|
97
|
+
};
|
|
98
|
+
exports.balanceFormatter = balanceFormatter;
|
|
99
|
+
const PREDEFINED_FORMATTER = {
|
|
100
|
+
balance: balanceFormatter
|
|
101
|
+
};
|
|
102
|
+
exports.PREDEFINED_FORMATTER = PREDEFINED_FORMATTER;
|
|
103
|
+
const toBNString = (input, decimal) => {
|
|
104
|
+
const raw = new _bignumber.default(input);
|
|
105
|
+
return raw.multipliedBy(BN_TEN.pow(decimal)).toFixed();
|
|
106
|
+
};
|
|
107
|
+
exports.toBNString = toBNString;
|
|
108
|
+
const formatNumber = (input, decimal, formatter, metadata) => {
|
|
109
|
+
const raw = new _bignumber.default(input).dividedBy(BN_TEN.pow(decimal)).toFixed();
|
|
110
|
+
return formatter(raw, metadata);
|
|
111
|
+
};
|
|
112
|
+
exports.formatNumber = formatNumber;
|
package/constants/index.d.ts
CHANGED
|
@@ -17,4 +17,5 @@ export declare const ALL_NETWORK_KEY = "all";
|
|
|
17
17
|
export declare const ALL_GENESIS_HASH: null;
|
|
18
18
|
export declare const IGNORE_GET_SUBSTRATE_FEATURES_LIST: string[];
|
|
19
19
|
export declare const IGNORE_QR_SIGNER: string[];
|
|
20
|
+
export declare const XCM_MIN_AMOUNT_RATIO = 1.2;
|
|
20
21
|
export * from './staking';
|
package/constants/index.js
CHANGED
|
@@ -20,4 +20,5 @@ export const ALL_NETWORK_KEY = 'all';
|
|
|
20
20
|
export const ALL_GENESIS_HASH = null;
|
|
21
21
|
export const IGNORE_GET_SUBSTRATE_FEATURES_LIST = ['astarEvm', 'ethereum', 'ethereum_goerli', 'binance', 'binance_test', 'boba_rinkeby', 'boba', 'bobabase', 'bobabeam'];
|
|
22
22
|
export const IGNORE_QR_SIGNER = [];
|
|
23
|
+
export const XCM_MIN_AMOUNT_RATIO = 1.2;
|
|
23
24
|
export * from "./staking.js";
|
|
@@ -284,10 +284,11 @@ async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, in
|
|
|
284
284
|
const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
|
|
285
285
|
try {
|
|
286
286
|
const onChainInfo = _getTokenOnChainInfo(tokenInfo);
|
|
287
|
+
const assetId = _getTokenOnChainAssetId(tokenInfo);
|
|
287
288
|
|
|
288
289
|
// Get Token Balance
|
|
289
290
|
// @ts-ignore
|
|
290
|
-
return await api.query.tokens.accounts.multi(addresses.map(address => [address, onChainInfo]), balances => {
|
|
291
|
+
return await api.query.tokens.accounts.multi(addresses.map(address => [address, onChainInfo || assetId]), balances => {
|
|
291
292
|
const tokenBalance = {
|
|
292
293
|
reserved: sumBN(balances.map(b => b.reserved || new BN(0))),
|
|
293
294
|
frozen: sumBN(balances.map(b => b.frozen || new BN(0))),
|
|
@@ -5,7 +5,7 @@ import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list';
|
|
|
5
5
|
import { APIItemState, CrowdloanParaState } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
6
|
import { ACALA_REFRESH_CROWDLOAN_INTERVAL } from '@subwallet/extension-base/constants';
|
|
7
7
|
import registry from '@subwallet/extension-base/koni/api/dotsama/typeRegistry';
|
|
8
|
-
import { _getChainSubstrateAddressPrefix, _getSubstrateParaId, _getSubstrateRelayParent, _isChainEvmCompatible,
|
|
8
|
+
import { _getChainSubstrateAddressPrefix, _getSubstrateParaId, _getSubstrateRelayParent, _isChainEvmCompatible, _isSubstrateParaChain } from '@subwallet/extension-base/services/chain-service/utils';
|
|
9
9
|
import { categoryAddresses, reformatAddress } from '@subwallet/extension-base/utils';
|
|
10
10
|
import axios from 'axios';
|
|
11
11
|
import { BN } from '@polkadot/util';
|
|
@@ -97,7 +97,7 @@ export async function subscribeCrowdloan(addresses, substrateApiMap, callback, c
|
|
|
97
97
|
return registry.createType('AccountId', address).toHex();
|
|
98
98
|
});
|
|
99
99
|
Object.entries(chainInfoMap).forEach(([networkKey, chainInfo]) => {
|
|
100
|
-
if (
|
|
100
|
+
if (_isSubstrateParaChain(chainInfo)) {
|
|
101
101
|
const parentChain = _getSubstrateRelayParent(chainInfo);
|
|
102
102
|
const crowdloanCb = rs => {
|
|
103
103
|
callback(networkKey, rs);
|
|
@@ -118,9 +118,9 @@ export const createTransferExtrinsic = async ({
|
|
|
118
118
|
transfer = api.tx.currencies.transfer(to, _getTokenOnChainInfo(tokenInfo), value);
|
|
119
119
|
} else if (_TRANSFER_CHAIN_GROUP.kintsugi.includes(networkKey) && !_isNativeToken(tokenInfo) && isTxTokensSupported) {
|
|
120
120
|
if (transferAll) {
|
|
121
|
-
transfer = api.tx.tokens.transferAll(to, _getTokenOnChainInfo(tokenInfo), false);
|
|
121
|
+
transfer = api.tx.tokens.transferAll(to, _getTokenOnChainInfo(tokenInfo) || _getTokenOnChainAssetId(tokenInfo), false);
|
|
122
122
|
} else if (value) {
|
|
123
|
-
transfer = api.tx.tokens.transfer(to, _getTokenOnChainInfo(tokenInfo), new BN(value));
|
|
123
|
+
transfer = api.tx.tokens.transfer(to, _getTokenOnChainInfo(tokenInfo) || _getTokenOnChainAssetId(tokenInfo), new BN(value));
|
|
124
124
|
}
|
|
125
125
|
} else if (_TRANSFER_CHAIN_GROUP.genshiro.includes(networkKey) && !_isNativeToken(tokenInfo) && isTxEqBalancesSupported) {
|
|
126
126
|
transfer = api.tx.eqBalances.transfer([_getTokenOnChainAssetId(tokenInfo)], to, value);
|
|
@@ -1,49 +1,30 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import { getBeneficiary, getDestWeight } from '@subwallet/extension-base/koni/api/xcm/utils';
|
|
5
|
-
import {
|
|
6
|
-
function getDestinationChainLocation(destinationChainInfo) {
|
|
7
|
-
if (_isSubstrateParaChain(destinationChainInfo)) {
|
|
8
|
-
return {
|
|
9
|
-
V1: {
|
|
10
|
-
parents: 1,
|
|
11
|
-
interior: {
|
|
12
|
-
X1: {
|
|
13
|
-
Parachain: _getSubstrateParaId(destinationChainInfo)
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
return {
|
|
20
|
-
// to relaychain by default
|
|
21
|
-
V1: {
|
|
22
|
-
parents: 1,
|
|
23
|
-
interior: 'Here'
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
function getAssetLocation(tokenInfo, sendingValue) {
|
|
28
|
-
const multilocation = _getXcmAssetMultilocation(tokenInfo);
|
|
29
|
-
return {
|
|
30
|
-
V1: [{
|
|
31
|
-
id: multilocation,
|
|
32
|
-
fun: {
|
|
33
|
-
Fungible: sendingValue
|
|
34
|
-
}
|
|
35
|
-
}]
|
|
36
|
-
};
|
|
37
|
-
}
|
|
4
|
+
import { getBeneficiary, getDestinationChainLocation, getDestWeight, getTokenLocation } from '@subwallet/extension-base/koni/api/xcm/utils';
|
|
5
|
+
import { _isNativeToken, _isSubstrateRelayChain } from '@subwallet/extension-base/services/chain-service/utils';
|
|
38
6
|
export function getExtrinsicByPolkadotXcmPallet(tokenInfo, originChainInfo, destinationChainInfo, recipientAddress, value, api) {
|
|
39
7
|
const weightParam = getDestWeight();
|
|
40
|
-
const beneficiary = getBeneficiary(
|
|
41
|
-
const destination = getDestinationChainLocation(destinationChainInfo);
|
|
42
|
-
|
|
8
|
+
const beneficiary = getBeneficiary(destinationChainInfo, recipientAddress);
|
|
9
|
+
const destination = getDestinationChainLocation(originChainInfo, destinationChainInfo);
|
|
10
|
+
let assetLocation = getTokenLocation(tokenInfo, value);
|
|
43
11
|
let method = 'limitedReserveTransferAssets';
|
|
44
|
-
if (['astar', 'shiden'].includes(originChainInfo.slug)) {
|
|
12
|
+
if (['astar', 'shiden'].includes(originChainInfo.slug) && !_isNativeToken(tokenInfo)) {
|
|
45
13
|
method = 'limitedReserveWithdrawAssets';
|
|
46
|
-
} else if (_isSubstrateRelayChain(destinationChainInfo)) {
|
|
14
|
+
} else if (['statemint', 'statemine'].includes(originChainInfo.slug) && _isSubstrateRelayChain(destinationChainInfo)) {
|
|
15
|
+
assetLocation = {
|
|
16
|
+
V1: [{
|
|
17
|
+
id: {
|
|
18
|
+
Concrete: {
|
|
19
|
+
parents: 1,
|
|
20
|
+
interior: 'Here'
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
fun: {
|
|
24
|
+
Fungible: value
|
|
25
|
+
}
|
|
26
|
+
}]
|
|
27
|
+
};
|
|
47
28
|
method = 'limitedTeleportAssets';
|
|
48
29
|
}
|
|
49
30
|
return api.tx.polkadotXcm[method](destination, beneficiary, assetLocation, 0,
|