From dde89b2f767a1e9e2853896f0c6ecf6fccc084da Mon Sep 17 00:00:00 2001 From: flopez7 Date: Fri, 22 May 2026 09:44:44 +0200 Subject: [PATCH] add reward amount calculation based on net funded amount --- .../src/modules/job/job.service.spec.ts | 40 +++++++++++++++++++ .../server/src/modules/job/job.service.ts | 13 +++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.service.spec.ts b/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.service.spec.ts index ce2922f246..6b764d666c 100644 --- a/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.service.spec.ts +++ b/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.service.spec.ts @@ -4,6 +4,7 @@ import { Encryption, EncryptionUtils, EscrowClient, + EscrowUtils, OperatorUtils, } from '@human-protocol/sdk'; import { HttpService } from '@nestjs/axios'; @@ -417,6 +418,45 @@ describe('JobService', () => { ); }); + it('should calculate reward amount from net funded amount', async () => { + const manifest: ManifestDto = { + requesterTitle: 'Example Title', + requesterDescription: 'Example Description', + submissionsRequired: 5, + }; + + jest.spyOn(jobService, 'getManifest').mockResolvedValue(manifest); + jest.spyOn(EscrowUtils, 'getEscrow').mockResolvedValue({ + token: MOCK_ADDRESS, + totalFundedAmount: 100000000000000000000n, + recordingOracleFee: 2, + reputationOracleFee: 3, + exchangeOracleFee: 5, + } as any); + jest.spyOn(HMToken__factory, 'connect').mockReturnValue({ + decimals: jest.fn().mockResolvedValue(18), + } as any); + jest + .spyOn(jobRepository, 'fetchFiltered') + .mockResolvedValueOnce({ entities: jobs as any, itemCount: 1 }); + + const result = await jobService.getJobList( + { + chainId, + jobType: JobType.FORTUNE, + fields: [JobFieldName.RewardAmount], + escrowAddress, + status: JobStatus.ACTIVE, + page: 0, + pageSize: 10, + skip: 0, + }, + workerAddress, + ); + + expect(result.results[0].rewardAmount).toBe('18'); + }); + it('should return an array of jobs without calling the manifest', async () => { jest.spyOn(jobService, 'getManifest'); jest diff --git a/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.service.ts b/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.service.ts index cdc708cf51..720a38dc49 100644 --- a/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.service.ts +++ b/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.service.ts @@ -433,9 +433,18 @@ export class JobService { this.web3Service.getSigner(chainId), ).decimals(); + const netFundAmount = [ + escrow.recordingOracleFee, + escrow.reputationOracleFee, + escrow.exchangeOracleFee, + ].reduce( + (amount, fee) => + amount - (escrow.totalFundedAmount * BigInt(fee ?? 0)) / 100n, + escrow.totalFundedAmount, + ); + return ( - Number(ethers.formatUnits(escrow.totalFundedAmount, decimals)) / - submissionsRequired + Number(ethers.formatUnits(netFundAmount, decimals)) / submissionsRequired ); } }