交換にapproveは不要:708秒432件の承認が示すもの
カストディアル型スワップはウォールト接続もトークン承認も不要です。708秒で432件のapprove、うち25.7%が無制限でした。何を取り消すべきかを整理します。
署名を求めないフォーム。2026-11-09、veilswap.io/exchange を取得して文字列を数えました。46,702バイトで、walletconnect、eth_requestAccounts、ethereum.request、MetaMask、「connect wallet」はいずれも0回。注文APIは7項目を受け、うち5つが必須——ペア、金額、支払先、返金先——で、署名はありません。同じ時刻のEthereumは別の話をしていました。09:57:59〜10:09:47 UTC(ブロック26,376,584–26,376,643、708秒)の17,849トランザクションに、432件のapproveと26件のsetApprovalForAllが含まれていました。片方は「送れ」、もう片方は「許可しろ」と言います。
approveが実際に書き込むもの。ERC20トークンはallowanceというマッピングを持ちます:`allowance[owner][spender]`。`approve(spender, value)`はそこに1件書き込むだけで、コインは動きません。承認したコントラクトが後から`transferFrom(owner, ...)`をその数値まで、あなたの再署名なしで呼べるようにするだけです。DEXルーターが必要とするのは、交換トランザクションの中でウォールトからトークンを引き出すからです。カストディアル型スワップは不要で、入金アドレスへ通常の送金をすれば、プールが検知して宛先チェーンの自身の手持ちから支払います。ウォールトが署名するのは各レッグ1回の通常送金だけで、それ以外はありません。
708秒の国勢調査。432件のapproveは毎秒0.61件、その窓の全トランザクションの2.4%に当たります。111件がuint256の上限2^256−1を書き、承認の25.7%——6.4秒に1件の無制限付与です。53件は0を書き、これは取り消しで12.3%。取り消しは日常で、珍しい操作ではありません。承認先は143の異なるトークンコントラクト。USDTが106件で最多、USDC 96件、WETH 11件、LINK 7件、WBTC 7件。USDTは106件中12件が無制限(11.3%)、正の承認額の中央値は500 USDT。USDCは96件中19件が無制限(19.8%)、中央値673.3。別の10ブロックから取った78件では77件が成功(98.7%)、ガス中央値48,501、範囲24,080〜120,000でした。 (XMR→USDT 出口ルート)
無制限が選ばれる理由と、その代償。承認は無料ではありません。サンプル中央値は48,501ガス。10:10 UTCに読んだ0.09 gweiのベースフィーでは0.00000437 ETH、ETH 2,104ドルで約0.0092ドルです。30 gweiなら同じ承認が0.001455 ETH=3.06ドル、100 gweiなら10.21ドル。一度だけ上限まで承認すれば、同じトークン・同じ承認先との将来の取引でこの費用を繰り返さなくて済みます。取引は一言で言えます:通常Feeで約3ドルの1トランザクションを節約する代わりに、コントラクトへ「いつでも全残高を動かせる」権利を渡す。それが合理的なのは、承認先のコントラクトと自分の鍵管理を信頼できる場合だけです。どちらかが破綻すれば、節約した数ドルは意味を持ちません。
Permit、Permit2、そして「承認に見えない署名」。EIP-2612は承認をオフチェーンへ移しました。`permit`署名が金額、承認先、nonce、期限を運び、トークンコントラクトが`approve`トランザクションなしで受け付けます。ガスなし、オンチェーンのapprove行なし、「承認」と表示されるウォールトのプロンプトもなし。Permit2(0x000000000022D473030F116dDEE9F6B43aC78BA3)はさらに進み、Permit2コントラクトへ1回だけオンチェーン承認し、以後はトークンごとの署名で送ります。どちらも正当なツールであり、同時にフィッシングキットが求めるものです——「承認に見えない承認」を要求するために。`setApprovalForAll`はNFTで同じ形をとり、708秒間に26件、それぞれがコレクション内の全トークンを1つのオペレーターに渡しました。カストディアル型スワップにはどれも不要で、permitする対象がありません。
実際に何が起きるか。承認だけでは何も動きません。承認先が`transferFrom`を呼ぶ必要があります。危険なのは、承認先が悪意ある場合、あるいは今日は正直でも明日には侵害される場合です。その時点で、追加の署名なしに、いつでも承認額まで動かせます。署名が不要なのでウォールトのプロンプトも出ません。USDTの無制限承認は、そのアドレスのUSDT全残高を意味します。新しいシードに替えても古い承認は取り消されません。古いアドレスがトークンを持っている限り承認は生き続けるので、「新しいウォールトへ移す」は半分の対策でしかありません。取り消しは1トランザクション——この窓の432件中53件がまさにそれでした——で、USDTは現在の承認が非ゼロならまずゼロに戻す必要があるため、既存のUSDT承認の変更は1件ではなく2件になります。 (XMR→USDT 出口ルート)
スワップ側も実測。VeilSwapの注文フローは承認フローの反対です。ペアを選び、金額を入れ、支払先と返金先を貼り、自分のウォールトから送る。署名は通常の送金1回だけで、それはノートPCではなく署名デバイスの画面で確認すべきものです。注文ページは入金アドレスと`validUntil`を返します。以前の実測では100 USDTの注文は601秒の窓を持ち、その前の見積は120秒有効でした。注文APIは支払先と返金先をサーバ側に保持し、ウォールト接続を一切要求しません——dappブラウザも`eth_requestAccounts`もpermitもありません。フロー内の唯一の秘密は注文UUIDリンクで、持っている人は状態・金額・入金アドレスを見られますが、支払先と返金先は見えず、終端状態になるとハッシュも返しません。自称スワップのページが入金アドレスの前にウォールト接続やメッセージ署名を求めるなら、それはこのフローではありません。 (XMR→USDT 出口ルート)
承認の7項目チェック。(1)これから取引する額を承認し、上限は承認しない——その承認先を長期に信頼する具体的な理由がない限り。(2)すべての`permit`と`Permit2`署名を承認として読む:承認先、金額、期限を確認する。金額を含む「サインイン」プロンプトは承認です。(3)取引後に取り消す——revoke.cashやEtherscanのtoken approval checker——USDTのゼロ優先ルールを忘れずに。(4)取引用のホットウォールトを別に持つ。貯蓄のあるウォールトから承認すると、1つの悪いコントラクトが全損になります。(5)`setApprovalForAll`はNFT1個ではなくコレクション全体を渡すことだと扱う。(6)承認先アドレス自体を確認する。似た名前の偽ルーターが攻撃の全部です。(7)目的がスワップだけなら、接続しないフローを選ぶ。接続なし=承認なし、承認なし=後で取り消すものが何もない。 (XMR→USDT 出口ルート)
境界とライブスナップショット。これらはトランザクション入力の件数で、セキュリティ監査ではありません。432は60ブロックでブロードキャストされた`approve`呼び出しの数で、10ブロックのレシート抽出では98.7%が成功、つまり約100件に1件は失敗します。要点は規模であって帰属ではありません。承認は日常で、その約4分の1が無制限です。執筆時点(2026-11-09 10:04 UTC)、サイトは100 USDT-TRC20を0.14778107 XMR(XMR 676.68ドル相当)、500を0.829121(603.05)、1,000を1.658805(602.84)、5,000を8.296278(602.68)と提示。1 XMRは590.223 USDTで売れ、カタログは448資産・65ネットワーク、うち6種は追加IDが必要でした。見積は毎分動き、ページが基準です。権限の面は動きません。スワップに必要なのは送金で、承認ではありません。 (XMR→USDT 出口ルート)