我想编写单元测试(使用ethers.js在hardhat-project之上),它涵盖OpenZeppelin的ERC1155合同的钩子函数:onERC1155Received。
这里的特别之处在于,这个函数的msg.sender将是原始的令牌契约,它调用transfer-method,最终执行onERC1155Received方法。
如何使msg.sender成为合同而不是普通的用户帐户?
比方说,合同中有这样的代码:
function onERC1155Received(
address operator,
address from,
uint256 tokenId,
uint256 amount,
bytes memory data
) public virtual override returns (bytes4) {
address originalToken = msg.sender;
if (!isTokenSupported(originalToken)) {
revert ErrWrongToken(originalToken);
}我如何在这里注入一个反映令牌契约的适当msg.sender?
当我想在合同上使用一个特殊的签字人时,我会:
const signer = token.connect(mySignerAccount);但是我不能用同样的方法来使用合同实例作为签字人帐户。
有什么办法可以做到吗?
发布于 2022-11-21 16:53:47
您可以使用impersonateAccount网络助手impersonateAccount网络助手模拟任何地址。考虑到一些合同的地址,你必须这样做:
await helpers.impersonateAccount(contractAddress);
const contractSigner = await ethers.getSigner(contractAddress);
await token.connect(contractSigner).onERC1155Received(...)这假设合同有足够的ETH来发送事务。如果没有,您应该首先使用setBalance辅助对象。您也可以将ETH发送到它的地址,但这假设合同可以接受ETH,但情况并不总是这样。
https://ethereum.stackexchange.com/questions/139768
复制相似问题