From be3870d48967eb34b24ed1a62c3ebf94beccc1dd Mon Sep 17 00:00:00 2001 From: flopez7 Date: Wed, 8 Apr 2026 11:58:14 +0200 Subject: [PATCH 1/2] Remove fundAmount from manifest and related logic --- .../assignment/assignment.service.spec.ts | 10 ++-- .../modules/assignment/assignment.service.ts | 8 +++- .../server/src/modules/job/job.dto.ts | 1 - .../src/modules/job/job.service.spec.ts | 4 -- .../server/src/modules/job/job.service.ts | 31 +++++++++++- .../server/src/modules/web3/web3.service.ts | 1 - .../src/common/interfaces/job.ts | 1 - .../src/modules/job/job.service.spec.ts | 26 ++-------- .../src/modules/job/job.service.ts | 19 ++++---- .../recording-oracle/test/constants.ts | 1 - .../job-launcher/client/src/types/index.ts | 1 - .../src/modules/job/job.service.spec.ts | 47 +++++-------------- .../server/src/modules/job/job.service.ts | 9 +--- .../server/src/modules/manifest/fixtures.ts | 1 - .../src/modules/manifest/manifest.dto.ts | 5 -- .../modules/manifest/manifest.service.spec.ts | 5 +- .../job-launcher/server/test/constants.ts | 1 - .../server/src/common/types/manifest.ts | 1 - .../escrow-completion/fixtures/fortune.ts | 1 - 19 files changed, 72 insertions(+), 101 deletions(-) diff --git a/packages/apps/fortune/exchange-oracle/server/src/modules/assignment/assignment.service.spec.ts b/packages/apps/fortune/exchange-oracle/server/src/modules/assignment/assignment.service.spec.ts index 0144bac268..ea909e9642 100644 --- a/packages/apps/fortune/exchange-oracle/server/src/modules/assignment/assignment.service.spec.ts +++ b/packages/apps/fortune/exchange-oracle/server/src/modules/assignment/assignment.service.spec.ts @@ -102,7 +102,6 @@ describe('AssignmentService', () => { requesterTitle: 'Example Title', requesterDescription: 'Example Description', submissionsRequired: 5, - fundAmount: 100, }; beforeAll(async () => { @@ -128,6 +127,7 @@ describe('AssignmentService', () => { .mockResolvedValue(null); jest.spyOn(assignmentRepository, 'countByJobId').mockResolvedValue(0); jest.spyOn(jobService, 'getManifest').mockResolvedValue(manifest); + jest.spyOn(jobService, 'getRewardAmount').mockResolvedValue(20); (Escrow__factory.connect as any).mockImplementation(() => ({ duration: jest .fn() @@ -150,13 +150,18 @@ describe('AssignmentService', () => { workerAddress: workerAddress, status: AssignmentStatus.ACTIVE, expiresAt: expect.any(Date), - rewardAmount: manifest.fundAmount / manifest.submissionsRequired, + rewardAmount: 20, }); expect(jobService.getManifest).toHaveBeenCalledWith( chainId, escrowAddress, MOCK_MANIFEST_URL, ); + expect(jobService.getRewardAmount).toHaveBeenCalledWith( + chainId, + escrowAddress, + manifest.submissionsRequired, + ); }); it('should reassign user who has previously canceled', async () => { @@ -371,7 +376,6 @@ describe('AssignmentService', () => { requesterTitle: 'Example Title', requesterDescription: 'Example Description', submissionsRequired: 5, - fundAmount: 100, }; jest.spyOn(jobService, 'getManifest').mockResolvedValue(manifest); diff --git a/packages/apps/fortune/exchange-oracle/server/src/modules/assignment/assignment.service.ts b/packages/apps/fortune/exchange-oracle/server/src/modules/assignment/assignment.service.ts index 40fc11371c..824f688199 100644 --- a/packages/apps/fortune/exchange-oracle/server/src/modules/assignment/assignment.service.ts +++ b/packages/apps/fortune/exchange-oracle/server/src/modules/assignment/assignment.service.ts @@ -79,6 +79,11 @@ export class AssignmentService { data.escrowAddress, jobEntity.manifestUrl, ); + const rewardAmount = await this.jobService.getRewardAmount( + data.chainId, + data.escrowAddress, + manifest.submissionsRequired, + ); // Check if all required qualifications are present const userQualificationsSet = new Set(jwtUser.qualifications); @@ -110,8 +115,7 @@ export class AssignmentService { newAssignmentEntity.job = jobEntity; newAssignmentEntity.workerAddress = jwtUser.address; newAssignmentEntity.status = AssignmentStatus.ACTIVE; - newAssignmentEntity.rewardAmount = - manifest.fundAmount / manifest.submissionsRequired; + newAssignmentEntity.rewardAmount = rewardAmount; newAssignmentEntity.expiresAt = expirationDate; return this.assignmentRepository.createUnique(newAssignmentEntity); } diff --git a/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.dto.ts b/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.dto.ts index 106c506564..3a32f1f92a 100644 --- a/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.dto.ts +++ b/packages/apps/fortune/exchange-oracle/server/src/modules/job/job.dto.ts @@ -20,7 +20,6 @@ export class ManifestDto { requesterTitle: string; requesterDescription: string; submissionsRequired: number; - fundAmount: number; qualifications?: string[]; } 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 d39c5d9dd6..eba700ee75 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 @@ -373,7 +373,6 @@ describe('JobService', () => { requesterTitle: 'Example Title', requesterDescription: 'Example Description', submissionsRequired: 5, - fundAmount: 100, }; jest.spyOn(jobService, 'getManifest').mockResolvedValue(manifest); @@ -473,7 +472,6 @@ describe('JobService', () => { requesterTitle: 'Example Title', requesterDescription: 'Example Description', submissionsRequired: 5, - fundAmount: 100, }; jest @@ -531,7 +529,6 @@ describe('JobService', () => { requesterTitle: 'Example Title', requesterDescription: 'Example Description', submissionsRequired: 1, - fundAmount: 100, }; assignment.status = AssignmentStatus.ACTIVE; @@ -564,7 +561,6 @@ describe('JobService', () => { requesterTitle: 'Example Title', requesterDescription: 'Example Description', submissionsRequired: 5, - fundAmount: 100, }; assignment.status = AssignmentStatus.ACTIVE; 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 27646027f3..2e1d43683e 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 @@ -7,10 +7,11 @@ import { Encryption, EncryptionUtils, EscrowClient, + EscrowUtils, } from '@human-protocol/sdk'; import { Inject, Injectable } from '@nestjs/common'; +import { ethers } from 'ethers'; -import { downloadFileFromUrl } from '../../common/utils/storage'; import { PGPConfigService } from '../../common/config/pgp-config.service'; import { ErrorAssignment, ErrorJob } from '../../common/constant/errors'; import { SortDirection } from '../../common/enums/collection'; @@ -30,6 +31,7 @@ import { } from '../../common/errors'; import { ISolution } from '../../common/interfaces/job'; import { PageDto } from '../../common/pagination/pagination.dto'; +import { downloadFileFromUrl } from '../../common/utils/storage'; import { AssignmentEntity } from '../assignment/assignment.entity'; import { AssignmentRepository } from '../assignment/assignment.repository'; import { StorageService } from '../storage/storage.service'; @@ -184,7 +186,11 @@ export class JobService { data.sortField === JobSortField.REWARD_AMOUNT ) { job.rewardAmount = ( - manifest.fundAmount / manifest.submissionsRequired + await this.getRewardAmount( + entity.chainId, + entity.escrowAddress, + manifest.submissionsRequired, + ) ).toString(); } if (data.fields?.includes(JobFieldName.RewardToken)) { @@ -383,4 +389,25 @@ export class JobService { return manifest; } + + public async getRewardAmount( + chainId: number, + escrowAddress: string, + submissionsRequired: number, + ): Promise { + const escrow = await EscrowUtils.getEscrow(chainId, escrowAddress); + if (!escrow) { + throw new NotFoundError(ErrorJob.NotFound); + } + + const decimals = await HMToken__factory.connect( + escrow.token, + this.web3Service.getSigner(chainId), + ).decimals(); + + return ( + Number(ethers.formatUnits(escrow.totalFundedAmount, decimals)) / + submissionsRequired + ); + } } diff --git a/packages/apps/fortune/exchange-oracle/server/src/modules/web3/web3.service.ts b/packages/apps/fortune/exchange-oracle/server/src/modules/web3/web3.service.ts index 99fb7413da..e4b5646762 100644 --- a/packages/apps/fortune/exchange-oracle/server/src/modules/web3/web3.service.ts +++ b/packages/apps/fortune/exchange-oracle/server/src/modules/web3/web3.service.ts @@ -19,7 +19,6 @@ export class Web3Service { private signers: { [key: number]: Wallet } = {}; readonly signerAddress: string; - readonly currentWeb3Env: string; constructor( private readonly web3ConfigService: Web3ConfigService, diff --git a/packages/apps/fortune/recording-oracle/src/common/interfaces/job.ts b/packages/apps/fortune/recording-oracle/src/common/interfaces/job.ts index dd67a36aa4..05b023fec6 100644 --- a/packages/apps/fortune/recording-oracle/src/common/interfaces/job.ts +++ b/packages/apps/fortune/recording-oracle/src/common/interfaces/job.ts @@ -4,7 +4,6 @@ export interface IManifest { submissionsRequired: number; requesterTitle: string; requesterDescription: string; - fundAmount: string; requestType: JobRequestType; } diff --git a/packages/apps/fortune/recording-oracle/src/modules/job/job.service.spec.ts b/packages/apps/fortune/recording-oracle/src/modules/job/job.service.spec.ts index e9094e4d21..b1409a1efa 100644 --- a/packages/apps/fortune/recording-oracle/src/modules/job/job.service.spec.ts +++ b/packages/apps/fortune/recording-oracle/src/modules/job/job.service.spec.ts @@ -34,7 +34,6 @@ import { StorageService } from '../storage/storage.service'; import { Web3Service } from '../web3/web3.service'; import { WebhookDto } from '../webhook/webhook.dto'; import { JobService } from './job.service'; -import { HMToken__factory } from '@human-protocol/core/typechain-types'; import { downloadFileFromUrl } from '@/common/utils/storage'; jest.mock('minio', () => { @@ -61,6 +60,11 @@ jest.mock('@human-protocol/sdk', () => ({ EscrowClient: { build: jest.fn().mockImplementation(() => ({})), }, + EscrowUtils: { + getEscrow: jest.fn().mockResolvedValue({ + totalFundedAmount: 8n, + }), + }, KVStoreUtils: { get: jest.fn(), getPublicKey: jest.fn().mockResolvedValue('publicKey'), @@ -130,13 +134,6 @@ describe('JobService', () => { }); describe('processJobSolution', () => { - beforeAll(() => { - const decimalsMock = jest.fn().mockResolvedValue(18); - const tokenContractMock = { decimals: decimalsMock }; - jest - .spyOn(HMToken__factory, 'connect') - .mockReturnValue(tokenContractMock as any); - }); afterEach(() => { jest.clearAllMocks(); }); @@ -241,7 +238,6 @@ describe('JobService', () => { submissionsRequired: 2, requesterTitle: MOCK_REQUESTER_TITLE, requesterDescription: MOCK_REQUESTER_DESCRIPTION, - fundAmount: '10', requestType: JobRequestType.FORTUNE, }; @@ -303,7 +299,6 @@ describe('JobService', () => { submissionsRequired: 2, requesterTitle: MOCK_REQUESTER_TITLE, requesterDescription: MOCK_REQUESTER_DESCRIPTION, - fundAmount: '10', requestType: JobRequestType.FORTUNE, }; @@ -316,7 +311,6 @@ describe('JobService', () => { .fn() .mockResolvedValue('http://example.com/results'), storeResults: jest.fn().mockResolvedValue(true), - getTokenAddress: jest.fn().mockResolvedValue(MOCK_ADDRESS), }; (EscrowClient.build as jest.Mock).mockResolvedValue(escrowClient); @@ -370,7 +364,6 @@ describe('JobService', () => { getManifest: jest.fn().mockResolvedValue('http://example.com/manifest'), getIntermediateResultsUrl: jest.fn().mockResolvedValue(''), storeResults: jest.fn().mockResolvedValue(true), - getTokenAddress: jest.fn().mockResolvedValue(MOCK_ADDRESS), }; (EscrowClient.build as jest.Mock).mockResolvedValue(escrowClient); @@ -378,7 +371,6 @@ describe('JobService', () => { submissionsRequired: 3, requesterTitle: MOCK_REQUESTER_TITLE, requesterDescription: MOCK_REQUESTER_DESCRIPTION, - fundAmount: '10', requestType: JobRequestType.FORTUNE, }; @@ -426,7 +418,6 @@ describe('JobService', () => { .fn() .mockResolvedValue('http://existing-solutions'), storeResults: jest.fn().mockResolvedValue(true), - getTokenAddress: jest.fn().mockResolvedValue(MOCK_ADDRESS), }; (EscrowClient.build as jest.Mock).mockResolvedValue(escrowClient); @@ -438,7 +429,6 @@ describe('JobService', () => { submissionsRequired: 2, requesterTitle: MOCK_REQUESTER_TITLE, requesterDescription: MOCK_REQUESTER_DESCRIPTION, - fundAmount: '10', requestType: JobRequestType.FORTUNE, }; @@ -504,7 +494,6 @@ describe('JobService', () => { .fn() .mockResolvedValue('http://existing-solutions'), storeResults: jest.fn().mockResolvedValue(true), - getTokenAddress: jest.fn().mockResolvedValue(MOCK_ADDRESS), }; (EscrowClient.build as jest.Mock).mockResolvedValue(escrowClient); @@ -512,7 +501,6 @@ describe('JobService', () => { submissionsRequired: 4, requesterTitle: MOCK_REQUESTER_TITLE, requesterDescription: MOCK_REQUESTER_DESCRIPTION, - fundAmount: '10', requestType: JobRequestType.FORTUNE, }; @@ -594,7 +582,6 @@ describe('JobService', () => { .fn() .mockResolvedValue('http://existing-solutions'), storeResults: jest.fn().mockResolvedValue(true), - getTokenAddress: jest.fn().mockResolvedValue(MOCK_ADDRESS), }; (EscrowClient.build as jest.Mock).mockResolvedValue(escrowClient); KVStoreUtils.get = jest @@ -606,7 +593,6 @@ describe('JobService', () => { submissionsRequired: 3, requesterTitle: MOCK_REQUESTER_TITLE, requesterDescription: MOCK_REQUESTER_DESCRIPTION, - fundAmount: '10', requestType: JobRequestType.FORTUNE, }; @@ -676,7 +662,6 @@ describe('JobService', () => { .fn() .mockResolvedValue('http://existing-solutions'), storeResults: jest.fn().mockResolvedValue(true), - getTokenAddress: jest.fn().mockResolvedValue(MOCK_ADDRESS), }; (EscrowClient.build as jest.Mock).mockResolvedValue(escrowClient); KVStoreUtils.get = jest @@ -688,7 +673,6 @@ describe('JobService', () => { submissionsRequired: 3, requesterTitle: MOCK_REQUESTER_TITLE, requesterDescription: MOCK_REQUESTER_DESCRIPTION, - fundAmount: '10', requestType: JobRequestType.FORTUNE, }; diff --git a/packages/apps/fortune/recording-oracle/src/modules/job/job.service.ts b/packages/apps/fortune/recording-oracle/src/modules/job/job.service.ts index cccaa60244..55c0bd1ab4 100644 --- a/packages/apps/fortune/recording-oracle/src/modules/job/job.service.ts +++ b/packages/apps/fortune/recording-oracle/src/modules/job/job.service.ts @@ -3,6 +3,7 @@ import { EscrowStatus, KVStoreKeys, KVStoreUtils, + EscrowUtils, } from '@human-protocol/sdk'; import { HttpService } from '@nestjs/axios'; import { Inject, Injectable } from '@nestjs/common'; @@ -25,7 +26,6 @@ import { SolutionEventData, WebhookDto, } from '../webhook/webhook.dto'; -import { HMToken__factory } from '@human-protocol/core/typechain-types'; @Injectable() export class JobService { @@ -121,7 +121,7 @@ export class JobService { } const manifestUrl = await escrowClient.getManifest(webhook.escrowAddress); - const { submissionsRequired, requestType, fundAmount }: IManifest = + const { submissionsRequired, requestType }: IManifest = await this.storageService.download(manifestUrl); if (!submissionsRequired || !requestType) { @@ -186,16 +186,15 @@ export class JobService { s.solution === lastExchangeSolution.solution, ); - const tokenAddress = await escrowClient.getTokenAddress( + const escrow = await EscrowUtils.getEscrow( + webhook.chainId, webhook.escrowAddress, ); - const tokenContract = HMToken__factory.connect( - tokenAddress, - this.web3Service.getSigner(webhook.chainId), - ); - const decimals = await tokenContract.decimals(); - const fundAmountInWei = ethers.parseUnits(fundAmount.toString(), decimals); - const amountToReserve = fundAmountInWei / BigInt(submissionsRequired); + if (!escrow) { + throw new ValidationError('Escrow not found'); + } + + const amountToReserve = escrow.totalFundedAmount / BigInt(submissionsRequired); await escrowClient.storeResults( webhook.escrowAddress, diff --git a/packages/apps/fortune/recording-oracle/test/constants.ts b/packages/apps/fortune/recording-oracle/test/constants.ts index 88e8b55de9..51488c045b 100644 --- a/packages/apps/fortune/recording-oracle/test/constants.ts +++ b/packages/apps/fortune/recording-oracle/test/constants.ts @@ -37,7 +37,6 @@ export const MOCK_MANIFEST: IManifest = { submissionsRequired: 2, requesterTitle: 'Fortune', requesterDescription: 'Some desc', - fundAmount: '8', requestType: JobRequestType.FORTUNE, }; export const MOCK_ENCRYPTION_PRIVATE_KEY = 'private-key'; diff --git a/packages/apps/job-launcher/client/src/types/index.ts b/packages/apps/job-launcher/client/src/types/index.ts index 0affc77908..2ca082c754 100644 --- a/packages/apps/job-launcher/client/src/types/index.ts +++ b/packages/apps/job-launcher/client/src/types/index.ts @@ -43,7 +43,6 @@ export type FortuneManifest = { submissionsRequired: number; requesterTitle: string; requesterDescription: string; - fundAmount?: number; requestType: JobType.FORTUNE; qualifications?: string[]; }; diff --git a/packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts b/packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts index 74db1409f5..ffd1d06fa9 100644 --- a/packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts +++ b/packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts @@ -147,9 +147,7 @@ describe('JobService', () => { const jobManifestDto: JobManifestDto = createJobManifestDto({ paymentCurrency: PaymentCurrency.USDC, escrowFundToken: EscrowFundToken.USDC, - manifest: createMockFortuneManifest({ - fundAmount: undefined as unknown as number, - }), + manifest: createMockFortuneManifest(), }); const fundTokenDecimals = getTokenDecimals( jobManifestDto.chainId!, @@ -181,22 +179,17 @@ describe('JobService', () => { mul(div(1, 100), jobManifestDto.paymentAmount), ).toFixed(18), ); - const expectedManifest = { - ...jobManifestDto.manifest, - fundAmount: jobManifestDto.paymentAmount, - }; - expect(result).toBe(jobEntityMock.id); expect(mockWeb3Service.validateChainId).toHaveBeenCalledWith( jobManifestDto.chainId, ); expect(mockManifestService.validateManifest).toHaveBeenCalledWith( FortuneJobType.FORTUNE, - expectedManifest, + jobManifestDto.manifest, ); expect(mockManifestService.uploadManifest).toHaveBeenCalledWith( jobManifestDto.chainId, - expectedManifest, + jobManifestDto.manifest, [ jobManifestDto.exchangeOracle, jobManifestDto.reputationOracle, @@ -236,9 +229,7 @@ describe('JobService', () => { const jobManifestDto: JobManifestDto = createJobManifestDto({ paymentCurrency: PaymentCurrency.USD, escrowFundToken: EscrowFundToken.USDC, - manifest: createMockFortuneManifest({ - fundAmount: undefined, - }), + manifest: createMockFortuneManifest(), }); const fundTokenDecimals = getTokenDecimals( @@ -277,11 +268,6 @@ describe('JobService', () => { usdToTokenRate, ).toFixed(6), ); - const expectedManifest = { - ...jobManifestDto.manifest, - fundAmount: expectedFundAmount, - }; - expect(result).toBe(jobEntityMock.id); expect(mockWeb3Service.validateChainId).toHaveBeenCalledWith( @@ -289,11 +275,11 @@ describe('JobService', () => { ); expect(mockManifestService.validateManifest).toHaveBeenCalledWith( FortuneJobType.FORTUNE, - expectedManifest, + jobManifestDto.manifest, ); expect(mockManifestService.uploadManifest).toHaveBeenCalledWith( jobManifestDto.chainId, - expectedManifest, + jobManifestDto.manifest, [ jobManifestDto.exchangeOracle, jobManifestDto.reputationOracle, @@ -336,9 +322,7 @@ describe('JobService', () => { exchangeOracle: null, recordingOracle: null, reputationOracle: null, - manifest: createMockFortuneManifest({ - fundAmount: undefined, - }), + manifest: createMockFortuneManifest(), }); const fundTokenDecimals = getTokenDecimals( @@ -387,11 +371,6 @@ describe('JobService', () => { mul(div(1, 100), jobManifestDto.paymentAmount), ).toFixed(18), ); - const expectedManifest = { - ...jobManifestDto.manifest, - fundAmount: jobManifestDto.paymentAmount, - }; - expect(result).toBe(jobEntityMock.id); expect(mockWeb3Service.validateChainId).toHaveBeenCalledWith( @@ -404,11 +383,11 @@ describe('JobService', () => { ); expect(mockManifestService.validateManifest).toHaveBeenCalledWith( FortuneJobType.FORTUNE, - expectedManifest, + jobManifestDto.manifest, ); expect(mockManifestService.uploadManifest).toHaveBeenCalledWith( jobManifestDto.chainId, - expectedManifest, + jobManifestDto.manifest, [ mockOracles.exchangeOracle, mockOracles.reputationOracle, @@ -1317,9 +1296,7 @@ describe('JobService', () => { 18, ); - const manifestMock = createMockFortuneManifest({ - fundAmount: jobEntity.fundAmount, - }); + const manifestMock = createMockFortuneManifest(); const getEscrowData = { token: faker.finance.ethereumAddress(), @@ -1375,9 +1352,7 @@ describe('JobService', () => { it('should return job details without escrow address successfully', async () => { const jobEntity = createJobEntity({ escrowAddress: null }); - const manifestMock = createMockFortuneManifest({ - fundAmount: jobEntity.fundAmount, - }); + const manifestMock = createMockFortuneManifest(); mockJobRepository.findOneByIdAndUserId.mockResolvedValueOnce(jobEntity); mockManifestService.downloadManifest.mockResolvedValueOnce(manifestMock); diff --git a/packages/apps/job-launcher/server/src/modules/job/job.service.ts b/packages/apps/job-launcher/server/src/modules/job/job.service.ts index f8fe35afa5..049a0e0bf2 100644 --- a/packages/apps/job-launcher/server/src/modules/job/job.service.ts +++ b/packages/apps/job-launcher/server/src/modules/job/job.service.ts @@ -232,16 +232,11 @@ export class JobService { jobEntity.manifestUrl = dto.manifestUrl; } else if ('manifest' in dto) { - const manifest = dto.manifest; - if (requestType === FortuneJobType.FORTUNE) { - (manifest as FortuneManifestDto).fundAmount = fundTokenAmount; - } - - await this.manifestService.validateManifest(requestType, manifest); + await this.manifestService.validateManifest(requestType, dto.manifest); const { url, hash } = await this.manifestService.uploadManifest( chainId, - manifest, + dto.manifest, [exchangeOracle, reputationOracle, recordingOracle], ); diff --git a/packages/apps/job-launcher/server/src/modules/manifest/fixtures.ts b/packages/apps/job-launcher/server/src/modules/manifest/fixtures.ts index 4448f700c2..0338e929dd 100644 --- a/packages/apps/job-launcher/server/src/modules/manifest/fixtures.ts +++ b/packages/apps/job-launcher/server/src/modules/manifest/fixtures.ts @@ -9,7 +9,6 @@ export function createMockFortuneManifest( submissionsRequired: faker.number.int({ min: 1, max: 100 }), requesterTitle: faker.lorem.sentence(), requesterDescription: faker.lorem.sentence(), - fundAmount: faker.number.int({ min: 1, max: 100000 }), requestType: FortuneJobType.FORTUNE, ...overrides, }; diff --git a/packages/apps/job-launcher/server/src/modules/manifest/manifest.dto.ts b/packages/apps/job-launcher/server/src/modules/manifest/manifest.dto.ts index bfdd368bd2..222d1f8b57 100644 --- a/packages/apps/job-launcher/server/src/modules/manifest/manifest.dto.ts +++ b/packages/apps/job-launcher/server/src/modules/manifest/manifest.dto.ts @@ -35,11 +35,6 @@ export class FortuneManifestDto { @IsString() public requesterDescription: string; - @ApiProperty({ name: 'fund_amount' }) - @IsNumber() - @IsPositive() - public fundAmount: number; - @ApiProperty({ enum: FortuneJobType, name: 'request_type' }) @IsEnumCaseInsensitive(FortuneJobType) public requestType: FortuneJobType; diff --git a/packages/apps/job-launcher/server/src/modules/manifest/manifest.service.spec.ts b/packages/apps/job-launcher/server/src/modules/manifest/manifest.service.spec.ts index 163313ffd0..413e893a0a 100644 --- a/packages/apps/job-launcher/server/src/modules/manifest/manifest.service.spec.ts +++ b/packages/apps/job-launcher/server/src/modules/manifest/manifest.service.spec.ts @@ -92,7 +92,7 @@ describe('ManifestService', () => { it('should throw when a required fortune property is missing', async () => { const manifest = createMockFortuneManifest(); - delete (manifest as Partial).fundAmount; + delete (manifest as Partial).requesterDescription; await expect( manifestService.validateManifest(FortuneJobType.FORTUNE, manifest), @@ -194,7 +194,8 @@ describe('ManifestService', () => { it('should throw if downloaded manifest is invalid', async () => { const mockManifest = createMockFortuneManifest(); - delete (mockManifest as Partial).fundAmount; + delete (mockManifest as Partial) + .requesterDescription; mockStorageService.downloadJsonLikeData.mockResolvedValueOnce( mockManifest, diff --git a/packages/apps/job-launcher/server/test/constants.ts b/packages/apps/job-launcher/server/test/constants.ts index 6a286320e1..8870601340 100644 --- a/packages/apps/job-launcher/server/test/constants.ts +++ b/packages/apps/job-launcher/server/test/constants.ts @@ -44,7 +44,6 @@ export const MOCK_MANIFEST: FortuneManifestDto = { submissionsRequired: 2, requesterTitle: 'Fortune', requesterDescription: 'Some desc', - fundAmount: 10, requestType: FortuneJobType.FORTUNE, }; diff --git a/packages/apps/reputation-oracle/server/src/common/types/manifest.ts b/packages/apps/reputation-oracle/server/src/common/types/manifest.ts index 774833067e..303535f4be 100644 --- a/packages/apps/reputation-oracle/server/src/common/types/manifest.ts +++ b/packages/apps/reputation-oracle/server/src/common/types/manifest.ts @@ -2,7 +2,6 @@ import { CvatJobType, FortuneJobType } from '@/common/enums'; export type FortuneManifest = { submissionsRequired: number; - fundAmount: number; requestType: FortuneJobType; }; diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/fortune.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/fortune.ts index 90527b6fa0..7978fdce20 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/fortune.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/fortune.ts @@ -6,7 +6,6 @@ import { FortuneFinalResult, FortuneManifest } from '@/common/types'; export function generateFortuneManifest(): FortuneManifest { return { requestType: FortuneJobType.FORTUNE, - fundAmount: Number(faker.finance.amount()), submissionsRequired: faker.number.int({ min: 2, max: 5 }), }; } From 44e6ef41d2d87764332277fa407c22b7d97dcd74 Mon Sep 17 00:00:00 2001 From: flopez7 Date: Wed, 8 Apr 2026 13:07:55 +0200 Subject: [PATCH 2/2] Fix formatting of amountToReserve calculation in JobService --- .../fortune/recording-oracle/src/modules/job/job.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/apps/fortune/recording-oracle/src/modules/job/job.service.ts b/packages/apps/fortune/recording-oracle/src/modules/job/job.service.ts index 55c0bd1ab4..5d348d5057 100644 --- a/packages/apps/fortune/recording-oracle/src/modules/job/job.service.ts +++ b/packages/apps/fortune/recording-oracle/src/modules/job/job.service.ts @@ -194,7 +194,8 @@ export class JobService { throw new ValidationError('Escrow not found'); } - const amountToReserve = escrow.totalFundedAmount / BigInt(submissionsRequired); + const amountToReserve = + escrow.totalFundedAmount / BigInt(submissionsRequired); await escrowClient.storeResults( webhook.escrowAddress,