首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继续获取dai.balanceOf()不是一个函数

继续获取dai.balanceOf()不是一个函数
EN

Stack Overflow用户
提问于 2022-12-04 16:36:03
回答 1查看 22关注 0票数 0

因此,我正在尝试制造一个机器人,它将自动地从dai切换到usdc,直到我钱包中的dai余额减少10%。因此,现在我正试图在Goeril测试网上测试这一点,在那里我已经部署了Multiswap Smart合同,它将对Uniswap、usdc和Dai池进行交换。

但是我在实际的机器人本身上有问题,每次我尝试测试脚本时,它都说dai.balanceOf()不是一个函数。我试图修复这个问题,但是我完全被困住了,我也相信脚本还有其他的问题。

有人能帮忙吗。

Bot的脚本:

代码语言:javascript
复制
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();
var fs = require('fs');
const { ethers } = require("hardhat");
const fsPromises = fs.promises;

const DAI = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
const ABI_FILE_PATH = 'artifacts/contracts/SwapExamples.sol/SwapExamples.json';
const DEPLOYED_CONTRACT_ADDRESS = '0xAb54Bf58D1cf4F6E5fe14917fa909AaAc4c4cE91';
const dai = ethers.getContractAt("IERC20", DAI);

function waitforme(milisec) {
  return new Promise(resolve => {
      setTimeout(() => { resolve('') }, milisec);
  })
}

async function getABI() {
  const data = await fsPromises.readFile(ABI_FILE_PATH, 'utf8');
  const abi = JSON.parse(data)['abi'];
  return abi
}

async function main() {

const {PRIVATE_KEY} = process.env;
const {INFURA_GORELI_ENDPOINT_KEY} = process.env;

let provider = ethers.getDefaultProvider(`https://eth-goerli.g.alchemy.com/v2/${INFURA_GORELI_ENDPOINT_KEY}`)

let signer = new ethers.Wallet(PRIVATE_KEY, provider);

const abi = await getABI();
const UniContract = new ethers.Contract(DEPLOYED_CONTRACT_ADDRESS, abi, signer);
const balance = await dai.balanceOf(signer);

  for (let i = 0; i < 111; i++) {

  const amountIn = balance

  if (amountIn.mul(10).lte(balance.mul(9))) {break;}

  await dai.connect(signer).deposit(amountIn);
  await dai.connect(signer).approve(UniContract, amountIn);
  // Swap
  let tx = await UniContract.swapExactInputMultihop(amountIn);
  await tx.wait();
  
  console.log("DAI balance", balance)
  
  await waitforme(1000);  
  
}
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
          console.error(error);
          process.exit(1);
  });

这就是我已经部署到测试网络上的合同:

代码语言:javascript
复制
pragma solidity =0.7.6;
pragma abicoder v2;

import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol";
import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";

contract SwapExamples {
    // NOTE: Does not work with SwapRouter02
    ISwapRouter public constant swapRouter =
        ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564);

    address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

    /// @notice swapInputMultiplePools swaps a fixed amount of WETH for a maximum possible amount of DAI
    /// swap USDC --> DAI --> USDC
    function swapExactInputMultihop(uint amountIn)
        external
        returns (uint amountOut)
    {
        TransferHelper.safeTransferFrom(
            DAI,
            msg.sender,
            address(this),
            amountIn
        );
        TransferHelper.safeApprove(DAI, address(swapRouter), amountIn);

        ISwapRouter.ExactInputParams memory params = ISwapRouter
            .ExactInputParams({
                path: abi.encodePacked(
                    DAI,
                    uint24(500),
                    USDC,
                    uint24(500),
                    DAI
                ),
                recipient: msg.sender,
                deadline: block.timestamp,
                amountIn: amountIn,
                amountOutMinimum: 0
            });
            
        amountOut = swapRouter.exactInput(params);
    }
}

可能还有其他问题我错过了,所以如果有人发现我的脚本有什么问题,请告诉我,我真的很感激。

所以我试着在网上搜索,看看我是否能解决这个问题。本质上,我需要在Dai -> usdc -> Dai的测试网上进行一次连续的交易,而dai的余额应该会耗尽,直到当10%的余额消失时循环中断为止。

我相信主要的罪魁祸首可能是这部分:

代码语言:javascript
复制
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();
var fs = require('fs');
const { ethers } = require("hardhat");
const fsPromises = fs.promises;

在那里我可能遗漏了什么

代码语言:javascript
复制
async function main() {

const {PRIVATE_KEY} = process.env;
const {INFURA_GORELI_ENDPOINT_KEY} = process.env;

let provider = ethers.getDefaultProvider(`https://eth-goerli.g.alchemy.com/v2/${INFURA_GORELI_ENDPOINT_KEY}`)

let signer = new ethers.Wallet(PRIVATE_KEY, provider);

const abi = await getABI();
const UniContract = new ethers.Contract(DEPLOYED_CONTRACT_ADDRESS, abi, signer);
const balance = await dai.balanceOf(signer);

  for (let i = 0; i < 111; i++) {

  const amountIn = balance

  if (amountIn.mul(10).lte(balance.mul(9))) {break;}

  await dai.connect(signer).deposit(amountIn);
  await dai.connect(signer).approve(UniContract, amountIn);
  // Swap
  let tx = await UniContract.swapExactInputMultihop(amountIn);
  await tx.wait();
  
  console.log("DAI balance", balance)
  
  await waitforme(1000);  
  
}
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
          console.error(error);
          process.exit(1);
  });
EN

回答 1

Stack Overflow用户

发布于 2022-12-04 17:30:42

这个函数是async

代码语言:javascript
复制
 const dai = ethers.getContractAt("IERC20", DAI);

你必须await它,但你不能等待在最高层。您必须在async函数中调用它。在您的情况下,您必须在main中调用它

代码语言:javascript
复制
async function main() {
   const dai = await ethers.getContractAt("IERC20", DAI);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74678648

复制
相关文章

相似问题

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