Skip to content

Commit

Permalink
PRO-2685 - Arka_Error_Handling (#132)
Browse files Browse the repository at this point in the history
* added error handling return messages

* updated package version
  • Loading branch information
vignesha22 authored Sep 17, 2024
1 parent e665416 commit 5a65399
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 46 deletions.
2 changes: 1 addition & 1 deletion backend/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "arka",
"version": "1.5.0",
"version": "1.5.1",
"description": "ARKA - (Albanian for Cashier's case) is the first open source Paymaster as a service software",
"type": "module",
"directories": {
Expand Down
14 changes: 12 additions & 2 deletions backend/src/paymaster/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,9 @@ export class Paymaster {

return returnValue;
} catch (err: any) {
if (log) log.error(err, 'signv07');
if (err.message.includes("Quota exceeded"))
throw new Error('Failed to process request to bundler since request Quota exceeded for the current apiKey')
if (log) log.error(err, 'signV07');
throw new Error('Failed to process request to bundler. Please contact support team RawErrorMsg:' + err.message)
}
}
Expand Down Expand Up @@ -166,10 +168,12 @@ export class Paymaster {

return returnValue;
} catch (err: any) {
if (err.message.includes("Quota exceeded"))
throw new Error('Failed to process request to bundler since request Quota exceeded for the current apiKey')
if (log) log.error(err, 'signV06');
throw new Error('Failed to process request to bundler. Please contact support team RawErrorMsg:' + err.message)
}
}
}

async getPaymasterAndDataForMultiTokenPaymaster(userOp: any, validUntil: string, validAfter: string, feeToken: string,
ethPrice: string, paymasterContract: Contract, signer: Wallet) {
Expand Down Expand Up @@ -238,6 +242,8 @@ export class Paymaster {

return returnValue;
} catch (err: any) {
if (err.message.includes("Quota exceeded"))
throw new Error('Failed to process request to bundler since request Quota exceeded for the current apiKey')
if (log) log.error(err, 'signCombinedPaymaster');
throw new Error('Failed to process request to bundler. Please contact support team RawErrorMsg:' + err.message)
}
Expand Down Expand Up @@ -287,6 +293,8 @@ export class Paymaster {
callGasLimit: response.callGasLimit,
};
} catch (err: any) {
if (err.message.includes("Quota exceeded"))
throw new Error('Failed to process request to bundler since request Quota exceeded for the current apiKey')
if (err.message.includes('The required token amount')) throw new Error(err.message);
if (log) log.error(err, 'pimlico');
throw new Error('Failed to process request to bundler. Please contact support team RawErrorMsg: ' + err.message)
Expand Down Expand Up @@ -356,6 +364,8 @@ export class Paymaster {

return returnValue;
} catch (err: any) {
if (err.message.includes("Quota exceeded"))
throw new Error('Failed to process request to bundler since request Quota exceeded for the current apiKey')
if (log) log.error(err, 'ERC20Paymaster');
throw new Error('Failed to process request to bundler. Please contact support team RawErrorMsg:' + err.message)
}
Expand Down
8 changes: 4 additions & 4 deletions backend/src/routes/deposit-route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ const depositRoutes: FastifyPluginAsync = async (server) => {
let privateKey = '';
let supportedNetworks;
let bundlerApiKey = api_key;
const apiKeyEntity: APIKey | null = await server.apiKeyRepository.findOneByApiKey(api_key);
if (!apiKeyEntity) return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
if (!unsafeMode) {
const AWSresponse = await client.send(
new GetSecretValueCommand({
Expand All @@ -70,8 +72,6 @@ const depositRoutes: FastifyPluginAsync = async (server) => {
privateKey = secrets['PRIVATE_KEY'];
supportedNetworks = secrets['SUPPORTED_NETWORKS'];
} else {
const apiKeyEntity: APIKey | null = await server.apiKeyRepository.findOneByApiKey(api_key);
if (!apiKeyEntity) return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
privateKey = decode(apiKeyEntity.privateKey, server.config.HMAC_SECRET);
supportedNetworks = apiKeyEntity.supportedNetworks;
if (apiKeyEntity.bundlerApiKey) {
Expand Down Expand Up @@ -117,6 +117,8 @@ const depositRoutes: FastifyPluginAsync = async (server) => {
let privateKey = '';
let supportedNetworks;
let bundlerApiKey = api_key;
const apiKeyEntity: APIKey | null = await server.apiKeyRepository.findOneByApiKey(api_key);
if (!apiKeyEntity) return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
if (!unsafeMode) {
const AWSresponse = await client.send(
new GetSecretValueCommand({
Expand All @@ -131,8 +133,6 @@ const depositRoutes: FastifyPluginAsync = async (server) => {
privateKey = secrets['PRIVATE_KEY'];
supportedNetworks = secrets['SUPPORTED_NETWORKS'];
} else {
const apiKeyEntity: APIKey | null = await server.apiKeyRepository.findOneByApiKey(api_key);
if (!apiKeyEntity) return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
privateKey = decode(apiKeyEntity.privateKey, server.config.HMAC_SECRET);
supportedNetworks = apiKeyEntity.supportedNetworks;
if (apiKeyEntity.bundlerApiKey) {
Expand Down
23 changes: 12 additions & 11 deletions backend/src/routes/metadata-routes.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
import { FastifyPluginAsync } from "fastify";
import { Contract, Wallet, providers } from "ethers";
Expand Down Expand Up @@ -37,13 +38,18 @@ const metadataRoutes: FastifyPluginAsync = async (server) => {
if (!api_key)
return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
if (!chainId)
return reply.code(ReturnCode.FAILURE).send({error: ErrorMessage.INVALID_DATA})
return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_DATA })
let customPaymasters = [];
let multiTokenPaymasters = [];
let privateKey = '';
let supportedNetworks;
let sponsorName = '', sponsorImage = '';
let bundlerApiKey = api_key;
const apiKeyEntity: APIKey | null = await server.apiKeyRepository.findOneByApiKey(api_key);
if (!apiKeyEntity) {
server.log.info("Invalid Api Key provided")
return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
}
if (!unsafeMode) {
const AWSresponse = await client.send(
new GetSecretValueCommand({
Expand All @@ -61,7 +67,7 @@ const metadataRoutes: FastifyPluginAsync = async (server) => {
}
if (secrets['MULTI_TOKEN_PAYMASTERS']) {
const buffer = Buffer.from(secrets['MULTI_TOKEN_PAYMASTERS'], 'base64');
multiTokenPaymasters = JSON.parse(buffer.toString());
multiTokenPaymasters = JSON.parse(buffer.toString());
}
if (secrets['BUNDLER_API_KEY']) {
bundlerApiKey = secrets['BUNDLER_API_KEY'];
Expand All @@ -71,18 +77,13 @@ const metadataRoutes: FastifyPluginAsync = async (server) => {
privateKey = secrets['PRIVATE_KEY'];
supportedNetworks = secrets['SUPPORTED_NETWORKS'];
} else {
const apiKeyEntity: APIKey | null = await server.apiKeyRepository.findOneByApiKey(api_key);
if (!apiKeyEntity) {
server.log.info("Invalid Api Key provided")
return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
}
if (apiKeyEntity.erc20Paymasters) {
const buffer = Buffer.from(apiKeyEntity.erc20Paymasters, 'base64');
customPaymasters = JSON.parse(buffer.toString());
}
if (apiKeyEntity.multiTokenPaymasters) {
const buffer = Buffer.from(apiKeyEntity.multiTokenPaymasters, 'base64');
multiTokenPaymasters = JSON.parse(buffer.toString());
multiTokenPaymasters = JSON.parse(buffer.toString());
}
if (apiKeyEntity.bundlerApiKey) {
bundlerApiKey = apiKeyEntity.bundlerApiKey;
Expand All @@ -108,16 +109,16 @@ const metadataRoutes: FastifyPluginAsync = async (server) => {
const paymasterContract = new Contract(networkConfig.contracts.etherspotPaymasterAddress, EtherspotAbi.default, provider);
const sponsorBalance = await paymasterContract.getSponsorBalance(sponsorAddress);

const chainsSupported: {chainId: number, entryPoint: string}[] = [];
const chainsSupported: { chainId: number, entryPoint: string }[] = [];
if (supportedNetworks) {
const buffer = Buffer.from(supportedNetworks, 'base64');
const SUPPORTED_NETWORKS = JSON.parse(buffer.toString())
SUPPORTED_NETWORKS.map((element: { chainId: number, entryPoint: string }) => {
chainsSupported.push({chainId: element.chainId, entryPoint: element.entryPoint});
chainsSupported.push({ chainId: element.chainId, entryPoint: element.entryPoint });
})
} else {
SupportedNetworks.map(element => {
chainsSupported.push({chainId: element.chainId, entryPoint: element.entryPoint});
chainsSupported.push({ chainId: element.chainId, entryPoint: element.entryPoint });
})
}
const tokenPaymasterAddresses = {
Expand Down
17 changes: 9 additions & 8 deletions backend/src/routes/paymaster-routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,14 @@ const paymasterRoutes: FastifyPluginAsync = async (server) => {
let sponsorName = '', sponsorImage = '';
let contractWhitelistMode = false;
let bundlerApiKey = api_key;

const apiKeyEntity = await server.apiKeyRepository.findOneByApiKey(api_key);

if (!apiKeyEntity) {
server.log.error("APIKey not configured in database")
return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
}

if (!unsafeMode) {
const AWSresponse = await client.send(
new GetSecretValueCommand({
Expand Down Expand Up @@ -136,13 +144,6 @@ const paymasterRoutes: FastifyPluginAsync = async (server) => {
return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY })
}

const apiKeyEntity = await server.apiKeyRepository.findOneByApiKey(api_key);

if (!apiKeyEntity) {
server.log.error("APIKey not configured in database")
return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.API_KEY_NOT_CONFIGURED_IN_DATABASE })
}

if (apiKeyEntity.erc20Paymasters) {
const buffer = Buffer.from(apiKeyEntity.erc20Paymasters, 'base64');
customPaymasters = JSON.parse(buffer.toString());
Expand Down Expand Up @@ -327,9 +328,9 @@ const paymasterRoutes: FastifyPluginAsync = async (server) => {
return reply.code(ReturnCode.SUCCESS).send({ jsonrpc: body.jsonrpc, id: body.id, result, error: null })
return reply.code(ReturnCode.SUCCESS).send(result);
} catch (err: any) {
request.log.error(err);
if (err.name == "ResourceNotFoundException")
return reply.code(ReturnCode.FAILURE).send({ error: ErrorMessage.INVALID_API_KEY });
request.log.error(err);
return reply.code(ReturnCode.FAILURE).send({ error: err.message ?? ErrorMessage.FAILED_TO_PROCESS });
}
}
Expand Down
Loading

0 comments on commit 5a65399

Please sign in to comment.