Skip to content
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

讨论一下如何自动 fetch proxy contract 的 implemetation abi #6

Closed
noyyyy opened this issue Jun 30, 2023 · 6 comments
Closed

Comments

@noyyyy
Copy link

noyyyy commented Jun 30, 2023

对于 proxy 合约,比较正确的方式应该是使用 implmentation 的 abi,或者是将 proxy 和 implementation 的 abi 结合在一起,因为其 纯 proxy 的 abi 没什么调用的意义。

etherscan 并没有直接获取 proxy 合约实现地址的方法,但根据 etherscan 之前的 blog(https://medium.com/etherscan-blog/and-finally-proxy-contract-support-on-etherscan-693e3da0714b) ,可以仿照着这样做:

  1. 支持一些简单的 proxy 模式(单个 implemtation),记下来这些简单的 implemtation 的存储槽位。
  2. 读特定存储槽位是否有值,如果有值,就可以认为是代理合约,然后去拿读到的 implementation 合约的 abi

一些简单的例子:

  • EIP1967 的实现地址槽位是 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
  • EIP1822 的槽位: 0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7
  • EIP1167 的实现合约地址在 bytecode 里面,读它的前几位判断是否是 eip1167,然后再拆分字符串找到实现地址
@LidamaoHub
Copy link
Member

有理,我尝试一下.
似乎基于openzeplling的合约可以通过0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc这个地址来访问到合约,然后使用etherscan的合约接口可以获得最新abi

EIP1822和EIP1167是否有例子呢? @noyyyy

@noyyyy
Copy link
Author

noyyyy commented Jul 1, 2023

@noyyyy
Copy link
Author

noyyyy commented Jul 1, 2023

@LidamaoHub EIP1167: sudoswap 的 pair https://etherscan.io/address/0xbbB87C6f2D264451ec89FD7a630913f9aB405e52#code EIP1822: 随便找到了一个 token https://etherscan.io/address/0x39fBBABf11738317a448031930706cd3e612e1B9

Update: sudoswap 的 pair 不能算是标准的 eip1167,看这个例子吧 https://etherscan.io/address/0x47423c6cd0300ce522d441b19586b619c8bd2940#code

@LidamaoHub
Copy link
Member

有个粗暴方案,直接读取1967和1822的插槽,取第一个合法地址,基本能cover大部分upgradeable合约 @noyyyy

@noyyyy
Copy link
Author

noyyyy commented Jul 1, 2023

有个粗暴方案,直接读取1967和1822的插槽,取第一个合法地址,基本能cover大部分upgradeable合约 @noyyyy

赞同,这两个应该比较主流。我自己用的更多是 eip1967.

@LidamaoHub
Copy link
Member

image

new update will be deployed soon!
@noyyyy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants