diff --git a/src/app.controller.ts b/src/app.controller.ts index 3b5663d..577ed04 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -17,7 +17,6 @@ import {AddCommentDto, GetCommentsDto} from "./dto/comment.dto"; import {AppService} from "./app.service"; import {GetTokenBalancesDto, GetTokenBurnsDto, GetTokensDto, GetTokenWinnersDto} from "./dto/token.dto"; import {GetCandlesDto, GetTradesDto} from "./dto/trade.dto"; -import {AddUserDto} from "./dto/user.dto"; import {UserService} from "./user/user.service"; import {FileInterceptor} from "@nestjs/platform-express"; import {GcloudService} from "./gcloud/gcloud.service"; @@ -26,6 +25,7 @@ import {AddTokenMetadataDto} from "./dto/metadata.dto"; import {AuthGuard} from "./common/auth.guard"; import {plainToInstance} from "class-transformer"; import {JwtUserAccount} from "./entities/user-account.entity"; +import {GetWinnerLiquidityProvisionsDto} from "./dto/winner.liquidity.dto"; @SkipThrottle() @ApiTags('app') @@ -102,6 +102,11 @@ export class AppController { return this.appService.getTokenBurns(dto) } + @Get('/winnerLiquidityProvisions') + getWinnerLiquidityProvisions(@Query() dto: GetWinnerLiquidityProvisionsDto) { + return this.appService.getWinnerLiquidityProvisions(dto) + } + @Post('/uploadImage') @UseGuards(AuthGuard) @ApiBearerAuth() diff --git a/src/app.service.ts b/src/app.service.ts index 78b0dc9..0add657 100644 --- a/src/app.service.ts +++ b/src/app.service.ts @@ -1,11 +1,12 @@ import {Injectable, Logger} from '@nestjs/common'; import {DataSource, EntityManager, MoreThan} from "typeorm"; -import {Comment, Token, TokenBalance, TokenBurn, TokenWinner, Trade, UserAccount} from "./entities"; +import {Comment, LiquidityProvision, Token, TokenBalance, TokenBurn, TokenWinner, Trade, UserAccount} from "./entities"; import {AddCommentDto, GetCommentsDto} from "./dto/comment.dto"; import {GetTokenBalancesDto, GetTokenBurnsDto, GetTokensDto, GetTokenWinnersDto} from "./dto/token.dto"; import {GetCandlesDto, GetTradesDto} from "./dto/trade.dto"; import {UserService} from "./user/user.service"; import {Candle} from "./types"; +import {GetWinnerLiquidityProvisionsDto} from "./dto/winner.liquidity.dto"; @Injectable() export class AppService { @@ -114,6 +115,22 @@ export class AppService { }) } + async getWinnerLiquidityProvisions(dto: GetWinnerLiquidityProvisionsDto){ + return await this.dataSource.manager.find(LiquidityProvision, { + where: { + token: { + address: dto.tokenAddress + }, + sender: dto.sender + }, + take: dto.limit, + skip: dto.offset, + order: { + timestamp: 'desc' + } + }) + } + async getCandles(dto: GetCandlesDto){ const query = this.dataSource.getRepository(Trade) .createQueryBuilder('trades') diff --git a/src/dto/winner.liquidity.dto.ts b/src/dto/winner.liquidity.dto.ts new file mode 100644 index 0000000..dd776c1 --- /dev/null +++ b/src/dto/winner.liquidity.dto.ts @@ -0,0 +1,32 @@ +import {ApiProperty} from "@nestjs/swagger"; +import {Transform, Type} from "class-transformer"; +import {IsOptional, IsString} from "class-validator"; + +export class GetWinnerLiquidityProvisionsDto { + @ApiProperty({ type: String, required: true }) + @Transform((address) => address ? address.value.trim().toLowerCase() : address) + @Type(() => String) + @IsString() + tokenAddress: string; + + @ApiProperty({ type: String, required: false }) + @Transform((address) => address ? address.value.trim().toLowerCase() : address) + @Type(() => String) + @IsString() + @IsOptional() + sender?: string; + + @ApiProperty({ type: Number, required: false, default: '100' }) + // @Transform((limit) => limit.value.toNumber()) + @Type(() => String) + @IsString() + @IsOptional() + limit: number; + + @ApiProperty({ type: Number, required: false, default: '0' }) + // @Transform((offset) => offset.value.toNumber()) + @Type(() => String) + @IsString() + @IsOptional() + offset: number; +} diff --git a/src/indexer/indexer.service.ts b/src/indexer/indexer.service.ts index afca6ab..d34993a 100644 --- a/src/indexer/indexer.service.ts +++ b/src/indexer/indexer.service.ts @@ -323,7 +323,7 @@ export class IndexerService { this.logger.log(`BurnTokenAndMintWinner: senderAddress=${senderAddress}, tokenAddress=${tokenAddress}, winnerTokenAddress=${winnerTokenAddress}, burnedAmount=${burnedAmount}, receivedETH=${receivedETH}, mintedAmount=${mintedAmount}, txnHash=${txnHash}`); } - private async processLiquidityProvisionEvent(event: EventLog, transactionalEntityManager: EntityManager) { + private async processWinnerLiquidityEvent(event: EventLog, transactionalEntityManager: EntityManager) { const txnHash = event.transactionHash.toLowerCase() const values = event.returnValues const tokenAddress = (values['tokenAddress'] as string).toLowerCase() @@ -417,7 +417,7 @@ export class IndexerService { fromBlock, toBlock, topics: [ this.web3.utils.sha3('SetWinner(address,uint256,uint256)')], }) as EventLog[]; - const liquidityProvisionEvents = await this.tokenFactoryContract.getPastEvents('allEvents', { + const winnerLiquidityEvents = await this.tokenFactoryContract.getPastEvents('allEvents', { fromBlock, toBlock, topics: [ this.web3.utils.sha3('WinnerLiquidityAdded(address,address,address,address,uint256,uint128,uint256,uint256,uint256)')], }) as EventLog[]; @@ -464,7 +464,7 @@ export class IndexerService { .concat(...sellEvents.map(data => ({ type: 'sell', data }))) .concat(...setWinnerEvents.map(data => ({ type: 'set_winner', data }))) .concat(...burnAndSetWinnerEvents.map(data => ({ type: 'burn_token_and_set_winner', data }))) - .concat(...liquidityProvisionEvents.map(data => ({ type: 'liquidity_provision', data }))) + .concat(...winnerLiquidityEvents.map(data => ({ type: 'winner_liquidity', data }))) .concat(...newCompetitionEvents.map(data => ({ type: 'new_competition', data }))) .sort((a, b) => { const blockNumberDiff = Number(a.data.blockNumber) - Number(b.data.blockNumber) @@ -498,8 +498,8 @@ export class IndexerService { await this.processBurnTokenAndSetWinnerEvent(data, transactionalEntityManager) break; } - case 'liquidity_provision': { - await this.processLiquidityProvisionEvent(data, transactionalEntityManager) + case 'winner_liquidity': { + await this.processWinnerLiquidityEvent(data, transactionalEntityManager) break; } case 'new_competition': { @@ -510,7 +510,7 @@ export class IndexerService { } }) - this.logger.log(`[${fromBlock}-${toBlock}] (${((toBlock - fromBlock + 1))} blocks), new tokens=${tokenCreatedEvents.length}, trade=${[...buyEvents, ...sellEvents].length} (buy=${buyEvents.length}, sell=${sellEvents.length}), SetWinner=${setWinnerEvents.length}, WinnerLiquidityAdded=${liquidityProvisionEvents.length}, NewCompetitionStarted=${newCompetitionEvents.length}`) + this.logger.log(`[${fromBlock}-${toBlock}] (${((toBlock - fromBlock + 1))} blocks), new tokens=${tokenCreatedEvents.length}, trade=${[...buyEvents, ...sellEvents].length} (buy=${buyEvents.length}, sell=${sellEvents.length}), SetWinner=${setWinnerEvents.length}, WinnerLiquidityAdded=${winnerLiquidityEvents.length}, NewCompetitionStarted=${newCompetitionEvents.length}`) } else { // Wait for blockchain toBlock = fromBlockParam - 1