Skip to main content

Method Signature

align.blockchain.wallets.signTypedData(
  wallet: Wallet,
  domain: TypedDataDomain,
  types: Record<string, TypedDataField[]>,
  value: Record<string, unknown>
): Promise<string>

Parameters

wallet
Wallet
required
The wallet to sign with
domain
TypedDataDomain
required
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