我在玩dapptools:dapp
我想编写一个测试,检查OpenZeppelin的transferFrom(..)函数的D1实现的gas。
这是我的测试:
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.6;
import "ds-test/test.sol";
import "./DemoErc721.sol";
contract DemoErc721Test is DSTest {
DemoErc721 a;
address testWallet = address(0x7E67aF7FF72cb87b7B0100cA8128F4673D185234);
address testWallet2 = address(0x7E67af7FF72Cb87B7b0100ca8128f4673D185235);
function setUp() public {
a = new DemoErc721();
}
function mintMultiple(uint256 numToMint) public {
a.mint(testWallet, numToMint);
assertEq(a.balanceOf(testWallet), numToMint);
}
function testMint_1() public {
mintMultiple(1);
}
function testMint_2() public {
mintMultiple(2);
}
function testMint_3() public {
mintMultiple(3);
}
function testMint_4() public {
mintMultiple(4);
}
function testMint_5() public {
mintMultiple(5);
}
function testTransfer() public {
mintMultiple(1);
a.transferFrom(testWallet, testWallet2, 1);
}
}您可以看到,在mintMultiple函数中,我们总是将令牌创建到testWallet地址。
因此,在最后的测试中,testTransfer(),我希望能够从testWallet转移到另一个钱包,因为testWallet是tokenId 1的NFT所有者。
但是,我认为我编写这个测试的方式会导致调用地址成为这个测试契约的地址,而不是testWallet地址。
“硬帽子”中类似的逻辑应该类似于这:
最后,要从另一个帐户执行合同的方法,只需将合同连接到正在执行的方法:
await greeter.connect(addr1).setGreeting("Hallo, Erde!");
因此,我的问题是,如何模拟从transferFrom调用testWallet函数?
发布于 2022-01-25 08:27:56
根据@transmissions11 11在twitter上的说法:
您不能-既不能创建测试用户契约,也不能使用Foundry,该Foundry具有此.prank()的欺骗代码。
发布于 2022-01-25 19:39:19
您可以创建另一个名为“TokenUser”的契约。使用构造函数中的令牌实例初始化它。现在,定义用户可以对令牌进行的调用,并在令牌周围编写一个包装函数。就像这样
contract TokenUser{
Token token;
constructor(Token token_) public {
token = token_;
}
function doTransfer(address to, uint amount) public returns (bool){
return token.transfer(to, amount);
}
...
//other functions
}现在,在测试契约中的setUp()中,创建令牌的一个实例,并将地址传递给用户。
contract TokenTest is DSTest{
Token token;
TokenUser user1;
TokenUser user2;
function setUp() public {
token = new Token("[required_inputs]");
user1 = new TokenUser(token);
user2 = new TokenUser(token);
}
// rest of the contract
}对于测试函数,可以使用用户实例。
function testSomething() public {
user1.transfer(address(user2),100);
user2.approve(address(user1),100);
}这种方法可以用来模拟从不同的帐户(帐户是不同的TokenUser合同)发送事务。dapphub有一个优雅的实现示例,您可以找到它的这里。
https://ethereum.stackexchange.com/questions/118808
复制相似问题