@shapeshiftoss/swapper 17.6.9 → 17.6.10

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 (183) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/constants.js +61 -43
  3. package/dist/cjs/swappers/AcrossSwapper/AcrossSwapper.d.ts +2 -0
  4. package/dist/cjs/swappers/AcrossSwapper/AcrossSwapper.js +8 -0
  5. package/dist/cjs/swappers/AcrossSwapper/constant.d.ts +9 -0
  6. package/dist/cjs/swappers/AcrossSwapper/constant.js +48 -0
  7. package/dist/cjs/swappers/AcrossSwapper/endpoints.d.ts +2 -0
  8. package/dist/cjs/swappers/AcrossSwapper/endpoints.js +113 -0
  9. package/dist/cjs/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.d.ts +3 -0
  10. package/dist/cjs/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.js +31 -0
  11. package/dist/cjs/swappers/AcrossSwapper/getTradeRate/getTradeRate.d.ts +3 -0
  12. package/dist/cjs/swappers/AcrossSwapper/getTradeRate/getTradeRate.js +19 -0
  13. package/dist/cjs/swappers/AcrossSwapper/index.d.ts +1 -0
  14. package/dist/cjs/swappers/AcrossSwapper/index.js +5 -0
  15. package/dist/cjs/swappers/AcrossSwapper/utils/acrossService.d.ts +5 -0
  16. package/dist/cjs/swappers/AcrossSwapper/utils/acrossService.js +17 -0
  17. package/dist/cjs/swappers/AcrossSwapper/utils/fetchAcrossTrade.d.ts +19 -0
  18. package/dist/cjs/swappers/AcrossSwapper/utils/fetchAcrossTrade.js +27 -0
  19. package/dist/cjs/swappers/AcrossSwapper/utils/getTrade.d.ts +11 -0
  20. package/dist/cjs/swappers/AcrossSwapper/utils/getTrade.js +335 -0
  21. package/dist/cjs/swappers/AcrossSwapper/utils/types.d.ts +177 -0
  22. package/dist/cjs/swappers/AcrossSwapper/utils/types.js +17 -0
  23. package/dist/cjs/swappers/AvnuSwapper/endpoints.js +42 -14
  24. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +10 -5
  25. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeRate.js +8 -4
  26. package/dist/cjs/swappers/BebopSwapper/utils/helpers/helpers.d.ts +1 -1
  27. package/dist/cjs/swappers/ButterSwap/ButterSwap.js +1 -0
  28. package/dist/cjs/swappers/ButterSwap/endpoints.js +56 -0
  29. package/dist/cjs/swappers/ButterSwap/swapperApi/checkTradeStatus.js +19 -0
  30. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +27 -14
  31. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
  32. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.js +23 -16
  33. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +2 -0
  34. package/dist/cjs/swappers/ButterSwap/types.d.ts +1 -0
  35. package/dist/cjs/swappers/ButterSwap/utils/helpers.js +1 -0
  36. package/dist/cjs/swappers/ButterSwap/xhr.d.ts +2 -2
  37. package/dist/cjs/swappers/ButterSwap/xhr.js +7 -2
  38. package/dist/cjs/swappers/CetusSwapper/endpoints.js +3 -8
  39. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +1 -1
  40. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeRate.js +1 -1
  41. package/dist/cjs/swappers/ChainflipSwapper/utils/getQuoteOrRate.js +11 -5
  42. package/dist/cjs/swappers/ChainflipSwapper/utils/helpers.js +8 -2
  43. package/dist/cjs/swappers/CowSwapper/CowSwapper.js +1 -1
  44. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +1 -1
  45. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.test.js +5 -5
  46. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeRate/getCowSwapTradeRate.js +1 -1
  47. package/dist/cjs/swappers/CowSwapper/utils/helpers/helpers.js +8 -2
  48. package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +1 -0
  49. package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +31 -0
  50. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +36 -1
  51. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +61 -1
  52. package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +1 -1
  53. package/dist/cjs/swappers/NearIntentsSwapper/types.js +6 -0
  54. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.js +23 -4
  55. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +8 -3
  56. package/dist/cjs/swappers/RelaySwapper/constant.js +26 -1
  57. package/dist/cjs/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.d.ts +1 -1
  58. package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +13 -2
  59. package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +100 -0
  60. package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +15 -0
  61. package/dist/cjs/swappers/StonfiSwapper/StonfiSwapper.d.ts +2 -0
  62. package/dist/cjs/swappers/StonfiSwapper/StonfiSwapper.js +8 -0
  63. package/dist/cjs/swappers/StonfiSwapper/endpoints.d.ts +2 -0
  64. package/dist/cjs/swappers/StonfiSwapper/endpoints.js +227 -0
  65. package/dist/cjs/swappers/StonfiSwapper/index.d.ts +4 -0
  66. package/dist/cjs/swappers/StonfiSwapper/index.js +25 -0
  67. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeQuote.d.ts +2 -0
  68. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +119 -0
  69. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeRate.d.ts +2 -0
  70. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeRate.js +105 -0
  71. package/dist/cjs/swappers/StonfiSwapper/types.d.ts +60 -0
  72. package/dist/cjs/swappers/StonfiSwapper/types.js +5 -0
  73. package/dist/cjs/swappers/StonfiSwapper/utils/constants.d.ts +5 -0
  74. package/dist/cjs/swappers/StonfiSwapper/utils/constants.js +8 -0
  75. package/dist/cjs/swappers/StonfiSwapper/utils/helpers.d.ts +11 -0
  76. package/dist/cjs/swappers/StonfiSwapper/utils/helpers.js +135 -0
  77. package/dist/cjs/swappers/StonfiSwapper/utils/omnistonManager.d.ts +5 -0
  78. package/dist/cjs/swappers/StonfiSwapper/utils/omnistonManager.js +20 -0
  79. package/dist/cjs/swappers/SunioSwapper/endpoints.js +1 -1
  80. package/dist/cjs/swappers/SunioSwapper/utils/getQuoteOrRate.js +4 -3
  81. package/dist/cjs/swappers/ZrxSwapper/utils/helpers/helpers.d.ts +1 -1
  82. package/dist/cjs/swappers/utils/filterBuyAssetsBySellAssetId/filterBuyAssetsBySellAssetId.js +2 -5
  83. package/dist/cjs/swappers/utils/helpers/helpers.js +3 -0
  84. package/dist/cjs/thorchain-utils/getCallDataFromQuote.d.ts +1 -1
  85. package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +30 -5
  86. package/dist/cjs/thorchain-utils/getQuote.js +8 -2
  87. package/dist/cjs/tron-utils/getUnsignedTronTransaction.js +22 -2
  88. package/dist/cjs/types.d.ts +79 -8
  89. package/dist/cjs/types.js +2 -0
  90. package/dist/cjs/utils.d.ts +4 -3
  91. package/dist/cjs/utils.js +35 -7
  92. package/dist/esm/.tsbuildinfo +1 -1
  93. package/dist/esm/constants.js +31 -13
  94. package/dist/esm/swappers/AcrossSwapper/AcrossSwapper.d.ts +2 -0
  95. package/dist/esm/swappers/AcrossSwapper/AcrossSwapper.js +5 -0
  96. package/dist/esm/swappers/AcrossSwapper/constant.d.ts +9 -0
  97. package/dist/esm/swappers/AcrossSwapper/constant.js +42 -0
  98. package/dist/esm/swappers/AcrossSwapper/endpoints.d.ts +2 -0
  99. package/dist/esm/swappers/AcrossSwapper/endpoints.js +107 -0
  100. package/dist/esm/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.d.ts +3 -0
  101. package/dist/esm/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.js +27 -0
  102. package/dist/esm/swappers/AcrossSwapper/getTradeRate/getTradeRate.d.ts +3 -0
  103. package/dist/esm/swappers/AcrossSwapper/getTradeRate/getTradeRate.js +15 -0
  104. package/dist/esm/swappers/AcrossSwapper/index.d.ts +1 -0
  105. package/dist/esm/swappers/AcrossSwapper/index.js +1 -0
  106. package/dist/esm/swappers/AcrossSwapper/utils/acrossService.d.ts +5 -0
  107. package/dist/esm/swappers/AcrossSwapper/utils/acrossService.js +11 -0
  108. package/dist/esm/swappers/AcrossSwapper/utils/fetchAcrossTrade.d.ts +19 -0
  109. package/dist/esm/swappers/AcrossSwapper/utils/fetchAcrossTrade.js +23 -0
  110. package/dist/esm/swappers/AcrossSwapper/utils/getTrade.d.ts +11 -0
  111. package/dist/esm/swappers/AcrossSwapper/utils/getTrade.js +328 -0
  112. package/dist/esm/swappers/AcrossSwapper/utils/types.d.ts +177 -0
  113. package/dist/esm/swappers/AcrossSwapper/utils/types.js +13 -0
  114. package/dist/esm/swappers/AvnuSwapper/endpoints.js +43 -15
  115. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +10 -5
  116. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeRate.js +8 -4
  117. package/dist/esm/swappers/BebopSwapper/utils/helpers/helpers.d.ts +1 -1
  118. package/dist/esm/swappers/ButterSwap/ButterSwap.js +2 -1
  119. package/dist/esm/swappers/ButterSwap/endpoints.js +56 -0
  120. package/dist/esm/swappers/ButterSwap/swapperApi/checkTradeStatus.js +20 -1
  121. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +29 -16
  122. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
  123. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.js +25 -18
  124. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +2 -0
  125. package/dist/esm/swappers/ButterSwap/types.d.ts +1 -0
  126. package/dist/esm/swappers/ButterSwap/utils/helpers.js +1 -0
  127. package/dist/esm/swappers/ButterSwap/xhr.d.ts +2 -2
  128. package/dist/esm/swappers/ButterSwap/xhr.js +8 -3
  129. package/dist/esm/swappers/CetusSwapper/endpoints.js +3 -8
  130. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +1 -1
  131. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeRate.js +1 -1
  132. package/dist/esm/swappers/ChainflipSwapper/utils/getQuoteOrRate.js +12 -6
  133. package/dist/esm/swappers/ChainflipSwapper/utils/helpers.js +9 -3
  134. package/dist/esm/swappers/CowSwapper/CowSwapper.js +1 -1
  135. package/dist/esm/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +1 -1
  136. package/dist/esm/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.test.js +5 -5
  137. package/dist/esm/swappers/CowSwapper/getCowSwapTradeRate/getCowSwapTradeRate.js +1 -1
  138. package/dist/esm/swappers/CowSwapper/utils/helpers/helpers.js +9 -3
  139. package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -1
  140. package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +31 -0
  141. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +36 -1
  142. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +61 -1
  143. package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +1 -1
  144. package/dist/esm/swappers/NearIntentsSwapper/types.js +6 -0
  145. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.js +23 -4
  146. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +8 -3
  147. package/dist/esm/swappers/RelaySwapper/constant.js +28 -3
  148. package/dist/esm/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.d.ts +1 -1
  149. package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +13 -2
  150. package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +100 -0
  151. package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +15 -0
  152. package/dist/esm/swappers/StonfiSwapper/StonfiSwapper.d.ts +2 -0
  153. package/dist/esm/swappers/StonfiSwapper/StonfiSwapper.js +5 -0
  154. package/dist/esm/swappers/StonfiSwapper/endpoints.d.ts +2 -0
  155. package/dist/esm/swappers/StonfiSwapper/endpoints.js +224 -0
  156. package/dist/esm/swappers/StonfiSwapper/index.d.ts +4 -0
  157. package/dist/esm/swappers/StonfiSwapper/index.js +4 -0
  158. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeQuote.d.ts +2 -0
  159. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +115 -0
  160. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeRate.d.ts +2 -0
  161. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeRate.js +101 -0
  162. package/dist/esm/swappers/StonfiSwapper/types.d.ts +60 -0
  163. package/dist/esm/swappers/StonfiSwapper/types.js +2 -0
  164. package/dist/esm/swappers/StonfiSwapper/utils/constants.d.ts +5 -0
  165. package/dist/esm/swappers/StonfiSwapper/utils/constants.js +5 -0
  166. package/dist/esm/swappers/StonfiSwapper/utils/helpers.d.ts +11 -0
  167. package/dist/esm/swappers/StonfiSwapper/utils/helpers.js +124 -0
  168. package/dist/esm/swappers/StonfiSwapper/utils/omnistonManager.d.ts +5 -0
  169. package/dist/esm/swappers/StonfiSwapper/utils/omnistonManager.js +17 -0
  170. package/dist/esm/swappers/SunioSwapper/endpoints.js +1 -1
  171. package/dist/esm/swappers/SunioSwapper/utils/getQuoteOrRate.js +5 -4
  172. package/dist/esm/swappers/ZrxSwapper/utils/helpers/helpers.d.ts +1 -1
  173. package/dist/esm/swappers/utils/filterBuyAssetsBySellAssetId/filterBuyAssetsBySellAssetId.js +2 -5
  174. package/dist/esm/swappers/utils/helpers/helpers.js +4 -1
  175. package/dist/esm/thorchain-utils/getCallDataFromQuote.d.ts +1 -1
  176. package/dist/esm/thorchain-utils/getL1RateOrQuote.js +31 -6
  177. package/dist/esm/thorchain-utils/getQuote.js +9 -3
  178. package/dist/esm/tron-utils/getUnsignedTronTransaction.js +22 -2
  179. package/dist/esm/types.d.ts +79 -8
  180. package/dist/esm/types.js +2 -0
  181. package/dist/esm/utils.d.ts +4 -3
  182. package/dist/esm/utils.js +34 -7
  183. package/package.json +17 -15
@@ -0,0 +1,2 @@
1
+ import type { SwapperApi } from '../../types.js';
2
+ export declare const stonfiApi: SwapperApi;
@@ -0,0 +1,224 @@
1
+ import { toAddressNList } from '@shapeshiftoss/chain-adapters';
2
+ import { TxStatus } from '@shapeshiftoss/unchained-client';
3
+ import { Blockchain } from '@ston-fi/omniston-sdk';
4
+ import { createDefaultStatusResponse, getExecutableTradeStep, isExecutableTradeQuote, } from '../../utils.js';
5
+ import { getTradeQuote } from './swapperApi/getTradeQuote.js';
6
+ import { getTradeRate } from './swapperApi/getTradeRate.js';
7
+ import { omnistonManager } from './utils/omnistonManager.js';
8
+ const TRADE_TRACKING_TIMEOUT_MS = 60000;
9
+ const waitForFirstTradeStatus = (request, timeoutMs) => {
10
+ const omniston = omnistonManager.getInstance();
11
+ return new Promise(resolve => {
12
+ const timer = setTimeout(() => {
13
+ subscription.unsubscribe();
14
+ resolve(null);
15
+ }, timeoutMs);
16
+ const subscription = omniston.trackTrade(request).subscribe({
17
+ next: (status) => {
18
+ clearTimeout(timer);
19
+ subscription.unsubscribe();
20
+ resolve(status);
21
+ },
22
+ error: err => {
23
+ console.error('[Stonfi] trackTrade error:', err);
24
+ clearTimeout(timer);
25
+ resolve(null);
26
+ },
27
+ });
28
+ });
29
+ };
30
+ export const stonfiApi = {
31
+ getTradeQuote: (input, _deps) => getTradeQuote(input),
32
+ getTradeRate: input => getTradeRate(input),
33
+ getUnsignedTonTransaction: async ({ stepIndex, tradeQuote, from, assertGetTonChainAdapter }) => {
34
+ if (!isExecutableTradeQuote(tradeQuote)) {
35
+ throw new Error('Unable to execute a trade rate quote');
36
+ }
37
+ const step = getExecutableTradeStep(tradeQuote, stepIndex);
38
+ const { accountNumber, sellAsset, stonfiSpecific } = step;
39
+ if (!stonfiSpecific) {
40
+ throw new Error('stonfiSpecific is required');
41
+ }
42
+ const adapter = assertGetTonChainAdapter(sellAsset.chainId);
43
+ const storedQuote = {
44
+ quoteId: stonfiSpecific.quoteId,
45
+ resolverId: stonfiSpecific.resolverId,
46
+ resolverName: stonfiSpecific.resolverName,
47
+ bidAssetAddress: stonfiSpecific.bidAssetAddress,
48
+ askAssetAddress: stonfiSpecific.askAssetAddress,
49
+ bidUnits: stonfiSpecific.bidUnits,
50
+ askUnits: stonfiSpecific.askUnits,
51
+ referrerAddress: stonfiSpecific.referrerAddress,
52
+ referrerFeeAsset: stonfiSpecific.referrerFeeAsset,
53
+ referrerFeeUnits: stonfiSpecific.referrerFeeUnits,
54
+ protocolFeeAsset: stonfiSpecific.protocolFeeAsset,
55
+ protocolFeeUnits: stonfiSpecific.protocolFeeUnits,
56
+ quoteTimestamp: stonfiSpecific.quoteTimestamp,
57
+ tradeStartDeadline: stonfiSpecific.tradeStartDeadline,
58
+ gasBudget: stonfiSpecific.gasBudget,
59
+ estimatedGasConsumption: stonfiSpecific.estimatedGasConsumption,
60
+ params: stonfiSpecific.params,
61
+ };
62
+ const omniston = omnistonManager.getInstance();
63
+ const maxRetries = 3;
64
+ let lastError = null;
65
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
66
+ try {
67
+ const txResponse = await omniston.buildTransfer({
68
+ sourceAddress: { blockchain: Blockchain.TON, address: from },
69
+ destinationAddress: {
70
+ blockchain: Blockchain.TON,
71
+ address: tradeQuote.receiveAddress,
72
+ },
73
+ quote: storedQuote,
74
+ useRecommendedSlippage: true,
75
+ });
76
+ if (!txResponse?.ton?.messages || txResponse.ton.messages.length === 0) {
77
+ throw new Error('No TON messages returned from buildTransfer');
78
+ }
79
+ const expireAt = Math.floor(Date.now() / 1000) + 300;
80
+ const convertBase64ToHex = (base64) => {
81
+ if (!base64)
82
+ return '';
83
+ return Buffer.from(base64, 'base64').toString('hex');
84
+ };
85
+ const rawMessages = txResponse.ton.messages.map(msg => ({
86
+ targetAddress: msg.targetAddress,
87
+ sendAmount: msg.sendAmount,
88
+ payload: convertBase64ToHex(msg.payload),
89
+ stateInit: convertBase64ToHex(msg.jettonWalletStateInit),
90
+ }));
91
+ const seqno = await adapter.getSeqno(from);
92
+ return {
93
+ addressNList: toAddressNList(adapter.getBip44Params({ accountNumber })),
94
+ rawMessages,
95
+ seqno,
96
+ expireAt,
97
+ };
98
+ }
99
+ catch (err) {
100
+ lastError = err instanceof Error ? err : new Error(String(err));
101
+ console.error(`[Stonfi] buildTransfer attempt ${attempt}/${maxRetries} failed:`, lastError.message);
102
+ if (attempt < maxRetries) {
103
+ await new Promise(resolve => setTimeout(resolve, 1000 * attempt));
104
+ }
105
+ }
106
+ }
107
+ throw lastError ?? new Error('Failed to build transfer after retries');
108
+ },
109
+ getTonTransactionFees: ({ tradeQuote, stepIndex }) => {
110
+ if (!isExecutableTradeQuote(tradeQuote)) {
111
+ throw new Error('Unable to execute a trade rate quote');
112
+ }
113
+ const step = getExecutableTradeStep(tradeQuote, stepIndex);
114
+ if (!step.feeData.networkFeeCryptoBaseUnit) {
115
+ throw new Error('Missing network fee in quote');
116
+ }
117
+ return Promise.resolve(step.feeData.networkFeeCryptoBaseUnit);
118
+ },
119
+ checkTradeStatus: async ({ swap, assertGetTonChainAdapter }) => {
120
+ if (!swap?.sellTxHash) {
121
+ return createDefaultStatusResponse();
122
+ }
123
+ const { sellTxHash } = swap;
124
+ const checkTxStatusViaChainAdapter = async () => {
125
+ try {
126
+ const adapter = assertGetTonChainAdapter(swap.sellAsset.chainId);
127
+ const tx = await adapter.parseTx(sellTxHash, '');
128
+ return {
129
+ status: tx.status,
130
+ buyTxHash: tx.status === TxStatus.Confirmed ? sellTxHash : undefined,
131
+ message: undefined,
132
+ };
133
+ }
134
+ catch (err) {
135
+ console.error('[Stonfi] Error checking tx status via chain adapter:', err);
136
+ return createDefaultStatusResponse(sellTxHash);
137
+ }
138
+ };
139
+ const { metadata } = swap;
140
+ if (!metadata?.quoteId) {
141
+ return checkTxStatusViaChainAdapter();
142
+ }
143
+ try {
144
+ const tradeStatus = await waitForFirstTradeStatus({
145
+ quoteId: metadata.quoteId,
146
+ traderWalletAddress: {
147
+ blockchain: Blockchain.TON,
148
+ address: swap.sellAccountId.split(':')[2] ?? '',
149
+ },
150
+ outgoingTxHash: sellTxHash,
151
+ }, TRADE_TRACKING_TIMEOUT_MS);
152
+ if (!tradeStatus?.status) {
153
+ return checkTxStatusViaChainAdapter();
154
+ }
155
+ const statusOneOf = tradeStatus.status;
156
+ if (statusOneOf.awaitingTransfer ||
157
+ statusOneOf.transferring ||
158
+ statusOneOf.swapping ||
159
+ statusOneOf.receivingFunds) {
160
+ const chainStatus = await checkTxStatusViaChainAdapter();
161
+ if (chainStatus.status === TxStatus.Confirmed) {
162
+ return chainStatus;
163
+ }
164
+ if (statusOneOf.awaitingTransfer) {
165
+ return {
166
+ status: TxStatus.Pending,
167
+ buyTxHash: undefined,
168
+ message: 'trade.statuses.awaitingDeposit',
169
+ };
170
+ }
171
+ if (statusOneOf.transferring) {
172
+ return {
173
+ status: TxStatus.Pending,
174
+ buyTxHash: undefined,
175
+ message: 'trade.statuses.depositing',
176
+ };
177
+ }
178
+ if (statusOneOf.swapping) {
179
+ return {
180
+ status: TxStatus.Pending,
181
+ buyTxHash: undefined,
182
+ message: 'trade.statuses.swapping',
183
+ };
184
+ }
185
+ if (statusOneOf.receivingFunds) {
186
+ return {
187
+ status: TxStatus.Pending,
188
+ buyTxHash: undefined,
189
+ message: 'trade.statuses.receivingFunds',
190
+ };
191
+ }
192
+ }
193
+ if (statusOneOf.tradeSettled) {
194
+ const result = statusOneOf.tradeSettled.result;
195
+ if (result === 'TRADE_RESULT_FULLY_FILLED') {
196
+ return {
197
+ status: TxStatus.Confirmed,
198
+ buyTxHash: sellTxHash,
199
+ message: undefined,
200
+ };
201
+ }
202
+ if (result === 'TRADE_RESULT_PARTIALLY_FILLED') {
203
+ return {
204
+ status: TxStatus.Confirmed,
205
+ buyTxHash: sellTxHash,
206
+ message: 'trade.statuses.partiallyFilled',
207
+ };
208
+ }
209
+ if (result === 'TRADE_RESULT_ABORTED') {
210
+ return {
211
+ status: TxStatus.Failed,
212
+ buyTxHash: undefined,
213
+ message: 'trade.statuses.aborted',
214
+ };
215
+ }
216
+ }
217
+ return checkTxStatusViaChainAdapter();
218
+ }
219
+ catch (err) {
220
+ console.error('[Stonfi] Error checking trade status via Omniston:', err);
221
+ return checkTxStatusViaChainAdapter();
222
+ }
223
+ },
224
+ };
@@ -0,0 +1,4 @@
1
+ export { stonfiApi } from './endpoints.js';
2
+ export { stonfiSwapper } from './StonfiSwapper.js';
3
+ export * from './types.js';
4
+ export { STONFI_SUPPORTED_CHAIN_IDS, STONFI_WEBSOCKET_URL } from './utils/constants.js';
@@ -0,0 +1,4 @@
1
+ export { stonfiApi } from './endpoints.js';
2
+ export { stonfiSwapper } from './StonfiSwapper.js';
3
+ export * from './types.js';
4
+ export { STONFI_SUPPORTED_CHAIN_IDS, STONFI_WEBSOCKET_URL } from './utils/constants.js';
@@ -0,0 +1,2 @@
1
+ import type { CommonTradeQuoteInput, TradeQuoteResult } from '../../../types.js';
2
+ export declare const getTradeQuote: (input: CommonTradeQuoteInput) => Promise<TradeQuoteResult>;
@@ -0,0 +1,115 @@
1
+ import { Err, Ok } from '@sniptt/monads';
2
+ import { SettlementMethod } from '@ston-fi/omniston-sdk';
3
+ import { SwapperName, TradeQuoteError } from '../../../types.js';
4
+ import { makeSwapErrorRight } from '../../../utils.js';
5
+ import { getTreasuryAddressFromChainId } from '../../utils/helpers/helpers.js';
6
+ import { STONFI_DEFAULT_SLIPPAGE_BPS, STONFI_QUOTE_TIMEOUT_MS } from '../utils/constants.js';
7
+ import { affiliateBpsToNumber, calculateRate, slippageDecimalToBps, tonAddressToOmnistonAddress, validateTonAssets, waitForQuote, } from '../utils/helpers.js';
8
+ import { omnistonManager } from '../utils/omnistonManager.js';
9
+ const buildStonfiSpecific = (quote, bidAssetAddress, askAssetAddress) => ({
10
+ quoteId: quote.quoteId,
11
+ resolverId: quote.resolverId,
12
+ resolverName: quote.resolverName,
13
+ tradeStartDeadline: quote.tradeStartDeadline,
14
+ gasBudget: quote.gasBudget,
15
+ bidAssetAddress: quote.bidAssetAddress ?? bidAssetAddress,
16
+ askAssetAddress: quote.askAssetAddress ?? askAssetAddress,
17
+ bidUnits: quote.bidUnits,
18
+ askUnits: quote.askUnits,
19
+ referrerAddress: quote.referrerAddress,
20
+ referrerFeeAsset: quote.referrerFeeAsset,
21
+ referrerFeeUnits: quote.referrerFeeUnits,
22
+ protocolFeeAsset: quote.protocolFeeAsset,
23
+ protocolFeeUnits: quote.protocolFeeUnits,
24
+ quoteTimestamp: quote.quoteTimestamp,
25
+ estimatedGasConsumption: quote.estimatedGasConsumption,
26
+ params: quote.params,
27
+ });
28
+ export const getTradeQuote = async (input) => {
29
+ const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, receiveAddress, accountNumber, slippageTolerancePercentageDecimal, affiliateBps, } = input;
30
+ const validation = validateTonAssets(sellAsset, buyAsset);
31
+ if (!validation.isValid) {
32
+ return validation.error;
33
+ }
34
+ const { bidAssetAddress, askAssetAddress } = validation;
35
+ const omniston = omnistonManager.getInstance();
36
+ try {
37
+ const slippageBps = slippageDecimalToBps(slippageTolerancePercentageDecimal, STONFI_DEFAULT_SLIPPAGE_BPS);
38
+ const referrerFeeBps = affiliateBpsToNumber(affiliateBps);
39
+ const tonTreasuryAddress = getTreasuryAddressFromChainId(sellAsset.chainId);
40
+ const referrerAddress = tonAddressToOmnistonAddress(tonTreasuryAddress);
41
+ const quoteResult = await waitForQuote(omniston, {
42
+ settlementMethods: [SettlementMethod.SETTLEMENT_METHOD_SWAP],
43
+ bidAssetAddress,
44
+ askAssetAddress,
45
+ amount: { bidUnits: sellAmountIncludingProtocolFeesCryptoBaseUnit },
46
+ referrerAddress,
47
+ referrerFeeBps,
48
+ settlementParams: {
49
+ maxPriceSlippageBps: slippageBps,
50
+ gaslessSettlement: 'GASLESS_SETTLEMENT_PROHIBITED',
51
+ flexibleReferrerFee: true,
52
+ },
53
+ }, STONFI_QUOTE_TIMEOUT_MS);
54
+ if (quoteResult.type === 'error') {
55
+ console.error('[Stonfi] Quote request error:', quoteResult.error);
56
+ return Err(makeSwapErrorRight({
57
+ message: `[Stonfi] Connection error while fetching quote`,
58
+ code: TradeQuoteError.QueryFailed,
59
+ cause: quoteResult.error,
60
+ }));
61
+ }
62
+ if (quoteResult.type === 'timeout') {
63
+ return Err(makeSwapErrorRight({
64
+ message: `[Stonfi] Quote request timed out`,
65
+ code: TradeQuoteError.QueryFailed,
66
+ }));
67
+ }
68
+ if (quoteResult.type === 'noQuote') {
69
+ return Err(makeSwapErrorRight({
70
+ message: `[Stonfi] No quote available for this pair`,
71
+ code: TradeQuoteError.NoRouteFound,
72
+ }));
73
+ }
74
+ const quote = quoteResult.quote;
75
+ const buyAmountCryptoBaseUnit = quote.askUnits;
76
+ const networkFeeCryptoBaseUnit = quote.gasBudget;
77
+ const rate = calculateRate(buyAmountCryptoBaseUnit, sellAmountIncludingProtocolFeesCryptoBaseUnit, buyAsset.precision, sellAsset.precision);
78
+ const tradeQuote = {
79
+ id: quote.quoteId,
80
+ rate,
81
+ receiveAddress,
82
+ affiliateBps,
83
+ slippageTolerancePercentageDecimal: slippageTolerancePercentageDecimal ?? String(STONFI_DEFAULT_SLIPPAGE_BPS / 10000),
84
+ quoteOrRate: 'quote',
85
+ swapperName: SwapperName.Stonfi,
86
+ steps: [
87
+ {
88
+ buyAmountBeforeFeesCryptoBaseUnit: buyAmountCryptoBaseUnit,
89
+ buyAmountAfterFeesCryptoBaseUnit: buyAmountCryptoBaseUnit,
90
+ sellAmountIncludingProtocolFeesCryptoBaseUnit,
91
+ feeData: {
92
+ networkFeeCryptoBaseUnit,
93
+ protocolFees: undefined,
94
+ },
95
+ rate,
96
+ source: SwapperName.Stonfi,
97
+ buyAsset,
98
+ sellAsset,
99
+ accountNumber,
100
+ allowanceContract: '0x0',
101
+ estimatedExecutionTimeMs: 30000,
102
+ stonfiSpecific: buildStonfiSpecific(quote, bidAssetAddress, askAssetAddress),
103
+ },
104
+ ],
105
+ };
106
+ return Ok([tradeQuote]);
107
+ }
108
+ catch (err) {
109
+ return Err(makeSwapErrorRight({
110
+ message: `[Stonfi] Error getting quote: ${err}`,
111
+ code: TradeQuoteError.QueryFailed,
112
+ cause: err,
113
+ }));
114
+ }
115
+ };
@@ -0,0 +1,2 @@
1
+ import type { GetTradeRateInput, TradeRateResult } from '../../../types.js';
2
+ export declare const getTradeRate: (input: GetTradeRateInput) => Promise<TradeRateResult>;
@@ -0,0 +1,101 @@
1
+ import { Err, Ok } from '@sniptt/monads';
2
+ import { SettlementMethod } from '@ston-fi/omniston-sdk';
3
+ import { SwapperName, TradeQuoteError } from '../../../types.js';
4
+ import { makeSwapErrorRight } from '../../../utils.js';
5
+ import { getTreasuryAddressFromChainId } from '../../utils/helpers/helpers.js';
6
+ import { STONFI_DEFAULT_SLIPPAGE_BPS, STONFI_QUOTE_TIMEOUT_MS } from '../utils/constants.js';
7
+ import { affiliateBpsToNumber, calculateRate, slippageDecimalToBps, tonAddressToOmnistonAddress, validateTonAssets, waitForQuote, } from '../utils/helpers.js';
8
+ import { omnistonManager } from '../utils/omnistonManager.js';
9
+ const buildStonfiSpecific = (quote, bidAssetAddress, askAssetAddress) => ({
10
+ quoteId: quote.quoteId,
11
+ resolverId: quote.resolverId,
12
+ resolverName: quote.resolverName,
13
+ tradeStartDeadline: quote.tradeStartDeadline,
14
+ gasBudget: quote.gasBudget,
15
+ bidAssetAddress: quote.bidAssetAddress ?? bidAssetAddress,
16
+ askAssetAddress: quote.askAssetAddress ?? askAssetAddress,
17
+ bidUnits: quote.bidUnits,
18
+ askUnits: quote.askUnits,
19
+ referrerAddress: quote.referrerAddress,
20
+ referrerFeeAsset: quote.referrerFeeAsset,
21
+ referrerFeeUnits: quote.referrerFeeUnits,
22
+ protocolFeeAsset: quote.protocolFeeAsset,
23
+ protocolFeeUnits: quote.protocolFeeUnits,
24
+ quoteTimestamp: quote.quoteTimestamp,
25
+ estimatedGasConsumption: quote.estimatedGasConsumption,
26
+ params: quote.params,
27
+ });
28
+ export const getTradeRate = async (input) => {
29
+ const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, receiveAddress, slippageTolerancePercentageDecimal, affiliateBps, } = input;
30
+ const validation = validateTonAssets(sellAsset, buyAsset);
31
+ if (!validation.isValid) {
32
+ return validation.error;
33
+ }
34
+ const { bidAssetAddress, askAssetAddress } = validation;
35
+ const omniston = omnistonManager.getInstance();
36
+ try {
37
+ const slippageBps = slippageDecimalToBps(slippageTolerancePercentageDecimal, STONFI_DEFAULT_SLIPPAGE_BPS);
38
+ const referrerFeeBps = affiliateBpsToNumber(affiliateBps);
39
+ const tonTreasuryAddress = getTreasuryAddressFromChainId(sellAsset.chainId);
40
+ const referrerAddress = tonAddressToOmnistonAddress(tonTreasuryAddress);
41
+ const quoteResult = await waitForQuote(omniston, {
42
+ settlementMethods: [SettlementMethod.SETTLEMENT_METHOD_SWAP],
43
+ bidAssetAddress,
44
+ askAssetAddress,
45
+ amount: { bidUnits: sellAmountIncludingProtocolFeesCryptoBaseUnit },
46
+ referrerAddress,
47
+ referrerFeeBps,
48
+ settlementParams: {
49
+ maxPriceSlippageBps: slippageBps,
50
+ gaslessSettlement: 'GASLESS_SETTLEMENT_PROHIBITED',
51
+ flexibleReferrerFee: true,
52
+ },
53
+ }, STONFI_QUOTE_TIMEOUT_MS);
54
+ if (quoteResult.type !== 'success') {
55
+ return Err(makeSwapErrorRight({
56
+ message: `[Stonfi] No quote available for this pair`,
57
+ code: TradeQuoteError.NoRouteFound,
58
+ }));
59
+ }
60
+ const quote = quoteResult.quote;
61
+ const buyAmountCryptoBaseUnit = quote.askUnits;
62
+ const networkFeeCryptoBaseUnit = quote.gasBudget;
63
+ const rate = calculateRate(buyAmountCryptoBaseUnit, sellAmountIncludingProtocolFeesCryptoBaseUnit, buyAsset.precision, sellAsset.precision);
64
+ const tradeRate = {
65
+ id: quote.quoteId,
66
+ rate,
67
+ receiveAddress,
68
+ affiliateBps,
69
+ slippageTolerancePercentageDecimal: slippageTolerancePercentageDecimal ?? String(STONFI_DEFAULT_SLIPPAGE_BPS / 10000),
70
+ quoteOrRate: 'rate',
71
+ swapperName: SwapperName.Stonfi,
72
+ steps: [
73
+ {
74
+ buyAmountBeforeFeesCryptoBaseUnit: buyAmountCryptoBaseUnit,
75
+ buyAmountAfterFeesCryptoBaseUnit: buyAmountCryptoBaseUnit,
76
+ sellAmountIncludingProtocolFeesCryptoBaseUnit,
77
+ feeData: {
78
+ networkFeeCryptoBaseUnit,
79
+ protocolFees: undefined,
80
+ },
81
+ rate,
82
+ source: SwapperName.Stonfi,
83
+ buyAsset,
84
+ sellAsset,
85
+ accountNumber: undefined,
86
+ allowanceContract: '0x0000000000000000000000000000000000000000',
87
+ estimatedExecutionTimeMs: 30000,
88
+ stonfiSpecific: buildStonfiSpecific(quote, bidAssetAddress, askAssetAddress),
89
+ },
90
+ ],
91
+ };
92
+ return Ok([tradeRate]);
93
+ }
94
+ catch (err) {
95
+ return Err(makeSwapErrorRight({
96
+ message: `[Stonfi] Error getting rate: ${err}`,
97
+ code: TradeQuoteError.QueryFailed,
98
+ cause: err,
99
+ }));
100
+ }
101
+ };
@@ -0,0 +1,60 @@
1
+ import { KnownChainIds } from '@shapeshiftoss/types';
2
+ import type { Result } from '@sniptt/monads';
3
+ import type { Quote } from '@ston-fi/omniston-sdk';
4
+ import type { SwapErrorRight } from '../../types.js';
5
+ export type StonfiSupportedChainId = typeof KnownChainIds.TonMainnet;
6
+ export declare const stonfiSupportedChainIds: readonly [KnownChainIds.TonMainnet];
7
+ export type OmnistonAssetAddress = {
8
+ blockchain: number;
9
+ address: string;
10
+ };
11
+ export type TonAssetValidationResult = {
12
+ isValid: true;
13
+ bidAssetAddress: OmnistonAssetAddress;
14
+ askAssetAddress: OmnistonAssetAddress;
15
+ } | {
16
+ isValid: false;
17
+ error: Result<never, SwapErrorRight>;
18
+ };
19
+ export type QuoteResult = {
20
+ type: 'success';
21
+ quote: Quote;
22
+ } | {
23
+ type: 'noQuote';
24
+ } | {
25
+ type: 'timeout';
26
+ } | {
27
+ type: 'error';
28
+ error: unknown;
29
+ };
30
+ export type StonfiQuote = {
31
+ quoteId: string;
32
+ resolverId: string;
33
+ resolverName: string;
34
+ bidAssetAddress: string;
35
+ askAssetAddress: string;
36
+ bidUnits: string;
37
+ askUnits: string;
38
+ gasBudget: string;
39
+ estimatedGasConsumption: string;
40
+ tradeStartDeadline: number;
41
+ };
42
+ export type StonfiTradeSpecific = {
43
+ quoteId: string;
44
+ resolverId: string;
45
+ resolverName: string;
46
+ tradeStartDeadline: number;
47
+ gasBudget: string;
48
+ bidAssetAddress: OmnistonAssetAddress;
49
+ askAssetAddress: OmnistonAssetAddress;
50
+ bidUnits: string;
51
+ askUnits: string;
52
+ referrerAddress?: OmnistonAssetAddress;
53
+ referrerFeeAsset?: OmnistonAssetAddress;
54
+ referrerFeeUnits: string;
55
+ protocolFeeAsset?: OmnistonAssetAddress;
56
+ protocolFeeUnits: string;
57
+ quoteTimestamp: number;
58
+ estimatedGasConsumption: string;
59
+ params?: unknown;
60
+ };
@@ -0,0 +1,2 @@
1
+ import { KnownChainIds } from '@shapeshiftoss/types';
2
+ export const stonfiSupportedChainIds = [KnownChainIds.TonMainnet];
@@ -0,0 +1,5 @@
1
+ import { KnownChainIds } from '@shapeshiftoss/types';
2
+ export declare const STONFI_SUPPORTED_CHAIN_IDS: readonly [KnownChainIds.TonMainnet];
3
+ export declare const STONFI_WEBSOCKET_URL = "wss://omni-ws.ston.fi";
4
+ export declare const STONFI_DEFAULT_SLIPPAGE_BPS = 100;
5
+ export declare const STONFI_QUOTE_TIMEOUT_MS = 30000;
@@ -0,0 +1,5 @@
1
+ import { KnownChainIds } from '@shapeshiftoss/types';
2
+ export const STONFI_SUPPORTED_CHAIN_IDS = [KnownChainIds.TonMainnet];
3
+ export const STONFI_WEBSOCKET_URL = 'wss://omni-ws.ston.fi';
4
+ export const STONFI_DEFAULT_SLIPPAGE_BPS = 100;
5
+ export const STONFI_QUOTE_TIMEOUT_MS = 30000;
@@ -0,0 +1,11 @@
1
+ import type { Asset } from '@shapeshiftoss/types';
2
+ import type { Omniston, QuoteRequest } from '@ston-fi/omniston-sdk';
3
+ import type { OmnistonAssetAddress, QuoteResult, TonAssetValidationResult } from '../types.js';
4
+ export declare const isTonAsset: (asset: Asset) => boolean;
5
+ export declare const assetToOmnistonAddress: (asset: Asset) => OmnistonAssetAddress | null;
6
+ export declare const validateTonAssets: (sellAsset: Asset, buyAsset: Asset) => TonAssetValidationResult;
7
+ export declare const calculateRate: (buyAmountCryptoBaseUnit: string, sellAmountCryptoBaseUnit: string, buyAssetPrecision: number, sellAssetPrecision: number) => string;
8
+ export declare const slippageDecimalToBps: (slippageTolerancePercentageDecimal: string | undefined, defaultSlippageBps: number) => number;
9
+ export declare const tonAddressToOmnistonAddress: (address: string) => OmnistonAssetAddress;
10
+ export declare const affiliateBpsToNumber: (affiliateBps: string | undefined) => number;
11
+ export declare const waitForQuote: (omniston: Omniston, request: QuoteRequest, timeoutMs: number) => Promise<QuoteResult>;