zkSyncDeploy.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import { utils, Wallet } from "zksync-web3";
  2. import { HardhatRuntimeEnvironment } from "hardhat/types";
  3. import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
  4. import loadEnv from "../scripts/loadEnv";
  5. import { CHAINS } from "xc_admin_common";
  6. import { assert } from "chai";
  7. import { writeFileSync } from "fs";
  8. loadEnv("./");
  9. function envOrErr(name: string): string {
  10. const res = process.env[name];
  11. if (res === undefined) {
  12. throw new Error(`${name} environment variable is not set.`);
  13. }
  14. return res;
  15. }
  16. export default async function (hre: HardhatRuntimeEnvironment) {
  17. // Initialize the wallet.
  18. const wallet = Wallet.fromMnemonic(envOrErr("MNEMONIC"));
  19. // Create deployer object and load the artifact of the contract we want to deploy.
  20. const deployer = new Deployer(hre, wallet);
  21. // Deposit some funds to L2 in order to be able to perform L2 transactions. Uncomment
  22. // this if the deployment account is unfunded.
  23. //
  24. // const depositAmount = ethers.utils.parseEther("0.005");
  25. // const depositHandle = await deployer.zkWallet.deposit({
  26. // to: deployer.zkWallet.address,
  27. // token: utils.ETH_ADDRESS,
  28. // amount: depositAmount,
  29. // });
  30. // // Wait until the deposit is processed on zkSync
  31. // await depositHandle.wait();
  32. // Deploy WormholeReceiver contract.
  33. const initialSigners = JSON.parse(envOrErr("INIT_SIGNERS"));
  34. const whGovernanceChainId = envOrErr("INIT_GOV_CHAIN_ID");
  35. const whGovernanceContract = envOrErr("INIT_GOV_CONTRACT"); // bytes32
  36. const chainName = envOrErr("WORMHOLE_CHAIN_NAME");
  37. const wormholeReceiverChainId = CHAINS[chainName];
  38. assert(wormholeReceiverChainId !== undefined);
  39. const receiverSetupArtifact = await deployer.loadArtifact("ReceiverSetup");
  40. const receiverImplArtifact = await deployer.loadArtifact(
  41. "ReceiverImplementation"
  42. );
  43. const wormholeReceiverArtifact = await deployer.loadArtifact(
  44. "WormholeReceiver"
  45. );
  46. const receiverSetupContract = await deployer.deploy(receiverSetupArtifact);
  47. // deploy implementation
  48. const receiverImplContract = await deployer.deploy(receiverImplArtifact);
  49. // encode initialisation data
  50. const whInitData = receiverSetupContract.interface.encodeFunctionData(
  51. "setup",
  52. [
  53. receiverImplContract.address,
  54. initialSigners,
  55. wormholeReceiverChainId,
  56. whGovernanceChainId,
  57. whGovernanceContract,
  58. ]
  59. );
  60. // deploy proxy
  61. const wormholeReceiverContract = await deployer.deploy(
  62. wormholeReceiverArtifact,
  63. [receiverSetupContract.address, whInitData]
  64. );
  65. console.log(
  66. `Deployed WormholeReceiver on ${wormholeReceiverContract.address}`
  67. );
  68. // Deploy Pyth contract.
  69. const emitterChainIds = [
  70. envOrErr("SOLANA_CHAIN_ID"),
  71. envOrErr("PYTHNET_CHAIN_ID"),
  72. ];
  73. const emitterAddresses = [
  74. envOrErr("SOLANA_EMITTER"),
  75. envOrErr("PYTHNET_EMITTER"),
  76. ];
  77. const governanceChainId = envOrErr("GOVERNANCE_CHAIN_ID");
  78. const governanceEmitter = envOrErr("GOVERNANCE_EMITTER");
  79. // Default value for this field is 0
  80. const governanceInitialSequence = Number(
  81. process.env.GOVERNANCE_INITIAL_SEQUENCE ?? "0"
  82. );
  83. const validTimePeriodSeconds = Number(envOrErr("VALID_TIME_PERIOD_SECONDS"));
  84. const singleUpdateFeeInWei = Number(envOrErr("SINGLE_UPDATE_FEE_IN_WEI"));
  85. const pythImplArtifact = await deployer.loadArtifact("PythUpgradable");
  86. const pythProxyArtifact = await deployer.loadArtifact("ERC1967Proxy");
  87. const pythImplContract = await deployer.deploy(pythImplArtifact);
  88. const pythInitData = pythImplContract.interface.encodeFunctionData(
  89. "initialize",
  90. [
  91. wormholeReceiverContract.address,
  92. emitterChainIds,
  93. emitterAddresses,
  94. governanceChainId,
  95. governanceEmitter,
  96. governanceInitialSequence,
  97. validTimePeriodSeconds,
  98. singleUpdateFeeInWei,
  99. ]
  100. );
  101. const pythProxyContract = await deployer.deploy(pythProxyArtifact, [
  102. pythImplContract.address,
  103. pythInitData,
  104. ]);
  105. console.log(`Deployed Pyth contract on ${pythProxyContract.address}`);
  106. const networkId = hre.network.config.chainId;
  107. const registryPath = `networks/${networkId}.json`;
  108. console.log(`Saving addresses in ${registryPath}`);
  109. writeFileSync(
  110. registryPath,
  111. JSON.stringify(
  112. [
  113. {
  114. contractName: "WormholeReceiver",
  115. address: wormholeReceiverContract.address,
  116. },
  117. {
  118. contractName: "PythUpgradable",
  119. address: pythProxyContract.address,
  120. },
  121. ],
  122. null,
  123. 2
  124. )
  125. );
  126. }