0

我正在编写一个 ERC20 合约,它允许另一个 ERC20 能够使用我的合约,并且不确定如何在下面给出的场景中获取特定地址。

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

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

我只想PartnerCoin能够打电话SuperFunction,至少现在是这样,而且我知道PartnerCoin地址是什么。

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

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

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

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

感谢您的帮助!

4

1 回答 1

0

OpenZeppelin _msgSender()( source ) 当前(OZ 4.x, Solc 0.8.x)返回与全局变量相同的值msg.sender。该功能的存在是为了更容易升级,如果msg.sender曾经被弃用(正如其前身已经发生的那样tx.origin)。

PartnerCoin调用 yourSuperFunction时,如果他们直接调用你的合约或通过代理(即delegatecall你的合约)调用你的合约并没有什么不同。msg.sender永远是PartnerCoin

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

于 2021-10-04T13:33:24.803 回答