@shapeshiftoss/swapper 20.3.0 → 20.5.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 +21 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.js +3 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/getAcrossStepData.js +7 -15
- package/dist/cjs/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/AvnuSwapper/endpoints.js +17 -12
- 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/BebopSwapper/utils/getBebopStepData.js +17 -22
- package/dist/cjs/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +1 -0
- package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.js +3 -4
- package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.test.js +2 -2
- package/dist/cjs/swappers/CetusSwapper/endpoints.js +2 -3
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusStepData.js +13 -8
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusTradeContext.js +1 -2
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +0 -2
- package/dist/cjs/swappers/CetusSwapper/utils/constants.d.ts +0 -1
- package/dist/cjs/swappers/CetusSwapper/utils/constants.js +1 -2
- package/dist/cjs/swappers/CetusSwapper/utils/helpers.d.ts +3 -3
- package/dist/cjs/swappers/CetusSwapper/utils/helpers.js +6 -17
- 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/DebridgeSwapper/utils/getDebridgeStepData.d.ts +0 -1
- package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeStepData.js +9 -16
- package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeTradeContext.js +0 -3
- 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 +46 -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/KyberSwapper/KyberSwapper.d.ts +2 -0
- package/dist/cjs/swappers/KyberSwapper/KyberSwapper.js +5 -0
- package/dist/cjs/swappers/KyberSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/KyberSwapper/endpoints.js +14 -0
- package/dist/cjs/swappers/KyberSwapper/index.d.ts +2 -0
- package/dist/cjs/swappers/KyberSwapper/index.js +7 -0
- package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.d.ts +4 -0
- package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.js +64 -0
- package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeRate.d.ts +4 -0
- package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeRate.js +31 -0
- package/dist/cjs/swappers/KyberSwapper/types.d.ts +62 -0
- package/dist/cjs/swappers/KyberSwapper/types.js +2 -0
- package/dist/cjs/swappers/KyberSwapper/utils/constants.d.ts +21 -0
- package/dist/cjs/swappers/KyberSwapper/utils/constants.js +24 -0
- package/dist/cjs/swappers/KyberSwapper/utils/fetchFromKyber.d.ts +23 -0
- package/dist/cjs/swappers/KyberSwapper/utils/fetchFromKyber.js +38 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.d.ts +27 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.js +47 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.test.d.ts +1 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.test.js +92 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberTradeContext.d.ts +20 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberTradeContext.js +63 -0
- package/dist/cjs/swappers/KyberSwapper/utils/helpers.d.ts +27 -0
- package/dist/cjs/swappers/KyberSwapper/utils/helpers.js +172 -0
- package/dist/cjs/swappers/KyberSwapper/utils/helpers.test.d.ts +1 -0
- package/dist/cjs/swappers/KyberSwapper/utils/helpers.test.js +110 -0
- package/dist/cjs/swappers/KyberSwapper/utils/kyberService.d.ts +5 -0
- package/dist/cjs/swappers/KyberSwapper/utils/kyberService.js +9 -0
- package/dist/cjs/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +0 -1
- package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +1 -0
- package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +13 -14
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +1 -1
- package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +4 -4
- package/dist/cjs/swappers/NearIntentsSwapper/types.js +2 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/getNearIntentsStepData.js +28 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers.js +2 -2
- package/dist/cjs/swappers/PortalsSwapper/endpoints.js +4 -1
- package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +1 -1
- package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsStepData.js +36 -55
- package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsStepData.test.js +2 -2
- package/dist/cjs/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +2 -3
- package/dist/cjs/swappers/RelaySwapper/utils/getRelayStepData.js +7 -15
- 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/getTradeQuote/getTradeQuote.test.js +2 -2
- package/dist/cjs/swappers/ThorchainSwapper/utils/getLongtailQuote.js +1 -1
- package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +27 -2
- 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/swappers/ZrxSwapper/utils/getZrxStepData.d.ts +3 -1
- package/dist/cjs/swappers/ZrxSwapper/utils/getZrxStepData.js +29 -10
- package/dist/cjs/types.d.ts +41 -12
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/utils/aptos/constants.d.ts +2 -0
- package/dist/cjs/utils/aptos/constants.js +7 -0
- package/dist/cjs/utils/aptos/getAptosTransactionFees.d.ts +2 -0
- package/dist/cjs/utils/aptos/getAptosTransactionFees.js +13 -0
- package/dist/cjs/utils/aptos/getUnsignedAptosTransaction.d.ts +2 -0
- package/dist/cjs/utils/aptos/getUnsignedAptosTransaction.js +16 -0
- package/dist/cjs/utils/aptos/index.d.ts +3 -0
- package/dist/cjs/utils/aptos/index.js +19 -0
- package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.d.ts +19 -6
- package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.js +45 -35
- package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.d.ts +1 -0
- package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.js +103 -0
- package/dist/cjs/utils/evm/stateOverride.d.ts +3 -0
- package/dist/cjs/utils/evm/stateOverride.js +10 -4
- package/dist/cjs/utils/helpers.d.ts +1 -2
- package/dist/cjs/utils/helpers.js +9 -32
- package/dist/cjs/utils/helpers.test.js +7 -2
- package/dist/cjs/utils/index.d.ts +3 -2
- package/dist/cjs/utils/index.js +11 -27
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/constants.js +21 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/swappers/AcrossSwapper/utils/getAcrossStepData.js +8 -16
- package/dist/esm/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
- package/dist/esm/swappers/AvnuSwapper/endpoints.js +18 -13
- 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/BebopSwapper/utils/getBebopStepData.js +18 -23
- package/dist/esm/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +0 -2
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +0 -2
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +1 -0
- package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.js +4 -5
- package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.test.js +2 -2
- package/dist/esm/swappers/CetusSwapper/endpoints.js +3 -4
- package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusStepData.js +13 -8
- package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusTradeContext.js +2 -3
- package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +0 -2
- package/dist/esm/swappers/CetusSwapper/utils/constants.d.ts +0 -1
- package/dist/esm/swappers/CetusSwapper/utils/constants.js +0 -1
- package/dist/esm/swappers/CetusSwapper/utils/helpers.d.ts +3 -3
- package/dist/esm/swappers/CetusSwapper/utils/helpers.js +4 -15
- 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/DebridgeSwapper/utils/getDebridgeStepData.d.ts +0 -1
- package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeStepData.js +9 -16
- package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeTradeContext.js +0 -3
- 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 +42 -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/KyberSwapper/KyberSwapper.d.ts +2 -0
- package/dist/esm/swappers/KyberSwapper/KyberSwapper.js +2 -0
- package/dist/esm/swappers/KyberSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/KyberSwapper/endpoints.js +11 -0
- package/dist/esm/swappers/KyberSwapper/index.d.ts +2 -0
- package/dist/esm/swappers/KyberSwapper/index.js +2 -0
- package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.d.ts +4 -0
- package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.js +60 -0
- package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeRate.d.ts +4 -0
- package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeRate.js +27 -0
- package/dist/esm/swappers/KyberSwapper/types.d.ts +62 -0
- package/dist/esm/swappers/KyberSwapper/types.js +1 -0
- package/dist/esm/swappers/KyberSwapper/utils/constants.d.ts +21 -0
- package/dist/esm/swappers/KyberSwapper/utils/constants.js +21 -0
- package/dist/esm/swappers/KyberSwapper/utils/fetchFromKyber.d.ts +23 -0
- package/dist/esm/swappers/KyberSwapper/utils/fetchFromKyber.js +33 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.d.ts +27 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.js +43 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.test.d.ts +1 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.test.js +90 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberTradeContext.d.ts +20 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberTradeContext.js +59 -0
- package/dist/esm/swappers/KyberSwapper/utils/helpers.d.ts +27 -0
- package/dist/esm/swappers/KyberSwapper/utils/helpers.js +158 -0
- package/dist/esm/swappers/KyberSwapper/utils/helpers.test.d.ts +1 -0
- package/dist/esm/swappers/KyberSwapper/utils/helpers.test.js +108 -0
- package/dist/esm/swappers/KyberSwapper/utils/kyberService.d.ts +5 -0
- package/dist/esm/swappers/KyberSwapper/utils/kyberService.js +3 -0
- package/dist/esm/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +0 -1
- package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -1
- package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +13 -14
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +1 -1
- package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +4 -4
- package/dist/esm/swappers/NearIntentsSwapper/types.js +2 -0
- package/dist/esm/swappers/NearIntentsSwapper/utils/getNearIntentsStepData.js +29 -1
- package/dist/esm/swappers/NearIntentsSwapper/utils/helpers.js +2 -2
- package/dist/esm/swappers/PortalsSwapper/endpoints.js +4 -1
- package/dist/esm/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +2 -2
- package/dist/esm/swappers/PortalsSwapper/utils/getPortalsStepData.js +34 -53
- package/dist/esm/swappers/PortalsSwapper/utils/getPortalsStepData.test.js +2 -2
- package/dist/esm/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +2 -3
- package/dist/esm/swappers/RelaySwapper/utils/getRelayStepData.js +9 -17
- 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/getTradeQuote/getTradeQuote.test.js +2 -2
- package/dist/esm/swappers/ThorchainSwapper/utils/getLongtailQuote.js +1 -1
- package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +28 -3
- 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/swappers/ZrxSwapper/utils/getZrxStepData.d.ts +3 -1
- package/dist/esm/swappers/ZrxSwapper/utils/getZrxStepData.js +31 -12
- package/dist/esm/types.d.ts +41 -12
- package/dist/esm/types.js +3 -0
- package/dist/esm/utils/aptos/constants.d.ts +2 -0
- package/dist/esm/utils/aptos/constants.js +4 -0
- package/dist/esm/utils/aptos/getAptosTransactionFees.d.ts +2 -0
- package/dist/esm/utils/aptos/getAptosTransactionFees.js +9 -0
- package/dist/esm/utils/aptos/getUnsignedAptosTransaction.d.ts +2 -0
- package/dist/esm/utils/aptos/getUnsignedAptosTransaction.js +12 -0
- package/dist/esm/utils/aptos/index.d.ts +3 -0
- package/dist/esm/utils/aptos/index.js +3 -0
- package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.d.ts +19 -6
- package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.js +42 -35
- package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.d.ts +1 -0
- package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.js +101 -0
- package/dist/esm/utils/evm/stateOverride.d.ts +3 -0
- package/dist/esm/utils/evm/stateOverride.js +8 -3
- package/dist/esm/utils/helpers.d.ts +1 -2
- package/dist/esm/utils/helpers.js +10 -33
- package/dist/esm/utils/helpers.test.js +7 -2
- package/dist/esm/utils/index.d.ts +3 -2
- package/dist/esm/utils/index.js +9 -26
- package/package.json +10 -11
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { bn } from '@shapeshiftoss/utils';
|
|
2
|
+
import { Err, Ok } from '@sniptt/monads';
|
|
3
|
+
import { v4 as uuid } from 'uuid';
|
|
4
|
+
import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
|
|
5
|
+
import { SwapperName } from '../../../types.js';
|
|
6
|
+
import { getInputOutputRate } from '../../../utils/index.js';
|
|
7
|
+
import { isNativeEvmAsset, normalizeEpochToMs } from '../../../utils/helpers.js';
|
|
8
|
+
import { fetchFromFynd } from './fetchFromFynd.js';
|
|
9
|
+
import { assertValidTrade, getFyndClientFeeBps, getFyndRouteProtocols } from './helpers.js';
|
|
10
|
+
export const getFyndTradeContext = async ({ input, deps, from, to, }) => {
|
|
11
|
+
const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, affiliateBps } = input;
|
|
12
|
+
const maybeChainId = assertValidTrade({ sellAsset, buyAsset });
|
|
13
|
+
if (maybeChainId.isErr())
|
|
14
|
+
return Err(maybeChainId.unwrapErr());
|
|
15
|
+
const chainId = maybeChainId.unwrap();
|
|
16
|
+
const slippageTolerancePercentageDecimal = input.slippageTolerancePercentageDecimal ??
|
|
17
|
+
getDefaultSlippageDecimalPercentageForSwapper(SwapperName.Fynd);
|
|
18
|
+
const clientFeeBps = getFyndClientFeeBps(affiliateBps);
|
|
19
|
+
const maybeQuote = await fetchFromFynd({
|
|
20
|
+
input,
|
|
21
|
+
chainId,
|
|
22
|
+
sender: from,
|
|
23
|
+
receiver: to,
|
|
24
|
+
slippageTolerancePercentageDecimal,
|
|
25
|
+
clientFeeBps,
|
|
26
|
+
baseUrl: deps.config.VITE_FYND_BASE_URL,
|
|
27
|
+
});
|
|
28
|
+
if (maybeQuote.isErr())
|
|
29
|
+
return Err(maybeQuote.unwrapErr());
|
|
30
|
+
const quote = maybeQuote.unwrap();
|
|
31
|
+
const { router_fee: routerFee, client_fee: clientFee } = quote.fee_breakdown;
|
|
32
|
+
const buyAmountBeforeFeesCryptoBaseUnit = quote.amount_out;
|
|
33
|
+
const buyAmountAfterFeesCryptoBaseUnit = bn(quote.amount_out)
|
|
34
|
+
.minus(routerFee)
|
|
35
|
+
.minus(clientFee)
|
|
36
|
+
.toFixed();
|
|
37
|
+
const rate = getInputOutputRate({
|
|
38
|
+
sellAmountCryptoBaseUnit: quote.amount_in,
|
|
39
|
+
buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
|
|
40
|
+
sellAsset,
|
|
41
|
+
buyAsset,
|
|
42
|
+
});
|
|
43
|
+
const protocols = getFyndRouteProtocols(quote.route?.swaps);
|
|
44
|
+
const source = protocols.length
|
|
45
|
+
? `${SwapperName.Fynd} • ${protocols.join(', ')}`
|
|
46
|
+
: SwapperName.Fynd;
|
|
47
|
+
const allowanceContract = isNativeEvmAsset(sellAsset.assetId) ? '' : quote.transaction.to;
|
|
48
|
+
const protocolFees = bn(routerFee).gt(0)
|
|
49
|
+
? {
|
|
50
|
+
[buyAsset.assetId]: {
|
|
51
|
+
amountCryptoBaseUnit: routerFee,
|
|
52
|
+
asset: buyAsset,
|
|
53
|
+
requiresBalance: false,
|
|
54
|
+
},
|
|
55
|
+
}
|
|
56
|
+
: {};
|
|
57
|
+
return Ok({
|
|
58
|
+
tradeCommon: {
|
|
59
|
+
id: uuid(),
|
|
60
|
+
rate,
|
|
61
|
+
swapperName: SwapperName.Fynd,
|
|
62
|
+
affiliateBps,
|
|
63
|
+
slippageTolerancePercentageDecimal,
|
|
64
|
+
},
|
|
65
|
+
stepCommon: {
|
|
66
|
+
estimatedExecutionTimeMs: 0,
|
|
67
|
+
allowanceContract,
|
|
68
|
+
rate,
|
|
69
|
+
sellAsset,
|
|
70
|
+
buyAsset,
|
|
71
|
+
sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
72
|
+
buyAmountBeforeFeesCryptoBaseUnit,
|
|
73
|
+
buyAmountAfterFeesCryptoBaseUnit,
|
|
74
|
+
source,
|
|
75
|
+
affiliateFee: bn(clientFee).gt(0)
|
|
76
|
+
? { assetId: buyAsset.assetId, amountCryptoBaseUnit: clientFee, asset: buyAsset }
|
|
77
|
+
: undefined,
|
|
78
|
+
},
|
|
79
|
+
protocolFees,
|
|
80
|
+
deadline: quote.client_fee_deadline ? normalizeEpochToMs(quote.client_fee_deadline) : undefined,
|
|
81
|
+
stepDataArgs: {
|
|
82
|
+
quote,
|
|
83
|
+
sellAsset,
|
|
84
|
+
sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
85
|
+
spenderAddress: allowanceContract,
|
|
86
|
+
from,
|
|
87
|
+
deps,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AssetId } from '@shapeshiftoss/caip';
|
|
2
|
+
import type { Asset } from '@shapeshiftoss/types';
|
|
3
|
+
import type { Result } from '@sniptt/monads';
|
|
4
|
+
import type { Address } from 'viem';
|
|
5
|
+
import type { SwapErrorRight } from '../../../types.js';
|
|
6
|
+
import type { FyndEncodedQuote, FyndQuoteResponse, FyndRouteSwap } from '../types.js';
|
|
7
|
+
import type { FyndSupportedChainId } from './constants.js';
|
|
8
|
+
export declare const getFyndRouteProtocols: (swaps: FyndRouteSwap[] | undefined) => string[];
|
|
9
|
+
export declare const getFyndClientFeeBps: (affiliateBps: string) => number;
|
|
10
|
+
export declare const convertAssetIdToFyndToken: (assetId: AssetId) => Address;
|
|
11
|
+
export declare const assertValidTrade: ({ sellAsset, buyAsset, }: {
|
|
12
|
+
sellAsset: Asset;
|
|
13
|
+
buyAsset: Asset;
|
|
14
|
+
}) => Result<FyndSupportedChainId, SwapErrorRight>;
|
|
15
|
+
export declare const getFyndRequestError: (error: SwapErrorRight) => SwapErrorRight;
|
|
16
|
+
type FyndQuoteContext = {
|
|
17
|
+
chainId: FyndSupportedChainId;
|
|
18
|
+
sellAsset: Asset;
|
|
19
|
+
sellAmountCryptoBaseUnit: string;
|
|
20
|
+
slippageTolerancePercentageDecimal: string;
|
|
21
|
+
clientFeeBps: number;
|
|
22
|
+
};
|
|
23
|
+
export declare const validateFyndQuoteResponse: (response: FyndQuoteResponse, context: FyndQuoteContext) => Result<FyndEncodedQuote, SwapErrorRight>;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { fromAssetId } from '@shapeshiftoss/caip';
|
|
2
|
+
import { BigNumber, bn } from '@shapeshiftoss/utils';
|
|
3
|
+
import { Err, Ok } from '@sniptt/monads';
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
import { getAddress, isAddress, isAddressEqual, zeroAddress } from 'viem';
|
|
6
|
+
import { TradeQuoteError } from '../../../types.js';
|
|
7
|
+
import { makeSwapErrorRight } from '../../../utils/index.js';
|
|
8
|
+
import { isNativeEvmAsset } from '../../../utils/helpers.js';
|
|
9
|
+
import { FYND_CHAINS, FYND_CLIENT_FEE_SHARE, FYND_CLIENT_FEE_SIGNATURE_BYTES } from './constants.js';
|
|
10
|
+
const isFyndSupportedChainId = (chainId) => chainId in FYND_CHAINS;
|
|
11
|
+
// Protocol ids look like uniswap_v3, vm:balancer_v2 or fallback:rfq:bebop
|
|
12
|
+
const formatFyndProtocol = (protocol) => protocol
|
|
13
|
+
.slice(protocol.lastIndexOf(':') + 1)
|
|
14
|
+
.split('_')
|
|
15
|
+
.map(word => /^v\d+$/.test(word) ? word.toUpperCase() : word.charAt(0).toUpperCase() + word.slice(1))
|
|
16
|
+
.join(' ');
|
|
17
|
+
// The native_wrapper hop is only the WETH wrap/unwrap around the real venues
|
|
18
|
+
export const getFyndRouteProtocols = (swaps) => {
|
|
19
|
+
const venues = (swaps ?? [])
|
|
20
|
+
.map(swap => swap.protocol)
|
|
21
|
+
.filter(protocol => !protocol.endsWith('native_wrapper'));
|
|
22
|
+
return [...new Set(venues)].map(formatFyndProtocol);
|
|
23
|
+
};
|
|
24
|
+
export const getFyndClientFeeBps = (affiliateBps) => bn(affiliateBps).div(FYND_CLIENT_FEE_SHARE).integerValue(BigNumber.ROUND_CEIL).toNumber();
|
|
25
|
+
export const convertAssetIdToFyndToken = (assetId) => {
|
|
26
|
+
if (isNativeEvmAsset(assetId))
|
|
27
|
+
return zeroAddress;
|
|
28
|
+
return getAddress(fromAssetId(assetId).assetReference);
|
|
29
|
+
};
|
|
30
|
+
export const assertValidTrade = ({ sellAsset, buyAsset, }) => {
|
|
31
|
+
if (sellAsset.chainId !== buyAsset.chainId) {
|
|
32
|
+
return Err(makeSwapErrorRight({
|
|
33
|
+
message: 'Fynd does not support cross-chain trades',
|
|
34
|
+
code: TradeQuoteError.CrossChainNotSupported,
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
if (!isFyndSupportedChainId(sellAsset.chainId)) {
|
|
38
|
+
return Err(makeSwapErrorRight({
|
|
39
|
+
message: 'Fynd only supports configured EVM chains',
|
|
40
|
+
code: TradeQuoteError.UnsupportedChain,
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
return Ok(sellAsset.chainId);
|
|
44
|
+
};
|
|
45
|
+
const getFyndStatusError = (status, detail) => {
|
|
46
|
+
const code = (() => {
|
|
47
|
+
switch (status.toLowerCase()) {
|
|
48
|
+
case 'no_route_found':
|
|
49
|
+
case 'insufficient_liquidity':
|
|
50
|
+
return TradeQuoteError.NoRouteFound;
|
|
51
|
+
case 'timeout':
|
|
52
|
+
return TradeQuoteError.Timeout;
|
|
53
|
+
default:
|
|
54
|
+
return TradeQuoteError.QueryFailed;
|
|
55
|
+
}
|
|
56
|
+
})();
|
|
57
|
+
return makeSwapErrorRight({
|
|
58
|
+
message: `Fynd quote failed: ${status}${detail ? ` (${detail})` : ''}`,
|
|
59
|
+
code,
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
const isFyndErrorResponse = (value) => typeof value === 'object' &&
|
|
63
|
+
value !== null &&
|
|
64
|
+
'error' in value &&
|
|
65
|
+
typeof value.error === 'string' &&
|
|
66
|
+
'code' in value &&
|
|
67
|
+
typeof value.code === 'string';
|
|
68
|
+
export const getFyndRequestError = (error) => {
|
|
69
|
+
const { cause } = error;
|
|
70
|
+
if (!axios.isAxiosError(cause))
|
|
71
|
+
return error;
|
|
72
|
+
if (cause.response?.status === 429) {
|
|
73
|
+
return makeSwapErrorRight({
|
|
74
|
+
message: 'Fynd rate limit exceeded',
|
|
75
|
+
code: TradeQuoteError.RateLimitExceeded,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const body = cause.response?.data;
|
|
79
|
+
if (isFyndErrorResponse(body))
|
|
80
|
+
return getFyndStatusError(body.code, body.error);
|
|
81
|
+
return makeSwapErrorRight({
|
|
82
|
+
message: `Fynd request failed with status ${cause.response?.status}`,
|
|
83
|
+
code: TradeQuoteError.QueryFailed,
|
|
84
|
+
cause,
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
const invalidResponse = (message, details) => makeSwapErrorRight({ message, details, code: TradeQuoteError.InvalidResponse });
|
|
88
|
+
const getQuoteError = (quote, { chainId, sellAsset, sellAmountCryptoBaseUnit, slippageTolerancePercentageDecimal, clientFeeBps, }) => {
|
|
89
|
+
const { transaction, fee_breakdown: fees } = quote;
|
|
90
|
+
const pinnedRouter = FYND_CHAINS[chainId].routerAddress;
|
|
91
|
+
if (!isAddress(transaction.to, { strict: false }) ||
|
|
92
|
+
!isAddressEqual(transaction.to, pinnedRouter)) {
|
|
93
|
+
return invalidResponse(`Fynd router ${transaction.to} is not the pinned router ${pinnedRouter} for ${chainId}`);
|
|
94
|
+
}
|
|
95
|
+
if (!bn(quote.amount_in).eq(sellAmountCryptoBaseUnit)) {
|
|
96
|
+
return invalidResponse('Fynd quoted a different sell amount', {
|
|
97
|
+
amountIn: quote.amount_in,
|
|
98
|
+
sellAmountCryptoBaseUnit,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const expectedValue = isNativeEvmAsset(sellAsset.assetId) ? sellAmountCryptoBaseUnit : '0';
|
|
102
|
+
if (!bn(transaction.value).eq(expectedValue)) {
|
|
103
|
+
return invalidResponse('Fynd transaction value does not match the sell amount', {
|
|
104
|
+
value: transaction.value,
|
|
105
|
+
expectedValue,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// The router enforces min_amount_received, which may not be looser than the requested slippage
|
|
109
|
+
const netOutput = bn(quote.amount_out).minus(fees.router_fee).minus(fees.client_fee);
|
|
110
|
+
const outputFloor = netOutput
|
|
111
|
+
.times(bn(1).minus(slippageTolerancePercentageDecimal))
|
|
112
|
+
.integerValue(BigNumber.ROUND_DOWN);
|
|
113
|
+
if (bn(fees.min_amount_received).lt(outputFloor)) {
|
|
114
|
+
return invalidResponse('Fynd output floor is below the requested slippage', {
|
|
115
|
+
minAmountReceived: fees.min_amount_received,
|
|
116
|
+
outputFloor: outputFloor.toFixed(),
|
|
117
|
+
slippageTolerancePercentageDecimal,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
if (clientFeeBps === 0) {
|
|
121
|
+
if (!bn(fees.client_fee).isZero()) {
|
|
122
|
+
return invalidResponse('Fynd returned an unexpected client fee', {
|
|
123
|
+
clientFee: fees.client_fee,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Our share of the gross client fee, allowing one unit of rounding
|
|
129
|
+
const minClientFee = bn(quote.amount_out)
|
|
130
|
+
.times(clientFeeBps)
|
|
131
|
+
.div(10_000)
|
|
132
|
+
.times(FYND_CLIENT_FEE_SHARE)
|
|
133
|
+
.integerValue(BigNumber.ROUND_DOWN)
|
|
134
|
+
.minus(1);
|
|
135
|
+
if (bn(fees.client_fee).lt(minClientFee)) {
|
|
136
|
+
return invalidResponse('Fynd client fee is below the requested share', {
|
|
137
|
+
clientFee: fees.client_fee,
|
|
138
|
+
amountOut: quote.amount_out,
|
|
139
|
+
clientFeeBps,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// The proxy patches the signature over Fynd's zeroed placeholder at the reported offset
|
|
143
|
+
const offset = transaction.client_fee_signature_offset;
|
|
144
|
+
const signature = typeof offset === 'number'
|
|
145
|
+
? transaction.data.slice(2 + offset * 2, 2 + (offset + FYND_CLIENT_FEE_SIGNATURE_BYTES) * 2)
|
|
146
|
+
: '';
|
|
147
|
+
if (signature.length !== FYND_CLIENT_FEE_SIGNATURE_BYTES * 2 || /^0+$/.test(signature)) {
|
|
148
|
+
return invalidResponse('Fynd quote is not signed for the client fee', { offset });
|
|
149
|
+
}
|
|
150
|
+
if (!quote.client_fee_deadline) {
|
|
151
|
+
return invalidResponse('Fynd quote is missing its client fee deadline');
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
export const validateFyndQuoteResponse = (response, context) => {
|
|
155
|
+
const order = Array.isArray(response?.orders) ? response.orders[0] : undefined;
|
|
156
|
+
if (!order)
|
|
157
|
+
return Err(invalidResponse('Fynd returned no order'));
|
|
158
|
+
if (order.status !== 'success')
|
|
159
|
+
return Err(getFyndStatusError(order.status));
|
|
160
|
+
const error = getQuoteError(order, context);
|
|
161
|
+
return error ? Err(error) : Ok(order);
|
|
162
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { KnownChainIds } from '@shapeshiftoss/types';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { ETH, WETH } from '../../../utils/test-data/assets.js';
|
|
4
|
+
import { FYND_CHAINS } from './constants.js';
|
|
5
|
+
import { getFyndClientFeeBps, validateFyndQuoteResponse } from './helpers.js';
|
|
6
|
+
describe('getFyndClientFeeBps', () => {
|
|
7
|
+
it.each([
|
|
8
|
+
['nets the default fee after the 20% share', '60', 75],
|
|
9
|
+
['rounds up so the net never falls short', '55', 69],
|
|
10
|
+
['requests nothing for a fee-free swap', '0', 0],
|
|
11
|
+
])('%s', (_label, affiliateBps, grossBps) => {
|
|
12
|
+
expect(getFyndClientFeeBps(affiliateBps)).toBe(grossBps);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe('validateFyndQuoteResponse', () => {
|
|
16
|
+
const router = FYND_CHAINS['eip155:1'].routerAddress;
|
|
17
|
+
const unpinnedRouter = '0x1111111111111111111111111111111111111111';
|
|
18
|
+
const transaction = {
|
|
19
|
+
to: router,
|
|
20
|
+
value: '0',
|
|
21
|
+
data: '0x12345678',
|
|
22
|
+
client_fee_signature_offset: null,
|
|
23
|
+
};
|
|
24
|
+
const fees = { router_fee: '10', client_fee: '0', max_slippage: '4', min_amount_received: '986' };
|
|
25
|
+
const order = {
|
|
26
|
+
status: 'success',
|
|
27
|
+
amount_in: '1000',
|
|
28
|
+
amount_out: '1000',
|
|
29
|
+
gas_estimate: '21000',
|
|
30
|
+
transaction,
|
|
31
|
+
fee_breakdown: fees,
|
|
32
|
+
};
|
|
33
|
+
const context = {
|
|
34
|
+
chainId: KnownChainIds.EthereumMainnet,
|
|
35
|
+
sellAsset: WETH,
|
|
36
|
+
sellAmountCryptoBaseUnit: '1000',
|
|
37
|
+
slippageTolerancePercentageDecimal: '0.005',
|
|
38
|
+
clientFeeBps: 0,
|
|
39
|
+
};
|
|
40
|
+
const validate = (overrides, contextOverrides = {}) => validateFyndQuoteResponse({ orders: [{ ...order, ...overrides }] }, { ...context, ...contextOverrides });
|
|
41
|
+
it('accepts a quote that matches the request', () => {
|
|
42
|
+
expect(validate({}).isOk()).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it.each([
|
|
45
|
+
['an unpinned router', { transaction: { ...transaction, to: unpinnedRouter } }],
|
|
46
|
+
['a different sell amount', { amount_in: '999' }],
|
|
47
|
+
['native value on a token sell', { transaction: { ...transaction, value: '1' } }],
|
|
48
|
+
[
|
|
49
|
+
'an output floor looser than the slippage',
|
|
50
|
+
{ fee_breakdown: { ...fees, min_amount_received: '984' } },
|
|
51
|
+
],
|
|
52
|
+
['a client fee we did not request', { fee_breakdown: { ...fees, client_fee: '1' } }],
|
|
53
|
+
])('rejects %s', (_label, overrides) => {
|
|
54
|
+
expect(validate(overrides).isErr()).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
it('binds native transaction value to the requested sell amount', () => {
|
|
57
|
+
expect(validate({}, { sellAsset: ETH }).isErr()).toBe(true);
|
|
58
|
+
expect(validate({ transaction: { ...transaction, value: '1000' } }, { sellAsset: ETH }).isOk()).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('maps a missing route to NoRouteFound', () => {
|
|
61
|
+
const result = validateFyndQuoteResponse({ orders: [{ status: 'no_route_found' }] }, context);
|
|
62
|
+
expect(result.unwrapErr().code).toBe('NoRouteFound');
|
|
63
|
+
});
|
|
64
|
+
describe('with a client fee', () => {
|
|
65
|
+
const feeContext = { clientFeeBps: 75 };
|
|
66
|
+
const feeOrder = {
|
|
67
|
+
transaction: {
|
|
68
|
+
...transaction,
|
|
69
|
+
data: `0x12345678${'ab'.repeat(65)}`,
|
|
70
|
+
client_fee_signature_offset: 4,
|
|
71
|
+
},
|
|
72
|
+
fee_breakdown: {
|
|
73
|
+
router_fee: '2',
|
|
74
|
+
client_fee: '6',
|
|
75
|
+
max_slippage: '4',
|
|
76
|
+
min_amount_received: '988',
|
|
77
|
+
},
|
|
78
|
+
client_fee_deadline: 1_900_000_000,
|
|
79
|
+
};
|
|
80
|
+
it('accepts a signed quote carrying our share of the fee', () => {
|
|
81
|
+
expect(validate(feeOrder, feeContext).isOk()).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it.each([
|
|
84
|
+
[
|
|
85
|
+
'a fee below our share',
|
|
86
|
+
{
|
|
87
|
+
fee_breakdown: { ...feeOrder.fee_breakdown, client_fee: '4', min_amount_received: '990' },
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
[
|
|
91
|
+
'an unsigned placeholder',
|
|
92
|
+
{ transaction: { ...feeOrder.transaction, data: `0x12345678${'00'.repeat(65)}` } },
|
|
93
|
+
],
|
|
94
|
+
['a missing deadline', { client_fee_deadline: null }],
|
|
95
|
+
])('rejects %s', (_label, overrides) => {
|
|
96
|
+
expect(validate({ ...feeOrder, ...overrides }, feeContext).isErr()).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { checkEvmSwapStatus } from '../../utils/index.js';
|
|
2
|
+
import { getEvmTransactionFees, getUnsignedEvmTransaction } from '../../utils/evm/index.js';
|
|
3
|
+
import { getKyberTradeQuote } from './swapperApi/getKyberTradeQuote.js';
|
|
4
|
+
import { getKyberTradeRate } from './swapperApi/getKyberTradeRate.js';
|
|
5
|
+
export const kyberApi = {
|
|
6
|
+
getTradeQuote: (input, deps) => getKyberTradeQuote(input, deps),
|
|
7
|
+
getTradeRate: (input, deps) => getKyberTradeRate(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 { KyberTradeQuoteInput } from '../types.js';
|
|
4
|
+
export declare const getKyberTradeQuote: (input: KyberTradeQuoteInput, deps: SwapperDeps) => Promise<Result<TradeQuote[], SwapErrorRight>>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Err, Ok } from '@sniptt/monads';
|
|
2
|
+
import { assertQuoteAddresses } from '../../../utils/index.js';
|
|
3
|
+
import { KYBER_DEADLINE_SECONDS } from '../utils/constants.js';
|
|
4
|
+
import { fetchKyberBuild } from '../utils/fetchFromKyber.js';
|
|
5
|
+
import { getKyberStepData } from '../utils/getKyberStepData.js';
|
|
6
|
+
import { getKyberTradeContext } from '../utils/getKyberTradeContext.js';
|
|
7
|
+
import { getKyberTradeAmounts } from '../utils/helpers.js';
|
|
8
|
+
export const getKyberTradeQuote = async (input, deps) => {
|
|
9
|
+
const { accountNumber } = input;
|
|
10
|
+
const maybeAddresses = assertQuoteAddresses(input);
|
|
11
|
+
if (maybeAddresses.isErr())
|
|
12
|
+
return Err(maybeAddresses.unwrapErr());
|
|
13
|
+
const { sendAddress, receiveAddress } = maybeAddresses.unwrap();
|
|
14
|
+
const maybeContext = await getKyberTradeContext({ input, deps });
|
|
15
|
+
if (maybeContext.isErr())
|
|
16
|
+
return Err(maybeContext.unwrapErr());
|
|
17
|
+
const { tradeCommon, stepCommon, protocolFees, chainId, route, stepDataArgs } = maybeContext.unwrap();
|
|
18
|
+
const deadline = Math.floor(Date.now() / 1000) + KYBER_DEADLINE_SECONDS;
|
|
19
|
+
const maybeBuild = await fetchKyberBuild({
|
|
20
|
+
chainId,
|
|
21
|
+
route,
|
|
22
|
+
slippageTolerancePercentageDecimal: tradeCommon.slippageTolerancePercentageDecimal,
|
|
23
|
+
baseUrl: deps.config.VITE_KYBER_BASE_URL,
|
|
24
|
+
sendAddress,
|
|
25
|
+
receiveAddress,
|
|
26
|
+
deadline,
|
|
27
|
+
});
|
|
28
|
+
if (maybeBuild.isErr())
|
|
29
|
+
return Err(maybeBuild.unwrapErr());
|
|
30
|
+
const build = maybeBuild.unwrap();
|
|
31
|
+
// Kyber re-prices at build time and derives the calldata's minimum return from the built amount
|
|
32
|
+
const tradeAmounts = getKyberTradeAmounts({ input, amountOut: build.amountOut });
|
|
33
|
+
const maybeStepData = await getKyberStepData({
|
|
34
|
+
...stepDataArgs,
|
|
35
|
+
type: 'quote',
|
|
36
|
+
input,
|
|
37
|
+
from: sendAddress,
|
|
38
|
+
build,
|
|
39
|
+
});
|
|
40
|
+
if (maybeStepData.isErr())
|
|
41
|
+
return Err(maybeStepData.unwrapErr());
|
|
42
|
+
const { transactionData, networkFeeCryptoBaseUnit } = maybeStepData.unwrap();
|
|
43
|
+
const tradeQuote = {
|
|
44
|
+
...tradeCommon,
|
|
45
|
+
rate: tradeAmounts.rate,
|
|
46
|
+
quoteOrRate: 'quote',
|
|
47
|
+
receiveAddress,
|
|
48
|
+
deadline: deadline * 1000,
|
|
49
|
+
steps: [
|
|
50
|
+
{
|
|
51
|
+
...stepCommon,
|
|
52
|
+
...tradeAmounts,
|
|
53
|
+
accountNumber,
|
|
54
|
+
transactionData,
|
|
55
|
+
feeData: { networkFeeCryptoBaseUnit, protocolFees },
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
return Ok([tradeQuote]);
|
|
60
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Result } from '@sniptt/monads';
|
|
2
|
+
import type { SwapErrorRight, SwapperDeps, TradeRate } from '../../../types.js';
|
|
3
|
+
import type { KyberTradeRateInput } from '../types.js';
|
|
4
|
+
export declare const getKyberTradeRate: (input: KyberTradeRateInput, deps: SwapperDeps) => Promise<Result<TradeRate[], SwapErrorRight>>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Err, Ok } from '@sniptt/monads';
|
|
2
|
+
import { getKyberStepData } from '../utils/getKyberStepData.js';
|
|
3
|
+
import { getKyberTradeContext } from '../utils/getKyberTradeContext.js';
|
|
4
|
+
export const getKyberTradeRate = async (input, deps) => {
|
|
5
|
+
const { accountNumber, receiveAddress } = input;
|
|
6
|
+
const maybeContext = await getKyberTradeContext({ input, deps });
|
|
7
|
+
if (maybeContext.isErr())
|
|
8
|
+
return Err(maybeContext.unwrapErr());
|
|
9
|
+
const { tradeCommon, stepCommon, protocolFees, stepDataArgs } = maybeContext.unwrap();
|
|
10
|
+
const maybeStepData = await getKyberStepData({ ...stepDataArgs, type: 'rate', input });
|
|
11
|
+
if (maybeStepData.isErr())
|
|
12
|
+
return Err(maybeStepData.unwrapErr());
|
|
13
|
+
const { networkFeeCryptoBaseUnit } = maybeStepData.unwrap();
|
|
14
|
+
const tradeRate = {
|
|
15
|
+
...tradeCommon,
|
|
16
|
+
quoteOrRate: 'rate',
|
|
17
|
+
receiveAddress,
|
|
18
|
+
steps: [
|
|
19
|
+
{
|
|
20
|
+
...stepCommon,
|
|
21
|
+
accountNumber,
|
|
22
|
+
feeData: { networkFeeCryptoBaseUnit, protocolFees },
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
return Ok([tradeRate]);
|
|
27
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Address, Hex } from 'viem';
|
|
2
|
+
import type { GetEvmTradeQuoteInput, GetEvmTradeRateInput } from '../../types.js';
|
|
3
|
+
export type KyberTradeQuoteInput = GetEvmTradeQuoteInput;
|
|
4
|
+
export type KyberTradeRateInput = GetEvmTradeRateInput;
|
|
5
|
+
export type KyberExtraFee = {
|
|
6
|
+
feeAmount: string;
|
|
7
|
+
chargeFeeBy: '' | 'currency_in' | 'currency_out';
|
|
8
|
+
isInBps: boolean;
|
|
9
|
+
feeReceiver: string;
|
|
10
|
+
};
|
|
11
|
+
export type KyberFeeParams = {
|
|
12
|
+
feeAmount: string;
|
|
13
|
+
chargeFeeBy: 'currency_out';
|
|
14
|
+
isInBps: true;
|
|
15
|
+
feeReceiver: Address;
|
|
16
|
+
};
|
|
17
|
+
export type KyberRouteSummary = {
|
|
18
|
+
tokenIn: string;
|
|
19
|
+
amountIn: string;
|
|
20
|
+
amountInUsd: string;
|
|
21
|
+
tokenOut: string;
|
|
22
|
+
amountOut: string;
|
|
23
|
+
amountOutUsd: string;
|
|
24
|
+
gas: string;
|
|
25
|
+
gasPrice: string;
|
|
26
|
+
gasUsd: string;
|
|
27
|
+
l1FeeUsd: string;
|
|
28
|
+
extraFee: KyberExtraFee;
|
|
29
|
+
route: unknown;
|
|
30
|
+
routerAddress: Address;
|
|
31
|
+
routeID: string;
|
|
32
|
+
checksum: string;
|
|
33
|
+
timestamp: number;
|
|
34
|
+
};
|
|
35
|
+
export type KyberRouteData = {
|
|
36
|
+
routeSummary: KyberRouteSummary;
|
|
37
|
+
routerAddress: Address;
|
|
38
|
+
};
|
|
39
|
+
export type KyberRoutesResponse = {
|
|
40
|
+
code: number;
|
|
41
|
+
message: string;
|
|
42
|
+
data?: KyberRouteData;
|
|
43
|
+
requestId: string;
|
|
44
|
+
};
|
|
45
|
+
export type KyberBuildData = {
|
|
46
|
+
amountOut: string;
|
|
47
|
+
gas: string;
|
|
48
|
+
data: Hex;
|
|
49
|
+
routerAddress: Address;
|
|
50
|
+
transactionValue: string;
|
|
51
|
+
};
|
|
52
|
+
export type KyberBuildResponse = {
|
|
53
|
+
code: number;
|
|
54
|
+
message: string;
|
|
55
|
+
data?: KyberBuildData;
|
|
56
|
+
requestId: string;
|
|
57
|
+
};
|
|
58
|
+
export type KyberErrorResponse = {
|
|
59
|
+
code: number;
|
|
60
|
+
message: string;
|
|
61
|
+
requestId?: string;
|
|
62
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
export declare const KYBER_CLIENT_ID = "shapeshift";
|
|
3
|
+
export declare const KYBER_DEADLINE_SECONDS = 1200;
|
|
4
|
+
export declare const KYBER_CHAINS: {
|
|
5
|
+
readonly "eip155:1": "ethereum";
|
|
6
|
+
readonly "eip155:10": "optimism";
|
|
7
|
+
readonly "eip155:56": "bsc";
|
|
8
|
+
readonly "eip155:137": "polygon";
|
|
9
|
+
readonly "eip155:42161": "arbitrum";
|
|
10
|
+
readonly "eip155:8453": "base";
|
|
11
|
+
readonly "eip155:43114": "avalanche";
|
|
12
|
+
readonly "eip155:130": "unichain";
|
|
13
|
+
readonly "eip155:4663": "robinhood";
|
|
14
|
+
readonly "eip155:143": "monad";
|
|
15
|
+
readonly "eip155:999": "hyperevm";
|
|
16
|
+
readonly "eip155:4326": "megaeth";
|
|
17
|
+
readonly "eip155:9745": "plasma";
|
|
18
|
+
};
|
|
19
|
+
export type KyberSupportedChainId = keyof typeof KYBER_CHAINS;
|
|
20
|
+
export declare const KYBER_ROUTER_ADDRESS: Address;
|
|
21
|
+
export declare const KYBER_NATIVE_TOKEN: Address;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { KnownChainIds } from '@shapeshiftoss/types';
|
|
2
|
+
export const KYBER_CLIENT_ID = 'shapeshift';
|
|
3
|
+
export const KYBER_DEADLINE_SECONDS = 1200;
|
|
4
|
+
export const KYBER_CHAINS = {
|
|
5
|
+
[KnownChainIds.EthereumMainnet]: 'ethereum',
|
|
6
|
+
[KnownChainIds.OptimismMainnet]: 'optimism',
|
|
7
|
+
[KnownChainIds.BnbSmartChainMainnet]: 'bsc',
|
|
8
|
+
[KnownChainIds.PolygonMainnet]: 'polygon',
|
|
9
|
+
[KnownChainIds.ArbitrumMainnet]: 'arbitrum',
|
|
10
|
+
[KnownChainIds.BaseMainnet]: 'base',
|
|
11
|
+
[KnownChainIds.AvalancheMainnet]: 'avalanche',
|
|
12
|
+
[KnownChainIds.UnichainMainnet]: 'unichain',
|
|
13
|
+
[KnownChainIds.RobinhoodMainnet]: 'robinhood',
|
|
14
|
+
[KnownChainIds.MonadMainnet]: 'monad',
|
|
15
|
+
[KnownChainIds.HyperEvmMainnet]: 'hyperevm',
|
|
16
|
+
[KnownChainIds.MegaEthMainnet]: 'megaeth',
|
|
17
|
+
[KnownChainIds.PlasmaMainnet]: 'plasma',
|
|
18
|
+
};
|
|
19
|
+
// MetaAggregationRouterV2, same address on every chain: https://docs.kyberswap.com/developer-guide/aggregator-api/contracts
|
|
20
|
+
export const KYBER_ROUTER_ADDRESS = '0x6131B5fae19EA4f9D964eAc0408E4408b66337b5';
|
|
21
|
+
export const KYBER_NATIVE_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Result } from '@sniptt/monads';
|
|
2
|
+
import type { Address } from 'viem';
|
|
3
|
+
import type { SwapErrorRight } from '../../../types.js';
|
|
4
|
+
import type { KyberBuildData, KyberFeeParams, KyberRouteSummary } from '../types.js';
|
|
5
|
+
import type { KyberSupportedChainId } from './constants.js';
|
|
6
|
+
export declare const fetchKyberRoute: ({ chainId, tokenIn, tokenOut, sellAmountCryptoBaseUnit, feeParams, sendAddress, baseUrl, }: {
|
|
7
|
+
chainId: KyberSupportedChainId;
|
|
8
|
+
tokenIn: Address;
|
|
9
|
+
tokenOut: Address;
|
|
10
|
+
sellAmountCryptoBaseUnit: string;
|
|
11
|
+
feeParams: KyberFeeParams | undefined;
|
|
12
|
+
sendAddress: string | undefined;
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
}) => Promise<Result<KyberRouteSummary, SwapErrorRight>>;
|
|
15
|
+
export declare const fetchKyberBuild: ({ chainId, route, slippageTolerancePercentageDecimal, baseUrl, sendAddress, receiveAddress, deadline, }: {
|
|
16
|
+
chainId: KyberSupportedChainId;
|
|
17
|
+
route: KyberRouteSummary;
|
|
18
|
+
slippageTolerancePercentageDecimal: string;
|
|
19
|
+
baseUrl: string;
|
|
20
|
+
sendAddress: string;
|
|
21
|
+
receiveAddress: string;
|
|
22
|
+
deadline: number;
|
|
23
|
+
}) => Promise<Result<KyberBuildData, SwapErrorRight>>;
|