首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用dapptools编写测试时,如何将事务作为特定的钱包地址发送?

在使用dapptools编写测试时,如何将事务作为特定的钱包地址发送?
EN

Ethereum用户
提问于 2022-01-13 10:07:40
回答 2查看 399关注 0票数 1

我在玩dapptools:dapp

我想编写一个测试,检查OpenZeppelin的transferFrom(..)函数的D1实现的gas。

这是我的测试:

代码语言:javascript
复制
// 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函数?

EN

回答 2

Ethereum用户

发布于 2022-01-25 08:27:56

根据@transmissions11 11在twitter上的说法:

您不能-既不能创建测试用户契约,也不能使用Foundry,该Foundry具有此.prank()的欺骗代码。

票数 0
EN

Ethereum用户

发布于 2022-01-25 19:39:19

您可以创建另一个名为“TokenUser”的契约。使用构造函数中的令牌实例初始化它。现在,定义用户可以对令牌进行的调用,并在令牌周围编写一个包装函数。就像这样

代码语言:javascript
复制
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()中,创建令牌的一个实例,并将地址传递给用户。

代码语言:javascript
复制
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
    
}

对于测试函数,可以使用用户实例。

代码语言:javascript
复制
function testSomething() public {
    user1.transfer(address(user2),100);
    user2.approve(address(user1),100);
}

这种方法可以用来模拟从不同的帐户(帐户是不同的TokenUser合同)发送事务。dapphub有一个优雅的实现示例,您可以找到它的这里

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/118808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档