-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix/eip712 #4
base: main
Are you sure you want to change the base?
Fix/eip712 #4
Conversation
uniswap/interfaceではこのリストのみ対応しているっぽいです。
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
修正を拒否します。
現状のコントラクトはEIP-712に準拠しています。そもそも、現在のEIP-712仕様と、以前のEIP-712仕様ではdomainSeparatorの計算ルールが異なっており、その結果、異なるトークン間でdomainSeparatorの計算ルールが異なっており、それぞれのトークンごとにdomainSeparatorを計算するようになっています。
例: Polygon PoSトークンコントラクトはフィールドの順序が異なります。
この問題を解決するために、EIP-5267が提起されました。現在Last Callで、2023-01-23までにFinalになる見込みです。もし修正をするなら、EIP-5267のための修正にするべきです。
個人的には、EIP-5267がすぐに浸透するとも思いません。なので、ThirdWebにJPYCを追加してもらうようにお願いしたほうが早そうです。
ref: https://ethereum-magicians.org/t/eip-5267-retrieval-of-eip-712-domain/9951/7
ありがとうございます。 |
EIP-2612の話でしたか。てっきりEIP-712とEIP-3009に関係する話だと勘違いしてました。
はい、下位互換性はあり、DOMAIN_SEPARATORの計算方法を変更する必要はありません。ただし、versionを変更し、未使用の電子署名を無効化する必要はあるかもしれません。 |
/** | ||
* @dev EIP712 Domain Separator | ||
*/ | ||
function DOMAIN_SEPARATOR() external view returns(bytes32) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[推奨]EIP-2612に準拠するという意味ならここではなく、EIP2612.solに置くべきです。
EIP712にはDOMAIN_SEPARATOR関数についての記述がないなと思っていましたが、EIP-5267を読んでEIP2612で指定されていたことに気づきました。
自分はThirdWebとUniswapしか調べていませんが、個別対応が普通であれば同感ですね。
code4renaでハードフォークする際にDOMAIN_SEPARATORが変わることを指摘されて、変更を加えた際に規格に沿わなくなってしまいました。修正内容はcode4renaに見てもらっていませんでした…
承知しました。ありがとうございます。
DOMAIN_SEPARATORはEIP-3009でも使いますし、USDC同様別ファイルでもいいと思いますが問題ありますでしょうか? |
EVM命令
なので、同じファイルにあるほうが、コンパイル結果は同じでも、可読性が良く、影響範囲が少ない。 |
おっしゃる通りです…
おお、丁寧にありがとうございます!しっくりきました。OpenZeppelinでもそうなっていますね! |
EIP712のdomain separatorの修正
現状の問題点
ThirdWebを用いてJPYCv2のpermit機能を使用しようとしたところ失敗した。原因を究明したところJPYCv2のdomain separatorに問題があることが分かった。
https://github.com/thirdweb-dev/typescript-sdk/blob/210ec0a609ad57d5e06bde22b349bba88793a40e/src/common/permit.ts#L69-L76
ThirdWebでは上記のような方法でdomain separatorを取得しているがJPYCにはDOMAIN_SEPARATORやgetDomainSeperatorという名前の関数は実装されていない(USDCはDOMAIN_SEPARATOR()を実装している)。なのでランタイムエラーになり失敗していると考えられる。ThirdWebの実装をよく見てみると
https://github.com/thirdweb-dev/typescript-sdk/blob/210ec0a609ad57d5e06bde22b349bba88793a40e/src/common/permit.ts#L181-L186
このようにdomain separatorを計算しているのだが、実際に一致しているかどうか調べているのはpolygonだけという妙な実装になっている。またversionも"1"で固定されている点も留意すべきである(USDCのversionは"2"だがUSDCには対応していない?)。
https://github.com/thirdweb-dev/typescript-sdk/blob/210ec0a609ad57d5e06bde22b349bba88793a40e/src/common/permit.ts#L181-L186
*ThirdWebではなぜかseparatorではなくseperatorを使っている。
解決方法
USDCに倣いDOMAIN_SEPARATORという名前の関数を実装する。現状同機能の_domainSeparatorV4()をinternalにし、DOMAIN_SEPARATOR()でラップする。また、USDCで実装しているversion()も念のため追加する。
テスト
ローカルネットでテストをした。v1のテストと同じものをやったが、新たに追加した機能であるDOMAIN_SEPARATOR()とversion()のテストを追加し、_domainSeparatorV4()のテストを削除した。ストレージを一つずつ確認するテストもv1と同じものをクリアした。
変更箇所
v1_1のディレクトリを新しく作成し、そこに変更したEP712Domainとパスだけ変更したEIP2612, EIP3009とFiatTokenV1を基にしたFiatTokenV1_1を置いた。それに伴い、新しくテストディレクトリv1_1とテストファイルを作成した。また、README.mdを必要な箇所更新し、その他も適宜修正した。
やっていないこと