import * as Permit from '@tevm/primitives/Permit';
import * as Address from '@tevm/primitives/Address';
import * as Uint256 from '@tevm/primitives/Uint256';
// Setup
const owner = Address.fromHex('0x...');
const spender = Address.fromHex('0x...');
const amount = Uint256.fromBigInt(1000000n); // 1 USDC
// Create permit
const permit: Permit.PermitType = {
owner,
spender,
value: amount,
nonce: Uint256.fromBigInt(0n),
deadline: Uint256.fromBigInt(BigInt(Math.floor(Date.now() / 1000) + 3600)),
};
// Sign with known token domain
const domain = Permit.KnownTokens.USDC_MAINNET;
const signature = Permit.createPermitSignature(permit, domain, privateKey);
// Verify
const isValid = Permit.verifyPermit(permit, signature, domain);
// Submit to contract
const { r, s, v } = parseSignature(signature);
await contract.permit(
permit.owner,
permit.spender,
permit.value,
permit.deadline,
v,
r,
s
);