@subwallet/extension-base 1.3.22-0 → 1.3.24-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 (210) hide show
  1. package/background/KoniTypes.d.ts +77 -4
  2. package/background/KoniTypes.js +2 -0
  3. package/cjs/background/KoniTypes.js +2 -0
  4. package/cjs/constants/environment.js +4 -2
  5. package/cjs/constants/index.js +21 -4
  6. package/cjs/constants/signing.js +6 -2
  7. package/cjs/core/logic-validation/recipientAddress.js +9 -1
  8. package/cjs/core/logic-validation/transfer.js +57 -36
  9. package/cjs/core/types.js +1 -0
  10. package/cjs/core/utils.js +12 -1
  11. package/cjs/defaults.js +1 -1
  12. package/cjs/koni/api/dotsama/crowdloan.js +1 -1
  13. package/cjs/koni/api/nft/index.js +9 -16
  14. package/cjs/koni/api/staking/index.js +3 -4
  15. package/cjs/koni/background/handlers/Extension.js +343 -185
  16. package/cjs/koni/background/handlers/State.js +17 -2
  17. package/cjs/koni/background/handlers/Tabs.js +1 -1
  18. package/cjs/packageInfo.js +1 -1
  19. package/cjs/services/balance-service/helpers/subscribe/cardano/consts.js +11 -0
  20. package/cjs/services/balance-service/helpers/subscribe/cardano/index.js +63 -0
  21. package/cjs/services/balance-service/helpers/subscribe/cardano/types.js +1 -0
  22. package/cjs/services/balance-service/helpers/subscribe/cardano/utils.js +74 -0
  23. package/cjs/services/balance-service/helpers/subscribe/index.js +21 -7
  24. package/cjs/services/balance-service/helpers/subscribe/ton/utils.js +2 -2
  25. package/cjs/services/balance-service/index.js +4 -2
  26. package/cjs/services/balance-service/transfer/cardano-transfer.js +122 -0
  27. package/cjs/services/balance-service/transfer/smart-contract.js +24 -3
  28. package/cjs/services/balance-service/transfer/token.js +4 -4
  29. package/cjs/services/chain-service/handler/CardanoApi.js +176 -0
  30. package/cjs/services/chain-service/handler/CardanoChainHandler.js +83 -0
  31. package/cjs/services/chain-service/handler/TonApi.js +2 -5
  32. package/cjs/services/chain-service/index.js +40 -7
  33. package/cjs/services/chain-service/utils/index.js +40 -11
  34. package/cjs/services/chain-service/utils/patch.js +1 -1
  35. package/cjs/services/earning-service/handlers/liquid-staking/bifrost-manta.js +1 -1
  36. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
  37. package/cjs/services/earning-service/service.js +6 -12
  38. package/cjs/services/fee-service/service.js +19 -8
  39. package/cjs/services/fee-service/utils/tokenPayFee.js +151 -0
  40. package/cjs/services/history-service/index.js +4 -6
  41. package/cjs/services/inapp-notification-service/index.js +12 -4
  42. package/cjs/services/keyring-service/context/account-context.js +17 -2
  43. package/cjs/services/keyring-service/context/handlers/Derive.js +10 -7
  44. package/cjs/services/keyring-service/context/handlers/Migration.js +268 -0
  45. package/cjs/services/keyring-service/context/handlers/Mnemonic.js +2 -2
  46. package/cjs/services/keyring-service/context/handlers/Secret.js +1 -1
  47. package/cjs/services/keyring-service/utils.js +18 -0
  48. package/cjs/services/request-service/handler/CardanoRequestHandler.js +172 -0
  49. package/cjs/services/request-service/handler/EvmRequestHandler.js +1 -1
  50. package/cjs/services/request-service/handler/MetadataRequestHandler.js +5 -13
  51. package/cjs/services/request-service/index.js +22 -4
  52. package/cjs/services/setting-service/constants.js +10 -1
  53. package/cjs/services/storage-service/DatabaseService.js +3 -0
  54. package/cjs/services/storage-service/db-stores/InappNotification.js +6 -0
  55. package/cjs/services/swap-service/handler/asset-hub/handler.js +0 -59
  56. package/cjs/services/swap-service/handler/chainflip-handler.js +33 -281
  57. package/cjs/services/swap-service/handler/hydradx-handler.js +23 -190
  58. package/cjs/services/swap-service/handler/simpleswap-handler.js +1 -222
  59. package/cjs/services/swap-service/handler/uniswap-handler.js +331 -0
  60. package/cjs/services/swap-service/index.js +31 -22
  61. package/cjs/services/swap-service/utils.js +21 -38
  62. package/cjs/services/transaction-service/helpers/index.js +6 -1
  63. package/cjs/services/transaction-service/index.js +286 -26
  64. package/cjs/services/transaction-service/utils.js +5 -1
  65. package/cjs/types/account/info/keyring.js +12 -1
  66. package/cjs/types/fee/cardano.js +1 -0
  67. package/cjs/types/swap/index.js +7 -2
  68. package/cjs/utils/account/analyze.js +2 -1
  69. package/cjs/utils/account/common.js +29 -20
  70. package/cjs/utils/account/derive/info/solo.js +9 -4
  71. package/cjs/utils/account/derive/validate.js +36 -2
  72. package/cjs/utils/account/transform.js +38 -13
  73. package/cjs/utils/fee/transfer.js +87 -21
  74. package/cjs/utils/index.js +2 -2
  75. package/cjs/utils/staticData/index.js +7 -2
  76. package/constants/environment.d.ts +1 -0
  77. package/constants/environment.js +2 -1
  78. package/constants/index.d.ts +6 -1
  79. package/constants/index.js +14 -1
  80. package/constants/signing.js +6 -2
  81. package/core/logic-validation/recipientAddress.js +11 -3
  82. package/core/logic-validation/transfer.d.ts +1 -1
  83. package/core/logic-validation/transfer.js +33 -12
  84. package/core/substrate/xcm-parser.d.ts +1 -1
  85. package/core/types.d.ts +1 -0
  86. package/core/types.js +1 -0
  87. package/core/utils.d.ts +1 -0
  88. package/core/utils.js +13 -3
  89. package/defaults.d.ts +1 -1
  90. package/defaults.js +1 -1
  91. package/koni/api/dotsama/crowdloan.js +3 -3
  92. package/koni/api/nft/index.js +10 -16
  93. package/koni/api/nft/story_odyssey_nft/index.d.ts +1 -1
  94. package/koni/api/staking/index.js +4 -5
  95. package/koni/background/handlers/Extension.d.ts +9 -0
  96. package/koni/background/handlers/Extension.js +225 -69
  97. package/koni/background/handlers/State.d.ts +6 -2
  98. package/koni/background/handlers/State.js +18 -3
  99. package/koni/background/handlers/Tabs.js +1 -1
  100. package/package.json +76 -9
  101. package/packageInfo.js +1 -1
  102. package/services/balance-service/helpers/subscribe/cardano/consts.d.ts +1 -0
  103. package/services/balance-service/helpers/subscribe/cardano/consts.js +4 -0
  104. package/services/balance-service/helpers/subscribe/cardano/index.d.ts +2 -0
  105. package/services/balance-service/helpers/subscribe/cardano/index.js +57 -0
  106. package/services/balance-service/helpers/subscribe/cardano/types.d.ts +34 -0
  107. package/services/balance-service/helpers/subscribe/cardano/types.js +1 -0
  108. package/services/balance-service/helpers/subscribe/cardano/utils.d.ts +15 -0
  109. package/services/balance-service/helpers/subscribe/cardano/utils.js +62 -0
  110. package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
  111. package/services/balance-service/helpers/subscribe/index.js +23 -9
  112. package/services/balance-service/helpers/subscribe/ton/utils.d.ts +1 -1
  113. package/services/balance-service/helpers/subscribe/ton/utils.js +1 -1
  114. package/services/balance-service/index.js +4 -2
  115. package/services/balance-service/transfer/cardano-transfer.d.ts +24 -0
  116. package/services/balance-service/transfer/cardano-transfer.js +114 -0
  117. package/services/balance-service/transfer/smart-contract.d.ts +4 -2
  118. package/services/balance-service/transfer/smart-contract.js +24 -3
  119. package/services/balance-service/transfer/token.d.ts +1 -1
  120. package/services/balance-service/transfer/token.js +2 -2
  121. package/services/chain-service/handler/CardanoApi.d.ts +38 -0
  122. package/services/chain-service/handler/CardanoApi.js +167 -0
  123. package/services/chain-service/handler/CardanoChainHandler.d.ts +17 -0
  124. package/services/chain-service/handler/CardanoChainHandler.js +75 -0
  125. package/services/chain-service/handler/TonApi.js +3 -6
  126. package/services/chain-service/handler/types.d.ts +1 -0
  127. package/services/chain-service/index.d.ts +4 -1
  128. package/services/chain-service/index.js +41 -8
  129. package/services/chain-service/types.d.ts +9 -1
  130. package/services/chain-service/utils/index.d.ts +4 -0
  131. package/services/chain-service/utils/index.js +32 -11
  132. package/services/chain-service/utils/patch.js +1 -1
  133. package/services/earning-service/handlers/liquid-staking/bifrost-manta.js +1 -1
  134. package/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
  135. package/services/earning-service/service.js +8 -14
  136. package/services/fee-service/interfaces.d.ts +25 -0
  137. package/services/fee-service/service.js +19 -8
  138. package/services/fee-service/utils/tokenPayFee.d.ts +8 -0
  139. package/services/fee-service/utils/tokenPayFee.js +141 -0
  140. package/services/history-service/index.js +6 -8
  141. package/services/inapp-notification-service/index.d.ts +3 -4
  142. package/services/inapp-notification-service/index.js +14 -6
  143. package/services/keyring-service/context/account-context.d.ts +6 -2
  144. package/services/keyring-service/context/account-context.js +17 -2
  145. package/services/keyring-service/context/handlers/Derive.d.ts +1 -1
  146. package/services/keyring-service/context/handlers/Derive.js +10 -8
  147. package/services/keyring-service/context/handlers/Migration.d.ts +17 -0
  148. package/services/keyring-service/context/handlers/Migration.js +258 -0
  149. package/services/keyring-service/context/handlers/Mnemonic.js +2 -2
  150. package/services/keyring-service/context/handlers/Secret.js +2 -2
  151. package/services/keyring-service/utils.d.ts +2 -0
  152. package/services/keyring-service/utils.js +11 -0
  153. package/services/request-service/handler/CardanoRequestHandler.d.ts +16 -0
  154. package/services/request-service/handler/CardanoRequestHandler.js +163 -0
  155. package/services/request-service/handler/EvmRequestHandler.js +1 -1
  156. package/services/request-service/handler/MetadataRequestHandler.d.ts +1 -1
  157. package/services/request-service/handler/MetadataRequestHandler.js +5 -13
  158. package/services/request-service/index.d.ts +7 -4
  159. package/services/request-service/index.js +21 -7
  160. package/services/setting-service/constants.d.ts +3 -0
  161. package/services/setting-service/constants.js +6 -0
  162. package/services/storage-service/DatabaseService.d.ts +1 -0
  163. package/services/storage-service/DatabaseService.js +3 -0
  164. package/services/storage-service/db-stores/InappNotification.d.ts +1 -0
  165. package/services/storage-service/db-stores/InappNotification.js +6 -0
  166. package/services/swap-service/handler/asset-hub/handler.d.ts +1 -4
  167. package/services/swap-service/handler/asset-hub/handler.js +2 -61
  168. package/services/swap-service/handler/base-handler.d.ts +1 -4
  169. package/services/swap-service/handler/chainflip-handler.d.ts +2 -9
  170. package/services/swap-service/handler/chainflip-handler.js +31 -280
  171. package/services/swap-service/handler/hydradx-handler.d.ts +1 -6
  172. package/services/swap-service/handler/hydradx-handler.js +13 -180
  173. package/services/swap-service/handler/simpleswap-handler.d.ts +1 -4
  174. package/services/swap-service/handler/simpleswap-handler.js +5 -226
  175. package/services/swap-service/handler/uniswap-handler.d.ts +41 -0
  176. package/services/swap-service/handler/uniswap-handler.js +323 -0
  177. package/services/swap-service/index.js +30 -22
  178. package/services/swap-service/utils.d.ts +1 -5
  179. package/services/swap-service/utils.js +7 -21
  180. package/services/transaction-service/helpers/index.d.ts +2 -0
  181. package/services/transaction-service/helpers/index.js +4 -0
  182. package/services/transaction-service/index.d.ts +8 -2
  183. package/services/transaction-service/index.js +273 -17
  184. package/services/transaction-service/types.d.ts +7 -0
  185. package/services/transaction-service/utils.js +7 -2
  186. package/types/account/info/keyring.d.ts +4 -1
  187. package/types/account/info/keyring.js +9 -0
  188. package/types/account/info/proxy.d.ts +2 -0
  189. package/types/balance/index.d.ts +4 -1
  190. package/types/fee/base.d.ts +1 -1
  191. package/types/fee/cardano.d.ts +18 -0
  192. package/types/fee/cardano.js +1 -0
  193. package/types/fee/option.d.ts +1 -1
  194. package/types/fee/subscription.d.ts +4 -3
  195. package/types/swap/index.d.ts +11 -3
  196. package/types/swap/index.js +7 -2
  197. package/utils/account/analyze.js +2 -1
  198. package/utils/account/common.d.ts +11 -6
  199. package/utils/account/common.js +28 -19
  200. package/utils/account/derive/info/solo.js +10 -5
  201. package/utils/account/derive/validate.d.ts +1 -0
  202. package/utils/account/derive/validate.js +34 -1
  203. package/utils/account/transform.d.ts +2 -1
  204. package/utils/account/transform.js +37 -13
  205. package/utils/fee/transfer.d.ts +3 -2
  206. package/utils/fee/transfer.js +90 -24
  207. package/utils/index.js +4 -4
  208. package/utils/staticData/index.d.ts +4 -1
  209. package/utils/staticData/index.js +5 -1
  210. package/utils/staticData/oldChainPrefix.json +1 -0
@@ -4,16 +4,17 @@
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
5
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
6
6
  import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning';
7
- import { LEDGER_SIGNING_COMPATIBLE_MAP, SIGNING_COMPATIBLE_MAP, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants';
7
+ import { _SUPPORT_TOKEN_PAY_FEE_GROUP, LEDGER_SIGNING_COMPATIBLE_MAP, SIGNING_COMPATIBLE_MAP, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants';
8
8
  import { _canAccountBeReaped, _isAccountActive } from '@subwallet/extension-base/core/substrate/system-pallet';
9
+ import { getCardanoAssetId } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/utils';
9
10
  import { isBounceableAddress } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils';
10
11
  import { _TRANSFER_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
11
- import { _getAssetDecimals, _getChainExistentialDeposit, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getTokenMinAmount, _isNativeToken, _isTokenEvmSmartContract, _isTokenTonSmartContract } from '@subwallet/extension-base/services/chain-service/utils';
12
+ import { _getAssetDecimals, _getAssetPriceId, _getAssetSymbol, _getChainExistentialDeposit, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getTokenMinAmount, _isCIP26Token, _isNativeToken, _isNativeTokenBySlug, _isTokenEvmSmartContract, _isTokenTonSmartContract } from '@subwallet/extension-base/services/chain-service/utils';
12
13
  import { calculateToAmountByReservePool, FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE } from '@subwallet/extension-base/services/fee-service/utils';
13
- import { isSubstrateTransaction, isTonTransaction } from '@subwallet/extension-base/services/transaction-service/helpers';
14
+ import { isCardanoTransaction, isSubstrateTransaction, isTonTransaction } from '@subwallet/extension-base/services/transaction-service/helpers';
14
15
  import { AccountSignMode, BasicTxErrorType, BasicTxWarningCode, TransferTxErrorType } from '@subwallet/extension-base/types';
15
16
  import { balanceFormatter, combineEthFee, formatNumber, pairToAccount } from '@subwallet/extension-base/utils';
16
- import { isTonAddress } from '@subwallet/keyring';
17
+ import { isCardanoAddress, isTonAddress } from '@subwallet/keyring';
17
18
  import { keyring } from '@subwallet/ui-keyring';
18
19
  import BigN from 'bignumber.js';
19
20
  import { t } from 'i18next';
@@ -36,6 +37,9 @@ export function validateTransferRequest(tokenInfo, from, to, value, transferAll)
36
37
  if (isTonAddress(from) && isTonAddress(to) && _isTokenTonSmartContract(tokenInfo) && _getContractAddressOfToken(tokenInfo).length === 0) {
37
38
  errors.push(new TransactionError(BasicTxErrorType.INVALID_PARAMS, t('Not found TEP74 address for this token')));
38
39
  }
40
+ if (isCardanoAddress(from) && isCardanoAddress(to) && _isCIP26Token(tokenInfo) && getCardanoAssetId(tokenInfo).length === 0) {
41
+ errors.push(new TransactionError(BasicTxErrorType.INVALID_PARAMS, t('Not found policy id of this token')));
42
+ }
39
43
  return errors;
40
44
  }
41
45
  export function additionalValidateTransferForRecipient(sendingTokenInfo, nativeTokenInfo, extrinsicType, receiverSendingTokenKeepAliveBalance, transferAmount, senderSendingTokenTransferable, receiverSystemAccountInfo, isSendingTokenSufficient) {
@@ -327,7 +331,7 @@ export function checkSupportForTransaction(validationResponse, transaction) {
327
331
  }
328
332
  }
329
333
  }
330
- export async function estimateFeeForTransaction(validationResponse, transaction, chainInfo, evmApi, substrateApi, feeInfo, nativeTokenInfo, tokenPayFeeInfo, isTransferLocalTokenAndPayThatTokenAsFee) {
334
+ export async function estimateFeeForTransaction(validationResponse, transaction, chainInfo, evmApi, substrateApi, priceMap, feeInfo, nativeTokenInfo, nonNativeTokenPayFeeInfo, isTransferLocalTokenAndPayThatTokenAsFee) {
331
335
  const estimateFee = {
332
336
  symbol: '',
333
337
  decimals: 0,
@@ -346,6 +350,8 @@ export async function estimateFeeForTransaction(validationResponse, transaction,
346
350
  estimateFee.value = (await transaction.paymentInfo(validationResponse.address)).partialFee.toString();
347
351
  } else if (isTonTransaction(transaction)) {
348
352
  estimateFee.value = transaction.estimateFee; // todo: might need to update logic estimate fee inside for future actions excluding normal transfer Ton and Jetton
353
+ } else if (isCardanoTransaction(transaction)) {
354
+ estimateFee.value = transaction.estimateCardanoFee;
349
355
  } else {
350
356
  const gasLimit = transaction.gas || (await evmApi.api.eth.estimateGas(transaction));
351
357
  const feeCombine = combineEthFee(feeInfo, validationResponse.feeOption, validationResponse.feeCustom);
@@ -371,11 +377,25 @@ export async function estimateFeeForTransaction(validationResponse, transaction,
371
377
  }
372
378
  }
373
379
  }
374
- if (tokenPayFeeInfo) {
380
+ const isCustomTokenPayFeeAssetHub = !!nonNativeTokenPayFeeInfo && _SUPPORT_TOKEN_PAY_FEE_GROUP.assetHub.includes(nonNativeTokenPayFeeInfo.originChain);
381
+ const isCustomTokenPayFeeHydration = !!nonNativeTokenPayFeeInfo && _SUPPORT_TOKEN_PAY_FEE_GROUP.hydration.includes(nonNativeTokenPayFeeInfo.originChain);
382
+ if (isCustomTokenPayFeeAssetHub) {
375
383
  const estimatedFeeAmount = isTransferLocalTokenAndPayThatTokenAsFee ? (BigInt(estimateFee.value) * BigInt(FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString() : estimateFee.value;
376
- estimateFee.decimals = tokenPayFeeInfo.decimals || 0;
377
- estimateFee.symbol = tokenPayFeeInfo.symbol;
378
- estimateFee.value = await calculateToAmountByReservePool(substrateApi.api, nativeTokenInfo, tokenPayFeeInfo, estimatedFeeAmount);
384
+ estimateFee.decimals = _getAssetDecimals(nonNativeTokenPayFeeInfo);
385
+ estimateFee.symbol = _getAssetSymbol(nonNativeTokenPayFeeInfo);
386
+ estimateFee.value = await calculateToAmountByReservePool(substrateApi.api, nativeTokenInfo, nonNativeTokenPayFeeInfo, estimatedFeeAmount);
387
+ }
388
+ if (isCustomTokenPayFeeHydration) {
389
+ const nativePriceId = _getAssetPriceId(nativeTokenInfo);
390
+ const nativeDecimals = _getAssetDecimals(nativeTokenInfo);
391
+ const nativePrice = priceMap[nativePriceId];
392
+ const tokenPriceId = _getAssetPriceId(nonNativeTokenPayFeeInfo);
393
+ const tokenDecimals = _getAssetDecimals(nonNativeTokenPayFeeInfo);
394
+ const tokenPrice = priceMap[tokenPriceId];
395
+ const rate = new BigN(nativePrice).div(tokenPrice).multipliedBy(10 ** (tokenDecimals - nativeDecimals)).toFixed();
396
+ estimateFee.decimals = _getAssetDecimals(nonNativeTokenPayFeeInfo);
397
+ estimateFee.symbol = _getAssetSymbol(nonNativeTokenPayFeeInfo);
398
+ estimateFee.value = new BigN(estimateFee.value).multipliedBy(rate).toFixed(0);
379
399
  }
380
400
  return estimateFee;
381
401
  }
@@ -415,10 +435,11 @@ export function checkBalanceWithTransactionFee(validationResponse, transactionIn
415
435
  edAsWarning,
416
436
  extrinsicType,
417
437
  isTransferAll,
418
- nonNativeTokenPayFeeSlug,
419
- skipFeeValidation
438
+ skipFeeValidation,
439
+ tokenPayFeeSlug
420
440
  } = transactionInput;
421
- if (skipFeeValidation || nonNativeTokenPayFeeSlug) {
441
+ if (skipFeeValidation || tokenPayFeeSlug && !_isNativeTokenBySlug(tokenPayFeeSlug)) {
442
+ // todo: need improve: input should be balance of fee token and check this again
422
443
  return;
423
444
  }
424
445
  const bnFee = new BigN(validationResponse.estimateFee.value);
@@ -1,6 +1,6 @@
1
1
  import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import { _Address } from '@subwallet/extension-base/background/KoniTypes';
3
- export declare function _getXcmDestWeight(originChainInfo: _ChainInfo): 5000000000 | "Unlimited";
3
+ export declare function _getXcmDestWeight(originChainInfo: _ChainInfo): "Unlimited" | 5000000000;
4
4
  export declare function _getXcmBeneficiary(destChainInfo: _ChainInfo, recipient: _Address, version: number): {
5
5
  [x: string]: {
6
6
  parents: number;
package/core/types.d.ts CHANGED
@@ -7,6 +7,7 @@ export declare enum ValidationCondition {
7
7
  IS_VALID_ADDRESS_FOR_ECOSYSTEM = "IS_VALID_ADDRESS_FOR_ECOSYSTEM",
8
8
  IS_VALID_SUBSTRATE_ADDRESS_FORMAT = "IS_VALID_SUBSTRATE_ADDRESS_FORMAT",
9
9
  IS_VALID_TON_ADDRESS_FORMAT = "IS_VALID_TON_ADDRESS_FORMAT",
10
+ IS_VALID_CARDANO_ADDRESS_FORMAT = "IS_VALID_CARDANO_ADDRESS_FORMAT",
10
11
  IS_NOT_DUPLICATE_ADDRESS = "IS_NOT_DUPLICATE_ADDRESS",
11
12
  IS_SUPPORT_LEDGER_ACCOUNT = "IS_SUPPORT_LEDGER_ACCOUNT"
12
13
  }
package/core/types.js CHANGED
@@ -8,6 +8,7 @@ export let ValidationCondition;
8
8
  ValidationCondition["IS_VALID_ADDRESS_FOR_ECOSYSTEM"] = "IS_VALID_ADDRESS_FOR_ECOSYSTEM";
9
9
  ValidationCondition["IS_VALID_SUBSTRATE_ADDRESS_FORMAT"] = "IS_VALID_SUBSTRATE_ADDRESS_FORMAT";
10
10
  ValidationCondition["IS_VALID_TON_ADDRESS_FORMAT"] = "IS_VALID_TON_ADDRESS_FORMAT";
11
+ ValidationCondition["IS_VALID_CARDANO_ADDRESS_FORMAT"] = "IS_VALID_CARDANO_ADDRESS_FORMAT";
11
12
  ValidationCondition["IS_NOT_DUPLICATE_ADDRESS"] = "IS_NOT_DUPLICATE_ADDRESS";
12
13
  ValidationCondition["IS_SUPPORT_LEDGER_ACCOUNT"] = "IS_SUPPORT_LEDGER_ACCOUNT";
13
14
  })(ValidationCondition || (ValidationCondition = {}));
package/core/utils.d.ts CHANGED
@@ -10,5 +10,6 @@ export declare function _isAddress(validateRecipientParams: ValidateRecipientPar
10
10
  export declare function _isValidAddressForEcosystem(validateRecipientParams: ValidateRecipientParams): string;
11
11
  export declare function _isValidSubstrateAddressFormat(validateRecipientParams: ValidateRecipientParams): string;
12
12
  export declare function _isValidTonAddressFormat(validateRecipientParams: ValidateRecipientParams): string;
13
+ export declare function _isValidCardanoAddressFormat(validateRecipientParams: ValidateRecipientParams): string;
13
14
  export declare function _isNotDuplicateAddress(validateRecipientParams: ValidateRecipientParams): string;
14
15
  export declare function _isSupportLedgerAccount(validateRecipientParams: ValidateRecipientParams): string;
package/core/utils.js CHANGED
@@ -4,9 +4,9 @@
4
4
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
5
5
  import { BalanceAccountType } from '@subwallet/extension-base/core/substrate/types';
6
6
  import { tonAddressInfo } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils';
7
- import { _isChainEvmCompatible, _isChainSubstrateCompatible, _isChainTonCompatible } from '@subwallet/extension-base/services/chain-service/utils';
7
+ import { _isChainCardanoCompatible, _isChainEvmCompatible, _isChainSubstrateCompatible, _isChainTonCompatible } from '@subwallet/extension-base/services/chain-service/utils';
8
8
  import { isAddressAndChainCompatible, isSameAddress, reformatAddress } from '@subwallet/extension-base/utils';
9
- import { isAddress, isTonAddress } from '@subwallet/keyring';
9
+ import { isAddress, isCardanoTestnetAddress, isTonAddress } from '@subwallet/keyring';
10
10
  import { isEthereumAddress } from '@polkadot/util-crypto';
11
11
  export function getStrictMode(type, extrinsicType) {
12
12
  if (type === BalanceAccountType.FrameSystemAccountInfo) {
@@ -54,7 +54,7 @@ export function _isValidAddressForEcosystem(validateRecipientParams) {
54
54
  toAddress
55
55
  } = validateRecipientParams;
56
56
  if (!isAddressAndChainCompatible(toAddress, destChainInfo)) {
57
- if (_isChainEvmCompatible(destChainInfo) || _isChainSubstrateCompatible(destChainInfo) || _isChainTonCompatible(destChainInfo)) {
57
+ if (_isChainEvmCompatible(destChainInfo) || _isChainSubstrateCompatible(destChainInfo) || _isChainTonCompatible(destChainInfo) || _isChainCardanoCompatible(destChainInfo)) {
58
58
  return 'Recipient address must be the same type as sender address';
59
59
  }
60
60
  return 'Unknown chain type';
@@ -85,6 +85,16 @@ export function _isValidTonAddressFormat(validateRecipientParams) {
85
85
  }
86
86
  return '';
87
87
  }
88
+ export function _isValidCardanoAddressFormat(validateRecipientParams) {
89
+ const {
90
+ destChainInfo,
91
+ toAddress
92
+ } = validateRecipientParams;
93
+ if (isCardanoTestnetAddress(toAddress) !== destChainInfo.isTestnet) {
94
+ return `Recipient address must be a valid ${destChainInfo.name} address`;
95
+ }
96
+ return '';
97
+ }
88
98
  export function _isNotDuplicateAddress(validateRecipientParams) {
89
99
  const {
90
100
  fromAddress,
package/defaults.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- declare const ALLOWED_PATH: readonly ["/", "/settings/security", "/transaction-submission", "/accounts/connect-ledger", "/accounts/restore-json", "/accounts/detail", "/accounts/new-seed-phrase"];
1
+ declare const ALLOWED_PATH: readonly ["/", "/settings/security", "/transaction-submission", "/accounts/connect-ledger", "/accounts/restore-json", "/accounts/detail", "/accounts/new-seed-phrase", "/migrate-account"];
2
2
  declare const PHISHING_PAGE_REDIRECT = "/phishing-page-detected";
3
3
  declare const EXTENSION_PREFIX: string;
4
4
  declare const ID_PREFIX: string;
package/defaults.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Copyright 2019-2022 @polkadot/extension-base authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- const ALLOWED_PATH = ['/', '/settings/security', '/transaction-submission', '/accounts/connect-ledger', '/accounts/restore-json', '/accounts/detail', '/accounts/new-seed-phrase'];
4
+ const ALLOWED_PATH = ['/', '/settings/security', '/transaction-submission', '/accounts/connect-ledger', '/accounts/restore-json', '/accounts/detail', '/accounts/new-seed-phrase', '/migrate-account'];
5
5
  const PHISHING_PAGE_REDIRECT = '/phishing-page-detected';
6
6
  const EXTENSION_PREFIX = process.env.EXTENSION_PREFIX || '';
7
7
  const ID_PREFIX = process.env.ID_PREFIX || EXTENSION_PREFIX || '';
@@ -3,10 +3,10 @@
3
3
 
4
4
  import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list';
5
5
  import { _FundStatus } from '@subwallet/chain-list/types';
6
- import { APIItemState, CrowdloanParaState } from '@subwallet/extension-base/background/KoniTypes';
6
+ import { APIItemState, ChainType, CrowdloanParaState } from '@subwallet/extension-base/background/KoniTypes';
7
7
  import { ACALA_REFRESH_CROWDLOAN_INTERVAL } from '@subwallet/extension-base/constants';
8
8
  import registry from '@subwallet/extension-base/koni/api/dotsama/typeRegistry';
9
- import { categoryAddresses, fetchJson, reformatAddress } from '@subwallet/extension-base/utils';
9
+ import { fetchJson, getAddressesByChainType, reformatAddress } from '@subwallet/extension-base/utils';
10
10
  import { fetchStaticData } from '@subwallet/extension-base/utils/fetchStaticData';
11
11
  import { BN } from '@polkadot/util';
12
12
  const STATUS_MAP = {
@@ -164,7 +164,7 @@ export async function subscribeCrowdloan(addresses, substrateApiMap, callback) {
164
164
  const now = Date.now();
165
165
  const polkadotAPI = await substrateApiMap[COMMON_CHAIN_SLUGS.POLKADOT].isReady;
166
166
  const kusamaAPI = await substrateApiMap[COMMON_CHAIN_SLUGS.KUSAMA].isReady;
167
- const substrateAddresses = categoryAddresses(addresses).substrate;
167
+ const substrateAddresses = getAddressesByChainType(addresses, [ChainType.SUBSTRATE]);
168
168
  const hexAddresses = substrateAddresses.map(address => {
169
169
  return registry.createType('AccountId', address).toHex();
170
170
  });
@@ -1,6 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { ChainType } from '@subwallet/extension-base/background/KoniTypes';
4
5
  import { AcalaNftApi } from '@subwallet/extension-base/koni/api/nft/acala_nft';
5
6
  import AssetHubUniquesPalletApi from '@subwallet/extension-base/koni/api/nft/assethub_unique';
6
7
  import { BitCountryNftApi } from '@subwallet/extension-base/koni/api/nft/bit.country';
@@ -10,21 +11,18 @@ import { KaruraNftApi } from '@subwallet/extension-base/koni/api/nft/karura_nft'
10
11
  import OrdinalNftApi from '@subwallet/extension-base/koni/api/nft/ordinal_nft';
11
12
  import { RmrkNftApi } from '@subwallet/extension-base/koni/api/nft/rmrk_nft';
12
13
  import { UniqueNftApi } from '@subwallet/extension-base/koni/api/nft/unique_network_nft';
13
- // import UniqueNftApi from '@subwallet/extension-base/koni/api/nft/unique_nft';
14
14
  import { VaraNftApi } from '@subwallet/extension-base/koni/api/nft/vara_nft';
15
15
  import { WasmNftApi } from '@subwallet/extension-base/koni/api/nft/wasm_nft';
16
16
  import { _NFT_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
17
17
  import { _isChainSupportEvmNft, _isChainSupportNativeNft, _isChainSupportWasmNft, _isSupportOrdinal } from '@subwallet/extension-base/services/chain-service/utils';
18
- import { categoryAddresses, targetIsWeb } from '@subwallet/extension-base/utils';
18
+ import { getAddressesByChainType, targetIsWeb } from '@subwallet/extension-base/utils';
19
19
  import AssetHubNftsPalletApi from "./assethub_nft/index.js";
20
20
  import { RariNftApi } from "./rari/index.js";
21
21
  import { OdysseyNftApi } from "./story_odyssey_nft/index.js";
22
22
  import { TernoaNftApi } from "./ternoa_nft/index.js";
23
23
  function createSubstrateNftApi(chain, substrateApi, addresses) {
24
- const {
25
- evm: evmAddresses,
26
- substrate: substrateAddresses
27
- } = categoryAddresses(addresses);
24
+ const evmAddresses = getAddressesByChainType(addresses, [ChainType.EVM]);
25
+ const substrateAddresses = getAddressesByChainType(addresses, [ChainType.SUBSTRATE]);
28
26
  if (_NFT_CHAIN_GROUP.acala.includes(chain)) {
29
27
  return [new AcalaNftApi(substrateApi, substrateAddresses, chain)];
30
28
  } else if (_NFT_CHAIN_GROUP.karura.includes(chain)) {
@@ -55,11 +53,11 @@ function createSubstrateNftApi(chain, substrateApi, addresses) {
55
53
  return null;
56
54
  }
57
55
  function createWasmNftApi(chain, apiProps, addresses) {
58
- const substrateAddresses = categoryAddresses(addresses).substrate;
56
+ const substrateAddresses = getAddressesByChainType(addresses, [ChainType.SUBSTRATE]);
59
57
  return new WasmNftApi(apiProps, substrateAddresses, chain);
60
58
  }
61
59
  function createWeb3NftApi(chain, evmApi, addresses) {
62
- const evmAddresses = categoryAddresses(addresses).evm;
60
+ const evmAddresses = getAddressesByChainType(addresses, [ChainType.EVM]);
63
61
  return new EvmNftApi(evmApi, evmAddresses, chain);
64
62
  }
65
63
  const createOrdinalApi = (chain, subscanChain, addresses) => {
@@ -93,10 +91,8 @@ export class NftHandler {
93
91
  }
94
92
  setAddresses(addresses) {
95
93
  this.addresses = addresses;
96
- const {
97
- evm: evmAddresses,
98
- substrate: substrateAddresses
99
- } = categoryAddresses(addresses);
94
+ const evmAddresses = getAddressesByChainType(addresses, [ChainType.EVM]);
95
+ const substrateAddresses = getAddressesByChainType(addresses, [ChainType.SUBSTRATE]);
100
96
  for (const handler of this.handlers) {
101
97
  const useAddresses = handler.isEthereum ? evmAddresses : substrateAddresses;
102
98
  handler.setAddresses(useAddresses);
@@ -121,10 +117,8 @@ export class NftHandler {
121
117
  if (this.needSetupApi) {
122
118
  // setup connections for first time use
123
119
  this.handlers = [];
124
- const {
125
- evm: evmAddresses,
126
- substrate: substrateAddresses
127
- } = categoryAddresses(this.addresses);
120
+ const evmAddresses = getAddressesByChainType(this.addresses, [ChainType.EVM]);
121
+ const substrateAddresses = getAddressesByChainType(this.addresses, [ChainType.SUBSTRATE]);
128
122
  Object.entries(this.chainInfoMap).forEach(([chain, chainInfo]) => {
129
123
  if (_isChainSupportNativeNft(chainInfo)) {
130
124
  if (this.substrateApiMap[chain]) {
@@ -35,6 +35,6 @@ export declare class OdysseyNftApi extends BaseNftApi {
35
35
  private processNftItem;
36
36
  handleNfts(params: HandleNftParams): Promise<void>;
37
37
  fetchNftsWithDetail(address: string): Promise<OdysseyToken[] | null>;
38
- fetchNfts(params: HandleNftParams): Promise<0 | 1>;
38
+ fetchNfts(params: HandleNftParams): Promise<1 | 0>;
39
39
  }
40
40
  export {};
@@ -1,19 +1,18 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { ChainType } from '@subwallet/extension-base/background/KoniTypes';
4
5
  import { getAmplitudeStakingOnChain, getAstarStakingOnChain, getParaStakingOnChain } from '@subwallet/extension-base/koni/api/staking/paraChain';
5
6
  import { getNominationPoolReward, getRelayPoolingOnChain, getRelayStakingOnChain } from '@subwallet/extension-base/koni/api/staking/relayChain';
6
7
  import { getAllSubsquidStaking } from '@subwallet/extension-base/koni/api/staking/subsquidStaking';
7
8
  import { _PURE_EVM_CHAINS } from '@subwallet/extension-base/services/chain-service/constants';
8
9
  import { _isChainEvmCompatible, _isChainSupportSubstrateStaking, _isSubstrateRelayChain } from '@subwallet/extension-base/services/chain-service/utils';
9
10
  import { _STAKING_CHAIN_GROUP } from '@subwallet/extension-base/services/earning-service/constants';
10
- import { categoryAddresses } from '@subwallet/extension-base/utils';
11
+ import { getAddressesByChainType } from '@subwallet/extension-base/utils';
11
12
  export function stakingOnChainApi(addresses, substrateApiMap, chainInfoMap, stakingCallback, nominatorStateCallback) {
12
13
  const filteredApiMap = [];
13
- const {
14
- evm: evmAddresses,
15
- substrate: substrateAddresses
16
- } = categoryAddresses(addresses);
14
+ const evmAddresses = getAddressesByChainType(addresses, [ChainType.EVM]);
15
+ const substrateAddresses = getAddressesByChainType(addresses, [ChainType.SUBSTRATE]);
17
16
  Object.entries(chainInfoMap).forEach(([networkKey, chainInfo]) => {
18
17
  if (_PURE_EVM_CHAINS.indexOf(networkKey) < 0 && _isChainSupportSubstrateStaking(chainInfo)) {
19
18
  filteredApiMap.push({
@@ -77,6 +77,9 @@ export default class KoniExtension {
77
77
  private subscribeSettings;
78
78
  private setEnableChainPatrol;
79
79
  private saveNotificationSetup;
80
+ private saveMigrationAcknowledgedStatus;
81
+ private saveUnifiedAccountMigrationInProgress;
82
+ private pingUnifiedAccountMigrationDone;
80
83
  private setShowZeroBalance;
81
84
  private setLanguage;
82
85
  private setShowBalance;
@@ -149,8 +152,10 @@ export default class KoniExtension {
149
152
  private resolveQrTransfer;
150
153
  private subscribeConfirmations;
151
154
  private subscribeConfirmationsTon;
155
+ private subscribeConfirmationsCardano;
152
156
  private completeConfirmation;
153
157
  private completeConfirmationTon;
158
+ private completeConfirmationCardano;
154
159
  private getNetworkJsonByChainId;
155
160
  private parseSubstrateTransaction;
156
161
  private parseEVMRLP;
@@ -250,6 +255,7 @@ export default class KoniExtension {
250
255
  private subscribeBuyTokens;
251
256
  private subscribeBuyServices;
252
257
  private subscribeSwapPairs;
258
+ private generateOptimalProcess;
253
259
  private handleSwapRequest;
254
260
  private getLatestSwapQuote;
255
261
  private validateSwapProcess;
@@ -268,5 +274,8 @@ export default class KoniExtension {
268
274
  private createPassConfirmationParams;
269
275
  private subscribeProcessById;
270
276
  private subscribeProcessAlive;
277
+ private migrateUnifiedAndFetchEligibleSoloAccounts;
278
+ private migrateSoloAccount;
279
+ private pingSession;
271
280
  handle<TMessageType extends MessageTypes>(id: string, type: TMessageType, request: RequestTypes[TMessageType], port: chrome.runtime.Port): Promise<ResponseType<TMessageType>>;
272
281
  }