zkSyncDeployEntropy.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. require("dotenv").config({ path: ".env" });
  2. import { utils, Wallet } from "zksync-web3";
  3. import { HardhatRuntimeEnvironment } from "hardhat/types";
  4. import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
  5. import { CHAINS } from "@pythnetwork/xc-admin-common";
  6. import { assert } from "chai";
  7. import {
  8. DefaultStore,
  9. EvmChain,
  10. EvmEntropyContract,
  11. EvmWormholeContract,
  12. ENTROPY_DEFAULT_PROVIDER,
  13. } from "@pythnetwork/contract-manager";
  14. import {
  15. findWormholeContract,
  16. deployWormholeContract,
  17. } from "./zkSyncDeployWormhole";
  18. // import {Wallet as ZkWallet} from "zksync-ethers"; // Use These packages if "zksync-web3" doesn't work
  19. // import { Deployer as ZkDeployer } from "@matterlabs/hardhat-zksync";
  20. const { getDefaultConfig } = require("../scripts/contractManagerConfig");
  21. function envOrErr(name: string): string {
  22. const res = process.env[name];
  23. if (res === undefined) {
  24. throw new Error(`${name} environment variable is not set.`);
  25. }
  26. return res;
  27. }
  28. export default async function (hre: HardhatRuntimeEnvironment) {
  29. // Initialize the wallet.
  30. const wallet = Wallet.fromMnemonic(envOrErr("MNEMONIC"));
  31. const isMainnet = envOrErr("MAINNET") === "true";
  32. // Create deployer object and load the artifact of the contract we want to deploy.
  33. const deployer = new Deployer(hre, wallet);
  34. const {
  35. wormholeGovernanceChainId,
  36. wormholeGovernanceContract,
  37. wormholeInitialSigners,
  38. governanceEmitter,
  39. governanceChainId,
  40. chainName,
  41. } = getDefaultConfig(envOrErr("MIGRATIONS_NETWORK"));
  42. const wormholeReceiverChainId = CHAINS[chainName];
  43. assert(wormholeReceiverChainId !== undefined);
  44. let wormholeReceiverContractAddress = await findWormholeContract(chainName);
  45. if (!wormholeReceiverContractAddress) {
  46. console.log(`Wormhole contract not found for chain ${chainName}`);
  47. console.log("Deploying Wormhole contract...");
  48. wormholeReceiverContractAddress = await deployWormholeContract(
  49. deployer,
  50. chainName,
  51. wormholeGovernanceChainId,
  52. wormholeGovernanceContract,
  53. wormholeInitialSigners,
  54. wormholeReceiverChainId
  55. );
  56. }
  57. console.log(
  58. "WormholeReceiver contract address:",
  59. wormholeReceiverContractAddress
  60. );
  61. // // TODO: Top up accounts if necessary
  62. const executorContractAddress = await deployExecutorContract(
  63. deployer,
  64. wormholeReceiverContractAddress,
  65. wormholeReceiverChainId,
  66. governanceChainId,
  67. governanceEmitter
  68. );
  69. console.log("Executor contract address:", executorContractAddress);
  70. const entropyContractAddress = await deployEntropyContract(
  71. deployer,
  72. executorContractAddress,
  73. wormholeReceiverChainId,
  74. isMainnet
  75. );
  76. console.log("Entropy contract address:", entropyContractAddress);
  77. console.log("Saving the contract in the store...");
  78. const contract = new EvmEntropyContract(chainName, entropyContractAddress);
  79. DefaultStore.entropy_contracts[contract.getId()] = contract;
  80. DefaultStore.saveAllContracts();
  81. }
  82. async function deployExecutorContract(
  83. deployer: Deployer,
  84. wormholeReceiverContractAddress: string,
  85. wormholeReceiverChainId: number,
  86. governanceChainId: string,
  87. governanceEmitter: string
  88. ) {
  89. const executorImplArtifact = await deployer.loadArtifact(
  90. "ExecutorUpgradable"
  91. );
  92. const executorImplContract = await deployer.deploy(executorImplArtifact);
  93. console.log(
  94. "Deployed ExecutorImpl contract on",
  95. executorImplContract.address
  96. );
  97. const executorInitData = executorImplContract.interface.encodeFunctionData(
  98. "initialize",
  99. [
  100. wormholeReceiverContractAddress,
  101. 0, // lastExecutedSequence,
  102. wormholeReceiverChainId,
  103. governanceChainId,
  104. governanceEmitter,
  105. ]
  106. );
  107. const executorProxyArtifact = await deployer.loadArtifact("ERC1967Proxy");
  108. const executorProxyContract = await deployer.deploy(executorProxyArtifact, [
  109. executorImplContract.address,
  110. executorInitData,
  111. ]);
  112. console.log(`Deployed Executor contract on ${executorProxyContract.address}`);
  113. return executorProxyContract.address;
  114. }
  115. async function deployEntropyContract(
  116. deployer: Deployer,
  117. executorContractAddress: string,
  118. chainId: number,
  119. isMainnet: boolean
  120. ) {
  121. const entropyImplArtifact = await deployer.loadArtifact("EntropyUpgradable");
  122. const entropyImplContract = await deployer.deploy(entropyImplArtifact);
  123. const entropyInitData = entropyImplContract.interface.encodeFunctionData(
  124. "initialize",
  125. [
  126. executorContractAddress,
  127. executorContractAddress,
  128. 1, // pythFeeInWei
  129. isMainnet
  130. ? ENTROPY_DEFAULT_PROVIDER.mainnet
  131. : ENTROPY_DEFAULT_PROVIDER.testnet,
  132. true,
  133. ]
  134. );
  135. const entropyProxyArtifact = await deployer.loadArtifact("ERC1967Proxy");
  136. const entropyProxyContract = await deployer.deploy(entropyProxyArtifact, [
  137. entropyImplContract.address,
  138. entropyInitData,
  139. ]);
  140. return entropyProxyContract.address;
  141. }