计算ERC20合约中的地址



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

假设我的合同是CoinA,其他人的合同是PartnerCoin。我被代理了,他们可能被代理了,也可能没有(但是,在这个场景中,我已经知道他们是否被代理了)。假设我使用OpenZeppelin作为代理。我的代币的代理合约地址是0x123,他们的代币的合约(或代理)地址是0x456。我们可以说,如果PartnerCoin被代理,那么它们的实现地址是0x192。

人Bob过来,想把他的PartnerCoin转10个给他的朋友John。Bob的钱包地址是0x987, John的钱包地址是0x654。PartnerCoin对它的传递函数有一个要求,它必须从一个可以从CoinA调用的公共函数那里得到一个特定的响应,否则它不会进行传递。它调用这个函数,我们称之为SuperFunction,CoinA

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

在我的实现契约中,比如说,0x384,我认为情况是:

msg.sender将返回0x123,我自己的代理,因为我的代理正在调用我的实现,正确吗?

_msgSender()将返回0x987,因为他们是实际的最终用户。

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

谢谢你的帮助!

OpenZeppelin_msgSender()(来源)目前(OZ 4)。返回与全局变量msg.sender相同的值。如果msg.sender被弃用(就像它的前身tx.origin已经发生的那样),该函数的存在是为了更容易升级。

PartnerCoin调用你的SuperFunction时,他们是直接调用你的合约还是通过代理(delegatecall是你的合约)都没有区别。msg.sender始终是PartnerCoin

如果代理只执行call(而不执行delegatecall)您的合约,那么是的,msg.sender将是代理。但这不是OpenZeppelin代理合约的情况(来源)。