ERC-2612 permit の仕組み
1 度の EIP-712 署名で AI に USDC 決済能力を渡す。LemonCake は秘密鍵もカストディ権限も持たない。
課題:AI に毎回承認させたくない
AI エージェントが API を叩くたびにユーザーが approve() を承認するのは現実的でない。 かといって秘密鍵を AI に渡したら、無制限に資金が抜ける危険性。
解:ERC-2612 permit(EIP-2612) — オフチェーン署名で「90 日間 / 1 日 $25 まで spender に転送許可」という条件付き approval をオンチェーンに焼ける。
EIP-712 署名内容
{
"domain": {
"name": "USD Coin",
"version": "2",
"chainId": 8453, // Base
"verifyingContract": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" // USDC on Base
},
"types": {
"Permit": [
{ "name": "owner", "type": "address" },
{ "name": "spender", "type": "address" },
{ "name": "value", "type": "uint256" },
{ "name": "nonce", "type": "uint256" },
{ "name": "deadline", "type": "uint256" }
]
},
"message": {
"owner": "<Buyer wallet>",
"spender": "0x23e0D...E965", // LemonCake batch spender
"value": "2250000000", // 2,250 USDC = $25 × 90 day
"nonce": "<USDC.nonces(owner)>",
"deadline": "<now + 90 day>"
}
}USDC v2 contract が ERC-2612 互換なので、追加デプロイ無しでそのまま動く。
3 つの安全装置
1. Value cap($2,250 上限)
USDC contract が value を超える transferFrom を必ず reject。 これ以上は USDC スマコン自体が許可しないので、LemonCake バグでもハッキングでも超過不可能。
2. Deadline(90 日で自動失効)
deadline 経過後は署名が無効化。再利用しようとしても USDC contract が reject。 再開するには /start/v2 で再署名するだけ。
3. Off-chain daily cap($25/日)
LemonCake バックエンドが Redis でUTC 日次の累計を管理。 24h 内で $25 を超える PermitCharge リクエストは 402 で reject。 オンチェーンの value cap($2,250)が「最終防衛線」、daily cap は「日常使いの天井」という二重防御。
即時 revoke する方法
permit を即座に無効化したい場合、USDC contract に直接以下を送る:
// Basescan で USDC contract を開く // https://basescan.org/address/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913#writeProxyContract // "approve" 関数に以下を入力して Write: spender: 0x23e0D...E965 // LemonCake batch spender value: 0
1 tx でゼロ化。ガス代 ~$0.01。LemonCake の介入不要。
spender アドレス(公開)
LemonCake のバッチ spender ウォレットは: 0x23e0D...E965 ↗
このアドレスから出るのは「Buyer → Provider への USDC 転送 tx」と「ガス代用 ETH 消費」のみ。 Basescan で全履歴を監査可能。
関連 EIP / ERC
- EIP-2612: permit by signature
- EIP-712: typed structured data signing
- EIP-3009: transferWithAuthorization(x402 が利用)
関連:セキュリティ全文 →
