deploy_evm_entropy_contracts.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /* eslint-disable @typescript-eslint/no-unsafe-call */
  2. /* eslint-disable @typescript-eslint/no-floating-promises */
  3. /* eslint-disable @typescript-eslint/no-unsafe-member-access */
  4. /* eslint-disable @typescript-eslint/no-unsafe-assignment */
  5. /* eslint-disable unicorn/prefer-top-level-await */
  6. /* eslint-disable no-console */
  7. import yargs from "yargs";
  8. import { hideBin } from "yargs/helpers";
  9. import type { BaseDeployConfig, DefaultAddresses } from "./common";
  10. import {
  11. COMMON_DEPLOY_OPTIONS,
  12. deployIfNotCached,
  13. getWeb3Contract,
  14. getOrDeployWormholeContract,
  15. topupAccountsIfNecessary,
  16. } from "./common";
  17. import { getOrDeployExecutorContract } from "./deploy_evm_executor_contracts";
  18. import type { DeploymentType } from "../src/core/base";
  19. import { toDeploymentType, toPrivateKey } from "../src/core/base";
  20. import { EvmChain } from "../src/core/chains";
  21. import {
  22. ENTROPY_DEFAULT_KEEPER,
  23. ENTROPY_DEFAULT_PROVIDER,
  24. EvmEntropyContract,
  25. } from "../src/core/contracts/evm";
  26. import { DefaultStore } from "../src/node/utils/store";
  27. type DeploymentConfig = {
  28. type: DeploymentType;
  29. saveContract: boolean;
  30. } & BaseDeployConfig;
  31. const CACHE_FILE = ".cache-deploy-evm-entropy-contracts";
  32. const parser = yargs(hideBin(process.argv))
  33. .scriptName("deploy_evm_entropy_contracts.ts")
  34. .usage(
  35. "Usage: $0 --std-output-dir <path/to/std-output-dir/> --private-key <private-key> --chain <chain> --wormhole-addr <wormhole-addr>",
  36. )
  37. .options({
  38. ...COMMON_DEPLOY_OPTIONS,
  39. chain: {
  40. type: "string",
  41. demandOption: true,
  42. desc: "Chain to upload the contract on. Can be one of the evm chains available in the store",
  43. },
  44. });
  45. async function deployEntropyContracts(
  46. chain: EvmChain,
  47. config: DeploymentConfig,
  48. executorAddr: string,
  49. ): Promise<string> {
  50. const entropyImplAddr = await deployIfNotCached(
  51. CACHE_FILE,
  52. chain,
  53. config,
  54. "EntropyUpgradable",
  55. [],
  56. );
  57. const entropyImplContract = getWeb3Contract(
  58. config.jsonOutputDir,
  59. "EntropyUpgradable",
  60. entropyImplAddr,
  61. );
  62. const entropyInitData = entropyImplContract.methods
  63. .initialize(
  64. executorAddr, // owner
  65. executorAddr, // admin
  66. 1, // pythFeeInWei
  67. chain.isMainnet()
  68. ? ENTROPY_DEFAULT_PROVIDER.mainnet
  69. : ENTROPY_DEFAULT_PROVIDER.testnet,
  70. true, // prefillRequestStorage
  71. )
  72. .encodeABI();
  73. return await deployIfNotCached(
  74. CACHE_FILE,
  75. chain,
  76. config,
  77. "ERC1967Proxy",
  78. [entropyImplAddr, entropyInitData],
  79. // NOTE: we are deploying a ERC1967Proxy when deploying executor
  80. // we need to provide a different cache key. As the `artifactname`
  81. // is same in both case which means the cache key will be same
  82. `${chain.getId()}-ERC1967Proxy-ENTROPY`,
  83. );
  84. }
  85. async function topupEntropyAccountsIfNecessary(
  86. chain: EvmChain,
  87. deploymentConfig: DeploymentConfig,
  88. ) {
  89. const accounts: [string, DefaultAddresses][] = [
  90. ["keeper", ENTROPY_DEFAULT_KEEPER],
  91. ["provider", ENTROPY_DEFAULT_PROVIDER],
  92. ];
  93. await topupAccountsIfNecessary(chain, deploymentConfig, accounts);
  94. }
  95. async function main() {
  96. const argv = await parser.argv;
  97. const chain = DefaultStore.getChainOrThrow(argv.chain, EvmChain);
  98. const deploymentConfig: DeploymentConfig = {
  99. type: toDeploymentType(argv.deploymentType),
  100. gasMultiplier: argv.gasMultiplier,
  101. gasPriceMultiplier: argv.gasPriceMultiplier,
  102. privateKey: toPrivateKey(argv.privateKey),
  103. jsonOutputDir: argv.stdOutputDir,
  104. saveContract: argv.saveContract,
  105. };
  106. const wormholeContract = await getOrDeployWormholeContract(
  107. chain,
  108. deploymentConfig,
  109. CACHE_FILE,
  110. );
  111. await topupEntropyAccountsIfNecessary(chain, deploymentConfig);
  112. const maskedDeploymentConfig = {
  113. ...deploymentConfig,
  114. privateKey: deploymentConfig.privateKey ? `<REDACTED>` : undefined,
  115. };
  116. console.log(
  117. `Deployment config: ${JSON.stringify(maskedDeploymentConfig, undefined, 2)}\n`,
  118. );
  119. console.log(`Deploying entropy contracts on ${chain.getId()}...`);
  120. const executorContract = await getOrDeployExecutorContract(
  121. chain,
  122. deploymentConfig,
  123. wormholeContract.address,
  124. );
  125. const entropyAddr = await deployEntropyContracts(
  126. chain,
  127. deploymentConfig,
  128. executorContract.address,
  129. );
  130. if (deploymentConfig.saveContract) {
  131. console.log("Saving the contract in the store...");
  132. const contract = new EvmEntropyContract(chain, entropyAddr);
  133. DefaultStore.entropy_contracts[contract.getId()] = contract;
  134. DefaultStore.saveAllContracts();
  135. }
  136. console.log(
  137. `✅ Deployed entropy contracts on ${chain.getId()} at ${entropyAddr}\n\n`,
  138. );
  139. }
  140. main();