Method Signature
align.blockchain.wallets.signTypedData(
wallet: Wallet,
domain: TypedDataDomain,
types: Record<string, TypedDataField[]>,
value: Record<string, unknown>
): Promise<string>
Parameters
EIP-712 domain separator (name, version, chainId, verifyingContract)
types
Record<string, TypedDataField[]>
required
Type definitions for the data structure
value
Record<string, unknown>
required
The actual data to sign
Returns
Returns the signature as a hex string.
Examples
ERC-20 Permit (Gasless Approval)
import Align from "@tolbel/align";
import type { TypedDataDomain, TypedDataField } from "ethers";
const align = new Align({
apiKey: process.env.ALIGN_API_KEY!,
environment: "sandbox",
});
const wallet = await align.blockchain.wallets.createFromPrivateKey(
process.env.PRIVATE_KEY!
);
// EIP-712 Domain for USDC on Polygon
const domain: TypedDataDomain = {
name: "USD Coin",
version: "1",
chainId: 137,
verifyingContract: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
};
// Permit type structure
const types: Record<string, TypedDataField[]> = {
Permit: [
{ name: "owner", type: "address" },
{ name: "spender", type: "address" },
{ name: "value", type: "uint256" },
{ name: "nonce", type: "uint256" },
{ name: "deadline", type: "uint256" },
],
};
// Permit data
const value = {
owner: wallet.address,
spender: "0xSpenderContract...",
value: "1000000000", // 1000 USDC
nonce: 0,
deadline: Math.floor(Date.now() / 1000) + 3600, // 1 hour
};
const signature = await align.blockchain.wallets.signTypedData(
wallet,
domain,
types,
value
);
console.log(`Permit signature: ${signature}`);
// Use with permit() function for gasless approval
NFT Minting Signature
const domain = {
name: "MyNFT",
version: "1",
chainId: 1,
verifyingContract: NFT_CONTRACT_ADDRESS,
};
const types = {
MintRequest: [
{ name: "to", type: "address" },
{ name: "tokenId", type: "uint256" },
{ name: "uri", type: "string" },
],
};
const value = {
to: wallet.address,
tokenId: 123,
uri: "ipfs://QmHash...",
};
const signature = await align.blockchain.wallets.signTypedData(
wallet,
domain,
types,
value
);
EIP-712 signatures are human-readable in wallet UIs, showing users exactly
what they’re signing.
Always verify the domain matches the expected contract. Malicious domains
can trick users into signing harmful transactions.