mirror of
https://github.com/cerc-io/watcher-ts
synced 2024-11-19 12:26:19 +00:00
Test for Transaction entity after Mint, Burn & Swap events. (#193)
Co-authored-by: prathamesh0 <prathamesh.musale0@gmail.com>
This commit is contained in:
parent
a9d9b39c37
commit
16b041c5cf
@ -41,7 +41,8 @@ import {
|
||||
checkUniswapDayData,
|
||||
checkPoolDayData,
|
||||
checkTokenDayData,
|
||||
checkTokenHourData
|
||||
checkTokenHourData,
|
||||
checkTransaction
|
||||
} from '../test/utils';
|
||||
|
||||
const NETWORK_RPC_URL = 'http://localhost:8545';
|
||||
@ -103,6 +104,7 @@ describe('uni-info-watcher', () => {
|
||||
|
||||
describe('PoolCreatedEvent', () => {
|
||||
// NOTE Skipping checking entity updates that cannot be gotten/derived using queries.
|
||||
// Checked entities: Token, Pool.
|
||||
|
||||
const fee = 500;
|
||||
|
||||
@ -145,6 +147,8 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
it('should create a Pool entity', async () => {
|
||||
// Checked values: feeTier
|
||||
|
||||
const variables = {
|
||||
tokens: [token0Address, token1Address]
|
||||
};
|
||||
@ -168,6 +172,9 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
describe('InitializeEvent', () => {
|
||||
// Checked entities: Pool, PoolDayData.
|
||||
// Unchecked entities: Bundle, Token.
|
||||
|
||||
const sqrtPrice = '4295128939';
|
||||
const tick = TICK_MIN;
|
||||
|
||||
@ -186,6 +193,10 @@ describe('uni-info-watcher', () => {
|
||||
|
||||
// Sleeping for 5 sec for the entities to be processed.
|
||||
await wait(5000);
|
||||
});
|
||||
|
||||
it('should update Pool entity', async () => {
|
||||
// Checked values: sqrtPrice, tick.
|
||||
|
||||
const data = await request(endpoint, queryPoolById, { id: pool.address });
|
||||
expect(data.pool.sqrtPrice).to.be.equal(sqrtPrice);
|
||||
@ -198,8 +209,12 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
describe('MintEvent', () => {
|
||||
// Checked entities: Token, Factory, Pool, Transaction, Mint, Tick, UniswapDayData, PoolDayData, TokenDayData, TokenHourData.
|
||||
|
||||
const amount = 10;
|
||||
const approveAmount = BigInt(1000000000000000000000000);
|
||||
let expectedTxID: string;
|
||||
let expectedTxTimestamp: string;
|
||||
|
||||
// Initial entity values
|
||||
let oldFactory: any;
|
||||
@ -248,7 +263,9 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
it('should update Token entities', async () => {
|
||||
// Check txCount.
|
||||
// Checked values: txCount.
|
||||
// Unchecked values: totalValueLocked, totalValueLockedUSD.
|
||||
|
||||
let data: any;
|
||||
|
||||
data = await request(endpoint, queryToken, { id: token0.address });
|
||||
@ -262,14 +279,18 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
it('should update Factory entity', async () => {
|
||||
// Check txCount.
|
||||
// Checked values: txCount.
|
||||
// Unchecked values: totalValueLockedUSD.
|
||||
|
||||
const data = await request(endpoint, queryFactory);
|
||||
const newFactory = data.factories[0];
|
||||
expect(newFactory.txCount).to.be.equal((BigInt(oldFactory.txCount) + BigInt(1)).toString());
|
||||
});
|
||||
|
||||
it('should update Pool entity', async () => {
|
||||
// Check txCount, liquidity.
|
||||
// Checked values: txCount, liquidity.
|
||||
// Unchecked values: totalValueLockedToken0, totalValueLockedToken1, totalValueLockedUSD.
|
||||
|
||||
let expectedLiquidity = BigInt(oldPool.liquidity);
|
||||
if (oldPool.tick !== null) {
|
||||
if (
|
||||
@ -287,8 +308,15 @@ describe('uni-info-watcher', () => {
|
||||
expect(BigInt(newPool.liquidity)).to.be.equal(expectedLiquidity);
|
||||
});
|
||||
|
||||
it('should create a Transaction entity', async () => {
|
||||
const eventType = 'MintEvent';
|
||||
({ expectedTxID, expectedTxTimestamp } = await checkTransaction(endpoint, eventType));
|
||||
});
|
||||
|
||||
it('should create a Mint entity', async () => {
|
||||
// Check id, origin, owner, sender.
|
||||
// Checked values: id, origin, owner, sender, timestamp, pool, transaction.
|
||||
// Unchecked values: amount0, amount1, amountUSD.
|
||||
|
||||
// Get the latest Mint.
|
||||
let data: any;
|
||||
const variables = {
|
||||
@ -300,11 +328,9 @@ describe('uni-info-watcher', () => {
|
||||
data = await request(endpoint, queryMints, variables);
|
||||
expect(data.mints).to.not.be.empty;
|
||||
|
||||
const id: string = data.mints[0].id;
|
||||
const txCountID = id.split('#')[1];
|
||||
const origin = data.mints[0].origin;
|
||||
const owner = data.mints[0].owner;
|
||||
const sender = data.mints[0].sender;
|
||||
const mint = data.mints[0];
|
||||
const txID = mint.id.split('#')[0];
|
||||
const txCountID = mint.id.split('#')[1];
|
||||
|
||||
data = await request(endpoint, queryPoolById, { id: pool.address });
|
||||
const poolTxCount = data.pool.txCount;
|
||||
@ -312,14 +338,21 @@ describe('uni-info-watcher', () => {
|
||||
const expectedOwner = recipient;
|
||||
const expectedSender = poolCallee.address;
|
||||
|
||||
expect(txID).to.be.equal(expectedTxID);
|
||||
expect(txCountID).to.be.equal(poolTxCount);
|
||||
expect(origin).to.be.equal(expectedOrigin);
|
||||
expect(owner).to.be.equal(expectedOwner);
|
||||
expect(sender).to.be.equal(expectedSender);
|
||||
expect(mint.origin).to.be.equal(expectedOrigin);
|
||||
expect(mint.owner).to.be.equal(expectedOwner);
|
||||
expect(mint.sender).to.be.equal(expectedSender);
|
||||
expect(mint.timestamp).to.be.equal(expectedTxTimestamp);
|
||||
|
||||
expect(mint.pool.id).to.be.equal(pool.address);
|
||||
expect(mint.transaction.id).to.be.equal(expectedTxID);
|
||||
});
|
||||
|
||||
it('should create Tick entities', async () => {
|
||||
// Check liquidityGross, liquidityNet.
|
||||
// Checked values: liquidityGross, liquidityNet.
|
||||
// Unchecked values: id, price0, price1.
|
||||
|
||||
const data = await request(endpoint, queryTicks, { pool: pool.address });
|
||||
expect(data.ticks).to.not.be.empty;
|
||||
|
||||
@ -352,7 +385,11 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
describe('BurnEvent', () => {
|
||||
// Checked entities: Token, Factory, Pool, Transaction, Burn, Tick, UniswapDayData, PoolDayData, TokenDayData, TokenHourData.
|
||||
|
||||
const amount = 10;
|
||||
let expectedTxID: string;
|
||||
let expectedTxTimestamp: string;
|
||||
|
||||
// Initial entity values
|
||||
let oldFactory: any;
|
||||
@ -398,7 +435,9 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
it('should update Token entities', async () => {
|
||||
// Check txCount.
|
||||
// Checked values: txCount.
|
||||
// Unchecked values: totalValueLocked, totalValueLockedUSD.
|
||||
|
||||
let data: any;
|
||||
|
||||
data = await request(endpoint, queryToken, { id: token0.address });
|
||||
@ -412,14 +451,18 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
it('should update Factory entity', async () => {
|
||||
// Check txCount.
|
||||
// Checked values: txCount.
|
||||
// Unchecked values: totalValueLockedUSD.
|
||||
|
||||
const data = await request(endpoint, queryFactory);
|
||||
const newFactory = data.factories[0];
|
||||
expect(newFactory.txCount).to.be.equal((BigInt(oldFactory.txCount) + BigInt(1)).toString());
|
||||
});
|
||||
|
||||
it('should update Pool entity', async () => {
|
||||
// Check txCount, liquidity.
|
||||
// Checked values: txCount, liquidity.
|
||||
// Unchecked values: totalValueLockedToken0, totalValueLockedToken1, totalValueLockedUSD.
|
||||
|
||||
let expectedLiquidity = BigInt(oldPool.liquidity);
|
||||
if (oldPool.tick !== null) {
|
||||
if (
|
||||
@ -437,8 +480,15 @@ describe('uni-info-watcher', () => {
|
||||
expect(BigInt(newPool.liquidity)).to.be.equal(expectedLiquidity);
|
||||
});
|
||||
|
||||
it('should create a Transaction entity', async () => {
|
||||
const eventType = 'BurnEvent';
|
||||
({ expectedTxID, expectedTxTimestamp } = await checkTransaction(endpoint, eventType));
|
||||
});
|
||||
|
||||
it('should create a Burn entity', async () => {
|
||||
// Check id, origin, owner.
|
||||
// Checked values: id, origin, owner, timestamp, pool, transaction.
|
||||
// Unchecked values: amount0, amount1, amountUSD.
|
||||
|
||||
// Get the latest Burn.
|
||||
let data: any;
|
||||
const variables = {
|
||||
@ -451,23 +501,29 @@ describe('uni-info-watcher', () => {
|
||||
data = await request(endpoint, queryBurns, variables);
|
||||
expect(data.burns).to.not.be.empty;
|
||||
|
||||
const id: string = data.burns[0].id;
|
||||
const txCountID = id.split('#')[1];
|
||||
const origin = data.burns[0].origin;
|
||||
const owner = data.burns[0].owner;
|
||||
const burn = data.burns[0];
|
||||
const txID = burn.id.split('#')[0];
|
||||
const txCountID = burn.id.split('#')[1];
|
||||
|
||||
data = await request(endpoint, queryPoolById, { id: pool.address });
|
||||
const poolTxCount = data.pool.txCount;
|
||||
const expectedOrigin = recipient;
|
||||
const expectedOwner = recipient;
|
||||
|
||||
expect(txID).to.be.equal(expectedTxID);
|
||||
expect(txCountID).to.be.equal(poolTxCount);
|
||||
expect(origin).to.be.equal(expectedOrigin);
|
||||
expect(owner).to.be.equal(expectedOwner);
|
||||
expect(burn.origin).to.be.equal(expectedOrigin);
|
||||
expect(burn.owner).to.be.equal(expectedOwner);
|
||||
expect(burn.timestamp).to.be.equal(expectedTxTimestamp);
|
||||
|
||||
expect(burn.pool.id).to.be.equal(pool.address);
|
||||
expect(burn.transaction.id).to.be.equal(expectedTxID);
|
||||
});
|
||||
|
||||
it('should update Tick entities', async () => {
|
||||
// Check liquidityGross, liquidityNet.
|
||||
// Checked values: liquidityGross, liquidityNet.
|
||||
// Unchecked values: id, price0, price1.
|
||||
|
||||
const data = await request(endpoint, queryTicks, { pool: pool.address });
|
||||
expect(data.ticks).to.not.be.empty;
|
||||
|
||||
@ -505,7 +561,12 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
describe('SwapEvent', () => {
|
||||
// Checked entities: Token, Factory, Pool, Transaction, Swap, Tick, UniswapDayData, PoolDayData, TokenDayData, TokenHourData.
|
||||
// Unchecked entities: Bundle.
|
||||
|
||||
const sqrtPrice = '4295128938';
|
||||
let expectedTxID: string;
|
||||
let expectedTxTimestamp: string;
|
||||
|
||||
// Initial entity values
|
||||
let eventValue: any;
|
||||
@ -544,7 +605,9 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
it('should update Token entities', async () => {
|
||||
// Check txCount.
|
||||
// Checked values: txCount.
|
||||
// Unchecked values: derivedETH, feesUSD, totalValueLocked, totalValueLockedUSD, volume, volumeUSD.
|
||||
|
||||
let data: any;
|
||||
|
||||
data = await request(endpoint, queryToken, { id: token0.address });
|
||||
@ -558,14 +621,18 @@ describe('uni-info-watcher', () => {
|
||||
});
|
||||
|
||||
it('should update Factory entity', async () => {
|
||||
// Check txCount.
|
||||
// Checked values: txCount.
|
||||
// Unchecked values: totalFeesUSD, totalValueLockedUSD, totalVolumeUSD.
|
||||
|
||||
const data = await request(endpoint, queryFactory);
|
||||
const newFactory = data.factories[0];
|
||||
expect(newFactory.txCount).to.be.equal((BigInt(oldFactory.txCount) + BigInt(1)).toString());
|
||||
});
|
||||
|
||||
it('should update Pool entity', async () => {
|
||||
// Check txCount, liquidity, tick, sqrtPrice.
|
||||
// Checked values: txCount, liquidity, tick, sqrtPrice.
|
||||
// Unchecked values: token0Price, token1Price, totalValueLockedToken0, totalValueLockedToken1, totalValueLockedUSD, volumeUSD.
|
||||
|
||||
const expectedLiquidity = eventValue.event.liquidity;
|
||||
const expectedTick = eventValue.event.tick;
|
||||
const expectedSqrtPrice = eventValue.event.sqrtPriceX96;
|
||||
@ -579,9 +646,15 @@ describe('uni-info-watcher', () => {
|
||||
expect(newPool.sqrtPrice).to.be.equal(expectedSqrtPrice);
|
||||
});
|
||||
|
||||
it('should create a Transaction entity', async () => {
|
||||
const eventType = 'SwapEvent';
|
||||
({ expectedTxID, expectedTxTimestamp } = await checkTransaction(endpoint, eventType));
|
||||
});
|
||||
|
||||
it('should create a Swap entity', async () => {
|
||||
// Check id, origin.
|
||||
// Get the latest Swap.
|
||||
// Checked values: id, origin, timestamp, pool, transaction.
|
||||
// Unchecked values: amount0, amount1, amountUSD.
|
||||
|
||||
let data: any;
|
||||
const variables = {
|
||||
first: 1,
|
||||
@ -593,16 +666,21 @@ describe('uni-info-watcher', () => {
|
||||
data = await request(endpoint, querySwaps, variables);
|
||||
expect(data.swaps).to.not.be.empty;
|
||||
|
||||
const id: string = data.swaps[0].id;
|
||||
const txCountID = id.split('#')[1];
|
||||
const origin = data.swaps[0].origin;
|
||||
const swap = data.swaps[0];
|
||||
const txID = swap.id.split('#')[0];
|
||||
const txCountID = swap.id.split('#')[1];
|
||||
|
||||
data = await request(endpoint, queryPoolById, { id: pool.address });
|
||||
const poolTxCount = data.pool.txCount;
|
||||
const expectedOrigin = recipient;
|
||||
|
||||
expect(txID).to.be.equal(expectedTxID);
|
||||
expect(txCountID).to.be.equal(poolTxCount);
|
||||
expect(origin).to.be.equal(expectedOrigin);
|
||||
expect(swap.origin).to.be.equal(expectedOrigin);
|
||||
expect(swap.timestamp).to.be.equal(expectedTxTimestamp);
|
||||
|
||||
expect(swap.pool.id).to.be.equal(pool.address);
|
||||
expect(swap.transaction.id).to.be.equal(expectedTxID);
|
||||
});
|
||||
|
||||
it('should update UniswapDayData entity', async () => {
|
||||
|
@ -139,14 +139,20 @@ query queryMints(
|
||||
token0: $token0,
|
||||
token1: $token1
|
||||
}) {
|
||||
amount0
|
||||
amount1
|
||||
amountUSD
|
||||
id
|
||||
origin
|
||||
owner
|
||||
sender
|
||||
timestamp
|
||||
amount0,
|
||||
amount1,
|
||||
amountUSD,
|
||||
id,
|
||||
origin,
|
||||
owner,
|
||||
sender,
|
||||
timestamp,
|
||||
pool {
|
||||
id
|
||||
},
|
||||
transaction {
|
||||
id
|
||||
}
|
||||
}
|
||||
}`;
|
||||
|
||||
@ -168,13 +174,19 @@ query queryBurns(
|
||||
token0: $token0,
|
||||
token1: $token1
|
||||
}) {
|
||||
amount0
|
||||
amount1
|
||||
amountUSD
|
||||
id
|
||||
origin
|
||||
owner
|
||||
timestamp
|
||||
amount0,
|
||||
amount1,
|
||||
amountUSD,
|
||||
id,
|
||||
origin,
|
||||
owner,
|
||||
timestamp,
|
||||
pool {
|
||||
id
|
||||
},
|
||||
transaction {
|
||||
id
|
||||
}
|
||||
}
|
||||
}`;
|
||||
|
||||
@ -196,11 +208,47 @@ query querySwaps(
|
||||
token0: $token0,
|
||||
token1: $token1
|
||||
}) {
|
||||
amount0
|
||||
amount1
|
||||
amountUSD
|
||||
id
|
||||
origin
|
||||
amount0,
|
||||
amount1,
|
||||
amountUSD,
|
||||
id,
|
||||
origin,
|
||||
timestamp,
|
||||
pool {
|
||||
id
|
||||
},
|
||||
transaction {
|
||||
id
|
||||
}
|
||||
}
|
||||
}`;
|
||||
|
||||
// Getting transactions(s) ordered by timestamp.
|
||||
export const queryTransactions = gql`
|
||||
query queryTransactions(
|
||||
$first: Int,
|
||||
$orderBy: Transaction_orderBy,
|
||||
$mintOrderBy: Mint_orderBy,
|
||||
$burnOrderBy: Burn_orderBy,
|
||||
$swapOrderBy: Swap_orderBy,
|
||||
$orderDirection: OrderDirection) {
|
||||
transactions(
|
||||
first: $first,
|
||||
orderBy: $orderBy,
|
||||
orderDirection: $orderDirection) {
|
||||
id,
|
||||
mints( first: $first, orderBy: $mintOrderBy, orderDirection: $orderDirection) {
|
||||
id,
|
||||
timestamp
|
||||
},
|
||||
burns( first: $first, orderBy: $burnOrderBy, orderDirection: $orderDirection) {
|
||||
id,
|
||||
timestamp
|
||||
},
|
||||
swaps( first: $first, orderBy: $swapOrderBy, orderDirection: $orderDirection) {
|
||||
id,
|
||||
timestamp
|
||||
},
|
||||
timestamp
|
||||
}
|
||||
}`;
|
||||
|
@ -10,10 +10,14 @@ import {
|
||||
queryPoolDayData,
|
||||
queryUniswapDayData,
|
||||
queryTokenDayData,
|
||||
queryTokenHourData
|
||||
queryTokenHourData,
|
||||
queryTransactions
|
||||
} from '../test/queries';
|
||||
|
||||
export const checkUniswapDayData = async (endpoint: string): Promise<void> => {
|
||||
// Checked values: date, tvlUSD.
|
||||
// Unchecked values: volumeUSD.
|
||||
|
||||
// Get the latest UniswapDayData.
|
||||
const variables = {
|
||||
first: 1,
|
||||
@ -37,6 +41,9 @@ export const checkUniswapDayData = async (endpoint: string): Promise<void> => {
|
||||
};
|
||||
|
||||
export const checkPoolDayData = async (endpoint: string, poolAddress: string): Promise<void> => {
|
||||
// Checked values: id, date, tvlUSD.
|
||||
// Unchecked values: volumeUSD.
|
||||
|
||||
// Get the latest PoolDayData.
|
||||
const variables = {
|
||||
first: 1,
|
||||
@ -63,6 +70,9 @@ export const checkPoolDayData = async (endpoint: string, poolAddress: string): P
|
||||
};
|
||||
|
||||
export const checkTokenDayData = async (endpoint: string, tokenAddress: string): Promise<void> => {
|
||||
// Checked values: id, date, totalValueLockedUSD.
|
||||
// Unchecked values: volumeUSD.
|
||||
|
||||
// Get the latest TokenDayData.
|
||||
const variables = {
|
||||
first: 1,
|
||||
@ -89,6 +99,9 @@ export const checkTokenDayData = async (endpoint: string, tokenAddress: string):
|
||||
};
|
||||
|
||||
export const checkTokenHourData = async (endpoint: string, tokenAddress: string): Promise<void> => {
|
||||
// Checked values: id, periodStartUnix, low, high, open, close.
|
||||
// Unchecked values:
|
||||
|
||||
// Get the latest TokenHourData.
|
||||
const variables = {
|
||||
first: 1,
|
||||
@ -120,3 +133,58 @@ export const checkTokenHourData = async (endpoint: string, tokenAddress: string)
|
||||
expect(open).to.be.equal(tokenPrice.toString());
|
||||
expect(close).to.be.equal(tokenPrice.toString());
|
||||
};
|
||||
|
||||
export const checkTransaction = async (endpoint: string, eventType: string): Promise<{expectedTxID: string, expectedTxTimestamp: string}> => {
|
||||
// Checked values: mints, burns, swaps.
|
||||
|
||||
// Get the latest Transaction.
|
||||
// Get only the latest mint, burn and swap entity in the transaction.
|
||||
|
||||
const variables = {
|
||||
first: 1,
|
||||
orderBy: 'timestamp',
|
||||
mintOrderBy: 'timestamp',
|
||||
burnOrderBy: 'timestamp',
|
||||
swapOrderBy: 'timestamp',
|
||||
orderDirection: 'desc'
|
||||
};
|
||||
|
||||
const data = await request(endpoint, queryTransactions, variables);
|
||||
expect(data.transactions).to.not.be.empty;
|
||||
|
||||
const transaction = data.transactions[0];
|
||||
const expectedTxID = transaction.id;
|
||||
const expectedTxTimestamp = transaction.timestamp;
|
||||
|
||||
let timestamp = '';
|
||||
|
||||
switch (eventType) {
|
||||
case 'MintEvent':
|
||||
expect(transaction.mints).to.not.be.empty;
|
||||
expect(transaction.burns).to.be.empty;
|
||||
expect(transaction.swaps).to.be.empty;
|
||||
timestamp = transaction.mints[0].timestamp;
|
||||
break;
|
||||
|
||||
case 'BurnEvent':
|
||||
expect(transaction.mints).to.be.empty;
|
||||
expect(transaction.burns).to.not.be.empty;
|
||||
expect(transaction.swaps).to.be.empty;
|
||||
timestamp = transaction.burns[0].timestamp;
|
||||
break;
|
||||
|
||||
case 'SwapEvent':
|
||||
expect(transaction.mints).to.be.empty;
|
||||
expect(transaction.burns).to.be.empty;
|
||||
expect(transaction.swaps).to.not.be.empty;
|
||||
timestamp = transaction.swaps[0].timestamp;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
expect(timestamp).to.be.equal(expectedTxTimestamp);
|
||||
|
||||
return { expectedTxID, expectedTxTimestamp };
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user