signTypedData
Signs typed data from a smart account and calculates an Ethereum-specific signature in https://eips.ethereum.org/EIPS/eip-712: sign(keccak256("\x19\x01" ‖ domainSeparator ‖ hashStruct(message)))
Usage
import { smartAccountClient } from "./smartAccountClient"
const signedData = await smartAccountClient.signTypedData({
domain: {
name: "Ether Mail",
version: "1",
chainId: 1,
verifyingContract: getAddress("0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"),
},
types: {
Person: [
{ name: "name", type: "string" },
{ name: "wallet", type: "address" },
],
Mail: [
{ name: "from", type: "Person" },
{ name: "to", type: "Person" },
{ name: "contents", type: "string" },
],
},
primaryType: "Mail" as const,
message: {
from: {
name: "Bob",
wallet: "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB",
},
to: {
name: "Alice",
wallet: "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa",
},
contents: "Hello Alice!",
},
})import { ENTRYPOINT_ADDRESS_V07, createSmartAccountClient } from "permissionless"
import { privateKeyToSimpleSmartAccount } from "permissionless/accounts"
import { createPimlicoPaymasterClient } from "permissionless/clients/pimlico"
import { createPublicClient, http } from "viem"
import { sepolia } from "viem/chains"
export const publicClient = createPublicClient({
transport: http("https://sepolia.rpc.thirdweb.com"),
})
// if using a paymaster
const paymasterClient = createPimlicoPaymasterClient({
transport: http("https://api.pimlico.io/v2/sepolia/rpc?apikey=YOUR_PIMLICO_API_KEY"),
entryPoint: ENTRYPOINT_ADDRESS_V07,
})
export const simpleSmartAccount = await privateKeyToSimpleSmartAccount(publicClient, {
privateKey: "0xPRIVATE_KEY",
factoryAddress: "0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985", // simple version
entryPoint: ENTRYPOINT_ADDRESS_V07,
})
export const smartAccountClient = createSmartAccountClient({
account: simpleSmartAccount,
entryPoint: ENTRYPOINT_ADDRESS_V07,
chain: sepolia, // or whatever chain you are using
bundlerTransport: http("https://api.pimlico.io/v2/sepolia/rpc?apikey=YOUR_PIMLICO_API_KEY"),
middleware: {
sponsorUserOperation: paymasterClient.sponsorUserOperation, // if using a paymaster
},
})Returns
- Type:
Hex
The signed data.
Parameters
domain
- Type:
TypedDataDomain
The typed data domain.
types
- Type:
TypedData
The type definitions for the typed data.
primaryType
- Type: Inferred
string.
The primary type to extract from types and use in value.
message
- Type: Inferred from
types&primaryType.
The message to sign