簡體   English   中英

我如何在 Truffle 測試套件中與 Uniswap V2 交互?

[英]How do I interact with Uniswap V2 in a Truffle test suite?

我正在尋找一種使用 Truffle 創建自動化測試套件的方法,該套件可以測試我的智能合約與 Uniswap V2 的交互。 Uniswap 文檔簡要提到了使用 Truffle 進行測試,但沒有提供任何示例。 我希望使用帶有 ganache 的 mai.net 分支來測試它。

我猜這是一個與這個問題的公認答案類似的過程,但我正在專門尋找一種使用 Truffle 和 web3.js 來完成它的方法。

例如,如果我正在測試以下合約:

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 換成DAI 對於_uniswap的值,我一直在使用UniswapV2Router02

任何幫助將不勝感激。

無論如何,我最終還是使用了 Hardhat/Ethers.js,只是因為設置 mai.net 分支和運行自動化測試套件是多么容易。 在這里提供了一個答案,解釋了設置 mai.net 分支所需的步驟,並在這個問題中重復使用了示例合同(完成測試)。

不過,為了具體回答這個問題, Hardhat 有一個支持使用 Truffle/Web3js 進行測試的插件,因此您仍然可以使用 Truffle/Web3js 來編寫測試/合同,但已經使用 Hardhat 的 mai.net fork 功能與其他合同進行交互部署在 mai.net 上。

如果您使用 Uniswap 平台交換代幣,您將有 2 個步驟。 您將批准令牌,在此步驟中將彈出元掩碼,您將對其進行確認。 然后 Uniswap 將進行實際的交換,它將代幣從你的錢包中取出並為你進行交換。

這是swapExactETHForTokens function

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);
    }

最后 function _swap調用swap function:

來自文檔

同樣重要的是要確保您的合約控制足夠的 ETH/代幣來進行交換,並已批准路由器撤回這么多代幣。

想象一下,您想從智能合約中用 50 DAI 交換盡可能多的 ETH。

從轉移

在交換之前,我們的智能合約需要控制 50 DAI。 完成此操作的最簡單方法是在 DAI 上調用 transferFrom 並將所有者設置為 msg.sender:

uint amountIn = 50 * 10 ** DAI.decimals();
require(DAI.transferFrom(msg.sender, address(this), amountIn), 'transferFrom failed.');

最終 Uniswap 將transferFrom ,但在您的代幣必須批准交易之前,它必須將uniswap address添加到其allowance映射中。

mapping(address=>mapping(address=>uint)) public allowance;
// token address is allowign uniswap address for this much token

除非您設置了交換令牌並且您的交換令牌必須調用approve ,否則您無法測試合同的當前實施。

如果你有前端應用程序,當你調用合約的 swap function 時,metamask 會彈出,你會確認它。 但是在測試環境中,您需要實際的 ERC20 合約,部署它並調用approve 在前端,您將有兩個函數swapTokenapprove 你會按這個順序給他們打電話嗎?

const startSwap = async () => {
    await approve()
    await swapToken()
}

在測試套件中:

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
})})

您能否嘗試在 truffle-config.json 文件中配置一個 mai.net 端口並運行類似

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,然后在單獨的控制台運行

truffle console --network ropsten_fork

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM