@subwallet/extension-base 1.1.53-0 → 1.1.53-beta.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 (94) hide show
  1. package/background/KoniTypes.d.ts +9 -1
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/SwapError.d.ts +6 -0
  4. package/background/errors/SwapError.js +57 -0
  5. package/background/errors/TransactionError.js +9 -0
  6. package/cjs/background/KoniTypes.js +1 -0
  7. package/cjs/background/errors/SwapError.js +64 -0
  8. package/cjs/background/errors/TransactionError.js +9 -0
  9. package/cjs/koni/api/dotsama/balance.js +464 -0
  10. package/cjs/koni/api/nft/ordinal_nft/utils.js +41 -0
  11. package/cjs/koni/api/staking/bonding/utils.js +35 -6
  12. package/cjs/koni/background/handlers/Extension.js +85 -0
  13. package/cjs/koni/background/handlers/State.js +25 -5
  14. package/cjs/services/balance-service/helpers/subscribe/balance.js +140 -0
  15. package/cjs/services/balance-service/index.js +6 -3
  16. package/cjs/services/chain-service/constants.js +1 -1
  17. package/cjs/services/chain-service/index.js +43 -18
  18. package/cjs/services/chain-service/utils/index.js +7 -2
  19. package/cjs/services/chain-service/utils/patch.js +1 -1
  20. package/cjs/services/chain-service/utils.js +506 -0
  21. package/cjs/services/earning-service/constants/chains.js +4 -2
  22. package/cjs/services/earning-service/handlers/native-staking/astar.js +4 -3
  23. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +22 -3
  24. package/cjs/services/migration-service/scripts/MigrateEthProvider.js +17 -0
  25. package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +17 -0
  26. package/cjs/services/migration-service/scripts/MigrateProvider.js +29 -0
  27. package/cjs/services/storage-service/index.js +241 -0
  28. package/cjs/services/swap-service/handler/base-handler.js +171 -0
  29. package/cjs/services/swap-service/handler/chainflip-handler.js +407 -0
  30. package/cjs/services/swap-service/handler/hydradx-handler.js +444 -0
  31. package/cjs/services/swap-service/index.js +249 -0
  32. package/cjs/services/swap-service/utils.js +126 -0
  33. package/cjs/services/transaction-service/index.js +20 -0
  34. package/cjs/services/transaction-service/utils.js +6 -0
  35. package/cjs/types/balance.js +1 -0
  36. package/cjs/types/fee/evm.js +1 -0
  37. package/cjs/types/fee/fee.js +70 -0
  38. package/cjs/types/fee/index.js +27 -1
  39. package/cjs/types/service-base.js +1 -0
  40. package/cjs/types/swap/index.js +50 -0
  41. package/cjs/types.js +1 -0
  42. package/cjs/utils/address.js +34 -0
  43. package/cjs/utils/index.js +12 -0
  44. package/cjs/utils/keyring.js +57 -0
  45. package/cjs/utils/swap.js +78 -0
  46. package/koni/api/staking/bonding/utils.d.ts +3 -1
  47. package/koni/api/staking/bonding/utils.js +32 -6
  48. package/koni/background/handlers/Extension.d.ts +5 -0
  49. package/koni/background/handlers/Extension.js +85 -0
  50. package/koni/background/handlers/State.d.ts +2 -0
  51. package/koni/background/handlers/State.js +26 -6
  52. package/package.json +60 -3
  53. package/services/balance-service/index.js +6 -3
  54. package/services/base/types.d.ts +4 -0
  55. package/services/chain-service/constants.js +1 -1
  56. package/services/chain-service/index.d.ts +4 -0
  57. package/services/chain-service/index.js +24 -0
  58. package/services/chain-service/utils/index.d.ts +6 -5
  59. package/services/chain-service/utils/index.js +5 -2
  60. package/services/chain-service/utils/patch.js +1 -1
  61. package/services/earning-service/constants/chains.d.ts +1 -0
  62. package/services/earning-service/constants/chains.js +1 -0
  63. package/services/earning-service/handlers/native-staking/astar.js +4 -3
  64. package/services/earning-service/handlers/native-staking/relay-chain.js +24 -5
  65. package/services/event-service/types.d.ts +1 -0
  66. package/services/swap-service/handler/base-handler.d.ts +38 -0
  67. package/services/swap-service/handler/base-handler.js +162 -0
  68. package/services/swap-service/handler/chainflip-handler.d.ts +30 -0
  69. package/services/swap-service/handler/chainflip-handler.js +399 -0
  70. package/services/swap-service/handler/hydradx-handler.d.ts +36 -0
  71. package/services/swap-service/handler/hydradx-handler.js +435 -0
  72. package/services/swap-service/index.d.ts +32 -0
  73. package/services/swap-service/index.js +240 -0
  74. package/services/swap-service/utils.d.ts +18 -0
  75. package/services/swap-service/utils.js +105 -0
  76. package/services/transaction-service/index.js +20 -0
  77. package/services/transaction-service/utils.d.ts +2 -0
  78. package/services/transaction-service/utils.js +6 -2
  79. package/types/fee/evm.d.ts +49 -0
  80. package/types/fee/evm.js +1 -0
  81. package/types/fee/fee.d.ts +32 -0
  82. package/types/fee/fee.js +63 -0
  83. package/types/fee/index.d.ts +2 -49
  84. package/types/fee/index.js +5 -1
  85. package/types/service-base.d.ts +10 -0
  86. package/types/service-base.js +1 -0
  87. package/types/swap/index.d.ts +166 -0
  88. package/types/swap/index.js +41 -0
  89. package/types/yield/info/chain/target.d.ts +2 -0
  90. package/types/yield/info/pallet.d.ts +4 -0
  91. package/utils/index.d.ts +1 -0
  92. package/utils/index.js +2 -1
  93. package/utils/swap.d.ts +3 -0
  94. package/utils/swap.js +70 -0
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.SWAP_QUOTE_TIMEOUT_MAP = exports.MOCK_SWAP_FEE = exports.DEFAULT_SWAP_FIRST_STEP = exports.CHAIN_FLIP_TESTNET_EXPLORER = exports.CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = exports.CHAIN_FLIP_MAINNET_EXPLORER = void 0;
8
+ exports.calculateSwapRate = calculateSwapRate;
9
+ exports.getChainflipEarlyValidationError = getChainflipEarlyValidationError;
10
+ exports.getEarlyHydradxValidationError = getEarlyHydradxValidationError;
11
+ exports.getSwapAltToken = getSwapAltToken;
12
+ exports.getSwapAlternativeAsset = getSwapAlternativeAsset;
13
+ var _swap = require("@chainflip/sdk/swap");
14
+ var _chainList = require("@subwallet/chain-list");
15
+ var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
16
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
17
+ var _swap2 = require("@subwallet/extension-base/types/swap");
18
+ var _utils2 = require("@subwallet/extension-base/utils");
19
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
20
+ // Copyright 2019-2022 @subwallet/extension-base
21
+ // SPDX-License-Identifier: Apache-2.0
22
+
23
+ const CHAIN_FLIP_TESTNET_EXPLORER = 'https://blocks-perseverance.chainflip.io';
24
+ exports.CHAIN_FLIP_TESTNET_EXPLORER = CHAIN_FLIP_TESTNET_EXPLORER;
25
+ const CHAIN_FLIP_MAINNET_EXPLORER = 'https://scan.chainflip.io';
26
+ exports.CHAIN_FLIP_MAINNET_EXPLORER = CHAIN_FLIP_MAINNET_EXPLORER;
27
+ const CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = {
28
+ [_chainList.COMMON_CHAIN_SLUGS.POLKADOT]: _swap.Chains.Polkadot,
29
+ [_chainList.COMMON_CHAIN_SLUGS.ETHEREUM]: _swap.Chains.Ethereum
30
+ };
31
+ exports.CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING;
32
+ const CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = {
33
+ [_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA]: _swap.Chains.Ethereum,
34
+ [_chainList.COMMON_CHAIN_SLUGS.CHAINFLIP_POLKADOT]: _swap.Chains.Polkadot
35
+ };
36
+ exports.CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING;
37
+ const CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = {
38
+ [_chainList.COMMON_ASSETS.DOT]: _swap.Assets.DOT,
39
+ [_chainList.COMMON_ASSETS.ETH]: _swap.Assets.ETH,
40
+ [_chainList.COMMON_ASSETS.USDC_ETHEREUM]: _swap.Assets.USDC
41
+ };
42
+ exports.CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING;
43
+ const CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = {
44
+ [_chainList.COMMON_ASSETS.PDOT]: _swap.Assets.DOT,
45
+ [_chainList.COMMON_ASSETS.ETH_SEPOLIA]: _swap.Assets.ETH,
46
+ [_chainList.COMMON_ASSETS.USDC_SEPOLIA]: _swap.Assets.USDC
47
+ };
48
+ exports.CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING;
49
+ const SWAP_QUOTE_TIMEOUT_MAP = {
50
+ // in milliseconds
51
+ default: 30000,
52
+ [_swap2.SwapProviderId.CHAIN_FLIP_TESTNET]: 30000,
53
+ [_swap2.SwapProviderId.CHAIN_FLIP_MAINNET]: 30000
54
+ };
55
+ exports.SWAP_QUOTE_TIMEOUT_MAP = SWAP_QUOTE_TIMEOUT_MAP;
56
+ const DEFAULT_SWAP_FIRST_STEP = {
57
+ id: 0,
58
+ name: 'Fill information',
59
+ type: _swap2.SwapStepType.DEFAULT
60
+ };
61
+ exports.DEFAULT_SWAP_FIRST_STEP = DEFAULT_SWAP_FIRST_STEP;
62
+ const MOCK_SWAP_FEE = {
63
+ feeComponent: [],
64
+ defaultFeeToken: '',
65
+ feeOptions: []
66
+ };
67
+ exports.MOCK_SWAP_FEE = MOCK_SWAP_FEE;
68
+ function getSwapAlternativeAsset(swapPair) {
69
+ var _swapPair$metadata;
70
+ return swapPair === null || swapPair === void 0 ? void 0 : (_swapPair$metadata = swapPair.metadata) === null || _swapPair$metadata === void 0 ? void 0 : _swapPair$metadata.alternativeAsset;
71
+ }
72
+ function getSwapAltToken(chainAsset) {
73
+ var _chainAsset$metadata;
74
+ return (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.alternativeSwapAsset;
75
+ }
76
+ function calculateSwapRate(fromAmount, toAmount, fromAsset, toAsset) {
77
+ const bnFromAmount = new _bignumber.default(fromAmount);
78
+ const bnToAmount = new _bignumber.default(toAmount);
79
+ const decimalDiff = (0, _utils._getAssetDecimals)(toAsset) - (0, _utils._getAssetDecimals)(fromAsset);
80
+ const bnRate = bnFromAmount.div(bnToAmount);
81
+ return 1 / bnRate.times(10 ** decimalDiff).toNumber();
82
+ }
83
+ function getChainflipEarlyValidationError(error, metadata) {
84
+ // todo: support more providers
85
+ switch (error) {
86
+ case _swap2.SwapErrorType.NOT_MEET_MIN_SWAP:
87
+ {
88
+ const parsedMinSwapValue = (0, _utils2.formatNumber)(metadata.minSwap.value, metadata.minSwap.decimals);
89
+ const message = `Amount too low. Increase your amount above ${parsedMinSwapValue} ${metadata.minSwap.symbol} and try again`;
90
+ return new _SwapError.SwapError(error, message);
91
+ }
92
+ case _swap2.SwapErrorType.SWAP_EXCEED_ALLOWANCE:
93
+ {
94
+ if (metadata.maxSwap) {
95
+ const parsedMaxSwapValue = (0, _utils2.formatNumber)(metadata.maxSwap.value, metadata.maxSwap.decimals);
96
+ return new _SwapError.SwapError(error, `Amount too high. Lower your amount below ${parsedMaxSwapValue} ${metadata.maxSwap.symbol} and try again`);
97
+ } else {
98
+ return new _SwapError.SwapError(error, 'Amount too high. Lower your amount and try again');
99
+ }
100
+ }
101
+ case _swap2.SwapErrorType.ASSET_NOT_SUPPORTED:
102
+ return new _SwapError.SwapError(error, 'This swap pair is not supported');
103
+ case _swap2.SwapErrorType.UNKNOWN:
104
+ return new _SwapError.SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`);
105
+ case _swap2.SwapErrorType.ERROR_FETCHING_QUOTE:
106
+ return new _SwapError.SwapError(error, 'No swap quote found. Adjust your amount or try again later.');
107
+ default:
108
+ return new _SwapError.SwapError(error);
109
+ }
110
+ }
111
+ function getEarlyHydradxValidationError(error, metadata) {
112
+ switch (error) {
113
+ case _swap2.SwapErrorType.AMOUNT_CANNOT_BE_ZERO:
114
+ {
115
+ return new _SwapError.SwapError(error, 'Amount too low. Increase your amount above 0 and try again');
116
+ }
117
+ case _swap2.SwapErrorType.ASSET_NOT_SUPPORTED:
118
+ return new _SwapError.SwapError(error, 'This swap pair is not supported');
119
+ case _swap2.SwapErrorType.UNKNOWN:
120
+ return new _SwapError.SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`);
121
+ case _swap2.SwapErrorType.ERROR_FETCHING_QUOTE:
122
+ return new _SwapError.SwapError(error, 'No swap quote found. Adjust your amount or try again later.');
123
+ default:
124
+ return new _SwapError.SwapError(error);
125
+ }
126
+ }
@@ -646,6 +646,18 @@ class TransactionService {
646
646
  };
647
647
  break;
648
648
  }
649
+ case _KoniTypes.ExtrinsicType.SWAP:
650
+ {
651
+ const data = (0, _utils3.parseTransactionData)(transaction.data); // TODO: switch by provider
652
+ const inputAsset = this.state.chainService.getAssetBySlug(data.quote.pair.from);
653
+ historyItem.amount = {
654
+ value: data.quote.fromAmount,
655
+ symbol: (0, _utils._getAssetSymbol)(inputAsset),
656
+ decimals: (0, _utils._getAssetDecimals)(inputAsset)
657
+ };
658
+ historyItem.additionalInfo = data;
659
+ break;
660
+ }
649
661
  case _KoniTypes.ExtrinsicType.UNKNOWN:
650
662
  break;
651
663
  }
@@ -742,6 +754,14 @@ class TransactionService {
742
754
  }
743
755
  } else if ([_KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.STAKING_UNBOND, _KoniTypes.ExtrinsicType.STAKING_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) {
744
756
  this.state.eventService.emit('transaction.submitStaking', transaction.chain);
757
+ } else if (transaction.extrinsicType === _KoniTypes.ExtrinsicType.SWAP) {
758
+ const inputData = (0, _utils3.parseTransactionData)(transaction.data);
759
+ const toAssetSlug = inputData.quote.pair.to;
760
+
761
+ // todo: consider async
762
+ this.state.chainService.updateAssetSetting(toAssetSlug, {
763
+ visible: true
764
+ }, true).catch(console.error);
745
765
  }
746
766
  }
747
767
  onSuccess(_ref4) {
@@ -3,9 +3,11 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.getChainflipExplorerLink = getChainflipExplorerLink;
6
7
  exports.getExplorerLink = getExplorerLink;
7
8
  exports.parseTransactionData = parseTransactionData;
8
9
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
10
+ var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
9
11
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
10
12
  // SPDX-License-Identifier: Apache-2.0
11
13
 
@@ -53,4 +55,8 @@ function getExplorerLink(chainInfo, value, type) {
53
55
  return `${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}${route}/${value}`;
54
56
  }
55
57
  return undefined;
58
+ }
59
+ function getChainflipExplorerLink(data, chainInfo) {
60
+ const chainflipDomain = (0, _utils._isChainTestNet)(chainInfo) ? _utils2.CHAIN_FLIP_TESTNET_EXPLORER : _utils2.CHAIN_FLIP_MAINNET_EXPLORER;
61
+ return `${chainflipDomain}/channels/${data.depositChannelId}`;
56
62
  }
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SWFeeType = exports.SWFee = void 0;
7
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
8
+ // Copyright 2019-2022 @subwallet/extension-base
9
+ // SPDX-License-Identifier: Apache-2.0
10
+ let SWFeeType;
11
+ exports.SWFeeType = SWFeeType;
12
+ (function (SWFeeType) {
13
+ SWFeeType["EIP_1559"] = "EIP_1559";
14
+ SWFeeType["LEGACY"] = "LEGACY";
15
+ SWFeeType["SUBSTRATE"] = "SUBSTRATE";
16
+ })(SWFeeType || (exports.SWFeeType = SWFeeType = {}));
17
+ class SWFee {
18
+ get transactionId() {
19
+ return this._transactionId;
20
+ }
21
+ get selectedFeeOption() {
22
+ return this._selectedFeeOption;
23
+ }
24
+ static build(feeOptions, chain, selectedFeeOption) {
25
+ // todo: might need to parse metadata depending on the type
26
+ if (selectedFeeOption) {
27
+ return new SWFee(feeOptions, chain, selectedFeeOption);
28
+ } else {
29
+ const defaultFeeOption = feeOptions.find(option => option.isDefault);
30
+ return new SWFee(feeOptions, chain, defaultFeeOption);
31
+ }
32
+ }
33
+ static buildSimpleFee(tokenInfo, amount, type) {
34
+ // used for simple transaction paid in native tokens
35
+ const defaultOption = {
36
+ tokenInfo,
37
+ isDefault: (0, _utils._isNativeToken)(tokenInfo),
38
+ // if it's the native token of the chain
39
+ amount,
40
+ type
41
+ };
42
+ return new SWFee([defaultOption], tokenInfo.originChain, defaultOption);
43
+ }
44
+ static buildFeeOption(tokenInfo, amount, type) {
45
+ // todo: calculate totalFeeValue
46
+ // todo: implement more logic to handle complicated transaction process
47
+ return {
48
+ tokenInfo,
49
+ isDefault: (0, _utils._isNativeToken)(tokenInfo),
50
+ // if it's the native token of the chain
51
+ amount,
52
+ type
53
+ };
54
+ }
55
+ setTransactionId(transactionId) {
56
+ this._transactionId = transactionId;
57
+ }
58
+ setSelectedFeeOption(feeOption) {
59
+ this._selectedFeeOption = feeOption;
60
+ }
61
+ constructor(feeOptions, chain, selectedFeeOption) {
62
+ this.chain = chain;
63
+ this.feeOptions = feeOptions;
64
+ this._selectedFeeOption = selectedFeeOption;
65
+ }
66
+ getDefaultFeeOption() {
67
+ return this.feeOptions.find(option => option.isDefault);
68
+ }
69
+ }
70
+ exports.SWFee = SWFee;
@@ -1 +1,27 @@
1
- "use strict";
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _evm = require("./evm");
7
+ Object.keys(_evm).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _evm[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _evm[key];
14
+ }
15
+ });
16
+ });
17
+ var _fee = require("./fee");
18
+ Object.keys(_fee).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _fee[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _fee[key];
25
+ }
26
+ });
27
+ });
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports._SUPPORTED_SWAP_PROVIDERS = exports.SwapStepType = exports.SwapProviderId = exports.SwapFeeType = exports.SwapErrorType = void 0;
7
+ // Copyright 2019-2022 @subwallet/extension-base
8
+ // SPDX-License-Identifier: Apache-2.0
9
+ // core
10
+ let SwapErrorType;
11
+ exports.SwapErrorType = SwapErrorType;
12
+ (function (SwapErrorType) {
13
+ SwapErrorType["ERROR_FETCHING_QUOTE"] = "ERROR_FETCHING_QUOTE";
14
+ SwapErrorType["NOT_MEET_MIN_SWAP"] = "NOT_MEET_MIN_SWAP";
15
+ SwapErrorType["UNKNOWN"] = "UNKNOWN";
16
+ SwapErrorType["ASSET_NOT_SUPPORTED"] = "ASSET_NOT_SUPPORTED";
17
+ SwapErrorType["QUOTE_TIMEOUT"] = "QUOTE_TIMEOUT";
18
+ SwapErrorType["INVALID_RECIPIENT"] = "INVALID_RECIPIENT";
19
+ SwapErrorType["SWAP_EXCEED_ALLOWANCE"] = "SWAP_EXCEED_ALLOWANCE";
20
+ SwapErrorType["SWAP_NOT_ENOUGH_BALANCE"] = "SWAP_NOT_ENOUGH_BALANCE";
21
+ SwapErrorType["NOT_ENOUGH_LIQUIDITY"] = "NOT_ENOUGH_LIQUIDITY";
22
+ SwapErrorType["AMOUNT_CANNOT_BE_ZERO"] = "AMOUNT_CANNOT_BE_ZERO";
23
+ })(SwapErrorType || (exports.SwapErrorType = SwapErrorType = {}));
24
+ let SwapStepType;
25
+ exports.SwapStepType = SwapStepType;
26
+ (function (SwapStepType) {
27
+ SwapStepType["DEFAULT"] = "DEFAULT";
28
+ SwapStepType["TOKEN_APPROVAL"] = "TOKEN_APPROVAL";
29
+ SwapStepType["SET_FEE_TOKEN"] = "SET_FEE_TOKEN";
30
+ SwapStepType["SWAP"] = "SWAP";
31
+ SwapStepType["XCM"] = "XCM";
32
+ })(SwapStepType || (exports.SwapStepType = SwapStepType = {}));
33
+ let SwapProviderId;
34
+ exports.SwapProviderId = SwapProviderId;
35
+ (function (SwapProviderId) {
36
+ SwapProviderId["CHAIN_FLIP_TESTNET"] = "CHAIN_FLIP_TESTNET";
37
+ SwapProviderId["CHAIN_FLIP_MAINNET"] = "CHAIN_FLIP_MAINNET";
38
+ SwapProviderId["HYDRADX_MAINNET"] = "HYDRADX_MAINNET";
39
+ SwapProviderId["HYDRADX_TESTNET"] = "HYDRADX_TESTNET";
40
+ })(SwapProviderId || (exports.SwapProviderId = SwapProviderId = {}));
41
+ const _SUPPORTED_SWAP_PROVIDERS = [SwapProviderId.CHAIN_FLIP_TESTNET, SwapProviderId.CHAIN_FLIP_MAINNET, SwapProviderId.HYDRADX_MAINNET, SwapProviderId.HYDRADX_TESTNET];
42
+ exports._SUPPORTED_SWAP_PROVIDERS = _SUPPORTED_SWAP_PROVIDERS;
43
+ // process handling
44
+ let SwapFeeType;
45
+ exports.SwapFeeType = SwapFeeType;
46
+ (function (SwapFeeType) {
47
+ SwapFeeType["PLATFORM_FEE"] = "PLATFORM_FEE";
48
+ SwapFeeType["NETWORK_FEE"] = "NETWORK_FEE";
49
+ SwapFeeType["WALLET_FEE"] = "WALLET_FEE";
50
+ })(SwapFeeType || (exports.SwapFeeType = SwapFeeType = {}));
package/cjs/types.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.convertSubjectInfoToAddresses = void 0;
7
+ exports.quickFormatAddressToCompare = quickFormatAddressToCompare;
8
+ exports.simpleAddress = void 0;
9
+ var _index = require("@subwallet/extension-base/utils/index");
10
+ var _utilCrypto = require("@polkadot/util-crypto");
11
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
12
+ // SPDX-License-Identifier: Apache-2.0
13
+
14
+ const simpleAddress = address => {
15
+ if ((0, _utilCrypto.isEthereumAddress)(address)) {
16
+ return address;
17
+ }
18
+ return (0, _utilCrypto.encodeAddress)((0, _utilCrypto.decodeAddress)(address));
19
+ };
20
+ exports.simpleAddress = simpleAddress;
21
+ function quickFormatAddressToCompare(address) {
22
+ if (!(0, _utilCrypto.isAddress)(address)) {
23
+ return address;
24
+ }
25
+ return (0, _index.reformatAddress)(address, 42).toLowerCase();
26
+ }
27
+ const convertSubjectInfoToAddresses = subjectInfo => {
28
+ return Object.values(subjectInfo).map(info => ({
29
+ address: info.json.address,
30
+ type: info.type,
31
+ ...info.json.meta
32
+ }));
33
+ };
34
+ exports.convertSubjectInfoToAddresses = convertSubjectInfoToAddresses;
@@ -236,6 +236,18 @@ Object.keys(_fetchEvmChainInfo).forEach(function (key) {
236
236
  }
237
237
  });
238
238
  });
239
+ var _swap = require("./swap");
240
+ Object.keys(_swap).forEach(function (key) {
241
+ if (key === "default" || key === "__esModule") return;
242
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
243
+ if (key in exports && exports[key] === _swap[key]) return;
244
+ Object.defineProperty(exports, key, {
245
+ enumerable: true,
246
+ get: function () {
247
+ return _swap[key];
248
+ }
249
+ });
250
+ });
239
251
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
240
252
  // SPDX-License-Identifier: Apache-2.0
241
253
 
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractPrivateKey = extractPrivateKey;
7
+ exports.unlockAccount = exports.lockAccount = void 0;
8
+ var _uiKeyring = require("@subwallet/ui-keyring");
9
+ // Copyright 2019-2022 @subwallet/extension-base
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ // import _decode from '@polkadot/keyring/pair/decode';
13
+
14
+ function extract(address) {
15
+ // @ts-ignore
16
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
17
+ const rs = this.getPair(address);
18
+
19
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
20
+ console.log(rs.publicKey);
21
+ }
22
+ function extractPrivateKey(keyring, address, password) {
23
+ extract.call(keyring, address);
24
+ }
25
+ const unlockAccount = signAddress => {
26
+ let publicKey;
27
+ try {
28
+ publicKey = _uiKeyring.keyring.decodeAddress(signAddress);
29
+ } catch (error) {
30
+ console.error(error);
31
+ return 'Unable to decode address';
32
+ }
33
+ const pair = _uiKeyring.keyring.getPair(publicKey);
34
+ if (!pair) {
35
+ return 'Unable to find pair';
36
+ }
37
+ if (pair.isLocked) {
38
+ try {
39
+ _uiKeyring.keyring.unlockPair(pair.address);
40
+ } catch (e) {
41
+ return e.message;
42
+ }
43
+ }
44
+ return null;
45
+ };
46
+ exports.unlockAccount = unlockAccount;
47
+ const lockAccount = address => {
48
+ try {
49
+ const pair = _uiKeyring.keyring.getPair(address);
50
+ if (pair) {
51
+ pair.lock();
52
+ }
53
+ } catch (error) {
54
+ console.error('Unable to lock account', error);
55
+ }
56
+ };
57
+ exports.lockAccount = lockAccount;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.swapCustomFormatter = exports.formatNumberString = void 0;
8
+ var _number = require("@subwallet/extension-base/utils/number");
9
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
10
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
11
+ // SPDX-License-Identifier: Apache-2.0
12
+
13
+ // Clear zero from end, use with decimal only
14
+ const clearZero = result => {
15
+ let index = result.length - 1;
16
+ while (result[index] === '0') {
17
+ result = result.slice(0, index);
18
+ index--;
19
+ }
20
+ return result;
21
+ };
22
+ const NUM_1T = new _bignumber.default(1e12);
23
+ const TLIM = new _bignumber.default(1e17);
24
+ const NUM_1B = new _bignumber.default(1e9);
25
+ const BLIM = new _bignumber.default(1e14);
26
+ const NUM_1M = new _bignumber.default(1e6);
27
+ const NUM_100M = new _bignumber.default(1e8);
28
+ const swapCustomFormatter = (input, metadata) => {
29
+ const minNumberFormat = 2;
30
+ const maxNumberFormat = (metadata === null || metadata === void 0 ? void 0 : metadata.maxNumberFormat) || 6;
31
+ const [int, decimal = '0'] = input.split('.');
32
+ let _decimal = '';
33
+ const intNumber = new _bignumber.default(int);
34
+ const max = _number.BN_TEN.pow(maxNumberFormat);
35
+
36
+ // If count of number in integer part greater or equal maxNumberFormat, do not show decimal
37
+ if (intNumber.gte(max)) {
38
+ if (intNumber.gte(NUM_100M)) {
39
+ if (intNumber.gte(BLIM)) {
40
+ if (intNumber.gte(TLIM)) {
41
+ return `${intNumber.dividedBy(NUM_1T).toFixed()} T`;
42
+ }
43
+ return `${intNumber.dividedBy(NUM_1B).toFixed()} B`;
44
+ }
45
+ return `${intNumber.dividedBy(NUM_1M).toFixed()} M`;
46
+ }
47
+ _decimal = decimal.slice(0, metadata === null || metadata === void 0 ? void 0 : metadata.maxNumberFormat);
48
+ return `${int}.${_decimal}`;
49
+ }
50
+
51
+ // Get only minNumberFormat number at decimal
52
+ if (decimal.length <= minNumberFormat || !(metadata !== null && metadata !== void 0 && metadata.maxNumberFormat)) {
53
+ _decimal = decimal;
54
+ } else {
55
+ _decimal = decimal.slice(0, maxNumberFormat);
56
+ }
57
+
58
+ // Clear zero number for decimal
59
+ _decimal = clearZero(_decimal);
60
+ if (_decimal) {
61
+ return `${int}.${_decimal}`;
62
+ }
63
+ return int;
64
+ };
65
+ exports.swapCustomFormatter = swapCustomFormatter;
66
+ const formatNumberString = numberString => {
67
+ const number = parseFloat(numberString);
68
+ const exponentNotation = number.toExponential();
69
+ let [coefficient, exponent] = exponentNotation.split('e');
70
+ if (parseInt(exponent) < 0) {
71
+ coefficient = coefficient.replace(/^0+|\./g, '');
72
+ coefficient = '0.' + '0'.repeat(Math.abs(parseInt(exponent)) - 1) + coefficient;
73
+ } else {
74
+ coefficient += '0'.repeat(parseInt(exponent) - coefficient.length + 1);
75
+ }
76
+ return coefficient;
77
+ };
78
+ exports.formatNumberString = formatNumberString;
@@ -1,7 +1,7 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import { NominationInfo, NominatorMetadata, StakingType, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
3
3
  import { _SubstrateInflationParams } from '@subwallet/extension-base/services/chain-service/constants';
4
- import { EarningStatus, YieldPoolInfo, YieldPositionInfo } from '@subwallet/extension-base/types';
4
+ import { EarningStatus, PalletStakingEraRewardPoints, YieldPoolInfo, YieldPositionInfo } from '@subwallet/extension-base/types';
5
5
  import BigNumber from 'bignumber.js';
6
6
  import { ApiPromise } from '@polkadot/api';
7
7
  import { Codec } from '@polkadot/types/types';
@@ -158,6 +158,8 @@ export declare function getEarningStatusByNominations(bnTotalActiveStake: BN, no
158
158
  export declare function getValidatorLabel(chain: string): "dApp" | "Validator" | "Collator";
159
159
  export declare function getAvgValidatorEraReward(supportedDays: number, eraRewardHistory: Codec[]): BigNumber;
160
160
  export declare function getSupportedDaysByHistoryDepth(erasPerDay: number, maxSupportedEras: number): 15 | 30;
161
+ export declare function getValidatorPointsMap(eraRewardMap: Record<string, PalletStakingEraRewardPoints>): Record<string, BigNumber>;
162
+ export declare function getTopValidatorByPoints(validatorPointsList: Record<string, BigNumber>): string[];
161
163
  export declare const getMinStakeErrorMessage: (chainInfo: _ChainInfo, bnMinStake: BN) => string;
162
164
  export declare const getMaxValidatorErrorMessage: (chainInfo: _ChainInfo, max: number) => string;
163
165
  export declare const getExistUnstakeErrorMessage: (chain: string, type?: StakingType, isStakeMore?: boolean) => string;
@@ -197,13 +197,13 @@ export function getYieldAvailableActionsByPosition(yieldPosition, yieldPoolInfo,
197
197
  const result = [];
198
198
  if ([YieldPoolType.NATIVE_STAKING, YieldPoolType.NOMINATION_POOL].includes(yieldPoolInfo.type)) {
199
199
  result.push(YieldAction.STAKE);
200
- const bnActiveStake = new BN(yieldPosition.activeStake);
201
- if (yieldPosition.activeStake && bnActiveStake.gt(BN_ZERO)) {
200
+ const bnActiveStake = new BigNumber(yieldPosition.activeStake);
201
+ if (yieldPosition.activeStake && bnActiveStake.gt('0')) {
202
202
  result.push(YieldAction.UNSTAKE);
203
203
  const isAstarNetwork = _STAKING_CHAIN_GROUP.astar.includes(yieldPosition.chain);
204
204
  const isAmplitudeNetwork = _STAKING_CHAIN_GROUP.amplitude.includes(yieldPosition.chain);
205
- const bnUnclaimedReward = new BN(unclaimedReward || '0');
206
- if ((yieldPosition.type === YieldPoolType.NOMINATION_POOL || isAmplitudeNetwork) && bnUnclaimedReward.gt(BN_ZERO) || isAstarNetwork) {
205
+ const bnUnclaimedReward = new BigNumber(unclaimedReward || '0');
206
+ if ((yieldPosition.type === YieldPoolType.NOMINATION_POOL || isAmplitudeNetwork) && bnUnclaimedReward.gt('0') || isAstarNetwork) {
207
207
  result.push(YieldAction.CLAIM_REWARD);
208
208
  }
209
209
  }
@@ -216,8 +216,8 @@ export function getYieldAvailableActionsByPosition(yieldPosition, yieldPoolInfo,
216
216
  }
217
217
  } else if (yieldPoolInfo.type === YieldPoolType.LIQUID_STAKING) {
218
218
  result.push(YieldAction.START_EARNING);
219
- const activeBalance = new BN(yieldPosition.activeStake || '0');
220
- if (activeBalance.gt(BN_ZERO)) {
219
+ const activeBalance = new BigNumber(yieldPosition.activeStake);
220
+ if (activeBalance.gt('0')) {
221
221
  result.push(YieldAction.UNSTAKE);
222
222
  }
223
223
  const hasWithdrawal = yieldPosition.unstakings.some(unstakingInfo => unstakingInfo.status === UnstakingStatus.CLAIMABLE);
@@ -350,6 +350,32 @@ export function getSupportedDaysByHistoryDepth(erasPerDay, maxSupportedEras) {
350
350
  return 15;
351
351
  }
352
352
  }
353
+ export function getValidatorPointsMap(eraRewardMap) {
354
+ // mapping store validator and totalPoints
355
+ const validatorTotalPointsMap = {};
356
+ Object.values(eraRewardMap).forEach(info => {
357
+ const individual = info.individual;
358
+ Object.entries(individual).forEach(([validator, rawPoints]) => {
359
+ const points = rawPoints.replaceAll(',', '');
360
+ if (!validatorTotalPointsMap[validator]) {
361
+ validatorTotalPointsMap[validator] = new BigNumber(points);
362
+ } else {
363
+ validatorTotalPointsMap[validator] = validatorTotalPointsMap[validator].plus(points);
364
+ }
365
+ });
366
+ });
367
+ return validatorTotalPointsMap;
368
+ }
369
+ export function getTopValidatorByPoints(validatorPointsList) {
370
+ const sortValidatorPointsList = Object.fromEntries(Object.entries(validatorPointsList).sort((a, b) => a[1].minus(b[1]).toNumber()).reverse());
371
+
372
+ // keep 50% first validator
373
+ const entries = Object.entries(sortValidatorPointsList);
374
+ const endIndex = Math.ceil(entries.length / 2);
375
+ const top50PercentEntries = entries.slice(0, endIndex);
376
+ const top50PercentRecord = Object.fromEntries(top50PercentEntries);
377
+ return Object.keys(top50PercentRecord);
378
+ }
353
379
  export const getMinStakeErrorMessage = (chainInfo, bnMinStake) => {
354
380
  const tokenInfo = _getChainNativeTokenBasicInfo(chainInfo);
355
381
  const number = formatNumber(bnMinStake.toString(), tokenInfo.decimals || 0, balanceFormatter);
@@ -237,5 +237,10 @@ export default class KoniExtension {
237
237
  private completeCampaignBanner;
238
238
  private subscribeBuyTokens;
239
239
  private subscribeBuyServices;
240
+ private subscribeSwapPairs;
241
+ private handleSwapRequest;
242
+ private getLatestSwapQuote;
243
+ private validateSwapProcess;
244
+ private handleSwapStep;
240
245
  handle<TMessageType extends MessageTypes>(id: string, type: TMessageType, request: RequestTypes[TMessageType], port: chrome.runtime.Port): Promise<ResponseType<TMessageType>>;
241
246
  }