因此,我正在尝试制造一个机器人,它将自动地从dai切换到usdc,直到我钱包中的dai余额减少10%。因此,现在我正试图在Goeril测试网上测试这一点,在那里我已经部署了Multiswap Smart合同,它将对Uniswap、usdc和Dai池进行交换。
但是我在实际的机器人本身上有问题,每次我尝试测试脚本时,它都说dai.balanceOf()不是一个函数。我试图修复这个问题,但是我完全被困住了,我也相信脚本还有其他的问题。
有人能帮忙吗。
Bot的脚本:
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);
});这就是我已经部署到测试网络上的合同:
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%的余额消失时循环中断为止。
我相信主要的罪魁祸首可能是这部分:
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();
var fs = require('fs');
const { ethers } = require("hardhat");
const fsPromises = fs.promises;在那里我可能遗漏了什么
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);
});发布于 2022-12-04 17:30:42
这个函数是async
const dai = ethers.getContractAt("IERC20", DAI);你必须await它,但你不能等待在最高层。您必须在async函数中调用它。在您的情况下,您必须在main中调用它
async function main() {
const dai = await ethers.getContractAt("IERC20", DAI);
}https://stackoverflow.com/questions/74678648
复制相似问题