From 3abfd6b35ff9c0fac361a097b968ef64bf8085d9 Mon Sep 17 00:00:00 2001 From: Alec Schaefer Date: Tue, 22 Aug 2023 15:57:50 -0400 Subject: [PATCH] Signer mock interfaces (#10510) add mock signer interfaces --- .../phone-number-privacy/signer/package.json | 2 +- .../src/common/database/wrappers/account.ts | 123 +++++++++-------- .../src/common/database/wrappers/request.ts | 74 +++++----- .../phone-number-privacy/signer/src/config.ts | 8 ++ .../signer/src/pnp/endpoints/sign/action.ts | 20 +-- .../src/pnp/services/account-service.ts | 127 +++++++++--------- .../src/pnp/services/request-service.ts | 60 +++++++-- .../phone-number-privacy/signer/src/server.ts | 50 ++++--- 8 files changed, 251 insertions(+), 213 deletions(-) diff --git a/packages/phone-number-privacy/signer/package.json b/packages/phone-number-privacy/signer/package.json index 0f580b5bdf5..3b8eac04294 100644 --- a/packages/phone-number-privacy/signer/package.json +++ b/packages/phone-number-privacy/signer/package.json @@ -1,6 +1,6 @@ { "name": "@celo/phone-number-privacy-signer", - "version": "3.0.0-beta.12", + "version": "3.0.0-beta.13", "description": "Signing participator of ODIS", "author": "Celo", "license": "Apache-2.0", diff --git a/packages/phone-number-privacy/signer/src/common/database/wrappers/account.ts b/packages/phone-number-privacy/signer/src/common/database/wrappers/account.ts index de88f643910..264f894669d 100644 --- a/packages/phone-number-privacy/signer/src/common/database/wrappers/account.ts +++ b/packages/phone-number-privacy/signer/src/common/database/wrappers/account.ts @@ -1,81 +1,78 @@ -// import { ErrorMessage } from '@celo/phone-number-privacy-common' +import { ErrorMessage } from '@celo/phone-number-privacy-common' import Logger from 'bunyan' import { Knex } from 'knex' -// import { config } from '../../../config' -// import { AccountRecord, ACCOUNTS_COLUMNS, ACCOUNTS_TABLE, toAccountRecord } from '../models/account' -// import { doMeteredSql } from '../utils' +import { config } from '../../../config' +import { AccountRecord, ACCOUNTS_COLUMNS, ACCOUNTS_TABLE, toAccountRecord } from '../models/account' +import { doMeteredSql } from '../utils' /* * Returns how many queries the account has already performed. */ export async function getPerformedQueryCount( - _db: Knex, - _account: string, - _logger: Logger + db: Knex, + account: string, + logger: Logger ): Promise { - return Promise.resolve(0) - // logger.debug({ account }, 'Getting performed query count') - // return doMeteredSql( - // 'getPerformedQueryCount', - // ErrorMessage.DATABASE_GET_FAILURE, - // logger, - // async () => { - // const queryCounts = await db(ACCOUNTS_TABLE) - // .where(ACCOUNTS_COLUMNS.address, account) - // .select(ACCOUNTS_COLUMNS.numLookups) - // .first() - // .timeout(config.db.timeout) - // return queryCounts === undefined ? 0 : queryCounts[ACCOUNTS_COLUMNS.numLookups] - // } - // ) + logger.debug({ account }, 'Getting performed query count') + return doMeteredSql( + 'getPerformedQueryCount', + ErrorMessage.DATABASE_GET_FAILURE, + logger, + async () => { + const queryCounts = await db(ACCOUNTS_TABLE) + .where(ACCOUNTS_COLUMNS.address, account) + .select(ACCOUNTS_COLUMNS.numLookups) + .first() + .timeout(config.db.timeout) + return queryCounts === undefined ? 0 : queryCounts[ACCOUNTS_COLUMNS.numLookups] + } + ) } -// async function getAccountExists( -// db: Knex, -// account: string, -// logger: Logger, -// trx?: Knex.Transaction -// ): Promise { -// return Promise.resolve(true) -// return doMeteredSql('getAccountExists', ErrorMessage.DATABASE_GET_FAILURE, logger, async () => { -// const sql = db(ACCOUNTS_TABLE) -// .where(ACCOUNTS_COLUMNS.address, account) -// .first() -// .timeout(config.db.timeout) +async function getAccountExists( + db: Knex, + account: string, + logger: Logger, + trx?: Knex.Transaction +): Promise { + return doMeteredSql('getAccountExists', ErrorMessage.DATABASE_GET_FAILURE, logger, async () => { + const sql = db(ACCOUNTS_TABLE) + .where(ACCOUNTS_COLUMNS.address, account) + .first() + .timeout(config.db.timeout) -// const accountRecord = await (trx != null ? sql.transacting(trx) : sql) -// return !!accountRecord -// }) -// } + const accountRecord = await (trx != null ? sql.transacting(trx) : sql) + return !!accountRecord + }) +} /* * Increments query count in database. If record doesn't exist, create one. */ export async function incrementQueryCount( - _db: Knex, - _account: string, - _logger: Logger, - _trx?: Knex.Transaction + db: Knex, + account: string, + logger: Logger, + trx?: Knex.Transaction ): Promise { - return - // logger.debug({ account }, 'Incrementing query count') - // return doMeteredSql( - // 'incrementQueryCount', - // ErrorMessage.DATABASE_INSERT_FAILURE, - // logger, - // async () => { - // if (await getAccountExists(db, account, logger, trx)) { - // const sql = db(ACCOUNTS_TABLE) - // .where(ACCOUNTS_COLUMNS.address, account) - // .increment(ACCOUNTS_COLUMNS.numLookups, 1) - // .timeout(config.db.timeout) - // await (trx != null ? sql.transacting(trx) : sql) - // } else { - // const sql = db(ACCOUNTS_TABLE) - // .insert(toAccountRecord(account, 1)) - // .timeout(config.db.timeout) - // await (trx != null ? sql.transacting(trx) : sql) - // } - // } - // ) + logger.debug({ account }, 'Incrementing query count') + return doMeteredSql( + 'incrementQueryCount', + ErrorMessage.DATABASE_INSERT_FAILURE, + logger, + async () => { + if (await getAccountExists(db, account, logger, trx)) { + const sql = db(ACCOUNTS_TABLE) + .where(ACCOUNTS_COLUMNS.address, account) + .increment(ACCOUNTS_COLUMNS.numLookups, 1) + .timeout(config.db.timeout) + await (trx != null ? sql.transacting(trx) : sql) + } else { + const sql = db(ACCOUNTS_TABLE) + .insert(toAccountRecord(account, 1)) + .timeout(config.db.timeout) + await (trx != null ? sql.transacting(trx) : sql) + } + } + ) } diff --git a/packages/phone-number-privacy/signer/src/common/database/wrappers/request.ts b/packages/phone-number-privacy/signer/src/common/database/wrappers/request.ts index a5a2e1db56e..239fb136d10 100644 --- a/packages/phone-number-privacy/signer/src/common/database/wrappers/request.ts +++ b/packages/phone-number-privacy/signer/src/common/database/wrappers/request.ts @@ -1,48 +1,46 @@ -// import { ErrorMessage } from '@celo/phone-number-privacy-common' +import { ErrorMessage } from '@celo/phone-number-privacy-common' import Logger from 'bunyan' import { Knex } from 'knex' -// import { config } from '../../../config' -// import { -// PnpSignRequestRecord, -// // REQUESTS_COLUMNS, -// REQUESTS_TABLE, -// toPnpSignRequestRecord, -// } from '../models/request' -// import { doMeteredSql } from '../utils' +import { config } from '../../../config' +import { + PnpSignRequestRecord, + REQUESTS_COLUMNS, + REQUESTS_TABLE, + toPnpSignRequestRecord, +} from '../models/request' +import { doMeteredSql } from '../utils' export async function getRequestExists( // TODO try insert, if primary key error, then duplicate request - _db: Knex, - _account: string, - _blindedQuery: string, - _logger: Logger + db: Knex, + account: string, + blindedQuery: string, + logger: Logger ): Promise { - return Promise.resolve(false) - // logger.debug(`Checking if request exists for account: ${account}, blindedQuery: ${blindedQuery}`) - // return doMeteredSql('getRequestExists', ErrorMessage.DATABASE_GET_FAILURE, logger, async () => { - // const existingRequest = await db(REQUESTS_TABLE) - // .where({ - // [REQUESTS_COLUMNS.address]: account, - // [REQUESTS_COLUMNS.blindedQuery]: blindedQuery, // TODO are we using the primary key correctly?? - // }) - // .first() - // .timeout(config.db.timeout) - // return !!existingRequest // TODO use EXISTS query?? - // }) + logger.debug(`Checking if request exists for account: ${account}, blindedQuery: ${blindedQuery}`) + return doMeteredSql('getRequestExists', ErrorMessage.DATABASE_GET_FAILURE, logger, async () => { + const existingRequest = await db(REQUESTS_TABLE) + .where({ + [REQUESTS_COLUMNS.address]: account, + [REQUESTS_COLUMNS.blindedQuery]: blindedQuery, // TODO are we using the primary key correctly?? + }) + .first() + .timeout(config.db.timeout) + return !!existingRequest // TODO use EXISTS query?? + }) } export async function insertRequest( - _db: Knex, - _account: string, - _blindedQuery: string, - _logger: Logger, - _trx?: Knex.Transaction + db: Knex, + account: string, + blindedQuery: string, + logger: Logger, + trx?: Knex.Transaction ): Promise { - return - // logger.debug(`Storing salt request for: ${account}, blindedQuery: ${blindedQuery}`) - // return doMeteredSql('insertRequest', ErrorMessage.DATABASE_INSERT_FAILURE, logger, async () => { - // const sql = db(REQUESTS_TABLE) - // .insert(toPnpSignRequestRecord(account, blindedQuery)) - // .timeout(config.db.timeout) - // await (trx != null ? sql.transacting(trx) : sql) - // }) + logger.debug(`Storing salt request for: ${account}, blindedQuery: ${blindedQuery}`) + return doMeteredSql('insertRequest', ErrorMessage.DATABASE_INSERT_FAILURE, logger, async () => { + const sql = db(REQUESTS_TABLE) + .insert(toPnpSignRequestRecord(account, blindedQuery)) + .timeout(config.db.timeout) + await (trx != null ? sql.transacting(trx) : sql) + }) } diff --git a/packages/phone-number-privacy/signer/src/config.ts b/packages/phone-number-privacy/signer/src/config.ts index ef504d18e71..5682e04e668 100644 --- a/packages/phone-number-privacy/signer/src/config.ts +++ b/packages/phone-number-privacy/signer/src/config.ts @@ -98,6 +98,10 @@ export interface SignerConfig { fullNodeTimeoutMs: number fullNodeRetryCount: number fullNodeRetryDelayMs: number + shouldMockAccountService: boolean + mockDek: string + mockTotalQuota: number + shouldMockRequestService: boolean } const env = process.env as any @@ -175,4 +179,8 @@ export const config: SignerConfig = { fullNodeTimeoutMs: Number(env.TIMEOUT_MS ?? FULL_NODE_TIMEOUT_IN_MS), fullNodeRetryCount: Number(env.RETRY_COUNT ?? RETRY_COUNT), fullNodeRetryDelayMs: Number(env.RETRY_DELAY_IN_MS ?? RETRY_DELAY_IN_MS), + shouldMockAccountService: toBool(env.SHOULD_MOCK_ACCOUNT_SERVICE, false), + mockDek: env.MOCK_DEK, + mockTotalQuota: Number(env.MOCK_TOTAL_QUOTA ?? 10), + shouldMockRequestService: toBool(env.SHOULD_MOCK_REQUEST_SERVICE, false), } diff --git a/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/action.ts b/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/action.ts index 88493b8d3b3..fcba43a5f78 100644 --- a/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/action.ts +++ b/packages/phone-number-privacy/signer/src/pnp/endpoints/sign/action.ts @@ -13,9 +13,7 @@ import { WarningMessage, } from '@celo/phone-number-privacy-common' import { Request } from 'express' -import { Knex } from 'knex' import { computeBlindedSignature } from '../../../common/bls/bls-cryptography-client' -import { getRequestExists } from '../../../common/database/wrappers/request' import { DefaultKeyName, Key, KeyProvider } from '../../../common/key-management/key-provider-base' import { Counters, Histograms } from '../../../common/metrics' import { getSignerVersion, SignerConfig } from '../../../config' @@ -28,7 +26,6 @@ import { AccountService } from '../../services/account-service' import { PnpRequestService } from '../../services/request-service' export function pnpSign( - db: Knex, config: SignerConfig, requestService: PnpRequestService, accountService: AccountService, @@ -60,11 +57,10 @@ export function pnpSign( let usedQuota = await requestService.getUsedQuotaForAccount(request.body.account, ctx) - const duplicateRequest = await isDuplicateRequest( - db, + const duplicateRequest = await requestService.isDuplicateRequest( request.body.account, request.body.blindedQueryPhoneNumber, - logger + ctx ) Histograms.userRemainingQuotaAtRequest @@ -134,18 +130,6 @@ export function pnpSign( } } -function isDuplicateRequest( - db: Knex, - account: string, - blindedQueryPhoneNumber: string, - logger: any -): Promise { - return getRequestExists(db, account, blindedQueryPhoneNumber, logger).catch((err) => { - logger.error(err, 'Failed to check if request already exists in db') - return false - }) -} - async function sign( blindedMessage: string, key: Key, diff --git a/packages/phone-number-privacy/signer/src/pnp/services/account-service.ts b/packages/phone-number-privacy/signer/src/pnp/services/account-service.ts index 6b1685b02c4..66aee2419b3 100644 --- a/packages/phone-number-privacy/signer/src/pnp/services/account-service.ts +++ b/packages/phone-number-privacy/signer/src/pnp/services/account-service.ts @@ -1,20 +1,19 @@ -// import { ContractKit } from '@celo/contractkit' +import { ContractKit } from '@celo/contractkit' import { ErrorMessage, - // FULL_NODE_TIMEOUT_IN_MS, - // getDataEncryptionKey, - // RETRY_COUNT, - // RETRY_DELAY_IN_MS, + FULL_NODE_TIMEOUT_IN_MS, + getDataEncryptionKey, + RETRY_COUNT, + RETRY_DELAY_IN_MS, } from '@celo/phone-number-privacy-common' -// import BigNumber from 'bignumber.js' -// import Logger from 'bunyan' +import BigNumber from 'bignumber.js' +import Logger from 'bunyan' import { LRUCache } from 'lru-cache' -//import { OdisError, wrapError } from '../../common/error' -import { OdisError } from '../../common/error' -// import { Counters } from '../../common/metrics' +import { OdisError, wrapError } from '../../common/error' +import { Counters } from '../../common/metrics' import { traceAsyncFunction } from '../../common/tracing-utils' -// import { getOnChainOdisPayments } from '../../common/web3/contracts' -// import { config } from '../../config' +import { getOnChainOdisPayments } from '../../common/web3/contracts' +import { config } from '../../config' export interface PnpAccount { dek: string // onChain @@ -69,58 +68,66 @@ export class CachingAccountService implements AccountService { // tslint:disable-next-line:max-classes-per-file export class ContractKitAccountService implements AccountService { - // constructor( - // private readonly logger: Logger, - // private readonly kit: ContractKit, - // private readonly opts: ContractKitAccountServiceOptions = { - // fullNodeTimeoutMs: FULL_NODE_TIMEOUT_IN_MS, - // fullNodeRetryCount: RETRY_COUNT, - // fullNodeRetryDelayMs: RETRY_DELAY_IN_MS, - // } - // ) {} + constructor( + private readonly logger: Logger, + private readonly kit: ContractKit, + private readonly opts: ContractKitAccountServiceOptions = { + fullNodeTimeoutMs: FULL_NODE_TIMEOUT_IN_MS, + fullNodeRetryCount: RETRY_COUNT, + fullNodeRetryDelayMs: RETRY_DELAY_IN_MS, + } + ) {} async getAccount(address: string): Promise { - return { - dek: '0x034846bc781cacdafc66f3a77aa9fc3c56a9dadcd683c72be3c446fee8da041070', - address, - pnpTotalQuota: 10, - } - // return traceAsyncFunction('ContractKitAccountService - getAccount', async () => { - // const dek = await wrapError( - // getDataEncryptionKey( - // address, - // this.kit, - // this.logger, - // this.opts.fullNodeTimeoutMs, - // this.opts.fullNodeRetryCount, - // this.opts.fullNodeRetryDelayMs - // ).catch((err) => { - // // TODO could clean this up...quick fix since we weren't incrementing blockchain error counter - // this.logger.error({ err, address }, 'failed to get on-chain odis balance for account') - // Counters.blockchainErrors.inc() - // throw err - // }), - // ErrorMessage.FAILURE_TO_GET_DEK - // ) + return traceAsyncFunction('ContractKitAccountService - getAccount', async () => { + const dek = await wrapError( + getDataEncryptionKey( + address, + this.kit, + this.logger, + this.opts.fullNodeTimeoutMs, + this.opts.fullNodeRetryCount, + this.opts.fullNodeRetryDelayMs + ).catch((err) => { + // TODO could clean this up...quick fix since we weren't incrementing blockchain error counter + this.logger.error({ err, address }, 'failed to get on-chain odis balance for account') + Counters.blockchainErrors.inc() + throw err + }), + ErrorMessage.FAILURE_TO_GET_DEK + ) - // const { queryPriceInCUSD } = config.quota - // const totalPaidInWei = await wrapError( - // getOnChainOdisPayments(this.kit, this.logger, address, 'FAKE_URL'), - // ErrorMessage.FAILURE_TO_GET_TOTAL_QUOTA - // ) - // const totalQuotaBN = totalPaidInWei - // .div(queryPriceInCUSD.times(new BigNumber(1e18))) - // .integerValue(BigNumber.ROUND_DOWN) + const { queryPriceInCUSD } = config.quota + const totalPaidInWei = await wrapError( + getOnChainOdisPayments(this.kit, this.logger, address, 'FAKE_URL'), + ErrorMessage.FAILURE_TO_GET_TOTAL_QUOTA + ) + const totalQuotaBN = totalPaidInWei + .div(queryPriceInCUSD.times(new BigNumber(1e18))) + .integerValue(BigNumber.ROUND_DOWN) - // // If any account hits an overflow here, we need to redesign how - // // quota/queries are computed anyways. - // const pnpTotalQuota = totalQuotaBN.toNumber() + // If any account hits an overflow here, we need to redesign how + // quota/queries are computed anyways. + const pnpTotalQuota = totalQuotaBN.toNumber() - // return { - // address, - // dek, - // pnpTotalQuota, - // } - // }) + return { + address, + dek, + pnpTotalQuota, + } + }) + } +} + +// tslint:disable-next-line:max-classes-per-file +export class MockAccountService implements AccountService { + constructor(private readonly mockDek: string, private readonly mockTotalQuota: number) {} + + async getAccount(address: string): Promise { + return { + dek: this.mockDek, + address, + pnpTotalQuota: this.mockTotalQuota, + } } } diff --git a/packages/phone-number-privacy/signer/src/pnp/services/request-service.ts b/packages/phone-number-privacy/signer/src/pnp/services/request-service.ts index 6038cc97f6f..52c5fe106b2 100644 --- a/packages/phone-number-privacy/signer/src/pnp/services/request-service.ts +++ b/packages/phone-number-privacy/signer/src/pnp/services/request-service.ts @@ -2,21 +2,18 @@ import { ErrorMessage } from '@celo/phone-number-privacy-common' import { Knex } from 'knex' import { Context } from '../../common/context' import { getPerformedQueryCount, incrementQueryCount } from '../../common/database/wrappers/account' -import { insertRequest } from '../../common/database/wrappers/request' +import { getRequestExists, insertRequest } from '../../common/database/wrappers/request' import { wrapError } from '../../common/error' import { Histograms, newMeter } from '../../common/metrics' import { traceAsyncFunction } from '../../common/tracing-utils' export interface PnpRequestService { - getUsedQuotaForAccount(address: string, ctx: Context): Promise recordRequest(address: string, blindedQuery: string, ctx: Context): Promise + getUsedQuotaForAccount(address: string, ctx: Context): Promise + isDuplicateRequest(address: string, blindedQuery: string, ctx: Context): Promise } -/** - * PnpQuotaService is responsible for serving information about pnp quota - * - */ -export class DefaultPnpQuotaService { +export class DefaultPnpRequestService implements PnpRequestService { constructor(readonly db: Knex) {} public async recordRequest( @@ -24,7 +21,7 @@ export class DefaultPnpQuotaService { blindedQueryPhoneNumber: string, ctx: Context ): Promise { - return traceAsyncFunction('pnpQuotaService - recordRequest', async () => { + return traceAsyncFunction('DefaultPnpRequestService - recordRequest', async () => { await Promise.all([ insertRequest(this.db, account, blindedQueryPhoneNumber, ctx.logger), incrementQueryCount(this.db, account, ctx.logger), @@ -32,14 +29,13 @@ export class DefaultPnpQuotaService { }) } - public getUsedQuotaForAccount(account: string, ctx: Context): Promise { + public async getUsedQuotaForAccount(account: string, ctx: Context): Promise { const meter = newMeter( Histograms.getRemainingQueryCountInstrumentation, 'getQuotaStatus', ctx.url ) - - return traceAsyncFunction('pnpQuotaService - getUsedQuotaForAccount', () => + return traceAsyncFunction('DefaultPnpRequestService - getUsedQuotaForAccount', () => meter(() => wrapError( getPerformedQueryCount(this.db, account, ctx.logger), @@ -48,4 +44,46 @@ export class DefaultPnpQuotaService { ) ) } + + public async isDuplicateRequest( + account: string, + blindedQueryPhoneNumber: string, + ctx: Context + ): Promise { + try { + return getRequestExists(this.db, account, blindedQueryPhoneNumber, ctx.logger) + } catch (err) { + ctx.logger.error(err, 'Failed to check if request already exists in db') + return false + } + } +} + +// tslint:disable-next-line:max-classes-per-file +export class MockPnpRequestService implements PnpRequestService { + public async recordRequest( + account: string, + blindedQueryPhoneNumber: string, + ctx: Context + ): Promise { + ctx.logger.info({ account, blindedQueryPhoneNumber }, 'MockPnpRequestService - recordRequest') + return + } + + public async getUsedQuotaForAccount(account: string, ctx: Context): Promise { + ctx.logger.info({ account }, 'MockPnpRequestService - getUsedQuotaForAccount') + return 0 + } + + public async isDuplicateRequest( + account: string, + blindedQueryPhoneNumber: string, + ctx: Context + ): Promise { + ctx.logger.info( + { account, blindedQueryPhoneNumber }, + 'MockPnpRequestService - isDuplicateRequest' + ) + return false + } } diff --git a/packages/phone-number-privacy/signer/src/server.ts b/packages/phone-number-privacy/signer/src/server.ts index 7091015811e..d5cc402af6f 100644 --- a/packages/phone-number-privacy/signer/src/server.ts +++ b/packages/phone-number-privacy/signer/src/server.ts @@ -12,17 +12,6 @@ import https from 'https' import { Knex } from 'knex' import { IncomingMessage, ServerResponse } from 'node:http' import * as PromClient from 'prom-client' -import { KeyProvider } from './common/key-management/key-provider-base' -import { Histograms } from './common/metrics' -import { getSignerVersion, SignerConfig } from './config' -import { domainDisable } from './domain/endpoints/disable/action' -import { domainQuota } from './domain/endpoints/quota/action' -import { domainSign } from './domain/endpoints/sign/action' -import { DomainQuotaService } from './domain/services/quota' -import { pnpQuota } from './pnp/endpoints/quota/action' -import { pnpSign } from './pnp/endpoints/sign/action' -import { DefaultPnpQuotaService } from './pnp/services/request-service' - import { catchErrorHandler, disabledHandler, @@ -33,7 +22,21 @@ import { timeoutHandler, tracingHandler, } from './common/handler' -import { CachingAccountService, ContractKitAccountService } from './pnp/services/account-service' +import { KeyProvider } from './common/key-management/key-provider-base' +import { Histograms } from './common/metrics' +import { getSignerVersion, SignerConfig } from './config' +import { domainDisable } from './domain/endpoints/disable/action' +import { domainQuota } from './domain/endpoints/quota/action' +import { domainSign } from './domain/endpoints/sign/action' +import { DomainQuotaService } from './domain/services/quota' +import { pnpQuota } from './pnp/endpoints/quota/action' +import { pnpSign } from './pnp/endpoints/sign/action' +import { + CachingAccountService, + ContractKitAccountService, + MockAccountService, +} from './pnp/services/account-service' +import { DefaultPnpRequestService, MockPnpRequestService } from './pnp/services/request-service' require('events').EventEmitter.defaultMaxListeners = 15 @@ -61,16 +64,19 @@ export function startSigner( res.send(PromClient.register.metrics()) }) - const accountService = new CachingAccountService( - // new ContractKitAccountService(logger, kit, { - // fullNodeTimeoutMs: config.fullNodeTimeoutMs, - // fullNodeRetryCount: config.fullNodeRetryCount, - // fullNodeRetryDelayMs: config.fullNodeRetryDelayMs, - // }) - new ContractKitAccountService() - ) + const baseAccountService = config.shouldMockAccountService + ? new MockAccountService(config.mockDek, config.mockTotalQuota) + : new ContractKitAccountService(logger, kit, { + fullNodeTimeoutMs: config.fullNodeTimeoutMs, + fullNodeRetryCount: config.fullNodeRetryCount, + fullNodeRetryDelayMs: config.fullNodeRetryDelayMs, + }) + + const accountService = new CachingAccountService(baseAccountService) - const pnpRequestService = new DefaultPnpQuotaService(db) + const pnpRequestService = config.shouldMockRequestService + ? new MockPnpRequestService() + : new DefaultPnpRequestService(db) const domainQuotaService = new DomainQuotaService(db) logger.info('Right before adding meteredSignerEndpoints') @@ -85,7 +91,7 @@ export function startSigner( createHandler( timeout, phoneNumberPrivacy.enabled, - pnpSign(db, config, pnpRequestService, accountService, keyProvider) + pnpSign(config, pnpRequestService, accountService, keyProvider) ) ) app.post(