From 04d7ebba7f6dc27b20895fdf2b6ce28288d0623a Mon Sep 17 00:00:00 2001 From: Carmen Liu Date: Tue, 18 Jul 2023 14:39:12 +0800 Subject: [PATCH] send transaction guardian integration --- packages/internal/guardian/src/client/base.ts | 7 +- .../internal/guardian/src/client/common.ts | 8 +- .../guardian/src/client/domain/default-api.ts | 166 ------------------ .../client/domain/starkex-transactions-api.ts | 11 +- .../src/client/domain/transactions-api.ts | 39 ++-- .../guardian/src/client/models/index.ts | 4 +- .../client/models/meta-transaction-data.ts | 23 +++ .../src/client/models/meta-transaction.ts | 63 +++++++ ...transaction-validate-reponse-definition.ts | 44 ----- .../models/transaction-approval-request.ts | 4 +- ...ion-evaluation-request-transaction-data.ts | 36 ---- .../models/transaction-evaluation-request.ts | 8 +- .../models/transaction-evaluation-response.ts | 6 + .../client/models/zk-evm-transaction-data.ts | 45 +++++ ...ion-evaluation-request-transaction-data.ts | 36 ---- .../zk-evm-transaction-evaluation-request.ts | 25 ++- .../passport/sdk/src/Passport.int.test.ts | 1 + packages/passport/sdk/src/mocks/zkEvm/msw.ts | 5 + .../rpcMethods/eth_sendTransaction.test.ts | 97 ++++++++-- .../zkEvm/rpcMethods/eth_sendTransaction.ts | 23 ++- .../sdk/src/zkEvm/rpcMethods/types.ts | 2 + .../passport/sdk/src/zkEvm/zkEvmProvider.ts | 9 + 22 files changed, 325 insertions(+), 337 deletions(-) delete mode 100644 packages/internal/guardian/src/client/domain/default-api.ts create mode 100644 packages/internal/guardian/src/client/models/meta-transaction-data.ts create mode 100644 packages/internal/guardian/src/client/models/meta-transaction.ts delete mode 100644 packages/internal/guardian/src/client/models/stark-ex-transaction-validate-reponse-definition.ts delete mode 100644 packages/internal/guardian/src/client/models/transaction-evaluation-request-transaction-data.ts create mode 100644 packages/internal/guardian/src/client/models/zk-evm-transaction-data.ts delete mode 100644 packages/internal/guardian/src/client/models/zk-evm-transaction-evaluation-request-transaction-data.ts diff --git a/packages/internal/guardian/src/client/base.ts b/packages/internal/guardian/src/client/base.ts index 41e0843a31..e899ec57d0 100644 --- a/packages/internal/guardian/src/client/base.ts +++ b/packages/internal/guardian/src/client/base.ts @@ -13,11 +13,10 @@ */ -import type { Configuration } from './configuration'; +import { Configuration } from "./configuration"; // Some imports not used depending on template conditions // @ts-ignore -import type { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; -import globalAxios from 'axios'; +import globalAxios, { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; export const BASE_PATH = "https://guardian.sandbox.imtbl.com".replace(/\/+$/, ""); @@ -65,8 +64,8 @@ export class BaseAPI { * @extends {Error} */ export class RequiredError extends Error { + name: "RequiredError" = "RequiredError"; constructor(public field: string, msg?: string) { super(msg); - this.name = "RequiredError" } } diff --git a/packages/internal/guardian/src/client/common.ts b/packages/internal/guardian/src/client/common.ts index 8ba76a2768..55e53a50e3 100644 --- a/packages/internal/guardian/src/client/common.ts +++ b/packages/internal/guardian/src/client/common.ts @@ -13,10 +13,9 @@ */ -import type { Configuration } from "./configuration"; -import type { RequestArgs } from "./base"; -import type { AxiosInstance, AxiosResponse } from 'axios'; -import { RequiredError } from "./base"; +import { Configuration } from "./configuration"; +import { RequiredError, RequestArgs } from "./base"; +import { AxiosInstance, AxiosResponse } from 'axios'; /** * @@ -85,7 +84,6 @@ export const setOAuthToObject = async function (object: any, name: string, scope } function setFlattenedQueryParams(urlSearchParams: URLSearchParams, parameter: any, key: string = ""): void { - if (parameter == null) return; if (typeof parameter === "object") { if (Array.isArray(parameter)) { (parameter as any[]).forEach(item => setFlattenedQueryParams(urlSearchParams, item, key)); diff --git a/packages/internal/guardian/src/client/domain/default-api.ts b/packages/internal/guardian/src/client/domain/default-api.ts deleted file mode 100644 index 62f2a12417..0000000000 --- a/packages/internal/guardian/src/client/domain/default-api.ts +++ /dev/null @@ -1,166 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Swagger Guardian - * Guardian API - * - * The version of the OpenAPI document: 1.0.0 - * Contact: support@immutable.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -import type { Configuration } from '../configuration'; -import type { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; -import globalAxios from 'axios'; -// Some imports not used depending on template conditions -// @ts-ignore -import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; -// @ts-ignore -import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base'; -// @ts-ignore -import { APIError403 } from '../models'; -// @ts-ignore -import { APIError404 } from '../models'; -// @ts-ignore -import { APIError500 } from '../models'; -// @ts-ignore -import { TransactionApprovalRequest } from '../models'; -/** - * DefaultApi - axios parameter creator - * @export - */ -export const DefaultApiAxiosParamCreator = function (configuration?: Configuration) { - return { - /** - * Approve a pending transaction - * @summary Approve a pending transaction given chain - * @param {string} payloadHash Hash for the payload - * @param {TransactionApprovalRequest} transactionApprovalRequest request body for approving a pending transactio - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - approvePendingTransaction: async (payloadHash: string, transactionApprovalRequest: TransactionApprovalRequest, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'payloadHash' is not null or undefined - assertParamExists('approvePendingTransaction', 'payloadHash', payloadHash) - // verify required parameter 'transactionApprovalRequest' is not null or undefined - assertParamExists('approvePendingTransaction', 'transactionApprovalRequest', transactionApprovalRequest) - const localVarPath = `/guardian/v1/transactions/{payloadHash}/approve` - .replace(`{${"payloadHash"}}`, encodeURIComponent(String(payloadHash))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerAuth required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(transactionApprovalRequest, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - } -}; - -/** - * DefaultApi - functional programming interface - * @export - */ -export const DefaultApiFp = function(configuration?: Configuration) { - const localVarAxiosParamCreator = DefaultApiAxiosParamCreator(configuration) - return { - /** - * Approve a pending transaction - * @summary Approve a pending transaction given chain - * @param {string} payloadHash Hash for the payload - * @param {TransactionApprovalRequest} transactionApprovalRequest request body for approving a pending transactio - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async approvePendingTransaction(payloadHash: string, transactionApprovalRequest: TransactionApprovalRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.approvePendingTransaction(payloadHash, transactionApprovalRequest, options); - return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); - }, - } -}; - -/** - * DefaultApi - factory interface - * @export - */ -export const DefaultApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { - const localVarFp = DefaultApiFp(configuration) - return { - /** - * Approve a pending transaction - * @summary Approve a pending transaction given chain - * @param {DefaultApiApprovePendingTransactionRequest} requestParameters Request parameters. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - approvePendingTransaction(requestParameters: DefaultApiApprovePendingTransactionRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.approvePendingTransaction(requestParameters.payloadHash, requestParameters.transactionApprovalRequest, options).then((request) => request(axios, basePath)); - }, - }; -}; - -/** - * Request parameters for approvePendingTransaction operation in DefaultApi. - * @export - * @interface DefaultApiApprovePendingTransactionRequest - */ -export interface DefaultApiApprovePendingTransactionRequest { - /** - * Hash for the payload - * @type {string} - * @memberof DefaultApiApprovePendingTransaction - */ - readonly payloadHash: string - - /** - * request body for approving a pending transactio - * @type {TransactionApprovalRequest} - * @memberof DefaultApiApprovePendingTransaction - */ - readonly transactionApprovalRequest: TransactionApprovalRequest -} - -/** - * DefaultApi - object-oriented interface - * @export - * @class DefaultApi - * @extends {BaseAPI} - */ -export class DefaultApi extends BaseAPI { - /** - * Approve a pending transaction - * @summary Approve a pending transaction given chain - * @param {DefaultApiApprovePendingTransactionRequest} requestParameters Request parameters. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof DefaultApi - */ - public approvePendingTransaction(requestParameters: DefaultApiApprovePendingTransactionRequest, options?: AxiosRequestConfig) { - return DefaultApiFp(this.configuration).approvePendingTransaction(requestParameters.payloadHash, requestParameters.transactionApprovalRequest, options).then((request) => request(this.axios, this.basePath)); - } -} diff --git a/packages/internal/guardian/src/client/domain/starkex-transactions-api.ts b/packages/internal/guardian/src/client/domain/starkex-transactions-api.ts index 7230130528..0dadc11b21 100644 --- a/packages/internal/guardian/src/client/domain/starkex-transactions-api.ts +++ b/packages/internal/guardian/src/client/domain/starkex-transactions-api.ts @@ -13,9 +13,8 @@ */ -import type { Configuration } from '../configuration'; -import type { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; -import globalAxios from 'axios'; +import globalAxios, { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; +import { Configuration } from '../configuration'; // Some imports not used depending on template conditions // @ts-ignore import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; @@ -107,13 +106,13 @@ export const StarkexTransactionsApiFactory = function (configuration?: Configura /** * Check if it is a valid transaction by payload hash * @summary Evaluate if it is an valid transaction - * @param {StarkexTransactionsApiEvaluateStarkexTransactionRequest} requestParameters Request parameters. + * @param {string} payloadHash Hash for the payload * @param {*} [options] Override http request option. * @deprecated * @throws {RequiredError} */ - evaluateStarkexTransaction(requestParameters: StarkexTransactionsApiEvaluateStarkexTransactionRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.evaluateStarkexTransaction(requestParameters.payloadHash, options).then((request) => request(axios, basePath)); + evaluateStarkexTransaction(payloadHash: string, options?: any): AxiosPromise { + return localVarFp.evaluateStarkexTransaction(payloadHash, options).then((request) => request(axios, basePath)); }, }; }; diff --git a/packages/internal/guardian/src/client/domain/transactions-api.ts b/packages/internal/guardian/src/client/domain/transactions-api.ts index 2f2acdb1d3..eb93e4fa04 100644 --- a/packages/internal/guardian/src/client/domain/transactions-api.ts +++ b/packages/internal/guardian/src/client/domain/transactions-api.ts @@ -13,9 +13,8 @@ */ -import type { Configuration } from '../configuration'; -import type { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; -import globalAxios from 'axios'; +import globalAxios, { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; +import { Configuration } from '../configuration'; // Some imports not used depending on template conditions // @ts-ignore import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; @@ -138,11 +137,11 @@ export const TransactionsApiAxiosParamCreator = function (configuration?: Config * @summary Info for a specific transaction * @param {string} transactionID The id of the starkex transaction to retrieve * @param {'starkex' | 'evm'} chainType roll up type - * @param {number} [chainID] ID of evm chain + * @param {string} [chainID] ID of evm chain * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getTransactionByID: async (transactionID: string, chainType: 'starkex' | 'evm', chainID?: number, options: AxiosRequestConfig = {}): Promise => { + getTransactionByID: async (transactionID: string, chainType: 'starkex' | 'evm', chainID?: string, options: AxiosRequestConfig = {}): Promise => { // verify required parameter 'transactionID' is not null or undefined assertParamExists('getTransactionByID', 'transactionID', transactionID) // verify required parameter 'chainType' is not null or undefined @@ -222,11 +221,11 @@ export const TransactionsApiFp = function(configuration?: Configuration) { * @summary Info for a specific transaction * @param {string} transactionID The id of the starkex transaction to retrieve * @param {'starkex' | 'evm'} chainType roll up type - * @param {number} [chainID] ID of evm chain + * @param {string} [chainID] ID of evm chain * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getTransactionByID(transactionID: string, chainType: 'starkex' | 'evm', chainID?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async getTransactionByID(transactionID: string, chainType: 'starkex' | 'evm', chainID?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getTransactionByID(transactionID, chainType, chainID, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -243,32 +242,36 @@ export const TransactionsApiFactory = function (configuration?: Configuration, b /** * Approve a pending transaction * @summary Approve a pending transaction given chain - * @param {TransactionsApiApprovePendingTransactionRequest} requestParameters Request parameters. + * @param {string} payloadHash Hash for the payload + * @param {TransactionApprovalRequest} transactionApprovalRequest request body for approving a pending transactio * @param {*} [options] Override http request option. * @throws {RequiredError} */ - approvePendingTransaction(requestParameters: TransactionsApiApprovePendingTransactionRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.approvePendingTransaction(requestParameters.payloadHash, requestParameters.transactionApprovalRequest, options).then((request) => request(axios, basePath)); + approvePendingTransaction(payloadHash: string, transactionApprovalRequest: TransactionApprovalRequest, options?: any): AxiosPromise { + return localVarFp.approvePendingTransaction(payloadHash, transactionApprovalRequest, options).then((request) => request(axios, basePath)); }, /** * Check if the transaction is valid by transaction ID for both StarkEx and EVM * @summary Evaluate a transaction - * @param {TransactionsApiEvaluateTransactionRequest} requestParameters Request parameters. + * @param {string} id Transaction identifier: payloadHash on StarkEx or EVM ID + * @param {TransactionEvaluationRequest} transactionEvaluationRequest Specifies the kind of transaction * @param {*} [options] Override http request option. * @throws {RequiredError} */ - evaluateTransaction(requestParameters: TransactionsApiEvaluateTransactionRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.evaluateTransaction(requestParameters.id, requestParameters.transactionEvaluationRequest, options).then((request) => request(axios, basePath)); + evaluateTransaction(id: string, transactionEvaluationRequest: TransactionEvaluationRequest, options?: any): AxiosPromise { + return localVarFp.evaluateTransaction(id, transactionEvaluationRequest, options).then((request) => request(axios, basePath)); }, /** * Get a transaction by payload hash * @summary Info for a specific transaction - * @param {TransactionsApiGetTransactionByIDRequest} requestParameters Request parameters. + * @param {string} transactionID The id of the starkex transaction to retrieve + * @param {'starkex' | 'evm'} chainType roll up type + * @param {string} [chainID] ID of evm chain * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getTransactionByID(requestParameters: TransactionsApiGetTransactionByIDRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.getTransactionByID(requestParameters.transactionID, requestParameters.chainType, requestParameters.chainID, options).then((request) => request(axios, basePath)); + getTransactionByID(transactionID: string, chainType: 'starkex' | 'evm', chainID?: string, options?: any): AxiosPromise { + return localVarFp.getTransactionByID(transactionID, chainType, chainID, options).then((request) => request(axios, basePath)); }, }; }; @@ -337,10 +340,10 @@ export interface TransactionsApiGetTransactionByIDRequest { /** * ID of evm chain - * @type {number} + * @type {string} * @memberof TransactionsApiGetTransactionByID */ - readonly chainID?: number + readonly chainID?: string } /** diff --git a/packages/internal/guardian/src/client/models/index.ts b/packages/internal/guardian/src/client/models/index.ts index bc59f4d426..3b7bbd4292 100644 --- a/packages/internal/guardian/src/client/models/index.ts +++ b/packages/internal/guardian/src/client/models/index.ts @@ -7,9 +7,11 @@ export * from './apierror404-all-of'; export * from './apierror500'; export * from './apierror500-all-of'; export * from './basic-apierror'; +export * from './meta-transaction'; +export * from './meta-transaction-data'; export * from './transaction'; export * from './transaction-approval-request'; export * from './transaction-evaluation-request'; export * from './transaction-evaluation-response'; +export * from './zk-evm-transaction-data'; export * from './zk-evm-transaction-evaluation-request'; -export * from './zk-evm-transaction-evaluation-request-transaction-data'; diff --git a/packages/internal/guardian/src/client/models/meta-transaction-data.ts b/packages/internal/guardian/src/client/models/meta-transaction-data.ts new file mode 100644 index 0000000000..082980b526 --- /dev/null +++ b/packages/internal/guardian/src/client/models/meta-transaction-data.ts @@ -0,0 +1,23 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Guardian + * Guardian API + * + * The version of the OpenAPI document: 1.0.0 + * Contact: support@immutable.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + + +/** + * @type MetaTransactionData + * @export + */ +export type MetaTransactionData = Array | string; + + diff --git a/packages/internal/guardian/src/client/models/meta-transaction.ts b/packages/internal/guardian/src/client/models/meta-transaction.ts new file mode 100644 index 0000000000..130a8608e8 --- /dev/null +++ b/packages/internal/guardian/src/client/models/meta-transaction.ts @@ -0,0 +1,63 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Guardian + * Guardian API + * + * The version of the OpenAPI document: 1.0.0 + * Contact: support@immutable.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +// May contain unused imports in some cases +// @ts-ignore +import { MetaTransactionData } from './meta-transaction-data'; + +/** + * + * @export + * @interface MetaTransaction + */ +export interface MetaTransaction { + /** + * Whether the transaction is a delegate call + * @type {boolean} + * @memberof MetaTransaction + */ + 'delegateCall': boolean; + /** + * Whether to revert on error + * @type {boolean} + * @memberof MetaTransaction + */ + 'revertOnError': boolean; + /** + * The gas limit for the transaction + * @type {number} + * @memberof MetaTransaction + */ + 'gasLimit': number; + /** + * The SM target address of the transaction + * @type {string} + * @memberof MetaTransaction + */ + 'target': string; + /** + * The value of the transaction + * @type {string} + * @memberof MetaTransaction + */ + 'value': string; + /** + * + * @type {MetaTransactionData} + * @memberof MetaTransaction + */ + 'data': MetaTransactionData; +} + diff --git a/packages/internal/guardian/src/client/models/stark-ex-transaction-validate-reponse-definition.ts b/packages/internal/guardian/src/client/models/stark-ex-transaction-validate-reponse-definition.ts deleted file mode 100644 index 218e04870e..0000000000 --- a/packages/internal/guardian/src/client/models/stark-ex-transaction-validate-reponse-definition.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Swagger Guardian - * Guardian API - * - * The version of the OpenAPI document: 1.0.0 - * Contact: support@immutable.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * - * @export - * @interface StarkExTransactionValidateReponseDefinition - */ -export interface StarkExTransactionValidateReponseDefinition { - /** - * - * @type {boolean} - * @memberof StarkExTransactionValidateReponseDefinition - */ - 'confirmationRequired': boolean; - /** - * - * @type {string} - * @memberof StarkExTransactionValidateReponseDefinition - */ - 'confirmationMethod'?: StarkExTransactionValidateReponseDefinitionConfirmationMethodEnum; -} - -export const StarkExTransactionValidateReponseDefinitionConfirmationMethodEnum = { - Otp: 'otp', - Web: 'web' -} as const; - -export type StarkExTransactionValidateReponseDefinitionConfirmationMethodEnum = typeof StarkExTransactionValidateReponseDefinitionConfirmationMethodEnum[keyof typeof StarkExTransactionValidateReponseDefinitionConfirmationMethodEnum]; - - diff --git a/packages/internal/guardian/src/client/models/transaction-approval-request.ts b/packages/internal/guardian/src/client/models/transaction-approval-request.ts index e08ec54e7f..2f988aa5c9 100644 --- a/packages/internal/guardian/src/client/models/transaction-approval-request.ts +++ b/packages/internal/guardian/src/client/models/transaction-approval-request.ts @@ -22,10 +22,10 @@ export interface TransactionApprovalRequest { /** * rollup chain ID - * @type {number} + * @type {string} * @memberof TransactionApprovalRequest */ - 'chainID': number; + 'chainID'?: string; /** * chain type * @type {string} diff --git a/packages/internal/guardian/src/client/models/transaction-evaluation-request-transaction-data.ts b/packages/internal/guardian/src/client/models/transaction-evaluation-request-transaction-data.ts deleted file mode 100644 index cfd12c20fb..0000000000 --- a/packages/internal/guardian/src/client/models/transaction-evaluation-request-transaction-data.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Guardian - * Guardian API - * - * The version of the OpenAPI document: 1.0.0 - * Contact: support@immutable.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * Data specific to EVM transactions - * @export - * @interface TransactionEvaluationRequestTransactionData - */ -export interface TransactionEvaluationRequestTransactionData { - /** - * Smart contract wallet address that wants to execute this transaction - * @type {string} - * @memberof TransactionEvaluationRequestTransactionData - */ - 'to'?: string; - /** - * Encoded data for calling the `execute()` function on the SCW - * @type {string} - * @memberof TransactionEvaluationRequestTransactionData - */ - 'data'?: string; -} - diff --git a/packages/internal/guardian/src/client/models/transaction-evaluation-request.ts b/packages/internal/guardian/src/client/models/transaction-evaluation-request.ts index 1b437a45ee..e39ddb8889 100644 --- a/packages/internal/guardian/src/client/models/transaction-evaluation-request.ts +++ b/packages/internal/guardian/src/client/models/transaction-evaluation-request.ts @@ -15,13 +15,15 @@ // May contain unused imports in some cases // @ts-ignore -import { ZkEvmTransactionEvaluationRequest } from './zk-evm-transaction-evaluation-request'; +import { ZkEvmTransactionData } from './zk-evm-transaction-data'; // May contain unused imports in some cases // @ts-ignore -import { ZkEvmTransactionEvaluationRequestTransactionData } from './zk-evm-transaction-evaluation-request-transaction-data'; +import { ZkEvmTransactionEvaluationRequest } from './zk-evm-transaction-evaluation-request'; /** * @type TransactionEvaluationRequest * @export */ -export type TransactionEvaluationRequest = { chainType: 'evm' } & ZkEvmTransactionEvaluationRequest | { chainType: 'starkex' }; +export type TransactionEvaluationRequest = { chainType: 'evm' } & ZkEvmTransactionEvaluationRequest | { chainType: 'starkex' } & StarkExTransactionEvaluationRequest; + + diff --git a/packages/internal/guardian/src/client/models/transaction-evaluation-response.ts b/packages/internal/guardian/src/client/models/transaction-evaluation-response.ts index e200bdb76a..553437f7fd 100644 --- a/packages/internal/guardian/src/client/models/transaction-evaluation-response.ts +++ b/packages/internal/guardian/src/client/models/transaction-evaluation-response.ts @@ -32,6 +32,12 @@ export interface TransactionEvaluationResponse { * @memberof TransactionEvaluationResponse */ 'confirmationMethod'?: TransactionEvaluationResponseConfirmationMethodEnum; + /** + * + * @type {string} + * @memberof TransactionEvaluationResponse + */ + 'transactionId'?: string; } export const TransactionEvaluationResponseConfirmationMethodEnum = { diff --git a/packages/internal/guardian/src/client/models/zk-evm-transaction-data.ts b/packages/internal/guardian/src/client/models/zk-evm-transaction-data.ts new file mode 100644 index 0000000000..e2ff812ddf --- /dev/null +++ b/packages/internal/guardian/src/client/models/zk-evm-transaction-data.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Guardian + * Guardian API + * + * The version of the OpenAPI document: 1.0.0 + * Contact: support@immutable.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +// May contain unused imports in some cases +// @ts-ignore +import { MetaTransaction } from './meta-transaction'; + +/** + * + * @export + * @interface ZkEvmTransactionData + */ +export interface ZkEvmTransactionData { + /** + * The user address + * @type {string} + * @memberof ZkEvmTransactionData + */ + 'userAddress': string; + /** + * An array of exactly two meta-transactions + * @type {Array} + * @memberof ZkEvmTransactionData + */ + 'metaTransactions': Array; + /** + * The nonce value + * @type {number} + * @memberof ZkEvmTransactionData + */ + 'nonce': number; +} + diff --git a/packages/internal/guardian/src/client/models/zk-evm-transaction-evaluation-request-transaction-data.ts b/packages/internal/guardian/src/client/models/zk-evm-transaction-evaluation-request-transaction-data.ts deleted file mode 100644 index ed26965777..0000000000 --- a/packages/internal/guardian/src/client/models/zk-evm-transaction-evaluation-request-transaction-data.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Guardian - * Guardian API - * - * The version of the OpenAPI document: 1.0.0 - * Contact: support@immutable.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * Data specific to EVM transactions - * @export - * @interface ZkEvmTransactionEvaluationRequestTransactionData - */ -export interface ZkEvmTransactionEvaluationRequestTransactionData { - /** - * Smart contract wallet address that wants to execute this transaction - * @type {string} - * @memberof ZkEvmTransactionEvaluationRequestTransactionData - */ - 'to'?: string; - /** - * Encoded data for calling the `execute()` function on the SCW - * @type {string} - * @memberof ZkEvmTransactionEvaluationRequestTransactionData - */ - 'data'?: string; -} - diff --git a/packages/internal/guardian/src/client/models/zk-evm-transaction-evaluation-request.ts b/packages/internal/guardian/src/client/models/zk-evm-transaction-evaluation-request.ts index 232f5735e1..efb6b5cf9f 100644 --- a/packages/internal/guardian/src/client/models/zk-evm-transaction-evaluation-request.ts +++ b/packages/internal/guardian/src/client/models/zk-evm-transaction-evaluation-request.ts @@ -15,7 +15,7 @@ // May contain unused imports in some cases // @ts-ignore -import { ZkEvmTransactionEvaluationRequestTransactionData } from './zk-evm-transaction-evaluation-request-transaction-data'; +import { ZkEvmTransactionData } from './zk-evm-transaction-data'; /** * @@ -23,11 +23,30 @@ import { ZkEvmTransactionEvaluationRequestTransactionData } from './zk-evm-trans * @interface ZkEvmTransactionEvaluationRequest */ export interface ZkEvmTransactionEvaluationRequest { + /** + * The ID of the chain + * @type {string} + * @memberof ZkEvmTransactionEvaluationRequest + */ + 'chainId': string; + /** + * The type of the chain + * @type {string} + * @memberof ZkEvmTransactionEvaluationRequest + */ + 'chainType': ZkEvmTransactionEvaluationRequestChainTypeEnum; /** * - * @type {ZkEvmTransactionEvaluationRequestTransactionData} + * @type {ZkEvmTransactionData} * @memberof ZkEvmTransactionEvaluationRequest */ - 'transactionData': ZkEvmTransactionEvaluationRequestTransactionData; + 'transactionData': ZkEvmTransactionData; } +export const ZkEvmTransactionEvaluationRequestChainTypeEnum = { + Evm: 'evm' +} as const; + +export type ZkEvmTransactionEvaluationRequestChainTypeEnum = typeof ZkEvmTransactionEvaluationRequestChainTypeEnum[keyof typeof ZkEvmTransactionEvaluationRequestChainTypeEnum]; + + diff --git a/packages/passport/sdk/src/Passport.int.test.ts b/packages/passport/sdk/src/Passport.int.test.ts index d395e4748a..5f422a46cf 100644 --- a/packages/passport/sdk/src/Passport.int.test.ts +++ b/packages/passport/sdk/src/Passport.int.test.ts @@ -173,6 +173,7 @@ describe('Passport', () => { mswHandlers.counterfactualAddress.success, mswHandlers.jsonRpcProvider.success, mswHandlers.relayer.success, + mswHandlers.guardian.evaluateTransaction.success, ]); mockMagicRequest.mockImplementationOnce(({ method }: RequestArguments) => { expect(method).toEqual('eth_accounts'); diff --git a/packages/passport/sdk/src/mocks/zkEvm/msw.ts b/packages/passport/sdk/src/mocks/zkEvm/msw.ts index 5f57076062..2e34159464 100644 --- a/packages/passport/sdk/src/mocks/zkEvm/msw.ts +++ b/packages/passport/sdk/src/mocks/zkEvm/msw.ts @@ -102,6 +102,11 @@ export const mswHandlers = { } }), }, + guardian: { + evaluateTransaction: { + success: rest.post('https://api.sandbox.immutable.com/guardian/v1/transactions/evm/evaluate', (req, res, ctx) => res(ctx.status(200))), + }, + }, }; let mswWorker: SetupServer; diff --git a/packages/passport/sdk/src/zkEvm/rpcMethods/eth_sendTransaction.test.ts b/packages/passport/sdk/src/zkEvm/rpcMethods/eth_sendTransaction.test.ts index 95f46f70fd..44544dde08 100644 --- a/packages/passport/sdk/src/zkEvm/rpcMethods/eth_sendTransaction.test.ts +++ b/packages/passport/sdk/src/zkEvm/rpcMethods/eth_sendTransaction.test.ts @@ -1,5 +1,6 @@ import { JsonRpcProvider, TransactionRequest } from '@ethersproject/providers'; -import { getSignedMetaTransactions } from '../walletHelpers'; +import { TransactionsApi } from '@imtbl/guardian'; +import { getSignedMetaTransactions, getNonce } from '../walletHelpers'; import { ethSendTransaction } from './eth_sendTransaction'; import { mockUserZkEvm } from '../../test/mocks'; import { RelayerClient } from '../relayerClient'; @@ -9,7 +10,14 @@ import { RelayerTransaction, RelayerTransactionStatus } from '../types'; import { JsonRpcError, RpcErrorCode } from '../JsonRpcError'; jest.mock('@ethersproject/providers'); -jest.mock('../walletHelpers'); +jest.mock('../walletHelpers', () => { + const original = jest.requireActual('../walletHelpers'); + return { + ...original, + getSignedMetaTransactions: jest.fn(), + getNonce: jest.fn(), + }; +}); jest.mock('../../network/retry'); describe('ethSendTransaction', () => { @@ -30,19 +38,27 @@ describe('ethSendTransaction', () => { ethSendTransaction: jest.fn(), imGetTransactionByHash: jest.fn(), }; - const config: Partial = {}; + const transactionAPI = { + evaluateTransaction: jest.fn(), + }; + + const nonce = 5; + const config: Partial = { + zkEvmChainId: 'eip155:13392', + }; + + const imxFeeOption = { + tokenPrice: '0.0001', + tokenSymbol: 'IMX', + tokenDecimals: 18, + tokenAddress: '0x1337', + recipientAddress: '0x7331', + }; beforeEach(() => { jest.resetAllMocks(); - relayerClient.imGetFeeOptions.mockResolvedValue([ - { - tokenPrice: '0.0001', - tokenSymbol: 'IMX', - tokenDecimals: 18, - tokenAddress: '0x1337', - recipientAddress: '0x7331', - }, - ]); + relayerClient.imGetFeeOptions.mockResolvedValue([imxFeeOption]); + (getNonce as jest.Mock).mockResolvedValueOnce(nonce); (getSignedMetaTransactions as jest.Mock).mockResolvedValueOnce(signedTransaction); (getSignedMetaTransactions as jest.Mock).mockResolvedValueOnce(signedTransactions); relayerClient.ethSendTransaction.mockResolvedValue(relayerTransactionId); @@ -58,12 +74,68 @@ describe('ethSendTransaction', () => { params: [transactionRequest], magicProvider, jsonRpcProvider: jsonRpcProvider as JsonRpcProvider, + transactionAPI: transactionAPI as unknown as TransactionsApi, + relayerClient: relayerClient as unknown as RelayerClient, + config: config as PassportConfiguration, + user: mockUserZkEvm, + }); + + expect(result).toEqual(transactionHash); + expect(relayerClient.ethSendTransaction).toHaveBeenCalledWith(mockUserZkEvm.zkEvm.ethAddress, signedTransactions); + }); + + it('calls guardian.evaluateTransaction with the correct arguments', async () => { + (retryWithDelay as jest.Mock).mockResolvedValue({ + status: RelayerTransactionStatus.SUCCESSFUL, + hash: transactionHash, + } as RelayerTransaction); + + const result = await ethSendTransaction({ + params: [transactionRequest], + magicProvider, + jsonRpcProvider: jsonRpcProvider as JsonRpcProvider, + transactionAPI: transactionAPI as unknown as TransactionsApi, relayerClient: relayerClient as unknown as RelayerClient, config: config as PassportConfiguration, user: mockUserZkEvm, }); expect(result).toEqual(transactionHash); + expect(transactionAPI.evaluateTransaction).toHaveBeenCalledWith({ + id: 'evm', + transactionEvaluationRequest: { + chainType: 'evm', + chainId: config.zkEvmChainId, + transactionData: { + metaTransactions: [ + { + data: transactionRequest.data, + delegateCall: false, + gasLimit: { + _hex: '0x00', + _isBigNumber: true, + }, + revertOnError: true, + target: mockUserZkEvm.zkEvm.ethAddress, + value: '0x', + }, + { + data: [], + delegateCall: false, + gasLimit: { + _hex: '0x00', + _isBigNumber: true, + }, + revertOnError: true, + target: imxFeeOption.recipientAddress, + value: imxFeeOption.tokenPrice, + }, + ], + nonce, + userAddress: mockUserZkEvm.zkEvm.ethAddress, + }, + }, + }); expect(relayerClient.ethSendTransaction).toHaveBeenCalledWith(mockUserZkEvm.zkEvm.ethAddress, signedTransactions); }); @@ -76,6 +148,7 @@ describe('ethSendTransaction', () => { params: [transactionRequest], magicProvider, jsonRpcProvider: jsonRpcProvider as JsonRpcProvider, + transactionAPI: transactionAPI as unknown as TransactionsApi, relayerClient: relayerClient as unknown as RelayerClient, config: config as PassportConfiguration, user: mockUserZkEvm, diff --git a/packages/passport/sdk/src/zkEvm/rpcMethods/eth_sendTransaction.ts b/packages/passport/sdk/src/zkEvm/rpcMethods/eth_sendTransaction.ts index a5a80991c7..6c2b012136 100644 --- a/packages/passport/sdk/src/zkEvm/rpcMethods/eth_sendTransaction.ts +++ b/packages/passport/sdk/src/zkEvm/rpcMethods/eth_sendTransaction.ts @@ -2,7 +2,11 @@ import { TransactionRequest, Web3Provider, } from '@ethersproject/providers'; -import { getNonce, getSignedMetaTransactions, chainIdNumber } from '../walletHelpers'; + +import * as guardian from '@imtbl/guardian'; +import { + getNonce, getNormalisedTransactions, getSignedMetaTransactions, chainIdNumber, +} from '../walletHelpers'; import { MetaTransaction, RelayerTransactionStatus } from '../types'; import { EthMethodWithAuthParams } from './types'; import { JsonRpcError, RpcErrorCode } from '../JsonRpcError'; @@ -16,6 +20,7 @@ export const ethSendTransaction = async ({ magicProvider, jsonRpcProvider, relayerClient, + transactionAPI, config, user, }: EthMethodWithAuthParams): Promise => { @@ -69,6 +74,22 @@ export const ethSendTransaction = async ({ revertOnError: true, }; + const normalisedMetaTransactions = getNormalisedTransactions( + [metaTransaction, feeMetaTransaction], + ) as guardian.MetaTransaction[]; + + await transactionAPI.evaluateTransaction({ + id: 'evm', + transactionEvaluationRequest: { + chainType: 'evm', + chainId: config.zkEvmChainId, + transactionData: { + nonce, + userAddress: user.zkEvm.ethAddress, + metaTransactions: normalisedMetaTransactions, + }, + }, + }); // NOTE: We sign again because we now are adding the fee transaction, so the // whole payload is different and needs a new signature. const signedTransactions = await getSignedMetaTransactions( diff --git a/packages/passport/sdk/src/zkEvm/rpcMethods/types.ts b/packages/passport/sdk/src/zkEvm/rpcMethods/types.ts index 29b9f0b195..effce73b45 100644 --- a/packages/passport/sdk/src/zkEvm/rpcMethods/types.ts +++ b/packages/passport/sdk/src/zkEvm/rpcMethods/types.ts @@ -1,4 +1,5 @@ import { ExternalProvider, JsonRpcProvider } from '@ethersproject/providers'; +import * as guardian from '@imtbl/guardian'; import { PassportConfiguration } from '../../config'; import { RelayerClient } from '../relayerClient'; import { UserZkEvm } from '../../types'; @@ -8,6 +9,7 @@ export type EthMethodWithAuthParams = { jsonRpcProvider: JsonRpcProvider; config: PassportConfiguration; relayerClient: RelayerClient; + transactionAPI: guardian.TransactionsApi; user: UserZkEvm; params: Array; }; diff --git a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts index 52b3fb440b..527553b797 100644 --- a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts +++ b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts @@ -1,5 +1,6 @@ import { ExternalProvider, JsonRpcProvider } from '@ethersproject/providers'; import { MultiRollupApiClients } from '@imtbl/generated-clients'; +import * as guardian from '@imtbl/guardian'; import { ethSendTransaction } from './rpcMethods'; import { JsonRpcRequestCallback, @@ -42,6 +43,8 @@ export class ZkEvmProvider implements Provider { private readonly relayerClient: RelayerClient; + private readonly transactionAPI: guardian.TransactionsApi; + private readonly multiRollupApiClients: MultiRollupApiClients; private readonly jsonRpcProvider: JsonRpcProvider; // Used for read operations @@ -62,6 +65,11 @@ export class ZkEvmProvider implements Provider { this.config = config; this.confirmationScreen = confirmationScreen; this.relayerClient = new RelayerClient({ config }); + this.transactionAPI = new guardian.TransactionsApi( + new guardian.Configuration({ + basePath: this.config.imxPublicApiDomain, + }), + ); this.jsonRpcProvider = new JsonRpcProvider(this.config.zkEvmRpcUrl); this.multiRollupApiClients = multiRollupApiClients; } @@ -82,6 +90,7 @@ export class ZkEvmProvider implements Provider { jsonRpcProvider: this.jsonRpcProvider, config: this.config, relayerClient: this.relayerClient, + transactionAPI: this.transactionAPI, user: this.user, }); };