找出 ERC20 合约中的地址

Figuring out addresses in an ERC20 contract

我正在编写一个 ERC20 合约,允许另一个 ERC20 能够与我的合约一起工作,但我不确定如何在下面给出的场景中获得特定地址。

说我的合同是CoinA,别人的合同是PartnerCoin。我被代理了,他们可能会也可能不会(在这种情况下,我已经知道他们是否被代理了,但是)。并说我正在使用 OpenZeppelin 作为我的代理。我的币的代理合约地址是 0x123,他们的币的合约(或代理)地址是 0x456。可以说,如果PartnerCoin被代理,那么它们的实现地址就是0x192.

Bob 来了,他想把他的 10 PartnerCoin 转让给他的朋友 John。 Bob的钱包地址是0x987,John的钱包地址是0x654。 PartnerCoin 对其传输函数有一个要求,即它必须从可以从 CoinA 调用的 public 函数接收特定响应,否则它不会传输。它调用函数,我们将在 CoinA 上调用它 SuperFunction 并等待响应。

我只希望 PartnerCoin 能够调用 SuperFunction,至少现在,我知道 PartnerCoin 的地址是什么。

在我的实施合同中,比如 0x384,我相信情况是这样的:

msg.sender 会 return 0x123,我自己的代理,因为我的代理正在调用我的实现,对吗?

_msgSender() 会 return 0x987,因为他们是实际的最终用户。

return 0x456,PartnerCoin 的合约地址是什么,以便 CoinA 可以检查确实是 PartnerCoin 正在调用 SuperFunction,而不是其他硬币?

感谢您的帮助!

OpenZeppelin _msgSender() (source) 当前 (OZ 4.x, Solc 0.8.x) returns 与全局变量相同的值 msg.sender。如果 msg.sender 被弃用(就像它的前身 tx.origin 已经发生的那样),该函数的存在是为了更容易升级。

PartnerCoin 调用您的 SuperFunction 时,他们是直接调用您的合约还是通过代理调用您的合约(即 delegatecall 是您的合约)并没有什么区别. msg.sender 永远是 PartnerCoin

如果代理仅 called(而不是 delegatecalled)您的合同,那么是的,msg.sender 将是代理。但这不是 OpenZeppelin 代理合约 (source) 的情况。