Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add 0x swap data #59

Merged
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
9bb0d52
chore: remove obsolete todo
janndriessen May 24, 2024
bd07907
build: create zeroex folder
janndriessen May 24, 2024
5e3a694
lint
janndriessen May 24, 2024
0fdfa35
feat: add zeroe ex swap data
janndriessen May 24, 2024
aba4e5e
feat: add 0x api
janndriessen May 24, 2024
f0b46f2
feat: add get swap data to zeroex adapter
janndriessen May 24, 2024
9cbc88f
feat: start adding swap quote provider to leveraged quote provider
janndriessen May 24, 2024
9f23f28
refactor: get payment token address
janndriessen May 24, 2024
a3a24ea
feat: add sources and leverage quote provider to fully use swap quote…
janndriessen May 24, 2024
772b810
refactor: remove zeroex api from constructor
janndriessen May 24, 2024
c162745
refactor: leveraged token data util function
janndriessen May 24, 2024
cecbadc
test: fix import
janndriessen May 24, 2024
c9e8878
build: fix import
janndriessen May 24, 2024
d7a034f
feat: add swap quote provider to leveraged extended
janndriessen May 24, 2024
bf73f64
feat: remove zero ex api dependency
janndriessen May 24, 2024
cfcd17c
chore: remove unsupported contract type
janndriessen May 24, 2024
c745320
feat: make swap quote provider a required dependency
janndriessen May 24, 2024
a91693a
test: remove obsolete test
janndriessen May 24, 2024
fe8056b
lint
janndriessen May 24, 2024
f795f87
test: fix test files after removing zeroex api
janndriessen May 24, 2024
c8513d9
lint
janndriessen May 24, 2024
1ecbeef
test: readd arbitrum tests
janndriessen May 24, 2024
23f14cc
test: skip eth2xfli tests
janndriessen May 24, 2024
095325a
test: fix testing for right output
janndriessen May 24, 2024
ab06e23
refactor: remove 0x utils
janndriessen May 24, 2024
7b3a996
chore: add arbitrum token addresses for util function
janndriessen May 24, 2024
5f66112
test: remove obsolete test
janndriessen May 24, 2024
12666af
feat: use rpc url for index quote provider
janndriessen May 24, 2024
cdb0720
refactor: quote folder structure
janndriessen May 24, 2024
729869f
refactor: add utils and add tests
janndriessen May 24, 2024
71e4ede
feat: add get rpc provider util function
janndriessen May 24, 2024
bc7002b
feat: make builders use rpc url
janndriessen May 24, 2024
28a0b23
feat: use rpc url for all quote providers
janndriessen May 24, 2024
7fb8539
test: fix tests adding rpc url
janndriessen May 24, 2024
c8a88c1
build: fix test script
janndriessen May 24, 2024
cc042cb
docs: update readme for v3
janndriessen May 24, 2024
0e9f5a1
Merge pull request #62 from IndexCoop/feat/add-v3
janndriessen May 24, 2024
a0ab71a
Merge pull request #61 from IndexCoop/feat/use-rpc-url
janndriessen May 24, 2024
1bc68e5
Merge pull request #60 from IndexCoop/feat/remove-0x-utils
janndriessen May 24, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
- run: npm ci
- run: npm run lint
- run: npm run build --if-present
# - run: npm run hardhat:arbitrum & npm run test:arbitrum
- run: npm run hardhat:arbitrum & npm run test:arbitrum
- run: npm run hardhat & npm run test:utils
- run: npm run hardhat & npm run test:builders
- run: npm run hardhat & npm run test:quote
Expand All @@ -45,4 +45,5 @@ jobs:
- run: npm run hardhat & npm run test:iceth
# - run: npm run hardhat & npm run test:icreth
# run last - as it alters the block number
- run: npm run hardhat & npm run test:eth2xfli
# skip as it can't be minted or redeemed with 0x
# - run: npm run hardhat & npm run test:eth2xfli
59 changes: 15 additions & 44 deletions src/quote/indexQuoteProvider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@
import { ChainId } from 'constants/chains'
import { FlashMintZeroExMainnetAddress } from 'constants/contracts'
import { IndexCoopEthereum2xIndex } from 'constants/tokens'
import {
getFlashMintLeveragedContractForToken,
getFlashMintZeroExContractForToken,
wei,
} from 'utils'

import {
IndexZeroExSwapQuoteProvider,
IndexZeroExSwapQuoteProviderArbitrum,
LocalhostProvider,
LocalhostProviderArbitrum,
QuoteTokens,
ZeroExApiSwapQuote,
} from 'tests/utils'
import {
getFlashMintLeveragedContractForToken,
getFlashMintZeroExContractForToken,
wei,
} from 'utils'

import {
FlashMintContractType,
FlashMintQuoteProvider,
Expand All @@ -24,7 +25,7 @@ import {
const provider = LocalhostProvider
const zeroexSwapQuoteProvider = IndexZeroExSwapQuoteProvider

const { cdeti, dseth, eth, eth2x, iceth, mvi, usdc } = QuoteTokens
const { cdeti, dseth, eth, eth2x, iceth, usdc } = QuoteTokens

describe('FlashMintQuoteProvider()', () => {
test('throws if token is unsupported', async () => {
Expand All @@ -41,7 +42,10 @@ describe('FlashMintQuoteProvider()', () => {
indexTokenAmount: wei(1),
slippage: 0.5,
}
const quoteProvider = new FlashMintQuoteProvider(provider)
const quoteProvider = new FlashMintQuoteProvider(
provider,
zeroexSwapQuoteProvider
)
await expect(quoteProvider.getQuote(request)).rejects.toThrow(
'Index token not supported'
)
Expand Down Expand Up @@ -146,7 +150,7 @@ describe('FlashMintQuoteProvider()', () => {
expect(quote.tx.data?.length).toBeGreaterThan(0)
})

test.skip('returns a quote for minting ETH2X', async () => {
test('returns a quote for minting ETH2X', async () => {
const arbitrumProvider = LocalhostProviderArbitrum
const inputToken = usdc
const outputToken = {
Expand Down Expand Up @@ -187,7 +191,7 @@ describe('FlashMintQuoteProvider()', () => {
expect(quote.tx.data?.length).toBeGreaterThan(0)
})

test.skip('returns a quote for redeeming ETH2X', async () => {
test('returns a quote for redeeming ETH2X', async () => {
const arbitrumProvider = LocalhostProviderArbitrum
const inputToken = {
address: IndexCoopEthereum2xIndex.addressArbitrum!,
Expand Down Expand Up @@ -245,8 +249,7 @@ describe('FlashMintQuoteProvider()', () => {
}
const quoteProvider = new FlashMintQuoteProvider(
provider,
undefined,
ZeroExApiSwapQuote
zeroexSwapQuoteProvider
)
const quote = await quoteProvider.getQuote(request)
if (!quote) fail()
Expand All @@ -264,36 +267,4 @@ describe('FlashMintQuoteProvider()', () => {
expect(quote.tx.to).toBe(contract.address)
expect(quote.tx.data?.length).toBeGreaterThan(0)
})

test('should fail if zeroExApiV1 is undefined for contract type leveraged', async () => {
const inputToken = usdc
const outputToken = iceth
const request: FlashMintQuoteRequest = {
isMinting: true,
inputToken,
outputToken,
indexTokenAmount: wei(1),
slippage: 0.5,
}
const quoteProvider = new FlashMintQuoteProvider(provider)
await expect(quoteProvider.getQuote(request)).rejects.toThrow(
'Contract type requires ZeroExApiV1 to be defined'
)
})

test('should fail if swap quote provider is undefined for contract type zeroEx', async () => {
const inputToken = usdc
const outputToken = mvi
const request: FlashMintQuoteRequest = {
isMinting: true,
inputToken,
outputToken,
indexTokenAmount: wei(1),
slippage: 0.5,
}
const quoteProvider = new FlashMintQuoteProvider(provider)
await expect(quoteProvider.getQuote(request)).rejects.toThrow(
'Contract type requires SwapQuoteProvider to be defined'
)
})
})
36 changes: 6 additions & 30 deletions src/quote/indexQuoteProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,18 @@ import {
LeveragedTransactionBuilder,
ZeroExTransactionBuilder,
} from 'flashmint'
import { ZeroExApi, wei } from 'utils'
import { wei } from 'utils'

import { LeveragedQuoteProvider } from './leveraged'
import { LeveragedExtendedQuoteProvider } from './leveraged-extended'
import { QuoteProvider } from './quoteProvider'
import { QuoteToken } from './quoteToken'
import { SwapQuoteProvider } from './swap'
import { ZeroExQuoteProvider } from './zeroEx'
import { SwapQuoteProvider } from 'quote/swap'

export enum FlashMintContractType {
leveraged,
leveragedExtended,
erc4626,
zeroEx,
}

Expand Down Expand Up @@ -71,14 +70,13 @@ export class FlashMintQuoteProvider
{
constructor(
private readonly provider: JsonRpcProvider,
private readonly swapQuoteProvider?: SwapQuoteProvider,
private readonly zeroExApiV1?: ZeroExApi
private readonly swapQuoteProvider: SwapQuoteProvider
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • adds swapQuoteProvider as required dependency
  • removes zeroExApiV1 as dependency

) {}

async getQuote(
request: FlashMintQuoteRequest
): Promise<FlashMintQuote | null> {
const { provider, swapQuoteProvider, zeroExApiV1 } = this
const { provider, swapQuoteProvider } = this
const { indexTokenAmount, inputToken, isMinting, outputToken, slippage } =
request
const indexToken = isMinting ? outputToken : inputToken
Expand All @@ -89,19 +87,11 @@ export class FlashMintQuoteProvider
if (contractType === null) {
throw new Error('Index token not supported')
}
if (requiresZeroExV1(contractType)) {
if (!zeroExApiV1) {
throw new Error('Contract type requires ZeroExApiV1 to be defined')
}
}
switch (contractType) {
case FlashMintContractType.leveraged: {
if (!zeroExApiV1) {
throw new Error('Contract type requires ZeroExApiV1 to be defined')
}
const leveragedQuoteProvider = new LeveragedQuoteProvider(
provider,
zeroExApiV1
swapQuoteProvider
)
const leveragedQuote = await leveragedQuoteProvider.getQuote(request)
if (!leveragedQuote) return null
Expand Down Expand Up @@ -134,11 +124,8 @@ export class FlashMintQuoteProvider
}
}
case FlashMintContractType.leveragedExtended: {
if (!zeroExApiV1) {
throw new Error('Contract type requires ZeroExApiV1 to be defined')
}
const leverageExtendedQuoteProvider =
new LeveragedExtendedQuoteProvider(provider, zeroExApiV1)
new LeveragedExtendedQuoteProvider(provider, swapQuoteProvider)
const leveragedExtendedQuote =
await leverageExtendedQuoteProvider.getQuote(request)
if (!leveragedExtendedQuote) return null
Expand Down Expand Up @@ -175,11 +162,6 @@ export class FlashMintQuoteProvider
}
}
case FlashMintContractType.zeroEx: {
if (!swapQuoteProvider) {
throw new Error(
'Contract type requires SwapQuoteProvider to be defined'
)
}
const zeroExQuoteProvider = new ZeroExQuoteProvider(
provider,
swapQuoteProvider
Expand Down Expand Up @@ -255,9 +237,3 @@ function getContractType(
return FlashMintContractType.leveraged
return null
}

function requiresZeroExV1(contractType: FlashMintContractType): boolean {
if (contractType === FlashMintContractType.leveraged) return true
if (contractType === FlashMintContractType.leveragedExtended) return true
return false
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

obsolete as the swap quote provider is always required

5 changes: 3 additions & 2 deletions src/quote/leveraged-extended/provider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,17 @@ import { noopSwapData } from 'constants/swapdata'
import { IndexCoopEthereum2xIndex, USDC, WETH } from 'constants/tokens'
import { Exchange } from 'utils'
import { wei } from 'utils/numbers'

import {
IndexZeroExSwapQuoteProviderArbitrum,
LocalhostProviderArbitrum,
QuoteTokens,
ZeroExApiArbitrumSwapQuote,
} from 'tests/utils'

import { LeveragedExtendedQuoteProvider } from './provider'

const provider = LocalhostProviderArbitrum
const zeroExApi = ZeroExApiArbitrumSwapQuote
const zeroExApi = IndexZeroExSwapQuoteProviderArbitrum

const { eth, usdc } = QuoteTokens

Expand Down
Loading