Skip to content

Commit

Permalink
Improve encodeSignRequest (#58)
Browse files Browse the repository at this point in the history
  • Loading branch information
bh2smith authored Sep 20, 2024
1 parent 32800b9 commit e87ce9e
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 55 deletions.
27 changes: 1 addition & 26 deletions src/lib/safe-message.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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" &&
Expand Down
62 changes: 34 additions & 28 deletions src/tx-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ import {
setupAdapter,
signatureFromOutcome,
SignRequestData,
NearEthTxData,
EthSignParams,
RecoveryData,
toPayload,
PersonalSignParams,
} from "near-ca";
Expand All @@ -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,
Expand Down Expand Up @@ -154,15 +157,22 @@ export class TransactionManager {
async encodeSignRequest(
signRequest: SignRequestData,
usePaymaster: boolean
): Promise<NearEthTxData> {
const data = await this.requestRouter(signRequest, usePaymaster);
): Promise<EncodedTxData> {
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,
},
};
}

Expand Down Expand Up @@ -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 },
Expand All @@ -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);
Expand All @@ -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),
};
}
}
Expand Down
13 changes: 12 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
}>;
}

0 comments on commit e87ce9e

Please sign in to comment.