Browse Source

clients/js: sui setup qol changes

heyitaki 2 years ago
parent
commit
793ced36fe

+ 34 - 44
clients/js/cmds/sui/setup.ts

@@ -11,10 +11,8 @@ import {
 } from "@mysten/sui.js";
 import dotenv from "dotenv";
 import fs from "fs";
-import path from "path";
 import yargs from "yargs";
 import {
-  CONTRACTS,
   GOVERNANCE_CHAIN,
   GOVERNANCE_EMITTER,
   INITIAL_GUARDIAN_DEVNET,
@@ -42,13 +40,6 @@ export const addSetupCommands: YargsAddCommandsFn = (y: typeof yargs) =>
     "Setup devnet by deploying and initializing core and token bridges and submitting chain registrations.",
     (yargs) => {
       return yargs
-        .option("overwrite-ids", {
-          alias: "o",
-          describe: "Overwrite object IDs in the case that they've changed",
-          required: false,
-          default: false,
-          type: "boolean",
-        })
         .option("private-key", {
           alias: "k",
           describe: "Custom private key to sign txs",
@@ -63,7 +54,7 @@ export const addSetupCommands: YargsAddCommandsFn = (y: typeof yargs) =>
       const privateKey = argv["private-key"];
       const rpc = argv.rpc ?? NETWORKS[network].sui.rpc;
 
-      // Deploy & init core bridge
+      // Deploy core bridge
       console.log("[1/4] Deploying core bridge...");
       const coreBridgeDeployRes = await deploy(
         network,
@@ -71,9 +62,17 @@ export const addSetupCommands: YargsAddCommandsFn = (y: typeof yargs) =>
         rpc,
         privateKey
       );
+      if (coreBridgeDeployRes?.effects?.status.status !== "success") {
+        const coreBridgeDeployResStr = JSON.stringify(coreBridgeDeployRes);
+        throw new Error(
+          `Core bridge deployment failed. Response: ${coreBridgeDeployResStr}`
+        );
+      }
+
       logTransactionDigest(coreBridgeDeployRes);
       logPublishedPackageId(coreBridgeDeployRes);
 
+      // Init core bridge
       console.log("\n[2/4] Initializing core bridge...");
       const coreBridgePackageId = getPublishedPackageId(coreBridgeDeployRes);
       const coreBridgeInitRes = await initWormhole(
@@ -88,10 +87,17 @@ export const addSetupCommands: YargsAddCommandsFn = (y: typeof yargs) =>
       const coreBridgeStateObjectId = getCreatedObjects(coreBridgeInitRes).find(
         (e) => isSameType(e.type, `${coreBridgePackageId}::state::State`)
       ).objectId;
+      if (coreBridgeInitRes?.effects?.status.status !== "success") {
+        const coreBridgeInitResStr = JSON.stringify(coreBridgeInitRes);
+        throw new Error(
+          `Core bridge initialization failed. Response: ${coreBridgeInitResStr}`
+        );
+      }
+
       logTransactionDigest(coreBridgeInitRes);
       console.log("Core bridge state object ID", coreBridgeStateObjectId);
 
-      // Deploy & init token bridge
+      // Deploy token bridge
       console.log("\n[3/4] Deploying token bridge...");
       const tokenBridgeDeployRes = await deploy(
         network,
@@ -99,9 +105,17 @@ export const addSetupCommands: YargsAddCommandsFn = (y: typeof yargs) =>
         rpc,
         privateKey
       );
+      if (tokenBridgeDeployRes?.effects?.status.status !== "success") {
+        const tokenBridgeDeployResStr = JSON.stringify(tokenBridgeDeployRes);
+        throw new Error(
+          `Token bridge deployment failed. Response: ${tokenBridgeDeployResStr}`
+        );
+      }
+
       logTransactionDigest(tokenBridgeDeployRes);
       logPublishedPackageId(tokenBridgeDeployRes);
 
+      // Init token bridge
       console.log("\n[4/4] Initializing token bridge...");
       const tokenBridgePackageId = getPublishedPackageId(tokenBridgeDeployRes);
       const tokenBridgeInitRes = await initTokenBridge(
@@ -118,42 +132,17 @@ export const addSetupCommands: YargsAddCommandsFn = (y: typeof yargs) =>
       ).find((e) =>
         isSameType(e.type, `${tokenBridgePackageId}::state::State`)
       ).objectId;
-      logTransactionDigest(tokenBridgeInitRes);
-      console.log("Token bridge state object ID", tokenBridgeStateObjectId);
-
-      // Overwrite object IDs if they've changed
-      if (
-        overwriteIds &&
-        (coreBridgeStateObjectId !== CONTRACTS[network].sui.core ||
-          tokenBridgeStateObjectId !== CONTRACTS[network].sui.token_bridge)
-      ) {
-        console.log("\nOverwriting object IDs...");
-        const filepaths = [
-          path.resolve(__dirname, `../../consts.ts`),
-          path.resolve(__dirname, `../../../../sdk/js/sui/src/consts.ts`),
-        ];
-        for (const filepath of filepaths) {
-          const text = fs.readFileSync(filepath, "utf8").toString();
-          fs.writeFileSync(
-            filepath,
-            text
-              .replace(CONTRACTS[network].sui.core, coreBridgeStateObjectId)
-              .replace(
-                CONTRACTS[network].sui.token_bridge,
-                tokenBridgeStateObjectId
-              )
-          );
-        }
+      if (tokenBridgeInitRes?.effects?.status.status !== "success") {
+        const tokenBridgeInitResStr = JSON.stringify(tokenBridgeInitRes);
+        throw new Error(
+          `Token bridge initialization failed. Response: ${tokenBridgeInitResStr}`
+        );
       }
 
-      console.log({
-        coreBridgePackageId,
-        coreBridgeStateObjectId,
-        tokenBridgePackageId,
-        tokenBridgeStateObjectId,
-      });
+      logTransactionDigest(tokenBridgeInitRes);
+      console.log("Token bridge state object ID", tokenBridgeStateObjectId);
 
-      // Deploy & init example app
+      // Deploy example app
       console.log("\n[+1/3] Deploying example app...");
       const exampleAppDeployRes = await deploy(
         network,
@@ -164,6 +153,7 @@ export const addSetupCommands: YargsAddCommandsFn = (y: typeof yargs) =>
       logTransactionDigest(tokenBridgeDeployRes);
       logPublishedPackageId(tokenBridgeDeployRes);
 
+      // Init example app
       console.log("\n[+2/3] Initializing example app...");
       const exampleAppPackageId = getPublishedPackageId(exampleAppDeployRes);
       const exampleAppInitRes = await initExampleApp(

+ 6 - 14
clients/js/sui/publish.ts

@@ -11,6 +11,7 @@ import { resolve } from "path";
 import { Network } from "../utils";
 import { MoveToml } from "./MoveToml";
 import { SuiBuildOutput } from "./types";
+import { executeTransactionBlock } from "./utils";
 
 export const buildPackage = (packagePath: string): SuiBuildOutput => {
   if (!fs.existsSync(packagePath)) {
@@ -74,30 +75,21 @@ export const publishPackage = async (
     const build = buildPackage(packagePath);
 
     // Publish contracts
-    const transactionBlock = new TransactionBlock();
+    const tx = new TransactionBlock();
     if (network === "DEVNET") {
       // Avoid Error checking transaction input objects: GasBudgetTooHigh { gas_budget: 50000000000, max_budget: 10000000000 }
-      transactionBlock.setGasBudget(10000000000);
+      tx.setGasBudget(10000000000);
     }
-    const [upgradeCap] = transactionBlock.publish({
+    const [upgradeCap] = tx.publish({
       modules: build.modules.map((m) => Array.from(fromB64(m))),
       dependencies: build.dependencies.map((d) => normalizeSuiObjectId(d)),
     });
 
     // Transfer upgrade capability to deployer
-    transactionBlock.transferObjects(
-      [upgradeCap],
-      transactionBlock.pure(await signer.getAddress())
-    );
+    tx.transferObjects([upgradeCap], tx.pure(await signer.getAddress()));
 
     // Execute transactions
-    const res = await signer.signAndExecuteTransactionBlock({
-      transactionBlock,
-      options: {
-        showInput: true,
-        showObjectChanges: true,
-      },
-    });
+    const res = await executeTransactionBlock(signer, tx);
 
     // Update network-specific Move.toml with package ID
     const publishEvents = getPublishedObjectChanges(res);

+ 10 - 2
clients/js/sui/utils.ts

@@ -15,7 +15,6 @@ import { NETWORKS } from "../networks";
 import { Network } from "../utils";
 import { Payload, VAA, parse, serialiseVAA } from "../vaa";
 import { SuiRpcValidationError } from "./error";
-import { SuiCreateEvent, SuiPublishEvent } from "./types";
 
 const UPGRADE_CAP_TYPE = "0x2::package::UpgradeCap";
 
@@ -23,8 +22,14 @@ export const executeTransactionBlock = async (
   signer: RawSigner,
   transactionBlock: TransactionBlock
 ): Promise<SuiTransactionBlockResponse> => {
+  // As of version 0.32.2, Sui SDK outputs a RPC validation warning when the
+  // SDK falls behind the Sui version used by the RPC. We silence these
+  // warnings since the SDK is often out of sync with the RPC.
+  const consoleWarnTemp = console.warn;
+  console.warn = () => {};
+
   // Let caller handle parsing and logging info
-  return signer.signAndExecuteTransactionBlock({
+  const res = await signer.signAndExecuteTransactionBlock({
     transactionBlock,
     options: {
       showInput: true,
@@ -33,6 +38,9 @@ export const executeTransactionBlock = async (
       showObjectChanges: true,
     },
   });
+
+  console.warn = consoleWarnTemp;
+  return res;
 };
 
 export const findOwnedObjectByType = async (

+ 1 - 1
devnet/sui-devnet.yaml

@@ -63,7 +63,7 @@ spec:
           command: ["/bin/bash", "-c"]
           args:
             [
-              "cd /tmp && worm sui setup-devnet && touch success && sleep infinity",
+              "cd /tmp && ./scripts/wait_for_devnet.sh && worm sui setup-devnet && touch success && sleep infinity",
             ]
           readinessProbe:
             periodSeconds: 5

+ 2 - 2
sui/scripts/wait_for_devnet.sh

@@ -3,7 +3,7 @@
 set -e
 
 # Wait for sui to start
-while [[ "$(curl -X POST -H "Content-Type: application/json" -d '{ "jsonrpc":"2.0", "method":"rpc.discover","id":1 }' -s -o /dev/null -w '%{http_code}' 0.0.0.0:9000/)" != "200" ]]; do sleep 5; done
+while [[ "$(curl -X POST -H "Content-Type: application/json" -d '{ "jsonrpc":"2.0", "method":"rpc.discover","id":1 }' -s -o /dev/null -w '%{http_code}' 0.0.0.0:9000/)" != "200" ]]; do sleep 1; done
 
 # Wait for sui-faucet to start
-while [[ "$(curl -s -o /dev/null -w '%{http_code}' 0.0.0.0:5003/)" != "200" ]]; do sleep 5; done
+while [[ "$(curl -s -o /dev/null -w '%{http_code}' 0.0.0.0:5003/)" != "200" ]]; do sleep 1; done