diff --git a/src/controllers/signAccountOp/signAccountOp.ts b/src/controllers/signAccountOp/signAccountOp.ts index 8c244d83b..26cd5ee22 100644 --- a/src/controllers/signAccountOp/signAccountOp.ts +++ b/src/controllers/signAccountOp/signAccountOp.ts @@ -1,5 +1,6 @@ import { ethers, JsonRpcProvider } from 'ethers' +import { schemas } from 'libs/schemaValidation/validateScehmas' import AmbireAccount from '../../../contracts/compiled/AmbireAccount.json' import EntryPointAbi from '../../../contracts/compiled/EntryPoint.json' import ERC20 from '../../../contracts/compiled/IERC20.json' @@ -651,6 +652,15 @@ export class SignAccountOpController extends EventEmitter { } ) if (response.success) { + const isValid = schemas.RelayerResponsePaymasterSign(response.data) + if (!isValid) { + this.emitError({ + level: 'minor', + message: 'Error submit signature to paymaster/sign. Please contact support.', + error: new Error(schemas.RelayerResponsePaymasterSign.errors) + }) + return null + } userOperation.paymasterAndData = response.data.paymasterAndData // after getting the paymaster data, if we're in the edge case, diff --git a/src/interfaces/accountOp.ts b/src/interfaces/accountOp.ts new file mode 100644 index 000000000..0a2b72b2b --- /dev/null +++ b/src/interfaces/accountOp.ts @@ -0,0 +1,4 @@ +export interface RelayerResponsePaymasterSign { + data: { paymasterAndData: any } + errorState: any[] +} diff --git a/src/libs/schemaValidation/generateSchemas.ts b/src/libs/schemaValidation/generateSchemas.ts index 144c6f57c..e24dbb512 100644 --- a/src/libs/schemaValidation/generateSchemas.ts +++ b/src/libs/schemaValidation/generateSchemas.ts @@ -16,7 +16,8 @@ const source = TJS.getProgramFromFiles( [ resolve('src', 'interfaces', 'emailVault.ts'), resolve('src', 'interfaces', 'account.ts'), - resolve('src', 'interfaces', 'portfolio.ts') + resolve('src', 'interfaces', 'portfolio.ts'), + resolve('src', 'interfaces', 'accountOp.ts') ], COMPILER_OPTIONS, __dirname @@ -30,7 +31,8 @@ const allInterfaces = [ 'RecoveryKey', 'EmailVaultData', 'RelayerResponseLinkedAccount', - 'RelayerReponsePortfolioAdditional' + 'RelayerReponsePortfolioAdditional', + 'RelayerResponsePaymasterSign' ] allInterfaces.forEach((interfaceName) => { diff --git a/src/libs/schemaValidation/schemas/RelayerResponsePaymasterSign.json b/src/libs/schemaValidation/schemas/RelayerResponsePaymasterSign.json new file mode 100644 index 000000000..cdb4c2dd3 --- /dev/null +++ b/src/libs/schemaValidation/schemas/RelayerResponsePaymasterSign.json @@ -0,0 +1,23 @@ +{ + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "paymasterAndData": {} + }, + "required": [ + "paymasterAndData" + ] + }, + "errorState": { + "type": "array", + "items": {} + } + }, + "required": [ + "data", + "errorState" + ], + "$schema": "http://json-schema.org/draft-07/schema#" +} \ No newline at end of file diff --git a/src/libs/schemaValidation/validateScehmas.ts b/src/libs/schemaValidation/validateScehmas.ts index f4552cd15..2e3ecc943 100644 --- a/src/libs/schemaValidation/validateScehmas.ts +++ b/src/libs/schemaValidation/validateScehmas.ts @@ -10,5 +10,6 @@ export const schemas: any = { RelayerResponseLinkedAccount: ajv.compile(require('./schemas/RelayerResponseLinkedAccount.json')), RelayerReponsePortfolioAdditional: ajv.compile( require('./schemas/RelayerReponsePortfolioAdditional.json') - ) + ), + RelayerResponsePaymasterSign: ajv.compile(require('./schemas/RelayerResponsePaymasterSign.json')) } diff --git a/src/libs/schemaValidation/validation.test.ts b/src/libs/schemaValidation/validation.test.ts index 14eda9328..282913327 100644 --- a/src/libs/schemaValidation/validation.test.ts +++ b/src/libs/schemaValidation/validation.test.ts @@ -33,6 +33,9 @@ const data = { errors: [new Error('asd')] } ] + }, + RelayerResponsePaymasterSign: { + correct: [{ data: { paymasterAndData: 'paymasterAndData' }, errorState: [] }] } } @@ -42,4 +45,9 @@ describe('Describe', () => { expect(res).toBeTruthy() expect(schemas.EmailVaultData.errors).toBeNull() }) + test('RelayerResponsePaymasterSign', () => { + const res = schemas.RelayerResponsePaymasterSign(data.RelayerResponsePaymasterSign.correct[0]) + expect(res).toBeTruthy() + expect(schemas.RelayerResponsePaymasterSign.errors).toBeNull() + }) })