execute_vaas.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import yargs from "yargs";
  2. import { hideBin } from "yargs/helpers";
  3. import { DefaultStore } from "../src/store";
  4. import { SubmittedWormholeMessage, Vault } from "../src/governance";
  5. import { parseVaa } from "@certusone/wormhole-sdk";
  6. import { decodeGovernancePayload } from "@pythnetwork/xc-admin-common";
  7. import { executeVaa } from "../src/executor";
  8. import { toPrivateKey } from "../src";
  9. import { COMMON_DEPLOY_OPTIONS } from "./common";
  10. const parser = yargs(hideBin(process.argv))
  11. .usage(
  12. "Tries to execute all vaas on a vault.\n" +
  13. "Useful for batch upgrades.\n" +
  14. "Usage: $0 --vault <mainnet|devnet> --private-key <private-key> --offset <offset> [--dryrun]",
  15. )
  16. .options({
  17. vault: {
  18. type: "string",
  19. default: "mainnet",
  20. choices: ["mainnet", "devnet"],
  21. desc: "Which vault to use for fetching VAAs",
  22. },
  23. "private-key": COMMON_DEPLOY_OPTIONS["private-key"],
  24. offset: {
  25. type: "number",
  26. demandOption: true,
  27. desc: "Offset to use from the last executed sequence number",
  28. },
  29. dryrun: {
  30. type: "boolean",
  31. default: false,
  32. desc: "Whether to execute the VAAs or just print them",
  33. },
  34. });
  35. async function main() {
  36. const argv = await parser.argv;
  37. let vault: Vault;
  38. if (argv.vault === "mainnet") {
  39. vault =
  40. DefaultStore.vaults[
  41. "mainnet-beta_FVQyHcooAtThJ83XFrNnv74BcinbRH3bRmfFamAHBfuj"
  42. ];
  43. } else {
  44. vault =
  45. DefaultStore.vaults[
  46. "devnet_6baWtW1zTUVMSJHJQVxDUXWzqrQeYBr6mu31j3bTKwY3"
  47. ];
  48. }
  49. console.log("Executing VAAs for vault", vault.getId());
  50. console.log(
  51. "Executing VAAs for emitter",
  52. (await vault.getEmitter()).toBase58(),
  53. );
  54. const lastSequenceNumber = await vault.getLastSequenceNumber();
  55. const startSequenceNumber = lastSequenceNumber - argv.offset;
  56. console.log(
  57. `Going from sequence number ${startSequenceNumber} to ${lastSequenceNumber}`,
  58. );
  59. for (
  60. let seqNumber = startSequenceNumber;
  61. seqNumber <= lastSequenceNumber;
  62. seqNumber++
  63. ) {
  64. const submittedWormholeMessage = new SubmittedWormholeMessage(
  65. await vault.getEmitter(),
  66. seqNumber,
  67. vault.cluster,
  68. );
  69. const vaa = await submittedWormholeMessage.fetchVaa();
  70. const decodedAction = decodeGovernancePayload(parseVaa(vaa).payload);
  71. if (!decodedAction) {
  72. console.log("Skipping unknown action for vaa ", seqNumber);
  73. continue;
  74. }
  75. console.log("Executing vaa", seqNumber);
  76. console.log(decodedAction);
  77. if (!argv.dryrun) {
  78. await executeVaa(toPrivateKey(argv["private-key"]), vaa);
  79. }
  80. }
  81. }
  82. main();