execute_vaas.ts 2.6 KB

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