diff --git a/packages/relayer/src/rpc-relayer/relayer.gen.ts b/packages/relayer/src/rpc-relayer/relayer.gen.ts index 27714d417..0a2dfb51f 100644 --- a/packages/relayer/src/rpc-relayer/relayer.gen.ts +++ b/packages/relayer/src/rpc-relayer/relayer.gen.ts @@ -1,10 +1,14 @@ /* eslint-disable */ -// sequence-relayer v0.4.1 dd95e21fa884c6564199bc3dd5f588534827ffe2 +// sequence-relayer v0.4.1 9c42435ea10493aecdfbbecb2be284b8dd721539 // -- -// Code generated by webrpc-gen@v0.20.3 with typescript generator. DO NOT EDIT. +// Code generated by webrpc-gen@v0.22.0 with typescript generator. DO NOT EDIT. // // webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.22.0;gen-typescript@v0.16.1;sequence-relayer@v0.4.1' + // WebRPC description and code-gen version export const WebRPCVersion = 'v1' @@ -12,7 +16,55 @@ export const WebRPCVersion = 'v1' export const WebRPCSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = 'dd95e21fa884c6564199bc3dd5f588534827ffe2' +export const WebRPCSchemaHash = '9c42435ea10493aecdfbbecb2be284b8dd721539' + +type WebrpcGenVersions = { + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} + +export function VersionFromHeader(headers: Headers): WebrpcGenVersions { + const headerValue = headers.get(WebrpcHeader) + if (!headerValue) { + return { + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '' + } + } + + return parseWebrpcGenVersions(headerValue) +} + +function parseWebrpcGenVersions(header: string): WebrpcGenVersions { + const versions = header.split(';') + if (versions.length < 3) { + return { + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '' + } + } + + const [_, webrpcGenVersion] = versions[0].split('@') + const [codeGenName, codeGenVersion] = versions[1].split('@') + const [schemaName, schemaVersion] = versions[2].split('@') + + return { + webrpcGenVersion, + codeGenName, + codeGenVersion, + schemaName, + schemaVersion + } +} // // Types @@ -162,6 +214,7 @@ export interface MetaTxnLog { gasFeeMarkup?: number usdRate: string creditsUsed: number + cost: string isWhitelisted: boolean gasSponsor?: number gasTank?: number @@ -285,17 +338,6 @@ export interface Relayer { getGasTank(args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise addGasTank(args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise updateGasTank(args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise - getGasSponsor(args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - addressGasSponsors(args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise - listGasSponsors(args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise - addGasSponsor(args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - updateGasSponsor(args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - removeGasSponsor(args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise - reportGasSponsorUsage( - args: ReportGasSponsorUsageArgs, - headers?: object, - signal?: AbortSignal - ): Promise nextGasTankBalanceAdjustmentNonce( args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, @@ -316,6 +358,12 @@ export interface Relayer { headers?: object, signal?: AbortSignal ): Promise + listGasSponsors(args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + getGasSponsor(args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + addGasSponsor(args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + updateGasSponsor(args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + removeGasSponsor(args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + addressGasSponsors(args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise getProjectBalance(args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise adjustProjectBalance( args: AdjustProjectBalanceArgs, @@ -480,25 +528,42 @@ export interface UpdateGasTankReturn { status: boolean gasTank: GasTank } -export interface GetGasSponsorArgs { +export interface NextGasTankBalanceAdjustmentNonceArgs { id: number } -export interface GetGasSponsorReturn { - gasSponsor: GasSponsor +export interface NextGasTankBalanceAdjustmentNonceReturn { + nonce: number } -export interface AddressGasSponsorsArgs { - address: string +export interface AdjustGasTankBalanceArgs { + id: number + nonce: number + amount: number +} + +export interface AdjustGasTankBalanceReturn { + status: boolean + adjustment: GasTankBalanceAdjustment +} +export interface GetGasTankBalanceAdjustmentArgs { + id: number + nonce: number +} + +export interface GetGasTankBalanceAdjustmentReturn { + adjustment: GasTankBalanceAdjustment +} +export interface ListGasTankBalanceAdjustmentsArgs { + id: number page?: Page } -export interface AddressGasSponsorsReturn { +export interface ListGasTankBalanceAdjustmentsReturn { page: Page - gasSponsors: Array + adjustments: Array } export interface ListGasSponsorsArgs { projectId: number - gasTankId: number page?: Page } @@ -506,9 +571,16 @@ export interface ListGasSponsorsReturn { page: Page gasSponsors: Array } +export interface GetGasSponsorArgs { + projectId: number + id: number +} + +export interface GetGasSponsorReturn { + gasSponsor: GasSponsor +} export interface AddGasSponsorArgs { projectId: number - gasTankId: number address: string name?: string active?: boolean @@ -519,6 +591,7 @@ export interface AddGasSponsorReturn { gasSponsor: GasSponsor } export interface UpdateGasSponsorArgs { + projectId: number id: number name?: string active?: boolean @@ -529,55 +602,21 @@ export interface UpdateGasSponsorReturn { gasSponsor: GasSponsor } export interface RemoveGasSponsorArgs { - id: number -} - -export interface RemoveGasSponsorReturn { - status: boolean -} -export interface ReportGasSponsorUsageArgs { projectId: number - gasTankId: number - startTime?: string - endTime?: string -} - -export interface ReportGasSponsorUsageReturn { - gasSponsorUsage: Array -} -export interface NextGasTankBalanceAdjustmentNonceArgs { id: number } -export interface NextGasTankBalanceAdjustmentNonceReturn { - nonce: number -} -export interface AdjustGasTankBalanceArgs { - id: number - nonce: number - amount: number -} - -export interface AdjustGasTankBalanceReturn { +export interface RemoveGasSponsorReturn { status: boolean - adjustment: GasTankBalanceAdjustment -} -export interface GetGasTankBalanceAdjustmentArgs { - id: number - nonce: number } - -export interface GetGasTankBalanceAdjustmentReturn { - adjustment: GasTankBalanceAdjustment -} -export interface ListGasTankBalanceAdjustmentsArgs { - id: number +export interface AddressGasSponsorsArgs { + address: string page?: Page } -export interface ListGasTankBalanceAdjustmentsReturn { +export interface AddressGasSponsorsReturn { page: Page - adjustments: Array + gasSponsors: Array } export interface GetProjectBalanceArgs { projectId: number @@ -942,32 +981,16 @@ export class Relayer implements Relayer { ) } - getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return { - gasSponsor: _data.gasSponsor - } - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - } - ) - } - - addressGasSponsors = ( - args: AddressGasSponsorsArgs, + nextGasTankBalanceAdjustmentNonce = ( + args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { - page: _data.page, - gasSponsors: >_data.gasSponsors + nonce: _data.nonce } }) }, @@ -977,13 +1000,17 @@ export class Relayer implements Relayer { ) } - listGasSponsors = (args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + adjustGasTankBalance = ( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { - page: _data.page, - gasSponsors: >_data.gasSponsors + status: _data.status, + adjustment: _data.adjustment } }) }, @@ -993,13 +1020,16 @@ export class Relayer implements Relayer { ) } - addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + getGasTankBalanceAdjustment = ( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { - status: _data.status, - gasSponsor: _data.gasSponsor + adjustment: _data.adjustment } }) }, @@ -1009,13 +1039,17 @@ export class Relayer implements Relayer { ) } - updateGasSponsor = (args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + listGasTankBalanceAdjustments = ( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { - status: _data.status, - gasSponsor: _data.gasSponsor + page: _data.page, + adjustments: >_data.adjustments } }) }, @@ -1025,12 +1059,13 @@ export class Relayer implements Relayer { ) } - removeGasSponsor = (args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + listGasSponsors = (args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { - status: _data.status + page: _data.page, + gasSponsors: >_data.gasSponsors } }) }, @@ -1040,16 +1075,12 @@ export class Relayer implements Relayer { ) } - reportGasSponsorUsage = ( - args: ReportGasSponsorUsageArgs, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('ReportGasSponsorUsage'), createHTTPRequest(args, headers, signal)).then( + getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { - gasSponsorUsage: >_data.gasSponsorUsage + gasSponsor: _data.gasSponsor } }) }, @@ -1059,16 +1090,13 @@ export class Relayer implements Relayer { ) } - nextGasTankBalanceAdjustmentNonce = ( - args: NextGasTankBalanceAdjustmentNonceArgs, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { - nonce: _data.nonce + status: _data.status, + gasSponsor: _data.gasSponsor } }) }, @@ -1078,17 +1106,13 @@ export class Relayer implements Relayer { ) } - adjustGasTankBalance = ( - args: AdjustGasTankBalanceArgs, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + updateGasSponsor = (args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { status: _data.status, - adjustment: _data.adjustment + gasSponsor: _data.gasSponsor } }) }, @@ -1098,16 +1122,12 @@ export class Relayer implements Relayer { ) } - getGasTankBalanceAdjustment = ( - args: GetGasTankBalanceAdjustmentArgs, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + removeGasSponsor = (args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { - adjustment: _data.adjustment + status: _data.status } }) }, @@ -1117,17 +1137,17 @@ export class Relayer implements Relayer { ) } - listGasTankBalanceAdjustments = ( - args: ListGasTankBalanceAdjustmentsArgs, + addressGasSponsors = ( + args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( res => { return buildResponse(res).then(_data => { return { page: _data.page, - adjustments: >_data.adjustments + gasSponsors: >_data.gasSponsors } }) }, @@ -1173,9 +1193,12 @@ export class Relayer implements Relayer { } const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } + reqHeaders[WebrpcHeader] = WebrpcHeaderValue + return { method: 'POST', - headers: { ...headers, 'Content-Type': 'application/json' }, + headers: reqHeaders, body: JSON.stringify(body || {}), signal } @@ -1407,6 +1430,19 @@ export class PermissionDeniedError extends WebrpcError { } } +export class SessionExpiredError extends WebrpcError { + constructor( + name: string = 'SessionExpired', + code: number = 1002, + message: string = 'Session expired', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, SessionExpiredError.prototype) + } +} + export class MethodNotFoundError extends WebrpcError { constructor( name: string = 'MethodNotFound', @@ -1459,6 +1495,175 @@ export class GeoblockedError extends WebrpcError { } } +export class RateLimitedError extends WebrpcError { + constructor( + name: string = 'RateLimited', + code: number = 1007, + message: string = 'Rate-limited. Please slow down.', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, RateLimitedError.prototype) + } +} + +export class ProjectNotFoundError extends WebrpcError { + constructor( + name: string = 'ProjectNotFound', + code: number = 1008, + message: string = 'Project not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ProjectNotFoundError.prototype) + } +} + +export class AccessKeyNotFoundError extends WebrpcError { + constructor( + name: string = 'AccessKeyNotFound', + code: number = 1101, + message: string = 'Access key not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) + } +} + +export class AccessKeyMismatchError extends WebrpcError { + constructor( + name: string = 'AccessKeyMismatch', + code: number = 1102, + message: string = 'Access key mismatch', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) + } +} + +export class InvalidOriginError extends WebrpcError { + constructor( + name: string = 'InvalidOrigin', + code: number = 1103, + message: string = 'Invalid origin for Access Key', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidOriginError.prototype) + } +} + +export class InvalidServiceError extends WebrpcError { + constructor( + name: string = 'InvalidService', + code: number = 1104, + message: string = 'Service not enabled for Access key', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidServiceError.prototype) + } +} + +export class UnauthorizedUserError extends WebrpcError { + constructor( + name: string = 'UnauthorizedUser', + code: number = 1105, + message: string = 'Unauthorized user', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedUserError.prototype) + } +} + +export class QuotaExceededError extends WebrpcError { + constructor( + name: string = 'QuotaExceeded', + code: number = 1200, + message: string = 'Quota request exceeded', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QuotaExceededError.prototype) + } +} + +export class QuotaRateLimitError extends WebrpcError { + constructor( + name: string = 'QuotaRateLimit', + code: number = 1201, + message: string = 'Quota rate limit exceeded', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QuotaRateLimitError.prototype) + } +} + +export class NoDefaultKeyError extends WebrpcError { + constructor( + name: string = 'NoDefaultKey', + code: number = 1300, + message: string = 'No default access key found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NoDefaultKeyError.prototype) + } +} + +export class MaxAccessKeysError extends WebrpcError { + constructor( + name: string = 'MaxAccessKeys', + code: number = 1301, + message: string = 'Access keys limit reached', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, MaxAccessKeysError.prototype) + } +} + +export class AtLeastOneKeyError extends WebrpcError { + constructor( + name: string = 'AtLeastOneKey', + code: number = 1302, + message: string = 'You need at least one Access Key', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) + } +} + +export class TimeoutError extends WebrpcError { + constructor( + name: string = 'Timeout', + code: number = 1900, + message: string = 'Request timed out', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, TimeoutError.prototype) + } +} + export class InvalidArgumentError extends WebrpcError { constructor( name: string = 'InvalidArgument', @@ -1538,10 +1743,24 @@ export enum errors { WebrpcStreamFinished = 'WebrpcStreamFinished', Unauthorized = 'Unauthorized', PermissionDenied = 'PermissionDenied', + SessionExpired = 'SessionExpired', MethodNotFound = 'MethodNotFound', RequestConflict = 'RequestConflict', Aborted = 'Aborted', Geoblocked = 'Geoblocked', + RateLimited = 'RateLimited', + ProjectNotFound = 'ProjectNotFound', + AccessKeyNotFound = 'AccessKeyNotFound', + AccessKeyMismatch = 'AccessKeyMismatch', + InvalidOrigin = 'InvalidOrigin', + InvalidService = 'InvalidService', + UnauthorizedUser = 'UnauthorizedUser', + QuotaExceeded = 'QuotaExceeded', + QuotaRateLimit = 'QuotaRateLimit', + NoDefaultKey = 'NoDefaultKey', + MaxAccessKeys = 'MaxAccessKeys', + AtLeastOneKey = 'AtLeastOneKey', + Timeout = 'Timeout', InvalidArgument = 'InvalidArgument', Unavailable = 'Unavailable', QueryFailed = 'QueryFailed', @@ -1549,7 +1768,46 @@ export enum errors { InsufficientFee = 'InsufficientFee' } -const webrpcErrorByCode: { [code: number]: any } = { +export enum WebrpcErrorCodes { + WebrpcEndpoint = 0, + WebrpcRequestFailed = -1, + WebrpcBadRoute = -2, + WebrpcBadMethod = -3, + WebrpcBadRequest = -4, + WebrpcBadResponse = -5, + WebrpcServerPanic = -6, + WebrpcInternalError = -7, + WebrpcClientDisconnected = -8, + WebrpcStreamLost = -9, + WebrpcStreamFinished = -10, + Unauthorized = 1000, + PermissionDenied = 1001, + SessionExpired = 1002, + MethodNotFound = 1003, + RequestConflict = 1004, + Aborted = 1005, + Geoblocked = 1006, + RateLimited = 1007, + ProjectNotFound = 1008, + AccessKeyNotFound = 1101, + AccessKeyMismatch = 1102, + InvalidOrigin = 1103, + InvalidService = 1104, + UnauthorizedUser = 1105, + QuotaExceeded = 1200, + QuotaRateLimit = 1201, + NoDefaultKey = 1300, + MaxAccessKeys = 1301, + AtLeastOneKey = 1302, + Timeout = 1900, + InvalidArgument = 2001, + Unavailable = 2002, + QueryFailed = 2003, + NotFound = 3000, + InsufficientFee = 3004 +} + +export const webrpcErrorByCode: { [code: number]: any } = { [0]: WebrpcEndpointError, [-1]: WebrpcRequestFailedError, [-2]: WebrpcBadRouteError, @@ -1563,10 +1821,24 @@ const webrpcErrorByCode: { [code: number]: any } = { [-10]: WebrpcStreamFinishedError, [1000]: UnauthorizedError, [1001]: PermissionDeniedError, + [1002]: SessionExpiredError, [1003]: MethodNotFoundError, [1004]: RequestConflictError, [1005]: AbortedError, [1006]: GeoblockedError, + [1007]: RateLimitedError, + [1008]: ProjectNotFoundError, + [1101]: AccessKeyNotFoundError, + [1102]: AccessKeyMismatchError, + [1103]: InvalidOriginError, + [1104]: InvalidServiceError, + [1105]: UnauthorizedUserError, + [1200]: QuotaExceededError, + [1201]: QuotaRateLimitError, + [1300]: NoDefaultKeyError, + [1301]: MaxAccessKeysError, + [1302]: AtLeastOneKeyError, + [1900]: TimeoutError, [2001]: InvalidArgumentError, [2002]: UnavailableError, [2003]: QueryFailedError,