@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.
Files changed (46) hide show
  1. package/background/KoniTypes.d.ts +3 -1
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/TransactionError.js +5 -1
  4. package/cjs/background/KoniTypes.js +1 -0
  5. package/cjs/background/errors/TransactionError.js +4 -0
  6. package/cjs/constants/index.js +6 -3
  7. package/cjs/koni/api/dotsama/balance.js +2 -1
  8. package/cjs/koni/api/dotsama/crowdloan.js +1 -1
  9. package/cjs/koni/api/dotsama/transfer.js +2 -2
  10. package/cjs/koni/api/xcm/polkadotXcm.js +18 -37
  11. package/cjs/koni/api/xcm/utils.js +78 -11
  12. package/cjs/koni/api/xcm/xTokens.js +4 -33
  13. package/cjs/koni/api/xcm/xcmPallet.js +4 -36
  14. package/cjs/koni/background/handlers/Extension.js +83 -25
  15. package/cjs/koni/background/handlers/State.js +1 -1
  16. package/cjs/packageInfo.js +1 -1
  17. package/cjs/services/chain-service/constants.js +5 -5
  18. package/cjs/services/chain-service/index.js +19 -15
  19. package/cjs/services/chain-service/utils.js +1 -5
  20. package/cjs/services/transaction-service/helpers/index.js +45 -2
  21. package/cjs/services/transaction-service/index.js +58 -24
  22. package/cjs/utils/number.js +112 -0
  23. package/constants/index.d.ts +1 -0
  24. package/constants/index.js +1 -0
  25. package/koni/api/dotsama/balance.js +2 -1
  26. package/koni/api/dotsama/crowdloan.js +2 -2
  27. package/koni/api/dotsama/transfer.js +2 -2
  28. package/koni/api/xcm/polkadotXcm.js +20 -39
  29. package/koni/api/xcm/utils.d.ts +36 -3
  30. package/koni/api/xcm/utils.js +72 -11
  31. package/koni/api/xcm/xTokens.js +6 -35
  32. package/koni/api/xcm/xcmPallet.js +5 -35
  33. package/koni/background/handlers/Extension.js +82 -24
  34. package/koni/background/handlers/State.js +2 -2
  35. package/package.json +13 -8
  36. package/packageInfo.js +1 -1
  37. package/services/chain-service/constants.js +5 -5
  38. package/services/chain-service/index.js +13 -8
  39. package/services/chain-service/utils.d.ts +0 -1
  40. package/services/chain-service/utils.js +1 -4
  41. package/services/transaction-service/helpers/index.d.ts +2 -0
  42. package/services/transaction-service/helpers/index.js +42 -0
  43. package/services/transaction-service/index.js +54 -20
  44. package/services/transaction-service/types.d.ts +2 -2
  45. package/utils/number.d.ts +9 -0
  46. 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.getXcmRefMap());
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
- const result = {};
58
- Object.entries(_chainList.AssetRefMap).forEach(_ref => {
59
- let [key, assetRef] = _ref;
60
- if (assetRef.path === _types._AssetRefPath.XCM) {
61
- result[key] = assetRef;
62
- }
63
- });
64
- return result;
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(_ref2 => {
374
- let [slug, chainInfo] = _ref2;
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(_ref3 => {
621
- let [slug, chainInfo] = _ref3;
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 _ref4 => {
1140
- let [chain, chainState] = _ref4;
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 _constants2 = require("@subwallet/extension-base/services/request-service/constants");
15
- var _constants3 = require("@subwallet/extension-base/services/transaction-service/constants");
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 (!isTransferAll) {
146
- if (transferNativeNum + feeNum > balanceNum) {
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 (balanceNum - (transferNativeNum + feeNum) <= edNum) {
150
- if (edAsWarning) {
151
- validationResponse.warnings.push(new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT, ''));
152
- } else {
153
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_EXISTENTIAL_DEPOSIT, ''));
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 || _constants2.EXTENSION_REQUEST_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 (transaction.extrinsicType) {
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
- return [historyItem, {
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 ${transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash} completed`,
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 ${transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash} failed`,
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 || _constants2.EXTENSION_REQUEST_URL, 'evmSendTransactionRequest', payload, {}).then(async _ref7 => {
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 || _constants2.EXTENSION_REQUEST_URL, payload);
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
- }, _constants3.TRANSACTION_TIMEOUT);
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;
@@ -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';
@@ -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, _isSubstrateParachain } from '@subwallet/extension-base/services/chain-service/utils';
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 (_isSubstrateParachain(chainInfo)) {
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 { _getSubstrateParaId, _getXcmAssetMultilocation, _isSubstrateParaChain, _isSubstrateRelayChain } from '@subwallet/extension-base/services/chain-service/utils';
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(originChainInfo, destinationChainInfo, recipientAddress);
41
- const destination = getDestinationChainLocation(destinationChainInfo);
42
- const assetLocation = getAssetLocation(tokenInfo, value);
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,