diff --git a/schema.graphql b/schema.graphql index d543815..4674c58 100644 --- a/schema.graphql +++ b/schema.graphql @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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! } @@ -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 @@ -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 @@ -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! } diff --git a/src/mappings/book-manager/claim.ts b/src/mappings/book-manager/claim.ts index fd16928..4b7f846 100644 --- a/src/mappings/book-manager/claim.ts +++ b/src/mappings/book-manager/claim.ts @@ -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 { @@ -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) @@ -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) diff --git a/src/mappings/book-manager/make.ts b/src/mappings/book-manager/make.ts index 0d3908c..b1ec072 100644 --- a/src/mappings/book-manager/make.ts +++ b/src/mappings/book-manager/make.ts @@ -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' @@ -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) @@ -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) + } + } } } diff --git a/src/mappings/interval-updates.ts b/src/mappings/interval-updates.ts index b81b15e..432fd77 100644 --- a/src/mappings/interval-updates.ts +++ b/src/mappings/interval-updates.ts @@ -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() @@ -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() diff --git a/src/mappings/liquidity-vault/open.ts b/src/mappings/liquidity-vault/open.ts index 9ef26f0..c4920a9 100644 --- a/src/mappings/liquidity-vault/open.ts +++ b/src/mappings/liquidity-vault/open.ts @@ -25,17 +25,10 @@ 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 @@ -43,7 +36,6 @@ export function handlePoolOpen(event: Open): void { pool.protocolFeesTokenB = ZERO_BD pool.protocolFeesAUSD = ZERO_BD pool.protocolFeesBUSD = ZERO_BD - pool.spreadProfitUSD = ZERO_BD pool.totalValueLockedUSD = ZERO_BD // bind book to pool diff --git a/src/mappings/liquidity-vault/strategy.ts b/src/mappings/liquidity-vault/strategy.ts deleted file mode 100644 index 5e2f15f..0000000 --- a/src/mappings/liquidity-vault/strategy.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { BigInt } from '@graphprotocol/graph-ts' - -import { getPoolOrLog, getTokenOrLog } from '../../common/entity-getters' -import { - formatInvertedPrice, - formatPrice, - tickToPrice, -} from '../../common/tick' -import { BI_18, ZERO_BD, ZERO_BI } from '../../common/constants' -import { convertTokenToDecimal } from '../../common/utils' -import { UpdatePosition } from '../../../generated/SimpleOracleStrategy/SimpleOracleStrategy' -import { getTokenUSDPriceFlat } from '../../common/pricing' - -export function handleUpdatePosition(event: UpdatePosition): void { - const pool = getPoolOrLog(event.params.key, 'UPDATE_POSITION') - if (!pool) { - return - } - const tokenA = getTokenOrLog(pool.tokenA, 'UPDATE_POSITION') - const tokenB = getTokenOrLog(pool.tokenB, 'UPDATE_POSITION') - - if (tokenA && tokenB) { - pool.oraclePrice = event.params.oraclePrice - - pool.tickA = BigInt.fromI32(event.params.tickA) - pool.priceARaw = tickToPrice(event.params.tickA) - pool.priceA = formatPrice(pool.priceARaw, tokenB.decimals, tokenA.decimals) - - pool.tickB = BigInt.fromI32(event.params.tickB) - pool.priceBRaw = tickToPrice(event.params.tickB) - pool.priceB = formatInvertedPrice( - pool.priceBRaw, - tokenA.decimals, - tokenB.decimals, - ) - - const tokenAUSDPrice = getTokenUSDPriceFlat(tokenA) - const tokenBUSDPrice = getTokenUSDPriceFlat(tokenB) - const initialLpAmountDecimal = convertTokenToDecimal( - pool.initialTotalSupply, - BI_18, // assuming LP token has 18 decimals - ) - if ( - pool.initialLPPriceUSD.equals(ZERO_BD) && - initialLpAmountDecimal.gt(ZERO_BD) && - pool.initialTokenAAmount.gt(ZERO_BI) && - pool.initialTokenBAmount.gt(ZERO_BI) - ) { - const amountAInUSD = convertTokenToDecimal( - pool.initialTokenAAmount, - tokenA.decimals, - ).times(tokenAUSDPrice) - const amountBInUSD = convertTokenToDecimal( - pool.initialTokenBAmount, - tokenB.decimals, - ).times(tokenBUSDPrice) - pool.initialLPPriceUSD = amountAInUSD - .plus(amountBInUSD) - .div(initialLpAmountDecimal) - } - - const lpAmountDecimal = convertTokenToDecimal( - pool.totalSupply, - BI_18, // assuming LP token has 18 decimals - ) - if (lpAmountDecimal.gt(ZERO_BD)) { - const amountAInUSD = convertTokenToDecimal( - pool.liquidityA, - tokenA.decimals, - ).times(tokenAUSDPrice) - const amountBInUSD = convertTokenToDecimal( - pool.liquidityB, - tokenB.decimals, - ).times(tokenBUSDPrice) - pool.lpPriceUSD = amountAInUSD.plus(amountBInUSD).div(lpAmountDecimal) - pool.totalValueLockedUSD = pool.lpPriceUSD.times(lpAmountDecimal) - } - - pool.save() - } -} diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 2322a84..a2fc271 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -89,26 +89,6 @@ dataSources: - event: Burn(indexed address,indexed bytes32,uint256,uint256,uint256,uint256,uint256) handler: handleBurn file: ./src/mappings/core.ts - - kind: ethereum - name: SimpleOracleStrategy - network: {{ network }} - source: - abi: SimpleOracleStrategy - address: "{{ SimpleOracleStrategy.address }}" - startBlock: {{ SimpleOracleStrategy.startBlock }} - mapping: - kind: ethereum/events - apiVersion: 0.0.7 - language: wasm/assemblyscript - entities: - - Pool - abis: - - name: SimpleOracleStrategy - file: ./abis/SimpleOracleStrategy.json - eventHandlers: - - event: UpdatePosition(indexed bytes32,uint256,int24,int24,uint256) - handler: handleUpdatePosition - file: ./src/mappings/core.ts {{#hasRouterGateway}} - kind: ethereum name: RouterGateway