Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
36 changes: 0 additions & 36 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,6 @@ type Pool @entity(immutable: false) {
bookB: Book!

# mutable values
# oracle price
oraclePrice: BigInt!
# total supply of liquidity tokens
totalSupply: BigInt!
# total liquidity of tokenA
Expand All @@ -262,14 +260,6 @@ type Pool @entity(immutable: false) {
liquidityB: BigInt!
# current lp tracker
lpPriceUSD: BigDecimal!
# current priceA tracker
priceA: BigDecimal!
priceARaw: BigInt!
tickA: BigInt!
# current priceB tracker
priceB: BigDecimal!
priceBRaw: BigInt!
tickB: BigInt!
# all time tokenA swapped
volumeTokenA: BigDecimal!
# all time tokenB swapped
Expand All @@ -284,8 +274,6 @@ type Pool @entity(immutable: false) {
protocolFeesAUSD: BigDecimal!
# protocolFees in tokenB USD
protocolFeesBUSD: BigDecimal!
# all time spread profit in USD
spreadProfitUSD: BigDecimal!
# tvl USD
totalValueLockedUSD: BigDecimal!
# hourly snapshots of pool data
Expand Down Expand Up @@ -465,8 +453,6 @@ type PoolDayData @entity(immutable: false) {
# pointer to pool
pool: Pool!

# oracle price
oraclePrice: BigInt!
# total supply of liquidity tokens
totalSupply: BigInt!
# total liquidity of tokenA
Expand All @@ -475,14 +461,6 @@ type PoolDayData @entity(immutable: false) {
liquidityB: BigInt!
# current lp tracker
lpPriceUSD: BigDecimal!
# current priceA tracker
priceA: BigDecimal!
priceARaw: BigInt!
tickA: BigInt!
# current priceB tracker
priceB: BigDecimal!
priceBRaw: BigInt!
tickB: BigInt!
# tokenA swapped
volumeTokenA: BigDecimal!
# tokenB swapped
Expand All @@ -497,8 +475,6 @@ type PoolDayData @entity(immutable: false) {
protocolFeesAUSD: BigDecimal!
# protocolFees in tokenB USD
protocolFeesBUSD: BigDecimal!
# spread profit in USD
spreadProfitUSD: BigDecimal!
# tvl derived in USD at end of period
totalValueLockedUSD: BigDecimal!
}
Expand All @@ -512,8 +488,6 @@ type PoolHourData @entity(immutable: false) {
# pointer to pool
pool: Pool!

# oracle price
oraclePrice: BigInt!
# total supply of liquidity tokens
totalSupply: BigInt!
# total liquidity of tokenA
Expand All @@ -522,14 +496,6 @@ type PoolHourData @entity(immutable: false) {
liquidityB: BigInt!
# current lp tracker
lpPriceUSD: BigDecimal!
# current priceA tracker
priceA: BigDecimal!
priceARaw: BigInt!
tickA: BigInt!
# current priceB tracker
priceB: BigDecimal!
priceBRaw: BigInt!
tickB: BigInt!
# tokenA swapped
volumeTokenA: BigDecimal!
# tokenB swapped
Expand All @@ -544,8 +510,6 @@ type PoolHourData @entity(immutable: false) {
protocolFeesAUSD: BigDecimal!
# protocolFees in tokenB USD
protocolFeesBUSD: BigDecimal!
# spread profit in USD
spreadProfitUSD: BigDecimal!
# tvl derived in USD at end of period
totalValueLockedUSD: BigDecimal!
}
Expand Down
103 changes: 3 additions & 100 deletions src/mappings/book-manager/claim.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@
import {
Address,
BigDecimal,
BigInt,
ethereum,
log,
store,
} from '@graphprotocol/graph-ts'
import { store } from '@graphprotocol/graph-ts'

import { Claim } from '../../../generated/BookManager/BookManager'
import {
Expand All @@ -15,86 +8,18 @@ import {
import {
getBookOrLog,
getOpenOrderOrLog,
getPoolOrLog,
getTokenOrLog,
} from '../../common/entity-getters'
import { unitToBase, unitToQuote } from '../../common/amount'
import { tickToPrice } from '../../common/tick'
import { Book, OpenOrder, Pool, Token } from '../../../generated/schema'
import { TWO_BD, ZERO_BD } from '../../common/constants'
import { ZERO_BD } from '../../common/constants'
import { convertTokenToDecimal } from '../../common/utils'
import { calculateValueUSD, getTokenUSDPriceFlat } from '../../common/pricing'
import { getTokenUSDPriceFlat } from '../../common/pricing'
import {
updateBookDayData,
updateDayData,
updatePoolDayData,
updatePoolHourData,
updateTokenDayData,
} from '../interval-updates'
import { LIQUIDITY_VAULT } from '../../common/chain'

function updatePool(
pool: Pool,
book: Book,
base: Token,
quote: Token,
baseInUSD: BigDecimal,
quoteInUSD: BigDecimal,
openOrder: OpenOrder,
claimedUnitAmount: BigInt,
event: ethereum.Event,
): void {
let spread = pool.priceB.minus(pool.priceA)
if (spread.lt(BigDecimal.zero())) {
spread = ZERO_BD
}
const baseClaimedAmount = unitToBase(
book.unitSize,
claimedUnitAmount,
openOrder.priceRaw,
)
const baseClaimedAmountDecimal = convertTokenToDecimal(
baseClaimedAmount,
base.decimals,
)

const quoteClaimedAmount = unitToQuote(book.unitSize, claimedUnitAmount)
const quoteClaimedAmountDecimal = convertTokenToDecimal(
quoteClaimedAmount,
quote.decimals,
)
const claimedAmountInUSD = calculateValueUSD(
quoteClaimedAmountDecimal,
quoteInUSD,
baseClaimedAmountDecimal,
baseInUSD,
)

if (
BigInt.fromString(pool.bookA).equals(BigInt.fromString(openOrder.book)) ||
BigInt.fromString(pool.bookB).equals(BigInt.fromString(openOrder.book))
) {
const spreadDelta = spread.div(TWO_BD).times(claimedAmountInUSD)
pool.spreadProfitUSD = pool.spreadProfitUSD.plus(spreadDelta)

const poolHourData = updatePoolHourData(pool, event)
const poolDayData = updatePoolDayData(pool, event)

// update intervals
poolHourData.spreadProfitUSD =
poolHourData.spreadProfitUSD.plus(spreadDelta)
poolDayData.spreadProfitUSD = poolDayData.spreadProfitUSD.plus(spreadDelta)

pool.save()
poolHourData.save()
poolDayData.save()
} else {
log.warning('Pool {} does not contain book {}', [
pool.id.toString(),
openOrder.book.toString(),
])
}
}

export function handleClaim(event: Claim): void {
updateDayData(event)
Expand Down Expand Up @@ -143,28 +68,6 @@ export function handleClaim(event: Claim): void {
const baseInUSD = getTokenUSDPriceFlat(base)
const quoteInUSD = getTokenUSDPriceFlat(quote)

if (
book.pool !== null &&
Address.fromBytes(openOrder.owner).equals(
Address.fromString(LIQUIDITY_VAULT),
)
) {
const pool = getPoolOrLog(book.pool!, 'CLAIM')
if (pool) {
updatePool(
pool,
book,
base,
quote,
baseInUSD,
quoteInUSD,
openOrder,
event.params.unit,
event,
)
}
}

if (book.makerFee.gt(ZERO_BD)) {
// interval data
const bookDayData = updateBookDayData(book, event)
Expand Down
68 changes: 65 additions & 3 deletions src/mappings/book-manager/make.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { BigInt } from '@graphprotocol/graph-ts'
import { Address, BigInt } from '@graphprotocol/graph-ts'

import { Make } from '../../../generated/BookManager/BookManager'
import { Depth, OpenOrder } from '../../../generated/schema'
import { Depth, OpenOrder, Pool, Token } from '../../../generated/schema'
import { unitToBase, unitToQuote } from '../../common/amount'
import {
formatInvertedPrice,
formatPrice,
tickToPrice,
} from '../../common/tick'
import { ZERO_BI } from '../../common/constants'
import { BI_18, ZERO_BD, ZERO_BI } from '../../common/constants'
import { convertTokenToDecimal } from '../../common/utils'
import { calculateValueUSD, getTokenUSDPriceFlat } from '../../common/pricing'
import { encodeOrderID } from '../../common/order'
Expand All @@ -20,8 +20,57 @@ import {
import {
getBookOrLog,
getOrCreateTransaction,
getPoolOrLog,
getTokenOrLog,
} from '../../common/entity-getters'
import { LIQUIDITY_VAULT } from '../../common/chain'

function updatePoolValuation(pool: Pool, quote: Token, base: Token): void {
const quoteUSDPrice = getTokenUSDPriceFlat(quote)
const baseUSDPrice = getTokenUSDPriceFlat(base)
const initialLpAmountDecimal = convertTokenToDecimal(
pool.initialTotalSupply,
BI_18, // assuming LP token has 18 decimals
)
// set initial LP price if not set
if (
pool.initialLPPriceUSD.equals(ZERO_BD) &&
initialLpAmountDecimal.gt(ZERO_BD) &&
pool.initialTokenAAmount.gt(ZERO_BI) &&
pool.initialTokenBAmount.gt(ZERO_BI)
) {
const quoteInUSD = convertTokenToDecimal(
pool.initialTokenAAmount,
quote.decimals,
).times(quoteUSDPrice)
const baseInUSD = convertTokenToDecimal(
pool.initialTokenBAmount,
base.decimals,
).times(baseUSDPrice)
pool.initialLPPriceUSD = quoteInUSD
.plus(baseInUSD)
.div(initialLpAmountDecimal)
}

const lpAmountDecimal = convertTokenToDecimal(
pool.totalSupply,
BI_18, // assuming LP token has 18 decimals
)
if (lpAmountDecimal.gt(ZERO_BD)) {
const quoteInUSD = convertTokenToDecimal(
pool.liquidityA,
quote.decimals,
).times(quoteUSDPrice)
const baseInUSD = convertTokenToDecimal(
pool.liquidityB,
base.decimals,
).times(baseUSDPrice)
pool.lpPriceUSD = quoteInUSD.plus(baseInUSD).div(lpAmountDecimal)
pool.totalValueLockedUSD = pool.lpPriceUSD.times(lpAmountDecimal)
}

pool.save()
}

export function handleMake(event: Make): void {
updateDayData(event)
Expand Down Expand Up @@ -138,5 +187,18 @@ export function handleMake(event: Make): void {
quote.save()
openOrder.save()
depth.save()

// code from `handleUpdatePosition`
if (
book.pool !== null &&
Address.fromBytes(openOrder.owner).equals(
Address.fromString(LIQUIDITY_VAULT),
)
) {
const pool = getPoolOrLog(book.pool!, 'MAKE')
if (pool) {
updatePoolValuation(pool, quote, base)
}
}
}
}
16 changes: 0 additions & 16 deletions src/mappings/interval-updates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -281,20 +281,12 @@ export function updatePoolDayData(
poolDayData.protocolFeesTokenB = ZERO_BD
poolDayData.protocolFeesAUSD = ZERO_BD
poolDayData.protocolFeesBUSD = ZERO_BD
poolDayData.spreadProfitUSD = ZERO_BD
poolDayData.totalValueLockedUSD = ZERO_BD
}
poolDayData.oraclePrice = pool.oraclePrice
poolDayData.totalSupply = pool.totalSupply
poolDayData.liquidityA = pool.liquidityA
poolDayData.liquidityB = pool.liquidityB
poolDayData.lpPriceUSD = pool.lpPriceUSD
poolDayData.priceA = pool.priceA
poolDayData.priceARaw = pool.priceARaw
poolDayData.tickA = pool.tickA
poolDayData.priceB = pool.priceB
poolDayData.priceBRaw = pool.priceBRaw
poolDayData.tickB = pool.tickB
poolDayData.totalValueLockedUSD = pool.totalValueLockedUSD
poolDayData.save()

Expand Down Expand Up @@ -326,20 +318,12 @@ export function updatePoolHourData(
poolHourData.protocolFeesTokenB = ZERO_BD
poolHourData.protocolFeesAUSD = ZERO_BD
poolHourData.protocolFeesBUSD = ZERO_BD
poolHourData.spreadProfitUSD = ZERO_BD
poolHourData.totalValueLockedUSD = ZERO_BD
}
poolHourData.oraclePrice = pool.oraclePrice
poolHourData.totalSupply = pool.totalSupply
poolHourData.liquidityA = pool.liquidityA
poolHourData.liquidityB = pool.liquidityB
poolHourData.lpPriceUSD = pool.lpPriceUSD
poolHourData.priceA = pool.priceA
poolHourData.priceARaw = pool.priceARaw
poolHourData.tickA = pool.tickA
poolHourData.priceB = pool.priceB
poolHourData.priceBRaw = pool.priceBRaw
poolHourData.tickB = pool.tickB
poolHourData.totalValueLockedUSD = pool.totalValueLockedUSD
poolHourData.save()

Expand Down
8 changes: 0 additions & 8 deletions src/mappings/liquidity-vault/open.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,25 +25,17 @@ export function handlePoolOpen(event: Open): void {
pool.bookA = bookA.id
pool.bookB = bookB.id

pool.oraclePrice = ZERO_BI
pool.totalSupply = ZERO_BI
pool.liquidityA = ZERO_BI
pool.liquidityB = ZERO_BI
pool.lpPriceUSD = ZERO_BD
pool.priceA = ZERO_BD
pool.priceARaw = ZERO_BI
pool.tickA = ZERO_BI
pool.priceB = ZERO_BD
pool.priceBRaw = ZERO_BI
pool.tickB = ZERO_BI
pool.volumeTokenA = ZERO_BD
pool.volumeTokenB = ZERO_BD
pool.volumeUSD = ZERO_BD
pool.protocolFeesTokenA = ZERO_BD
pool.protocolFeesTokenB = ZERO_BD
pool.protocolFeesAUSD = ZERO_BD
pool.protocolFeesBUSD = ZERO_BD
pool.spreadProfitUSD = ZERO_BD
pool.totalValueLockedUSD = ZERO_BD

// bind book to pool
Expand Down
Loading