首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用安全帽测试智能触点

用安全帽测试智能触点
EN

Ethereum用户
提问于 2022-10-26 04:42:17
回答 2查看 418关注 0票数 0

我试着用安全帽测试我的聪明的合同。首先,我把多边形的主板分叉成这样:

代码语言:javascript
运行
复制
npx hardhat node --fork https://polygon-mainnet.g.alchemy.com/v2/...

在此之后,我可以使用以下方法运行本地测试:

代码语言:javascript
运行
复制
npx hardhat test --network local

现在,我想用uniswapV2Router测试一个交换。所以我想用几个代币来资助我的合同。因为草帽制造了几个钱包,里面有很多eth,所以我试着发送eth (在我的情况下应该是马季奇?)从一个钱包到我的合同,但我的合同余额仍然是0。所以一开始,我的聪明合同是什么样子:

代码语言:javascript
运行
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "hardhat/console.sol";
import "./interfaces/IUniswapV2Router02.sol";

contract MakeSwap is {
    address private owner;
    IUniswapV2Router02 public quickRouter;

    constructor(
        address _quickRouter
    ) {
        owner = msg.sender;
        quickRouter = IUniswapV2Router02(_quickRouter);
    }
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    receive() external payable {}

    function swapExactTokensForTokensQuick(
        uint256 _amountIn,
        uint256 _amountOutMin,
        address _tokenIn,
        address _tokenOut,
        uint256 deadline
    ) external returns (uint256) {
        IERC20(_tokenIn).approve(address(quickRouter), _amountIn);
        address[] memory path;
        path = new address[](2);
        path[0] = _tokenIn;
        path[1] = _tokenOut;
        uint256[] memory amounts = quickRouter.swapExactTokensForTokens(
            _amountIn,
            _amountOutMin,
            path,
            address(this),
            deadline
        );
        console.log(amounts[1]);
        return amounts[1];
    }
}

我正在像这样测试交换:

代码语言:javascript
运行
复制
const { SignerWithAddress } = require("@nomiclabs/hardhat-ethers/signers");
const { expect } = require("chai");
const { ethers } = require("hardhat");
const {
  IERC20,
} = require("../artifacts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.json");
const token_Address_usdc = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
const token_Address_weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
const token_Address_wmatic = "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270";
const router_quick = "0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff";
const erc20_abi = require("../abis/erc20abi.json");
const weth_abi = require("../abis/wethabi.json");

describe("test", () => {
  let Contract, owner, addr1, addr2;

  beforeEach(async () => {
    [owner, addr1, addr2, _] = await ethers.getSigners();
    factory = await ethers.getContractFactory("MakeSwap");
    Contract = await factory.deploy(router_quick);
    await Contract.deployed();

    const weth = new ethers.Contract(token_Address_weth, erc20_abi, ethers.provider);
    const usdc = new ethers.Contract(token_Address_usdc, erc20_abi, ethers.provider);
    const wmatic = new ethers.Contract(token_Address_wmatic, erc20_abi, ethers.provider);

    var contractBalance_weth = await weth.balanceOf(Contract.address);
    var contractBalance_usdc = await usdc.balanceOf(Contract.address);
    var contractBalance_wmatic = await wmatic.balanceOf(Contract.address);
    console.log("WETH Balance: ", contractBalance_weth.toString());
    console.log("USDC Balance: ", contractBalance_usdc.toString());
    console.log("WMATIC Balance: ", contractBalance_wmatic.toString());

    //Wallet #17 -> Should have 10000 ETH -> Created from hardhat
    const priv_key_17 =
      "0x...";
    const addr_17 = "0x...";

    const signer = await ethers.provider.getSigner(addr_17);
    await signer.sendTransaction({
      to: Contract.address,
      value: ethers.utils.parseUnits("1", 18),
    });

    var contractBalance_weth = await weth.balanceOf(Contract.address);
    var contractBalance_usdc = await usdc.balanceOf(Contract.address);
    var contractBalance_wmatic = await wmatic.balanceOf(Contract.address);
    console.log("WETH Balance: ", contractBalance_weth.toString());
    console.log("USDC Balance: ", contractBalance_usdc.toString());
    console.log("WMATIC Balance: ", contractBalance_wmatic.toString());
  });

  describe("trade", async () => {
    it("Should create a trade", async () => {
      const weth = new ethers.Contract(token_Address_weth, erc20_abi, ethers.provider);
      const usdc = new ethers.Contract(token_Address_usdc, erc20_abi, ethers.provider);
      const wmatic = new ethers.Contract(token_Address_wmatic, erc20_abi, ethers.provider);

      const timestamp = (await ethers.provider.getBlock("latest")).timestamp;
      const deadline = timestamp + 3000;

      amountOutMin = ethers.utils.parseUnits("2000", 6);
      amountIn = ethers.utils.parseUnits("1", 18);
      var contractBalance_weth = await weth.balanceOf(Contract.address);
      var contractBalance_usdc = await usdc.balanceOf(Contract.address);
      var contractBalance_wmatic = await wmatic.balanceOf(Contract.address);
      console.log("WETH Balance: ", contractBalance_weth.toString());
      console.log("USDC Balance: ", contractBalance_usdc.toString());
      console.log("WMATIC Balance: ", contractBalance_wmatic.toString());
      await Contract.provider.send("hardhat_setBalance", [
        Flashloan.address,
        ethers.utils.parseUnits("5", 18).toHexString(),
      ]);
      var contractBalance_weth = await weth.balanceOf(Contract.address);
      var contractBalance_usdc = await usdc.balanceOf(Contract.address);
      var contractBalance_wmatic = await wmatic.balanceOf(Contract.address);
      console.log("WETH Balance: ", contractBalance_weth.toString());
      console.log("USDC Balance: ", contractBalance_usdc.toString());
      console.log("WMATIC Balance: ", contractBalance_wmatic.toString());
      await expect(
        Contract.swapExactTokensForTokensSushi(
          amountIn,
          amountOutMin,
          token_Address_weth,
          token_Address_usdc,
          deadline
        )
      ); //.to.not.reverted;
      var contractBalance_weth = await weth.balanceOf(Contract.address);
      var contractBalance_usdc = await usdc.balanceOf(Contract.address);
      var contractBalance_wmatic = await wmatic.balanceOf(Contract.address);
      console.log("WETH Balance: ", contractBalance_weth.toString());
      console.log("USDC Balance: ", contractBalance_usdc.toString());
      console.log("WMATIC Balance: ", contractBalance_wmatic.toString());
    });
  });
});

在这里,我可以启动测试,它运行时没有任何错误,从而导致测试停止。但是在日志中,它写着:红色的eth_sendTransaction和附加信息:Error: VM Exception while processing transaction: reverted with reason string 'TransferHelper: TRANSFER_FROM_FAILED',对于所有的测试过程,我的console.log(...)语句说余额是0:

代码语言:javascript
运行
复制
WETH Balance:  0
USDC Balance:  0
WMATIC Balance:  0
WETH Balance:  0
USDC Balance:  0
WMATIC Balance:  0
WETH Balance:  0
USDC Balance:  0
WMATIC Balance:  0
WETH Balance:  0
USDC Balance:  0
WMATIC Balance:  0
WETH Balance:  0
USDC Balance:  0
WMATIC Balance:  0

有人能帮我资助我的合同并进行互换吗?如果缺少信息,请告诉我,我会添加它。

谢谢!

EN

回答 2

Ethereum用户

发布于 2022-10-26 08:44:52

另一种方法是将合同部署在孟买测试网上,从水龙头上得到一些马季奇,然后发送给你的合同。这就是我通常做测试的方式,而且它是工作的。如果您对来自uniswap路由器的特定功能有问题,只要它的v2,再写一次,我将尽力帮助您解决问题。

票数 0
EN

Ethereum用户

发布于 2022-10-28 12:04:40

因此,我找到了一种方法,将wmatic (或ethereum网络上的eth )转移到我的合同中:

代码语言:javascript
运行
复制
describe("receive", async () => {
    it("Should send tokens", async () => {
      const provider = ethers.provider;

      expect(await provider.getBalance(Contract.address)).to.equal(0);

      await addr1.sendTransaction({
        to: Contract.address,
        value: 100,
      });
      console.log(await provider.getBalance(Contract.address));
      expect(await provider.getBalance(Contract.address)).to.equal(100);
    });
  });

也可以发送其他令牌吗?还是我必须在我的智能合同中添加功能呢?

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

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

复制
相关文章

相似问题

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