diff --git a/packages/asset-swapper/src/utils/market_operation_utils/bridge_source_utils.ts b/packages/asset-swapper/src/utils/market_operation_utils/bridge_source_utils.ts index a7aed18811..79ad857aa0 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/bridge_source_utils.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/bridge_source_utils.ts @@ -42,6 +42,8 @@ import { SMOOTHY_BSC_INFOS, SMOOTHY_MAINNET_INFOS, SNOWSWAP_MAINNET_INFOS, + SPIRITSWAP_ROUTER_BY_CHAIN_ID, + SPOOKYSWAP_ROUTER_BY_CHAIN_ID, SUSHISWAP_ROUTER_BY_CHAIN_ID, SWERVE_MAINNET_INFOS, TRADER_JOE_ROUTER_BY_CHAIN_ID, @@ -468,7 +470,9 @@ export function uniswapV2LikeRouterAddress( | ERC20BridgeSource.ShibaSwap | ERC20BridgeSource.JetSwap | ERC20BridgeSource.TraderJoe - | ERC20BridgeSource.Pangolin, + | ERC20BridgeSource.Pangolin + | ERC20BridgeSource.SpookySwap + | ERC20BridgeSource.SpiritSwap, ): string { switch (source) { case ERC20BridgeSource.UniswapV2: @@ -509,6 +513,10 @@ export function uniswapV2LikeRouterAddress( return PANGOLIN_ROUTER_BY_CHAIN_ID[chainId]; case ERC20BridgeSource.TraderJoe: return TRADER_JOE_ROUTER_BY_CHAIN_ID[chainId]; + case ERC20BridgeSource.SpookySwap: + return SPOOKYSWAP_ROUTER_BY_CHAIN_ID[chainId]; + case ERC20BridgeSource.SpiritSwap: + return SPIRITSWAP_ROUTER_BY_CHAIN_ID[chainId]; default: throw new Error(`Unknown UniswapV2 like source ${source}`); } diff --git a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts index 61c785a6d7..a39fdd1a4e 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -167,6 +167,8 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( [ChainId.Fantom]: new SourceFilters([ ERC20BridgeSource.Curve, ERC20BridgeSource.CurveV2, + ERC20BridgeSource.SpiritSwap, + ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap, ]), }, @@ -278,6 +280,8 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( [ChainId.Fantom]: new SourceFilters([ ERC20BridgeSource.Curve, ERC20BridgeSource.CurveV2, + ERC20BridgeSource.SpiritSwap, + ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap, ]), }, @@ -299,7 +303,7 @@ export const FEE_QUOTE_SOURCES_BY_CHAIN_ID = valueByChainId [ChainId.Ropsten]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap], [ChainId.Polygon]: [ERC20BridgeSource.QuickSwap, ERC20BridgeSource.SushiSwap], [ChainId.Avalanche]: [ERC20BridgeSource.Pangolin, ERC20BridgeSource.TraderJoe, ERC20BridgeSource.SushiSwap], - [ChainId.Fantom]: [ERC20BridgeSource.SushiSwap], + [ChainId.Fantom]: [ERC20BridgeSource.SpiritSwap, ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap], }, [], ); @@ -1702,6 +1706,20 @@ export const TRADER_JOE_ROUTER_BY_CHAIN_ID = valueByChainId( NULL_ADDRESS, ); +export const SPIRITSWAP_ROUTER_BY_CHAIN_ID = valueByChainId( + { + [ChainId.Fantom]: '0x16327e3fbdaca3bcf7e38f5af2599d2ddc33ae52', + }, + NULL_ADDRESS, +); + +export const SPOOKYSWAP_ROUTER_BY_CHAIN_ID = valueByChainId( + { + [ChainId.Fantom]: '0xf491e7b69e4244ad4002bc14e878a34207e38c29', + }, + NULL_ADDRESS, +); + export const VIP_ERC20_BRIDGE_SOURCES_BY_CHAIN_ID = valueByChainId( { [ChainId.Mainnet]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap, ERC20BridgeSource.UniswapV3], @@ -1852,6 +1870,12 @@ export const DEFAULT_GAS_SCHEDULE: Required = { // [ERC20BridgeSource.Pangolin]: uniswapV2CloneGasSchedule, [ERC20BridgeSource.TraderJoe]: uniswapV2CloneGasSchedule, + + // + // Fantom + // + [ERC20BridgeSource.SpiritSwap]: uniswapV2CloneGasSchedule, + [ERC20BridgeSource.SpookySwap]: uniswapV2CloneGasSchedule, }; export const DEFAULT_FEE_SCHEDULE: Required = { ...DEFAULT_GAS_SCHEDULE }; diff --git a/packages/asset-swapper/src/utils/market_operation_utils/orders.ts b/packages/asset-swapper/src/utils/market_operation_utils/orders.ts index 2666b89b85..d6818ed96f 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/orders.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/orders.ts @@ -184,6 +184,10 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'Pangolin'); case ERC20BridgeSource.TraderJoe: return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'TraderJoe'); + case ERC20BridgeSource.SpiritSwap: + return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'SpiritSwap'); + case ERC20BridgeSource.SpookySwap: + return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'SpookySwap'); default: throw new Error(AggregationError.NoBridgeForSource); } @@ -260,6 +264,8 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder case ERC20BridgeSource.JetSwap: case ERC20BridgeSource.Pangolin: case ERC20BridgeSource.TraderJoe: + case ERC20BridgeSource.SpiritSwap: + case ERC20BridgeSource.SpookySwap: const uniswapV2FillData = (order as OptimizedMarketBridgeOrder).fillData; bridgeData = encoder.encode([uniswapV2FillData.router, uniswapV2FillData.tokenAddressPath]); break; @@ -450,6 +456,8 @@ export const BRIDGE_ENCODERS: { [ERC20BridgeSource.ShibaSwap]: routerAddressPathEncoder, [ERC20BridgeSource.Pangolin]: routerAddressPathEncoder, [ERC20BridgeSource.TraderJoe]: routerAddressPathEncoder, + [ERC20BridgeSource.SpiritSwap]: routerAddressPathEncoder, + [ERC20BridgeSource.SpookySwap]: routerAddressPathEncoder, // BSC [ERC20BridgeSource.PancakeSwap]: routerAddressPathEncoder, [ERC20BridgeSource.PancakeSwapV2]: routerAddressPathEncoder, diff --git a/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts b/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts index 9cea083322..4eb4b08c9a 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts @@ -1203,6 +1203,8 @@ export class SamplerOperations { case ERC20BridgeSource.JetSwap: case ERC20BridgeSource.Pangolin: case ERC20BridgeSource.TraderJoe: + case ERC20BridgeSource.SpiritSwap: + case ERC20BridgeSource.SpookySwap: const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source); if (!isValidAddress(uniLikeRouter)) { return []; @@ -1472,6 +1474,8 @@ export class SamplerOperations { case ERC20BridgeSource.JetSwap: case ERC20BridgeSource.Pangolin: case ERC20BridgeSource.TraderJoe: + case ERC20BridgeSource.SpiritSwap: + case ERC20BridgeSource.SpookySwap: const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source); if (!isValidAddress(uniLikeRouter)) { return []; diff --git a/packages/asset-swapper/src/utils/market_operation_utils/types.ts b/packages/asset-swapper/src/utils/market_operation_utils/types.ts index 01d245147c..84b5a323a7 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/types.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/types.ts @@ -93,6 +93,9 @@ export enum ERC20BridgeSource { // Avalanche Pangolin = 'Pangolin', TraderJoe = 'TraderJoe', + // Fantom + SpiritSwap = 'SpiritSwap', + SpookySwap = 'SpookySwap', } export type SourcesWithPoolsCache = ERC20BridgeSource.Balancer | ERC20BridgeSource.BalancerV2 | ERC20BridgeSource.Cream; diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index 09cdca17e3..722ee59af1 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -406,7 +406,7 @@ "maximumGasPrice": "0x0000000000000000000000000000000000000000", "dexForwarderBridge": "0x0000000000000000000000000000000000000000", "exchangeProxyGovernor": "0xca7bab1b2d1ec7d81710b7f9e2ab4e6788930588", - "exchangeProxy": "0xDEf1520C89538d9e43Aa273b7803a16F871d21e3", + "exchangeProxy": "0xDEF189DeAEF76E379df891899eb5A00a94cBC250", "exchangeProxyTransformerDeployer": "0x47F01db18a38261E4cB153bAe6db7d3743AcB33c", "exchangeProxyFlashWallet": "0xdb6f1920a889355780af7570773609bd8cb1f498", "exchangeProxyLiquidityProviderSandbox": "0xcA64D4225804F2Ae069760CB5fF2F1D8BaC1C2f9", @@ -415,7 +415,7 @@ "wethTransformer": "0x9b6aA8f26A92108e7d1F66373d757Bb955112703", "payTakerTransformer": "0x32dF54951D33D7460e15Fa59B1fCc262183ce4C2", "affiliateFeeTransformer": "0x67EfA679a4b56C38713d478e649C88247F4F8E88", - "fillQuoteTransformer": "0xa21ab090bE8BDE78dAB8FA47988aBbEDF361327A", + "fillQuoteTransformer": "0x71de60a1B160094a3f6C7E1b883FF9337d639131", "positiveSlippageFeeTransformer": "0xe87D69b285005CC82b53B844322652C49ED64600" } }