upgrade_evm_pricefeed_contracts.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /* eslint-disable @typescript-eslint/await-thenable */
  2. /* eslint-disable @typescript-eslint/no-unsafe-argument */
  3. /* eslint-disable @typescript-eslint/no-unsafe-assignment */
  4. /* eslint-disable @typescript-eslint/no-unsafe-member-access */
  5. /* eslint-disable no-console */
  6. import { readFileSync } from "node:fs";
  7. import yargs from "yargs";
  8. import { hideBin } from "yargs/helpers";
  9. import {
  10. COMMON_UPGRADE_OPTIONS,
  11. getSelectedChains,
  12. makeCacheFunction,
  13. } from "./common";
  14. import { toPrivateKey } from "../src/core/base";
  15. import { loadHotWallet } from "../src/node/utils/governance";
  16. import { DefaultStore } from "../src/node/utils/store";
  17. const CACHE_FILE = ".cache-upgrade-evm";
  18. const runIfNotCached = makeCacheFunction(CACHE_FILE);
  19. const parser = yargs(hideBin(process.argv))
  20. .usage(
  21. "Deploys a new PythUpgradable contract to a set of chains and creates a governance proposal for it.\n" +
  22. `Uses a cache file (${CACHE_FILE}) to avoid deploying contracts twice\n` +
  23. "Usage: $0 --chain <chain_1> --chain <chain_2> --private-key <private_key> --ops-key-path <ops_key_path> --std-output <std_output>",
  24. )
  25. .options(COMMON_UPGRADE_OPTIONS);
  26. async function main() {
  27. const argv = await parser.argv;
  28. const selectedChains = getSelectedChains(argv);
  29. const vault =
  30. DefaultStore.vaults[
  31. "mainnet-beta_FVQyHcooAtThJ83XFrNnv74BcinbRH3bRmfFamAHBfuj"
  32. ];
  33. console.log("Using cache file", CACHE_FILE);
  34. console.log(
  35. "Upgrading on chains",
  36. selectedChains.map((c) => c.getId()),
  37. );
  38. const payloads: Buffer[] = [];
  39. for (const chain of selectedChains) {
  40. const artifact = JSON.parse(readFileSync(argv["std-output"], "utf8"));
  41. console.log("Deploying contract to", chain.getId());
  42. const address = await runIfNotCached(`deploy-${chain.getId()}`, () => {
  43. return chain.deploy(
  44. toPrivateKey(argv["private-key"]),
  45. artifact.abi,
  46. artifact.bytecode.object, // As per the artifacts generated by forge, bytecode is an object with an 'object' property
  47. [],
  48. );
  49. });
  50. console.log(`Deployed contract at ${address} on ${chain.getId()}`);
  51. payloads.push(
  52. chain.generateGovernanceUpgradePayload(address.replace("0x", "")),
  53. );
  54. }
  55. console.log("Using vault at for proposal", vault?.getId());
  56. const wallet = await loadHotWallet(argv["ops-key-path"]);
  57. console.log("Using wallet", wallet.publicKey.toBase58());
  58. await vault?.connect(wallet);
  59. const proposal = await vault?.proposeWormholeMessage(payloads);
  60. console.log("Proposal address", proposal?.address.toBase58());
  61. }
  62. // eslint-disable-next-line @typescript-eslint/no-floating-promises, unicorn/prefer-top-level-await
  63. main();