Skip to content

Commit

Permalink
feat: passkey paymaster handler & general paymaster handler & fix types
Browse files Browse the repository at this point in the history
  • Loading branch information
0xSulpiride committed Feb 2, 2025
1 parent 91a3507 commit 1a9b512
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 13 deletions.
2 changes: 2 additions & 0 deletions packages/sdk/src/client/passkey/client.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { type Account, type Address, type Chain, type Client, createClient, getAddress, type Prettify, type PublicActions, publicActions, type PublicRpcSchema, type RpcSchema, type Transport, type WalletActions, walletActions, type WalletClientConfig, type WalletRpcSchema } from "viem";
import { eip712WalletActions } from "viem/zksync";

import type { CustomPaymasterHandler } from "../../paymaster/index.js";
import { passkeyHashSignatureResponseFormat } from "../../utils/passkey.js";
import { toPasskeyAccount } from "./account.js";
import { requestPasskeyAuthentication } from "./actions/passkey.js";
Expand Down Expand Up @@ -63,6 +64,7 @@ type ZksyncSsoPasskeyData = {
userName: string; // Basically unique user id (which is called `userName` in webauthn)
userDisplayName: string; // Also option required for webauthn
contracts: PasskeyRequiredContracts;
paymasterHandler?: CustomPaymasterHandler;
};

export type ClientWithZksyncSsoPasskeyData<
Expand Down
31 changes: 26 additions & 5 deletions packages/sdk/src/client/passkey/decorators/wallet.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { type Account, bytesToHex, type Chain, formatTransaction, type Transport, type WalletActions } from "viem";
import { getTransactionWithPaymasterData } from "src/paymaster/index.js";
import { type Account, bytesToHex, type Chain, type ExactPartial, formatTransaction, type RpcTransaction, type Transport, type WalletActions } from "viem";
import { deployContract, getAddresses, getChainId, sendRawTransaction, signMessage, signTypedData, writeContract } from "viem/actions";
import { signTransaction, type ZksyncEip712Meta } from "viem/zksync";
import { signTransaction, type TransactionRequestEIP712, type ZksyncEip712Meta } from "viem/zksync";

import { sendEip712Transaction } from "../../session/actions/sendEip712Transaction.js";
import type { ClientWithZksyncSsoPasskeyData } from "../client.js";
Expand Down Expand Up @@ -33,19 +34,39 @@ export function zksyncSsoPasskeyWalletActions<
delete unformattedTx.eip712Meta;
}

/* eslint-disable @typescript-eslint/no-unused-vars */
const { chainId: _, ...unformattedTxWithPaymaster } = await getTransactionWithPaymasterData(
client.chain.id,
client.account.address,
unformattedTx,
client.paymasterHandler,
);

const formatters = client.chain?.formatters;
const format = formatters?.transaction?.format || formatTransaction;

const tx = {
...format(unformattedTx),
...format(unformattedTxWithPaymaster as ExactPartial<RpcTransaction>),
type: "eip712",
};

return await sendEip712Transaction(client, tx);
},
signMessage: (args) => signMessage(client, args),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
signTransaction: (args) => signTransaction(client, args as any),

signTransaction: async (args) => {
/* eslint-disable @typescript-eslint/no-unused-vars */
const { chainId: _, ...unformattedTxWithPaymaster } = await getTransactionWithPaymasterData(
client.chain.id,
client.account.address,
args as TransactionRequestEIP712,
client.paymasterHandler,
);
return signTransaction(client, {
...args,
unformattedTxWithPaymaster,
} as any);
},
signTypedData: (args) => signTypedData(client, args),
writeContract: (args) => writeContract(client, args),
};
Expand Down
22 changes: 20 additions & 2 deletions packages/sdk/src/client/session/actions/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { waitForTransactionReceipt } from "viem/actions";
import { getGeneralPaymasterInput, sendTransaction } from "viem/zksync";

import { SessionKeyModuleAbi } from "../../../abi/SessionKeyModule.js";
import { type CustomPaymasterHandler, getTransactionWithPaymasterData } from "../../../paymaster/index.js";
import { noThrow } from "../../../utils/helpers.js";
import type { SessionConfig } from "../../../utils/session.js";

Expand All @@ -16,6 +17,7 @@ export type CreateSessionArgs = {
paymasterInput?: Hex;
};
onTransactionSent?: (hash: Hash) => void;
paymasterHandler?: CustomPaymasterHandler;
};
export type CreateSessionReturnType = {
transactionReceipt: TransactionReceipt;
Expand All @@ -41,7 +43,14 @@ export const createSession = async <
// eslint-disable-next-line @typescript-eslint/no-explicit-any
} as any;

const transactionHash = await sendTransaction(client, sendTransactionArgs);
const transactionWithPaymasterData: any = await getTransactionWithPaymasterData(
client.chain.id,
client.account.address,
sendTransactionArgs,
args.paymasterHandler,
);

const transactionHash = await sendTransaction(client, transactionWithPaymasterData);
if (args.onTransactionSent) {
noThrow(() => args.onTransactionSent?.(transactionHash));
}
Expand All @@ -64,6 +73,7 @@ export type RevokeSessionArgs = {
paymasterInput?: Hex;
};
onTransactionSent?: (hash: Hash) => void;
paymasterHandler?: CustomPaymasterHandler;
};
export type RevokeSessionReturnType = {
transactionReceipt: TransactionReceipt;
Expand All @@ -89,7 +99,15 @@ export const revokeSession = async <
// eslint-disable-next-line @typescript-eslint/no-explicit-any
} as any;

const transactionHash = await sendTransaction(client, sendTransactionArgs);
const transactionWithPaymasterData: any = await getTransactionWithPaymasterData(
client.chain.id,
client.account.address,
sendTransactionArgs,
args.paymasterHandler,
);

const transactionHash = await sendTransaction(client, transactionWithPaymasterData);

if (args.onTransactionSent) {
noThrow(() => args.onTransactionSent?.(transactionHash));
}
Expand Down
29 changes: 23 additions & 6 deletions packages/sdk/src/client/session/decorators/wallet.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import { type Account, bytesToHex, type Chain, formatTransaction, type Transport, type WalletActions } from "viem";
import { deployContract, getAddresses, getChainId, sendRawTransaction, signMessage, signTypedData, writeContract } from "viem/actions";
import { signTransaction, type ZksyncEip712Meta } from "viem/zksync";
import {
type Account, bytesToHex,
type Chain, type ExactPartial, formatTransaction, type RpcTransaction,
type Transport, type WalletActions } from "viem";
import {
deployContract, getAddresses, getChainId, sendRawTransaction,
signMessage, signTypedData, writeContract,
} from "viem/actions";
import { signTransaction, type TransactionRequestEIP712, type ZksyncEip712Meta } from "viem/zksync";

import { getTransactionWithPaymasterData } from "../../../paymaster/index.js";
import { sendEip712Transaction } from "../actions/sendEip712Transaction.js";
Expand Down Expand Up @@ -46,15 +52,26 @@ export function zksyncSsoWalletActions<
const format = formatters?.transaction?.format || formatTransaction;

const tx = {
...format(unformattedTxWithPaymaster as any),
...format(unformattedTxWithPaymaster as ExactPartial<RpcTransaction>),
type: "eip712",
};

return await sendEip712Transaction(client, tx);
},
signMessage: (args) => signMessage(client, args),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
signTransaction: (args) => signTransaction(client, args as any),

signTransaction: async (args) => {
const { chainId: _, ...unformattedTxWithPaymaster } = await getTransactionWithPaymasterData(
client.chain.id,
client.account.address,
args as TransactionRequestEIP712,
client.paymasterHandler,
);
return signTransaction(client, {
...args,
unformattedTxWithPaymaster,
} as any);
},
signTypedData: (args) => signTypedData(client, args),
writeContract: (args) => writeContract(client, args),
};
Expand Down
14 changes: 14 additions & 0 deletions packages/sdk/src/paymaster/handlers/general.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { Address } from "viem";
import { getGeneralPaymasterInput } from "viem/zksync";

import type { CustomPaymasterHandler, CustomPaymasterHandlerResponse, CustomPaymasterParameters } from "../index.js";

export function createGeneralPaymaster(paymaster: Address): CustomPaymasterHandler {
/* eslint-disable @typescript-eslint/no-unused-vars */
return async (_: CustomPaymasterParameters): CustomPaymasterHandlerResponse => {
return {
paymaster,
paymasterInput: getGeneralPaymasterInput({ innerInput: "0x" }),
};
};
}
1 change: 1 addition & 0 deletions packages/sdk/src/paymaster/handlers/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from "./general.js";
export * from "./zyfi.js";

0 comments on commit 1a9b512

Please sign in to comment.