@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.
- package/dist/cjs/.tsbuildinfo +1 -1
- package/dist/cjs/constants.js +15 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +1 -2
- package/dist/cjs/swappers/BebopSwapper/utils/fetchFromBebop.d.ts +2 -1
- package/dist/cjs/swappers/BebopSwapper/utils/fetchFromBebop.js +21 -15
- package/dist/cjs/swappers/BebopSwapper/utils/getBebopSolanaTradeContext.js +1 -0
- package/dist/cjs/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/ChainflipSwapper/swapperApi/getTradeQuote.js +1 -2
- package/dist/cjs/swappers/ChainflipSwapper/types.d.ts +1 -0
- package/dist/cjs/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/FyndSwapper/FyndSwapper.d.ts +2 -0
- package/dist/cjs/swappers/FyndSwapper/FyndSwapper.js +5 -0
- package/dist/cjs/swappers/FyndSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/FyndSwapper/endpoints.js +14 -0
- package/dist/cjs/swappers/FyndSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
- package/dist/cjs/swappers/FyndSwapper/getTradeQuote/getTradeQuote.js +43 -0
- package/dist/cjs/swappers/FyndSwapper/getTradeRate/getTradeRate.d.ts +4 -0
- package/dist/cjs/swappers/FyndSwapper/getTradeRate/getTradeRate.js +34 -0
- package/dist/cjs/swappers/FyndSwapper/index.d.ts +2 -0
- package/dist/cjs/swappers/FyndSwapper/index.js +7 -0
- package/dist/cjs/swappers/FyndSwapper/types.d.ts +41 -0
- package/dist/cjs/swappers/FyndSwapper/types.js +2 -0
- package/dist/cjs/swappers/FyndSwapper/utils/constants.d.ts +33 -0
- package/dist/cjs/swappers/FyndSwapper/utils/constants.js +38 -0
- package/dist/cjs/swappers/FyndSwapper/utils/fetchFromFynd.d.ts +13 -0
- package/dist/cjs/swappers/FyndSwapper/utils/fetchFromFynd.js +42 -0
- package/dist/cjs/swappers/FyndSwapper/utils/fyndService.d.ts +5 -0
- package/dist/cjs/swappers/FyndSwapper/utils/fyndService.js +9 -0
- package/dist/cjs/swappers/FyndSwapper/utils/getFyndStepData.d.ts +25 -0
- package/dist/cjs/swappers/FyndSwapper/utils/getFyndStepData.js +48 -0
- package/dist/cjs/swappers/FyndSwapper/utils/getFyndTradeContext.d.ts +18 -0
- package/dist/cjs/swappers/FyndSwapper/utils/getFyndTradeContext.js +94 -0
- package/dist/cjs/swappers/FyndSwapper/utils/helpers.d.ts +24 -0
- package/dist/cjs/swappers/FyndSwapper/utils/helpers.js +174 -0
- package/dist/cjs/swappers/FyndSwapper/utils/helpers.test.d.ts +1 -0
- package/dist/cjs/swappers/FyndSwapper/utils/helpers.test.js +101 -0
- package/dist/cjs/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +0 -1
- package/dist/cjs/swappers/PortalsSwapper/endpoints.js +4 -1
- package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +1 -1
- package/dist/cjs/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +2 -3
- package/dist/cjs/swappers/RelaySwapper/utils/getRelayTradeContext.d.ts +1 -0
- package/dist/cjs/swappers/RelaySwapper/utils/getRelayTradeContext.js +4 -0
- package/dist/cjs/swappers/RelaySwapper/utils/relayStatus.js +3 -3
- package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +9 -4
- package/dist/cjs/swappers/SymbiosisSwapper/SymbiosisSwapper.d.ts +2 -0
- package/dist/cjs/swappers/SymbiosisSwapper/SymbiosisSwapper.js +8 -0
- package/dist/cjs/swappers/SymbiosisSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/SymbiosisSwapper/endpoints.js +66 -0
- package/dist/cjs/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
- package/dist/cjs/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.js +42 -0
- package/dist/cjs/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.d.ts +4 -0
- package/dist/cjs/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.js +34 -0
- package/dist/cjs/swappers/SymbiosisSwapper/index.d.ts +2 -0
- package/dist/cjs/swappers/SymbiosisSwapper/index.js +7 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/constants.d.ts +19 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/constants.js +64 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.d.ts +26 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.js +106 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.d.ts +1 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.js +161 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.d.ts +17 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.js +146 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.d.ts +38 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.js +172 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.test.d.ts +1 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.test.js +151 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/symbiosisService.d.ts +5 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/symbiosisService.js +18 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/types.d.ts +83 -0
- package/dist/cjs/swappers/SymbiosisSwapper/utils/types.js +11 -0
- package/dist/cjs/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +1 -0
- package/dist/cjs/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +1 -0
- package/dist/cjs/swappers/ThorchainSwapper/utils/getLongtailQuote.js +1 -1
- package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +24 -1
- package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.d.ts +1 -0
- package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.js +110 -0
- package/dist/cjs/swappers/ZrxSwapper/types.d.ts +2 -1
- package/dist/cjs/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.d.ts +1 -0
- package/dist/cjs/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.js +26 -0
- package/dist/cjs/types.d.ts +6 -5
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/utils/helpers.d.ts +1 -2
- package/dist/cjs/utils/helpers.js +8 -32
- package/dist/cjs/utils/helpers.test.js +6 -2
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/constants.js +15 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
- package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +1 -2
- package/dist/esm/swappers/BebopSwapper/utils/fetchFromBebop.d.ts +2 -1
- package/dist/esm/swappers/BebopSwapper/utils/fetchFromBebop.js +21 -15
- package/dist/esm/swappers/BebopSwapper/utils/getBebopSolanaTradeContext.js +1 -0
- package/dist/esm/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +0 -2
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +0 -2
- package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +0 -2
- package/dist/esm/swappers/ChainflipSwapper/swapperApi/getTradeQuote.js +1 -2
- package/dist/esm/swappers/ChainflipSwapper/types.d.ts +1 -0
- package/dist/esm/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
- package/dist/esm/swappers/FyndSwapper/FyndSwapper.d.ts +2 -0
- package/dist/esm/swappers/FyndSwapper/FyndSwapper.js +2 -0
- package/dist/esm/swappers/FyndSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/FyndSwapper/endpoints.js +11 -0
- package/dist/esm/swappers/FyndSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
- package/dist/esm/swappers/FyndSwapper/getTradeQuote/getTradeQuote.js +39 -0
- package/dist/esm/swappers/FyndSwapper/getTradeRate/getTradeRate.d.ts +4 -0
- package/dist/esm/swappers/FyndSwapper/getTradeRate/getTradeRate.js +30 -0
- package/dist/esm/swappers/FyndSwapper/index.d.ts +2 -0
- package/dist/esm/swappers/FyndSwapper/index.js +2 -0
- package/dist/esm/swappers/FyndSwapper/types.d.ts +41 -0
- package/dist/esm/swappers/FyndSwapper/types.js +1 -0
- package/dist/esm/swappers/FyndSwapper/utils/constants.d.ts +33 -0
- package/dist/esm/swappers/FyndSwapper/utils/constants.js +35 -0
- package/dist/esm/swappers/FyndSwapper/utils/fetchFromFynd.d.ts +13 -0
- package/dist/esm/swappers/FyndSwapper/utils/fetchFromFynd.js +38 -0
- package/dist/esm/swappers/FyndSwapper/utils/fyndService.d.ts +5 -0
- package/dist/esm/swappers/FyndSwapper/utils/fyndService.js +3 -0
- package/dist/esm/swappers/FyndSwapper/utils/getFyndStepData.d.ts +25 -0
- package/dist/esm/swappers/FyndSwapper/utils/getFyndStepData.js +44 -0
- package/dist/esm/swappers/FyndSwapper/utils/getFyndTradeContext.d.ts +18 -0
- package/dist/esm/swappers/FyndSwapper/utils/getFyndTradeContext.js +90 -0
- package/dist/esm/swappers/FyndSwapper/utils/helpers.d.ts +24 -0
- package/dist/esm/swappers/FyndSwapper/utils/helpers.js +162 -0
- package/dist/esm/swappers/FyndSwapper/utils/helpers.test.d.ts +1 -0
- package/dist/esm/swappers/FyndSwapper/utils/helpers.test.js +99 -0
- package/dist/esm/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +0 -1
- package/dist/esm/swappers/PortalsSwapper/endpoints.js +4 -1
- package/dist/esm/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +2 -2
- package/dist/esm/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +2 -3
- package/dist/esm/swappers/RelaySwapper/utils/getRelayTradeContext.d.ts +1 -0
- package/dist/esm/swappers/RelaySwapper/utils/getRelayTradeContext.js +5 -1
- package/dist/esm/swappers/RelaySwapper/utils/relayStatus.js +3 -3
- package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +9 -4
- package/dist/esm/swappers/SymbiosisSwapper/SymbiosisSwapper.d.ts +2 -0
- package/dist/esm/swappers/SymbiosisSwapper/SymbiosisSwapper.js +5 -0
- package/dist/esm/swappers/SymbiosisSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/SymbiosisSwapper/endpoints.js +63 -0
- package/dist/esm/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
- package/dist/esm/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.js +38 -0
- package/dist/esm/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.d.ts +4 -0
- package/dist/esm/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.js +30 -0
- package/dist/esm/swappers/SymbiosisSwapper/index.d.ts +2 -0
- package/dist/esm/swappers/SymbiosisSwapper/index.js +2 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/constants.d.ts +19 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/constants.js +61 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.d.ts +26 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.js +102 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.d.ts +1 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.js +159 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.d.ts +17 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.js +139 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.d.ts +38 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.js +156 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.test.d.ts +1 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.test.js +149 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/symbiosisService.d.ts +5 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/symbiosisService.js +12 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/types.d.ts +83 -0
- package/dist/esm/swappers/SymbiosisSwapper/utils/types.js +8 -0
- package/dist/esm/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +1 -0
- package/dist/esm/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +1 -0
- package/dist/esm/swappers/ThorchainSwapper/utils/getLongtailQuote.js +1 -1
- package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +25 -2
- package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.d.ts +1 -0
- package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.js +108 -0
- package/dist/esm/swappers/ZrxSwapper/types.d.ts +2 -1
- package/dist/esm/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.d.ts +1 -0
- package/dist/esm/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.js +22 -0
- package/dist/esm/types.d.ts +6 -5
- package/dist/esm/types.js +2 -0
- package/dist/esm/utils/helpers.d.ts +1 -2
- package/dist/esm/utils/helpers.js +9 -33
- package/dist/esm/utils/helpers.test.js +6 -2
- package/package.json +7 -7
package/dist/esm/constants.js
CHANGED
|
@@ -9,12 +9,14 @@ import { cetusApi, cetusSwapper } from './swappers/CetusSwapper/index.js';
|
|
|
9
9
|
import { chainflipApi, chainflipSwapper } from './swappers/ChainflipSwapper/index.js';
|
|
10
10
|
import { cowApi, cowSwapper } from './swappers/CowSwapper/index.js';
|
|
11
11
|
import { debridgeApi, debridgeSwapper } from './swappers/DebridgeSwapper/index.js';
|
|
12
|
+
import { fyndApi, fyndSwapper } from './swappers/FyndSwapper/index.js';
|
|
12
13
|
import { mayachainApi, mayachainSwapper } from './swappers/MayachainSwapper/index.js';
|
|
13
14
|
import { nearIntentsApi, nearIntentsSwapper } from './swappers/NearIntentsSwapper/index.js';
|
|
14
15
|
import { portalsApi, portalsSwapper } from './swappers/PortalsSwapper/index.js';
|
|
15
16
|
import { relayApi, relaySwapper } from './swappers/RelaySwapper/index.js';
|
|
16
17
|
import { stonfiApi, stonfiSwapper } from './swappers/StonfiSwapper/index.js';
|
|
17
18
|
import { sunioApi, sunioSwapper } from './swappers/SunioSwapper/index.js';
|
|
19
|
+
import { symbiosisApi, symbiosisSwapper } from './swappers/SymbiosisSwapper/index.js';
|
|
18
20
|
import { thorchainApi, thorchainSwapper } from './swappers/ThorchainSwapper/index.js';
|
|
19
21
|
import { zrxApi, zrxSwapper } from './swappers/ZrxSwapper/index.js';
|
|
20
22
|
import { SwapperName, TradeQuoteError } from './types.js';
|
|
@@ -99,6 +101,14 @@ export const swappers = {
|
|
|
99
101
|
...bobGatewaySwapper,
|
|
100
102
|
...bobGatewayApi,
|
|
101
103
|
},
|
|
104
|
+
[SwapperName.Symbiosis]: {
|
|
105
|
+
...symbiosisSwapper,
|
|
106
|
+
...symbiosisApi,
|
|
107
|
+
},
|
|
108
|
+
[SwapperName.Fynd]: {
|
|
109
|
+
...fyndSwapper,
|
|
110
|
+
...fyndApi,
|
|
111
|
+
},
|
|
102
112
|
[SwapperName.Test]: undefined,
|
|
103
113
|
};
|
|
104
114
|
const DEFAULT_SLIPPAGE_DECIMAL_PERCENTAGE = '0.002';
|
|
@@ -118,12 +128,15 @@ const DEFAULT_STONFI_SLIPPAGE_DECIMAL_PERCENTAGE = '0.01';
|
|
|
118
128
|
// deBridge API off-chain simulation overestimates output on some chains (e.g. SEI ~2.4%), so auto slippage (1%) is insufficient
|
|
119
129
|
const DEFAULT_DEBRIDGE_SLIPPAGE_DECIMAL_PERCENTAGE = '0.03';
|
|
120
130
|
const DEFAULT_BOB_GATEWAY_SLIPPAGE_DECIMAL_PERCENTAGE = '0.03';
|
|
131
|
+
// Symbiosis splits the tolerance across up to three legs, and a destination leg over its share pays out the transit token instead of reverting
|
|
132
|
+
const DEFAULT_SYMBIOSIS_SLIPPAGE_DECIMAL_PERCENTAGE = '0.01';
|
|
121
133
|
export const getDefaultSlippageDecimalPercentageForSwapper = (swapperName) => {
|
|
122
134
|
if (swapperName === undefined)
|
|
123
135
|
return DEFAULT_SLIPPAGE_DECIMAL_PERCENTAGE;
|
|
124
136
|
switch (swapperName) {
|
|
125
137
|
case SwapperName.Zrx:
|
|
126
138
|
case SwapperName.Bebop:
|
|
139
|
+
case SwapperName.Fynd:
|
|
127
140
|
case SwapperName.Test:
|
|
128
141
|
return DEFAULT_SLIPPAGE_DECIMAL_PERCENTAGE;
|
|
129
142
|
case SwapperName.CowSwap:
|
|
@@ -158,6 +171,8 @@ export const getDefaultSlippageDecimalPercentageForSwapper = (swapperName) => {
|
|
|
158
171
|
return DEFAULT_STONFI_SLIPPAGE_DECIMAL_PERCENTAGE;
|
|
159
172
|
case SwapperName.BobGateway:
|
|
160
173
|
return DEFAULT_BOB_GATEWAY_SLIPPAGE_DECIMAL_PERCENTAGE;
|
|
174
|
+
case SwapperName.Symbiosis:
|
|
175
|
+
return DEFAULT_SYMBIOSIS_SLIPPAGE_DECIMAL_PERCENTAGE;
|
|
161
176
|
default:
|
|
162
177
|
return assertUnreachable(swapperName);
|
|
163
178
|
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -15,11 +15,13 @@ export * from './swappers/ChainflipSwapper/index.js';
|
|
|
15
15
|
export * from './swappers/SunioSwapper/index.js';
|
|
16
16
|
export * from './swappers/CowSwapper/index.js';
|
|
17
17
|
export * from './swappers/DebridgeSwapper/index.js';
|
|
18
|
+
export * from './swappers/FyndSwapper/index.js';
|
|
18
19
|
export * from './swappers/PortalsSwapper/index.js';
|
|
19
20
|
export * from './swappers/ThorchainSwapper/index.js';
|
|
20
21
|
export * from './swappers/MayachainSwapper/index.js';
|
|
21
22
|
export * from './swappers/ButterSwap/index.js';
|
|
22
23
|
export * from './swappers/RelaySwapper/index.js';
|
|
24
|
+
export * from './swappers/SymbiosisSwapper/index.js';
|
|
23
25
|
export * from './utils/helpers.js';
|
|
24
26
|
export * from './utils/thorchain/index.js';
|
|
25
27
|
export * from './types.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -15,11 +15,13 @@ export * from './swappers/ChainflipSwapper/index.js';
|
|
|
15
15
|
export * from './swappers/SunioSwapper/index.js';
|
|
16
16
|
export * from './swappers/CowSwapper/index.js';
|
|
17
17
|
export * from './swappers/DebridgeSwapper/index.js';
|
|
18
|
+
export * from './swappers/FyndSwapper/index.js';
|
|
18
19
|
export * from './swappers/PortalsSwapper/index.js';
|
|
19
20
|
export * from './swappers/ThorchainSwapper/index.js';
|
|
20
21
|
export * from './swappers/MayachainSwapper/index.js';
|
|
21
22
|
export * from './swappers/ButterSwap/index.js';
|
|
22
23
|
export * from './swappers/RelaySwapper/index.js';
|
|
24
|
+
export * from './swappers/SymbiosisSwapper/index.js';
|
|
23
25
|
export * from './utils/helpers.js';
|
|
24
26
|
export * from './utils/thorchain/index.js';
|
|
25
27
|
export * from './types.js';
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { supportsETH } from '@shapeshiftoss/hdwallet-core';
|
|
2
2
|
import { Err, Ok } from '@sniptt/monads';
|
|
3
3
|
import { assertQuoteAddresses } from '../../../utils/index.js';
|
|
4
|
-
import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
|
|
5
4
|
import { getArbitrumBridgeStepData } from '../utils/getArbitrumBridgeStepData.js';
|
|
6
5
|
import { getArbitrumBridgeTradeContext } from '../utils/getArbitrumBridgeTradeContext.js';
|
|
7
6
|
export const getTradeQuoteWithWallet = async (inputWithWallet, deps) => {
|
|
@@ -33,7 +32,6 @@ export const getTradeQuote = async (input, deps) => {
|
|
|
33
32
|
const tradeQuote = {
|
|
34
33
|
...tradeCommon,
|
|
35
34
|
quoteOrRate: 'quote',
|
|
36
|
-
deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
|
|
37
35
|
receiveAddress,
|
|
38
36
|
steps: [
|
|
39
37
|
{
|
|
@@ -2,7 +2,6 @@ import { Err, Ok } from '@sniptt/monads';
|
|
|
2
2
|
import { validateAndParseAddress } from 'starknet';
|
|
3
3
|
import { TradeQuoteError } from '../../../types.js';
|
|
4
4
|
import { assertQuoteAddresses, makeSwapErrorRight } from '../../../utils/index.js';
|
|
5
|
-
import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
|
|
6
5
|
import { getAvnuTradeContext } from '../utils/getAvnuTradeContext.js';
|
|
7
6
|
export const getTradeQuote = async (input, deps) => {
|
|
8
7
|
const { sellAsset, accountNumber } = input;
|
|
@@ -33,7 +32,7 @@ export const getTradeQuote = async (input, deps) => {
|
|
|
33
32
|
...tradeCommon,
|
|
34
33
|
receiveAddress: normalizedReceiveAddress,
|
|
35
34
|
quoteOrRate: 'quote',
|
|
36
|
-
deadline
|
|
35
|
+
deadline,
|
|
37
36
|
steps: [
|
|
38
37
|
{
|
|
39
38
|
...stepCommon,
|
|
@@ -13,12 +13,13 @@ export declare const fetchBebopQuote: ({ buyAsset, sellAsset, sellAmountIncludin
|
|
|
13
13
|
affiliateBps?: string | undefined;
|
|
14
14
|
apiKey: string;
|
|
15
15
|
}) => Promise<Result<BebopQuoteResponse, SwapErrorRight>>;
|
|
16
|
-
export declare const fetchBebopSolanaQuote: ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, apiKey, }: {
|
|
16
|
+
export declare const fetchBebopSolanaQuote: ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, affiliateBps, apiKey, }: {
|
|
17
17
|
buyAsset: Asset;
|
|
18
18
|
sellAsset: Asset;
|
|
19
19
|
sellAmountIncludingProtocolFeesCryptoBaseUnit: string;
|
|
20
20
|
takerAddress: string;
|
|
21
21
|
receiverAddress: string;
|
|
22
22
|
slippageTolerancePercentageDecimal: string;
|
|
23
|
+
affiliateBps?: string | undefined;
|
|
23
24
|
apiKey: string;
|
|
24
25
|
}) => Promise<Result<BebopSolanaQuoteResponse, SwapErrorRight>>;
|
|
@@ -8,6 +8,9 @@ import { getTreasuryAddressFromChainId } from '../../../utils/helpers.js';
|
|
|
8
8
|
import { chainIdToBebopChain } from '../types.js';
|
|
9
9
|
import { bebopServiceFactory } from './bebopService.js';
|
|
10
10
|
import { assetIdToBebopSolanaToken, assetIdToBebopToken } from './helpers.js';
|
|
11
|
+
// PMM charges the fee set against our api key, which nets exactly this bps
|
|
12
|
+
const BEBOP_PMM_AFFILIATE_BPS = '60';
|
|
13
|
+
const isPmmEligible = (affiliateBps) => bnOrZero(affiliateBps).eq(BEBOP_PMM_AFFILIATE_BPS);
|
|
11
14
|
export const fetchBebopQuote = async ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, affiliateBps, apiKey, }) => {
|
|
12
15
|
try {
|
|
13
16
|
const sellToken = assetIdToBebopToken(sellAsset.assetId);
|
|
@@ -27,26 +30,24 @@ export const fetchBebopQuote = async ({ buyAsset, sellAsset, sellAmountIncluding
|
|
|
27
30
|
approval_type: 'Standard',
|
|
28
31
|
skip_validation: 'true',
|
|
29
32
|
gasless: 'false',
|
|
30
|
-
// PMM fees are configured against our api key on Bebop's side, not sent per quote
|
|
31
33
|
source: 'shapeshift',
|
|
32
34
|
};
|
|
33
35
|
const jamParams = new URLSearchParams(baseParams);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
jamParams.set('fee', affiliateBps);
|
|
38
|
-
jamParams.set('fee_recipient', getAddress(getTreasuryAddressFromChainId(buyAsset.chainId)));
|
|
39
|
-
}
|
|
36
|
+
// Without an explicit fee JAM charges our api key's flat fee, so 1 bps is the lowest it can go
|
|
37
|
+
jamParams.set('fee', affiliateBps && bnOrZero(affiliateBps).gt(0) ? affiliateBps : '1');
|
|
38
|
+
jamParams.set('fee_recipient', getAddress(getTreasuryAddressFromChainId(buyAsset.chainId)));
|
|
40
39
|
const service = bebopServiceFactory({ apiKey });
|
|
41
|
-
const
|
|
40
|
+
const requests = [
|
|
42
41
|
service.get(`https://api.bebop.xyz/jam/${chainName}/v2/quote`, {
|
|
43
42
|
params: jamParams,
|
|
44
43
|
}),
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
];
|
|
45
|
+
if (isPmmEligible(affiliateBps)) {
|
|
46
|
+
requests.push(service.get(`https://api.bebop.xyz/pmm/${chainName}/v3/quote`, {
|
|
47
|
+
params: new URLSearchParams(baseParams),
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
const maybeResponses = await Promise.all(requests);
|
|
50
51
|
if (maybeResponses.every(maybeResponse => maybeResponse.isErr())) {
|
|
51
52
|
return Err(makeSwapErrorRight({
|
|
52
53
|
message: 'Failed to fetch quote from Bebop',
|
|
@@ -76,8 +77,14 @@ export const fetchBebopQuote = async ({ buyAsset, sellAsset, sellAmountIncluding
|
|
|
76
77
|
}));
|
|
77
78
|
}
|
|
78
79
|
};
|
|
79
|
-
export const fetchBebopSolanaQuote = async ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, apiKey, }) => {
|
|
80
|
+
export const fetchBebopSolanaQuote = async ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, affiliateBps, apiKey, }) => {
|
|
80
81
|
try {
|
|
82
|
+
if (!isPmmEligible(affiliateBps)) {
|
|
83
|
+
return Err(makeSwapErrorRight({
|
|
84
|
+
message: 'Bebop Solana is PMM only and cannot take the requested bps',
|
|
85
|
+
code: TradeQuoteError.NoRouteFound,
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
81
88
|
// Bebop's Solana routes don't wrap native SOL on the input side, so selling native SOL
|
|
82
89
|
// always fails on-chain. Reject up front instead of returning an unexecutable quote.
|
|
83
90
|
if (sellAsset.assetId === solAssetId) {
|
|
@@ -100,7 +107,6 @@ export const fetchBebopSolanaQuote = async ({ buyAsset, sellAsset, sellAmountInc
|
|
|
100
107
|
approval_type: 'Standard',
|
|
101
108
|
skip_validation: 'false',
|
|
102
109
|
gasless: 'true',
|
|
103
|
-
// Solana is PMM only, so its fees are configured against our api key on Bebop's side
|
|
104
110
|
source: 'shapeshift',
|
|
105
111
|
});
|
|
106
112
|
const maybeResponse = await bebopServiceFactory({ apiKey }).get('https://api.bebop.xyz/pmm/solana/v3/quote', { params });
|
|
@@ -19,6 +19,7 @@ export const getBebopSolanaTradeContext = async ({ input, deps, takerAddress, re
|
|
|
19
19
|
takerAddress,
|
|
20
20
|
receiverAddress,
|
|
21
21
|
slippageTolerancePercentageDecimal,
|
|
22
|
+
affiliateBps,
|
|
22
23
|
apiKey: deps.config.VITE_BEBOP_API_KEY,
|
|
23
24
|
});
|
|
24
25
|
if (maybeBebopQuoteResponse.isErr())
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { btcChainId } from '@shapeshiftoss/caip';
|
|
2
2
|
import { Err, Ok } from '@sniptt/monads';
|
|
3
3
|
import { assertQuoteAddresses } from '../../../utils/index.js';
|
|
4
|
-
import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
|
|
5
4
|
import { getBobGatewayStepData } from '../utils/getBobGatewayStepData.js';
|
|
6
5
|
import { getBobGatewayTradeContext } from '../utils/getBobGatewayTradeContext.js';
|
|
7
6
|
export const getBobGatewayTradeQuote = async (input, deps) => {
|
|
@@ -35,7 +34,6 @@ export const getBobGatewayTradeQuote = async (input, deps) => {
|
|
|
35
34
|
const tradeQuote = {
|
|
36
35
|
...tradeCommon,
|
|
37
36
|
quoteOrRate: 'quote',
|
|
38
|
-
deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
|
|
39
37
|
receiveAddress,
|
|
40
38
|
steps: [
|
|
41
39
|
{
|
|
@@ -4,7 +4,6 @@ import { Err, Ok } from '@sniptt/monads';
|
|
|
4
4
|
import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
|
|
5
5
|
import { SwapperName, TradeQuoteError } from '../../../types.js';
|
|
6
6
|
import { assertQuoteAddresses, makeSwapErrorRight } from '../../../utils/index.js';
|
|
7
|
-
import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
|
|
8
7
|
import { getButterSwapStepData } from '../utils/getButterSwapStepData.js';
|
|
9
8
|
import { getButterSwapTradeContext } from '../utils/getButterSwapTradeContext.js';
|
|
10
9
|
import { fetchTxData, isBuildTxSuccess } from '../xhr.js';
|
|
@@ -60,7 +59,6 @@ export const getTradeQuote = async (input, deps) => {
|
|
|
60
59
|
const tradeQuote = {
|
|
61
60
|
...tradeCommon,
|
|
62
61
|
quoteOrRate: 'quote',
|
|
63
|
-
deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
|
|
64
62
|
receiveAddress,
|
|
65
63
|
steps: [
|
|
66
64
|
{
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Err, Ok } from '@sniptt/monads';
|
|
2
2
|
import { assertQuoteAddresses } from '../../../utils/index.js';
|
|
3
|
-
import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
|
|
4
3
|
import { getCetusStepData } from './getCetusStepData.js';
|
|
5
4
|
import { getCetusTradeContext } from './getCetusTradeContext.js';
|
|
6
5
|
export const getTradeQuote = async (input, deps) => {
|
|
@@ -25,7 +24,6 @@ export const getTradeQuote = async (input, deps) => {
|
|
|
25
24
|
const tradeQuote = {
|
|
26
25
|
...tradeCommon,
|
|
27
26
|
quoteOrRate: 'quote',
|
|
28
|
-
deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
|
|
29
27
|
receiveAddress,
|
|
30
28
|
steps: [
|
|
31
29
|
{
|
|
@@ -73,8 +73,7 @@ export const getTradeQuote = async (input, deps) => {
|
|
|
73
73
|
{
|
|
74
74
|
...stepCommon,
|
|
75
75
|
accountNumber,
|
|
76
|
-
|
|
77
|
-
swapperMetadata: { name: 'chainflip', swapId },
|
|
76
|
+
swapperMetadata: { name: 'chainflip', swapId, depositAddress },
|
|
78
77
|
transactionData,
|
|
79
78
|
feeData: { networkFeeCryptoBaseUnit, protocolFees },
|
|
80
79
|
},
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Err, Ok } from '@sniptt/monads';
|
|
2
2
|
import { assertQuoteAddresses } from '../../../utils/index.js';
|
|
3
|
-
import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
|
|
4
3
|
import { getDebridgeStepData } from '../utils/getDebridgeStepData.js';
|
|
5
4
|
import { getDebridgeTradeContext } from '../utils/getDebridgeTradeContext.js';
|
|
6
5
|
export const getTradeQuote = async (input, deps) => {
|
|
@@ -24,7 +23,6 @@ export const getTradeQuote = async (input, deps) => {
|
|
|
24
23
|
const tradeQuote = {
|
|
25
24
|
...tradeCommon,
|
|
26
25
|
quoteOrRate: 'quote',
|
|
27
|
-
deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
|
|
28
26
|
receiveAddress,
|
|
29
27
|
steps: [
|
|
30
28
|
{
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { checkEvmSwapStatus } from '../../utils/index.js';
|
|
2
|
+
import { getEvmTransactionFees, getUnsignedEvmTransaction } from '../../utils/evm/index.js';
|
|
3
|
+
import { getTradeQuote } from './getTradeQuote/getTradeQuote.js';
|
|
4
|
+
import { getTradeRate } from './getTradeRate/getTradeRate.js';
|
|
5
|
+
export const fyndApi = {
|
|
6
|
+
getTradeQuote: (input, deps) => getTradeQuote(input, deps),
|
|
7
|
+
getTradeRate: (input, deps) => getTradeRate(input, deps),
|
|
8
|
+
getUnsignedEvmTransaction,
|
|
9
|
+
getEvmTransactionFees,
|
|
10
|
+
checkTradeStatus: checkEvmSwapStatus,
|
|
11
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Result } from '@sniptt/monads';
|
|
2
|
+
import type { SwapErrorRight, SwapperDeps, TradeQuote } from '../../../types.js';
|
|
3
|
+
import type { FyndTradeQuoteInput } from '../types.js';
|
|
4
|
+
export declare const getTradeQuote: (input: FyndTradeQuoteInput, deps: SwapperDeps) => Promise<Result<TradeQuote[], SwapErrorRight>>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Err, Ok } from '@sniptt/monads';
|
|
2
|
+
import { assertQuoteAddresses } from '../../../utils/index.js';
|
|
3
|
+
import { getFyndStepData } from '../utils/getFyndStepData.js';
|
|
4
|
+
import { getFyndTradeContext } from '../utils/getFyndTradeContext.js';
|
|
5
|
+
export const getTradeQuote = async (input, deps) => {
|
|
6
|
+
const { accountNumber } = input;
|
|
7
|
+
const maybeAddresses = assertQuoteAddresses(input);
|
|
8
|
+
if (maybeAddresses.isErr())
|
|
9
|
+
return Err(maybeAddresses.unwrapErr());
|
|
10
|
+
const { sendAddress, receiveAddress } = maybeAddresses.unwrap();
|
|
11
|
+
const maybeContext = await getFyndTradeContext({
|
|
12
|
+
input,
|
|
13
|
+
deps,
|
|
14
|
+
from: sendAddress,
|
|
15
|
+
to: receiveAddress,
|
|
16
|
+
});
|
|
17
|
+
if (maybeContext.isErr())
|
|
18
|
+
return Err(maybeContext.unwrapErr());
|
|
19
|
+
const { tradeCommon, stepCommon, protocolFees, deadline, stepDataArgs } = maybeContext.unwrap();
|
|
20
|
+
const maybeStepData = await getFyndStepData({ ...stepDataArgs, type: 'quote', input });
|
|
21
|
+
if (maybeStepData.isErr())
|
|
22
|
+
return Err(maybeStepData.unwrapErr());
|
|
23
|
+
const { transactionData, networkFeeCryptoBaseUnit } = maybeStepData.unwrap();
|
|
24
|
+
const tradeQuote = {
|
|
25
|
+
...tradeCommon,
|
|
26
|
+
quoteOrRate: 'quote',
|
|
27
|
+
receiveAddress,
|
|
28
|
+
deadline,
|
|
29
|
+
steps: [
|
|
30
|
+
{
|
|
31
|
+
...stepCommon,
|
|
32
|
+
accountNumber,
|
|
33
|
+
transactionData,
|
|
34
|
+
feeData: { networkFeeCryptoBaseUnit, protocolFees },
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
return Ok([tradeQuote]);
|
|
39
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Result } from '@sniptt/monads';
|
|
2
|
+
import type { SwapErrorRight, SwapperDeps, TradeRate } from '../../../types.js';
|
|
3
|
+
import type { FyndTradeRateInput } from '../types.js';
|
|
4
|
+
export declare const getTradeRate: (input: FyndTradeRateInput, deps: SwapperDeps) => Promise<Result<TradeRate[], SwapErrorRight>>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Err, Ok } from '@sniptt/monads';
|
|
2
|
+
import { EVM_PLACEHOLDER_ADDRESS } from '../../../utils/evm/constants.js';
|
|
3
|
+
import { getFyndStepData } from '../utils/getFyndStepData.js';
|
|
4
|
+
import { getFyndTradeContext } from '../utils/getFyndTradeContext.js';
|
|
5
|
+
export const getTradeRate = async (input, deps) => {
|
|
6
|
+
const { accountNumber, sendAddress, receiveAddress } = input;
|
|
7
|
+
const from = sendAddress ?? EVM_PLACEHOLDER_ADDRESS;
|
|
8
|
+
const to = receiveAddress ?? from;
|
|
9
|
+
const maybeContext = await getFyndTradeContext({ input, deps, from, to });
|
|
10
|
+
if (maybeContext.isErr())
|
|
11
|
+
return Err(maybeContext.unwrapErr());
|
|
12
|
+
const { tradeCommon, stepCommon, protocolFees, stepDataArgs } = maybeContext.unwrap();
|
|
13
|
+
const maybeStepData = await getFyndStepData({ ...stepDataArgs, type: 'rate', input });
|
|
14
|
+
if (maybeStepData.isErr())
|
|
15
|
+
return Err(maybeStepData.unwrapErr());
|
|
16
|
+
const { networkFeeCryptoBaseUnit } = maybeStepData.unwrap();
|
|
17
|
+
const tradeRate = {
|
|
18
|
+
...tradeCommon,
|
|
19
|
+
quoteOrRate: 'rate',
|
|
20
|
+
receiveAddress,
|
|
21
|
+
steps: [
|
|
22
|
+
{
|
|
23
|
+
...stepCommon,
|
|
24
|
+
accountNumber,
|
|
25
|
+
feeData: { networkFeeCryptoBaseUnit, protocolFees },
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
return Ok([tradeRate]);
|
|
30
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Address, Hex } from 'viem';
|
|
2
|
+
import type { GetEvmTradeQuoteInput, GetEvmTradeRateInput } from '../../types.js';
|
|
3
|
+
export type FyndTradeQuoteInput = GetEvmTradeQuoteInput;
|
|
4
|
+
export type FyndTradeRateInput = GetEvmTradeRateInput;
|
|
5
|
+
export type FyndTransaction = {
|
|
6
|
+
to: Address;
|
|
7
|
+
value: string;
|
|
8
|
+
data: Hex;
|
|
9
|
+
client_fee_signature_offset?: number | null;
|
|
10
|
+
};
|
|
11
|
+
export type FyndFeeBreakdown = {
|
|
12
|
+
router_fee: string;
|
|
13
|
+
client_fee: string;
|
|
14
|
+
max_slippage: string;
|
|
15
|
+
min_amount_received: string;
|
|
16
|
+
};
|
|
17
|
+
export type FyndErrorResponse = {
|
|
18
|
+
error: string;
|
|
19
|
+
code: string;
|
|
20
|
+
};
|
|
21
|
+
export type FyndRouteSwap = {
|
|
22
|
+
protocol: string;
|
|
23
|
+
};
|
|
24
|
+
export type FyndEncodedQuote = {
|
|
25
|
+
status: 'success';
|
|
26
|
+
amount_in: string;
|
|
27
|
+
amount_out: string;
|
|
28
|
+
gas_estimate: string;
|
|
29
|
+
route?: {
|
|
30
|
+
swaps: FyndRouteSwap[];
|
|
31
|
+
} | null;
|
|
32
|
+
transaction: FyndTransaction;
|
|
33
|
+
fee_breakdown: FyndFeeBreakdown;
|
|
34
|
+
client_fee_deadline?: number | null;
|
|
35
|
+
};
|
|
36
|
+
export type FyndFailedOrder = {
|
|
37
|
+
status: 'no_route_found' | 'insufficient_liquidity' | 'timeout' | 'not_ready' | 'price_check_failed' | 'encoding_failed';
|
|
38
|
+
};
|
|
39
|
+
export type FyndQuoteResponse = {
|
|
40
|
+
orders: (FyndEncodedQuote | FyndFailedOrder)[];
|
|
41
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const FYND_CHAINS: {
|
|
2
|
+
readonly "eip155:1": {
|
|
3
|
+
readonly name: "ethereum";
|
|
4
|
+
readonly routerAddress: "0x1644d2477f809cc2c71bccfd6dc9497e3f83210d";
|
|
5
|
+
};
|
|
6
|
+
readonly "eip155:8453": {
|
|
7
|
+
readonly name: "base";
|
|
8
|
+
readonly routerAddress: "0xaba5b53b03eafad1c5fc8bd5fc765fc85bb3de67";
|
|
9
|
+
};
|
|
10
|
+
readonly "eip155:42161": {
|
|
11
|
+
readonly name: "arbitrum";
|
|
12
|
+
readonly routerAddress: "0x924f147c50ea59f5180a26031a8b65b2aa1e81cd";
|
|
13
|
+
};
|
|
14
|
+
readonly "eip155:56": {
|
|
15
|
+
readonly name: "bsc";
|
|
16
|
+
readonly routerAddress: "0x7f3d12bbafb8955e51b3ab9588b34c8ad95bda4e";
|
|
17
|
+
};
|
|
18
|
+
readonly "eip155:137": {
|
|
19
|
+
readonly name: "polygon";
|
|
20
|
+
readonly routerAddress: "0xbd4e6011f03355c2a377fd9af939322a7d0a1bc1";
|
|
21
|
+
};
|
|
22
|
+
readonly "eip155:130": {
|
|
23
|
+
readonly name: "unichain";
|
|
24
|
+
readonly routerAddress: "0xcba5574597ad00ea250fd106dab4fc7461949635";
|
|
25
|
+
};
|
|
26
|
+
readonly "eip155:4663": {
|
|
27
|
+
readonly name: "robinhood";
|
|
28
|
+
readonly routerAddress: "0x09215a470bd585e59eb3f4b612fbd2678131ff9e";
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export type FyndSupportedChainId = keyof typeof FYND_CHAINS;
|
|
32
|
+
export declare const FYND_CLIENT_FEE_SHARE = 0.8;
|
|
33
|
+
export declare const FYND_CLIENT_FEE_SIGNATURE_BYTES = 65;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { KnownChainIds } from '@shapeshiftoss/types';
|
|
2
|
+
// Fynd Router Registry: https://docs.propellerheads.xyz/tycho/for-solvers/execution/contract-addresses
|
|
3
|
+
export const FYND_CHAINS = {
|
|
4
|
+
[KnownChainIds.EthereumMainnet]: {
|
|
5
|
+
name: 'ethereum',
|
|
6
|
+
routerAddress: '0x1644d2477f809cc2c71bccfd6dc9497e3f83210d',
|
|
7
|
+
},
|
|
8
|
+
[KnownChainIds.BaseMainnet]: {
|
|
9
|
+
name: 'base',
|
|
10
|
+
routerAddress: '0xaba5b53b03eafad1c5fc8bd5fc765fc85bb3de67',
|
|
11
|
+
},
|
|
12
|
+
[KnownChainIds.ArbitrumMainnet]: {
|
|
13
|
+
name: 'arbitrum',
|
|
14
|
+
routerAddress: '0x924f147c50ea59f5180a26031a8b65b2aa1e81cd',
|
|
15
|
+
},
|
|
16
|
+
[KnownChainIds.BnbSmartChainMainnet]: {
|
|
17
|
+
name: 'bsc',
|
|
18
|
+
routerAddress: '0x7f3d12bbafb8955e51b3ab9588b34c8ad95bda4e',
|
|
19
|
+
},
|
|
20
|
+
[KnownChainIds.PolygonMainnet]: {
|
|
21
|
+
name: 'polygon',
|
|
22
|
+
routerAddress: '0xbd4e6011f03355c2a377fd9af939322a7d0a1bc1',
|
|
23
|
+
},
|
|
24
|
+
[KnownChainIds.UnichainMainnet]: {
|
|
25
|
+
name: 'unichain',
|
|
26
|
+
routerAddress: '0xcba5574597ad00ea250fd106dab4fc7461949635',
|
|
27
|
+
},
|
|
28
|
+
[KnownChainIds.RobinhoodMainnet]: {
|
|
29
|
+
name: 'robinhood',
|
|
30
|
+
routerAddress: '0x09215a470bd585e59eb3f4b612fbd2678131ff9e',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
// Fynd keeps 20% of the client fee, so request the gross bps that nets affiliateBps
|
|
34
|
+
export const FYND_CLIENT_FEE_SHARE = 0.8;
|
|
35
|
+
export const FYND_CLIENT_FEE_SIGNATURE_BYTES = 65;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Result } from '@sniptt/monads';
|
|
2
|
+
import type { SwapErrorRight } from '../../../types.js';
|
|
3
|
+
import type { FyndEncodedQuote, FyndTradeQuoteInput, FyndTradeRateInput } from '../types.js';
|
|
4
|
+
import type { FyndSupportedChainId } from './constants.js';
|
|
5
|
+
export declare const fetchFromFynd: ({ input, chainId, sender, receiver, slippageTolerancePercentageDecimal, clientFeeBps, baseUrl, }: {
|
|
6
|
+
input: FyndTradeQuoteInput | FyndTradeRateInput;
|
|
7
|
+
chainId: FyndSupportedChainId;
|
|
8
|
+
sender: string;
|
|
9
|
+
receiver: string;
|
|
10
|
+
slippageTolerancePercentageDecimal: string;
|
|
11
|
+
clientFeeBps: number;
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
}) => Promise<Result<FyndEncodedQuote, SwapErrorRight>>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Err } from '@sniptt/monads';
|
|
2
|
+
import { FYND_CHAINS } from './constants.js';
|
|
3
|
+
import { fyndService } from './fyndService.js';
|
|
4
|
+
import { convertAssetIdToFyndToken, getFyndRequestError, validateFyndQuoteResponse, } from './helpers.js';
|
|
5
|
+
export const fetchFromFynd = async ({ input, chainId, sender, receiver, slippageTolerancePercentageDecimal, clientFeeBps, baseUrl, }) => {
|
|
6
|
+
const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit } = input;
|
|
7
|
+
const maybeResponse = await fyndService.post(`${baseUrl}/${FYND_CHAINS[chainId].name}/quote`, {
|
|
8
|
+
orders: [
|
|
9
|
+
{
|
|
10
|
+
token_in: convertAssetIdToFyndToken(sellAsset.assetId),
|
|
11
|
+
token_out: convertAssetIdToFyndToken(buyAsset.assetId),
|
|
12
|
+
amount: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
13
|
+
side: 'sell',
|
|
14
|
+
sender,
|
|
15
|
+
receiver,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
options: {
|
|
19
|
+
timeout_ms: 5_000,
|
|
20
|
+
min_responses: 1,
|
|
21
|
+
encoding_options: {
|
|
22
|
+
slippage: slippageTolerancePercentageDecimal,
|
|
23
|
+
transfer_type: 'transfer_from',
|
|
24
|
+
// The proxy sets the fee receiver and deadline and signs the quote
|
|
25
|
+
...(clientFeeBps > 0 ? { client_fee_params: { bps: clientFeeBps } } : {}),
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
if (maybeResponse.isErr())
|
|
30
|
+
return Err(getFyndRequestError(maybeResponse.unwrapErr()));
|
|
31
|
+
return validateFyndQuoteResponse(maybeResponse.unwrap().data, {
|
|
32
|
+
chainId,
|
|
33
|
+
sellAsset,
|
|
34
|
+
sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
35
|
+
slippageTolerancePercentageDecimal,
|
|
36
|
+
clientFeeBps,
|
|
37
|
+
});
|
|
38
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const fyndService: {
|
|
2
|
+
get: <T = any>(url: string, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T, any, {}>, import("../../../index.js").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("../../../index.js").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("../../../index.js").SwapErrorRight>>;
|
|
5
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Result } from '@sniptt/monads';
|
|
2
|
+
import type { StepDataArgs, SwapErrorRight, TxBuildData } from '../../../types.js';
|
|
3
|
+
import type { FyndEncodedQuote } from '../types.js';
|
|
4
|
+
type BaseArgs = {
|
|
5
|
+
quote: FyndEncodedQuote;
|
|
6
|
+
sellAmountCryptoBaseUnit: string;
|
|
7
|
+
spenderAddress: string;
|
|
8
|
+
};
|
|
9
|
+
export type GetFyndStepDataArgs = StepDataArgs<BaseArgs, {
|
|
10
|
+
from: string;
|
|
11
|
+
}>;
|
|
12
|
+
type FyndRateStepData = {
|
|
13
|
+
networkFeeCryptoBaseUnit: string | undefined;
|
|
14
|
+
};
|
|
15
|
+
type FyndQuoteStepData = {
|
|
16
|
+
transactionData: TxBuildData;
|
|
17
|
+
networkFeeCryptoBaseUnit: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function getFyndStepData(args: Extract<GetFyndStepDataArgs, {
|
|
20
|
+
type: 'rate';
|
|
21
|
+
}>): Promise<Result<FyndRateStepData, SwapErrorRight>>;
|
|
22
|
+
export declare function getFyndStepData(args: Extract<GetFyndStepDataArgs, {
|
|
23
|
+
type: 'quote';
|
|
24
|
+
}>): Promise<Result<FyndQuoteStepData, SwapErrorRight>>;
|
|
25
|
+
export {};
|