import { network, ethers, upgrades, run } from "hardhat";
import { Contract } from "ethers";
import { getImplementationAddress } from "@openzeppelin/upgrades-core";

import { deployDeterministic, printDeploy, verifyContract } from "./helpers";
import releaser from "../../scripts/releaser";
import ProtocolSettings from "../../releases/deploy-settings.json";
import dao from "../../releases/deployment.json";

const INITIAL_CAP = 100000000000; //1B G$s
const { name } = network;

export const deployWrapper = async (defaultAdmin = null) => {
  let release: { [key: string]: any } = dao[network.name];

  let [root, ...signers] = await ethers.getSigners();
  //generic call permissions
  let schemeMock = root;

  console.log("got signers:", {
    network,
    root: root.address,
    schemeMock: schemeMock.address,
    balance: await ethers.provider.getBalance(root.address).then(_ => _.toString())
  });

  console.log("MintBurnWrapper deploy params:", [
    release.GoodDollar,
    defaultAdmin || release.GuardiansSafe,
    release.NameService
  ]);

  const Wrapper = (await deployDeterministic(
    {
      name: "GoodDollarMintBurnWrapper",
      salt: "MintBurnWrapper",
      isUpgradeable: true
    },
    [defaultAdmin || release.GuardiansSafe, release.NameService]
  ).then(printDeploy)) as Contract;

  release = {
    GoodDollarMintBurnWrapper: Wrapper.address
  };
  await releaser(release, network.name, "deployment", false);

  const impl = await getImplementationAddress(ethers.provider, Wrapper.address);
  await verifyContract(impl, "GoodDollarMintBurnWrapper", network.name);

  return Wrapper;
};

export const main = async (networkName = name) => {
  await deployWrapper().catch(console.log);
};

if (process.argv[1].includes("multichainWrapper")) {
  main();
}
