@gooddollar/goodprotocol
Version:
GoodDollar Protocol
118 lines (103 loc) • 3.77 kB
text/typescript
/***
* This script will deploy a reserve upgrade and the DistributionHelper so that some of the expansion can be allocated
* for non-ubi purposes
* Upgrade process:
* mainnet:
* - deploy reserve
* - deploy distributionHelper
* - create proposal that:
* - upgrades the reserve
* - sets the distributionHelper at reserve with the agreed bps
* - add to the distributionHelper the contracts addresses to receive part of the UBI
*/
import { network, ethers } from "hardhat";
import { defaultsDeep } from "lodash";
import {
deployDeterministic,
printDeploy,
executeViaGuardian,
executeViaSafe,
verifyProductionSigner
} from "../multichain-deploy/helpers";
import { deployWrapper } from "../multichain-deploy/multichainWrapper-deploy";
import releaser from "../releaser";
import ProtocolSettings from "../../releases/deploy-settings.json";
import dao from "../../releases/deployment.json";
import { BigNumber } from "ethers";
const { name: networkName } = network;
export const deployFuse = async () => {
const isProduction = networkName.includes("production");
let [root, ...signers] = await ethers.getSigners();
if (isProduction) verifyProductionSigner(root);
let executionMethod = "safe";
const networkKey = networkName === "localhost" ? "production-mainnet" : networkName;
let release: { [key: string]: any } = dao[networkKey];
let settings = defaultsDeep({}, ProtocolSettings[networkName], ProtocolSettings["default"]);
console.log("got signers:", {
networkName,
networkKey,
root: root.address,
balance: await ethers.provider.getBalance(root.address).then(_ => _.toString())
});
const Wrapper = await deployWrapper();
// const Wrapper = await ethers.getContractAt("GoodDollarMintBurnWrapper", release.GoodDollarMintBurnWrapper);
const proposalContracts = [
release.NameService, //nameservice add Wrapper,MultiChainRouter
release.GoodDollar, // give mint rights to Wrapper
Wrapper.address //add multichainrouter as minter
];
const proposalEthValues = proposalContracts.map(_ => 0);
const proposalFunctionSignatures = [
"setAddresses(bytes32[],address[])",
"addMinter(address)",
"addMinter(address,uint256,uint256,uint32,uint256,uint256,uint32,bool)"
];
const proposalFunctionInputs = [
ethers.utils.defaultAbiCoder.encode(
["bytes32[]", "address[]"],
[
[
ethers.utils.keccak256(ethers.utils.toUtf8Bytes("MINTBURN_WRAPPER")),
ethers.utils.keccak256(ethers.utils.toUtf8Bytes("MULTICHAIN_ROUTER"))
],
[Wrapper.address, release.MultichainRouter]
]
), //setAddresses(bytes32[],address[])"
ethers.utils.defaultAbiCoder.encode(["address"], [Wrapper.address]), //addMinter(address)
ethers.utils.defaultAbiCoder.encode(
["address", "uint256", "uint256", "uint32", "uint256", "uint256", "uint32", "bool"],
[
release.MultichainRouter,
0,
0,
0,
0,
300 * 1e6 * 100, //300M G$ 2 decimals
1000, //10%
false
]
) //addMinter(address,uint256,uint256,uint32,uint256,uint256,uint32,bool)
];
if (executionMethod === "safe") {
return executeViaSafe(
proposalContracts,
proposalEthValues,
proposalFunctionSignatures,
proposalFunctionInputs,
networkName === "localhost" ? "0xE0c5daa7CC6F88d29505f702a53bb5E67600e7Ec" : release.GuardiansSafe,
"fuse"
);
} else {
return executeViaGuardian(
proposalContracts,
proposalEthValues,
proposalFunctionSignatures,
proposalFunctionInputs,
root
);
}
};
export const main = async () => {
await deployFuse().catch(console.log);
};
if (process.argv[1].includes("v3-fuse-multichain")) main();