From e87ce9efe503296a4021f97987c2cb4056325cd0 Mon Sep 17 00:00:00 2001 From: Benjamin Smith Date: Fri, 20 Sep 2024 14:35:41 +0200 Subject: [PATCH] Improve encodeSignRequest (#58) --- src/lib/safe-message.ts | 27 +----------------- src/tx-manager.ts | 62 ++++++++++++++++++++++------------------- src/types.ts | 13 ++++++++- 3 files changed, 47 insertions(+), 55 deletions(-) diff --git a/src/lib/safe-message.ts b/src/lib/safe-message.ts index 0853fee..9061f5d 100644 --- a/src/lib/safe-message.ts +++ b/src/lib/safe-message.ts @@ -1,7 +1,7 @@ /// This file is a viem implementation of the useDecodedSafeMessage hook from: /// https://github.com/safe-global/safe-wallet-web import { type SafeInfo } from "@safe-global/safe-gateway-typescript-sdk"; -import { EIP712TypedData, RecoveryData, toPayload } from "near-ca"; +import { EIP712TypedData } from "near-ca"; import { gte } from "semver"; import { Address, @@ -121,31 +121,6 @@ export function decodeSafeMessage( }; } -export function safeMessageTxData( - method: string, - message: DecodedSafeMessage, - sender: Address -): { - evmMessage: string; - payload: number[]; - // We may eventually be able to abolish this. - recoveryData: RecoveryData; -} { - return { - evmMessage: message.safeMessageMessage, - payload: toPayload(message.safeMessageHash), - recoveryData: { - type: method, - data: { - address: sender, - // TODO - Upgrade Signable Message in near-ca - // @ts-expect-error: Type 'string | EIP712TypedData' is not assignable to type 'SignableMessage'. - message: decodedMessage, - }, - }, - }; -} - // const isEIP712TypedData = (obj: any): obj is EIP712TypedData => { // return ( // typeof obj === "object" && diff --git a/src/tx-manager.ts b/src/tx-manager.ts index 0055309..30414ed 100644 --- a/src/tx-manager.ts +++ b/src/tx-manager.ts @@ -4,9 +4,7 @@ import { setupAdapter, signatureFromOutcome, SignRequestData, - NearEthTxData, EthSignParams, - RecoveryData, toPayload, PersonalSignParams, } from "near-ca"; @@ -15,8 +13,13 @@ import { Address, Hash, Hex, serializeSignature } from "viem"; import { Erc4337Bundler } from "./lib/bundler"; import { encodeMulti } from "./lib/multisend"; import { ContractSuite } from "./lib/safe"; -import { decodeSafeMessage, safeMessageTxData } from "./lib/safe-message"; -import { MetaTransaction, UserOperation, UserOperationReceipt } from "./types"; +import { decodeSafeMessage } from "./lib/safe-message"; +import { + EncodedTxData, + MetaTransaction, + UserOperation, + UserOperationReceipt, +} from "./types"; import { getClient, isContract, @@ -154,15 +157,22 @@ export class TransactionManager { async encodeSignRequest( signRequest: SignRequestData, usePaymaster: boolean - ): Promise { - const data = await this.requestRouter(signRequest, usePaymaster); + ): Promise { + const { payload, evmMessage, hash } = await this.requestRouter( + signRequest, + usePaymaster + ); return { nearPayload: await this.nearAdapter.mpcContract.encodeSignatureRequestTx({ path: this.nearAdapter.derivationPath, - payload: data.payload, + payload, key_version: 0, }), - ...data, + evmData: { + chainId: signRequest.chainId, + data: evmMessage, + hash, + }, }; } @@ -257,8 +267,7 @@ export class TransactionManager { ): Promise<{ evmMessage: string; payload: number[]; - // We may eventually be able to abolish this. - recoveryData: RecoveryData; + hash: Hash; }> { const safeInfo = { address: { value: this.address }, @@ -272,20 +281,22 @@ export class TransactionManager { case "eth_signTypedData": case "eth_signTypedData_v4": case "eth_sign": { - const [sender, messageOrData] = params as EthSignParams; - return safeMessageTxData( - method, - decodeSafeMessage(messageOrData, safeInfo), - sender - ); + const [_, messageOrData] = params as EthSignParams; + const message = decodeSafeMessage(messageOrData, safeInfo); + return { + evmMessage: message.safeMessageMessage, + payload: toPayload(message.safeMessageHash), + hash: message.safeMessageHash, + }; } case "personal_sign": { - const [messageHash, sender] = params as PersonalSignParams; - return safeMessageTxData( - method, - decodeSafeMessage(messageHash, safeInfo), - sender - ); + const [messageHash, _] = params as PersonalSignParams; + const message = decodeSafeMessage(messageHash, safeInfo); + return { + evmMessage: message.safeMessageMessage, + payload: toPayload(message.safeMessageHash), + hash: message.safeMessageHash, + }; } case "eth_sendTransaction": { const transactions = metaTransactionsFromRequest(params); @@ -298,12 +309,7 @@ export class TransactionManager { return { payload: toPayload(opHash), evmMessage: JSON.stringify(userOp), - recoveryData: { - type: method, - // TODO: Double check that this is sufficient for UI. - // We may want to adapt and return the `MetaTransactions` instead. - data: opHash, - }, + hash: await this.opHash(userOp), }; } } diff --git a/src/types.ts b/src/types.ts index bc95366..c27c153 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,5 @@ -import { Address, Hex } from "viem"; +import { FunctionCallTransaction, SignArgs } from "near-ca"; +import { Address, Hash, Hex, TransactionSerializable } from "viem"; export interface UnsignedUserOperation { sender: Address; @@ -101,3 +102,13 @@ export interface MetaTransaction { readonly data: string; readonly operation?: OperationType; } +export interface EncodedTxData { + evmData: { + chainId: number; + data: string | TransactionSerializable; + hash: Hash; + }; + nearPayload: FunctionCallTransaction<{ + request: SignArgs; + }>; +}