首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在测试中重写模拟合同的地址

在测试中重写模拟合同的地址
EN

Ethereum用户
提问于 2022-08-04 22:41:26
回答 2查看 295关注 0票数 3

我有一个智能契约,它依赖于预先部署的ERC-20智能契约,它总是部署到相同的地址(本地测试网络以及公共测试网络中)。

我想将模拟智能契约的地址重写为与该地址相同的地址,但是文档没有提供任何洞察力。

因此,我正在试验的智能契约示例是文档中的基本示例:

代码语言:javascript
运行
复制
pragma solidity ^0.6.2;

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
}

contract AmIRichAlready {
    IERC20 private tokenContract;
    uint public richness = 1000000 * 10 ** 18;

    constructor (IERC20 _tokenContract) public {
        tokenContract = _tokenContract;
    }

    function check() public view returns (bool) {
        uint balance = tokenContract.balanceOf(msg.sender);
        return balance > richness;
    }
}

测试设置如下:

代码语言:javascript
运行
复制
import { expect, use } from "chai"
import { Contract, utils, Wallet } from "ethers"
import {
  deployContract,
  deployMockContract,
  MockProvider,
  solidity,
} from "ethereum-waffle"

import IERC20 from "../build/IERC20.json"
import AmIRichAlready from "../build/AmIRichAlready.json"

use(solidity)

describe("Am I Rich Already", () => {
  let mockERC20: Contract
  let contract: Contract
  let wallet: Wallet

  beforeEach(async () => {
    ;[wallet] = new MockProvider().getWallets()
    mockERC20 = await deployMockContract(wallet, IERC20.abi)
    contract = await deployContract(wallet, AmIRichAlready, [mockERC20.address])
  })
})

因此,我想为mockERC20分配一个特定的地址,以便在该地址调用方法将由模拟智能契约处理。

我试过挖掘源代码,但到目前为止没有任何进展。有没有人知道这是可能的?

EN

回答 2

Ethereum用户

发布于 2022-08-05 05:16:04

有两种方法可以做到这一点:

  1. (推荐):如果您使用的是硬帽,请使用工作服。要模拟合同,可以使用const myFake = await smock.fake('MyContract', {address: ERC-20 token's address})。可以使用myFake.functionName.returns(returnValue)设置模拟合同的返回值。这既适用于外部调用(来自以太),也适用于内部调用(来自其他契约)。我强烈建议学习Smock,而不是手动编写模拟合同,这样可以节省大量的时间。
  2. (不推荐):如果模拟部署ERC20令牌的帐户,则通常可以将合同部署到同一个地址,只要部署事务与原始部署事务具有相同的时间。您可以使用加纳奇硬帽来完成这一任务。有关更多信息,请参见合同的地址是如何计算的?
票数 2
EN

Ethereum用户

发布于 2023-02-23 07:01:28

“硬帽子”允许用户使用"hardhat_setCode“功能在内部完成此操作。

代码语言:javascript
运行
复制
        // Deploy the contract you want to replace with 
        const yourFake = await ethers.getContractFactory("YourFake")
        const yourFakeContract = await yourFake.deploy(// your args here)

        // Get the bytecode for that contract using "eth_getCode"
        const yourFakeBytecode = await hre.network.provider.send("eth_getCode", [yourFakeContract.address])

        // Replace the bytecode at the target contract address with your bytecode   
        await hre.network.provider.send("hardhat_setCode", [targetAddress, yourFakeBytecode])

注意:在运行此代码之前,要分叉您想要的块链。

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

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

复制
相关文章

相似问题

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