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
16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@
"watch-local": "graph deploy graphprotocol/Uniswap2 --watch --debug --node http://127.0.0.1:8020/ --ipfs http://localhost:5001"
},
"devDependencies": {
"@graphprotocol/graph-cli": "^0.16.0",
"@graphprotocol/graph-ts": "^0.16.0",
"@typescript-eslint/eslint-plugin": "^2.0.0",
"@typescript-eslint/parser": "^2.0.0",
"eslint": "^6.2.2",
"eslint-config-prettier": "^6.1.0",
"prettier": "^1.18.2",
"typescript": "^3.5.2"
"@graphprotocol/graph-cli": "^0.20.0",
"@graphprotocol/graph-ts": "^0.20.0",
"@typescript-eslint/eslint-plugin": "^4.20.0",
"@typescript-eslint/parser": "^4.20.0",
"eslint": "^7.23.0",
"eslint-config-prettier": "^8.1.0",
"prettier": "^2.2.1",
"typescript": "^4.2.3"
}
}
3 changes: 3 additions & 0 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,15 @@ type LiquidityPositionSnapshot @entity {
reserveUSD: BigDecimal! # snapshot of pair reserves in USD
liquidityTokenTotalSupply: BigDecimal! # snapshot of pool token supply
liquidityTokenBalance: BigDecimal! # snapshot of users pool token balance
transaction: Transaction!
}

type Transaction @entity {
id: ID! # txn hash
blockNumber: BigInt!
timestamp: BigInt!
gasUsed: BigInt!
gasPrice: BigInt!
# This is not the reverse of Mint.transaction; it is only used to
# track incomplete mints (similar for burns and swaps)
mints: [Mint]!
Expand Down
62 changes: 48 additions & 14 deletions src/mappings/core.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* eslint-disable prefer-const */
import { BigInt, BigDecimal, store, Address } from '@graphprotocol/graph-ts'
import { BigInt, BigDecimal, store, Address, log } from '@graphprotocol/graph-ts'
import {
Pair,
Token,
Expand All @@ -8,7 +8,7 @@ import {
Mint as MintEvent,
Burn as BurnEvent,
Swap as SwapEvent,
Bundle
Bundle, LiquidityPosition
} from '../types/schema'
import { Pair as PairContract, Mint, Burn, Swap, Transfer, Sync } from '../types/templates/Pair/Pair'
import { updatePairDayData, updateTokenDayData, updateUniswapDayData, updatePairHourData } from './dayUpdates'
Expand Down Expand Up @@ -57,6 +57,8 @@ export function handleTransfer(event: Transfer): void {
transaction = new Transaction(transactionHash)
transaction.blockNumber = event.block.number
transaction.timestamp = event.block.timestamp
transaction.gasUsed = event.transaction.gasUsed
transaction.gasPrice = event.transaction.gasPrice
transaction.mints = []
transaction.burns = []
transaction.swaps = []
Expand Down Expand Up @@ -195,16 +197,24 @@ export function handleTransfer(event: Transfer): void {

if (from.toHexString() != ADDRESS_ZERO && from.toHexString() != pair.id) {
let fromUserLiquidityPosition = createLiquidityPosition(event.address, from)
fromUserLiquidityPosition.liquidityTokenBalance = convertTokenToDecimal(pairContract.balanceOf(from), BI_18)
fromUserLiquidityPosition.save()
createLiquiditySnapshot(fromUserLiquidityPosition, event)
if (fromUserLiquidityPosition !== null) {
fromUserLiquidityPosition.liquidityTokenBalance = convertTokenToDecimal(pairContract.balanceOf(from), BI_18)
fromUserLiquidityPosition.save()
createLiquiditySnapshot(fromUserLiquidityPosition as LiquidityPosition, event)
}
}

if (event.params.to.toHexString() != ADDRESS_ZERO && to.toHexString() != pair.id) {
let toUserLiquidityPosition = createLiquidityPosition(event.address, to)
toUserLiquidityPosition.liquidityTokenBalance = convertTokenToDecimal(pairContract.balanceOf(to), BI_18)
toUserLiquidityPosition.save()
createLiquiditySnapshot(toUserLiquidityPosition, event)
if (to.toHexString() !== ADDRESS_ZERO) {
let toUserLiquidityPosition = createLiquidityPosition(event.address, to)
if (toUserLiquidityPosition !== null) {
toUserLiquidityPosition.liquidityTokenBalance = convertTokenToDecimal(pairContract.balanceOf(to), BI_18)
toUserLiquidityPosition.save()
createLiquiditySnapshot(toUserLiquidityPosition as LiquidityPosition, event)
}
} else {
log.warning('Detected 0 address in handleTransfer', [])
}
}

transaction.save()
Expand Down Expand Up @@ -318,9 +328,17 @@ export function handleMint(event: Mint): void {
mint.amountUSD = amountTotalUSD as BigDecimal
mint.save()

// update the LP position
let liquidityPosition = createLiquidityPosition(event.address, mint.to as Address)
createLiquiditySnapshot(liquidityPosition, event)
let to = mint.to as Address
if (to.toHexString() !== ADDRESS_ZERO) {
let liquidityPosition = createLiquidityPosition(event.address, to)
if (liquidityPosition !== null) {
createLiquiditySnapshot(liquidityPosition as LiquidityPosition, event)
} else {
log.warning('null position in handleMint', [])
}
} else {
log.warning('Detected 0 address in handleMint', [])
}

// update day entities
updatePairDayData(event)
Expand Down Expand Up @@ -381,8 +399,22 @@ export function handleBurn(event: Burn): void {
burn.save()

// update the LP position
let liquidityPosition = createLiquidityPosition(event.address, burn.sender as Address)
createLiquiditySnapshot(liquidityPosition, event)
let to = burn.sender as Address
if (burn.sender.toHexString() != '0x') {
let liquidityPosition = createLiquidityPosition(event.address, to)
if (liquidityPosition !== null) {
createLiquiditySnapshot(liquidityPosition as LiquidityPosition, event)
} else {
log.warning('null position in handleBurn: '
.concat(burn.sender.toHexString()).concat(' ')
.concat(ADDRESS_ZERO)
.concat(', tx_hash: ')
.concat(event.transaction.hash.toHexString()), [])
}
} else {
log.warning('Detected 0x address in handleBurn'.concat(', tx_hash: ')
.concat(event.transaction.hash.toHexString()), [])
}

// update day entities
updatePairDayData(event)
Expand Down Expand Up @@ -465,6 +497,8 @@ export function handleSwap(event: Swap): void {
transaction = new Transaction(event.transaction.hash.toHexString())
transaction.blockNumber = event.block.number
transaction.timestamp = event.block.timestamp
transaction.gasUsed = event.transaction.gasUsed
transaction.gasPrice = event.transaction.gasPrice
transaction.mints = []
transaction.swaps = []
transaction.burns = []
Expand Down
10 changes: 5 additions & 5 deletions src/mappings/dayUpdates.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { PairHourData } from './../types/schema'
/* eslint-disable prefer-const */
import { BigInt, BigDecimal, EthereumEvent } from '@graphprotocol/graph-ts'
import { BigInt, BigDecimal, ethereum } from '@graphprotocol/graph-ts'
import { Pair, Bundle, Token, UniswapFactory, UniswapDayData, PairDayData, TokenDayData } from '../types/schema'
import { ONE_BI, ZERO_BD, ZERO_BI, FACTORY_ADDRESS } from './helpers'

export function updateUniswapDayData(event: EthereumEvent): UniswapDayData {
export function updateUniswapDayData(event: ethereum.Event): UniswapDayData {
let uniswap = UniswapFactory.load(FACTORY_ADDRESS)
let timestamp = event.block.timestamp.toI32()
let dayID = timestamp / 86400
Expand All @@ -28,7 +28,7 @@ export function updateUniswapDayData(event: EthereumEvent): UniswapDayData {
return uniswapDayData as UniswapDayData
}

export function updatePairDayData(event: EthereumEvent): PairDayData {
export function updatePairDayData(event: ethereum.Event): PairDayData {
let timestamp = event.block.timestamp.toI32()
let dayID = timestamp / 86400
let dayStartTimestamp = dayID * 86400
Expand Down Expand Up @@ -60,7 +60,7 @@ export function updatePairDayData(event: EthereumEvent): PairDayData {
return pairDayData as PairDayData
}

export function updatePairHourData(event: EthereumEvent): PairHourData {
export function updatePairHourData(event: ethereum.Event): PairHourData {
let timestamp = event.block.timestamp.toI32()
let hourIndex = timestamp / 3600 // get unique hour within unix history
let hourStartUnix = hourIndex * 3600 // want the rounded effect
Expand Down Expand Up @@ -89,7 +89,7 @@ export function updatePairHourData(event: EthereumEvent): PairHourData {
return pairHourData as PairHourData
}

export function updateTokenDayData(token: Token, event: EthereumEvent): TokenDayData {
export function updateTokenDayData(token: Token, event: ethereum.Event): TokenDayData {
let bundle = Bundle.load('1')
let timestamp = event.block.timestamp.toI32()
let dayID = timestamp / 86400
Expand Down
24 changes: 18 additions & 6 deletions src/mappings/helpers.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* eslint-disable prefer-const */
import { log, BigInt, BigDecimal, Address, EthereumEvent } from '@graphprotocol/graph-ts'
import { log, BigInt, BigDecimal, Address, ethereum } from '@graphprotocol/graph-ts'
import { ERC20 } from '../types/Factory/ERC20'
import { ERC20SymbolBytes } from '../types/Factory/ERC20SymbolBytes'
import { ERC20NameBytes } from '../types/Factory/ERC20NameBytes'
Expand Down Expand Up @@ -139,7 +139,18 @@ export function fetchTokenDecimals(tokenAddress: Address): BigInt {
return BigInt.fromI32(decimalValue as i32)
}

export function createLiquidityPosition(exchange: Address, user: Address): LiquidityPosition {
export function createLiquidityPosition(exchange: Address, user: Address): LiquidityPosition | null {
if (User.load(user.toHexString()) === null) {
log.error(
'Null user during snapshot creation. User address: '
.concat(user.toHexString())
.concat(' exchange address: ')
.concat(exchange.toHexString())
.concat(' --> SKIPPING POSITION CREATION'),
[]
)
return null
}
let id = exchange
.toHexString()
.concat('-')
Expand Down Expand Up @@ -168,17 +179,17 @@ export function createUser(address: Address): void {
}
}

export function createLiquiditySnapshot(position: LiquidityPosition, event: EthereumEvent): void {
let timestamp = event.block.timestamp.toI32()
export function createLiquiditySnapshot(position: LiquidityPosition, event: ethereum.Event): void {
let bundle = Bundle.load('1')
let pair = Pair.load(position.pair)
let token0 = Token.load(pair.token0)
let token1 = Token.load(pair.token1)

// create new snapshot
let snapshot = new LiquidityPositionSnapshot(position.id.concat(timestamp.toString()))
let id = event.transaction.hash.toHexString().concat('-').concat(event.logIndex.toString())
let snapshot = new LiquidityPositionSnapshot(id)
snapshot.liquidityPosition = position.id
snapshot.timestamp = timestamp
snapshot.timestamp = event.block.timestamp.toI32()
snapshot.block = event.block.number.toI32()
snapshot.user = position.user
snapshot.pair = position.pair
Expand All @@ -190,6 +201,7 @@ export function createLiquiditySnapshot(position: LiquidityPosition, event: Ethe
snapshot.liquidityTokenTotalSupply = pair.totalSupply
snapshot.liquidityTokenBalance = position.liquidityTokenBalance
snapshot.liquidityPosition = position.id
snapshot.transaction = event.transaction.hash.toHexString()
snapshot.save()
position.save()
}
Loading