zksync-sso
Version:
ZKsync Smart Sign On SDK
72 lines • 3 kB
JavaScript
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