JPYC PrepaidのコントラクトがEIP2612に準拠していないっぽい件

そういえばPectraアップデートでバッチ処理が1トランザクションで実行できるEIP-7702が使えるようになったらしい、ということで色々動作確認をしていたら、どうもMetaMaskがインジェクションするwindow.ethereumを使ったやり方だと、出来ないらしい。2025年10月3日時点で、秘密鍵を直接使うやり方ならできるっぽい。

ERC20のトークンで支払いさせるにはapprove⇒transferFromという流れになるけど、1回目のトランザクションが失敗したら?とか、1回目のトランザクションしか送信しなかったら?とか、2回のトランザクションが両方とも成功するパターン以外を考え出すと対応が結構大変。

そこで、そういえば署名を使ってtransferFromできるようにする規格があったなーと思って調査。EIP-2612がその規格で、USDCやJPYCが対応しているらしい。

JPYC決済関数の完全ガイド 〜ステーブルコイン決済の機能とユースケース〜
JPYC Prepaid v2のメタトランザクション機能の紹介

なるほど。じゃぁ普通のERC20とEIP-2612の実装であるERC2612はどうやって見分けんの?ってことで調査を進める。

簡単な方法としては、EIP-2612の規格であるメソッドを呼び出して値が返ってくれば実装されてるだろうと判断するというものだった。

https://eips.ethereum.org/EIPS/eip-2612#specification

EIP-2612で実装すべき関数は3つあるが、そのうち2つがviewで実装されているはずなので、この2つを呼び出して確認って感じ。

簡単に確認用のコード書いて走らせてみると、JPYC Prepaidのコントラクトで実装されていない判定になる。対してUSDCのコントラクトでは問題なく実装されている判定。

一旦ethrescanに行って関数一覧を確認してみる。

https://etherscan.io/token/0x431d5dff03120afa4bdf332c61a6e1766ef37bdb#readProxyContract

DOMAIN_SEPARATOR 関数が無い /(^o^)\

ちなみにUSDCはこちら。

https://etherscan.io/token/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#readProxyContract

こちらはしっかりとDOMAIN_SEPARATOR関数が実装されている。

じゃぁソースコードはどうなってんの?ってことでetherscanで登録されているコードを確認。UUPSでデプロイされているので、実装コントラクト側のページに移動。そしてこれがEIP2612.solのコード。

Address: 0xf2fab05f...b7a8751cf | Etherscan
Contract: Verified | Balance: https://etherscan.io/address/0xf2fab05f26dc8da5a3f24d015fb043db7a8751cf#code#F8#L71 across 0 Chains | Transactions: 1 | As at Oct-04-2025 12:27:03 AM (UTC)

… permitしか実装されていない。念のため継承元のファイルも確認。AbstractFiatTokenV1.solは特になにも無し。EIP712Domain.solは、、、ん? DOMAIN_SEPARATOR の文字列が!

しかし、internalで宣言されている。。。

PRを確認すると、それに触れているものがあった。あったが、マージされておらず、EIP-2612の話はそのまま。。。

もうすぐ電子決済手段のJPYCが発行されるが、ここは修正された状態になるのだろうか。

コメント