找出 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
如果代理仅 call
ed(而不是 delegatecall
ed)您的合同,那么是的,msg.sender
将是代理。但这不是 OpenZeppelin 代理合约 (source) 的情况。
我正在编写一个 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
如果代理仅 call
ed(而不是 delegatecall
ed)您的合同,那么是的,msg.sender
将是代理。但这不是 OpenZeppelin 代理合约 (source) 的情况。