@@ -2,8 +2,8 @@ import {Injectable, Logger} from '@nestjs/common';
22import { Contract , ContractAbi , EventLog , Web3 } from "web3" ;
33import { TokenMetadata , TradeEventLog , TradeType } from "../types" ;
44import axios from "axios" ;
5- import process from "node: process" ;
6- import { IndexerState , Token , Trade } from "../entities" ;
5+ import process from "process" ;
6+ import { IndexerState , Token , TokenBalance , Trade } from "../entities" ;
77import { ConfigService } from "@nestjs/config" ;
88import { UserService } from "../user/user.service" ;
99import { DataSource } from "typeorm" ;
@@ -15,6 +15,7 @@ export class IndexerService {
1515 private readonly logger = new Logger ( IndexerService . name ) ;
1616 private readonly web3 : Web3
1717 private readonly tokenFactoryContract : Contract < ContractAbi >
18+ private readonly tokenContract : Contract < ContractAbi >
1819 private readonly blocksIndexingRange = 1000
1920
2021 constructor (
@@ -79,13 +80,13 @@ export class IndexerService {
7980
8081 private async processTradeEvents ( events : TradeEventLog [ ] ) {
8182 for ( const event of events ) {
82- const { data , type } = event
83+ const { type , data } = event
8384 const txnHash = data . transactionHash . toLowerCase ( )
8485 const blockNumber = Number ( data . blockNumber )
8586 const values = data . returnValues
8687 const tokenAddress = ( values [ 'token' ] as string ) . toLowerCase ( )
87- const amountIn = String ( values [ 'amount0In' ] as bigint )
88- const amountOut = String ( values [ 'amount0Out' ] as bigint )
88+ const amountIn = values [ 'amount0In' ] as bigint
89+ const amountOut = values [ 'amount0Out' ] as bigint
8990 const fee = String ( values [ 'fee' ] as bigint )
9091 const timestamp = Number ( values [ 'timestamp' ] as bigint )
9192
@@ -108,15 +109,56 @@ export class IndexerService {
108109 process . exit ( 1 )
109110 }
110111
112+ const tokenRepository = this . dataSource . manager . getRepository ( Token )
113+ const tokenHoldersRepository = this . dataSource . manager . getRepository ( TokenBalance )
114+
115+ if ( type === 'buy' ) {
116+ try {
117+ let holder = await this . appService . getTokenHolder ( tokenAddress , userAddress )
118+ if ( ! holder ) {
119+ await this . appService . createTokenHolder ( token , user )
120+ holder = await this . appService . getTokenHolder ( tokenAddress , userAddress )
121+ }
122+ holder . balance = String ( BigInt ( holder . balance ) + amountOut )
123+ await tokenHoldersRepository . save ( holder )
124+
125+ token . totalSupply = String ( BigInt ( token . totalSupply ) + amountOut )
126+ await tokenRepository . save ( token )
127+
128+ this . logger . log ( `Updated token balance [${ type } ]: userAddress=${ userAddress } , balance=${ holder . balance } , token total supply=${ token . totalSupply } ` )
129+ } catch ( e ) {
130+ this . logger . error ( `Failed to process token holder balance [${ type } ]: tokenAddress=${ tokenAddress } , userAddress=${ userAddress } ` , e )
131+ throw new Error ( e ) ;
132+ }
133+ } else {
134+ try {
135+ let holder = await this . appService . getTokenHolder ( tokenAddress , userAddress )
136+ if ( ! holder ) {
137+ this . logger . log ( `Failed to find token holder, exit` )
138+ process . exit ( 1 )
139+ }
140+ holder . balance = String ( BigInt ( holder . balance ) - amountIn )
141+ await tokenHoldersRepository . save ( holder )
142+
143+ token . totalSupply = String ( BigInt ( token . totalSupply ) - amountIn )
144+ await tokenRepository . save ( token )
145+
146+ this . logger . log ( `Updated token balance [${ type } ]: userAddress=${ userAddress } , balance=${ holder . balance } , token total supply=${ token . totalSupply } ` )
147+ } catch ( e ) {
148+ this . logger . error ( `Failed to process token holder balance [${ type } ]: tokenAddress=${ tokenAddress } , userAddress=${ userAddress } ` , e )
149+ throw new Error ( e ) ;
150+ }
151+ }
152+
111153 try {
112154 await this . dataSource . manager . insert ( Trade , {
113155 type,
114156 txnHash,
115157 blockNumber,
116158 user,
117159 token,
118- amountIn,
119- amountOut,
160+ amountIn : String ( amountIn ) ,
161+ amountOut : String ( amountOut ) ,
120162 fee,
121163 timestamp
122164 } ) ;
0 commit comments