@shapeshiftoss/swapper 17.6.6-alpha.1 → 17.6.7

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 (93) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/constants.js +27 -18
  3. package/dist/cjs/index.d.ts +1 -0
  4. package/dist/cjs/index.js +1 -0
  5. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +2 -0
  6. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +4 -0
  7. package/dist/cjs/swappers/CetusSwapper/CetusSwapper.d.ts +2 -0
  8. package/dist/cjs/swappers/CetusSwapper/CetusSwapper.js +7 -0
  9. package/dist/cjs/swappers/CetusSwapper/endpoints.d.ts +2 -0
  10. package/dist/cjs/swappers/CetusSwapper/endpoints.js +87 -0
  11. package/dist/cjs/swappers/CetusSwapper/index.d.ts +1 -0
  12. package/dist/cjs/swappers/CetusSwapper/index.js +17 -0
  13. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.d.ts +3 -0
  14. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +122 -0
  15. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeRate.d.ts +3 -0
  16. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeRate.js +110 -0
  17. package/dist/cjs/swappers/CetusSwapper/utils/constants.d.ts +3 -0
  18. package/dist/cjs/swappers/CetusSwapper/utils/constants.js +9 -0
  19. package/dist/cjs/swappers/CetusSwapper/utils/helpers.d.ts +13 -0
  20. package/dist/cjs/swappers/CetusSwapper/utils/helpers.js +118 -0
  21. package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -0
  22. package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +43 -0
  23. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +50 -10
  24. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +65 -9
  25. package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +2 -2
  26. package/dist/cjs/swappers/NearIntentsSwapper/types.js +4 -0
  27. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.js +12 -7
  28. package/dist/cjs/swappers/RelaySwapper/RelaySwapper.js +1 -0
  29. package/dist/cjs/swappers/RelaySwapper/constant.d.ts +2 -2
  30. package/dist/cjs/swappers/RelaySwapper/constant.js +27 -36
  31. package/dist/cjs/swappers/RelaySwapper/endpoints.js +4 -0
  32. package/dist/cjs/swappers/RelaySwapper/utils/getRelayAssetAddress.js +2 -0
  33. package/dist/cjs/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.d.ts +1 -1
  34. package/dist/cjs/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.js +2 -0
  35. package/dist/cjs/swappers/RelaySwapper/utils/getRelayPsbtRelayer.js +1 -1
  36. package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +7 -2
  37. package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +15 -0
  38. package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +12 -0
  39. package/dist/cjs/tron-utils/getTronTransactionFees.d.ts +2 -0
  40. package/dist/cjs/tron-utils/getTronTransactionFees.js +14 -0
  41. package/dist/cjs/tron-utils/getUnsignedTronTransaction.d.ts +2 -0
  42. package/dist/cjs/tron-utils/getUnsignedTronTransaction.js +28 -0
  43. package/dist/cjs/types.d.ts +56 -11
  44. package/dist/cjs/types.js +1 -0
  45. package/dist/cjs/utils.d.ts +11 -3
  46. package/dist/cjs/utils.js +34 -1
  47. package/dist/esm/.tsbuildinfo +1 -1
  48. package/dist/esm/constants.js +9 -0
  49. package/dist/esm/index.d.ts +1 -0
  50. package/dist/esm/index.js +1 -0
  51. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +2 -0
  52. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +4 -0
  53. package/dist/esm/swappers/CetusSwapper/CetusSwapper.d.ts +2 -0
  54. package/dist/esm/swappers/CetusSwapper/CetusSwapper.js +4 -0
  55. package/dist/esm/swappers/CetusSwapper/endpoints.d.ts +2 -0
  56. package/dist/esm/swappers/CetusSwapper/endpoints.js +84 -0
  57. package/dist/esm/swappers/CetusSwapper/index.d.ts +1 -0
  58. package/dist/esm/swappers/CetusSwapper/index.js +1 -0
  59. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.d.ts +3 -0
  60. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +118 -0
  61. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeRate.d.ts +3 -0
  62. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeRate.js +106 -0
  63. package/dist/esm/swappers/CetusSwapper/utils/constants.d.ts +3 -0
  64. package/dist/esm/swappers/CetusSwapper/utils/constants.js +5 -0
  65. package/dist/esm/swappers/CetusSwapper/utils/helpers.d.ts +13 -0
  66. package/dist/esm/swappers/CetusSwapper/utils/helpers.js +86 -0
  67. package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +3 -1
  68. package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +43 -0
  69. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +51 -11
  70. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +66 -10
  71. package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +2 -2
  72. package/dist/esm/swappers/NearIntentsSwapper/types.js +4 -0
  73. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.js +13 -8
  74. package/dist/esm/swappers/RelaySwapper/RelaySwapper.js +2 -1
  75. package/dist/esm/swappers/RelaySwapper/constant.d.ts +2 -2
  76. package/dist/esm/swappers/RelaySwapper/constant.js +6 -15
  77. package/dist/esm/swappers/RelaySwapper/endpoints.js +4 -0
  78. package/dist/esm/swappers/RelaySwapper/utils/getRelayAssetAddress.js +4 -2
  79. package/dist/esm/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.d.ts +1 -1
  80. package/dist/esm/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.js +4 -2
  81. package/dist/esm/swappers/RelaySwapper/utils/getRelayPsbtRelayer.js +1 -1
  82. package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +8 -3
  83. package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +17 -2
  84. package/dist/esm/thorchain-utils/getL1RateOrQuote.js +12 -0
  85. package/dist/esm/tron-utils/getTronTransactionFees.d.ts +2 -0
  86. package/dist/esm/tron-utils/getTronTransactionFees.js +10 -0
  87. package/dist/esm/tron-utils/getUnsignedTronTransaction.d.ts +2 -0
  88. package/dist/esm/tron-utils/getUnsignedTronTransaction.js +24 -0
  89. package/dist/esm/types.d.ts +56 -11
  90. package/dist/esm/types.js +1 -0
  91. package/dist/esm/utils.d.ts +11 -3
  92. package/dist/esm/utils.js +31 -1
  93. package/package.json +17 -10
@@ -8,23 +8,25 @@ const BebopSwapper_1 = require("./swappers/BebopSwapper/BebopSwapper");
8
8
  const endpoints_2 = require("./swappers/BebopSwapper/endpoints");
9
9
  const ButterSwap_1 = require("./swappers/ButterSwap/ButterSwap");
10
10
  const endpoints_3 = require("./swappers/ButterSwap/endpoints");
11
+ const CetusSwapper_1 = require("./swappers/CetusSwapper/CetusSwapper");
12
+ const endpoints_4 = require("./swappers/CetusSwapper/endpoints");
11
13
  const ChainflipSwapper_1 = require("./swappers/ChainflipSwapper/ChainflipSwapper");
12
- const endpoints_4 = require("./swappers/ChainflipSwapper/endpoints");
14
+ const endpoints_5 = require("./swappers/ChainflipSwapper/endpoints");
13
15
  const CowSwapper_1 = require("./swappers/CowSwapper/CowSwapper");
14
- const endpoints_5 = require("./swappers/CowSwapper/endpoints");
15
- const endpoints_6 = require("./swappers/JupiterSwapper/endpoints");
16
+ const endpoints_6 = require("./swappers/CowSwapper/endpoints");
17
+ const endpoints_7 = require("./swappers/JupiterSwapper/endpoints");
16
18
  const JupiterSwapper_1 = require("./swappers/JupiterSwapper/JupiterSwapper");
17
- const endpoints_7 = require("./swappers/MayachainSwapper/endpoints");
19
+ const endpoints_8 = require("./swappers/MayachainSwapper/endpoints");
18
20
  const MayachainSwapper_1 = require("./swappers/MayachainSwapper/MayachainSwapper");
19
- const endpoints_8 = require("./swappers/NearIntentsSwapper/endpoints");
21
+ const endpoints_9 = require("./swappers/NearIntentsSwapper/endpoints");
20
22
  const NearIntentsSwapper_1 = require("./swappers/NearIntentsSwapper/NearIntentsSwapper");
21
- const endpoints_9 = require("./swappers/PortalsSwapper/endpoints");
23
+ const endpoints_10 = require("./swappers/PortalsSwapper/endpoints");
22
24
  const PortalsSwapper_1 = require("./swappers/PortalsSwapper/PortalsSwapper");
23
25
  const RelaySwapper_1 = require("./swappers/RelaySwapper");
24
- const endpoints_10 = require("./swappers/RelaySwapper/endpoints");
25
- const endpoints_11 = require("./swappers/ThorchainSwapper/endpoints");
26
+ const endpoints_11 = require("./swappers/RelaySwapper/endpoints");
27
+ const endpoints_12 = require("./swappers/ThorchainSwapper/endpoints");
26
28
  const ThorchainSwapper_1 = require("./swappers/ThorchainSwapper/ThorchainSwapper");
27
- const endpoints_12 = require("./swappers/ZrxSwapper/endpoints");
29
+ const endpoints_13 = require("./swappers/ZrxSwapper/endpoints");
28
30
  const ZrxSwapper_1 = require("./swappers/ZrxSwapper/ZrxSwapper");
29
31
  const types_1 = require("./types");
30
32
  const utils_2 = require("./utils");
@@ -38,19 +40,19 @@ exports.QUOTE_TIMEOUT_ERROR = (0, utils_2.makeSwapErrorRight)({
38
40
  exports.swappers = {
39
41
  [types_1.SwapperName.Thorchain]: {
40
42
  ...ThorchainSwapper_1.thorchainSwapper,
41
- ...endpoints_11.thorchainApi,
43
+ ...endpoints_12.thorchainApi,
42
44
  },
43
45
  [types_1.SwapperName.Mayachain]: {
44
46
  ...MayachainSwapper_1.mayachainSwapper,
45
- ...endpoints_7.mayachainApi,
47
+ ...endpoints_8.mayachainApi,
46
48
  },
47
49
  [types_1.SwapperName.Zrx]: {
48
50
  ...ZrxSwapper_1.zrxSwapper,
49
- ...endpoints_12.zrxApi,
51
+ ...endpoints_13.zrxApi,
50
52
  },
51
53
  [types_1.SwapperName.CowSwap]: {
52
54
  ...CowSwapper_1.cowSwapper,
53
- ...endpoints_5.cowApi,
55
+ ...endpoints_6.cowApi,
54
56
  },
55
57
  [types_1.SwapperName.ArbitrumBridge]: {
56
58
  ...ArbitrumBridgeSwapper_1.arbitrumBridgeSwapper,
@@ -58,19 +60,19 @@ exports.swappers = {
58
60
  },
59
61
  [types_1.SwapperName.Portals]: {
60
62
  ...PortalsSwapper_1.portalsSwapper,
61
- ...endpoints_9.portalsApi,
63
+ ...endpoints_10.portalsApi,
62
64
  },
63
65
  [types_1.SwapperName.Chainflip]: {
64
66
  ...ChainflipSwapper_1.chainflipSwapper,
65
- ...endpoints_4.chainflipApi,
67
+ ...endpoints_5.chainflipApi,
66
68
  },
67
69
  [types_1.SwapperName.Jupiter]: {
68
70
  ...JupiterSwapper_1.jupiterSwapper,
69
- ...endpoints_6.jupiterApi,
71
+ ...endpoints_7.jupiterApi,
70
72
  },
71
73
  [types_1.SwapperName.Relay]: {
72
74
  ...RelaySwapper_1.relaySwapper,
73
- ...endpoints_10.relayApi,
75
+ ...endpoints_11.relayApi,
74
76
  },
75
77
  [types_1.SwapperName.ButterSwap]: {
76
78
  ...ButterSwap_1.butterSwap,
@@ -82,7 +84,11 @@ exports.swappers = {
82
84
  },
83
85
  [types_1.SwapperName.NearIntents]: {
84
86
  ...NearIntentsSwapper_1.nearIntentsSwapper,
85
- ...endpoints_8.nearIntentsApi,
87
+ ...endpoints_9.nearIntentsApi,
88
+ },
89
+ [types_1.SwapperName.Cetus]: {
90
+ ...CetusSwapper_1.cetusSwapper,
91
+ ...endpoints_4.cetusApi,
86
92
  },
87
93
  [types_1.SwapperName.Test]: undefined,
88
94
  };
@@ -96,6 +102,7 @@ const DEFAULT_MAYA_SLIPPAGE_DECIMAL_PERCENTAGE = '0.01'; // 1%
96
102
  const DEFAULT_ARBITRUM_BRIDGE_SLIPPAGE_DECIMAL_PERCENTAGE = '0'; // no slippage for Arbitrum Bridge, so no slippage tolerance
97
103
  const DEFAULT_CHAINFLIP_SLIPPAGE_DECIMAL_PERCENTAGE = '0.02'; // 2%
98
104
  const DEFAULT_BUTTERSWAP_SLIPPAGE_DECIMAL_PERCENTAGE = '0.015'; // 1.5%
105
+ const DEFAULT_CETUS_SLIPPAGE_DECIMAL_PERCENTAGE = '0.005'; // .5%
99
106
  const getDefaultSlippageDecimalPercentageForSwapper = (swapperName) => {
100
107
  if (swapperName === undefined)
101
108
  return DEFAULT_SLIPPAGE_DECIMAL_PERCENTAGE;
@@ -124,6 +131,8 @@ const getDefaultSlippageDecimalPercentageForSwapper = (swapperName) => {
124
131
  return DEFAULT_BUTTERSWAP_SLIPPAGE_DECIMAL_PERCENTAGE;
125
132
  case types_1.SwapperName.NearIntents:
126
133
  return DEFAULT_NEAR_INTENTS_SLIPPAGE_DECIMAL_PERCENTAGE;
134
+ case types_1.SwapperName.Cetus:
135
+ return DEFAULT_CETUS_SLIPPAGE_DECIMAL_PERCENTAGE;
127
136
  default:
128
137
  return (0, utils_1.assertUnreachable)(swapperName);
129
138
  }
@@ -4,6 +4,7 @@ export * from './safe-utils';
4
4
  export * from './swapper';
5
5
  export * from './swappers/ArbitrumBridgeSwapper';
6
6
  export * from './swappers/BebopSwapper';
7
+ export * from './swappers/CetusSwapper';
7
8
  export * from './swappers/ChainflipSwapper';
8
9
  export * from './swappers/CowSwapper';
9
10
  export * from './swappers/JupiterSwapper';
package/dist/cjs/index.js CHANGED
@@ -33,6 +33,7 @@ __exportStar(require("./safe-utils"), exports);
33
33
  __exportStar(require("./swapper"), exports);
34
34
  __exportStar(require("./swappers/ArbitrumBridgeSwapper"), exports);
35
35
  __exportStar(require("./swappers/BebopSwapper"), exports);
36
+ __exportStar(require("./swappers/CetusSwapper"), exports);
36
37
  __exportStar(require("./swappers/ChainflipSwapper"), exports);
37
38
  __exportStar(require("./swappers/CowSwapper"), exports);
38
39
  __exportStar(require("./swappers/JupiterSwapper"), exports);
@@ -32,6 +32,8 @@ vitest_1.vi.mock('../xhr', () => ({
32
32
  assertGetUtxoChainAdapter: () => vitest_1.vi.fn(),
33
33
  assertGetCosmosSdkChainAdapter: () => vitest_1.vi.fn(),
34
34
  assertGetSolanaChainAdapter: () => vitest_1.vi.fn(),
35
+ assertGetTronChainAdapter: () => vitest_1.vi.fn(),
36
+ assertGetSuiChainAdapter: () => vitest_1.vi.fn(),
35
37
  config: {
36
38
  VITE_BUTTERSWAP_CLIENT_ID: 'test',
37
39
  },
@@ -26,6 +26,8 @@ vitest_1.vi.mock('../utils/butterSwapService', () => ({
26
26
  assertGetUtxoChainAdapter: () => vitest_1.vi.fn(),
27
27
  assertGetCosmosSdkChainAdapter: () => vitest_1.vi.fn(),
28
28
  assertGetSolanaChainAdapter: () => vitest_1.vi.fn(),
29
+ assertGetTronChainAdapter: () => vitest_1.vi.fn(),
30
+ assertGetSuiChainAdapter: () => vitest_1.vi.fn(),
29
31
  config: {
30
32
  VITE_BUTTERSWAP_CLIENT_ID: 'test',
31
33
  },
@@ -58,6 +60,8 @@ vitest_1.vi.mock('../utils/butterSwapService', () => ({
58
60
  assertGetUtxoChainAdapter: () => vitest_1.vi.fn(),
59
61
  assertGetCosmosSdkChainAdapter: () => vitest_1.vi.fn(),
60
62
  assertGetSolanaChainAdapter: () => vitest_1.vi.fn(),
63
+ assertGetTronChainAdapter: () => vitest_1.vi.fn(),
64
+ assertGetSuiChainAdapter: () => vitest_1.vi.fn(),
61
65
  config: {
62
66
  VITE_BUTTERSWAP_CLIENT_ID: 'test',
63
67
  },
@@ -0,0 +1,2 @@
1
+ import type { Swapper } from '../../types';
2
+ export declare const cetusSwapper: Swapper;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cetusSwapper = void 0;
4
+ const __1 = require("../..");
5
+ exports.cetusSwapper = {
6
+ executeSuiTransaction: __1.executeSuiTransaction,
7
+ };
@@ -0,0 +1,2 @@
1
+ import type { SwapperApi } from '../../types';
2
+ export declare const cetusApi: SwapperApi;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cetusApi = void 0;
4
+ const unchained_client_1 = require("@shapeshiftoss/unchained-client");
5
+ const utils_1 = require("../../utils");
6
+ const getTradeQuote_1 = require("./swapperApi/getTradeQuote");
7
+ const getTradeRate_1 = require("./swapperApi/getTradeRate");
8
+ const helpers_1 = require("./utils/helpers");
9
+ exports.cetusApi = {
10
+ getTradeQuote: (input, deps) => {
11
+ return (0, getTradeQuote_1.getTradeQuote)(input, deps);
12
+ },
13
+ getTradeRate: (input, deps) => {
14
+ return (0, getTradeRate_1.getTradeRate)(input, deps);
15
+ },
16
+ getUnsignedSuiTransaction: async ({ stepIndex, tradeQuote, from, assertGetSuiChainAdapter, }) => {
17
+ if (!(0, utils_1.isExecutableTradeQuote)(tradeQuote))
18
+ throw new Error('Unable to execute a trade rate quote');
19
+ const step = (0, utils_1.getExecutableTradeStep)(tradeQuote, stepIndex);
20
+ const { accountNumber, sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit } = step;
21
+ const adapter = assertGetSuiChainAdapter(sellAsset.chainId);
22
+ const sdk = await (0, helpers_1.getCetusSDK)();
23
+ sdk.senderAddress = from;
24
+ const sellCoinType = (0, helpers_1.getCoinType)(sellAsset);
25
+ const buyCoinType = (0, helpers_1.getCoinType)(buyAsset);
26
+ const pool = await (0, helpers_1.findBestPool)(sdk, sellCoinType, buyCoinType);
27
+ if (!pool) {
28
+ throw new Error(`No liquidity pool found for ${sellAsset.symbol}/${buyAsset.symbol}`);
29
+ }
30
+ const swapResult = await (0, helpers_1.calculateSwapAmounts)(sdk, pool, sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit);
31
+ if (!swapResult) {
32
+ throw new Error(`Failed to calculate swap for ${sellAsset.symbol}/${buyAsset.symbol}`);
33
+ }
34
+ const a2b = (0, helpers_1.determineSwapDirection)(pool, sellCoinType, buyCoinType);
35
+ const amountLimit = (0, helpers_1.calculateAmountLimit)(swapResult.estimatedAmountOut, tradeQuote.slippageTolerancePercentageDecimal, true);
36
+ const tx = await sdk.Swap.createSwapTransactionPayload({
37
+ pool_id: pool.poolAddress,
38
+ coinTypeA: pool.coinTypeA,
39
+ coinTypeB: pool.coinTypeB,
40
+ a2b,
41
+ by_amount_in: true,
42
+ amount: sellAmountIncludingProtocolFeesCryptoBaseUnit,
43
+ amount_limit: amountLimit,
44
+ });
45
+ const transactionBytes = await tx.build({ client: adapter.getSuiClient() });
46
+ const intentMessage = new Uint8Array(3 + transactionBytes.length);
47
+ intentMessage[0] = 0;
48
+ intentMessage[1] = 0;
49
+ intentMessage[2] = 0;
50
+ intentMessage.set(transactionBytes, 3);
51
+ const bip44Params = adapter.getBip44Params({ accountNumber });
52
+ const addressNList = [
53
+ bip44Params.purpose,
54
+ bip44Params.coinType,
55
+ bip44Params.accountNumber,
56
+ ...(bip44Params.isChange !== undefined ? [bip44Params.isChange ? 1 : 0] : []),
57
+ ...(bip44Params.addressIndex !== undefined ? [bip44Params.addressIndex] : []),
58
+ ];
59
+ return {
60
+ addressNList,
61
+ intentMessageBytes: intentMessage,
62
+ };
63
+ },
64
+ getSuiTransactionFees: ({ tradeQuote, stepIndex }) => {
65
+ if (!(0, utils_1.isExecutableTradeQuote)(tradeQuote))
66
+ throw new Error('Unable to execute a trade rate quote');
67
+ const step = (0, utils_1.getExecutableTradeStep)(tradeQuote, stepIndex);
68
+ if (!step.feeData.networkFeeCryptoBaseUnit) {
69
+ throw new Error('Missing network fee in quote');
70
+ }
71
+ return Promise.resolve(step.feeData.networkFeeCryptoBaseUnit);
72
+ },
73
+ checkTradeStatus: ({ swap, assertGetSuiChainAdapter }) => {
74
+ if (!swap?.sellTxHash) {
75
+ return Promise.resolve({
76
+ status: unchained_client_1.TxStatus.Unknown,
77
+ buyTxHash: undefined,
78
+ message: undefined,
79
+ });
80
+ }
81
+ return (0, utils_1.checkSuiSwapStatus)({
82
+ txHash: swap.sellTxHash,
83
+ address: swap.receiveAddress,
84
+ assertGetSuiChainAdapter,
85
+ });
86
+ },
87
+ };
@@ -0,0 +1 @@
1
+ export * from './utils/constants';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./utils/constants"), exports);
@@ -0,0 +1,3 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { CommonTradeQuoteInput, SwapErrorRight, SwapperDeps, TradeQuote } from '../../../types';
3
+ export declare const getTradeQuote: (input: CommonTradeQuoteInput, deps: SwapperDeps) => Promise<Result<TradeQuote[], SwapErrorRight>>;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTradeQuote = void 0;
4
+ const caip_1 = require("@shapeshiftoss/caip");
5
+ const monads_1 = require("@sniptt/monads");
6
+ const uuid_1 = require("uuid");
7
+ const types_1 = require("../../../types");
8
+ const utils_1 = require("../../../utils");
9
+ const constants_1 = require("../utils/constants");
10
+ const helpers_1 = require("../utils/helpers");
11
+ const getTradeQuote = async (input, deps) => {
12
+ const { sellAsset, buyAsset, receiveAddress, accountNumber, sellAmountIncludingProtocolFeesCryptoBaseUnit: sellAmount, affiliateBps, slippageTolerancePercentageDecimal, } = input;
13
+ const { assetsById } = deps;
14
+ if (accountNumber === undefined) {
15
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
16
+ message: `accountNumber is required`,
17
+ code: types_1.TradeQuoteError.InternalError,
18
+ }));
19
+ }
20
+ if (!(0, constants_1.isSupportedChainId)(sellAsset.chainId)) {
21
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
22
+ message: `unsupported chainId`,
23
+ code: types_1.TradeQuoteError.UnsupportedChain,
24
+ details: { chainId: sellAsset.chainId },
25
+ }));
26
+ }
27
+ if (!(0, constants_1.isSupportedChainId)(buyAsset.chainId)) {
28
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
29
+ message: `unsupported chainId`,
30
+ code: types_1.TradeQuoteError.UnsupportedChain,
31
+ details: { chainId: buyAsset.chainId },
32
+ }));
33
+ }
34
+ const suiAsset = assetsById[caip_1.suiAssetId];
35
+ if (!suiAsset) {
36
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
37
+ message: `suiAsset is required`,
38
+ code: types_1.TradeQuoteError.InternalError,
39
+ }));
40
+ }
41
+ try {
42
+ const sdk = await (0, helpers_1.getCetusSDK)();
43
+ const sellCoinType = (0, helpers_1.getCoinType)(sellAsset);
44
+ const buyCoinType = (0, helpers_1.getCoinType)(buyAsset);
45
+ const pool = await (0, helpers_1.findBestPool)(sdk, sellCoinType, buyCoinType);
46
+ if (!pool) {
47
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
48
+ message: `No liquidity pool found for ${sellAsset.symbol}/${buyAsset.symbol}`,
49
+ code: types_1.TradeQuoteError.NoRouteFound,
50
+ }));
51
+ }
52
+ const swapResult = await (0, helpers_1.calculateSwapAmounts)(sdk, pool, sellAsset, buyAsset, sellAmount);
53
+ if (!swapResult) {
54
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
55
+ message: `Failed to calculate swap for ${sellAsset.symbol}/${buyAsset.symbol}`,
56
+ code: types_1.TradeQuoteError.QueryFailed,
57
+ }));
58
+ }
59
+ const buyAmountAfterFeesCryptoBaseUnit = swapResult.estimatedAmountOut;
60
+ const rate = (0, utils_1.getInputOutputRate)({
61
+ sellAmountCryptoBaseUnit: sellAmount,
62
+ buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
63
+ sellAsset,
64
+ buyAsset,
65
+ });
66
+ const adapter = deps.assertGetSuiChainAdapter(sellAsset.chainId);
67
+ const dummyAddress = '0x0000000000000000000000000000000000000000000000000000000000000000';
68
+ const addressForFeeEstimate = receiveAddress ?? dummyAddress;
69
+ const getFeeDataInput = {
70
+ to: addressForFeeEstimate,
71
+ value: sellAmount,
72
+ chainSpecific: {
73
+ from: addressForFeeEstimate,
74
+ tokenId: (0, helpers_1.getCoinType)(sellAsset),
75
+ },
76
+ };
77
+ const feeData = await adapter.getFeeData(getFeeDataInput);
78
+ const protocolFees = {};
79
+ const quotes = [];
80
+ const tradeQuote = {
81
+ id: (0, uuid_1.v4)(),
82
+ quoteOrRate: 'quote',
83
+ rate,
84
+ affiliateBps,
85
+ receiveAddress,
86
+ slippageTolerancePercentageDecimal,
87
+ swapperName: types_1.SwapperName.Cetus,
88
+ steps: [
89
+ {
90
+ accountNumber,
91
+ buyAmountBeforeFeesCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
92
+ buyAmountAfterFeesCryptoBaseUnit,
93
+ sellAmountIncludingProtocolFeesCryptoBaseUnit: sellAmount,
94
+ feeData: {
95
+ protocolFees,
96
+ networkFeeCryptoBaseUnit: feeData.fast.txFee,
97
+ chainSpecific: {
98
+ gasBudget: feeData.fast.chainSpecific.gasBudget,
99
+ gasPrice: feeData.fast.chainSpecific.gasPrice,
100
+ },
101
+ },
102
+ rate,
103
+ source: types_1.SwapperName.Cetus,
104
+ buyAsset,
105
+ sellAsset,
106
+ allowanceContract: '0x0',
107
+ estimatedExecutionTimeMs: undefined,
108
+ },
109
+ ],
110
+ };
111
+ quotes.push(tradeQuote);
112
+ return (0, monads_1.Ok)(quotes);
113
+ }
114
+ catch (error) {
115
+ console.error(error);
116
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
117
+ message: error instanceof Error ? error.message : 'Unknown error getting Cetus quote',
118
+ code: types_1.TradeQuoteError.QueryFailed,
119
+ }));
120
+ }
121
+ };
122
+ exports.getTradeQuote = getTradeQuote;
@@ -0,0 +1,3 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { GetTradeRateInput, SwapErrorRight, SwapperDeps, TradeRate } from '../../../types';
3
+ export declare const getTradeRate: (input: GetTradeRateInput, deps: SwapperDeps) => Promise<Result<TradeRate[], SwapErrorRight>>;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTradeRate = void 0;
4
+ const caip_1 = require("@shapeshiftoss/caip");
5
+ const monads_1 = require("@sniptt/monads");
6
+ const uuid_1 = require("uuid");
7
+ const types_1 = require("../../../types");
8
+ const utils_1 = require("../../../utils");
9
+ const constants_1 = require("../utils/constants");
10
+ const helpers_1 = require("../utils/helpers");
11
+ const getTradeRate = async (input, deps) => {
12
+ const { sellAsset, buyAsset, receiveAddress, sellAmountIncludingProtocolFeesCryptoBaseUnit: sellAmount, affiliateBps, slippageTolerancePercentageDecimal, } = input;
13
+ const { assetsById } = deps;
14
+ if (!(0, constants_1.isSupportedChainId)(sellAsset.chainId)) {
15
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
16
+ message: `unsupported chainId`,
17
+ code: types_1.TradeQuoteError.UnsupportedChain,
18
+ details: { chainId: sellAsset.chainId },
19
+ }));
20
+ }
21
+ if (!(0, constants_1.isSupportedChainId)(buyAsset.chainId)) {
22
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
23
+ message: `unsupported chainId`,
24
+ code: types_1.TradeQuoteError.UnsupportedChain,
25
+ details: { chainId: buyAsset.chainId },
26
+ }));
27
+ }
28
+ const suiAsset = assetsById[caip_1.suiAssetId];
29
+ if (!suiAsset) {
30
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
31
+ message: `suiAsset is required`,
32
+ code: types_1.TradeQuoteError.UnknownError,
33
+ }));
34
+ }
35
+ try {
36
+ const sdk = await (0, helpers_1.getCetusSDK)();
37
+ const sellCoinType = (0, helpers_1.getCoinType)(sellAsset);
38
+ const buyCoinType = (0, helpers_1.getCoinType)(buyAsset);
39
+ const pool = await (0, helpers_1.findBestPool)(sdk, sellCoinType, buyCoinType);
40
+ if (!pool) {
41
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
42
+ message: `No liquidity pool found for ${sellAsset.symbol}/${buyAsset.symbol}`,
43
+ code: types_1.TradeQuoteError.NoRouteFound,
44
+ }));
45
+ }
46
+ const swapResult = await (0, helpers_1.calculateSwapAmounts)(sdk, pool, sellAsset, buyAsset, sellAmount);
47
+ if (!swapResult) {
48
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
49
+ message: `Failed to calculate swap for ${sellAsset.symbol}/${buyAsset.symbol}`,
50
+ code: types_1.TradeQuoteError.QueryFailed,
51
+ }));
52
+ }
53
+ const buyAmountAfterFeesCryptoBaseUnit = swapResult.estimatedAmountOut;
54
+ const rate = (0, utils_1.getInputOutputRate)({
55
+ sellAmountCryptoBaseUnit: sellAmount,
56
+ buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
57
+ sellAsset,
58
+ buyAsset,
59
+ });
60
+ const adapter = deps.assertGetSuiChainAdapter(sellAsset.chainId);
61
+ const dummyAddress = '0x0000000000000000000000000000000000000000000000000000000000000000';
62
+ const addressForFeeEstimate = receiveAddress ?? dummyAddress;
63
+ const { fast: feeDataFast } = await adapter.getFeeData({
64
+ to: addressForFeeEstimate,
65
+ value: sellAmount,
66
+ chainSpecific: {
67
+ from: addressForFeeEstimate,
68
+ tokenId: (0, helpers_1.getCoinType)(sellAsset),
69
+ },
70
+ });
71
+ const protocolFees = {};
72
+ const rates = [];
73
+ const tradeRate = {
74
+ id: (0, uuid_1.v4)(),
75
+ quoteOrRate: 'rate',
76
+ rate,
77
+ affiliateBps,
78
+ receiveAddress,
79
+ slippageTolerancePercentageDecimal,
80
+ swapperName: types_1.SwapperName.Cetus,
81
+ steps: [
82
+ {
83
+ accountNumber: undefined,
84
+ buyAmountBeforeFeesCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
85
+ buyAmountAfterFeesCryptoBaseUnit,
86
+ sellAmountIncludingProtocolFeesCryptoBaseUnit: sellAmount,
87
+ feeData: {
88
+ protocolFees,
89
+ networkFeeCryptoBaseUnit: feeDataFast.txFee,
90
+ },
91
+ rate,
92
+ source: types_1.SwapperName.Cetus,
93
+ buyAsset,
94
+ sellAsset,
95
+ allowanceContract: '0x0',
96
+ estimatedExecutionTimeMs: undefined,
97
+ },
98
+ ],
99
+ };
100
+ rates.push(tradeRate);
101
+ return (0, monads_1.Ok)(rates);
102
+ }
103
+ catch (error) {
104
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
105
+ message: error instanceof Error ? error.message : 'Unknown error getting Cetus rate',
106
+ code: types_1.TradeQuoteError.QueryFailed,
107
+ }));
108
+ }
109
+ };
110
+ exports.getTradeRate = getTradeRate;
@@ -0,0 +1,3 @@
1
+ import type { ChainId } from '@shapeshiftoss/caip';
2
+ export declare const SUPPORTED_CETUS_CHAIN_IDS: readonly ChainId[];
3
+ export declare const isSupportedChainId: (chainId: ChainId) => chainId is ChainId;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSupportedChainId = exports.SUPPORTED_CETUS_CHAIN_IDS = void 0;
4
+ const caip_1 = require("@shapeshiftoss/caip");
5
+ exports.SUPPORTED_CETUS_CHAIN_IDS = [caip_1.suiChainId];
6
+ const isSupportedChainId = (chainId) => {
7
+ return exports.SUPPORTED_CETUS_CHAIN_IDS.includes(chainId);
8
+ };
9
+ exports.isSupportedChainId = isSupportedChainId;
@@ -0,0 +1,13 @@
1
+ import type { CetusClmmSDK, Pool } from '@cetusprotocol/cetus-sui-clmm-sdk';
2
+ import type { Asset } from '@shapeshiftoss/types';
3
+ export declare const getCetusSDK: () => Promise<CetusClmmSDK>;
4
+ export declare const getCoinType: (asset: Asset) => string;
5
+ export declare const determineSwapDirection: (pool: Pool, sellCoinType: string, buyCoinType: string) => boolean;
6
+ export declare const calculateAmountLimit: (estimatedAmount: string, slippageTolerancePercentageDecimal: string | undefined, isBuyAmount: boolean) => string;
7
+ export declare const findBestPool: (sdk: CetusClmmSDK, sellCoinType: string, buyCoinType: string) => Promise<Pool | undefined>;
8
+ export type CalculateSwapResult = {
9
+ estimatedAmountOut: string;
10
+ estimatedAmountIn: string;
11
+ estimatedFeeAmount: string;
12
+ };
13
+ export declare const calculateSwapAmounts: (sdk: CetusClmmSDK, pool: Pool, sellAsset: Asset, buyAsset: Asset, sellAmount: string) => Promise<CalculateSwapResult | undefined>;