From 5e83e8c22d821b7558458fb5e9d8a08acbe3f22d Mon Sep 17 00:00:00 2001 From: farhanW3 Date: Tue, 14 May 2024 12:02:23 -0700 Subject: [PATCH 1/2] Updated Error Response on API End-point --- src/server/routes/backend-wallet/import.ts | 13 ++++++++++--- src/server/routes/backend-wallet/transfer.ts | 14 ++++++++++++-- src/server/routes/configuration/cors/remove.ts | 5 ++++- src/server/routes/configuration/wallets/update.ts | 13 +++++++++++-- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/server/routes/backend-wallet/import.ts b/src/server/routes/backend-wallet/import.ts index fc4035a2e..2638e2db6 100644 --- a/src/server/routes/backend-wallet/import.ts +++ b/src/server/routes/backend-wallet/import.ts @@ -3,6 +3,7 @@ import { FastifyInstance } from "fastify"; import { StatusCodes } from "http-status-codes"; import { WalletType } from "../../../schema/wallet"; import { getConfig } from "../../../utils/cache/getConfig"; +import { createCustomError } from "../../middleware/error"; import { standardResponseSchema } from "../../schemas/sharedApiSchemas"; import { importAwsKmsWallet } from "../../utils/wallets/importAwsKmsWallet"; import { importGcpKmsWallet } from "../../utils/wallets/importGcpKmsWallet"; @@ -135,16 +136,20 @@ export const importBackendWallet = async (fastify: FastifyInstance) => { password, }); } else { - throw new Error( + throw createCustomError( `Please provide either 'privateKey', 'mnemonic', or 'encryptedJson' & 'password' to import a wallet.`, + StatusCodes.BAD_REQUEST, + "MISSING_PARAMETERS", ); } break; case WalletType.awsKms: const { awsKmsArn, awsKmsKeyId } = request.body as any; if (!(awsKmsArn && awsKmsKeyId)) { - throw new Error( + throw createCustomError( `Please provide 'awsKmsArn' and 'awsKmsKeyId' to import a wallet.`, + StatusCodes.BAD_REQUEST, + "MISSING_PARAMETERS", ); } @@ -156,8 +161,10 @@ export const importBackendWallet = async (fastify: FastifyInstance) => { case WalletType.gcpKms: const { gcpKmsKeyId, gcpKmsKeyVersionId } = request.body as any; if (!(gcpKmsKeyId && gcpKmsKeyVersionId)) { - throw new Error( + throw createCustomError( `Please provide 'gcpKmsKeyId' and 'gcpKmsKeyVersionId' to import a wallet.`, + StatusCodes.BAD_REQUEST, + "MISSING_PARAMETERS", ); } diff --git a/src/server/routes/backend-wallet/transfer.ts b/src/server/routes/backend-wallet/transfer.ts index d86bcf7eb..dedf9494d 100644 --- a/src/server/routes/backend-wallet/transfer.ts +++ b/src/server/routes/backend-wallet/transfer.ts @@ -11,6 +11,7 @@ import { queueTx } from "../../../db/transactions/queueTx"; import { queueTxRaw } from "../../../db/transactions/queueTxRaw"; import { getContract } from "../../../utils/cache/getContract"; import { getSdk } from "../../../utils/cache/getSdk"; +import { createCustomError } from "../../middleware/error"; import { requestQuerystringSchema, standardResponseSchema, @@ -80,12 +81,21 @@ export async function transfer(fastify: FastifyInstance) { let queueId: string | null = null; if (isNativeToken(currencyAddress)) { const walletAddress = await sdk.getSigner()?.getAddress(); - if (!walletAddress) throw new Error("No wallet address"); + if (!walletAddress) + throw createCustomError( + "No wallet address", + StatusCodes.BAD_REQUEST, + "NO_WALLET_ADDRESS", + ); const balance = await sdk.getBalance(walletAddress); if (balance.value.lt(normalizedValue)) { - throw new Error("Insufficient balance"); + throw createCustomError( + "Insufficient balance", + StatusCodes.BAD_GATEWAY, + "INSUFFICIENT_BALANCE", + ); } const params = { diff --git a/src/server/routes/configuration/cors/remove.ts b/src/server/routes/configuration/cors/remove.ts index 60a8e316b..d90a30314 100644 --- a/src/server/routes/configuration/cors/remove.ts +++ b/src/server/routes/configuration/cors/remove.ts @@ -3,6 +3,7 @@ import { FastifyInstance } from "fastify"; import { StatusCodes } from "http-status-codes"; import { updateConfiguration } from "../../../../db/configuration/updateConfiguration"; import { getConfig } from "../../../../utils/cache/getConfig"; +import { createCustomError } from "../../../middleware/error"; import { standardResponseSchema } from "../../../schemas/sharedApiSchemas"; import { mandatoryAllowedCorsUrls } from "../../../utils/cors-urls"; import { ReplySchema } from "./get"; @@ -49,8 +50,10 @@ export async function removeUrlToCorsConfiguration(fastify: FastifyInstance) { mandatoryAllowedCorsUrls.includes(url), ); if (containsMandatoryUrl) { - throw new Error( + throw createCustomError( `Cannot remove URLs: ${mandatoryAllowedCorsUrls.join(",")}`, + StatusCodes.BAD_REQUEST, + "BAD_REQUEST", ); } diff --git a/src/server/routes/configuration/wallets/update.ts b/src/server/routes/configuration/wallets/update.ts index 7b2a58cf7..4e3ece099 100644 --- a/src/server/routes/configuration/wallets/update.ts +++ b/src/server/routes/configuration/wallets/update.ts @@ -4,6 +4,7 @@ import { StatusCodes } from "http-status-codes"; import { updateConfiguration } from "../../../../db/configuration/updateConfiguration"; import { WalletType } from "../../../../schema/wallet"; import { getConfig } from "../../../../utils/cache/getConfig"; +import { createCustomError } from "../../../middleware/error"; import { standardResponseSchema } from "../../../schemas/sharedApiSchemas"; import { ReplySchema } from "./get"; @@ -86,7 +87,11 @@ export async function updateWalletsConfiguration(fastify: FastifyInstance) { !req.body.awsSecretAccessKey || !req.body.awsRegion ) { - throw new Error("Please specify all AWS KMS configuration."); + throw createCustomError( + "Please specify all AWS KMS configuration.", + StatusCodes.BAD_REQUEST, + "BAD_REQUEST", + ); } await updateConfiguration({ @@ -108,7 +113,11 @@ export async function updateWalletsConfiguration(fastify: FastifyInstance) { !req.body.gcpApplicationCredentialEmail || !req.body.gcpApplicationCredentialPrivateKey ) { - throw new Error("Please specify all GCP KMS configuration."); + throw createCustomError( + "Please specify all GCP KMS configuration.", + StatusCodes.BAD_REQUEST, + "BAD_REQUEST", + ); } await updateConfiguration({ From af91b820f84facf982895d4988ee3ff61ba1e2e8 Mon Sep 17 00:00:00 2001 From: farhanW3 Date: Tue, 14 May 2024 15:10:06 -0700 Subject: [PATCH 2/2] updated check + log to indicate missed events/receipts --- src/worker/tasks/processEventLogsWorker.ts | 14 ++++++++++---- .../tasks/processTransactionReceiptsWorker.ts | 14 ++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/worker/tasks/processEventLogsWorker.ts b/src/worker/tasks/processEventLogsWorker.ts index 9433099ae..40af8e82f 100644 --- a/src/worker/tasks/processEventLogsWorker.ts +++ b/src/worker/tasks/processEventLogsWorker.ts @@ -40,6 +40,10 @@ const handler: Processor = async (job: Job) => { // Store logs to DB. const insertedLogs = await bulkInsertContractEventLogs({ logs }); + if (insertedLogs.length === 0) { + return; + } + // Enqueue webhooks. // This step should happen immediately after inserting to DB. for (const eventLog of insertedLogs) { @@ -54,13 +58,15 @@ const handler: Processor = async (job: Job) => { } // Any logs inserted in a delayed job indicates missed logs in the realtime job. - if (job.delay > 0) { + if (job.opts.delay && job.opts.delay > 0) { logger({ service: "worker", level: "warn", - message: `Found ${insertedLogs.length} logs on ${chainId} after ${ - job.delay / 1000 - }s.`, + message: `Found ${ + insertedLogs.length + } logs on chain: ${chainId}, block: ${insertedLogs.map( + (log) => log.blockNumber, + )} after ${job.opts.delay / 1000}s.`, }); } }; diff --git a/src/worker/tasks/processTransactionReceiptsWorker.ts b/src/worker/tasks/processTransactionReceiptsWorker.ts index 3963a5f8e..b9ced0efe 100644 --- a/src/worker/tasks/processTransactionReceiptsWorker.ts +++ b/src/worker/tasks/processTransactionReceiptsWorker.ts @@ -127,6 +127,10 @@ const handler: Processor = async (job: Job) => { receipts, }); + if (insertedReceipts.length === 0) { + return; + } + // Enqueue webhooks. // This step should happen immediately after inserting to DB. for (const transactionReceipt of insertedReceipts) { @@ -142,13 +146,15 @@ const handler: Processor = async (job: Job) => { } // Any receipts inserted in a delayed job indicates missed receipts in the realtime job. - if (job.delay > 0) { + if (job.opts.delay && job.opts.delay > 0) { logger({ service: "worker", level: "warn", - message: `Found ${insertedReceipts.length} receipts on ${chainId} after ${ - job.delay / 1000 - }s.`, + message: `Found ${ + insertedReceipts.length + } receipts on chain: ${chainId}, block: ${insertedReceipts.map( + (receipt) => receipt.blockNumber, + )} after ${job.delay / 1000}s.`, }); } };