|
| 1 | +import { HardhatRuntimeEnvironment } from "hardhat/types"; |
| 2 | +import { DeployFunction } from "hardhat-deploy/types"; |
| 3 | +import { BigNumber, BigNumberish } from "ethers"; |
| 4 | +import { getContractAddress } from "./utils/getContractAddress"; |
| 5 | +import { deployUpgradable } from "./utils/deployUpgradable"; |
| 6 | +import { changeCurrencyRate } from "./utils/klerosCoreHelper"; |
| 7 | +import { HomeChains, isSkipped, isDevnet, PNK, ETH, isMainnet } from "./utils"; |
| 8 | +import { getContractOrDeploy, getContractOrDeployUpgradable } from "./utils/getContractOrDeploy"; |
| 9 | +import { deployERC20AndFaucet, deployERC721 } from "./utils/deployTokens"; |
| 10 | +import { DisputeKitClassic, KlerosCoreNeo } from "../typechain-types"; |
| 11 | + |
| 12 | +const deployArbitration: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { |
| 13 | + const { ethers, deployments, getNamedAccounts, getChainId } = hre; |
| 14 | + const { deploy, execute } = deployments; |
| 15 | + const { AddressZero } = hre.ethers.constants; |
| 16 | + const RNG_LOOKAHEAD = 20; |
| 17 | + |
| 18 | + // fallback to hardhat node signers on local network |
| 19 | + const deployer = (await getNamedAccounts()).deployer ?? (await hre.ethers.getSigners())[0].address; |
| 20 | + const chainId = Number(await getChainId()); |
| 21 | + console.log("deploying to %s with deployer %s", HomeChains[chainId], deployer); |
| 22 | + |
| 23 | + const pnk = await deployERC20AndFaucet(hre, deployer, "PNK"); |
| 24 | + const weth = await deployERC20AndFaucet(hre, deployer, "WETH"); |
| 25 | + const nft = await deployERC721(hre, deployer, "Kleros V2 Neo Early User", "KlerosV2NeoEarlyUser"); |
| 26 | + |
| 27 | + const randomizerOracle = await getContractOrDeploy(hre, "RandomizerOracle", { |
| 28 | + from: deployer, |
| 29 | + contract: "RandomizerMock", |
| 30 | + args: [], |
| 31 | + log: true, |
| 32 | + }); |
| 33 | + |
| 34 | + await deployUpgradable(deployments, "PolicyRegistry", { from: deployer, args: [deployer], log: true }); |
| 35 | + |
| 36 | + await deployUpgradable(deployments, "EvidenceModule", { from: deployer, args: [deployer], log: true }); |
| 37 | + |
| 38 | + const rng = await deployUpgradable(deployments, "RandomizerRNG", { |
| 39 | + from: deployer, |
| 40 | + args: [randomizerOracle.address, deployer], |
| 41 | + log: true, |
| 42 | + }); |
| 43 | + |
| 44 | + const disputeKit = await deployUpgradable(deployments, "DisputeKitClassicNeo", { |
| 45 | + from: deployer, |
| 46 | + contract: "DisputeKitClassic", |
| 47 | + args: [deployer, AddressZero], |
| 48 | + log: true, |
| 49 | + }); |
| 50 | + |
| 51 | + let klerosCoreAddress = await deployments.getOrNull("KlerosCoreNeo").then((deployment) => deployment?.address); |
| 52 | + if (!klerosCoreAddress) { |
| 53 | + const nonce = await ethers.provider.getTransactionCount(deployer); |
| 54 | + klerosCoreAddress = getContractAddress(deployer, nonce + 3); // deployed on the 4th tx (nonce+3): SortitionModule Impl tx, SortitionModule Proxy tx, KlerosCore Impl tx, KlerosCore Proxy tx |
| 55 | + console.log("calculated future KlerosCoreNeo address for nonce %d: %s", nonce + 3, klerosCoreAddress); |
| 56 | + } |
| 57 | + const devnet = isDevnet(hre.network); |
| 58 | + const minStakingTime = devnet ? 180 : 1800; |
| 59 | + const maxFreezingTime = devnet ? 600 : 1800; |
| 60 | + const maxStakePerJuror = PNK(2_000); |
| 61 | + const maxTotalStaked = PNK(2_000_000); |
| 62 | + const sortitionModule = await deployUpgradable(deployments, "SortitionModuleNeo", { |
| 63 | + from: deployer, |
| 64 | + args: [ |
| 65 | + deployer, |
| 66 | + klerosCoreAddress, |
| 67 | + minStakingTime, |
| 68 | + maxFreezingTime, |
| 69 | + rng.address, |
| 70 | + RNG_LOOKAHEAD, |
| 71 | + maxStakePerJuror, |
| 72 | + maxTotalStaked, |
| 73 | + ], |
| 74 | + log: true, |
| 75 | + }); // nonce (implementation), nonce+1 (proxy) |
| 76 | + |
| 77 | + const minStake = PNK(200); |
| 78 | + const alpha = 10000; |
| 79 | + const feeForJuror = ETH(0.1); |
| 80 | + const jurorsForCourtJump = 256; |
| 81 | + const klerosCore = await deployUpgradable(deployments, "KlerosCoreNeo", { |
| 82 | + from: deployer, |
| 83 | + args: [ |
| 84 | + deployer, |
| 85 | + deployer, |
| 86 | + pnk.address, |
| 87 | + AddressZero, |
| 88 | + disputeKit.address, |
| 89 | + false, |
| 90 | + [minStake, alpha, feeForJuror, jurorsForCourtJump], |
| 91 | + [0, 0, 0, 10], // evidencePeriod, commitPeriod, votePeriod, appealPeriod |
| 92 | + ethers.utils.hexlify(5), // Extra data for sortition module will return the default value of K |
| 93 | + sortitionModule.address, |
| 94 | + nft.address, |
| 95 | + ], |
| 96 | + log: true, |
| 97 | + }); // nonce+2 (implementation), nonce+3 (proxy) |
| 98 | + |
| 99 | + // execute DisputeKitClassic.changeCore() only if necessary |
| 100 | + const disputeKitContract = (await hre.ethers.getContract("DisputeKitClassicNeo")) as DisputeKitClassic; |
| 101 | + const currentCore = await disputeKitContract.core(); |
| 102 | + if (currentCore !== klerosCore.address) { |
| 103 | + console.log(`disputeKit.changeCore(${klerosCore.address})`); |
| 104 | + await disputeKitContract.changeCore(klerosCore.address); |
| 105 | + } |
| 106 | + |
| 107 | + const core = (await hre.ethers.getContract("KlerosCoreNeo")) as KlerosCoreNeo; |
| 108 | + try { |
| 109 | + await changeCurrencyRate(core, weth.address, true, 1, 1); |
| 110 | + } catch (e) { |
| 111 | + console.error("failed to change currency rates:", e); |
| 112 | + } |
| 113 | + |
| 114 | + const disputeTemplateRegistry = await getContractOrDeployUpgradable(hre, "DisputeTemplateRegistry", { |
| 115 | + from: deployer, |
| 116 | + args: [deployer], |
| 117 | + log: true, |
| 118 | + }); |
| 119 | + |
| 120 | + const resolver = await deploy("DisputeResolverNeo", { |
| 121 | + from: deployer, |
| 122 | + contract: "DisputeResolver", |
| 123 | + args: [core.address, disputeTemplateRegistry.address], |
| 124 | + log: true, |
| 125 | + }); |
| 126 | + |
| 127 | + console.log(`core.changeArbitrableWhitelist(${resolver.address}, true)`); |
| 128 | + await core.changeArbitrableWhitelist(resolver.address, true); |
| 129 | +}; |
| 130 | + |
| 131 | +deployArbitration.tags = ["ArbitrationNeo"]; |
| 132 | +deployArbitration.skip = async ({ network }) => { |
| 133 | + return isSkipped(network, !HomeChains[network.config.chainId ?? 0]); |
| 134 | +}; |
| 135 | + |
| 136 | +export default deployArbitration; |
0 commit comments