我正在编写一个ERC20合约,允许另一个ERC20能够与我的合约一起工作,并且不确定如何在下面的场景中获得特定地址。
假设我的合同是CoinA
,其他人的合同是PartnerCoin
。我被代理了,他们可能被代理了,也可能没有(但是,在这个场景中,我已经知道他们是否被代理了)。假设我使用OpenZeppelin作为代理。我的代币的代理合约地址是0x123,他们的代币的合约(或代理)地址是0x456。我们可以说,如果PartnerCoin
被代理,那么它们的实现地址是0x192。
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代理合约的情况(来源)。