164 lines
4.5 KiB
TypeScript
164 lines
4.5 KiB
TypeScript
import { Address, BigDecimal, ethereum } from '@graphprotocol/graph-ts'
|
|
import {
|
|
Pool,
|
|
PoolShares,
|
|
PoolSnapshot,
|
|
PoolTransaction
|
|
} from '../../@types/schema'
|
|
import { BPool } from '../../@types/templates/BPool/BPool'
|
|
import { DAY, decimal, PoolTransactionType } from './constants'
|
|
import { gweiToEth, weiToDecimal } from './generic'
|
|
|
|
export function getPoolSharesId(
|
|
poolAddress: string,
|
|
userAddress: string
|
|
): string {
|
|
return `${poolAddress}-${userAddress}`
|
|
}
|
|
|
|
export function getPoolTransaction(
|
|
event: ethereum.Event,
|
|
userAddress: string,
|
|
type: string
|
|
): PoolTransaction {
|
|
let poolTx = PoolTransaction.load(event.transaction.hash.toHex())
|
|
|
|
// create pool transaction and fill basic fields
|
|
if (poolTx === null) {
|
|
poolTx = new PoolTransaction(event.transaction.hash.toHex())
|
|
|
|
poolTx.user = userAddress
|
|
poolTx.pool = event.address.toHex()
|
|
poolTx.type = type
|
|
|
|
poolTx.timestamp = event.block.timestamp.toI32()
|
|
poolTx.tx = event.transaction.hash.toHex()
|
|
poolTx.block = event.block.number.toI32()
|
|
|
|
poolTx.gasPrice = gweiToEth(event.transaction.gasPrice.toBigDecimal())
|
|
poolTx.gasLimit = event.transaction.gasLimit.toBigDecimal()
|
|
}
|
|
|
|
return poolTx
|
|
}
|
|
|
|
export function getPoolShares(
|
|
poolAddress: string,
|
|
userAddress: string
|
|
): PoolShares {
|
|
let poolShares = PoolShares.load(getPoolSharesId(poolAddress, userAddress))
|
|
if (poolShares === null) {
|
|
poolShares = new PoolShares(getPoolSharesId(poolAddress, userAddress))
|
|
}
|
|
return poolShares
|
|
}
|
|
|
|
export function getPool(poolAddress: string): Pool {
|
|
const pool = Pool.load(poolAddress)
|
|
if (pool === null) {
|
|
// what now?
|
|
throw new Error(`Didn't find pool with address ${poolAddress} `)
|
|
}
|
|
return pool
|
|
}
|
|
|
|
export function calcSpotPrice(
|
|
poolAddress: string,
|
|
baseTokenAddress: string,
|
|
datatokenAddress: string,
|
|
baseTokenDecimals: i32
|
|
): BigDecimal {
|
|
const poolContract = BPool.bind(Address.fromString(poolAddress))
|
|
// tokenIn is always the baseToken and tokenOut is the datatoken because we want the spot price to be in baseToken eg: 1 DT = 0.5 OCEAN
|
|
const weiPrice = poolContract.try_getSpotPrice(
|
|
Address.fromString(baseTokenAddress),
|
|
Address.fromString(datatokenAddress)
|
|
).value
|
|
const price = weiToDecimal(weiPrice.toBigDecimal(), baseTokenDecimals)
|
|
|
|
return price
|
|
}
|
|
|
|
export function getDateFromTimestamp(timestamp: i32): i32 {
|
|
// date without time
|
|
return timestamp - (timestamp % DAY)
|
|
}
|
|
export function getPoolSnapshotId(poolAddress: string, timestamp: i32): string {
|
|
return `${poolAddress}-${getDateFromTimestamp(timestamp)}`
|
|
}
|
|
|
|
export function createPoolSnapshot(
|
|
poolAddress: string,
|
|
timestamp: i32
|
|
): PoolSnapshot {
|
|
const snapshotId = getPoolSnapshotId(poolAddress, timestamp)
|
|
|
|
const pool = getPool(poolAddress)
|
|
|
|
const snapshot = new PoolSnapshot(snapshotId)
|
|
|
|
snapshot.pool = poolAddress
|
|
|
|
snapshot.totalShares = pool.totalShares
|
|
snapshot.swapVolume = decimal.ZERO
|
|
snapshot.swapFees = decimal.ZERO
|
|
snapshot.baseToken = pool.baseToken
|
|
snapshot.datatoken = pool.datatoken
|
|
snapshot.datatokenLiquidity = decimal.ZERO
|
|
|
|
snapshot.date = getDateFromTimestamp(timestamp)
|
|
snapshot.spotPrice = pool.spotPrice
|
|
|
|
snapshot.save()
|
|
return snapshot
|
|
}
|
|
|
|
export function getPoolSnapshot(
|
|
poolAddress: string,
|
|
timestamp: i32
|
|
): PoolSnapshot {
|
|
let snapshot = PoolSnapshot.load(getPoolSnapshotId(poolAddress, timestamp))
|
|
if (snapshot === null) {
|
|
snapshot = createPoolSnapshot(poolAddress, timestamp)
|
|
}
|
|
|
|
return snapshot
|
|
}
|
|
|
|
// export function updatePoolSnapshotToken(
|
|
// poolAddress: string,
|
|
// timestamp: i32,
|
|
// poolTokenId: string,
|
|
// amount: BigDecimal,
|
|
// balance: BigDecimal,
|
|
// feeValue: BigDecimal
|
|
// ): void {
|
|
// log.warning('Start create Pool Snapshot Token: {} {}', [
|
|
// poolAddress,
|
|
// timestamp.toString()
|
|
// ])
|
|
// const dayTimestamp = timestamp - (timestamp % DAY) // Todays timestamp
|
|
|
|
// const snapshotId = poolAddress + '-' + dayTimestamp.toString()
|
|
// log.warning('Pool Snapshot Token: {} {} {} {}', [
|
|
// amount.toString(),
|
|
// balance.toString(),
|
|
// feeValue.toString(),
|
|
// snapshotId + '-' + poolTokenId
|
|
// ])
|
|
// const token = new PoolSnapshotTokenValue(snapshotId + '-' + poolTokenId)
|
|
|
|
// token.poolSnapshot = snapshotId
|
|
// token.value = amount
|
|
// token.tokenReserve = balance
|
|
// token.tokenAddress = poolTokenId
|
|
// token.feeValue = feeValue
|
|
// if (amount.lt(ZERO_BD)) {
|
|
// token.type = 'out'
|
|
// } else {
|
|
// token.type = 'in'
|
|
// }
|
|
// log.warning('Snapshot Token ID: {}', [token.id])
|
|
// token.save()
|
|
// }
|