entropy-accept-admin-and-ownership.ts 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import yargs from "yargs";
  2. import { hideBin } from "yargs/helpers";
  3. import { EvmChain } from "../src/core/chains";
  4. import { loadHotWallet } from "../src/node/utils/governance";
  5. import { DefaultStore } from "../src/node/utils/store";
  6. const parser = yargs(hideBin(process.argv))
  7. .usage(
  8. "Creates governance proposal to accept pending admin or ownership transfer for Pyth entropy contracts.\n" +
  9. "Usage: $0 --chain <chain_1> --chain <chain_2> --ops-key-path <ops_key_path>",
  10. )
  11. .options({
  12. testnet: {
  13. type: "boolean",
  14. default: false,
  15. desc: "Accept for testnet contracts instead of mainnet",
  16. },
  17. "all-chains": {
  18. type: "boolean",
  19. default: false,
  20. desc: "Accept for contract on all chains. Use with --testnet flag to accept for all testnet contracts",
  21. },
  22. chain: {
  23. type: "array",
  24. string: true,
  25. desc: "Accept for contract on given chains",
  26. },
  27. "ops-key-path": {
  28. type: "string",
  29. demandOption: true,
  30. desc: "Path to the private key of the proposer to use for the operations multisig governance proposal",
  31. },
  32. });
  33. async function main() {
  34. const argv = await parser.argv;
  35. const selectedChains: EvmChain[] = [];
  36. if (argv.allChains && argv.chain)
  37. throw new Error("Cannot use both --all-chains and --chain");
  38. if (!argv.allChains && !argv.chain)
  39. throw new Error("Must use either --all-chains or --chain");
  40. for (const chain of Object.values(DefaultStore.chains)) {
  41. if (!(chain instanceof EvmChain)) continue;
  42. if (
  43. (argv.allChains && chain.isMainnet() !== argv.testnet) ||
  44. argv.chain?.includes(chain.getId())
  45. )
  46. selectedChains.push(chain);
  47. }
  48. if (argv.chain && selectedChains.length !== argv.chain.length)
  49. throw new Error(
  50. `Some chains were not found ${selectedChains
  51. .map((chain) => chain.getId())
  52. .toString()}`,
  53. );
  54. for (const chain of selectedChains) {
  55. if (chain.isMainnet() != selectedChains[0].isMainnet())
  56. throw new Error("All chains must be either mainnet or testnet");
  57. }
  58. const vault =
  59. DefaultStore.vaults[
  60. "mainnet-beta_FVQyHcooAtThJ83XFrNnv74BcinbRH3bRmfFamAHBfuj"
  61. ];
  62. const payloads: Buffer[] = [];
  63. for (const contract of Object.values(DefaultStore.entropy_contracts)) {
  64. if (selectedChains.includes(contract.chain)) {
  65. console.log("Creating payload for chain: ", contract.chain.getId());
  66. const pendingOwner = await contract.getPendingOwner();
  67. const adminPayload = contract.generateAcceptAdminPayload(pendingOwner);
  68. const ownerPayload =
  69. contract.generateAcceptOwnershipPayload(pendingOwner);
  70. payloads.push(adminPayload, ownerPayload);
  71. }
  72. }
  73. console.log("Using vault at for proposal", vault.getId());
  74. const wallet = await loadHotWallet(argv["ops-key-path"]);
  75. console.log("Using wallet ", wallet.publicKey.toBase58());
  76. await vault.connect(wallet);
  77. const proposal = await vault.proposeWormholeMessage(payloads);
  78. console.log("Proposal address", proposal.address.toBase58());
  79. }
  80. main();