algorand.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { NETWORKS } from "./networks";
  2. import { impossible, Payload } from "./vaa";
  3. import { Account, Algodv2, mnemonicToSecretKey } from "algosdk";
  4. import {
  5. signSendAndConfirmAlgorand,
  6. _submitVAAAlgorand,
  7. } from "@certusone/wormhole-sdk/lib/cjs/algorand";
  8. import { CONTRACTS } from "@certusone/wormhole-sdk/lib/cjs/utils/consts";
  9. export async function execute_algorand(
  10. payload: Payload,
  11. vaa: Uint8Array,
  12. environment: "MAINNET" | "TESTNET" | "DEVNET"
  13. ) {
  14. const chainName = "algorand";
  15. let n = NETWORKS[environment][chainName];
  16. if (!n.key) {
  17. throw Error(`No ${environment} key defined for Algorand`);
  18. }
  19. if (!n.rpc) {
  20. throw Error(`No ${environment} rpc defined for Algorand`);
  21. }
  22. let contracts = CONTRACTS[environment][chainName];
  23. console.log("contracts", contracts);
  24. const ALGORAND_HOST = {
  25. algodToken: "",
  26. algodServer: n.rpc,
  27. algodPort: "",
  28. };
  29. if (environment === "DEVNET") {
  30. ALGORAND_HOST.algodToken =
  31. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  32. ALGORAND_HOST.algodPort = "4001";
  33. }
  34. let target_contract: string;
  35. switch (payload.module) {
  36. case "Core":
  37. target_contract = contracts.core;
  38. switch (payload.type) {
  39. case "GuardianSetUpgrade":
  40. console.log("Submitting new guardian set");
  41. break;
  42. case "ContractUpgrade":
  43. console.log("Upgrading core contract");
  44. break;
  45. default:
  46. impossible(payload);
  47. }
  48. break;
  49. case "NFTBridge":
  50. if (contracts.nft_bridge === undefined) {
  51. // NOTE: this code can safely be removed once the algorand NFT bridge is
  52. // released, but it's fine for it to stay, as the condition will just be
  53. // skipped once 'contracts.nft_bridge' is defined
  54. throw new Error("NFT bridge not supported yet for algorand");
  55. }
  56. target_contract = contracts.nft_bridge;
  57. switch (payload.type) {
  58. case "ContractUpgrade":
  59. console.log("Upgrading contract");
  60. break;
  61. case "RegisterChain":
  62. console.log("Registering chain");
  63. break;
  64. case "Transfer":
  65. console.log("Completing transfer");
  66. break;
  67. default:
  68. impossible(payload);
  69. }
  70. break;
  71. case "TokenBridge":
  72. if (contracts.token_bridge === undefined) {
  73. throw new Error("contracts.token_bridge is undefined");
  74. }
  75. target_contract = contracts.token_bridge;
  76. switch (payload.type) {
  77. case "ContractUpgrade":
  78. console.log("Upgrading contract");
  79. break;
  80. case "RegisterChain":
  81. console.log("Registering chain");
  82. break;
  83. case "Transfer":
  84. console.log("Completing transfer");
  85. break;
  86. case "AttestMeta":
  87. console.log("Creating wrapped token");
  88. break;
  89. case "TransferWithPayload":
  90. throw Error("Can't complete payload 3 transfer from CLI");
  91. default:
  92. impossible(payload);
  93. break;
  94. }
  95. break;
  96. default:
  97. target_contract = impossible(payload);
  98. }
  99. const target = BigInt(parseInt(target_contract));
  100. const CORE_ID = BigInt(parseInt(contracts.core));
  101. const algodClient = new Algodv2(
  102. ALGORAND_HOST.algodToken,
  103. ALGORAND_HOST.algodServer,
  104. ALGORAND_HOST.algodPort
  105. );
  106. const algoWallet: Account = mnemonicToSecretKey(n.key);
  107. // Create transaction
  108. const txs = await _submitVAAAlgorand(
  109. algodClient,
  110. target,
  111. CORE_ID,
  112. vaa,
  113. algoWallet.addr
  114. );
  115. // Sign and send transaction
  116. const result = await signSendAndConfirmAlgorand(algodClient, txs, algoWallet);
  117. console.log("Confirmed in round:", result["confirmed-round"]);
  118. }