首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何与Uniswap V2互动在一个信托基金测试套件?

我如何与Uniswap V2互动在一个信托基金测试套件?
EN

Stack Overflow用户
提问于 2022-02-03 02:35:05
回答 3查看 1K关注 0票数 1

我正在寻找一种方法来创建一个自动测试套件,可以测试我的智能合同与Uniswap V2的互动。Uniswap博士简要地提到了使用Truffle的测试,但没有提供任何示例。我希望使用带有ganache的主干网分叉来测试它。

我猜这是一个与接受的这个问题答案类似的过程,但我正在特别寻找一种方法,使用Tru显和web3.js来实现它。

例如,如果我正在测试以下合同:

代码语言:javascript
复制
pragma solidity ^0.6.6;

interface IUniswap {
  function swapExactETHForTokens(
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline)
  external
  payable
  returns (uint[] memory amounts);
  function WETH() external pure returns (address);
}

contract MyContract {
  IUniswap uniswap;

  constructor(address _uniswap) public {
    uniswap = IUniswap(_uniswap);
  }

  function swapExactETHForTokens(uint amountOutMin, address token) external payable {
    address[] memory path = new address[](2);
    path[0] = uniswap.WETH();
    path[1] = token;
    uniswap.swapExactETHForTokens{value: msg.value}(
      amountOutMin, 
      path,
      msg.sender, 
      now
    );
  }
}

我如何创建一个单元测试来验证swapExactETHForTokens()将ETH转换为?对于_uniswap的值,我一直在使用UniswapV2Router02

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-20 02:20:56

我最终还是使用了Hardhat/Ethers.js,这仅仅是因为设置一个主板分叉和运行一个自动化测试套件是多么容易。我给出了一个答案这里,解释了设置一个主干网分叉所需的步骤,并在这个问题中重用了示例契约(通过测试完成)。

但是,要具体回答这个问题,“硬帽子”有一个插件,它支持使用Truffle/Web3js进行测试。,这样您仍然可以使用Tru显/Web3js来编写测试/合同,但是可以使用Hardhat的mainnet叉特性与已经部署在主网上的其他契约进行交互。

票数 1
EN

Stack Overflow用户

发布于 2022-02-07 10:38:39

如果您使用Uniswap平台交换令牌,您将有两个步骤。您将批准令牌,在这个步骤中元询问将弹出并确认它。然后Uniswap将进行实际的交换,它从您的钱包中取出代币,并为您进行交换。

这是swapExactETHForTokens函数

代码语言:javascript
复制
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }

最后一个函数_swap调用swap函数:

从文件

同样重要的是,确保您的合同控制了足够的ETH/令牌来进行交换,并且已经批准路由器撤回这许多令牌。 想象一下,你想用50戴换尽可能多的ETH从你的智能合同。 transferFrom 在交换之前,我们的智能合同需要控制50戴。实现这一目标的最简单方法是调用DAI上的transferFrom,并将所有者设置为msg.sender:

代码语言:javascript
复制
uint amountIn = 50 * 10 ** DAI.decimals();
require(DAI.transferFrom(msg.sender, address(this), amountIn), 'transferFrom failed.');

Uniswap最终将transferFrom,但在您的令牌必须批准事务之前,它必须将uniswap address添加到其allowance映射中。

代码语言:javascript
复制
mapping(address=>mapping(address=>uint)) public allowance;
// token address is allowign uniswap address for this much token

除非有交换令牌集,并且交换令牌必须调用approve,否则不能测试契约的当前实现。

如果您有前端应用程序,当您调用契约的交换函数时,元问题将弹出并确认它。但是,在测试环境中,您需要实际的ERC20契约,您可以部署它并调用approve。在前端,您将有两个函数swapTokenapprove。你会按这个顺序给他们打电话?

代码语言:javascript
复制
const startSwap = async () => {
    await approve()
    await swapToken()
}

在测试套件中:

代码语言:javascript
复制
const MyContract = artifacts.require("MyContract");
const Dai = artifacts.require("Dai");

// ganache provides an array of accounts
contract("Uniswap", (ganachProvidedAccounts) => { 
  let myContract,dai;
  // intialize the contracts before each test
  before(async () => {
    myContract = await myContract.new();
    dai = await Dai.new();
  })

  describe("Swapping", async () => {
    it("swap tokens", async () => {
      let result;
     
      // first ask for approval of 100 token transfer
      await dai.approve(myContract.address, tokens("100"), {
        from:ganachProvidedAccounts[0] ,
      });
      // // check staking for customer
      await myContract.swapExactETHForTokens("100"), { from: ganachProvidedAccounts[0] });
      // make your assetion
})})
票数 1
EN

Stack Overflow用户

发布于 2022-03-12 21:28:03

您是否可以尝试在您的truf-config.json文件中配置一个mainnet端口,并运行类似的命令

代码语言:javascript
复制
INFURA_API_KEY=A45..
MY_ACCOUNT=0x...
ganache-cli --fork https://ropsten.infura.io/v3/$INFURA_API_KEY \ --unlock $MY_ACCOUNT \ --networkId 999

在松露配置文件中将端口999设置为ropsten_fork,然后在单独的控制台中运行

代码语言:javascript
复制
truffle console --network ropsten_fork
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70965282

复制
相关文章

相似问题

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