xiongzhu vor 2 Jahren
Ursprung
Commit
ddb32fa17e

+ 1 - 0
package.json

@@ -34,6 +34,7 @@
     "@nestjs/config": "^2.3.1",
     "@nestjs/core": "^9.3.3",
     "@nestjs/devtools-integration": "^0.1.4",
+    "@nestjs/event-emitter": "^2.0.0",
     "@nestjs/jwt": "^10.0.1",
     "@nestjs/mapped-types": "1.2.2",
     "@nestjs/mongoose": "^9.2.2",

+ 20 - 0
src/accounts/accounts.service.ts

@@ -7,6 +7,7 @@ import { Cron } from '@nestjs/schedule'
 import { Provider, Wallet, utils } from 'zksync-web3'
 import { ethers } from 'ethers'
 import { web3Config } from '../web3/web3config'
+import { OnEvent } from '@nestjs/event-emitter'
 
 @Injectable()
 export class AccountsService {
@@ -62,4 +63,23 @@ export class AccountsService {
             await this.save([account])
         }
     }
+
+    @OnEvent('updateBalance')
+    async handleOrderCreatedEvent(accountId) {
+        const account = await this.findById(accountId)
+        Logger.log(`fetching balances for ${account.address}`)
+        const provider = new Provider(web3Config[account.network].zksyncRpcUrl)
+        const ethProvider = new ethers.providers.InfuraProvider(
+            web3Config[account.network].ethereumNetwork,
+            web3Config[account.network].infuraApiKey
+        )
+        const wallet = new Wallet(account.privateKey, provider, ethProvider)
+        const ethBalance = await wallet.getBalanceL1()
+        const zksyncBalance = await wallet.getBalance()
+        const zkUsdcBalance = await wallet.getBalance(web3Config[account.network].zkUsdcAddress)
+        account.ethBalance = ethers.utils.formatEther(ethBalance)
+        account.zkBalance = ethers.utils.formatEther(zksyncBalance)
+        account.zkUsdcBalance = ethers.utils.formatUnits(zkUsdcBalance, 6)
+        await this.save([account])
+    }
 }

+ 2 - 0
src/app.module.ts

@@ -18,6 +18,7 @@ import { AccountsModule } from './accounts/accounts.module'
 import { Web3Module } from './web3/web3.module'
 import { ScheduleModule } from '@nestjs/schedule'
 import { TaskModule } from './task/task.module'
+import { EventEmitterModule } from '@nestjs/event-emitter'
 @Module({
     imports: [
         DevtoolsModule.register({
@@ -64,6 +65,7 @@ import { TaskModule } from './task/task.module'
             })
         }),
         ScheduleModule.forRoot(),
+        EventEmitterModule.forRoot(),
         AliyunModule,
         SmsModule,
         UsersModule,

+ 3 - 0
src/task/entities/task-log.entity.ts

@@ -16,6 +16,9 @@ export class TaskLog {
     @Column()
     accountId: number
 
+    @Column()
+    accountName: string
+
     @Column()
     address: string
 

+ 36 - 10
src/task/task.service.ts

@@ -12,7 +12,8 @@ import { TaskType } from './enums/task-type.enum'
 import { AccountsService } from 'src/accounts/accounts.service'
 import { LogStatus } from './enums/log-status.enum'
 import { Web3Result } from 'src/web3/model/web3-result'
-
+import { randomAmount } from 'src/utils/common'
+import { EventEmitter2 } from '@nestjs/event-emitter'
 @Injectable()
 export class TaskService {
     constructor(
@@ -21,7 +22,8 @@ export class TaskService {
         @InjectRepository(Task)
         private readonly taskRepository: Repository<Task>,
         @InjectRepository(TaskLog)
-        private readonly taskLogRepository: Repository<TaskLog>
+        private readonly taskLogRepository: Repository<TaskLog>,
+        private eventEmitter: EventEmitter2
     ) {}
 
     async findAll(req: PageRequest<Task>): Promise<Pagination<Task>> {
@@ -37,7 +39,7 @@ export class TaskService {
             userId,
             ...createTask
         })
-        if (!createTask.startTime) {
+        if (!createTask.startTime || createTask.startTime <= new Date()) {
             this.runTask(task)
         }
         return task
@@ -54,31 +56,54 @@ export class TaskService {
             taskLog.taskId = task.id
             taskLog.accountId = accountId
             taskLog.startTime = new Date()
+            taskLog.type = task.type
             try {
                 const account = await this.accountsService.findById(accountId)
                 taskLog.address = account.address
+                taskLog.accountName = account.name
                 let web3Result: Web3Result
                 switch (task.type) {
                     case TaskType.bridge2zk:
-                        web3Result = await this.web3Service.zkDeposit(accountId, task.params.amount)
+                        web3Result = await this.web3Service.zkDeposit(
+                            accountId,
+                            randomAmount(task.params.minAmount, task.params.maxAmount)
+                        )
                         break
                     case TaskType.bridge2eth:
-                        web3Result = await this.web3Service.zkWithdraw(accountId, task.params.amount)
+                        web3Result = await this.web3Service.zkWithdraw(
+                            accountId,
+                            randomAmount(task.params.minAmount, task.params.maxAmount)
+                        )
                         break
                     case TaskType.orbiter2zk:
-                        web3Result = await this.web3Service.orbiterDeposit(accountId, task.params.amount)
+                        web3Result = await this.web3Service.orbiterDeposit(
+                            accountId,
+                            randomAmount(task.params.minAmount, task.params.maxAmount)
+                        )
                         break
                     case TaskType.orbiter2eth:
-                        web3Result = await this.web3Service.orbiterWithdraw(accountId, task.params.amount)
+                        web3Result = await this.web3Service.orbiterWithdraw(
+                            accountId,
+                            randomAmount(task.params.minAmount, task.params.maxAmount)
+                        )
                         break
                     case TaskType.swapUsdc:
-                        web3Result = await this.web3Service.swapWithExactInput(accountId, task.params.amount)
+                        web3Result = await this.web3Service.swapWithExactInput(
+                            accountId,
+                            randomAmount(task.params.minAmount, task.params.maxAmount)
+                        )
                         break
                     case TaskType.swapEth:
-                        web3Result = await this.web3Service.swapWithExactOutput(accountId, task.params.amount)
+                        web3Result = await this.web3Service.swapWithExactOutput(
+                            accountId,
+                            randomAmount(task.params.minAmount, task.params.maxAmount)
+                        )
                         break
                     case TaskType.addLiquidity:
-                        web3Result = await this.web3Service.addLiquidity(accountId, task.params.amount)
+                        web3Result = await this.web3Service.addLiquidity(
+                            accountId,
+                            randomAmount(task.params.minAmount, task.params.maxAmount)
+                        )
                         break
                     case TaskType.removeLiquidity:
                         web3Result = await this.web3Service.removeLiquidity(accountId)
@@ -98,6 +123,7 @@ export class TaskService {
             await this.taskLogRepository.save(taskLog)
             task.progress += 1
             await this.taskRepository.save(task)
+            this.eventEmitter.emit('updateBalance', accountId)
         }
         task.status = TaskStatus.Done
         await this.taskRepository.save(task)

+ 8 - 0
src/utils/common.ts

@@ -1,3 +1,11 @@
+import BigNumber from 'bignumber.js'
 export function hideSensitiveData(str: string) {
     return str.replace(/(?<=^.).*(?=.$)/, '***')
 }
+export function randomAmount(min, max) {
+    let minNum = new BigNumber(min)
+    let maxNum = new BigNumber(max)
+    let d = maxNum.minus(minNum).times(new BigNumber(1000000))
+    let random = new BigNumber(Math.random()).times(d).integerValue()
+    return random.dividedBy(new BigNumber(1000000)).plus(minNum).toString()
+}

+ 12 - 0
yarn.lock

@@ -1373,6 +1373,13 @@
     chalk "^4.1.2"
     node-fetch "^2.6.9"
 
+"@nestjs/event-emitter@^2.0.0":
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/@nestjs/event-emitter/-/event-emitter-2.0.0.tgz#2f003263a412e643a9790d1d5e1db86cfbfc24cc"
+  integrity sha512-fZRv3+PmqXcbqCDRXRWhKDa+v3gmPUq4x5sQE5reVlDtEaCoAXwtGrtNswPtqd0msjyo8OWZF9k1sFjeRL6Xag==
+  dependencies:
+    eventemitter2 "6.4.9"
+
 "@nestjs/jwt@^10.0.1":
   version "10.0.1"
   resolved "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.0.1.tgz"
@@ -4046,6 +4053,11 @@ ethjs-unit@0.1.6:
     bn.js "4.11.6"
     number-to-bn "1.7.0"
 
+eventemitter2@6.4.9:
+  version "6.4.9"
+  resolved "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125"
+  integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==
+
 eventemitter3@4.0.4:
   version "4.0.4"
   resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"