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

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