Skip to content

Commit 674f4b3

Browse files
author
flopez7
committed
Remove RoutingProtocolService and related code
1 parent 6efd179 commit 674f4b3

16 files changed

Lines changed: 81 additions & 915 deletions

packages/apps/job-launcher/server/src/common/config/env-schema.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export const envValidator = Joi.object({
3030
GAS_PRICE_MULTIPLIER: Joi.number(),
3131
APPROVE_AMOUNT_USD: Joi.number(),
3232
REPUTATION_ORACLE_ADDRESS: Joi.string().required(),
33-
REPUTATION_ORACLES: Joi.string().required(),
3433
CVAT_EXCHANGE_ORACLE_ADDRESS: Joi.string().required(),
3534
CVAT_RECORDING_ORACLE_ADDRESS: Joi.string().required(),
3635
HCAPTCHA_ORACLE_ADDRESS: Joi.string().required(),

packages/apps/job-launcher/server/src/common/config/web3-config.service.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,6 @@ export class Web3ConfigService {
3737
return this.configService.getOrThrow<string>('REPUTATION_ORACLE_ADDRESS');
3838
}
3939

40-
/**
41-
* List of reputation oracle addresses, typically comma-separated.
42-
* Required
43-
*/
44-
get reputationOracles(): string {
45-
return this.configService.getOrThrow<string>('REPUTATION_ORACLES');
46-
}
47-
4840
/**
4941
* URI for the hCaptcha recording oracle service.
5042
* Required

packages/apps/job-launcher/server/src/common/constants/errors.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,6 @@ export enum ErrorWeb3 {
149149
ReputationOracleUrlNotSet = 'Reputation oracle URL not set',
150150
}
151151

152-
/**
153-
* Represents error messages related to routing protocol.
154-
*/
155-
export enum ErrorRoutingProtocol {
156-
ReputationOracleNotFound = 'The specified Reputation Oracle address is not found in the set of available oracles. Ensure the address is correct and check available oracles for this network.',
157-
ExchangeOracleNotFound = 'The specified Exchange Oracle address is not found in the set of available oracles. Ensure the address is correct and part of the available oracle pool.',
158-
RecordingOracleNotFound = 'The specified Recording Oracle address is not found in the set of available oracles. Ensure the address is correct and part of the available oracle pool.',
159-
}
160-
161152
/**
162153
* Represents error messages related to send grid.
163154
*/

packages/apps/job-launcher/server/src/modules/cron-job/cron-job.service.spec.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import { PaymentRepository } from '../payment/payment.repository';
4747
import { PaymentService } from '../payment/payment.service';
4848
import { QualificationService } from '../qualification/qualification.service';
4949
import { RateService } from '../rate/rate.service';
50-
import { RoutingProtocolService } from '../routing-protocol/routing-protocol.service';
5150
import { StorageService } from '../storage/storage.service';
5251
import { Web3Service } from '../web3/web3.service';
5352
import { WebhookEntity } from '../webhook/webhook.entity';
@@ -124,10 +123,6 @@ describe('CronJobService', () => {
124123
{ provide: PaymentService, useValue: createMock<PaymentService>() },
125124
{ provide: WhitelistService, useValue: createMock<WhitelistService>() },
126125
{ provide: ConfigService, useValue: mockConfigService },
127-
{
128-
provide: RoutingProtocolService,
129-
useValue: createMock<RoutingProtocolService>(),
130-
},
131126
{
132127
provide: WebhookRepository,
133128
useValue: createMock<WebhookRepository>(),

packages/apps/job-launcher/server/src/modules/job/job.controller.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ChainId } from '@human-protocol/sdk';
12
import { Test, TestingModule } from '@nestjs/testing';
23
import { JobController } from './job.controller';
34
import { JobService } from './job.service';
@@ -84,6 +85,7 @@ describe('JobController', () => {
8485
describe('quickLaunch', () => {
8586
it('should create a job and return job ID', async () => {
8687
const jobDto: JobQuickLaunchDto = {
88+
chainId: ChainId.POLYGON_AMOY,
8789
requestType: 'type_a' as JobRequestType,
8890
manifestUrl: MOCK_FILE_URL,
8991
manifestHash: MOCK_FILE_HASH,
@@ -119,6 +121,7 @@ describe('JobController', () => {
119121

120122
it('should throw a conflict error if mutex manager fails', async () => {
121123
const jobDto: JobQuickLaunchDto = {
124+
chainId: ChainId.POLYGON_AMOY,
122125
requestType: 'type_a' as JobRequestType,
123126
manifestUrl: MOCK_FILE_URL,
124127
manifestHash: MOCK_FILE_HASH,
@@ -159,6 +162,7 @@ describe('JobController', () => {
159162

160163
it('should return unauthorized error if user is not authenticated', async () => {
161164
const jobDto: JobQuickLaunchDto = {
165+
chainId: ChainId.POLYGON_AMOY,
162166
requestType: 'type_a' as JobRequestType,
163167
manifestUrl: MOCK_FILE_URL,
164168
manifestHash: MOCK_FILE_HASH,
@@ -185,6 +189,7 @@ describe('JobController', () => {
185189

186190
describe('createFortuneJob', () => {
187191
const jobFortuneDto: JobFortuneDto = {
192+
chainId: ChainId.POLYGON_AMOY,
188193
requesterTitle: MOCK_REQUESTER_TITLE,
189194
requesterDescription: MOCK_REQUESTER_DESCRIPTION,
190195
submissionsRequired: 10,

packages/apps/job-launcher/server/src/modules/job/job.dto.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,9 @@ import { IsValidToken } from '../../common/validators/tokens';
3232
import { ManifestDetails } from '../manifest/manifest.dto';
3333

3434
export class JobDto {
35-
@ApiProperty({ enum: ChainId, required: false, name: 'chain_id' })
35+
@ApiProperty({ enum: ChainId, name: 'chain_id' })
3636
@IsEnumCaseInsensitive(ChainId)
37-
@IsOptional()
38-
public chainId?: ChainId;
37+
public chainId: ChainId;
3938

4039
@ApiPropertyOptional()
4140
@IsArray()

packages/apps/job-launcher/server/src/modules/job/job.module.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { WebhookRepository } from '../webhook/webhook.repository';
1515
import { MutexManagerService } from '../mutex/mutex-manager.service';
1616
import { QualificationModule } from '../qualification/qualification.module';
1717
import { WhitelistModule } from '../whitelist/whitelist.module';
18-
import { RoutingProtocolModule } from '../routing-protocol/routing-protocol.module';
1918
import { RateModule } from '../rate/rate.module';
2019
import { ManifestModule } from '../manifest/manifest.module';
2120

@@ -29,7 +28,6 @@ import { ManifestModule } from '../manifest/manifest.module';
2928
StorageModule,
3029
QualificationModule,
3130
WhitelistModule,
32-
RoutingProtocolModule,
3331
RateModule,
3432
ManifestModule,
3533
],

packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts

Lines changed: 23 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
IEscrow,
1111
KVStoreUtils,
1212
NETWORKS,
13+
Role,
1314
} from '@human-protocol/sdk';
1415
import { Test } from '@nestjs/testing';
1516
import { ethers, ZeroAddress } from 'ethers';
@@ -45,7 +46,6 @@ import { PaymentRepository } from '../payment/payment.repository';
4546
import { PaymentService } from '../payment/payment.service';
4647
import { QualificationService } from '../qualification/qualification.service';
4748
import { RateService } from '../rate/rate.service';
48-
import { RoutingProtocolService } from '../routing-protocol/routing-protocol.service';
4949
import { StorageService } from '../storage/storage.service';
5050
import { createUser } from '../user/fixtures';
5151
import { Web3Service } from '../web3/web3.service';
@@ -71,11 +71,14 @@ const mockPaymentRepository = createMock<PaymentRepository>();
7171
const mockStorageService = createMock<StorageService>();
7272
const mockPaymentService = createMock<PaymentService>();
7373
const mockRateService = createMock<RateService>();
74-
const mockRoutingProtocolService = createMock<RoutingProtocolService>();
7574
const mockManifestService = createMock<ManifestService>();
7675
const mockWhitelistService = createMock<WhitelistService>();
7776
const mockWeb3ConfigService = {
7877
txTimeoutMs: faker.number.int({ min: 30000, max: 120000 }),
78+
reputationOracleAddress: faker.finance.ethereumAddress(),
79+
cvatExchangeOracleAddress: faker.finance.ethereumAddress(),
80+
cvatRecordingOracleAddress: faker.finance.ethereumAddress(),
81+
hCaptchaOracleAddress: faker.finance.ethereumAddress(),
7982
};
8083

8184
const mockedEscrowClient = jest.mocked(EscrowClient);
@@ -116,10 +119,6 @@ describe('JobService', () => {
116119
{ provide: PaymentService, useValue: mockPaymentService },
117120
{ provide: StorageService, useValue: mockStorageService },
118121
{ provide: WhitelistService, useValue: mockWhitelistService },
119-
{
120-
provide: RoutingProtocolService,
121-
useValue: mockRoutingProtocolService,
122-
},
123122
{
124123
provide: ManifestService,
125124
useValue: mockManifestService,
@@ -188,14 +187,7 @@ describe('JobService', () => {
188187
expect(mockWeb3Service.validateChainId).toHaveBeenCalledWith(
189188
fortuneJobDto.chainId,
190189
);
191-
expect(mockRoutingProtocolService.selectOracles).not.toHaveBeenCalled();
192-
expect(mockRoutingProtocolService.validateOracles).toHaveBeenCalledWith(
193-
fortuneJobDto.chainId,
194-
FortuneJobType.FORTUNE,
195-
fortuneJobDto.reputationOracle,
196-
fortuneJobDto.exchangeOracle,
197-
fortuneJobDto.recordingOracle,
198-
);
190+
expect(mockWeb3Service.findAvailableOracles).not.toHaveBeenCalled();
199191
expect(mockManifestService.createManifest).toHaveBeenCalledWith(
200192
fortuneJobDto,
201193
FortuneJobType.FORTUNE,
@@ -288,14 +280,7 @@ describe('JobService', () => {
288280
expect(mockWeb3Service.validateChainId).toHaveBeenCalledWith(
289281
fortuneJobDto.chainId,
290282
);
291-
expect(mockRoutingProtocolService.selectOracles).not.toHaveBeenCalled();
292-
expect(mockRoutingProtocolService.validateOracles).toHaveBeenCalledWith(
293-
fortuneJobDto.chainId,
294-
FortuneJobType.FORTUNE,
295-
fortuneJobDto.reputationOracle,
296-
fortuneJobDto.exchangeOracle,
297-
fortuneJobDto.recordingOracle,
298-
);
283+
expect(mockWeb3Service.findAvailableOracles).not.toHaveBeenCalled();
299284
expect(mockManifestService.createManifest).toHaveBeenCalledWith(
300285
fortuneJobDto,
301286
FortuneJobType.FORTUNE,
@@ -379,13 +364,20 @@ describe('JobService', () => {
379364
const mockOracles = {
380365
recordingOracle: faker.finance.ethereumAddress(),
381366
exchangeOracle: faker.finance.ethereumAddress(),
382-
reputationOracle: faker.finance.ethereumAddress(),
367+
reputationOracle: mockWeb3ConfigService.reputationOracleAddress,
383368
};
384-
mockRoutingProtocolService.selectOracles.mockResolvedValueOnce({
385-
recordingOracle: mockOracles.recordingOracle,
386-
exchangeOracle: mockOracles.exchangeOracle,
387-
reputationOracle: mockOracles.reputationOracle,
388-
});
369+
mockWeb3Service.findAvailableOracles.mockResolvedValueOnce([
370+
{
371+
address: mockOracles.exchangeOracle,
372+
role: Role.ExchangeOracle,
373+
url: null,
374+
},
375+
{
376+
address: mockOracles.recordingOracle,
377+
role: Role.RecordingOracle,
378+
url: null,
379+
},
380+
]);
389381
mockedKVStoreUtils.get.mockResolvedValueOnce('1');
390382

391383
const result = await jobService.createJob(
@@ -405,13 +397,11 @@ describe('JobService', () => {
405397
expect(mockWeb3Service.validateChainId).toHaveBeenCalledWith(
406398
fortuneJobDto.chainId,
407399
);
408-
expect(mockRoutingProtocolService.selectOracles).toHaveBeenCalledWith(
400+
expect(mockWeb3Service.findAvailableOracles).toHaveBeenCalledWith(
409401
fortuneJobDto.chainId,
410402
FortuneJobType.FORTUNE,
403+
mockOracles.reputationOracle,
411404
);
412-
expect(
413-
mockRoutingProtocolService.validateOracles,
414-
).not.toHaveBeenCalled();
415405
expect(mockManifestService.createManifest).toHaveBeenCalledWith(
416406
fortuneJobDto,
417407
FortuneJobType.FORTUNE,
@@ -514,14 +504,7 @@ describe('JobService', () => {
514504
expect(mockWeb3Service.validateChainId).toHaveBeenCalledWith(
515505
jobQuickLaunchDto.chainId,
516506
);
517-
expect(mockRoutingProtocolService.selectOracles).not.toHaveBeenCalled();
518-
expect(mockRoutingProtocolService.validateOracles).toHaveBeenCalledWith(
519-
jobQuickLaunchDto.chainId,
520-
HCaptchaJobType.HCAPTCHA,
521-
jobQuickLaunchDto.reputationOracle,
522-
jobQuickLaunchDto.exchangeOracle,
523-
jobQuickLaunchDto.recordingOracle,
524-
);
507+
expect(mockWeb3Service.findAvailableOracles).not.toHaveBeenCalled();
525508
expect(mockManifestService.createManifest).not.toHaveBeenCalled();
526509
expect(mockManifestService.uploadManifest).not.toHaveBeenCalled();
527510
expect(mockPaymentService.createWithdrawalPayment).toHaveBeenCalledWith(

packages/apps/job-launcher/server/src/modules/job/job.service.ts

Lines changed: 50 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
KVStoreKeys,
77
KVStoreUtils,
88
NETWORKS,
9+
Role,
910
} from '@human-protocol/sdk';
1011
import { Inject, Injectable } from '@nestjs/common';
1112
import { ModuleRef } from '@nestjs/core';
@@ -61,7 +62,6 @@ import { ManifestService } from '../manifest/manifest.service';
6162
import { PaymentService } from '../payment/payment.service';
6263
import { QualificationService } from '../qualification/qualification.service';
6364
import { RateService } from '../rate/rate.service';
64-
import { RoutingProtocolService } from '../routing-protocol/routing-protocol.service';
6565
import { StorageService } from '../storage/storage.service';
6666
import { UserEntity } from '../user/user.entity';
6767
import { Web3Service } from '../web3/web3.service';
@@ -94,7 +94,6 @@ export class JobService {
9494
private readonly webhookRepository: WebhookRepository,
9595
private readonly paymentService: PaymentService,
9696
private readonly serverConfigService: ServerConfigService,
97-
private readonly routingProtocolService: RoutingProtocolService,
9897
private readonly storageService: StorageService,
9998
private readonly rateService: RateService,
10099
private readonly whitelistService: WhitelistService,
@@ -124,10 +123,8 @@ export class JobService {
124123
throw new ValidationError(ErrorPayment.HMTTokenDisabled);
125124
}
126125

127-
let { chainId, reputationOracle, exchangeOracle, recordingOracle } = dto;
128-
129-
// Select network
130-
chainId = chainId || this.routingProtocolService.selectNetwork();
126+
const { chainId } = dto;
127+
let { reputationOracle, exchangeOracle, recordingOracle } = dto;
131128
this.web3Service.validateChainId(chainId);
132129

133130
// Check if not whitelisted user has an active payment method
@@ -197,25 +194,11 @@ export class JobService {
197194
).toFixed(fundTokenDecimals),
198195
);
199196

200-
// Select oracles
201197
if (!reputationOracle || !exchangeOracle || !recordingOracle) {
202-
const selectedOracles = await this.routingProtocolService.selectOracles(
203-
chainId,
204-
requestType,
205-
);
206-
207-
exchangeOracle = exchangeOracle || selectedOracles.exchangeOracle;
208-
recordingOracle = recordingOracle || selectedOracles.recordingOracle;
209-
reputationOracle = reputationOracle || selectedOracles.reputationOracle;
210-
} else {
211-
// Validate if all oracles are provided
212-
await this.routingProtocolService.validateOracles(
213-
chainId,
214-
requestType,
215-
reputationOracle,
216-
exchangeOracle,
217-
recordingOracle,
218-
);
198+
const defaultOracles = await this.getDefaultOracles(chainId, requestType);
199+
reputationOracle = reputationOracle ?? defaultOracles.reputationOracle;
200+
exchangeOracle = exchangeOracle ?? defaultOracles.exchangeOracle;
201+
recordingOracle = recordingOracle ?? defaultOracles.recordingOracle;
219202
}
220203

221204
if (dto.qualifications) {
@@ -292,6 +275,49 @@ export class JobService {
292275
return jobEntity.id;
293276
}
294277

278+
private async getDefaultOracles(
279+
chainId: ChainId,
280+
requestType: JobRequestType,
281+
): Promise<{
282+
reputationOracle: string;
283+
exchangeOracle: string;
284+
recordingOracle: string;
285+
}> {
286+
if (requestType === HCaptchaJobType.HCAPTCHA) {
287+
const oracleAddress = this.web3ConfigService.hCaptchaOracleAddress;
288+
return {
289+
reputationOracle: oracleAddress,
290+
exchangeOracle: oracleAddress,
291+
recordingOracle: oracleAddress,
292+
};
293+
}
294+
295+
if (Object.values(CvatJobType).includes(requestType as CvatJobType)) {
296+
return {
297+
reputationOracle: this.web3ConfigService.reputationOracleAddress,
298+
exchangeOracle: this.web3ConfigService.cvatExchangeOracleAddress,
299+
recordingOracle: this.web3ConfigService.cvatRecordingOracleAddress,
300+
};
301+
}
302+
303+
const reputationOracle = this.web3ConfigService.reputationOracleAddress;
304+
const availableOracles = await this.web3Service.findAvailableOracles(
305+
chainId,
306+
requestType,
307+
reputationOracle,
308+
);
309+
310+
return {
311+
reputationOracle,
312+
exchangeOracle:
313+
availableOracles.find((oracle) => oracle.role === Role.ExchangeOracle)
314+
?.address || '',
315+
recordingOracle:
316+
availableOracles.find((oracle) => oracle.role === Role.RecordingOracle)
317+
?.address || '',
318+
};
319+
}
320+
295321
public async createEscrow(jobEntity: JobEntity): Promise<JobEntity> {
296322
const signer = this.web3Service.getSigner(jobEntity.chainId);
297323

packages/apps/job-launcher/server/src/modules/manifest/manifest.service.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ describe('ManifestService', () => {
4040
describe('createManifest', () => {
4141
it('should create a fortune manifest', async () => {
4242
const dto: JobFortuneDto = {
43+
chainId: faker.number.int({ min: 1, max: 100 }),
4344
requesterTitle: faker.lorem.sentence(),
4445
requesterDescription: faker.lorem.sentence(),
4546
submissionsRequired: faker.number.int({ min: 1, max: 100 }),

0 commit comments

Comments
 (0)