diff --git a/schema.graphql b/schema.graphql index bd36f0f..6f86485 100644 --- a/schema.graphql +++ b/schema.graphql @@ -98,6 +98,9 @@ type PoolTransaction @entity { gasUsed: BigDecimal! gasPrice: BigDecimal! + oceanReserve: BigDecimal! + datatokenReserve: BigDecimal! + tokens: [PoolTransactionTokenValues!] @derivedFrom(field: "txId") } diff --git a/src/mappings/helpers.ts b/src/mappings/helpers.ts index 5934be2..231dd18 100644 --- a/src/mappings/helpers.ts +++ b/src/mappings/helpers.ts @@ -31,6 +31,7 @@ export let BONE = BigDecimal.fromString('1000000000000000000') export let ENABLE_DEBUG = false +export let DEBUG_POOL_ADDRESS = '0x64269ce81a07f21cb3566afa752810c4ca0bcb6f' let network = dataSource.network() @@ -38,9 +39,7 @@ export let OCEAN: string = (network == 'mainnet') ? '0x967da4048cd07ab37855c090aaf366e4ce1b9f48' : '0x8967BCF84170c91B0d24D4302C2376283b0B3a07' -export function debuglog(message: string, event: ethereum.Event, args: Array): void { - if (!ENABLE_DEBUG) return - +export function _debuglog(message: string, event: ethereum.Event, args: Array): void { if (event != null) { args.push(event.transaction.hash.toHex()) args.push(event.address.toHex()) @@ -48,7 +47,12 @@ export function debuglog(message: string, event: ethereum.Event, args: Array): void { + if (!ENABLE_DEBUG) return + _debuglog(message, event, args) } export function hexToDecimal(hexString: String, decimals: i32): BigDecimal { @@ -76,8 +80,10 @@ export function decimalToBigInt(value: BigDecimal): BigInt { } export function updatePoolTokenBalance(poolToken: PoolToken, balance: BigDecimal, source: string): void { - debuglog('updating poolToken balance (source, oldBalance, newBalance, poolId) ', null, - [source, poolToken.balance.toString(), balance.toString(), poolToken.poolId]) + if (poolToken.poolId == DEBUG_POOL_ADDRESS && poolToken.tokenAddress == OCEAN) { + _debuglog('########## updating poolToken balance (source, oldBalance, newBalance, poolId) ', null, + [source, poolToken.balance.toString(), balance.toString(), poolToken.poolId]) + } poolToken.balance = balance } @@ -132,6 +138,25 @@ export function updatePoolTransactionToken( } ptxTokenValues.save() + + if (ptxTokenValues.tokenAddress == OCEAN) { + ptx.oceanReserve = ptxTokenValues.tokenReserve + } else { + ptx.datatokenReserve = ptxTokenValues.tokenReserve + } + if (poolToken.poolId == DEBUG_POOL_ADDRESS && poolToken.tokenAddress == OCEAN) { + _debuglog('########## updatePoolTransactionToken: ', null, + [ + BigInt.fromI32(ptx.block).toString(), + BigInt.fromI32(ptx.timestamp).toString(), + ptxTokenValues.type, + ptxTokenValues.value.toString(), + ptxTokenValues.tokenReserve.toString(), + poolToken.poolId, + ]) + } + + ptx.save() } export function createPoolTransaction(event: ethereum.Event, event_type: string, userAddress: string): void { @@ -164,27 +189,35 @@ export function createPoolTransaction(event: ethereum.Event, event_type: string, pool.datatokenReserve = dtToken.balance pool.oceanReserve = ocnToken.balance - pool.spotPrice = poolTx.spotPrice + // Initial reserve values, will be updated in `updatePoolTransactionToken` + poolTx.datatokenReserve = dtToken.balance + poolTx.oceanReserve = ocnToken.balance let p = Pool.bind(Address.fromString(poolId)) - let result = p.try_calcInGivenOut( - decimalToBigInt(ocnToken.balance), decimalToBigInt(ocnToken.denormWeight), - decimalToBigInt(dtToken.balance), decimalToBigInt(dtToken.denormWeight), - ONE_INT, decimalToBigInt(pool.swapFee) - ) + let result = p.try_getSpotPrice( + Address.fromString(ocnToken.tokenAddress), + Address.fromString(dtToken.tokenAddress)) + // pool.spotPrice = poolTx.spotPrice pool.consumePrice = result.reverted ? BigDecimal.fromString('-1') : bigIntToDecimal(result.value, 18) - debuglog( - 'args to calcInGivenOut (ocnBalance, ocnWeight, dtBalance, dtWeight, dtAmount, swapFee, result)', null, - [ - decimalToBigInt(ocnToken.balance).toString(), - decimalToBigInt(ocnToken.denormWeight).toString(), - decimalToBigInt(dtToken.balance).toString(), - decimalToBigInt(dtToken.denormWeight).toString(), - ONE_INT.toString(), - decimalToBigInt(pool.swapFee).toString(), - result.reverted ? 'failed' : result.value.toString() - ] - ) + + // let result = p.try_calcInGivenOut( + // decimalToBigInt(ocnToken.balance), decimalToBigInt(ocnToken.denormWeight), + // decimalToBigInt(dtToken.balance), decimalToBigInt(dtToken.denormWeight), + // ONE_INT, decimalToBigInt(pool.swapFee) + // ) + // pool.consumePrice = BigDecimal.fromString('-1')//result.reverted ? BigDecimal.fromString('-1') : bigIntToDecimal(result.value, 18) + // debuglog( + // 'args to calcInGivenOut (ocnBalance, ocnWeight, dtBalance, dtWeight, dtAmount, swapFee, result)', null, + // [ + // decimalToBigInt(ocnToken.balance).toString(), + // decimalToBigInt(ocnToken.denormWeight).toString(), + // decimalToBigInt(dtToken.balance).toString(), + // decimalToBigInt(dtToken.denormWeight).toString(), + // ONE_INT.toString(), + // decimalToBigInt(pool.swapFee).toString(), + // result.reverted ? 'failed' : result.value.toString() + // ] + // ) pool.save() debuglog('updated pool reserves (source, dtBalance, ocnBalance, dtReserve, ocnReserve): ', @@ -199,6 +232,16 @@ export function createPoolTransaction(event: ethereum.Event, event_type: string, poolTx.gasUsed = event.transaction.gasUsed.toBigDecimal() poolTx.gasPrice = event.transaction.gasPrice.toBigDecimal() + + if (poolId == DEBUG_POOL_ADDRESS) { + _debuglog('####################### poolTransaction: ', event, + [ + BigInt.fromI32(poolTx.block).toString(), + BigInt.fromI32(poolTx.timestamp).toString(), + pool.oceanReserve.toString() + ]) + } + poolTx.save() } diff --git a/src/mappings/pool.ts b/src/mappings/pool.ts index ea7dbf2..ab3f05b 100644 --- a/src/mappings/pool.ts +++ b/src/mappings/pool.ts @@ -21,7 +21,7 @@ import { updatePoolTransactionToken, createPoolTransaction, OCEAN, - debuglog, updatePoolTokenBalance + debuglog, updatePoolTokenBalance, _debuglog, DEBUG_POOL_ADDRESS } from './helpers' /************************************ @@ -67,8 +67,9 @@ export function handleFinalize(event: LOG_CALL): void { export function handleSetup(event: LOG_CALL): void { let poolId = event.address.toHex() - debuglog('handleSetup: ', event, []) - + if (poolId == DEBUG_POOL_ADDRESS) { + _debuglog('handleSetup: ', event, []) + } let data = event.params.data.toHexString() // First 2 chars are 0x // Next there is 8 chars @@ -180,6 +181,9 @@ export function handleJoinPool(event: LOG_JOIN): void { let ptx = event.transaction.hash.toHexString() let poolTx = PoolTransaction.load(ptx) if (poolTx != null) { + if (poolId == DEBUG_POOL_ADDRESS && event.params.tokenIn.toHex() == OCEAN) { + _debuglog('!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! JOIN JOIN JOIN !!!!!!!!!!!! PoolTransaction EXISTS: ', event, []) + } return } @@ -187,6 +191,9 @@ export function handleJoinPool(event: LOG_JOIN): void { let poolTokenId = poolId.concat('-').concat(address) let poolToken = PoolToken.load(poolTokenId) if (poolToken == null) { + if (poolToken.poolId == DEBUG_POOL_ADDRESS && poolToken.tokenAddress == OCEAN) { + _debuglog('!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! JOIN JOIN JOIN !!!!!!!!!!!! NO PoolToken: ', event, [address, poolTokenId]) + } return } @@ -195,6 +202,10 @@ export function handleJoinPool(event: LOG_JOIN): void { let decimals = datatoken == null ? BigInt.fromI32(18).toI32() : datatoken.decimals let tokenAmountIn = tokenToDecimal(event.params.tokenAmountIn.toBigDecimal(), decimals) updatePoolTokenBalance(poolToken as PoolToken, poolToken.balance.plus(tokenAmountIn), 'handleJoinPool') + if (poolToken.poolId == DEBUG_POOL_ADDRESS && poolToken.tokenAddress == OCEAN) { + _debuglog('!!!!!!!!!!!!!!!!!! JOIN JOIN JOIN : (token, amountIn, amountIn) ', event, + [address, tokenAmountIn.toString(), event.params.tokenAmountIn.toString()]) + } poolToken.save() createPoolTransaction(event, 'join', event.params.caller.toHexString()) @@ -212,7 +223,10 @@ export function handleExitPool(event: LOG_EXIT): void { let poolTokenId = poolId.concat('-').concat(address.toString()) let poolToken = PoolToken.load(poolTokenId) if (!poolToken) { - return + if (poolToken.poolId == DEBUG_POOL_ADDRESS && poolToken.tokenAddress == OCEAN) { + _debuglog('!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! EXIT EXIT EXIT !!!!!!!!!!!! NO PoolToken: ', event, [address, poolTokenId]) + } + return } let datatoken: Datatoken | null @@ -222,7 +236,10 @@ export function handleExitPool(event: LOG_EXIT): void { let newAmount = poolToken.balance.minus(tokenAmountOut) updatePoolTokenBalance(poolToken as PoolToken, newAmount, 'handleExitPool') poolToken.save() - + if (poolToken.poolId == DEBUG_POOL_ADDRESS && poolToken.tokenAddress == OCEAN) { + _debuglog('!!!!!!!!!!!!!!!!!! EXIT EXIT EXIT : (token, amountOut, amountOut)', event, + [address, tokenAmountOut.toString(), event.params.tokenAmountOut.toString()]) + } let pool = Pool.load(poolId) pool.exitCount = pool.exitCount.plus(BigInt.fromI32(1)) if (newAmount.equals(ZERO_BD)) { @@ -251,6 +268,10 @@ export function handleSwap(event: LOG_SWAP): void { let poolTokenInId = poolId.concat('-').concat(tokenIn.toString()) let poolTokenIn = PoolToken.load(poolTokenInId) if (!poolTokenIn) { + if (poolId == DEBUG_POOL_ADDRESS) { + _debuglog('!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! SWAP SWAP SWAP !!!!!!!!!!!! NO PoolToken: ', event, + [tokenIn, poolTokenInId]) + } return } let dtIn = Datatoken.load(tokenIn) @@ -267,7 +288,11 @@ export function handleSwap(event: LOG_SWAP): void { let newAmountOut = poolTokenOut.balance.minus(tokenAmountOut) updatePoolTokenBalance(poolTokenOut as PoolToken, newAmountOut, 'handleSwap.tokenOut') poolTokenOut.save() - + if (poolId == DEBUG_POOL_ADDRESS) { + _debuglog('!!!!!!!!!!!!!!!!!! SWAP SWAP SWAP : (tokenIn, tokenOut, amountIn, amountIn, amountOut, amountOut)', event, + [tokenIn, tokenOut, tokenAmountIn.toString(), event.params.tokenAmountIn.toString(), + tokenAmountOut.toString(), event.params.tokenAmountOut.toString()]) + } let pool = Pool.load(poolId) pool.swapCount += BigInt.fromI32(1)