import { Interface } from "@ethersproject/abi";
import { serialize as serializeTransaction } from "@ethersproject/transactions";
import ERC20Abi from "./ABI/ERC20.json";
import ERC721Abi from "./ABI/ERC721.json";
import ERC1155Abi from "./ABI/ERC1155.json";
import PARASWAPAbi from "./ABI/PARASWAP.json";

const ERC20Interface = new Interface(ERC20Abi);
const ERC721Interface = new Interface(ERC721Abi);
const ERC1155Interface = new Interface(ERC1155Abi);
const PARASWAPInterface = new Interface(PARASWAPAbi);

export const transactionContracts = {
  erc20: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
  erc20Swap: "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0", // MATIC
  erc721: "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D", // Bored Ape
  erc1155: "0x348fc118bcc65a92dc033a951af153d14d945312", // Clone X
  paraswap: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
  random: "0xc3f95102D5c8F2c83e49Ce3Acfb905eDfb7f37dE", // jesus.eth
  random2: "0xc3f95102D5c8F2c83e49Ce3Acfb905eDfb7f37dE", // satan.eth
  uniswapUniversaRouter: "0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD",
};

export const transactionData = {
  erc20: {
    approve: ERC20Interface.encodeFunctionData("approve", [transactionContracts.random, 1]),
    transfer: ERC20Interface.encodeFunctionData("transfer", [transactionContracts.random, 1]),
  },
  erc721: {
    approve: ERC721Interface.encodeFunctionData("approve", [transactionContracts.random, 1]),
    setApprovalForAll: ERC721Interface.encodeFunctionData("setApprovalForAll", [
      transactionContracts.random,
      true,
    ]),
    transferFrom: ERC721Interface.encodeFunctionData("transferFrom", [
      transactionContracts.random,
      transactionContracts.random2,
      1,
    ]),
    safeTransferFrom: ERC721Interface.encodeFunctionData(
      "safeTransferFrom(address, address, uint256)",
      [transactionContracts.random, transactionContracts.random2, 1],
    ),
    safeTransferFromWithData: ERC721Interface.encodeFunctionData(
      "safeTransferFrom(address, address, uint256, bytes)",
      [transactionContracts.random, transactionContracts.random2, 1, "0x00"],
    ),
  },
  erc1155: {
    setApprovalForAll: ERC1155Interface.encodeFunctionData("setApprovalForAll", [
      transactionContracts.random,
      true,
    ]),
    safeTransferFrom: ERC1155Interface.encodeFunctionData("safeTransferFrom", [
      transactionContracts.random,
      transactionContracts.random2,
      1,
      1,
      "0x00",
    ]),
    safeBatchTransferFrom: ERC1155Interface.encodeFunctionData("safeBatchTransferFrom", [
      transactionContracts.random,
      transactionContracts.random2,
      [1],
      [1],
      "0x00",
    ]),
  },
  paraswap: {
    simpleSwap: PARASWAPInterface.encodeFunctionData("simpleSwap", [
      [
        "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0",
        "0x6B175474E89094C44Da98b954EedeAC495271d0F",
        "0x0de0b6b3a7640000",
        "0x0cd58f8b6f6a3bd1",
        "0x0ce6123215ecb279",
        ["0xE592427A0AEce92De3Edee1F18E0157C05861564"],
        "0xc04b8d59000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000def171fe48cf0115b1d80b88dc8eab59176fee5700000000000000000000000000000000000000000000000000000000636ceabd0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002b7d1afa7b718fb893db30a3abc0cfc608aacfebb0000bb86b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000",
        ["0x00", "0x0124"],
        ["0x00"],
        "0x0000000000000000000000000000000000000000",
        "0x558247e365be655f9144e1a0140D793984372Ef3",
        "0x010000000000000000000000000000000000000000000000000000000000405f",
        "0x",
        "0x636d310d",
        "0xda03875dad634e49b94b93aff3d28c4a",
      ],
    ]),
    swapOnUniswapV2Fork: PARASWAPInterface.encodeFunctionData("swapOnUniswapV2Fork", [
      "7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0",
      "0x0de0b6b3a7640000",
      "0x12ba8fbb209c3a65",
      "0000000000000000000000000000000000000000",
      ["0x4de55ce50407b614daff085522d476c5ec5e93a00afb"],
    ]),
  },
  uniswap: {
    ["permit2>swap-out-v3>unwrap"]:
      "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000669ba25a00000000000000000000000000000000000000000000000000000000000000030a010c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000016000000000000000000000000055747be9f9f5beb232ad59fe7af013b81d95fd5e000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000066c32ea60000000000000000000000000000000000000000000000000000000000000006000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b00000000000000000000000000000000000000000000000000000000669ba25a00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000413cbf00ab90b6d1b17401cbf49e00c40f98bcb3f39461ca65e26009f9e9f77029279a4587efa2d792ea61ede56e0fbd7c1305007bc59d09bc60eaba46efa23edd1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000233a3559d9da00000000000000000000000000000000000000000000000062e76d8ff4b926e800000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200271055747be9f9f5beb232ad59fe7af013b81d95fd5e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000233a3559d9da000",
    ["wrap>swap-in-v3"]:
      "0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000669bbbd800000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000019c1d62a9f2000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000019c1d62a9f200000000000000000000000000000000000000000000000004227ffe925d0fc0000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200271055747be9f9f5beb232ad59fe7af013b81d95fd5e000000000000000000000000000000000000000000",
  },
};

export const getSerializedTransaction = (to: string, data: string): string =>
  serializeTransaction({
    to,
    nonce: 0,
    gasLimit: 21000,
    data,
    value: 1,
    chainId: 1,
    maxPriorityFeePerGas: 10000,
    maxFeePerGas: 1000000,
    type: 2,
  }).substring(2);
