UNPKG

zksync-sso

Version:
72 lines 3 kB
import { createClient, createPublicClient, encodeAbiParameters, getAddress, publicActions } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { zksyncInMemoryNode } from "viem/chains"; import { encodeSessionTx } from "../../utils/encoding.js"; import { toSessionAccount } from "./account.js"; import { publicActionsRewrite } from "./decorators/publicActionsRewrite.js"; import { zksyncSsoWalletActions } from "./decorators/wallet.js"; export const signSessionTransaction = (args) => { return encodeAbiParameters([ { type: "bytes", name: "sessionKeySignedHash" }, { type: "address", name: "sessionContract" }, { type: "bytes", name: "validatorData" }, ], [ args.sessionKeySignedHash, args.sessionContract, encodeSessionTx({ sessionConfig: args.sessionConfig, to: args.to, callData: args.callData, timestamp: args.timestamp, }), ]); }; export function createZksyncSessionClient(_parameters) { const parameters = { ..._parameters, address: getAddress(_parameters.address), key: _parameters.key || "zksync-sso-session-wallet", name: _parameters.name || "ZKsync SSO Session Client", }; const getInMemoryNodeTimestamp = async () => { const publicClient = createPublicClient({ chain: parameters.chain, transport: parameters.transport }); // eslint-disable-next-line @typescript-eslint/no-explicit-any const timestamp = await publicClient.request({ method: "config_getCurrentTimestamp" }); return BigInt(timestamp); }; const account = toSessionAccount({ address: parameters.address, signTransaction: async ({ hash, to, callData }) => { // In Memory Node uses a different timestamp mechanism which isn't equal to actual timestamp const timestamp = parameters.chain.id === zksyncInMemoryNode.id ? await getInMemoryNodeTimestamp() : undefined; const sessionKeySigner = privateKeyToAccount(parameters.sessionKey); const hashSignature = await sessionKeySigner.sign({ hash }); return signSessionTransaction({ sessionKeySignedHash: hashSignature, sessionContract: parameters.contracts.session, sessionConfig: parameters.sessionConfig, to, callData, timestamp, }); }, }); const client = createClient({ ...parameters, account, type: "walletClient", }) .extend(() => ({ sessionKey: parameters.sessionKey, sessionConfig: parameters.sessionConfig, contracts: parameters.contracts, paymasterHandler: parameters.paymasterHandler, })) .extend(publicActions) .extend(publicActionsRewrite) .extend(zksyncSsoWalletActions); return client; } //# sourceMappingURL=client.js.map