import {ethers, web3} from "hardhat";
import contracts from "../config/contracts";
import deployer from "../.secret";
import fee from "../config/fee";

describe('Uniswap v3 test', () => {
  let inAmount = 1e15.toString()

  it('Univ3 swap test', async () => {
    const UNIV3_ABI = require('../abi/UNIV3_ROUTER_ABI.json')

    let univ3_contract = new web3.eth.Contract(UNIV3_ABI, contracts.UNIV3)

    let rawTx = {
      from: deployer.address,
      nonce: await web3.eth.getTransactionCount(deployer.address),
      gasPrice: web3.utils.toWei('2', 'gwei'),
      gasLimit: 1_000_000
    }

    let amountIn = inAmount
    let amountOutMin = 1
    let path = [contracts.WETH, contracts.HEX]
    let to = deployer.address

    await univ3_contract.methods
      .swapExactTokensForTokens(amountIn, amountOutMin, path, to)
      .send(rawTx).then(console.log)
  })

  it('Univ3 `exactInput` test', async () => {
    const UNIV3_ABI = require('../abi/UNIV3_ROUTER_ABI.json')

    let univ3_contract = new web3.eth.Contract(UNIV3_ABI, contracts.UNIV3)

    let rawTx = {
      from: deployer.address,
      nonce: await web3.eth.getTransactionCount(deployer.address),
      gasPrice: web3.utils.toWei('2', 'gwei'),
      gasLimit: 1e6
    }

    let amountOutMin = 1
    let deadline = parseInt(String(new Date().getTime() / 1e3)) + 60
    let path = [contracts.WETH, fee._30_per_10000, contracts.USDT]
    let to = deployer.address

    let params = {
      path: ethers.utils.solidityPack(['address', 'uint24', 'address'], path),
      recipient: to,
      deadline: deadline,
      amountIn: inAmount,
      amountOutMinimum: amountOutMin
    }

    await univ3_contract.methods
      .exactInput(params)
      .send(rawTx).then(console.log)
  })

  it('Quoter calc test', async () => {
    const QUOTER_ABI = require('../abi/QUOTER_ABI.json')

    let quoter = new web3.eth.Contract(QUOTER_ABI, contracts.QUOTER)

    await quoter.methods
      .quoteExactInputSingle(contracts.WETH, contracts.USDT, fee._30_per_10000, inAmount, 0)
      .call().then(console.log)
  })

  it('V3 tool test', async () => {
    const TOOL_V3_ABI = require('../artifacts/contracts/V3Tool.sol/V3Tool.json').abi

    let v3_tool = new web3.eth.Contract(TOOL_V3_ABI, contracts.TOOLS_V3)

    const rst = await v3_tool.methods
        .getMoreInfo(contracts.WETH, contracts.USDT, fee._30_per_10000)
        .call()

    console.log(JSON.stringify(rst))
  })
})
