upgrade_ton_contract.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import yargs from "yargs";
  2. import { hideBin } from "yargs/helpers";
  3. import { DefaultStore, loadHotWallet } from "../src";
  4. import { TonChain } from "../src/chains";
  5. import { CHAINS, toChainName } from "@pythnetwork/xc-admin-common";
  6. import fs from "fs";
  7. import path from "path";
  8. const parser = yargs(hideBin(process.argv))
  9. .usage(
  10. "Upgrades the Pyth contract on TON and creates a governance proposal for it.\n" +
  11. "Usage: $0 --network <mainnet|testnet> --contract-address <address> --ops-key-path <ops_key_path>"
  12. )
  13. .options({
  14. network: {
  15. type: "string",
  16. choices: ["mainnet", "testnet"],
  17. description: "Network to deploy to",
  18. demandOption: true,
  19. },
  20. "contract-address": {
  21. type: "string",
  22. description: "Address of the contract to upgrade",
  23. demandOption: true,
  24. },
  25. "ops-key-path": {
  26. type: "string",
  27. description: "Path to operations key file",
  28. demandOption: true,
  29. },
  30. });
  31. async function main() {
  32. const argv = await parser.argv;
  33. const isMainnet = argv.network === "mainnet";
  34. // Get chain ID and name from CHAINS mapping
  35. const chainId = isMainnet ? CHAINS.ton_mainnet : CHAINS.ton_testnet;
  36. const wormholeChainName = toChainName(chainId);
  37. // Get the TON chain instance with appropriate RPC URL based on network
  38. const chain = new TonChain(
  39. chainId.toString(),
  40. isMainnet,
  41. wormholeChainName,
  42. undefined,
  43. isMainnet
  44. ? "https://toncenter.com/api/v2/jsonRPC"
  45. : "https://testnet.toncenter.com/api/v2/jsonRPC"
  46. );
  47. const vault =
  48. DefaultStore.vaults[
  49. "mainnet-beta_FVQyHcooAtThJ83XFrNnv74BcinbRH3bRmfFamAHBfuj"
  50. ];
  51. console.log(
  52. `Upgrading contract on TON ${argv.network} (Chain ID: ${chainId}, Wormhole Chain Name: ${wormholeChainName})`
  53. );
  54. // Read the compiled contract from the build directory
  55. // NOTE: Remember to rebuild contract_manager before running this script because it will also build the ton contract
  56. const compiledPath = path.resolve(
  57. __dirname,
  58. "../../target_chains/ton/contracts/build/Main.compiled.json"
  59. );
  60. const compiled = JSON.parse(fs.readFileSync(compiledPath, "utf8"));
  61. const newCodeHash = compiled.hash;
  62. console.log("New code hash:", newCodeHash);
  63. // Generate governance payload for the upgrade
  64. const payload = chain.generateGovernanceUpgradePayload(newCodeHash);
  65. console.log("Generated governance payload");
  66. console.log("Payload:", payload);
  67. // Create and submit governance proposal
  68. console.log("Using vault for proposal:", vault.getId());
  69. const keypair = await loadHotWallet(argv["ops-key-path"] as string);
  70. console.log("Using wallet:", keypair.publicKey.toBase58());
  71. vault.connect(keypair);
  72. const proposal = await vault.proposeWormholeMessage([payload]);
  73. console.log("Proposal address:", proposal.address.toBase58());
  74. }
  75. main().catch((error) => {
  76. console.error("Error during upgrade:", error);
  77. process.exit(1);
  78. });