Kaynağa Gözat

fix(contract-manager): fixed a ton of typing and build issues

benduran 3 hafta önce
ebeveyn
işleme
3da6a9c8a0
55 değiştirilmiş dosya ile 415 ekleme ve 281 silme
  1. 105 20
      contract_manager/package.json
  2. 5 2
      contract_manager/src/core/base.ts
  3. 45 39
      contract_manager/src/core/chains.ts
  4. 8 3
      contract_manager/src/core/contracts/aptos.ts
  5. 14 14
      contract_manager/src/core/contracts/cosmwasm.ts
  6. 4 4
      contract_manager/src/core/contracts/evm.ts
  7. 79 40
      contract_manager/src/core/contracts/fuel.ts
  8. 10 10
      contract_manager/src/core/contracts/iota.ts
  9. 6 6
      contract_manager/src/core/contracts/near.ts
  10. 11 7
      contract_manager/src/core/contracts/starknet.ts
  11. 10 10
      contract_manager/src/core/contracts/sui.ts
  12. 28 14
      contract_manager/src/core/contracts/ton.ts
  13. 2 2
      contract_manager/src/core/contracts/wormhole.ts
  14. 1 1
      contract_manager/src/core/token.ts
  15. 5 5
      contract_manager/src/node/utils/executor.ts
  16. 16 15
      contract_manager/src/node/utils/governance.ts
  17. 10 8
      contract_manager/src/node/utils/store.ts
  18. 0 0
      contract_manager/src/store/chains/AptosChains.json
  19. 0 0
      contract_manager/src/store/chains/CosmWasmChains.json
  20. 0 0
      contract_manager/src/store/chains/EvmChains.json
  21. 0 0
      contract_manager/src/store/chains/FuelChains.json
  22. 0 0
      contract_manager/src/store/chains/IotaChains.json
  23. 0 0
      contract_manager/src/store/chains/NearChains.json
  24. 0 0
      contract_manager/src/store/chains/StarknetChains.json
  25. 0 0
      contract_manager/src/store/chains/SuiChains.json
  26. 0 0
      contract_manager/src/store/chains/TonChains.json
  27. 0 0
      contract_manager/src/store/contracts/AptosPriceFeedContracts.json
  28. 0 0
      contract_manager/src/store/contracts/AptosWormholeContracts.json
  29. 0 0
      contract_manager/src/store/contracts/CosmWasmPriceFeedContracts.json
  30. 0 0
      contract_manager/src/store/contracts/CosmWasmWormholeContracts.json
  31. 0 0
      contract_manager/src/store/contracts/EvmEntropyContracts.json
  32. 0 0
      contract_manager/src/store/contracts/EvmExecutorContracts.json
  33. 0 0
      contract_manager/src/store/contracts/EvmLazerContracts.json
  34. 0 0
      contract_manager/src/store/contracts/EvmPriceFeedContracts.json
  35. 0 0
      contract_manager/src/store/contracts/EvmWormholeContracts.json
  36. 0 0
      contract_manager/src/store/contracts/FuelPriceFeedContracts.json
  37. 0 0
      contract_manager/src/store/contracts/FuelWormholeContracts.json
  38. 0 0
      contract_manager/src/store/contracts/IotaPriceFeedContracts.json
  39. 0 0
      contract_manager/src/store/contracts/IotaWormholeContracts.json
  40. 0 0
      contract_manager/src/store/contracts/NearPriceFeedContracts.json
  41. 0 0
      contract_manager/src/store/contracts/NearWormholeContracts.json
  42. 0 0
      contract_manager/src/store/contracts/StarknetPriceFeedContracts.json
  43. 0 0
      contract_manager/src/store/contracts/StarknetWormholeContracts.json
  44. 0 0
      contract_manager/src/store/contracts/SuiPriceFeedContracts.json
  45. 0 0
      contract_manager/src/store/contracts/SuiWormholeContracts.json
  46. 0 0
      contract_manager/src/store/contracts/TonPriceFeedContracts.json
  47. 0 0
      contract_manager/src/store/contracts/TonWormholeContracts.json
  48. 0 0
      contract_manager/src/store/tokens/Tokens.json
  49. 0 0
      contract_manager/src/store/vaults/UpgradeVaults.json
  50. 8 5
      contract_manager/src/utils/utils.ts
  51. 3 1
      contract_manager/tsconfig.build.json
  52. 5 1
      contract_manager/tsconfig.json
  53. 38 72
      pnpm-lock.yaml
  54. 1 1
      pnpm-workspace.yaml
  55. 1 1
      target_chains/cosmwasm/tools/package.json

+ 105 - 20
contract_manager/package.json

@@ -4,37 +4,105 @@
   "description": "Set of tools to manage pyth contracts",
   "private": true,
   "exports": {
-    "./node/*": {
-      "types": "./lib/node/utils/*.d.ts",
-      "default": "./lib/node/utils/*.js"
+    "./core/base": {
+      "default": "./dist/core/base.js",
+      "types": "./dist/core/base.d.ts"
     },
-    "./core/*": {
-      "types": "./lib/core/*.d.ts",
-      "default": "./lib/core/*.js"
+    "./core/chains": {
+      "default": "./dist/core/chains.js",
+      "types": "./dist/core/chains.d.ts"
     },
+    "./core/contracts/aptos": {
+      "default": "./dist/core/contracts/aptos.js",
+      "types": "./dist/core/contracts/aptos.d.ts"
+    },
+    "./core/contracts/cosmwasm": {
+      "default": "./dist/core/contracts/cosmwasm.js",
+      "types": "./dist/core/contracts/cosmwasm.d.ts"
+    },
+    "./core/contracts/evm": {
+      "default": "./dist/core/contracts/evm.js",
+      "types": "./dist/core/contracts/evm.d.ts"
+    },
+    "./core/contracts/evm_abis": {
+      "default": "./dist/core/contracts/evm_abis.js",
+      "types": "./dist/core/contracts/evm_abis.d.ts"
+    },
+    "./core/contracts/fuel": {
+      "default": "./dist/core/contracts/fuel.js",
+      "types": "./dist/core/contracts/fuel.d.ts"
+    },
+    "./core/contracts": {
+      "default": "./dist/core/contracts/index.js",
+      "types": "./dist/core/contracts/index.d.ts"
+    },
+    "./core/contracts/iota": {
+      "default": "./dist/core/contracts/iota.js",
+      "types": "./dist/core/contracts/iota.d.ts"
+    },
+    "./core/contracts/near": {
+      "default": "./dist/core/contracts/near.js",
+      "types": "./dist/core/contracts/near.d.ts"
+    },
+    "./core/contracts/starknet": {
+      "default": "./dist/core/contracts/starknet.js",
+      "types": "./dist/core/contracts/starknet.d.ts"
+    },
+    "./core/contracts/sui": {
+      "default": "./dist/core/contracts/sui.js",
+      "types": "./dist/core/contracts/sui.d.ts"
+    },
+    "./core/contracts/ton": {
+      "default": "./dist/core/contracts/ton.js",
+      "types": "./dist/core/contracts/ton.d.ts"
+    },
+    "./core/contracts/wormhole": {
+      "default": "./dist/core/contracts/wormhole.js",
+      "types": "./dist/core/contracts/wormhole.d.ts"
+    },
+    "./core/token": {
+      "default": "./dist/core/token.js",
+      "types": "./dist/core/token.d.ts"
+    },
+    "./node/utils/executor": {
+      "default": "./dist/node/utils/executor.js",
+      "types": "./dist/node/utils/executor.d.ts"
+    },
+    "./node/utils/governance": {
+      "default": "./dist/node/utils/governance.js",
+      "types": "./dist/node/utils/governance.d.ts"
+    },
+    "./node/utils/shell": {
+      "default": "./dist/node/utils/shell.js",
+      "types": "./dist/node/utils/shell.d.ts"
+    },
+    "./node/utils/store": {
+      "default": "./dist/node/utils/store.js",
+      "types": "./dist/node/utils/store.d.ts"
+    },
+    "./utils/utils": {
+      "default": "./dist/utils/utils.js",
+      "types": "./dist/utils/utils.d.ts"
+    },
+    "./package.json": "./package.json",
     "./data/chains/*.json": {
-      "default": "./store/chains/*.json"
+      "default": "./dist/store/chains/*.json"
     },
     "./data/contracts/*.json": {
-      "default": "./store/contracts/*.json"
+      "default": "./dist/store/contracts/*.json"
     },
     "./data/tokens/*.json": {
-      "default": "./store/tokens/*.json"
+      "default": "./dist/store/tokens/*.json"
     },
     "./data/vaults/*.json": {
-      "default": "./store/vaults/*.json"
-    },
-    "./utils/*": {
-      "types": "./lib/utils/*.d.ts",
-      "default": "./lib/utils/*.js"
+      "default": "./dist/store/vaults/*.json"
     }
   },
   "files": [
-    "lib/**/*",
-    "store/**/*.json"
+    "dist/**/*"
   ],
   "scripts": {
-    "build": "ts-duality",
+    "build": "ts-duality --noEsm --copyOtherFiles",
     "shell": "ts-node ./src/node/utils/shell.ts",
     "fix:lint": "eslint src/ scripts/ --fix --max-warnings 0",
     "fix:format": "prettier --write \"src/**/*.ts\" \"scripts/**/*.ts\"",
@@ -91,8 +159,9 @@
     "web3-eth-contract": "^1.8.2"
   },
   "devDependencies": {
-    "@types/web3": "^1.2.2",
+    "@pythnetwork/pyth-crosschain": "link:..",
     "@types/node": "catalog:",
+    "@types/web3": "^1.2.2",
     "eslint": "^8.0.0",
     "prettier": "catalog:",
     "typedoc": "^0.25.7"
@@ -102,5 +171,21 @@
     "pnpm": ">=10.19.0"
   },
   "packageManager": "pnpm@10.19.0",
-  "type": "module"
-}
+  "type": "module",
+  "ts-duality": {
+    "extraExports": {
+      "./data/chains/*.json": {
+        "default": "./dist/store/chains/*.json"
+      },
+      "./data/contracts/*.json": {
+        "default": "./dist/store/contracts/*.json"
+      },
+      "./data/tokens/*.json": {
+        "default": "./dist/store/tokens/*.json"
+      },
+      "./data/vaults/*.json": {
+        "default": "./dist/store/vaults/*.json"
+      }
+    }
+  }
+}

+ 5 - 2
contract_manager/src/core/base.ts

@@ -1,4 +1,4 @@
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 import { Chain } from "./chains";
 
 export interface TxResult {
@@ -77,7 +77,10 @@ export abstract class PriceFeedContract extends Storable {
    * Returns the base update fee for this contract
    * This is the required fee for updating the price feeds in the contract
    */
-  abstract getBaseUpdateFee(): Promise<{ amount: string; denom?: string }>;
+  abstract getBaseUpdateFee(): Promise<{
+    amount: string;
+    denom?: string | undefined;
+  }>;
 
   /**
    * Returns the last governance sequence that was executed on this contract

+ 45 - 39
contract_manager/src/core/chains.ts

@@ -1,13 +1,18 @@
-import { KeyValueConfig, PrivateKey, Storable, TxResult } from "./base";
 import {
-  ChainName,
+  type KeyValueConfig,
+  type PrivateKey,
+  Storable,
+  type TxResult,
+} from "./base";
+import {
+  type ChainName,
   SetFee,
   CosmosUpgradeContract,
   EvmUpgradeContract,
   toChainId,
   SetDataSources,
   SetValidPeriod,
-  DataSource,
+  type DataSource,
   EvmSetWormholeAddress,
   UpgradeContract256Bit,
   EvmExecute,
@@ -24,17 +29,17 @@ import { IotaClient } from "@iota/iota-sdk/client";
 import { SuiClient } from "@mysten/sui/client";
 import { Ed25519Keypair as IotaEd25519Keypair } from "@iota/iota-sdk/keypairs/ed25519";
 import { Ed25519Keypair as SuiEd25519Keypair } from "@mysten/sui/keypairs/ed25519";
-import { TokenId } from "./token";
+import type { TokenId } from "./token";
 import { BN, Provider, Wallet, WalletUnlocked } from "fuels";
 import { FUEL_ETH_ASSET_ID } from "@pythnetwork/pyth-fuel-js";
 import { Contract, RpcProvider, Signer, ec, shortString } from "starknet";
 import {
   TonClient,
   WalletContractV4,
-  ContractProvider,
+  type ContractProvider,
   Address,
-  OpenedContract,
-  Sender,
+  type OpenedContract,
+  type Sender,
 } from "@ton/ton";
 import { keyPairFromSeed } from "@ton/crypto";
 import { PythContract } from "@pythnetwork/pyth-ton-js";
@@ -168,7 +173,7 @@ export abstract class Chain extends Storable {
  * For example, governance instructions to upgrade Pyth data sources.
  */
 export class GlobalChain extends Chain {
-  static type = "GlobalChain";
+  static override type = "GlobalChain";
   constructor() {
     super("global", true, "unset", undefined);
   }
@@ -204,7 +209,7 @@ export class GlobalChain extends Chain {
 }
 
 export class CosmWasmChain extends Chain {
-  static type = "CosmWasmChain";
+  static override type = "CosmWasmChain";
 
   constructor(
     id: string,
@@ -224,12 +229,12 @@ export class CosmWasmChain extends Chain {
     return new CosmWasmChain(
       parsed.id,
       parsed.mainnet,
-      parsed.wormholeChainName,
+      parsed.wormholeChainName ?? "",
       parsed.nativeToken,
-      parsed.endpoint,
-      parsed.gasPrice,
-      parsed.prefix,
-      parsed.feeDenom,
+      parsed.endpoint ?? "",
+      parsed.gasPrice ?? "",
+      parsed.prefix ?? "",
+      parsed.feeDenom ?? "",
     );
   }
 
@@ -291,7 +296,7 @@ export class CosmWasmChain extends Chain {
 }
 
 export class SuiChain extends Chain {
-  static type = "SuiChain";
+  static override type = "SuiChain";
 
   constructor(
     id: string,
@@ -308,9 +313,9 @@ export class SuiChain extends Chain {
     return new SuiChain(
       parsed.id,
       parsed.mainnet,
-      parsed.wormholeChainName,
+      parsed.wormholeChainName ?? "",
       parsed.nativeToken,
-      parsed.rpcUrl,
+      parsed.rpcUrl ?? "",
     );
   }
 
@@ -357,7 +362,7 @@ export class SuiChain extends Chain {
 }
 
 export class IotaChain extends Chain {
-  static type = "IotaChain";
+  static override type = "IotaChain";
 
   constructor(
     id: string,
@@ -374,9 +379,9 @@ export class IotaChain extends Chain {
     return new IotaChain(
       parsed.id,
       parsed.mainnet,
-      parsed.wormholeChainName,
+      parsed.wormholeChainName ?? "",
       parsed.nativeToken,
-      parsed.rpcUrl,
+      parsed.rpcUrl ?? "",
     );
   }
 
@@ -423,7 +428,7 @@ export class IotaChain extends Chain {
 }
 
 export class EvmChain extends Chain {
-  static type = "EvmChain";
+  static override type = "EvmChain";
 
   constructor(
     id: string,
@@ -449,7 +454,7 @@ export class EvmChain extends Chain {
       parsed.id,
       parsed.mainnet,
       parsed.nativeToken,
-      parsed.rpcUrl,
+      parsed.rpcUrl ?? "",
       parsed.networkId,
     );
   }
@@ -612,7 +617,7 @@ export class EvmChain extends Chain {
 }
 
 export class AptosChain extends Chain {
-  static type = "AptosChain";
+  static override type = "AptosChain";
 
   constructor(
     id: string,
@@ -655,9 +660,9 @@ export class AptosChain extends Chain {
     return new AptosChain(
       parsed.id,
       parsed.mainnet,
-      parsed.wormholeChainName,
+      parsed.wormholeChainName ?? "",
       parsed.nativeToken,
-      parsed.rpcUrl,
+      parsed.rpcUrl ?? "",
     );
   }
 
@@ -697,7 +702,7 @@ export class AptosChain extends Chain {
 }
 
 export class FuelChain extends Chain {
-  static type = "FuelChain";
+  static override type = "FuelChain";
 
   constructor(
     id: string,
@@ -710,6 +715,7 @@ export class FuelChain extends Chain {
   }
 
   async getProvider(): Promise<Provider> {
+    // @ts-expect-error - TODO: The typing does NOT indicate a create() function exists, so this is likely to blow up at runtime
     return await Provider.create(this.gqlUrl);
   }
 
@@ -746,9 +752,9 @@ export class FuelChain extends Chain {
     return new FuelChain(
       parsed.id,
       parsed.mainnet,
-      parsed.wormholeChainName,
+      parsed.wormholeChainName ?? "",
       parsed.nativeToken,
-      parsed.gqlUrl,
+      parsed.gqlUrl ?? "",
     );
   }
 
@@ -765,7 +771,7 @@ export class FuelChain extends Chain {
 }
 
 export class StarknetChain extends Chain {
-  static type = "StarknetChain";
+  static override type = "StarknetChain";
 
   constructor(
     id: string,
@@ -795,8 +801,8 @@ export class StarknetChain extends Chain {
     return new StarknetChain(
       parsed.id,
       parsed.mainnet,
-      parsed.wormholeChainName,
-      parsed.rpcUrl,
+      parsed.wormholeChainName ?? "",
+      parsed.rpcUrl ?? "",
     );
   }
 
@@ -853,7 +859,7 @@ export class StarknetChain extends Chain {
 }
 
 export class TonChain extends Chain {
-  static type = "TonChain";
+  static override type = "TonChain";
 
   constructor(
     id: string,
@@ -868,7 +874,7 @@ export class TonChain extends Chain {
   async getClient(): Promise<TonClient> {
     // We are hacking rpcUrl to include the apiKey header which is a
     // header that is used to bypass rate limits on the TON network
-    const [rpcUrl, apiKey] = parseRpcUrl(this.rpcUrl).split("#");
+    const [rpcUrl = "", apiKey = ""] = parseRpcUrl(this.rpcUrl).split("#");
 
     const client = new TonClient({
       endpoint: rpcUrl,
@@ -936,9 +942,9 @@ export class TonChain extends Chain {
     return new TonChain(
       parsed.id,
       parsed.mainnet,
-      parsed.wormholeChainName,
+      parsed.wormholeChainName ?? "",
       parsed.nativeToken,
-      parsed.rpcUrl,
+      parsed.rpcUrl ?? "",
     );
   }
 
@@ -956,7 +962,7 @@ export class TonChain extends Chain {
 }
 
 export class NearChain extends Chain {
-  static type = "NearChain";
+  static override type = "NearChain";
 
   constructor(
     id: string,
@@ -974,10 +980,10 @@ export class NearChain extends Chain {
     return new NearChain(
       parsed.id,
       parsed.mainnet,
-      parsed.wormholeChainName,
+      parsed.wormholeChainName ?? "",
       parsed.nativeToken,
-      parsed.rpcUrl,
-      parsed.networkId,
+      parsed.rpcUrl ?? "",
+      parsed.networkId ?? "",
     );
   }
 

+ 8 - 3
contract_manager/src/core/contracts/aptos.ts

@@ -1,9 +1,14 @@
-import { PriceFeedContract, PriceFeed, PrivateKey, TxResult } from "../base";
+import {
+  PriceFeedContract,
+  type PriceFeed,
+  type PrivateKey,
+  type TxResult,
+} from "../base";
 import { ApiError, BCS, CoinClient, TxnBuilderTypes } from "aptos";
 import { AptosChain, Chain } from "../chains";
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 import { WormholeContract } from "./wormhole";
-import { TokenQty } from "../token";
+import type { TokenQty } from "../token";
 
 type WormholeState = {
   chain_id: { number: string };

+ 14 - 14
contract_manager/src/core/contracts/cosmwasm.ts

@@ -1,23 +1,23 @@
 import { Chain, CosmWasmChain } from "../chains";
 import { readFileSync } from "fs";
 import {
-  ContractInfoResponse,
+  type ContractInfoResponse,
   CosmwasmQuerier,
-  Price,
+  type Price,
   PythWrapperExecutor,
   PythWrapperQuerier,
 } from "@pythnetwork/cosmwasm-deploy-tools";
-import { Coin } from "@cosmjs/stargate";
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { Coin } from "@cosmjs/stargate";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 import { CosmWasmClient } from "@cosmjs/cosmwasm-stargate";
 import {
   PriceFeedContract,
   getDefaultDeploymentConfig,
-  PrivateKey,
-  TxResult,
+  type PrivateKey,
+  type TxResult,
 } from "../base";
 import { WormholeContract } from "./wormhole";
-import { TokenQty } from "../token";
+import type { TokenQty } from "../token";
 
 /**
  * Variables here need to be snake case to match the on-chain contract configs
@@ -84,24 +84,24 @@ export class CosmWasmWormholeContract extends WormholeContract {
 
   async getCurrentGuardianSetIndex(): Promise<number> {
     const config = await this.getConfig();
-    return JSON.parse(config["\x00\x06config"])["guardian_set_index"];
+    return JSON.parse(config["\x00\x06config"] ?? "{}")["guardian_set_index"];
   }
 
   async getChainId(): Promise<number> {
     const config = await this.getConfig();
-    return JSON.parse(config["\x00\x06config"])["chain_id"];
+    return JSON.parse(config["\x00\x06config"] ?? "{}")["chain_id"];
   }
 
   async getGuardianSet(): Promise<string[]> {
     const config = await this.getConfig();
-    const guardianSetIndex = JSON.parse(config["\x00\x06config"])[
+    const guardianSetIndex = JSON.parse(config["\x00\x06config"] ?? "{}")[
       "guardian_set_index"
     ];
     let key = "\x00\fguardian_set";
     //append guardianSetIndex as 4 bytes to key string
     key += Buffer.from(guardianSetIndex.toString(16).padStart(8, "0"), "hex");
 
-    const guardianSet = JSON.parse(config[key])["addresses"];
+    const guardianSet = JSON.parse(config[key] ?? "{}")["addresses"];
     return guardianSet.map((entry: { bytes: string }) =>
       Buffer.from(entry.bytes, "base64").toString("hex"),
     );
@@ -245,7 +245,7 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract {
       contractAddr: this.address,
     })) as Record<string, string>;
     const config = {
-      config_v1: JSON.parse(allStates["\x00\tconfig_v1"]),
+      config_v1: JSON.parse(allStates["\x00\tconfig_v1"] ?? "{}"),
       contract_version: allStates["\x00\x10contract_version"]
         ? JSON.parse(allStates["\x00\x10contract_version"])
         : undefined,
@@ -289,8 +289,8 @@ export class CosmWasmPriceFeedContract extends PriceFeedContract {
       let found = false;
       for (let j = 0; j < dataSources2.length; j++) {
         if (
-          dataSources1[i].emitter === dataSources2[j].emitter &&
-          dataSources1[i].chain_id === dataSources2[j].chain_id
+          dataSources1[i]?.emitter === dataSources2[j]?.emitter &&
+          dataSources1[i]?.chain_id === dataSources2[j]?.chain_id
         ) {
           found = true;
           break;

+ 4 - 4
contract_manager/src/core/contracts/evm.ts

@@ -1,10 +1,10 @@
 import Web3 from "web3";
 import type { Contract } from "web3-eth-contract";
-import { PriceFeedContract, PrivateKey, Storable } from "../base";
+import { PriceFeedContract, type PrivateKey, Storable } from "../base";
 import { Chain, EvmChain } from "../chains";
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 import { WormholeContract } from "./wormhole";
-import { TokenQty } from "../token";
+import type { TokenQty } from "../token";
 import {
   EXECUTOR_ABI,
   EXTENDED_ENTROPY_ABI,
@@ -315,7 +315,7 @@ export class EvmEntropyContract extends Storable {
         sequenceNumber: sequenceNumber,
       },
     });
-    return result[0].returnValues.userRandomNumber;
+    return result[0]?.returnValues.userRandomNumber ?? "";
   }
 
   /**

+ 79 - 40
contract_manager/src/core/contracts/fuel.ts

@@ -3,8 +3,8 @@ import { WormholeContract } from "./wormhole";
 import {
   PYTH_CONTRACT_ABI as FuelContractAbi,
   FUEL_ETH_ASSET_ID,
-  PriceFeedOutput,
-  DataSourceOutput,
+  type PriceFeedOutput,
+  type DataSourceOutput,
 } from "@pythnetwork/pyth-fuel-js";
 
 import {
@@ -13,12 +13,17 @@ import {
   Wallet,
   arrayify,
   hexlify,
-  DryRunResult,
+  type DryRunResult,
 } from "fuels";
-import { PriceFeed, PriceFeedContract, PrivateKey, TxResult } from "../base";
+import {
+  type PriceFeed,
+  PriceFeedContract,
+  type PrivateKey,
+  type TxResult,
+} from "../base";
 
-import { TokenQty } from "../token";
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { TokenQty } from "../token";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 
 export class FuelWormholeContract extends WormholeContract {
   static type = "FuelWormholeContract";
@@ -73,14 +78,14 @@ export class FuelWormholeContract extends WormholeContract {
   async getCurrentGuardianSetIndex(): Promise<number> {
     const contract = await this.getContract();
     const guardianSetIndex = (
-      await contract.functions.current_guardian_set_index().get()
-    ).value;
+      await contract.functions.current_guardian_set_index?.().get()
+    )?.value;
     return guardianSetIndex;
   }
 
   async getChainId(): Promise<number> {
     const contract = await this.getContract();
-    const chainId = (await contract.functions.chain_id().get()).value;
+    const chainId = ((await contract.functions.chain_id?.().get()) ?? {}).value;
     return chainId;
   }
 
@@ -88,7 +93,7 @@ export class FuelWormholeContract extends WormholeContract {
     const contract = await this.getContract();
     const guardianSetIndex = await this.getCurrentGuardianSetIndex();
     const guardianSet = (
-      await contract.functions.guardian_set(guardianSetIndex).get()
+      (await contract.functions.guardian_set?.(guardianSetIndex).get()) ?? {}
     ).value;
     return guardianSet;
   }
@@ -100,10 +105,17 @@ export class FuelWormholeContract extends WormholeContract {
     const wallet = await this.chain.getWallet(senderPrivateKey);
     const contract = await this.getContract(wallet);
     const tx = await contract.functions
-      .submit_new_guardian_set(arrayify(vaa))
+      .submit_new_guardian_set?.(arrayify(vaa))
       .call(); // you might get `Error updating Guardianset for fuel_testnet_{address} TypeError: response.body.getReader is not a function` but the tx could still be successful, this is due to fuels using native fetch but some other packages in the monorepo is using node-fetch which overrides the fetch here
 
+    if (!tx) {
+      throw new Error("submit_new_guardian_set() was undefined");
+    }
+
     const txResult = await tx.waitForResult();
+    if (!txResult) {
+      throw new Error("waitForResult() returned undefined");
+    }
 
     return {
       id: tx.transactionId,
@@ -165,8 +177,11 @@ export class FuelPriceFeedContract extends PriceFeedContract {
   async getLastExecutedGovernanceSequence() {
     const pythContract = await this.getContract();
     return Number(
-      (await pythContract.functions.last_executed_governance_sequence().get())
-        .value,
+      (
+        (await pythContract.functions
+          .last_executed_governance_sequence?.()
+          .get()) ?? {}
+      ).value,
     );
   }
 
@@ -174,13 +189,14 @@ export class FuelPriceFeedContract extends PriceFeedContract {
     const pythContract = await this.getContract();
     const feed = "0x" + feedId;
     const exists = (
-      await pythContract.functions.price_feed_exists(hexlify(feed)).get()
+      (await pythContract.functions.price_feed_exists?.(hexlify(feed)).get()) ??
+      {}
     ).value;
     if (!exists) {
       return undefined;
     }
     const priceFeed: PriceFeedOutput = (
-      await pythContract.functions.price_feed_unsafe(feed).get()
+      (await pythContract.functions.price_feed_unsafe?.(feed).get()) ?? {}
     ).value;
     return {
       price: {
@@ -201,7 +217,7 @@ export class FuelPriceFeedContract extends PriceFeedContract {
   async getValidTimePeriod() {
     const pythContract = await this.getContract();
     const validTimePeriod = (
-      await pythContract.functions.valid_time_period().get()
+      (await pythContract.functions.valid_time_period?.().get()) ?? {}
     ).value;
     return Number(validTimePeriod);
   }
@@ -216,39 +232,46 @@ export class FuelPriceFeedContract extends PriceFeedContract {
 
   async getBaseUpdateFee() {
     const pythContract = await this.getContract();
-    const amount = (await pythContract.functions.single_update_fee().get())
-      .value;
+    const amount = (
+      (await pythContract.functions.single_update_fee?.().get()) ?? {}
+    ).value;
     return {
       amount: amount.toString(),
-      denom: this.chain.getNativeToken(),
+      denom: this.chain.getNativeToken() ?? "",
     };
   }
 
   async getDataSources(): Promise<DataSource[]> {
     const pythContract = await this.getContract();
-    const result: DryRunResult<DataSourceOutput[]> =
-      await pythContract.functions.valid_data_sources().get();
-    return result.value.map(
-      ({
-        chain_id,
-        emitter_address,
-      }: {
-        chain_id: number;
-        emitter_address: string;
-      }) => {
-        return {
-          emitterChain: chain_id,
-          emitterAddress: emitter_address.replace("0x", ""),
-        };
-      },
+    const result: DryRunResult<DataSourceOutput[]> | undefined =
+      await pythContract.functions.valid_data_sources?.().get();
+    return (
+      result?.value.map(
+        ({
+          chain_id,
+          emitter_address,
+        }: {
+          chain_id: number;
+          emitter_address: string;
+        }) => {
+          return {
+            emitterChain: chain_id,
+            emitterAddress: emitter_address.replace("0x", ""),
+          };
+        },
+      ) ?? []
     );
   }
 
   async getGovernanceDataSource(): Promise<DataSource> {
     const pythContract = await this.getContract();
-    const result: DryRunResult<DataSourceOutput> = await pythContract.functions
-      .governance_data_source()
-      .get();
+    const result: DryRunResult<DataSourceOutput> | undefined =
+      await pythContract.functions.governance_data_source?.().get();
+
+    if (!result) {
+      throw new Error("governance_data_source() was undefined");
+    }
+
     return {
       emitterChain: result.value.chain_id,
       emitterAddress: result.value.emitter_address.replace("0x", ""),
@@ -260,17 +283,25 @@ export class FuelPriceFeedContract extends PriceFeedContract {
     const contract = await this.getContract(wallet);
     const priceFeedUpdateData = vaas.map((vaa) => new Uint8Array(vaa));
     const updateFee: number = (
-      await contract.functions.update_fee(priceFeedUpdateData).get()
+      (await contract.functions.update_fee?.(priceFeedUpdateData).get()) ?? {}
     ).value;
     const tx = await contract.functions
-      .update_price_feeds(priceFeedUpdateData)
+      .update_price_feeds?.(priceFeedUpdateData)
       .callParams({
         forward: [updateFee, hexlify(FUEL_ETH_ASSET_ID)],
       })
       .call();
 
+    if (!tx) {
+      throw new Error("update_price_feeds() was undefined");
+    }
+
     const txResult = await tx.waitForResult();
 
+    if (!txResult) {
+      throw new Error("waitForResult() returned undefined");
+    }
+
     return { id: tx.transactionId, info: txResult.transactionResponse };
   }
 
@@ -281,11 +312,19 @@ export class FuelPriceFeedContract extends PriceFeedContract {
     const wallet = await this.chain.getWallet(senderPrivateKey);
     const contract = await this.getContract(wallet);
     const tx = await contract.functions
-      .execute_governance_instruction(arrayify(vaa))
+      .execute_governance_instruction?.(arrayify(vaa))
       .call();
 
+    if (!tx) {
+      throw new Error("execute_governance_instruction() was undefined");
+    }
+
     const txResult = await tx.waitForResult();
 
+    if (!txResult) {
+      throw new Error("waitForResult() returned undefined");
+    }
+
     return { id: tx.transactionId, info: txResult.transactionResponse };
   }
 

+ 10 - 10
contract_manager/src/core/contracts/iota.ts

@@ -1,7 +1,7 @@
 import { Chain, IotaChain } from "../chains";
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 import { WormholeContract } from "./wormhole";
-import { PriceFeedContract, PrivateKey, TxResult } from "../base";
+import { PriceFeedContract, type PrivateKey, type TxResult } from "../base";
 import { IotaPythClient } from "@pythnetwork/pyth-iota-js";
 import { IOTA_CLOCK_OBJECT_ID } from "@iota/iota-sdk/utils";
 import { Ed25519Keypair } from "@iota/iota-sdk/keypairs/ed25519";
@@ -158,7 +158,7 @@ export class IotaPriceFeedContract extends PriceFeedContract {
 
     tx.moveCall({
       target: `${packageId}::migrate::migrate`,
-      arguments: [tx.object(this.stateId), verificationReceipt],
+      arguments: [tx.object(this.stateId), verificationReceipt!],
     });
 
     return this.executeTransaction(tx, keypair);
@@ -216,7 +216,7 @@ export class IotaPriceFeedContract extends PriceFeedContract {
 
     tx.moveCall({
       target: `${packageId}::governance::execute_governance_instruction`,
-      arguments: [tx.object(this.stateId), verificationReceipt],
+      arguments: [tx.object(this.stateId), verificationReceipt!],
     });
 
     const result = await this.executeTransaction(tx, keypair);
@@ -239,19 +239,19 @@ export class IotaPriceFeedContract extends PriceFeedContract {
 
     const [upgradeTicket] = tx.moveCall({
       target: `${packageId}::contract_upgrade::authorize_upgrade`,
-      arguments: [tx.object(this.stateId), verificationReceipt],
+      arguments: [tx.object(this.stateId), verificationReceipt!],
     });
 
     const [upgradeReceipt] = tx.upgrade({
       modules,
       dependencies,
       package: packageId,
-      ticket: upgradeTicket,
+      ticket: upgradeTicket!,
     });
 
     tx.moveCall({
       target: `${packageId}::contract_upgrade::commit_upgrade`,
-      arguments: [tx.object(this.stateId), upgradeReceipt],
+      arguments: [tx.object(this.stateId), upgradeReceipt!],
     });
     const result = await this.executeTransaction(tx, keypair);
     return { id: result.digest, info: result };
@@ -283,7 +283,7 @@ export class IotaPriceFeedContract extends PriceFeedContract {
 
     const [verificationReceipt] = tx.moveCall({
       target: `${packageId}::governance::verify_vaa`,
-      arguments: [tx.object(this.stateId), verifiedVAA],
+      arguments: [tx.object(this.stateId), verifiedVAA!],
     });
     return verificationReceipt;
   }
@@ -504,7 +504,7 @@ export class IotaWormholeContract extends WormholeContract {
 
     const [decreeReceipt] = tx.moveCall({
       target: `${corePackageId}::governance_message::verify_vaa`,
-      arguments: [tx.object(coreObjectId), verifiedVaa, decreeTicket],
+      arguments: [tx.object(coreObjectId), verifiedVaa!, decreeTicket!],
       typeArguments: [
         `${corePackageId}::update_guardian_set::GovernanceWitness`,
       ],
@@ -514,7 +514,7 @@ export class IotaWormholeContract extends WormholeContract {
       target: `${corePackageId}::update_guardian_set::update_guardian_set`,
       arguments: [
         tx.object(coreObjectId),
-        decreeReceipt,
+        decreeReceipt!,
         tx.object(IOTA_CLOCK_OBJECT_ID),
       ],
     });

+ 6 - 6
contract_manager/src/core/contracts/near.ts

@@ -1,10 +1,10 @@
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 import {
-  KeyValueConfig,
-  PriceFeed,
+  type KeyValueConfig,
+  type PriceFeed,
   PriceFeedContract,
-  PrivateKey,
-  TxResult,
+  type PrivateKey,
+  type TxResult,
 } from "../base";
 import { Chain, NearChain } from "../chains";
 import * as nearAPI from "near-api-js";
@@ -245,7 +245,7 @@ export class NearPriceFeedContract extends PriceFeedContract {
       results.push({ id: outcome.transaction.hash, info: outcome });
     }
     if (results.length === 1) {
-      return results[0];
+      return results[0]!;
     } else {
       return {
         id: results.map((x) => x.id).join(","),

+ 11 - 7
contract_manager/src/core/contracts/starknet.ts

@@ -1,11 +1,11 @@
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 import {
-  KeyValueConfig,
-  Price,
-  PriceFeed,
+  type KeyValueConfig,
+  type Price,
+  type PriceFeed,
   PriceFeedContract,
-  PrivateKey,
-  TxResult,
+  type PrivateKey,
+  type TxResult,
 } from "../base";
 import { Chain, StarknetChain } from "../chains";
 import { Account, Contract, shortString } from "starknet";
@@ -160,7 +160,11 @@ export class StarknetPriceFeedContract extends PriceFeedContract {
     denom?: string | undefined;
   }> {
     const tokens = await this.getFeeTokenAddresses();
-    return await this.getBaseUpdateFeeInToken(tokens[0]);
+    const result = await this.getBaseUpdateFeeInToken(tokens[0] ?? "");
+    return {
+      ...result,
+      denom: result.denom ?? "",
+    };
   }
 
   /**

+ 10 - 10
contract_manager/src/core/contracts/sui.ts

@@ -1,7 +1,7 @@
 import { Chain, SuiChain } from "../chains";
-import { DataSource } from "@pythnetwork/xc-admin-common";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
 import { WormholeContract } from "./wormhole";
-import { PriceFeedContract, PrivateKey, TxResult } from "../base";
+import { PriceFeedContract, type PrivateKey, type TxResult } from "../base";
 import { SuiPythClient } from "@pythnetwork/pyth-sui-js";
 import { SUI_CLOCK_OBJECT_ID } from "@mysten/sui/utils";
 import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
@@ -158,7 +158,7 @@ export class SuiPriceFeedContract extends PriceFeedContract {
 
     tx.moveCall({
       target: `${packageId}::migrate::migrate`,
-      arguments: [tx.object(this.stateId), verificationReceipt],
+      arguments: [tx.object(this.stateId), verificationReceipt!],
     });
 
     return this.executeTransaction(tx, keypair);
@@ -216,7 +216,7 @@ export class SuiPriceFeedContract extends PriceFeedContract {
 
     tx.moveCall({
       target: `${packageId}::governance::execute_governance_instruction`,
-      arguments: [tx.object(this.stateId), verificationReceipt],
+      arguments: [tx.object(this.stateId), verificationReceipt!],
     });
 
     const result = await this.executeTransaction(tx, keypair);
@@ -239,19 +239,19 @@ export class SuiPriceFeedContract extends PriceFeedContract {
 
     const [upgradeTicket] = tx.moveCall({
       target: `${packageId}::contract_upgrade::authorize_upgrade`,
-      arguments: [tx.object(this.stateId), verificationReceipt],
+      arguments: [tx.object(this.stateId), verificationReceipt!],
     });
 
     const [upgradeReceipt] = tx.upgrade({
       modules,
       dependencies,
       package: packageId,
-      ticket: upgradeTicket,
+      ticket: upgradeTicket!,
     });
 
     tx.moveCall({
       target: `${packageId}::contract_upgrade::commit_upgrade`,
-      arguments: [tx.object(this.stateId), upgradeReceipt],
+      arguments: [tx.object(this.stateId), upgradeReceipt!],
     });
     const result = await this.executeTransaction(tx, keypair);
     return { id: result.digest, info: result };
@@ -283,7 +283,7 @@ export class SuiPriceFeedContract extends PriceFeedContract {
 
     const [verificationReceipt] = tx.moveCall({
       target: `${packageId}::governance::verify_vaa`,
-      arguments: [tx.object(this.stateId), verifiedVAA],
+      arguments: [tx.object(this.stateId), verifiedVAA!],
     });
     return verificationReceipt;
   }
@@ -503,7 +503,7 @@ export class SuiWormholeContract extends WormholeContract {
 
     const [decreeReceipt] = tx.moveCall({
       target: `${corePackageId}::governance_message::verify_vaa`,
-      arguments: [tx.object(coreObjectId), verifiedVaa, decreeTicket],
+      arguments: [tx.object(coreObjectId), verifiedVaa!, decreeTicket!],
       typeArguments: [
         `${corePackageId}::update_guardian_set::GovernanceWitness`,
       ],
@@ -513,7 +513,7 @@ export class SuiWormholeContract extends WormholeContract {
       target: `${corePackageId}::update_guardian_set::update_guardian_set`,
       arguments: [
         tx.object(coreObjectId),
-        decreeReceipt,
+        decreeReceipt!,
         tx.object(SUI_CLOCK_OBJECT_ID),
       ],
     });

+ 28 - 14
contract_manager/src/core/contracts/ton.ts

@@ -1,9 +1,14 @@
 import { Chain, TonChain } from "../chains";
 import { WormholeContract } from "./wormhole";
-import { PriceFeed, PriceFeedContract, PrivateKey, TxResult } from "../base";
-import { TokenQty } from "../token";
-import { DataSource } from "@pythnetwork/xc-admin-common";
-import { Address, Cell, OpenedContract } from "@ton/ton";
+import {
+  type PriceFeed,
+  PriceFeedContract,
+  type PrivateKey,
+  type TxResult,
+} from "../base";
+import type { TokenQty } from "../token";
+import type { DataSource } from "@pythnetwork/xc-admin-common";
+import { Address, Cell, type OpenedContract } from "@ton/ton";
 import {
   calculateUpdatePriceFeedsFee,
   PythContract,
@@ -100,7 +105,7 @@ export class TonWormholeContract extends WormholeContract {
     );
 
     return {
-      id: transactions[0].hash.toString(),
+      id: transactions[0]?.hash.toString() ?? "",
       info: JSON.stringify("0x1"),
     };
   }
@@ -250,9 +255,12 @@ export class TonPriceFeedContract extends PriceFeedContract {
     const txDetails = await client.getTransactions(wallet.address, {
       limit: 1,
     });
-    const txHash = Buffer.from(txDetails[0].hash()).toString("hex");
-    const txInfo = JSON.stringify(txDetails[0].description, (_, value) =>
-      typeof value === "bigint" ? value.toString() : value,
+    const txHash = Buffer.from(
+      txDetails[0]?.hash() ?? Buffer.alloc(0),
+    ).toString("hex");
+    const txInfo = JSON.stringify(
+      txDetails[0]?.description ?? "{}",
+      (_, value) => (typeof value === "bigint" ? value.toString() : value),
     );
 
     return {
@@ -274,9 +282,12 @@ export class TonPriceFeedContract extends PriceFeedContract {
     const txDetails = await client.getTransactions(wallet.address, {
       limit: 1,
     });
-    const txHash = Buffer.from(txDetails[0].hash()).toString("hex");
-    const txInfo = JSON.stringify(txDetails[0].description, (_, value) =>
-      typeof value === "bigint" ? value.toString() : value,
+    const txHash = Buffer.from(
+      txDetails[0]?.hash() ?? Buffer.alloc(0),
+    ).toString("hex");
+    const txInfo = JSON.stringify(
+      txDetails[0]?.description ?? "{}",
+      (_, value) => (typeof value === "bigint" ? value.toString() : value),
     );
 
     return {
@@ -298,9 +309,12 @@ export class TonPriceFeedContract extends PriceFeedContract {
     const txDetails = await client.getTransactions(wallet.address, {
       limit: 1,
     });
-    const txHash = Buffer.from(txDetails[0].hash()).toString("hex");
-    const txInfo = JSON.stringify(txDetails[0].description, (_, value) =>
-      typeof value === "bigint" ? value.toString() : value,
+    const txHash = Buffer.from(
+      txDetails[0]?.hash() ?? Buffer.alloc(0),
+    ).toString("hex");
+    const txInfo = JSON.stringify(
+      txDetails[0]?.description ?? "{}",
+      (_, value) => (typeof value === "bigint" ? value.toString() : value),
     );
 
     return {

+ 2 - 2
contract_manager/src/core/contracts/wormhole.ts

@@ -1,4 +1,4 @@
-import { PrivateKey, Storable, TxResult } from "../base";
+import { type PrivateKey, Storable, type TxResult } from "../base";
 
 export abstract class WormholeContract extends Storable {
   abstract getCurrentGuardianSetIndex(): Promise<number>;
@@ -37,7 +37,7 @@ export abstract class WormholeContract extends Storable {
     ];
     const currentIndex = await this.getCurrentGuardianSetIndex();
     for (let i = currentIndex; i < MAINNET_UPGRADE_VAAS.length; i++) {
-      const vaa = MAINNET_UPGRADE_VAAS[i];
+      const vaa = MAINNET_UPGRADE_VAAS[i] ?? "";
       const result = await this.upgradeGuardianSets(
         senderPrivateKey,
         Buffer.from(vaa, "hex"),

+ 1 - 1
contract_manager/src/core/token.ts

@@ -1,5 +1,5 @@
 import axios from "axios";
-import { KeyValueConfig, Storable } from "./base";
+import { type KeyValueConfig, Storable } from "./base";
 
 export type TokenId = string;
 /**

+ 5 - 5
contract_manager/src/node/utils/executor.ts

@@ -1,13 +1,13 @@
 import { parseVaa } from "@certusone/wormhole-sdk";
 import {
-  DataSource,
+  type DataSource,
   EvmExecute,
   decodeGovernancePayload,
 } from "@pythnetwork/xc-admin-common";
-import { DefaultStore } from "./store";
-import { PrivateKey, TxResult } from "../../core/base";
-import { EvmExecutorContract } from "../../core/contracts";
-import { EvmChain } from "../../core/chains";
+import { DefaultStore } from "./store.js";
+import type { PrivateKey, TxResult } from "../../core/base.js";
+import { EvmChain } from "../../core/chains.js";
+import { EvmExecutorContract } from "../../core/contracts/evm.js";
 
 // TODO: A better place for this would be `base.ts`. That will require
 // significant refactor. Todo in separate PR.

+ 16 - 15
contract_manager/src/node/utils/governance.ts

@@ -3,8 +3,8 @@ import { readFileSync } from "fs";
 import {
   Connection,
   Keypair,
-  ParsedInstruction,
-  PartiallyDecodedInstruction,
+  type ParsedInstruction,
+  type PartiallyDecodedInstruction,
   PublicKey,
   SystemProgram,
   SYSVAR_CLOCK_PUBKEY,
@@ -12,28 +12,27 @@ import {
   Transaction,
 } from "@solana/web3.js";
 import * as bs58 from "bs58";
-import {
-  getPythClusterApiUrl,
-  PythCluster,
-} from "@pythnetwork/client/lib/cluster";
-import SquadsMesh from "@sqds/mesh";
-import { AnchorProvider } from "@coral-xyz/anchor";
-import { Wallet } from "@coral-xyz/anchor/dist/cjs/provider";
-import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet";
+import { getPythClusterApiUrl, type PythCluster } from "@pythnetwork/client";
+import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
 import {
   executeProposal,
   MultisigVault,
   WORMHOLE_ADDRESS,
   WORMHOLE_API_ENDPOINT,
 } from "@pythnetwork/xc-admin-common";
+import { type KeyValueConfig, Storable } from "../../core/base.js";
+import type { PriorityFeeConfig } from "@pythnetwork/solana-utils";
+import SquadsMesh from "@sqds/mesh";
+// TODO: this should be migrated to @wormhole-foundation/dsk
+// as such, we cannot publish an ESM variant of the contract_manager
+// until we upgrade
 import {
   createWormholeProgramInterface,
   deriveEmitterSequenceKey,
   deriveFeeCollectorKey,
   deriveWormholeBridgeDataKey,
-} from "@certusone/wormhole-sdk/lib/cjs/solana/wormhole";
-import { KeyValueConfig, Storable } from "../../core/base";
-import { PriorityFeeConfig } from "@pythnetwork/solana-utils";
+} from "@certusone/wormhole-sdk/lib/cjs/solana/wormhole/index.js";
+import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet.js";
 
 class InvalidTransactionError extends Error {
   constructor(message: string) {
@@ -121,7 +120,9 @@ export class SubmittedWormholeMessage {
         await new Promise((resolve) => setTimeout(resolve, 1000));
         continue;
       }
-      const { vaaBytes } = await response.json();
+      const { vaaBytes } = (await response.json()) as {
+        vaaBytes: Parameters<typeof Buffer.from>[0];
+      };
       return Buffer.from(vaaBytes, "base64");
     }
     throw new Error("VAA not found, maybe too soon to fetch?");
@@ -343,7 +344,7 @@ export class Vault extends Storable {
     const response = await fetch(
       `${rpcUrl}/api/v1/vaas/1/${emitter.toBase58()}`,
     );
-    const { data } = await response.json();
+    const { data } = (await response.json()) as { data: any[] };
     return data[0].sequence;
   }
 

+ 10 - 8
contract_manager/src/node/utils/store.ts

@@ -109,10 +109,12 @@ export class Store {
             `No chain class found for chain type: ${parsed.type}`,
           );
         }
-        const chain = allChainClasses[parsed.type].fromJson(parsed);
-        if (this.chains[chain.getId()])
-          throw new Error(`Multiple chains with id ${chain.getId()} found`);
-        this.chains[chain.getId()] = chain;
+        const chain = allChainClasses[parsed.type]?.fromJson(parsed);
+        const id = chain?.getId() ?? "";
+        if (this.chains[id]) {
+          throw new Error(`Multiple chains with id ${id} found`);
+        }
+        this.chains[id] = chain!;
       }
     });
   }
@@ -128,7 +130,7 @@ export class Store {
       if (!contractsByType[contract.getType()]) {
         contractsByType[contract.getType()] = [];
       }
-      contractsByType[contract.getType()].push(contract);
+      contractsByType[contract.getType()]?.push(contract);
     }
     for (const [type, contracts] of Object.entries(contractsByType)) {
       writeFileSync(
@@ -148,7 +150,7 @@ export class Store {
       if (!chainsByType[chain.getType()]) {
         chainsByType[chain.getType()] = [];
       }
-      chainsByType[chain.getType()].push(chain);
+      chainsByType[chain.getType()]?.push(chain);
     }
     for (const [type, chains] of Object.entries(chainsByType)) {
       writeFileSync(
@@ -193,8 +195,8 @@ export class Store {
         if (!this.chains[parsed.chain])
           throw new Error(`Chain ${parsed.chain} not found`);
         const chain = this.chains[parsed.chain];
-        const chainContract = allContractClasses[parsed.type].fromJson(
-          chain,
+        const chainContract = allContractClasses[parsed.type]!.fromJson(
+          chain!,
           parsed,
         );
         if (

+ 0 - 0
contract_manager/store/chains/AptosChains.json → contract_manager/src/store/chains/AptosChains.json


+ 0 - 0
contract_manager/store/chains/CosmWasmChains.json → contract_manager/src/store/chains/CosmWasmChains.json


+ 0 - 0
contract_manager/store/chains/EvmChains.json → contract_manager/src/store/chains/EvmChains.json


+ 0 - 0
contract_manager/store/chains/FuelChains.json → contract_manager/src/store/chains/FuelChains.json


+ 0 - 0
contract_manager/store/chains/IotaChains.json → contract_manager/src/store/chains/IotaChains.json


+ 0 - 0
contract_manager/store/chains/NearChains.json → contract_manager/src/store/chains/NearChains.json


+ 0 - 0
contract_manager/store/chains/StarknetChains.json → contract_manager/src/store/chains/StarknetChains.json


+ 0 - 0
contract_manager/store/chains/SuiChains.json → contract_manager/src/store/chains/SuiChains.json


+ 0 - 0
contract_manager/store/chains/TonChains.json → contract_manager/src/store/chains/TonChains.json


+ 0 - 0
contract_manager/store/contracts/AptosPriceFeedContracts.json → contract_manager/src/store/contracts/AptosPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/AptosWormholeContracts.json → contract_manager/src/store/contracts/AptosWormholeContracts.json


+ 0 - 0
contract_manager/store/contracts/CosmWasmPriceFeedContracts.json → contract_manager/src/store/contracts/CosmWasmPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/CosmWasmWormholeContracts.json → contract_manager/src/store/contracts/CosmWasmWormholeContracts.json


+ 0 - 0
contract_manager/store/contracts/EvmEntropyContracts.json → contract_manager/src/store/contracts/EvmEntropyContracts.json


+ 0 - 0
contract_manager/store/contracts/EvmExecutorContracts.json → contract_manager/src/store/contracts/EvmExecutorContracts.json


+ 0 - 0
contract_manager/store/contracts/EvmLazerContracts.json → contract_manager/src/store/contracts/EvmLazerContracts.json


+ 0 - 0
contract_manager/store/contracts/EvmPriceFeedContracts.json → contract_manager/src/store/contracts/EvmPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/EvmWormholeContracts.json → contract_manager/src/store/contracts/EvmWormholeContracts.json


+ 0 - 0
contract_manager/store/contracts/FuelPriceFeedContracts.json → contract_manager/src/store/contracts/FuelPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/FuelWormholeContracts.json → contract_manager/src/store/contracts/FuelWormholeContracts.json


+ 0 - 0
contract_manager/store/contracts/IotaPriceFeedContracts.json → contract_manager/src/store/contracts/IotaPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/IotaWormholeContracts.json → contract_manager/src/store/contracts/IotaWormholeContracts.json


+ 0 - 0
contract_manager/store/contracts/NearPriceFeedContracts.json → contract_manager/src/store/contracts/NearPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/NearWormholeContracts.json → contract_manager/src/store/contracts/NearWormholeContracts.json


+ 0 - 0
contract_manager/store/contracts/StarknetPriceFeedContracts.json → contract_manager/src/store/contracts/StarknetPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/StarknetWormholeContracts.json → contract_manager/src/store/contracts/StarknetWormholeContracts.json


+ 0 - 0
contract_manager/store/contracts/SuiPriceFeedContracts.json → contract_manager/src/store/contracts/SuiPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/SuiWormholeContracts.json → contract_manager/src/store/contracts/SuiWormholeContracts.json


+ 0 - 0
contract_manager/store/contracts/TonPriceFeedContracts.json → contract_manager/src/store/contracts/TonPriceFeedContracts.json


+ 0 - 0
contract_manager/store/contracts/TonWormholeContracts.json → contract_manager/src/store/contracts/TonWormholeContracts.json


+ 0 - 0
contract_manager/store/tokens/Tokens.json → contract_manager/src/store/tokens/Tokens.json


+ 0 - 0
contract_manager/store/vaults/UpgradeVaults.json → contract_manager/src/store/vaults/UpgradeVaults.json


+ 8 - 5
contract_manager/src/utils/utils.ts

@@ -1,6 +1,6 @@
-import evmChainsData from "../../store/chains/EvmChains.json";
-import evmPriceFeedContractsData from "../../store/contracts/EvmPriceFeedContracts.json";
-import evmWormholeContractsData from "../../store/contracts/EvmWormholeContracts.json";
+import evmChainsData from "../store/chains/EvmChains.json" with { type: "json" };
+import evmPriceFeedContractsData from "../store/contracts/EvmPriceFeedContracts.json" with { type: "json" };
+import evmWormholeContractsData from "../store/contracts/EvmWormholeContracts.json" with { type: "json" };
 import * as chains from "viem/chains";
 
 export const allEvmChainIds: number[] = evmChainsData.map((c) => c.networkId);
@@ -47,8 +47,11 @@ export const getEvmChainRpcUrl = (chainId: number): string | undefined => {
     return undefined;
   } else {
     const viemChain = Object.values(chains).find(
-      (c) => c.id === Number.parseInt(chain.id, 10),
+      (c) => "id" in c && c.id === Number.parseInt(chain.id, 10),
     );
-    return viemChain?.rpcUrls.default.http[0] ?? chain.rpcUrl;
+    if (viemChain && "rpcUrls" in viemChain) {
+      return viemChain?.rpcUrls.default.http[0] ?? chain.rpcUrl;
+    }
+    return;
   }
 };

+ 3 - 1
contract_manager/tsconfig.build.json

@@ -3,9 +3,11 @@
   "compilerOptions": {
     "noEmit": false,
     "incremental": false,
-    "declaration": true
+    "declaration": true,
+    "isolatedModules": false
   },
   "exclude": [
+    "scripts",
     "node_modules",
     "dist",
     "examples/",

+ 5 - 1
contract_manager/tsconfig.json

@@ -1,5 +1,9 @@
 {
   "extends": "@cprussin/tsconfig/base.json",
-  "include": ["src"],
+  "include": ["scripts", "src"],
+  "compilerOptions": {
+    "module": "preserve",
+    "moduleResolution": "node"
+  },
   "exclude": ["node_modules", "**/__tests__/*"]
 }

+ 38 - 72
pnpm-lock.yaml

@@ -25,8 +25,8 @@ catalogs:
       specifier: ^7.27.1
       version: 7.27.1
     '@better-builds/ts-duality':
-      specifier: 0.0.1-beta.8
-      version: 0.0.1-beta.8
+      specifier: 0.0.1-beta.9
+      version: 0.0.1-beta.9
     '@bonfida/spl-name-service':
       specifier: ^3.0.10
       version: 3.0.10
@@ -375,7 +375,7 @@ importers:
     devDependencies:
       '@better-builds/ts-duality':
         specifier: 'catalog:'
-        version: 0.0.1-beta.8(typescript@5.9.3)
+        version: 0.0.1-beta.9(typescript@5.9.3)
       '@cprussin/prettier-config':
         specifier: 'catalog:'
         version: 2.2.2(prettier@3.5.3)
@@ -414,7 +414,7 @@ importers:
         version: 2.2.0(react@19.1.0)
       '@next/third-parties':
         specifier: 'catalog:'
-        version: 15.3.2(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
+        version: 15.3.2(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
       '@pythnetwork/client':
         specifier: 'catalog:'
         version: 2.22.1(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
@@ -574,7 +574,7 @@ importers:
         version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       nuqs:
         specifier: 'catalog:'
-        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
+        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
       react:
         specifier: 'catalog:'
         version: 19.1.0
@@ -780,7 +780,7 @@ importers:
         version: 15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1)
       nuqs:
         specifier: 'catalog:'
-        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
+        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
       react:
         specifier: 'catalog:'
         version: 19.1.0
@@ -1026,7 +1026,7 @@ importers:
         version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       nuqs:
         specifier: 'catalog:'
-        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
+        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
       react:
         specifier: 'catalog:'
         version: 19.1.0
@@ -1241,7 +1241,7 @@ importers:
         version: 3.5.3
       ts-jest:
         specifier: ^29.1.1
-        version: 29.3.1(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.3)(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)))(typescript@5.9.3)
+        version: 29.3.1(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.9)(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)))(typescript@5.9.3)
       ts-node:
         specifier: 'catalog:'
         version: 10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)
@@ -1265,7 +1265,7 @@ importers:
         version: 2.2.0(react@19.1.0)
       '@next/third-parties':
         specifier: 'catalog:'
-        version: 15.3.2(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
+        version: 15.3.2(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
       '@pythnetwork/hermes-client':
         specifier: workspace:*
         version: link:../hermes/client/js
@@ -1283,13 +1283,13 @@ importers:
         version: 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-react':
         specifier: 'catalog:'
-        version: 0.15.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
+        version: 0.15.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
       '@solana/wallet-adapter-react-ui':
         specifier: 'catalog:'
-        version: 0.9.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
+        version: 0.9.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
       '@solana/wallet-adapter-wallets':
         specifier: 'catalog:'
-        version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4)
+        version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4)
       '@solana/web3.js':
         specifier: 'catalog:'
         version: 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
@@ -1526,6 +1526,9 @@ importers:
         specifier: ^1.8.2
         version: 1.10.4(encoding@0.1.13)
     devDependencies:
+      '@pythnetwork/pyth-crosschain':
+        specifier: link:..
+        version: link:..
       '@types/node':
         specifier: 'catalog:'
         version: 22.14.0
@@ -1873,7 +1876,7 @@ importers:
         version: 5.15.0(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       nuqs:
         specifier: 'catalog:'
-        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
+        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
       react:
         specifier: 'catalog:'
         version: 19.1.0
@@ -2100,7 +2103,7 @@ importers:
         version: 4.10.1
       '@next/third-parties':
         specifier: 'catalog:'
-        version: 15.3.2(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
+        version: 15.3.2(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
       '@react-hookz/web':
         specifier: 'catalog:'
         version: 25.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -2127,7 +2130,7 @@ importers:
         version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
       nuqs:
         specifier: 'catalog:'
-        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
+        version: 2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)
       pino:
         specifier: 'catalog:'
         version: 9.6.0
@@ -4336,8 +4339,8 @@ packages:
   '@bcoe/v8-coverage@0.2.3':
     resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
 
-  '@better-builds/ts-duality@0.0.1-beta.8':
-    resolution: {integrity: sha512-DV2nBAAVAgFggDXb746P/m/Qp0wi2ZyPc9sQzdY2kc2voZjyCnTWNoDv7tz+VXNjE6eOs7XHisX1GEQOSYFqog==}
+  '@better-builds/ts-duality@0.0.1-beta.9':
+    resolution: {integrity: sha512-ctVpsbdNzZMZs+j6ArCvW+LuXkvPuGOPQpUECXLGcGHad9nQXjyhl03aolYR/tzg1/KBOSkEOZHctYEgTh+zWQ==}
     engines: {bun: '>=1.3.0', node: '>=22.16.0'}
     hasBin: true
     peerDependencies:
@@ -4470,12 +4473,15 @@ packages:
 
   '@cosmjs/crypto@0.30.1':
     resolution: {integrity: sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ==}
+    deprecated: This uses elliptic for cryptographic operations, which contains several security-relevant bugs. To what degree this affects your application is something you need to carefully investigate. See https://github.com/cosmos/cosmjs/issues/1708 for further pointers. Starting with version 0.34.0 the cryptographic library has been replaced. However, private keys might still be at risk.
 
   '@cosmjs/crypto@0.32.4':
     resolution: {integrity: sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==}
+    deprecated: This uses elliptic for cryptographic operations, which contains several security-relevant bugs. To what degree this affects your application is something you need to carefully investigate. See https://github.com/cosmos/cosmjs/issues/1708 for further pointers. Starting with version 0.34.0 the cryptographic library has been replaced. However, private keys might still be at risk.
 
   '@cosmjs/crypto@0.33.1':
     resolution: {integrity: sha512-U4kGIj/SNBzlb2FGgA0sMR0MapVgJUg8N+oIAiN5+vl4GZ3aefmoL1RDyTrFS/7HrB+M+MtHsxC0tvEu4ic/zA==}
+    deprecated: This uses elliptic for cryptographic operations, which contains several security-relevant bugs. To what degree this affects your application is something you need to carefully investigate. See https://github.com/cosmos/cosmjs/issues/1708 for further pointers. Starting with version 0.34.0 the cryptographic library has been replaced. However, private keys might still be at risk.
 
   '@cosmjs/encoding@0.30.1':
     resolution: {integrity: sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ==}
@@ -11532,6 +11538,7 @@ packages:
 
   '@walletconnect/ethereum-provider@2.19.2':
     resolution: {integrity: sha512-NzPzNcjMLqow6ha2nssB1ciMD0cdHZesYcHSQKjCi9waIDMov9Fr2yEJccbiVFE3cxek7f9dCPsoZez2q8ihvg==}
+    deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases'
 
   '@walletconnect/events@1.0.1':
     resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==}
@@ -11597,6 +11604,7 @@ packages:
 
   '@walletconnect/sign-client@2.19.2':
     resolution: {integrity: sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg==}
+    deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases'
 
   '@walletconnect/time@1.0.2':
     resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==}
@@ -11610,6 +11618,7 @@ packages:
 
   '@walletconnect/universal-provider@2.19.2':
     resolution: {integrity: sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg==}
+    deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases'
 
   '@walletconnect/utils@2.19.2':
     resolution: {integrity: sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA==}
@@ -24473,7 +24482,7 @@ snapshots:
 
   '@bcoe/v8-coverage@0.2.3': {}
 
-  '@better-builds/ts-duality@0.0.1-beta.8(typescript@5.9.3)':
+  '@better-builds/ts-duality@0.0.1-beta.9(typescript@5.9.3)':
     dependencies:
       '@swc/core': 1.13.5
       chalk: 5.6.2
@@ -29053,7 +29062,7 @@ snapshots:
   '@next/swc-win32-x64-msvc@15.5.0':
     optional: true
 
-  '@next/third-parties@15.3.2(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)':
+  '@next/third-parties@15.3.2(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0)':
     dependencies:
       next: 15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1)
       react: 19.1.0
@@ -29813,11 +29822,10 @@ snapshots:
       crypto-js: 4.2.0
       uuidv4: 6.2.13
 
-  '@particle-network/solana-wallet@1.3.2(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)':
+  '@particle-network/solana-wallet@1.3.2(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))':
     dependencies:
       '@particle-network/auth': 1.3.1
       '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
-      bs58: 5.0.0
 
   '@paulmillr/qr@0.2.1': {}
 
@@ -33574,15 +33582,6 @@ snapshots:
       '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
 
-  '@solana/wallet-adapter-base-ui@0.1.3(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)':
-    dependencies:
-      '@solana/wallet-adapter-react': 0.15.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
-      '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
-      react: 19.1.0
-    transitivePeerDependencies:
-      - bs58
-      - react-native
-
   '@solana/wallet-adapter-base-ui@0.1.3(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)':
     dependencies:
       '@solana/wallet-adapter-react': 0.15.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
@@ -33701,9 +33700,9 @@ snapshots:
       '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
 
-  '@solana/wallet-adapter-particle@0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)':
+  '@solana/wallet-adapter-particle@0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))':
     dependencies:
-      '@particle-network/solana-wallet': 1.3.2(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)
+      '@particle-network/solana-wallet': 1.3.2(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
     transitivePeerDependencies:
@@ -33714,18 +33713,6 @@ snapshots:
       '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
 
-  '@solana/wallet-adapter-react-ui@0.9.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)':
-    dependencies:
-      '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-base-ui': 0.1.3(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
-      '@solana/wallet-adapter-react': 0.15.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
-      '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
-      react: 19.1.0
-      react-dom: 19.1.0(react@19.1.0)
-    transitivePeerDependencies:
-      - bs58
-      - react-native
-
   '@solana/wallet-adapter-react-ui@0.9.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)':
     dependencies:
       '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -33918,7 +33905,7 @@ snapshots:
       - utf-8-validate
       - zod
 
-  '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4)':
+  '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)':
     dependencies:
       '@solana/wallet-adapter-alpha': 0.1.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-avana': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -33939,7 +33926,7 @@ snapshots:
       '@solana/wallet-adapter-nightly': 0.1.17(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-nufi': 0.1.18(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-onto': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-particle': 0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)
+      '@solana/wallet-adapter-particle': 0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-phantom': 0.9.25(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-safepal': 0.5.19(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-saifu': 0.1.16(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -33954,7 +33941,7 @@ snapshots:
       '@solana/wallet-adapter-trezor': 0.1.3(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-trust': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-unsafe-burner': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)
+      '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)
       '@solana/wallet-adapter-xdefi': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
     transitivePeerDependencies:
@@ -33995,7 +33982,7 @@ snapshots:
       - ws
       - zod
 
-  '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)':
+  '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4)':
     dependencies:
       '@solana/wallet-adapter-alpha': 0.1.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-avana': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -34016,7 +34003,7 @@ snapshots:
       '@solana/wallet-adapter-nightly': 0.1.17(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-nufi': 0.1.18(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-onto': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-particle': 0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)
+      '@solana/wallet-adapter-particle': 0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-phantom': 0.9.25(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-safepal': 0.5.19(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-saifu': 0.1.16(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -34031,7 +34018,7 @@ snapshots:
       '@solana/wallet-adapter-trezor': 0.1.3(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-trust': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-unsafe-burner': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)
+      '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)
       '@solana/wallet-adapter-xdefi': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
     transitivePeerDependencies:
@@ -46239,7 +46226,7 @@ snapshots:
       bn.js: 4.11.6
       strip-hex-prefix: 1.0.0
 
-  nuqs@2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0):
+  nuqs@2.4.1(next@15.5.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1))(react@19.1.0):
     dependencies:
       mitt: 3.0.1
       react: 19.1.0
@@ -49833,27 +49820,6 @@ snapshots:
     dependencies:
       tslib: 2.8.1
 
-  ts-jest@29.3.1(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.3)(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)))(typescript@5.9.3):
-    dependencies:
-      bs-logger: 0.2.6
-      ejs: 3.1.10
-      fast-json-stable-stringify: 2.1.0
-      jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3))
-      jest-util: 29.7.0
-      json5: 2.2.3
-      lodash.memoize: 4.1.2
-      make-error: 1.3.6
-      semver: 7.7.1
-      type-fest: 4.39.0
-      typescript: 5.9.3
-      yargs-parser: 21.1.1
-    optionalDependencies:
-      '@babel/core': 7.27.1
-      '@jest/transform': 29.7.0
-      '@jest/types': 29.6.3
-      babel-jest: 29.7.0(@babel/core@7.27.1)
-      esbuild: 0.25.3
-
   ts-jest@29.3.1(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.9)(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)))(typescript@5.9.3):
     dependencies:
       bs-logger: 0.2.6

+ 1 - 1
pnpm-workspace.yaml

@@ -51,7 +51,7 @@ catalog:
   "@amplitude/analytics-browser": ^2.13.0
   "@amplitude/plugin-autocapture-browser": ^1.0.0
   "@axe-core/react": ^4.10.1
-  "@better-builds/ts-duality": 0.0.1-beta.8
+  "@better-builds/ts-duality": 0.0.1-beta.9
   "ag-grid-community": ^34.2.0
   "ag-grid-react": ^34.2.0
   "@babel/cli": ^7.27.2

+ 1 - 1
target_chains/cosmwasm/tools/package.json

@@ -195,4 +195,4 @@
   },
   "module": "./dist/esm/index.js",
   "types": "./dist/cjs/index.d.ts"
-}
+}