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.
Sign Message
Sign raw messages
Create Wallet
Create new wallet