Skip to content

Commit

Permalink
feat: update index quote provider to use leverage extended
Browse files Browse the repository at this point in the history
  • Loading branch information
janndriessen committed Apr 24, 2024
1 parent c65a5ff commit aff7e05
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 11 deletions.
69 changes: 65 additions & 4 deletions src/quote/indexQuoteProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
}
Expand Down Expand Up @@ -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')
}
Expand All @@ -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) {
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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 ||
Expand Down
8 changes: 1 addition & 7 deletions src/quote/leveraged-extended/utils/zeroex.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down

0 comments on commit aff7e05

Please sign in to comment.