.claude/skills/permit2-signature-transfer/SKILL.md
Uses permitWitnessTransferFrom for gasless token transfers with EIP-712 signatures. Use when implementing swap/deposit/withdraw with Permit2 signature-based authorization.
npx skillsauth add cyotee/crane permit2-signature-transferInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
The recommended pattern for IndexedEx operations. Users sign one EIP-712 message off-chain - no pre-approval needed.
import { SignatureTransfer, PERMIT2_ADDRESS } from '@uniswap/permit2-sdk'
import { useSignTypedData, useWriteContract } from 'wagmi'
import { parseUnits, keccak256, encodePacked } from 'viem'
// Build permit (what user authorizes)
const permit: SignatureTransfer.PermitTransferFrom = {
permitted: { token: tokenInAddress, amount: parseUnits('100', 6) },
nonce: BigInt(Date.now()) << 8n,
deadline: BigInt(Math.floor(Date.now() / 1000) + 1800n)
}
// Build witness (binds signature to this specific action)
const witness = {
actionId: keccak256(encodePacked(
['address', 'address', 'address', 'uint256'],
[tokenIn, tokenOut, vaultAddress, amountIn]
)),
}
// Get EIP-712 data
const { domain, types, values } = SignatureTransfer.getPermitData(
permit,
PERMIT2_ADDRESS,
chainId,
{ witness, witnessTypeName: 'Witness', witnessType: WITNESS_TYPE }
)
// User signs
const signature = await signTypedDataAsync(domain, types, values)
const WITNESS_TYPE: Record<string, TypedDataField[]> = {
Witness: [{ name: 'actionId', type: 'bytes32' }]
}
// actionId includes maxAmountIn since that's variable
const witness = {
actionId: keccak256(encodePacked(
['address', 'address', 'address', 'uint256', 'uint256'],
[tokenIn, tokenOut, vaultAddress, amountOut, maxAmountIn]
))
}
See permit2-signature-transfer-contract skill for Solidity implementation.
development
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
documentation
Write to contracts and send transactions. Use when executing state-changing contract functions.
development
HTTP and WebSocket transports for blockchain connectivity. Use when configuring network connections.
data-ai
Read contract data with type-safe ABI. Use when querying smart contract view/pure functions.