@shapeshiftoss/swapper 20.3.0 → 20.4.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 (179) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/constants.js +15 -0
  3. package/dist/cjs/index.d.ts +2 -0
  4. package/dist/cjs/index.js +2 -0
  5. package/dist/cjs/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
  6. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +1 -2
  7. package/dist/cjs/swappers/BebopSwapper/utils/fetchFromBebop.d.ts +2 -1
  8. package/dist/cjs/swappers/BebopSwapper/utils/fetchFromBebop.js +21 -15
  9. package/dist/cjs/swappers/BebopSwapper/utils/getBebopSolanaTradeContext.js +1 -0
  10. package/dist/cjs/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +0 -2
  11. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +0 -2
  12. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +0 -2
  13. package/dist/cjs/swappers/ChainflipSwapper/swapperApi/getTradeQuote.js +1 -2
  14. package/dist/cjs/swappers/ChainflipSwapper/types.d.ts +1 -0
  15. package/dist/cjs/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
  16. package/dist/cjs/swappers/FyndSwapper/FyndSwapper.d.ts +2 -0
  17. package/dist/cjs/swappers/FyndSwapper/FyndSwapper.js +5 -0
  18. package/dist/cjs/swappers/FyndSwapper/endpoints.d.ts +2 -0
  19. package/dist/cjs/swappers/FyndSwapper/endpoints.js +14 -0
  20. package/dist/cjs/swappers/FyndSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
  21. package/dist/cjs/swappers/FyndSwapper/getTradeQuote/getTradeQuote.js +43 -0
  22. package/dist/cjs/swappers/FyndSwapper/getTradeRate/getTradeRate.d.ts +4 -0
  23. package/dist/cjs/swappers/FyndSwapper/getTradeRate/getTradeRate.js +34 -0
  24. package/dist/cjs/swappers/FyndSwapper/index.d.ts +2 -0
  25. package/dist/cjs/swappers/FyndSwapper/index.js +7 -0
  26. package/dist/cjs/swappers/FyndSwapper/types.d.ts +41 -0
  27. package/dist/cjs/swappers/FyndSwapper/types.js +2 -0
  28. package/dist/cjs/swappers/FyndSwapper/utils/constants.d.ts +33 -0
  29. package/dist/cjs/swappers/FyndSwapper/utils/constants.js +38 -0
  30. package/dist/cjs/swappers/FyndSwapper/utils/fetchFromFynd.d.ts +13 -0
  31. package/dist/cjs/swappers/FyndSwapper/utils/fetchFromFynd.js +42 -0
  32. package/dist/cjs/swappers/FyndSwapper/utils/fyndService.d.ts +5 -0
  33. package/dist/cjs/swappers/FyndSwapper/utils/fyndService.js +9 -0
  34. package/dist/cjs/swappers/FyndSwapper/utils/getFyndStepData.d.ts +25 -0
  35. package/dist/cjs/swappers/FyndSwapper/utils/getFyndStepData.js +48 -0
  36. package/dist/cjs/swappers/FyndSwapper/utils/getFyndTradeContext.d.ts +18 -0
  37. package/dist/cjs/swappers/FyndSwapper/utils/getFyndTradeContext.js +94 -0
  38. package/dist/cjs/swappers/FyndSwapper/utils/helpers.d.ts +24 -0
  39. package/dist/cjs/swappers/FyndSwapper/utils/helpers.js +174 -0
  40. package/dist/cjs/swappers/FyndSwapper/utils/helpers.test.d.ts +1 -0
  41. package/dist/cjs/swappers/FyndSwapper/utils/helpers.test.js +101 -0
  42. package/dist/cjs/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +0 -1
  43. package/dist/cjs/swappers/PortalsSwapper/endpoints.js +4 -1
  44. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +1 -1
  45. package/dist/cjs/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +2 -3
  46. package/dist/cjs/swappers/RelaySwapper/utils/getRelayTradeContext.d.ts +1 -0
  47. package/dist/cjs/swappers/RelaySwapper/utils/getRelayTradeContext.js +4 -0
  48. package/dist/cjs/swappers/RelaySwapper/utils/relayStatus.js +3 -3
  49. package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +9 -4
  50. package/dist/cjs/swappers/SymbiosisSwapper/SymbiosisSwapper.d.ts +2 -0
  51. package/dist/cjs/swappers/SymbiosisSwapper/SymbiosisSwapper.js +8 -0
  52. package/dist/cjs/swappers/SymbiosisSwapper/endpoints.d.ts +2 -0
  53. package/dist/cjs/swappers/SymbiosisSwapper/endpoints.js +66 -0
  54. package/dist/cjs/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
  55. package/dist/cjs/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.js +42 -0
  56. package/dist/cjs/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.d.ts +4 -0
  57. package/dist/cjs/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.js +34 -0
  58. package/dist/cjs/swappers/SymbiosisSwapper/index.d.ts +2 -0
  59. package/dist/cjs/swappers/SymbiosisSwapper/index.js +7 -0
  60. package/dist/cjs/swappers/SymbiosisSwapper/utils/constants.d.ts +19 -0
  61. package/dist/cjs/swappers/SymbiosisSwapper/utils/constants.js +64 -0
  62. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.d.ts +26 -0
  63. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.js +106 -0
  64. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.d.ts +1 -0
  65. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.js +161 -0
  66. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.d.ts +17 -0
  67. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.js +146 -0
  68. package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.d.ts +38 -0
  69. package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.js +172 -0
  70. package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.test.d.ts +1 -0
  71. package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.test.js +151 -0
  72. package/dist/cjs/swappers/SymbiosisSwapper/utils/symbiosisService.d.ts +5 -0
  73. package/dist/cjs/swappers/SymbiosisSwapper/utils/symbiosisService.js +18 -0
  74. package/dist/cjs/swappers/SymbiosisSwapper/utils/types.d.ts +83 -0
  75. package/dist/cjs/swappers/SymbiosisSwapper/utils/types.js +11 -0
  76. package/dist/cjs/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +1 -0
  77. package/dist/cjs/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +1 -0
  78. package/dist/cjs/swappers/ThorchainSwapper/utils/getLongtailQuote.js +1 -1
  79. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +24 -1
  80. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.d.ts +1 -0
  81. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.js +110 -0
  82. package/dist/cjs/swappers/ZrxSwapper/types.d.ts +2 -1
  83. package/dist/cjs/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.d.ts +1 -0
  84. package/dist/cjs/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.js +26 -0
  85. package/dist/cjs/types.d.ts +6 -5
  86. package/dist/cjs/types.js +2 -0
  87. package/dist/cjs/utils/helpers.d.ts +1 -2
  88. package/dist/cjs/utils/helpers.js +8 -32
  89. package/dist/cjs/utils/helpers.test.js +6 -2
  90. package/dist/esm/.tsbuildinfo +1 -1
  91. package/dist/esm/constants.js +15 -0
  92. package/dist/esm/index.d.ts +2 -0
  93. package/dist/esm/index.js +2 -0
  94. package/dist/esm/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
  95. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +1 -2
  96. package/dist/esm/swappers/BebopSwapper/utils/fetchFromBebop.d.ts +2 -1
  97. package/dist/esm/swappers/BebopSwapper/utils/fetchFromBebop.js +21 -15
  98. package/dist/esm/swappers/BebopSwapper/utils/getBebopSolanaTradeContext.js +1 -0
  99. package/dist/esm/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +0 -2
  100. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +0 -2
  101. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +0 -2
  102. package/dist/esm/swappers/ChainflipSwapper/swapperApi/getTradeQuote.js +1 -2
  103. package/dist/esm/swappers/ChainflipSwapper/types.d.ts +1 -0
  104. package/dist/esm/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
  105. package/dist/esm/swappers/FyndSwapper/FyndSwapper.d.ts +2 -0
  106. package/dist/esm/swappers/FyndSwapper/FyndSwapper.js +2 -0
  107. package/dist/esm/swappers/FyndSwapper/endpoints.d.ts +2 -0
  108. package/dist/esm/swappers/FyndSwapper/endpoints.js +11 -0
  109. package/dist/esm/swappers/FyndSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
  110. package/dist/esm/swappers/FyndSwapper/getTradeQuote/getTradeQuote.js +39 -0
  111. package/dist/esm/swappers/FyndSwapper/getTradeRate/getTradeRate.d.ts +4 -0
  112. package/dist/esm/swappers/FyndSwapper/getTradeRate/getTradeRate.js +30 -0
  113. package/dist/esm/swappers/FyndSwapper/index.d.ts +2 -0
  114. package/dist/esm/swappers/FyndSwapper/index.js +2 -0
  115. package/dist/esm/swappers/FyndSwapper/types.d.ts +41 -0
  116. package/dist/esm/swappers/FyndSwapper/types.js +1 -0
  117. package/dist/esm/swappers/FyndSwapper/utils/constants.d.ts +33 -0
  118. package/dist/esm/swappers/FyndSwapper/utils/constants.js +35 -0
  119. package/dist/esm/swappers/FyndSwapper/utils/fetchFromFynd.d.ts +13 -0
  120. package/dist/esm/swappers/FyndSwapper/utils/fetchFromFynd.js +38 -0
  121. package/dist/esm/swappers/FyndSwapper/utils/fyndService.d.ts +5 -0
  122. package/dist/esm/swappers/FyndSwapper/utils/fyndService.js +3 -0
  123. package/dist/esm/swappers/FyndSwapper/utils/getFyndStepData.d.ts +25 -0
  124. package/dist/esm/swappers/FyndSwapper/utils/getFyndStepData.js +44 -0
  125. package/dist/esm/swappers/FyndSwapper/utils/getFyndTradeContext.d.ts +18 -0
  126. package/dist/esm/swappers/FyndSwapper/utils/getFyndTradeContext.js +90 -0
  127. package/dist/esm/swappers/FyndSwapper/utils/helpers.d.ts +24 -0
  128. package/dist/esm/swappers/FyndSwapper/utils/helpers.js +162 -0
  129. package/dist/esm/swappers/FyndSwapper/utils/helpers.test.d.ts +1 -0
  130. package/dist/esm/swappers/FyndSwapper/utils/helpers.test.js +99 -0
  131. package/dist/esm/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +0 -1
  132. package/dist/esm/swappers/PortalsSwapper/endpoints.js +4 -1
  133. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +2 -2
  134. package/dist/esm/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +2 -3
  135. package/dist/esm/swappers/RelaySwapper/utils/getRelayTradeContext.d.ts +1 -0
  136. package/dist/esm/swappers/RelaySwapper/utils/getRelayTradeContext.js +5 -1
  137. package/dist/esm/swappers/RelaySwapper/utils/relayStatus.js +3 -3
  138. package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +9 -4
  139. package/dist/esm/swappers/SymbiosisSwapper/SymbiosisSwapper.d.ts +2 -0
  140. package/dist/esm/swappers/SymbiosisSwapper/SymbiosisSwapper.js +5 -0
  141. package/dist/esm/swappers/SymbiosisSwapper/endpoints.d.ts +2 -0
  142. package/dist/esm/swappers/SymbiosisSwapper/endpoints.js +63 -0
  143. package/dist/esm/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
  144. package/dist/esm/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.js +38 -0
  145. package/dist/esm/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.d.ts +4 -0
  146. package/dist/esm/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.js +30 -0
  147. package/dist/esm/swappers/SymbiosisSwapper/index.d.ts +2 -0
  148. package/dist/esm/swappers/SymbiosisSwapper/index.js +2 -0
  149. package/dist/esm/swappers/SymbiosisSwapper/utils/constants.d.ts +19 -0
  150. package/dist/esm/swappers/SymbiosisSwapper/utils/constants.js +61 -0
  151. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.d.ts +26 -0
  152. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.js +102 -0
  153. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.d.ts +1 -0
  154. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.js +159 -0
  155. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.d.ts +17 -0
  156. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.js +139 -0
  157. package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.d.ts +38 -0
  158. package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.js +156 -0
  159. package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.test.d.ts +1 -0
  160. package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.test.js +149 -0
  161. package/dist/esm/swappers/SymbiosisSwapper/utils/symbiosisService.d.ts +5 -0
  162. package/dist/esm/swappers/SymbiosisSwapper/utils/symbiosisService.js +12 -0
  163. package/dist/esm/swappers/SymbiosisSwapper/utils/types.d.ts +83 -0
  164. package/dist/esm/swappers/SymbiosisSwapper/utils/types.js +8 -0
  165. package/dist/esm/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +1 -0
  166. package/dist/esm/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +1 -0
  167. package/dist/esm/swappers/ThorchainSwapper/utils/getLongtailQuote.js +1 -1
  168. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +25 -2
  169. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.d.ts +1 -0
  170. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.js +108 -0
  171. package/dist/esm/swappers/ZrxSwapper/types.d.ts +2 -1
  172. package/dist/esm/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.d.ts +1 -0
  173. package/dist/esm/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.js +22 -0
  174. package/dist/esm/types.d.ts +6 -5
  175. package/dist/esm/types.js +2 -0
  176. package/dist/esm/utils/helpers.d.ts +1 -2
  177. package/dist/esm/utils/helpers.js +9 -33
  178. package/dist/esm/utils/helpers.test.js +6 -2
  179. package/package.json +7 -7
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSymbiosisTradeContext = void 0;
7
+ const utils_1 = require("@shapeshiftoss/utils");
8
+ const monads_1 = require("@sniptt/monads");
9
+ const axios_1 = __importDefault(require("axios"));
10
+ const uuid_1 = require("uuid");
11
+ const constants_1 = require("../../../constants");
12
+ const types_1 = require("../../../types");
13
+ const utils_2 = require("../../../utils");
14
+ const affiliateFee_1 = require("../../../utils/affiliateFee");
15
+ const constants_2 = require("./constants");
16
+ const helpers_1 = require("./helpers");
17
+ const symbiosisService_1 = require("./symbiosisService");
18
+ const getSymbiosisTradeContext = async ({ input, deps, from, to, }) => {
19
+ const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, affiliateBps } = input;
20
+ const assertion = (0, helpers_1.assertValidTrade)({ sellAsset, buyAsset });
21
+ if (assertion.isErr())
22
+ return (0, monads_1.Err)(assertion.unwrapErr());
23
+ const { sellSymbiosisChainId, buySymbiosisChainId } = assertion.unwrap();
24
+ const slippageBps = (0, helpers_1.getSymbiosisSlippageBps)(input.slippageTolerancePercentageDecimal ??
25
+ (0, constants_1.getDefaultSlippageDecimalPercentageForSwapper)(types_1.SwapperName.Symbiosis));
26
+ const maybePartnerAddress = (0, helpers_1.getSymbiosisPartnerAddress)(affiliateBps);
27
+ if (maybePartnerAddress.isErr())
28
+ return (0, monads_1.Err)(maybePartnerAddress.unwrapErr());
29
+ const partnerAddress = maybePartnerAddress.unwrap();
30
+ const request = {
31
+ tokenAmountIn: {
32
+ chainId: sellSymbiosisChainId,
33
+ address: (0, helpers_1.getSymbiosisTokenAddress)(sellAsset),
34
+ decimals: sellAsset.precision,
35
+ amount: sellAmountIncludingProtocolFeesCryptoBaseUnit,
36
+ },
37
+ tokenOut: {
38
+ chainId: buySymbiosisChainId,
39
+ address: (0, helpers_1.getSymbiosisTokenAddress)(buyAsset),
40
+ decimals: buyAsset.precision,
41
+ },
42
+ from,
43
+ to,
44
+ slippage: slippageBps,
45
+ disabledProviders: constants_2.SYMBIOSIS_DISABLED_PROVIDERS,
46
+ partnerAddress,
47
+ };
48
+ const maybeQuote = await symbiosisService_1.symbiosisService.post(`${deps.config.VITE_SYMBIOSIS_API_URL}/v2/quote`, request);
49
+ if (maybeQuote.isErr()) {
50
+ const { cause } = maybeQuote.unwrapErr();
51
+ if (!axios_1.default.isAxiosError(cause)) {
52
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
53
+ message: 'Unknown error',
54
+ code: types_1.TradeQuoteError.UnknownError,
55
+ cause,
56
+ }));
57
+ }
58
+ if (cause.response?.status === 429) {
59
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
60
+ message: 'Symbiosis rate limit exceeded',
61
+ code: types_1.TradeQuoteError.RateLimitExceeded,
62
+ }));
63
+ }
64
+ const message = cause.response?.data?.message;
65
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
66
+ message: message ?? 'Symbiosis quote request failed',
67
+ code: (0, helpers_1.symbiosisErrorToTradeQuoteError)(message),
68
+ }));
69
+ }
70
+ const { data: quote } = maybeQuote.unwrap();
71
+ if (!(0, helpers_1.isSymbiosisRouteSupported)({ quote, sellAsset })) {
72
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
73
+ message: 'No Symbiosis route through its own liquidity',
74
+ code: types_1.TradeQuoteError.NoRouteFound,
75
+ }));
76
+ }
77
+ // The quote must carry the fee we report, otherwise Symbiosis is not collecting it on this route
78
+ if (partnerAddress &&
79
+ !quote.fees.some(fee => fee.description === constants_2.SYMBIOSIS_PARTNER_FEE_DESCRIPTION)) {
80
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
81
+ message: 'Symbiosis quote is missing the partner fee',
82
+ code: types_1.TradeQuoteError.InvalidResponse,
83
+ }));
84
+ }
85
+ const buyAmountAfterFeesCryptoBaseUnit = quote.tokenAmountOut.amount;
86
+ const protocolFees = (0, helpers_1.getSymbiosisProtocolFees)(quote.fees);
87
+ const buyAmountBeforeFeesCryptoBaseUnit = (0, utils_1.bn)(buyAmountAfterFeesCryptoBaseUnit)
88
+ .plus(protocolFees[buyAsset.assetId]?.amountCryptoBaseUnit ?? 0)
89
+ .toFixed(0);
90
+ const rate = (0, utils_2.getInputOutputRate)({
91
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
92
+ buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
93
+ sellAsset,
94
+ buyAsset,
95
+ });
96
+ const allowanceContract = (0, utils_1.isToken)(sellAsset.assetId) ? quote.approveTo : '';
97
+ if (allowanceContract === undefined) {
98
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
99
+ message: 'Symbiosis returned no spender for a token sell',
100
+ code: types_1.TradeQuoteError.QueryFailed,
101
+ }));
102
+ }
103
+ return (0, monads_1.Ok)({
104
+ tradeCommon: {
105
+ id: (0, uuid_1.v4)(),
106
+ rate,
107
+ swapperName: types_1.SwapperName.Symbiosis,
108
+ affiliateBps: partnerAddress ? constants_2.SYMBIOSIS_PARTNER_FEE_BPS : '0',
109
+ slippageTolerancePercentageDecimal: (0, utils_1.bn)(slippageBps).div(10000).toString(),
110
+ },
111
+ stepCommon: {
112
+ allowanceContract,
113
+ rate,
114
+ buyAmountBeforeFeesCryptoBaseUnit,
115
+ buyAmountAfterFeesCryptoBaseUnit,
116
+ sellAmountIncludingProtocolFeesCryptoBaseUnit,
117
+ buyAsset,
118
+ sellAsset,
119
+ source: types_1.SwapperName.Symbiosis,
120
+ estimatedExecutionTimeMs: quote.estimatedTime * 1000,
121
+ // The fee accrues in sTokens on the Symbiosis chain - the buy asset figure is a display estimate
122
+ affiliateFee: partnerAddress
123
+ ? (0, affiliateFee_1.buildAffiliateFee)({
124
+ strategy: 'buy_asset',
125
+ affiliateBps: constants_2.SYMBIOSIS_PARTNER_FEE_BPS,
126
+ sellAsset,
127
+ buyAsset,
128
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
129
+ buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
130
+ isEstimate: true,
131
+ })
132
+ : undefined,
133
+ },
134
+ protocolFees,
135
+ stepDataArgs: {
136
+ swapTx: quote,
137
+ sellAsset,
138
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
139
+ spenderAddress: allowanceContract,
140
+ tronFallbackEnergy: (0, helpers_1.getSymbiosisTronFallbackEnergy)(quote.labels),
141
+ from,
142
+ deps,
143
+ },
144
+ });
145
+ };
146
+ exports.getSymbiosisTradeContext = getSymbiosisTradeContext;
@@ -0,0 +1,38 @@
1
+ import type { AssetId, ChainId } from '@shapeshiftoss/caip';
2
+ import type { Asset } from '@shapeshiftoss/types';
3
+ import type { Result } from '@sniptt/monads';
4
+ import type { QuoteFeeData, SwapErrorRight, TradeStatus } from '../../../types';
5
+ import { TradeQuoteError } from '../../../types';
6
+ import type { SymbiosisFee, SymbiosisQuoteResponse, SymbiosisToken, SymbiosisTxResponse } from './types';
7
+ export declare const assertValidTrade: ({ sellAsset, buyAsset, }: {
8
+ sellAsset: Asset;
9
+ buyAsset: Asset;
10
+ }) => Result<{
11
+ sellSymbiosisChainId: number;
12
+ buySymbiosisChainId: number;
13
+ }, SwapErrorRight>;
14
+ export declare const getSymbiosisTokenAddress: (asset: Asset) => string;
15
+ export declare const getSymbiosisSlippageBps: (slippageTolerancePercentageDecimal: string) => number;
16
+ export declare const getDefaultUserAddress: (chainId: ChainId) => string;
17
+ export declare const getSymbiosisPartnerAddress: (affiliateBps: string) => Result<string | undefined, SwapErrorRight>;
18
+ export declare const buildSymbiosisTronCallData: ({ functionSelector, data, }: {
19
+ functionSelector: string;
20
+ data: string;
21
+ }) => string;
22
+ export declare const getSymbiosisTronFallbackEnergy: (labels: string[]) => string;
23
+ export declare const isSymbiosisRouteSupported: ({ quote, sellAsset, }: {
24
+ quote: SymbiosisQuoteResponse;
25
+ sellAsset: Asset;
26
+ }) => boolean;
27
+ export declare const getSymbiosisFeeAssetId: ({ chainId: symbiosisChainId, address, }: Pick<SymbiosisToken, 'chainId' | 'address'>) => AssetId | undefined;
28
+ export declare const getSymbiosisProtocolFees: (fees: SymbiosisFee[]) => NonNullable<QuoteFeeData['protocolFees']>;
29
+ export declare const symbiosisErrorToTradeQuoteError: (message: string | undefined) => TradeQuoteError;
30
+ export declare const isTronSourceTxFailed: (tx: {
31
+ ret?: {
32
+ contractRet?: string;
33
+ }[];
34
+ }) => boolean;
35
+ export declare const getSymbiosisTradeStatus: ({ response, buySymbiosisChainId, }: {
36
+ response: SymbiosisTxResponse;
37
+ buySymbiosisChainId: number | undefined;
38
+ }) => Pick<TradeStatus, 'status' | 'buyTxHash' | 'message'>;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSymbiosisTradeStatus = exports.isTronSourceTxFailed = exports.symbiosisErrorToTradeQuoteError = exports.getSymbiosisProtocolFees = exports.getSymbiosisFeeAssetId = exports.isSymbiosisRouteSupported = exports.getSymbiosisTronFallbackEnergy = exports.buildSymbiosisTronCallData = exports.getSymbiosisPartnerAddress = exports.getDefaultUserAddress = exports.getSymbiosisSlippageBps = exports.getSymbiosisTokenAddress = exports.assertValidTrade = void 0;
4
+ const caip_1 = require("@shapeshiftoss/caip");
5
+ const chain_adapters_1 = require("@shapeshiftoss/chain-adapters");
6
+ const unchained_client_1 = require("@shapeshiftoss/unchained-client");
7
+ const utils_1 = require("@shapeshiftoss/utils");
8
+ const monads_1 = require("@sniptt/monads");
9
+ const viem_1 = require("viem");
10
+ const types_1 = require("../../../types");
11
+ const utils_2 = require("../../../utils");
12
+ const constants_1 = require("./constants");
13
+ const types_2 = require("./types");
14
+ const assertValidTrade = ({ sellAsset, buyAsset, }) => {
15
+ const sellSymbiosisChainId = constants_1.chainIdToSymbiosisChainId[sellAsset.chainId];
16
+ const buySymbiosisChainId = constants_1.chainIdToSymbiosisChainId[buyAsset.chainId];
17
+ if (sellSymbiosisChainId === undefined) {
18
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
19
+ message: `Sell asset chain '${sellAsset.chainId}' not supported by Symbiosis`,
20
+ code: types_1.TradeQuoteError.UnsupportedChain,
21
+ }));
22
+ }
23
+ if (buySymbiosisChainId === undefined) {
24
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
25
+ message: `Buy asset chain '${buyAsset.chainId}' not supported by Symbiosis`,
26
+ code: types_1.TradeQuoteError.UnsupportedChain,
27
+ }));
28
+ }
29
+ if (sellAsset.chainId === buyAsset.chainId) {
30
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
31
+ message: 'Symbiosis same-chain swaps are not supported',
32
+ code: types_1.TradeQuoteError.UnsupportedTradePair,
33
+ }));
34
+ }
35
+ return (0, monads_1.Ok)({ sellSymbiosisChainId, buySymbiosisChainId });
36
+ };
37
+ exports.assertValidTrade = assertValidTrade;
38
+ const getSymbiosisTokenAddress = (asset) => {
39
+ if (!(0, utils_1.isToken)(asset.assetId))
40
+ return '';
41
+ const { assetReference } = (0, caip_1.fromAssetId)(asset.assetId);
42
+ if (asset.chainId === caip_1.tronChainId)
43
+ return chain_adapters_1.tron.toTronHex(assetReference);
44
+ return (0, viem_1.getAddress)(assetReference);
45
+ };
46
+ exports.getSymbiosisTokenAddress = getSymbiosisTokenAddress;
47
+ const getSymbiosisSlippageBps = (slippageTolerancePercentageDecimal) => {
48
+ const bps = Math.round((0, utils_1.bnOrZero)(slippageTolerancePercentageDecimal).times(10000).toNumber());
49
+ return Math.min(Math.max(bps, constants_1.SYMBIOSIS_MIN_SLIPPAGE_BPS), constants_1.SYMBIOSIS_MAX_SLIPPAGE_BPS);
50
+ };
51
+ exports.getSymbiosisSlippageBps = getSymbiosisSlippageBps;
52
+ const getDefaultUserAddress = (chainId) => chainId === caip_1.tronChainId ? constants_1.DEFAULT_SYMBIOSIS_TRON_USER_ADDRESS : constants_1.DEFAULT_SYMBIOSIS_EVM_USER_ADDRESS;
53
+ exports.getDefaultUserAddress = getDefaultUserAddress;
54
+ // Symbiosis fixes the partner rate on its side, so only a fee-free swap or the registered rate can be honored
55
+ const getSymbiosisPartnerAddress = (affiliateBps) => {
56
+ const requestedBps = (0, utils_1.bnOrZero)(affiliateBps);
57
+ if (requestedBps.isZero())
58
+ return (0, monads_1.Ok)(undefined);
59
+ if (requestedBps.eq(constants_1.SYMBIOSIS_PARTNER_FEE_BPS))
60
+ return (0, monads_1.Ok)(constants_1.SYMBIOSIS_PARTNER_ADDRESS);
61
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
62
+ message: `Symbiosis only supports a ${constants_1.SYMBIOSIS_PARTNER_FEE_BPS} bps affiliate fee, got ${affiliateBps}`,
63
+ code: types_1.TradeQuoteError.UnsupportedTradePair,
64
+ }));
65
+ };
66
+ exports.getSymbiosisPartnerAddress = getSymbiosisPartnerAddress;
67
+ // Symbiosis returns the function signature and its encoded parameters separately
68
+ const buildSymbiosisTronCallData = ({ functionSelector, data, }) => {
69
+ const selector = (0, viem_1.keccak256)((0, viem_1.toHex)(functionSelector)).slice(0, 10);
70
+ const parameters = data.startsWith('0x') ? data.slice(2) : data;
71
+ return `${selector}${parameters}`;
72
+ };
73
+ exports.buildSymbiosisTronCallData = buildSymbiosisTronCallData;
74
+ const getSymbiosisTronFallbackEnergy = (labels) => labels.includes(constants_1.SYMBIOSIS_SRC_CHAIN_SWAP_LABEL)
75
+ ? constants_1.SYMBIOSIS_TRON_SOURCE_SWAP_ENERGY
76
+ : constants_1.SYMBIOSIS_TRON_BRIDGE_ENERGY;
77
+ exports.getSymbiosisTronFallbackEnergy = getSymbiosisTronFallbackEnergy;
78
+ const isSymbiosisRouteSupported = ({ quote, sellAsset, }) => {
79
+ if (quote.kind !== constants_1.SYMBIOSIS_CROSSCHAIN_SWAP_KIND)
80
+ return false;
81
+ if (quote.labels.includes(constants_1.SYMBIOSIS_PARTNER_SWAP_LABEL))
82
+ return false;
83
+ if (quote.labels.includes(constants_1.SYMBIOSIS_SEMI_CENTRALIZED_LABEL))
84
+ return false;
85
+ const expectedType = sellAsset.chainId === caip_1.tronChainId ? 'tron' : 'evm';
86
+ return quote.type === expectedType;
87
+ };
88
+ exports.isSymbiosisRouteSupported = isSymbiosisRouteSupported;
89
+ const getSymbiosisFeeAssetId = ({ chainId: symbiosisChainId, address, }) => {
90
+ const chainId = constants_1.symbiosisChainIdToChainId[symbiosisChainId];
91
+ if (!chainId)
92
+ return;
93
+ if (!address)
94
+ return (0, utils_1.chainIdToFeeAssetId)(chainId);
95
+ if (chainId === caip_1.tronChainId) {
96
+ return (0, caip_1.toAssetId)({
97
+ chainId,
98
+ assetNamespace: caip_1.ASSET_NAMESPACE.trc20,
99
+ assetReference: chain_adapters_1.tron.toTronBase58(address),
100
+ });
101
+ }
102
+ return (0, caip_1.toAssetId)({
103
+ chainId,
104
+ assetNamespace: caip_1.ASSET_NAMESPACE.erc20,
105
+ assetReference: address.toLowerCase(),
106
+ });
107
+ };
108
+ exports.getSymbiosisFeeAssetId = getSymbiosisFeeAssetId;
109
+ // Fees on the Symbiosis host chain are charged in sTokens we have no asset for - they are already net of the buy amount
110
+ const getSymbiosisProtocolFees = (fees) => fees.reduce((acc, { value }) => {
111
+ const assetId = (0, exports.getSymbiosisFeeAssetId)(value);
112
+ const chainId = constants_1.symbiosisChainIdToChainId[value.chainId];
113
+ if (!assetId || !chainId)
114
+ return acc;
115
+ acc[assetId] = {
116
+ amountCryptoBaseUnit: (0, utils_1.bnOrZero)(acc[assetId]?.amountCryptoBaseUnit)
117
+ .plus(value.amount)
118
+ .toFixed(0),
119
+ asset: { symbol: value.symbol, chainId, precision: value.decimals },
120
+ requiresBalance: false,
121
+ };
122
+ return acc;
123
+ }, {});
124
+ exports.getSymbiosisProtocolFees = getSymbiosisProtocolFees;
125
+ const symbiosisErrorToTradeQuoteError = (message) => {
126
+ if (message?.startsWith('Amount is too low'))
127
+ return types_1.TradeQuoteError.SellAmountBelowTradeFee;
128
+ if (message === 'This swap is not available')
129
+ return types_1.TradeQuoteError.NoRouteFound;
130
+ return types_1.TradeQuoteError.QueryFailed;
131
+ };
132
+ exports.symbiosisErrorToTradeQuoteError = symbiosisErrorToTradeQuoteError;
133
+ // A mined Tron call that did not succeed (REVERT, OUT_OF_ENERGY, ...) never reaches Symbiosis, which answers not found for it
134
+ const isTronSourceTxFailed = (tx) => {
135
+ const contractRet = tx.ret?.[0]?.contractRet;
136
+ return contractRet !== undefined && contractRet !== 'SUCCESS';
137
+ };
138
+ exports.isTronSourceTxFailed = isTronSourceTxFailed;
139
+ const getSymbiosisTradeStatus = ({ response, buySymbiosisChainId, }) => {
140
+ const { status, tx, transitTokenSent } = response;
141
+ switch (status.code) {
142
+ case types_2.SymbiosisStatusCode.Success: {
143
+ // Until the operation is indexed, Symbiosis answers Success for the plain source transaction
144
+ if (tx?.chainId !== buySymbiosisChainId) {
145
+ return { status: unchained_client_1.TxStatus.Pending, buyTxHash: undefined, message: undefined };
146
+ }
147
+ const message = transitTokenSent
148
+ ? `Received ${(0, utils_1.bn)(transitTokenSent.amount)
149
+ .shiftedBy(-transitTokenSent.decimals)
150
+ .toFixed()} ${transitTokenSent.symbol} instead of the buy asset`
151
+ : undefined;
152
+ return { status: unchained_client_1.TxStatus.Confirmed, buyTxHash: tx?.hash, message };
153
+ }
154
+ case types_2.SymbiosisStatusCode.Pending:
155
+ return { status: unchained_client_1.TxStatus.Pending, buyTxHash: undefined, message: undefined };
156
+ case types_2.SymbiosisStatusCode.Stuck:
157
+ return {
158
+ status: unchained_client_1.TxStatus.Pending,
159
+ buyTxHash: undefined,
160
+ message: 'Swap is stuck and is being reverted by Symbiosis',
161
+ };
162
+ case types_2.SymbiosisStatusCode.Reverted:
163
+ return {
164
+ status: unchained_client_1.TxStatus.Failed,
165
+ buyTxHash: undefined,
166
+ message: 'Swap was reverted by Symbiosis',
167
+ };
168
+ default:
169
+ return { status: unchained_client_1.TxStatus.Unknown, buyTxHash: undefined, message: undefined };
170
+ }
171
+ };
172
+ exports.getSymbiosisTradeStatus = getSymbiosisTradeStatus;
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const caip_1 = require("@shapeshiftoss/caip");
4
+ const unchained_client_1 = require("@shapeshiftoss/unchained-client");
5
+ const vitest_1 = require("vitest");
6
+ const constants_1 = require("./constants");
7
+ const helpers_1 = require("./helpers");
8
+ const types_1 = require("./types");
9
+ const BSC_USDC_ADDRESS = '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d';
10
+ const BSC_USDC_ASSET_ID = 'eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d';
11
+ // The fees array of a live Arbitrum USDC -> BSC quote: one host chain sToken entry, one destination entry
12
+ const liveFees = [
13
+ {
14
+ provider: 'symbiosis',
15
+ description: 'Cross-chain fee',
16
+ value: {
17
+ symbol: 'sUSDC',
18
+ address: '0xc317169a336b484f65B0AB4A794bBe66a7491E83',
19
+ amount: '250000',
20
+ chainId: 13863860,
21
+ decimals: 6,
22
+ },
23
+ },
24
+ {
25
+ provider: 'symbiosis',
26
+ description: 'Cross-chain fee',
27
+ value: {
28
+ symbol: 'USDC',
29
+ address: BSC_USDC_ADDRESS,
30
+ amount: '250000000000000000',
31
+ chainId: 56,
32
+ decimals: 18,
33
+ },
34
+ },
35
+ ];
36
+ (0, vitest_1.describe)('getSymbiosisSlippageBps', () => {
37
+ (0, vitest_1.it)('raises slippage below the Symbiosis minimum to 10 bps', () => {
38
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisSlippageBps)('0.0005')).toBe(10);
39
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisSlippageBps)('0')).toBe(10);
40
+ });
41
+ (0, vitest_1.it)('lowers slippage above the Symbiosis maximum to 1000 bps', () => {
42
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisSlippageBps)('0.25')).toBe(1000);
43
+ });
44
+ });
45
+ (0, vitest_1.describe)('getSymbiosisPartnerAddress', () => {
46
+ (0, vitest_1.it)('sends the partner address at the registered rate', () => {
47
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisPartnerAddress)('60').unwrap()).toBe(constants_1.SYMBIOSIS_PARTNER_ADDRESS);
48
+ });
49
+ (0, vitest_1.it)('omits the partner address for a fee-free swap', () => {
50
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisPartnerAddress)('0').unwrap()).toBeUndefined();
51
+ });
52
+ (0, vitest_1.it)('rejects any other rate instead of silently dropping the fee', () => {
53
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisPartnerAddress)('30').isErr()).toBe(true);
54
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisPartnerAddress)('80').isErr()).toBe(true);
55
+ });
56
+ });
57
+ (0, vitest_1.describe)('buildSymbiosisTronCallData', () => {
58
+ const functionSelector = 'metaRoute((bytes,bytes,address[],address,address,uint256,bool,address,bytes))';
59
+ (0, vitest_1.it)('prefixes the parameters with the 4-byte selector of the signature', () => {
60
+ const data = `0x${'00'.repeat(31)}20`;
61
+ (0, vitest_1.expect)((0, helpers_1.buildSymbiosisTronCallData)({ functionSelector, data })).toBe(`0xa11b1198${'00'.repeat(31)}20`);
62
+ });
63
+ });
64
+ (0, vitest_1.describe)('getSymbiosisFeeAssetId', () => {
65
+ (0, vitest_1.it)('maps a Tron hex address to its base58 trc20 asset id', () => {
66
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisFeeAssetId)({
67
+ chainId: 728126428,
68
+ address: '0xa614f803b6fd780986a42c78ec9c7f77e6ded13c',
69
+ })).toBe(caip_1.usdtOnTronAssetId);
70
+ });
71
+ });
72
+ (0, vitest_1.describe)('getSymbiosisProtocolFees', () => {
73
+ (0, vitest_1.it)('keeps resolvable fees and skips host chain sToken fees', () => {
74
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisProtocolFees)(liveFees)).toEqual({
75
+ [BSC_USDC_ASSET_ID]: {
76
+ amountCryptoBaseUnit: '250000000000000000',
77
+ asset: { symbol: 'USDC', chainId: 'eip155:56', precision: 18 },
78
+ requiresBalance: false,
79
+ },
80
+ });
81
+ });
82
+ (0, vitest_1.it)('sums fees charged in the same asset', () => {
83
+ const fees = (0, helpers_1.getSymbiosisProtocolFees)([liveFees[1], liveFees[1]]);
84
+ (0, vitest_1.expect)(fees[BSC_USDC_ASSET_ID]?.amountCryptoBaseUnit).toBe('500000000000000000');
85
+ });
86
+ });
87
+ (0, vitest_1.describe)('getSymbiosisTradeStatus', () => {
88
+ const buySymbiosisChainId = 56;
89
+ const makeResponse = (overrides) => ({
90
+ status: { code: types_1.SymbiosisStatusCode.Success, text: 'Success' },
91
+ txIn: { hash: '0xsell', chainId: 42161 },
92
+ tx: { hash: '0xbuy', chainId: 56 },
93
+ ...overrides,
94
+ });
95
+ (0, vitest_1.it)('confirms with the destination hash once the destination tx is on the buy chain', () => {
96
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisTradeStatus)({ response: makeResponse({}), buySymbiosisChainId })).toEqual({
97
+ status: unchained_client_1.TxStatus.Confirmed,
98
+ buyTxHash: '0xbuy',
99
+ message: undefined,
100
+ });
101
+ });
102
+ (0, vitest_1.it)('stays pending when Success describes the source transaction itself', () => {
103
+ const response = makeResponse({ tx: { hash: '0xsell', chainId: 42161 } });
104
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisTradeStatus)({ response, buySymbiosisChainId })).toEqual({
105
+ status: unchained_client_1.TxStatus.Pending,
106
+ buyTxHash: undefined,
107
+ message: undefined,
108
+ });
109
+ });
110
+ (0, vitest_1.it)('names the transit token when the destination swap did not complete', () => {
111
+ const response = makeResponse({
112
+ transitTokenSent: {
113
+ chainId: 56,
114
+ address: BSC_USDC_ADDRESS,
115
+ decimals: 18,
116
+ symbol: 'USDC',
117
+ amount: '250000000000000000',
118
+ },
119
+ });
120
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisTradeStatus)({ response, buySymbiosisChainId })).toEqual({
121
+ status: unchained_client_1.TxStatus.Confirmed,
122
+ buyTxHash: '0xbuy',
123
+ message: 'Received 0.25 USDC instead of the buy asset',
124
+ });
125
+ });
126
+ (0, vitest_1.it)('maps pending, stuck, reverted and not found', () => {
127
+ const pending = makeResponse({ status: { code: types_1.SymbiosisStatusCode.Pending, text: '' } });
128
+ const stuck = makeResponse({ status: { code: types_1.SymbiosisStatusCode.Stuck, text: '' } });
129
+ const reverted = makeResponse({ status: { code: types_1.SymbiosisStatusCode.Reverted, text: '' } });
130
+ const notFound = makeResponse({ status: { code: types_1.SymbiosisStatusCode.NotFound, text: '' } });
131
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisTradeStatus)({ response: pending, buySymbiosisChainId }).status).toBe(unchained_client_1.TxStatus.Pending);
132
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisTradeStatus)({ response: stuck, buySymbiosisChainId })).toEqual({
133
+ status: unchained_client_1.TxStatus.Pending,
134
+ buyTxHash: undefined,
135
+ message: 'Swap is stuck and is being reverted by Symbiosis',
136
+ });
137
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisTradeStatus)({ response: reverted, buySymbiosisChainId })).toEqual({
138
+ status: unchained_client_1.TxStatus.Failed,
139
+ buyTxHash: undefined,
140
+ message: 'Swap was reverted by Symbiosis',
141
+ });
142
+ (0, vitest_1.expect)((0, helpers_1.getSymbiosisTradeStatus)({ response: notFound, buySymbiosisChainId }).status).toBe(unchained_client_1.TxStatus.Unknown);
143
+ });
144
+ });
145
+ (0, vitest_1.describe)('isTronSourceTxFailed', () => {
146
+ (0, vitest_1.it)('is true for any contract result other than SUCCESS', () => {
147
+ (0, vitest_1.expect)((0, helpers_1.isTronSourceTxFailed)({ ret: [{ contractRet: 'REVERT' }] })).toBe(true);
148
+ (0, vitest_1.expect)((0, helpers_1.isTronSourceTxFailed)({ ret: [{ contractRet: 'OUT_OF_ENERGY' }] })).toBe(true);
149
+ (0, vitest_1.expect)((0, helpers_1.isTronSourceTxFailed)({ ret: [{ contractRet: 'SUCCESS' }] })).toBe(false);
150
+ });
151
+ });
@@ -0,0 +1,5 @@
1
+ export declare const symbiosisService: {
2
+ get: <T = any>(url: string, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T, any, {}>, import("../../..").SwapErrorRight>>;
3
+ post: <T_1 = any>(url: string, data: any, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T_1, any, {}>, import("../../..").SwapErrorRight>>;
4
+ delete: <T_2 = any>(url: string, data: any, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T_2, any, {}>, import("../../..").SwapErrorRight>>;
5
+ };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.symbiosisService = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const utils_1 = require("../../../utils");
9
+ const constants_1 = require("./constants");
10
+ const symbiosisServiceBase = axios_1.default.create({
11
+ timeout: 10000,
12
+ headers: {
13
+ Accept: 'application/json',
14
+ 'Content-Type': 'application/json',
15
+ 'X-Partner-Id': constants_1.SYMBIOSIS_PARTNER_ID,
16
+ },
17
+ });
18
+ exports.symbiosisService = (0, utils_1.makeSwapperAxiosServiceMonadic)(symbiosisServiceBase);
@@ -0,0 +1,83 @@
1
+ import type { GetEvmTradeQuoteInput, GetEvmTradeRateInput, GetTronTradeQuoteInput, GetTronTradeRateInput } from '../../../types';
2
+ export type SymbiosisTradeQuoteInput = GetEvmTradeQuoteInput | GetTronTradeQuoteInput;
3
+ export type SymbiosisTradeRateInput = GetEvmTradeRateInput | GetTronTradeRateInput;
4
+ export type SymbiosisToken = {
5
+ chainId: number;
6
+ address: string;
7
+ decimals: number;
8
+ symbol: string;
9
+ };
10
+ export type SymbiosisTokenAmount = SymbiosisToken & {
11
+ amount: string;
12
+ };
13
+ export type SymbiosisQuoteRequest = {
14
+ tokenAmountIn: Omit<SymbiosisTokenAmount, 'symbol'>;
15
+ tokenOut: Omit<SymbiosisToken, 'symbol'>;
16
+ from: string;
17
+ to: string;
18
+ slippage: number;
19
+ disabledProviders: string;
20
+ partnerAddress?: string;
21
+ };
22
+ export type SymbiosisFee = {
23
+ provider: string;
24
+ description?: string;
25
+ value: SymbiosisTokenAmount;
26
+ };
27
+ export type SymbiosisEvmTx = {
28
+ chainId: number;
29
+ to: string;
30
+ data: string;
31
+ value?: string;
32
+ };
33
+ export type SymbiosisTronTx = {
34
+ chainId: number;
35
+ from: string;
36
+ to: string;
37
+ data: string;
38
+ value?: string;
39
+ feeLimit: number;
40
+ functionSelector?: string;
41
+ };
42
+ export type SymbiosisSwapTx = {
43
+ type: 'evm';
44
+ tx: SymbiosisEvmTx;
45
+ } | {
46
+ type: 'tron';
47
+ tx: SymbiosisTronTx;
48
+ };
49
+ export type SymbiosisQuoteResponse = SymbiosisSwapTx & {
50
+ kind: string;
51
+ labels: string[];
52
+ approveTo?: string;
53
+ tokenAmountOut: SymbiosisTokenAmount;
54
+ tokenAmountOutMin: SymbiosisTokenAmount;
55
+ fees: SymbiosisFee[];
56
+ estimatedTime: number;
57
+ };
58
+ export type SymbiosisErrorResponse = {
59
+ code: number;
60
+ message: string;
61
+ };
62
+ export declare enum SymbiosisStatusCode {
63
+ NotFound = -1,
64
+ Success = 0,
65
+ Pending = 1,
66
+ Stuck = 2,
67
+ Reverted = 3
68
+ }
69
+ export type SymbiosisTxResponse = {
70
+ status: {
71
+ code: SymbiosisStatusCode;
72
+ text: string;
73
+ };
74
+ tx?: {
75
+ hash?: string;
76
+ chainId: number;
77
+ };
78
+ txIn?: {
79
+ hash?: string;
80
+ chainId: number;
81
+ };
82
+ transitTokenSent?: SymbiosisTokenAmount;
83
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SymbiosisStatusCode = void 0;
4
+ var SymbiosisStatusCode;
5
+ (function (SymbiosisStatusCode) {
6
+ SymbiosisStatusCode[SymbiosisStatusCode["NotFound"] = -1] = "NotFound";
7
+ SymbiosisStatusCode[SymbiosisStatusCode["Success"] = 0] = "Success";
8
+ SymbiosisStatusCode[SymbiosisStatusCode["Pending"] = 1] = "Pending";
9
+ SymbiosisStatusCode[SymbiosisStatusCode["Stuck"] = 2] = "Stuck";
10
+ SymbiosisStatusCode[SymbiosisStatusCode["Reverted"] = 3] = "Reverted";
11
+ })(SymbiosisStatusCode || (exports.SymbiosisStatusCode = SymbiosisStatusCode = {}));
@@ -1017,6 +1017,7 @@
1017
1017
  "eip155:1/erc20:0x2c06ba9e7f0daccbc1f6a33ea67e85bb68fbee3a",
1018
1018
  "eip155:1/erc20:0xcbb8f1bda10b9696c57e13bc128fe674769dcec0",
1019
1019
  "eip155:1/erc20:0x72dfb2e44f59c5ad2bafe84314e5b99a7cd5075e",
1020
+ "eip155:1/erc20:0xce682c89c63d2850cb2ca898e44d6c7c30d897a6",
1020
1021
  "eip155:43114/erc20:0xc891eb4cbdeff6e073e859e987815ed1505c2acd",
1021
1022
  "eip155:43114/erc20:0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64",
1022
1023
  "eip155:43114/erc20:0x47c3118ad183712acd42648e9e522e13690f29a0",
@@ -41,5 +41,6 @@
41
41
  "THOR.TCY": "cosmos:thorchain-1/slip44:tcy",
42
42
  "TRON.TRX": "tron:0x2b6653dc/slip44:195",
43
43
  "TRON.USDT-TR7NHQJEKQXGTCI8Q8ZY4PL8OTSZGJLJ6T": "tron:0x2b6653dc/trc20:tr7nhqjekqxgtci8q8zy4pl8otszgjlj6t",
44
+ "ZEC.ZEC": "bip122:00040fe8ec8471911baa1db1266ea15d/slip44:133",
44
45
  "THOR.RUNE": "cosmos:thorchain-1/slip44:931"
45
46
  }
@@ -77,7 +77,7 @@ const getLongtailToL1Quote = async (input, deps, streamingInterval, swapperName)
77
77
  return (0, monads_1.Ok)({
78
78
  ...quote,
79
79
  // The aggregator swapIn deadline is tighter than the daemon quote expiry
80
- deadline: Math.min(quote.deadline, Number(deadline) * 1000),
80
+ deadline: Math.min(quote.deadline ?? Infinity, Number(deadline) * 1000),
81
81
  data: data ?? quote.data,
82
82
  // This logic will need to be updated to support multi-hop, if that's ever implemented for THORChain
83
83
  steps: quote.steps.map(s => ({