diff --git a/src/quote/indexQuoteProvider.ts b/src/quote/indexQuoteProvider.ts index dd12ff28..fb9347c1 100644 --- a/src/quote/indexQuoteProvider.ts +++ b/src/quote/indexQuoteProvider.ts @@ -2,6 +2,7 @@ import { TransactionRequest } from '@ethersproject/abstract-provider' import { BigNumber } from '@ethersproject/bignumber' import { JsonRpcProvider } from '@ethersproject/providers' +import { ChainId } from 'constants/chains' import { BanklessBEDIndex, BTC2xFlexibleLeverageIndex, @@ -11,26 +12,34 @@ import { ETH2xFlexibleLeverageIndex, GitcoinStakedETHIndex, IndexCoopBitcoin2xIndex, + IndexCoopBitcoin3xIndex, IndexCoopEthereum2xIndex, + IndexCoopEthereum3xIndex, + IndexCoopInverseBitcoinIndex, + IndexCoopInverseEthereumIndex, InterestCompoundingETHIndex, LeveragedrEthStakingYield, MetaverseIndex, } from 'constants/tokens' import { FlashMintLeveragedBuildRequest, + FlashMintLeveragedExtendedBuildRequest, FlashMintZeroExBuildRequest, + LeveragedExtendedTransactionBuilder, LeveragedTransactionBuilder, ZeroExTransactionBuilder, } from 'flashmint' import { ZeroExApi } from 'utils' import { LeveragedQuoteProvider } from './leveraged' +import { LeveragedExtendedQuoteProvider } from './leveraged-extended' import { QuoteProvider } from './quoteProvider' import { QuoteToken } from './quoteToken' import { ZeroExQuoteProvider } from './zeroEx' export enum FlashMintContractType { leveraged, + leveragedExtended, erc4626, zeroEx, } @@ -72,7 +81,9 @@ export class FlashMintQuoteProvider request const indexToken = isMinting ? outputToken : inputToken const inputOutputToken = isMinting ? inputToken : outputToken - const contractType = getContractType(indexToken.symbol) + const network = await provider.getNetwork() + const chainId = network.chainId + const contractType = getContractType(indexToken.symbol, chainId) if (contractType === null) { throw new Error('Index token not supported') } @@ -81,8 +92,6 @@ export class FlashMintQuoteProvider throw new Error('Contract type requires ZeroExApiV1 to be defined') } } - const network = await provider.getNetwork() - const chainId = network.chainId switch (contractType) { case FlashMintContractType.leveraged: { if (!zeroExApiV1) { @@ -122,6 +131,44 @@ export class FlashMintQuoteProvider tx, } } + case FlashMintContractType.leveragedExtended: { + // TODO: make sure to use Arbitrum + if (!zeroExApiV1) { + throw new Error('Contract type requires ZeroExApiV1 to be defined') + } + const leverageExtendedQuoteProvider = + new LeveragedExtendedQuoteProvider(provider, zeroExApiV1) + const leveragedExtendedQuote = + await leverageExtendedQuoteProvider.getQuote(request) + if (!leveragedExtendedQuote) return null + const builder = new LeveragedExtendedTransactionBuilder(provider) + const txRequest: FlashMintLeveragedExtendedBuildRequest = { + isMinting, + inputToken: inputToken.address, + inputTokenSymbol: inputToken.symbol, + outputToken: outputToken.address, + outputTokenSymbol: outputToken.symbol, + inputTokenAmount: BigNumber.from(0), // TODO: leveragedExtendedQuote.inputTokenAmount, + outputTokenAmount: BigNumber.from(0), // TODO: leveragedExtendedQuote.outputTokenAmount, + swapDataDebtCollateral: leveragedExtendedQuote.swapDataDebtCollateral, + swapDataInputOutputToken: leveragedExtendedQuote.swapDataPaymentToken, + } + const tx = await builder.build(txRequest) + if (!tx) return null + return { + chainId, + contractType, + /* eslint-disable @typescript-eslint/no-non-null-assertion */ + contract: tx.to!, + isMinting, + inputToken, + outputToken, + indexTokenAmount, + inputOutputAmount: leveragedExtendedQuote.inputOutputTokenAmount, // TODO: check + slippage, + tx, + } + } case FlashMintContractType.zeroEx: { if (!zeroExApiV1) { throw new Error('Contract type requires ZeroExApiV1 to be defined') @@ -166,7 +213,21 @@ export class FlashMintQuoteProvider } // Returns contract type for token or null if not supported -function getContractType(token: string): FlashMintContractType | null { +function getContractType( + token: string, + chainId: number +): FlashMintContractType | null { + if (chainId === ChainId.Arbitrum) { + switch (token) { + case IndexCoopBitcoin2xIndex.symbol: + case IndexCoopBitcoin3xIndex.symbol: + case IndexCoopEthereum2xIndex.symbol: + case IndexCoopEthereum3xIndex.symbol: + case IndexCoopInverseBitcoinIndex.symbol: + case IndexCoopInverseEthereumIndex.symbol: + return FlashMintContractType.leveragedExtended + } + } if ( token === BanklessBEDIndex.symbol || token === CoinDeskEthTrendIndex.symbol || diff --git a/src/quote/leveraged-extended/utils/zeroex.ts b/src/quote/leveraged-extended/utils/zeroex.ts index 4131ebb9..f46291c7 100644 --- a/src/quote/leveraged-extended/utils/zeroex.ts +++ b/src/quote/leveraged-extended/utils/zeroex.ts @@ -1,10 +1,4 @@ -import { - Exchange, - getSwapDataCollateralDebt, - getSwapDataDebtCollateral, - getSwapData, - SwapData, -} from 'utils/swapData' +import { Exchange } from 'utils/swapData' // 0x keys https://github.com/0xProject/protocol/blob/4f32f3174f25858644eae4c3de59c3a6717a757c/packages/asset-swapper/src/utils/market_operation_utils/types.ts#L38 function get0xEchangeKey(exchange: Exchange): string {