From 9f656e28148def0f2e687056b35a7fdfa7712062 Mon Sep 17 00:00:00 2001
From: Foivos <foivos@umich.edu>
Date: Wed, 6 Nov 2024 19:16:06 +0200
Subject: [PATCH] feat(squid)!: squid js tests and bugfixes (#191)

---
 .changeset/ten-goats-kneel.md                 |    5 +
 .github/workflows/test-js.yaml                |    3 +
 move/example/sources/squid/token_a.move       |   25 +
 move/example/sources/squid/token_b.move       |   25 +
 move/example/sources/squid/token_c.move       |   25 +
 move/squid/sources/squid/coin_bag.move        |    6 +-
 move/squid/sources/squid/deepbook_v3.move     |   34 +-
 move/squid/sources/squid/discovery.move       |  144 +-
 move/squid/sources/squid/squid.move           |   10 +
 move/squid/sources/squid/swap_type.move       |    8 +-
 move/squid/sources/squid/transfers.move       |   29 +-
 .../sources/squid/versioned/squid_v0.move     |    6 +
 move/squid/tests/squid/deepbook_v3_tests.move |    2 +-
 package-lock.json                             | 1452 +++++------------
 package.json                                  |    1 +
 src/common/bcs.ts                             |   19 +-
 src/common/tx-builder-base.ts                 |    5 +-
 src/node/node-utils.ts                        |   19 +-
 test/its.js                                   |   11 +-
 test/squid.js                                 |  499 ++++++
 test/testdata/interface_example_token_a.json  |   17 +
 test/testdata/interface_example_token_b.json  |   17 +
 test/testdata/interface_example_token_c.json  |   17 +
 test/testutils.js                             |   36 +-
 24 files changed, 1218 insertions(+), 1197 deletions(-)
 create mode 100644 .changeset/ten-goats-kneel.md
 create mode 100644 move/example/sources/squid/token_a.move
 create mode 100644 move/example/sources/squid/token_b.move
 create mode 100644 move/example/sources/squid/token_c.move
 create mode 100644 test/squid.js
 create mode 100644 test/testdata/interface_example_token_a.json
 create mode 100644 test/testdata/interface_example_token_b.json
 create mode 100644 test/testdata/interface_example_token_c.json

diff --git a/.changeset/ten-goats-kneel.md b/.changeset/ten-goats-kneel.md
new file mode 100644
index 00000000..a8974056
--- /dev/null
+++ b/.changeset/ten-goats-kneel.md
@@ -0,0 +1,5 @@
+---
+'@axelar-network/axelar-cgp-sui': minor
+---
+
+Added js e2e tests for squid, and fixed a few things with squid as well.
diff --git a/.github/workflows/test-js.yaml b/.github/workflows/test-js.yaml
index e018b846..c305bbae 100644
--- a/.github/workflows/test-js.yaml
+++ b/.github/workflows/test-js.yaml
@@ -33,5 +33,8 @@ jobs:
         run: sleep 30s
         shell: bash
 
+      - name: Switch to localnet
+        run: sui client new-env --alias localnet  --rpc http://0.0.0.0:9000 && sui client switch --env localnet
+
       - name: Test
         run: npm run test-js
diff --git a/move/example/sources/squid/token_a.move b/move/example/sources/squid/token_a.move
new file mode 100644
index 00000000..cd488ae9
--- /dev/null
+++ b/move/example/sources/squid/token_a.move
@@ -0,0 +1,25 @@
+module example::token_a;
+
+use sui::coin;
+
+// ------------
+// Capabilities
+// ------------
+public struct TOKEN_A has drop {}
+
+// -----
+// Setup
+// -----
+fun init(witness: TOKEN_A, ctx: &mut TxContext) {
+    let (treasury_cap, coin_metadata) = coin::create_currency(
+        witness,
+        9,
+        b"TOKEN1",
+        b"Token 1",
+        b"",
+        option::none(),
+        ctx,
+    );
+    transfer::public_transfer(treasury_cap, tx_context::sender(ctx));
+    transfer::public_transfer(coin_metadata, tx_context::sender(ctx));
+}
diff --git a/move/example/sources/squid/token_b.move b/move/example/sources/squid/token_b.move
new file mode 100644
index 00000000..1f2f7e09
--- /dev/null
+++ b/move/example/sources/squid/token_b.move
@@ -0,0 +1,25 @@
+module example::token_b;
+
+use sui::coin;
+
+// ------------
+// Capabilities
+// ------------
+public struct TOKEN_B has drop {}
+
+// -----
+// Setup
+// -----
+fun init(witness: TOKEN_B, ctx: &mut TxContext) {
+    let (treasury_cap, coin_metadata) = coin::create_currency(
+        witness,
+        9,
+        b"TOKEN2",
+        b"Token 2",
+        b"",
+        option::none(),
+        ctx,
+    );
+    transfer::public_transfer(treasury_cap, tx_context::sender(ctx));
+    transfer::public_transfer(coin_metadata, tx_context::sender(ctx));
+}
diff --git a/move/example/sources/squid/token_c.move b/move/example/sources/squid/token_c.move
new file mode 100644
index 00000000..8c3630d5
--- /dev/null
+++ b/move/example/sources/squid/token_c.move
@@ -0,0 +1,25 @@
+module example::token_c;
+
+use sui::coin;
+
+// ------------
+// Capabilities
+// ------------
+public struct TOKEN_C has drop {}
+
+// -----
+// Setup
+// -----
+fun init(witness: TOKEN_C, ctx: &mut TxContext) {
+    let (treasury_cap, coin_metadata) = coin::create_currency(
+        witness,
+        9,
+        b"TOKEN3",
+        b"Token 3",
+        b"",
+        option::none(),
+        ctx,
+    );
+    transfer::public_transfer(treasury_cap, tx_context::sender(ctx));
+    transfer::public_transfer(coin_metadata, tx_context::sender(ctx));
+}
diff --git a/move/squid/sources/squid/coin_bag.move b/move/squid/sources/squid/coin_bag.move
index f7459487..498c5f44 100644
--- a/move/squid/sources/squid/coin_bag.move
+++ b/move/squid/sources/squid/coin_bag.move
@@ -6,8 +6,10 @@ use sui::bag::{Self, Bag};
 use sui::balance::Balance;
 use sui::hash::keccak256;
 
-const EKeyNotExist: u64 = 0;
-const ENotEnoughBalance: u64 = 1;
+#[error]
+const EKeyNotExist: vector<u8> = b"key not found";
+#[error]
+const ENotEnoughBalance: vector<u8> = b"not enough balance";
 
 public struct CoinBag has store {
     bag: Bag,
diff --git a/move/squid/sources/squid/deepbook_v3.move b/move/squid/sources/squid/deepbook_v3.move
index 9aeb402f..61129209 100644
--- a/move/squid/sources/squid/deepbook_v3.move
+++ b/move/squid/sources/squid/deepbook_v3.move
@@ -1,25 +1,23 @@
 module squid::deepbook_v3;
 
-use std::ascii::{Self, String};
-use std::type_name;
-
-use sui::bcs::{Self, BCS};
-use sui::clock::Clock;
-
 use deepbook::pool::Pool;
-
 use relayer_discovery::transaction::{Self, MoveCall};
-
 use squid::squid::Squid;
 use squid::swap_info::SwapInfo;
 use squid::swap_type::{Self, SwapType};
-
+use std::ascii::{Self, String};
+use std::type_name;
+use sui::bcs::BCS;
+use sui::clock::Clock;
 use token::deep::DEEP;
+use utils::utils::peel;
 
-
-const EWrongSwapType: u64 = 0;
-const EWrongPool: u64 = 1;
-const EWrongCoinType: u64 = 2;
+#[error]
+const EWrongSwapType: vector<u8> = b"wrong swap type";
+#[error]
+const EWrongPool: vector<u8> = b"pool argument does not match required pool";
+#[error]
+const EWrongCoinType: vector<u8> = b"coin type expected does not match type argument";
 
 const FLOAT_SCALING: u128 = 1_000_000_000;
 
@@ -44,10 +42,11 @@ public fun estimate<B, Q>(
 ) {
     let (data, fallback) = self.data_estimating();
     if (fallback) return;
-    let swap_data = peel_swap_data(data);
+    let swap_data = peel!(data, |data| peel_swap_data(data));
 
     assert!(swap_data.swap_type == swap_type::deepbook_v3(), EWrongSwapType);
     assert!(swap_data.pool_id == object::id_address(pool), EWrongPool);
+
     assert!(
         &swap_data.base_type == &type_name::get<B>().into_string(),
         EWrongCoinType,
@@ -112,7 +111,7 @@ public fun swap<B, Q>(
 ) {
     let (data, fallback) = self.data_swapping();
     if (fallback) return;
-    let swap_data = peel_swap_data(data);
+    let swap_data = peel!(data, |data| peel_swap_data(data));
 
     assert!(swap_data.swap_type == swap_type::deepbook_v3(), EWrongSwapType);
     assert!(swap_data.pool_id == object::id_address(pool), EWrongPool);
@@ -259,10 +258,9 @@ public(package) fun swap_move_call(
     )
 }
 
-public(package) fun peel_swap_data(data: vector<u8>): DeepbookV3SwapData {
-    let mut bcs = bcs::new(data);
+public(package) fun peel_swap_data(bcs: &mut BCS): DeepbookV3SwapData {
     DeepbookV3SwapData {
-        swap_type: swap_type::peel(&mut bcs),
+        swap_type: swap_type::peel(bcs),
         pool_id: bcs.peel_address(),
         has_base: bcs.peel_bool(),
         min_output: bcs.peel_u64(),
diff --git a/move/squid/sources/squid/discovery.move b/move/squid/sources/squid/discovery.move
index 8e1063a4..13a8f091 100644
--- a/move/squid/sources/squid/discovery.move
+++ b/move/squid/sources/squid/discovery.move
@@ -1,25 +1,18 @@
 module squid::discovery;
 
-use std::ascii::{Self, String};
-
-use sui::bcs;
-
 use axelar_gateway::gateway::Gateway;
-
+use its::its::ITS;
 use relayer_discovery::discovery::RelayerDiscovery;
 use relayer_discovery::transaction::{Self, MoveCall, Transaction};
-
-use its::its::ITS;
-
 use squid::deepbook_v3;
 use squid::squid::Squid;
+use squid::swap_type::{Self};
 use squid::transfers;
+use std::ascii::{Self, String};
+use sui::bcs;
 
-const EInvalidSwapType: u64 = 0;
-
-const SWAP_TYPE_DEEPBOOK_V3: u8 = 1;
-const SWAP_TYPE_SUI_TRANSFER: u8 = 2;
-const SWAP_TYPE_ITS_TRANSFER: u8 = 3;
+#[error]
+const EInvalidSwapType: vector<u8> = b"swap type does not exist";
 
 public fun register_transaction(
     squid: &Squid,
@@ -43,7 +36,7 @@ public fun register_transaction(
                 transaction::new_function(
                     transaction::package_id<Squid>(),
                     ascii::string(b"discovery"),
-                    ascii::string(b"get_transaction"),
+                    ascii::string(b"transaction"),
                 ),
                 vector[squid_arg, its_arg, gateway_arg, vector[3]],
                 vector[],
@@ -84,80 +77,63 @@ public fun transaction(
     let mut move_calls = vector[
         start_swap(package_id, squid_arg, its_arg, type_in),
     ];
-
-    let mut i = 0;
-    while (i < swap_data.length()) {
-        let mut bcs = bcs::new(swap_data[i]);
-        let swap_type = bcs.peel_u8();
-
-        if (swap_type == SWAP_TYPE_DEEPBOOK_V3) {
-            move_calls.push_back(
-                deepbook_v3::estimate_move_call(
-                    package_id,
-                    bcs,
-                    swap_info_arg,
-                ),
-            );
-        } else if (swap_type == SWAP_TYPE_SUI_TRANSFER) {
-            move_calls.push_back(
-                transfers::sui_estimate_move_call(
-                    package_id,
-                    bcs,
-                    swap_info_arg,
-                ),
-            );
+    swap_data.do_ref!(|data| {
+        let mut bcs = bcs::new(*data);
+        let swap_type = swap_type::peel(&mut bcs);
+
+        let call = if (swap_type == swap_type::deepbook_v3()) {
+            deepbook_v3::estimate_move_call(
+                package_id,
+                bcs,
+                swap_info_arg,
+            )
+        } else if (swap_type == swap_type::sui_transfer()) {
+            transfers::sui_estimate_move_call(
+                package_id,
+                bcs,
+                swap_info_arg,
+            )
         } else {
-            assert!(swap_type == SWAP_TYPE_ITS_TRANSFER, EInvalidSwapType);
-            move_calls.push_back(
-                transfers::its_estimate_move_call(
-                    package_id,
-                    bcs,
-                    swap_info_arg,
-                ),
-            );
+            assert!(swap_type == swap_type::its_transfer(), EInvalidSwapType);
+            transfers::its_estimate_move_call(
+                package_id,
+                bcs,
+                swap_info_arg,
+            )
         };
-
-        i = i + 1;
-    };
-
-    i = 0;
-    while (i < swap_data.length()) {
-        let mut bcs = bcs::new(swap_data[i]);
-        let swap_type = bcs.peel_u8();
-
-        if (swap_type == SWAP_TYPE_DEEPBOOK_V3) {
-            move_calls.push_back(
-                deepbook_v3::swap_move_call(
-                    package_id,
-                    bcs,
-                    swap_info_arg,
-                    squid_arg,
-                ),
-            );
-        } else if (swap_type == SWAP_TYPE_SUI_TRANSFER) {
-            move_calls.push_back(
-                transfers::sui_transfer_move_call(
-                    package_id,
-                    bcs,
-                    swap_info_arg,
-                ),
-            );
+        move_calls.push_back(call);
+    });
+
+    swap_data.do!(|data| {
+        let mut bcs = bcs::new(data);
+        let swap_type = swap_type::peel(&mut bcs);
+
+        let call = if (swap_type == swap_type::deepbook_v3()) {
+            deepbook_v3::swap_move_call(
+                package_id,
+                bcs,
+                swap_info_arg,
+                squid_arg,
+            )
+        } else if (swap_type == swap_type::sui_transfer()) {
+            transfers::sui_transfer_move_call(
+                package_id,
+                bcs,
+                swap_info_arg,
+            )
         } else {
-            assert!(swap_type == SWAP_TYPE_ITS_TRANSFER, EInvalidSwapType);
-            move_calls.push_back(
-                transfers::its_transfer_move_call(
-                    package_id,
-                    bcs,
-                    swap_info_arg,
-                    squid_arg,
-                    gateway_arg,
-                    its_arg,
-                ),
-            );
+            assert!(swap_type == swap_type::its_transfer(), EInvalidSwapType);
+            transfers::its_transfer_move_call(
+                package_id,
+                bcs,
+                swap_info_arg,
+                squid_arg,
+                gateway_arg,
+                its_arg,
+            )
         };
-
-        i = i + 1;
-    };
+        move_calls.push_back(call);
+    });
 
     move_calls.push_back(finalize(package_id, swap_info_arg));
 
diff --git a/move/squid/sources/squid/squid.move b/move/squid/sources/squid/squid.move
index 6eda45ff..ea14f819 100644
--- a/move/squid/sources/squid/squid.move
+++ b/move/squid/sources/squid/squid.move
@@ -6,7 +6,9 @@ use squid::squid_v0::{Self, Squid_v0};
 use squid::swap_info::SwapInfo;
 use std::ascii;
 use sui::clock::Clock;
+use sui::coin::Coin;
 use sui::versioned::{Self, Versioned};
+use token::deep::DEEP;
 use version_control::version_control::{Self, VersionControl};
 
 // -------
@@ -58,6 +60,13 @@ public(package) macro fun value_mut(
     value
 }
 
+// ---------------
+// Entry Functions
+// ---------------
+entry fun give_deep(self: &mut Squid, deep: Coin<DEEP>) {
+    self.value_mut!(b"give_deep").give_deep(deep);
+}
+
 // ----------------
 // Public Functions
 // ----------------
@@ -103,6 +112,7 @@ fun new_version_control(): VersionControl {
             b"its_transfer",
             b"deepbook_v3_swap",
             b"register_transaction",
+            b"give_deep",
         ].map!(|function_name| function_name.to_ascii_string()),
     ])
 }
diff --git a/move/squid/sources/squid/swap_type.move b/move/squid/sources/squid/swap_type.move
index 3794ab63..a2a3f523 100644
--- a/move/squid/sources/squid/swap_type.move
+++ b/move/squid/sources/squid/swap_type.move
@@ -34,11 +34,11 @@ public(package) fun its_transfer(): SwapType {
 
 public(package) fun peel(bcs: &mut BCS): SwapType {
     let swap_type = bcs.peel_u8();
-    if(swap_type == 0) {   
+    if (swap_type == 0) {
         SwapType::DeepbookV3
-    } else if(swap_type == 1) {
-        SwapType::SuiTransfer   
-    } else if(swap_type == 2) {
+    } else if (swap_type == 1) {
+        SwapType::SuiTransfer
+    } else if (swap_type == 2) {
         SwapType::ItsTransfer
     } else {
         abort (EInvalidSwapType)
diff --git a/move/squid/sources/squid/transfers.move b/move/squid/sources/squid/transfers.move
index a9aebc79..ba52a209 100644
--- a/move/squid/sources/squid/transfers.move
+++ b/move/squid/sources/squid/transfers.move
@@ -9,12 +9,15 @@ use squid::swap_info::SwapInfo;
 use squid::swap_type::{Self, SwapType};
 use std::ascii::{Self, String};
 use std::type_name;
-use sui::bcs::{Self, BCS};
+use sui::bcs::BCS;
 use sui::clock::Clock;
 use sui::coin;
+use utils::utils::peel;
 
-const EWrongSwapType: u64 = 0;
-const EWrongCoinType: u64 = 1;
+#[error]
+const EWrongSwapType: vector<u8> = b"wrong swap type";
+#[error]
+const EWrongCoinType: vector<u8> = b"expected coin type does not match type argument";
 
 /// fallback states whether this transfer happens normally or only on fallback
 /// mode.
@@ -37,20 +40,18 @@ public struct ItsTransferSwapData has drop {
     fallback: bool,
 }
 
-fun new_sui_transfer_swap_data(data: vector<u8>): SuiTransferSwapData {
-    let mut bcs = bcs::new(data);
+fun new_sui_transfer_swap_data(bcs: &mut BCS): SuiTransferSwapData {
     SuiTransferSwapData {
-        swap_type: swap_type::peel(&mut bcs),
+        swap_type: swap_type::peel(bcs),
         coin_type: ascii::string(bcs.peel_vec_u8()),
         recipient: bcs.peel_address(),
         fallback: bcs.peel_bool(),
     }
 }
 
-fun new_its_transfer_swap_data(data: vector<u8>): ItsTransferSwapData {
-    let mut bcs = bcs::new(data);
+fun new_its_transfer_swap_data(bcs: &mut BCS): ItsTransferSwapData {
     ItsTransferSwapData {
-        swap_type: swap_type::peel(&mut bcs),
+        swap_type: swap_type::peel(bcs),
         coin_type: ascii::string(bcs.peel_vec_u8()),
         token_id: token_id::from_address(bcs.peel_address()),
         destination_chain: ascii::string(bcs.peel_vec_u8()),
@@ -63,7 +64,7 @@ fun new_its_transfer_swap_data(data: vector<u8>): ItsTransferSwapData {
 public fun sui_estimate<T>(swap_info: &mut SwapInfo) {
     let (data, fallback) = swap_info.data_estimating();
     if (fallback) return;
-    let swap_data = new_sui_transfer_swap_data(data);
+    let swap_data = peel!(data, |data| new_sui_transfer_swap_data(data));
 
     assert!(swap_data.swap_type == swap_type::sui_transfer(), EWrongSwapType);
 
@@ -78,7 +79,7 @@ public fun sui_estimate<T>(swap_info: &mut SwapInfo) {
 public fun its_estimate<T>(swap_info: &mut SwapInfo) {
     let (data, fallback) = swap_info.data_estimating();
     if (fallback) return;
-    let swap_data = new_its_transfer_swap_data(data);
+    let swap_data = peel!(data, |data| new_its_transfer_swap_data(data));
 
     assert!(swap_data.swap_type == swap_type::its_transfer(), EWrongSwapType);
 
@@ -92,7 +93,7 @@ public fun its_estimate<T>(swap_info: &mut SwapInfo) {
 
 public fun sui_transfer<T>(swap_info: &mut SwapInfo, ctx: &mut TxContext) {
     let (data, fallback) = swap_info.data_swapping();
-    let swap_data = new_sui_transfer_swap_data(data);
+    let swap_data = peel!(data, |data| new_sui_transfer_swap_data(data));
 
     // This check allows to skip the transfer if the `fallback` state does not
     // match the state of the transaction here.
@@ -130,9 +131,9 @@ public fun its_transfer<T>(
     let value = squid.value!(b"its_transfer");
 
     let (data, fallback) = swap_info.data_swapping();
-    
+
     if (data.length() == 0) return;
-    let swap_data = new_its_transfer_swap_data(data);
+    let swap_data = peel!(data, |data| new_its_transfer_swap_data(data));
 
     // This check allows to skip the transfer if the `fallback` state does not
     // match the state of the transaction here.
diff --git a/move/squid/sources/squid/versioned/squid_v0.move b/move/squid/sources/squid/versioned/squid_v0.move
index 936dbdce..26a30181 100644
--- a/move/squid/sources/squid/versioned/squid_v0.move
+++ b/move/squid/sources/squid/versioned/squid_v0.move
@@ -5,6 +5,8 @@ use its::its::ITS;
 use squid::coin_bag::{Self, CoinBag};
 use squid::swap_info::{Self, SwapInfo};
 use sui::clock::Clock;
+use sui::coin::Coin;
+use token::deep::DEEP;
 use version_control::version_control::VersionControl;
 
 // -----
@@ -61,6 +63,10 @@ public(package) fun start_swap<T>(
     swap_info
 }
 
+public(package) fun give_deep(self: &mut Squid_v0, deep: Coin<DEEP>) {
+    self.coin_bag.store_balance(deep.into_balance());
+}
+
 #[test_only]
 public fun new_for_testing(ctx: &mut TxContext): Squid_v0 {
     Squid_v0 {
diff --git a/move/squid/tests/squid/deepbook_v3_tests.move b/move/squid/tests/squid/deepbook_v3_tests.move
index a1bc10f7..65b7ab77 100644
--- a/move/squid/tests/squid/deepbook_v3_tests.move
+++ b/move/squid/tests/squid/deepbook_v3_tests.move
@@ -39,7 +39,7 @@ fun test_serialize() {
     let data = std::bcs::to_bytes(&vector[swap_data_vec]);
     let mut swap_info = swap_info::new(data, test.ctx());
     let (data2, _) = swap_info.data_estimating();
-    let swap_data2 = deepbook_v3::peel_swap_data(data2);
+    let swap_data2 = deepbook_v3::peel_swap_data(&mut sui::bcs::new(data2));
     assert_eq(swap_data, swap_data2);
 
     let clock = test.take_shared<Clock>();
diff --git a/package-lock.json b/package-lock.json
index ce33764a..0fda6468 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,16 +1,17 @@
 {
   "name": "@axelar-network/axelar-cgp-sui",
-  "version": "0.7.1",
+  "version": "0.8.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "@axelar-network/axelar-cgp-sui",
-      "version": "0.7.1",
+      "version": "0.8.0",
       "license": "MIT",
       "dependencies": {
         "@cosmjs/cosmwasm-stargate": "^0.32.2",
         "@mysten/sui": "^1.3.0",
+        "deepbookv3": "github:axelarnetwork/deepbookv3#mainnet-v1.35.2",
         "ethers": "^5.0.0",
         "secp256k1": "^5.0.0",
         "smol-toml": "^1.3.0",
@@ -39,9 +40,9 @@
       }
     },
     "node_modules/@0no-co/graphql.web": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.7.tgz",
-      "integrity": "sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ==",
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.9.tgz",
+      "integrity": "sha512-lXSg4bDHvP8CiMdpQf9f/rca12IIjXHN/p0Rc5mgzgLe4JBlIoA1zFa9NKhfG1bW0OyI2hgaOldFCfkEQwZuEQ==",
       "peerDependencies": {
         "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
       },
@@ -52,9 +53,9 @@
       }
     },
     "node_modules/@0no-co/graphqlsp": {
-      "version": "1.12.12",
-      "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.12.tgz",
-      "integrity": "sha512-BmCAc/q3tQcIwXxKoxubYaB23s2fWMMmNGSlY9mgQvWiReBS8ZutPZSf11OADfwTv1J1JIazU6q6OFX+cEp8PQ==",
+      "version": "1.12.16",
+      "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.16.tgz",
+      "integrity": "sha512-B5pyYVH93Etv7xjT6IfB7QtMBdaaC07yjbhN6v8H7KgFStMkPvi+oWYBTibMFRMY89qwc9H8YixXg8SXDVgYWw==",
       "dependencies": {
         "@gql.tada/internal": "^1.0.0",
         "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0"
@@ -68,6 +69,7 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
       "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+      "dev": true,
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.24"
@@ -77,12 +79,13 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
-      "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz",
+      "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==",
       "dev": true,
       "dependencies": {
-        "@babel/highlight": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "js-tokens": "^4.0.0",
         "picocolors": "^1.0.0"
       },
       "engines": {
@@ -90,30 +93,30 @@
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
-      "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz",
+      "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz",
-      "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
+      "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
       "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.24.7",
-        "@babel/generator": "^7.25.0",
-        "@babel/helper-compilation-targets": "^7.25.2",
-        "@babel/helper-module-transforms": "^7.25.2",
-        "@babel/helpers": "^7.25.0",
-        "@babel/parser": "^7.25.0",
-        "@babel/template": "^7.25.0",
-        "@babel/traverse": "^7.25.2",
-        "@babel/types": "^7.25.2",
+        "@babel/code-frame": "^7.26.0",
+        "@babel/generator": "^7.26.0",
+        "@babel/helper-compilation-targets": "^7.25.9",
+        "@babel/helper-module-transforms": "^7.26.0",
+        "@babel/helpers": "^7.26.0",
+        "@babel/parser": "^7.26.0",
+        "@babel/template": "^7.25.9",
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.26.0",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -138,29 +141,30 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
-      "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz",
+      "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.25.0",
+        "@babel/parser": "^7.26.0",
+        "@babel/types": "^7.26.0",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
-        "jsesc": "^2.5.1"
+        "jsesc": "^3.0.2"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
-      "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
+      "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.25.2",
-        "@babel/helper-validator-option": "^7.24.8",
-        "browserslist": "^4.23.1",
+        "@babel/compat-data": "^7.25.9",
+        "@babel/helper-validator-option": "^7.25.9",
+        "browserslist": "^4.24.0",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
       },
@@ -178,28 +182,27 @@
       }
     },
     "node_modules/@babel/helper-module-imports": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
-      "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
       "dev": true,
       "dependencies": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
-      "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+      "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-simple-access": "^7.24.7",
-        "@babel/helper-validator-identifier": "^7.24.7",
-        "@babel/traverse": "^7.25.2"
+        "@babel/helper-module-imports": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "@babel/traverse": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -208,92 +211,54 @@
         "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/helper-simple-access": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
-      "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@babel/helper-string-parser": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
-      "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
-      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
-      "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz",
-      "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/template": "^7.25.0",
-        "@babel/types": "^7.25.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/highlight": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
-      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
+      "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.24.7",
-        "chalk": "^2.4.2",
-        "js-tokens": "^4.0.0",
-        "picocolors": "^1.0.0"
+        "@babel/template": "^7.25.9",
+        "@babel/types": "^7.26.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/highlight/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+    "node_modules/@babel/parser": {
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.0.tgz",
+      "integrity": "sha512-aP8x5pIw3xvYr/sXT+SEUwyhrXT8rUJRZltK/qN3Db80dcKpTett8cJxHyjk+xYSVXvNnl2SfcJVjbwxpOSscA==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "@babel/types": "^7.26.0"
       },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz",
-      "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -302,9 +267,9 @@
       }
     },
     "node_modules/@babel/runtime": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz",
-      "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==",
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
+      "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
       "dev": true,
       "dependencies": {
         "regenerator-runtime": "^0.14.0"
@@ -314,30 +279,30 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
-      "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+      "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.24.7",
-        "@babel/parser": "^7.25.0",
-        "@babel/types": "^7.25.0"
+        "@babel/code-frame": "^7.25.9",
+        "@babel/parser": "^7.25.9",
+        "@babel/types": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz",
-      "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
+      "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.24.7",
-        "@babel/generator": "^7.25.0",
-        "@babel/parser": "^7.25.0",
-        "@babel/template": "^7.25.0",
-        "@babel/types": "^7.25.2",
+        "@babel/code-frame": "^7.25.9",
+        "@babel/generator": "^7.25.9",
+        "@babel/parser": "^7.25.9",
+        "@babel/template": "^7.25.9",
+        "@babel/types": "^7.25.9",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -346,30 +311,28 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
-      "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
+      "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-string-parser": "^7.24.8",
-        "@babel/helper-validator-identifier": "^7.24.7",
-        "to-fast-properties": "^2.0.0"
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@changesets/apply-release-plan": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.4.tgz",
-      "integrity": "sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==",
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.5.tgz",
+      "integrity": "sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
-        "@changesets/config": "^3.0.2",
+        "@changesets/config": "^3.0.3",
         "@changesets/get-version-range-type": "^0.4.0",
-        "@changesets/git": "^3.0.0",
-        "@changesets/should-skip-package": "^0.1.0",
+        "@changesets/git": "^3.0.1",
+        "@changesets/should-skip-package": "^0.1.1",
         "@changesets/types": "^6.0.0",
         "@manypkg/get-packages": "^1.1.3",
         "detect-indent": "^6.0.0",
@@ -382,15 +345,14 @@
       }
     },
     "node_modules/@changesets/assemble-release-plan": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.3.tgz",
-      "integrity": "sha512-bLNh9/Lgl1VwkjWZTq8JmRqH+hj7/Yzfz0jsQ/zJJ+FTmVqmqPj3szeKOri8O/hEM8JmHW019vh2gTO9iq5Cuw==",
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.4.tgz",
+      "integrity": "sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
         "@changesets/errors": "^0.2.0",
-        "@changesets/get-dependents-graph": "^2.1.1",
-        "@changesets/should-skip-package": "^0.1.0",
+        "@changesets/get-dependents-graph": "^2.1.2",
+        "@changesets/should-skip-package": "^0.1.1",
         "@changesets/types": "^6.0.0",
         "@manypkg/get-packages": "^1.1.3",
         "semver": "^7.5.3"
@@ -406,39 +368,35 @@
       }
     },
     "node_modules/@changesets/cli": {
-      "version": "2.27.7",
-      "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.7.tgz",
-      "integrity": "sha512-6lr8JltiiXPIjDeYg4iM2MeePP6VN/JkmqBsVA5XRiy01hGS3y629LtSDvKcycj/w/5Eur1rEwby/MjcYS+e2A==",
+      "version": "2.27.9",
+      "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.9.tgz",
+      "integrity": "sha512-q42a/ZbDnxPpCb5Wkm6tMVIxgeI9C/bexntzTeCFBrQEdpisQqk8kCHllYZMDjYtEc1ZzumbMJAG8H0Z4rdvjg==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
-        "@changesets/apply-release-plan": "^7.0.4",
-        "@changesets/assemble-release-plan": "^6.0.3",
+        "@changesets/apply-release-plan": "^7.0.5",
+        "@changesets/assemble-release-plan": "^6.0.4",
         "@changesets/changelog-git": "^0.2.0",
-        "@changesets/config": "^3.0.2",
+        "@changesets/config": "^3.0.3",
         "@changesets/errors": "^0.2.0",
-        "@changesets/get-dependents-graph": "^2.1.1",
-        "@changesets/get-release-plan": "^4.0.3",
-        "@changesets/git": "^3.0.0",
-        "@changesets/logger": "^0.1.0",
-        "@changesets/pre": "^2.0.0",
-        "@changesets/read": "^0.6.0",
-        "@changesets/should-skip-package": "^0.1.0",
+        "@changesets/get-dependents-graph": "^2.1.2",
+        "@changesets/get-release-plan": "^4.0.4",
+        "@changesets/git": "^3.0.1",
+        "@changesets/logger": "^0.1.1",
+        "@changesets/pre": "^2.0.1",
+        "@changesets/read": "^0.6.1",
+        "@changesets/should-skip-package": "^0.1.1",
         "@changesets/types": "^6.0.0",
-        "@changesets/write": "^0.3.1",
+        "@changesets/write": "^0.3.2",
         "@manypkg/get-packages": "^1.1.3",
-        "@types/semver": "^7.5.0",
         "ansi-colors": "^4.1.3",
-        "chalk": "^2.1.0",
         "ci-info": "^3.7.0",
         "enquirer": "^2.3.0",
         "external-editor": "^3.1.0",
         "fs-extra": "^7.0.1",
-        "human-id": "^1.0.2",
         "mri": "^1.2.0",
-        "outdent": "^0.5.0",
         "p-limit": "^2.2.0",
-        "preferred-pm": "^3.0.0",
+        "package-manager-detector": "^0.2.0",
+        "picocolors": "^1.1.0",
         "resolve-from": "^5.0.0",
         "semver": "^7.5.3",
         "spawndamnit": "^2.0.0",
@@ -448,29 +406,15 @@
         "changeset": "bin.js"
       }
     },
-    "node_modules/@changesets/cli/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/@changesets/config": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.2.tgz",
-      "integrity": "sha512-cdEhS4t8woKCX2M8AotcV2BOWnBp09sqICxKapgLHf9m5KdENpWjyrFNMjkLqGJtUys9U+w93OxWT0czorVDfw==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.3.tgz",
+      "integrity": "sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==",
       "dev": true,
       "dependencies": {
         "@changesets/errors": "^0.2.0",
-        "@changesets/get-dependents-graph": "^2.1.1",
-        "@changesets/logger": "^0.1.0",
+        "@changesets/get-dependents-graph": "^2.1.2",
+        "@changesets/logger": "^0.1.1",
         "@changesets/types": "^6.0.0",
         "@manypkg/get-packages": "^1.1.3",
         "fs-extra": "^7.0.1",
@@ -487,43 +431,27 @@
       }
     },
     "node_modules/@changesets/get-dependents-graph": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.1.tgz",
-      "integrity": "sha512-LRFjjvigBSzfnPU2n/AhFsuWR5DK++1x47aq6qZ8dzYsPtS/I5mNhIGAS68IAxh1xjO9BTtz55FwefhANZ+FCA==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.2.tgz",
+      "integrity": "sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==",
       "dev": true,
       "dependencies": {
         "@changesets/types": "^6.0.0",
         "@manypkg/get-packages": "^1.1.3",
-        "chalk": "^2.1.0",
-        "fs-extra": "^7.0.1",
+        "picocolors": "^1.1.0",
         "semver": "^7.5.3"
       }
     },
-    "node_modules/@changesets/get-dependents-graph/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/@changesets/get-release-plan": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.3.tgz",
-      "integrity": "sha512-6PLgvOIwTSdJPTtpdcr3sLtGatT+Jr22+cQwEBJBy6wP0rjB4yJ9lv583J9fVpn1bfQlBkDa8JxbS2g/n9lIyA==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.4.tgz",
+      "integrity": "sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
-        "@changesets/assemble-release-plan": "^6.0.3",
-        "@changesets/config": "^3.0.2",
-        "@changesets/pre": "^2.0.0",
-        "@changesets/read": "^0.6.0",
+        "@changesets/assemble-release-plan": "^6.0.4",
+        "@changesets/config": "^3.0.3",
+        "@changesets/pre": "^2.0.1",
+        "@changesets/read": "^0.6.1",
         "@changesets/types": "^6.0.0",
         "@manypkg/get-packages": "^1.1.3"
       }
@@ -535,14 +463,12 @@
       "dev": true
     },
     "node_modules/@changesets/git": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.0.tgz",
-      "integrity": "sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.1.tgz",
+      "integrity": "sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
         "@changesets/errors": "^0.2.0",
-        "@changesets/types": "^6.0.0",
         "@manypkg/get-packages": "^1.1.3",
         "is-subdir": "^1.1.1",
         "micromatch": "^4.0.2",
@@ -550,26 +476,12 @@
       }
     },
     "node_modules/@changesets/logger": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.0.tgz",
-      "integrity": "sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.1.0"
-      }
-    },
-    "node_modules/@changesets/logger/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz",
+      "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
+        "picocolors": "^1.1.0"
       }
     },
     "node_modules/@changesets/parse": {
@@ -583,12 +495,11 @@
       }
     },
     "node_modules/@changesets/pre": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.0.tgz",
-      "integrity": "sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.1.tgz",
+      "integrity": "sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
         "@changesets/errors": "^0.2.0",
         "@changesets/types": "^6.0.0",
         "@manypkg/get-packages": "^1.1.3",
@@ -596,42 +507,26 @@
       }
     },
     "node_modules/@changesets/read": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.0.tgz",
-      "integrity": "sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==",
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.1.tgz",
+      "integrity": "sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
-        "@changesets/git": "^3.0.0",
-        "@changesets/logger": "^0.1.0",
+        "@changesets/git": "^3.0.1",
+        "@changesets/logger": "^0.1.1",
         "@changesets/parse": "^0.4.0",
         "@changesets/types": "^6.0.0",
-        "chalk": "^2.1.0",
         "fs-extra": "^7.0.1",
-        "p-filter": "^2.1.0"
-      }
-    },
-    "node_modules/@changesets/read/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "engines": {
-        "node": ">=4"
+        "p-filter": "^2.1.0",
+        "picocolors": "^1.1.0"
       }
     },
     "node_modules/@changesets/should-skip-package": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.0.tgz",
-      "integrity": "sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==",
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.1.tgz",
+      "integrity": "sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
         "@changesets/types": "^6.0.0",
         "@manypkg/get-packages": "^1.1.3"
       }
@@ -643,12 +538,11 @@
       "dev": true
     },
     "node_modules/@changesets/write": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.1.tgz",
-      "integrity": "sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==",
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.2.tgz",
+      "integrity": "sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.1",
         "@changesets/types": "^6.0.0",
         "fs-extra": "^7.0.1",
         "human-id": "^1.0.2",
@@ -820,9 +714,9 @@
       }
     },
     "node_modules/@eslint-community/regexpp": {
-      "version": "4.11.0",
-      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
-      "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
+      "version": "4.11.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz",
+      "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==",
       "dev": true,
       "engines": {
         "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -907,9 +801,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.57.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
-      "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+      "version": "8.57.1",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+      "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1626,27 +1520,34 @@
       }
     },
     "node_modules/@gql.tada/cli-utils": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.5.2.tgz",
-      "integrity": "sha512-sJRGVOGAFg4M7jDU4ErSq+5tTTVwHRmlTURNoAeukJvIvgDoPA4JDlH2AGmUnqDGi+eMyIJwYDJV5RvZxKT6dg==",
-      "dependencies": {
-        "@0no-co/graphqlsp": "^1.12.9",
-        "@gql.tada/internal": "1.0.5",
-        "@vue/compiler-dom": "^3.4.23",
-        "@vue/language-core": "^2.0.17",
-        "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0",
-        "svelte2tsx": "^0.7.6"
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.6.3.tgz",
+      "integrity": "sha512-jFFSY8OxYeBxdKi58UzeMXG1tdm4FVjXa8WHIi66Gzu9JWtCE6mqom3a8xkmSw+mVaybFW5EN2WXf1WztJVNyQ==",
+      "dependencies": {
+        "@0no-co/graphqlsp": "^1.12.13",
+        "@gql.tada/internal": "1.0.8",
+        "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0"
       },
       "peerDependencies": {
-        "@0no-co/graphqlsp": "^1.12.9",
+        "@0no-co/graphqlsp": "^1.12.13",
+        "@gql.tada/svelte-support": "1.0.1",
+        "@gql.tada/vue-support": "1.0.1",
         "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0",
         "typescript": "^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@gql.tada/svelte-support": {
+          "optional": true
+        },
+        "@gql.tada/vue-support": {
+          "optional": true
+        }
       }
     },
     "node_modules/@gql.tada/internal": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.5.tgz",
-      "integrity": "sha512-3rTRBAwfXem4OV0Lm5aM5cShfrUnPFaXc03F78165Q95Zw1dlI7cmsNZK9pmLm5IevjwMHqqT8C1aN1Kb+AJvw==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.8.tgz",
+      "integrity": "sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==",
       "dependencies": {
         "@0no-co/graphql.web": "^1.0.5"
       },
@@ -1664,13 +1565,13 @@
       }
     },
     "node_modules/@humanwhocodes/config-array": {
-      "version": "0.11.14",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
-      "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+      "version": "0.13.0",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+      "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
       "deprecated": "Use @eslint/config-array instead",
       "dev": true,
       "dependencies": {
-        "@humanwhocodes/object-schema": "^2.0.2",
+        "@humanwhocodes/object-schema": "^2.0.3",
         "debug": "^4.3.1",
         "minimatch": "^3.0.5"
       },
@@ -1747,6 +1648,7 @@
       "version": "0.3.5",
       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
       "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "dev": true,
       "dependencies": {
         "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -1760,6 +1662,7 @@
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
       "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
       "engines": {
         "node": ">=6.0.0"
       }
@@ -1768,6 +1671,7 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
       "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "dev": true,
       "engines": {
         "node": ">=6.0.0"
       }
@@ -1775,12 +1679,14 @@
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
-      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+      "dev": true
     },
     "node_modules/@jridgewell/trace-mapping": {
       "version": "0.3.25",
       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
       "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dev": true,
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
@@ -1853,20 +1759,20 @@
       }
     },
     "node_modules/@mysten/bcs": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-1.0.3.tgz",
-      "integrity": "sha512-fc2xDj8eteP18zCNr6WStlE0Hxi7kYeY9yAzAN8oyz5EYOLas0JwScR9pAd9VR61BfIThJ+5vxQ6K7Y22lHDVQ==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-1.1.0.tgz",
+      "integrity": "sha512-yy9/1Y4d0FlRywS1+9ze/T7refCbrvwFwJIOKs9M3QBK1njbcHZp+LkVeLqBvIJA5eZ3ZCzmhQ1Xq4Sed5mEBA==",
       "dependencies": {
         "bs58": "^6.0.0"
       }
     },
     "node_modules/@mysten/sui": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-1.3.1.tgz",
-      "integrity": "sha512-TxTYFO9ou/LOk3LQYZIJrZQJ/8UHEqYpT67MbCHYLCxGiPqAnvpIgnVBzJkpYFA/7vR0pQ1e3KELvQrYHnz2Ag==",
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-1.13.0.tgz",
+      "integrity": "sha512-zxRFWkb5dFjwQh6gGkswNrdSVoeBbjrL70AmRa13seNe8mfnf2lZgE8Kcj1fj4MTsDI2mGNWihQVkK99cprW+w==",
       "dependencies": {
         "@graphql-typed-document-node/core": "^3.2.0",
-        "@mysten/bcs": "1.0.3",
+        "@mysten/bcs": "1.1.0",
         "@noble/curves": "^1.4.2",
         "@noble/hashes": "^1.4.0",
         "@scure/bip32": "^1.4.0",
@@ -1888,22 +1794,25 @@
       "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="
     },
     "node_modules/@noble/curves": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz",
-      "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==",
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz",
+      "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==",
       "dependencies": {
-        "@noble/hashes": "1.4.0"
+        "@noble/hashes": "1.5.0"
+      },
+      "engines": {
+        "node": "^14.21.3 || >=16"
       },
       "funding": {
         "url": "https://paulmillr.com/funding/"
       }
     },
     "node_modules/@noble/hashes": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
-      "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz",
+      "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==",
       "engines": {
-        "node": ">= 16"
+        "node": "^14.21.3 || >=16"
       },
       "funding": {
         "url": "https://paulmillr.com/funding/"
@@ -1998,34 +1907,40 @@
       "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
       "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
     },
+    "node_modules/@rtsao/scc": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+      "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+      "dev": true
+    },
     "node_modules/@scure/base": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz",
-      "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==",
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz",
+      "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==",
       "funding": {
         "url": "https://paulmillr.com/funding/"
       }
     },
     "node_modules/@scure/bip32": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz",
-      "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz",
+      "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==",
       "dependencies": {
-        "@noble/curves": "~1.4.0",
-        "@noble/hashes": "~1.4.0",
-        "@scure/base": "~1.1.6"
+        "@noble/curves": "~1.6.0",
+        "@noble/hashes": "~1.5.0",
+        "@scure/base": "~1.1.7"
       },
       "funding": {
         "url": "https://paulmillr.com/funding/"
       }
     },
     "node_modules/@scure/bip39": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz",
-      "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz",
+      "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==",
       "dependencies": {
-        "@noble/hashes": "~1.4.0",
-        "@scure/base": "~1.1.6"
+        "@noble/hashes": "~1.5.0",
+        "@scure/base": "~1.1.8"
       },
       "funding": {
         "url": "https://paulmillr.com/funding/"
@@ -2036,12 +1951,6 @@
       "resolved": "https://registry.npmjs.org/@suchipi/femver/-/femver-1.0.0.tgz",
       "integrity": "sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg=="
     },
-    "node_modules/@types/estree": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
-      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
-      "peer": true
-    },
     "node_modules/@types/json5": {
       "version": "0.0.29",
       "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@@ -2054,11 +1963,11 @@
       "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
     },
     "node_modules/@types/node": {
-      "version": "20.14.13",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.13.tgz",
-      "integrity": "sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==",
+      "version": "20.17.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.1.tgz",
+      "integrity": "sha512-j2VlPv1NnwPJbaCNv69FO/1z4lId0QmGvpT41YxitRtWlg96g/j8qcv2RKsLKe2F6OJgyXhupN1Xo17b2m139Q==",
       "dependencies": {
-        "undici-types": "~5.26.4"
+        "undici-types": "~6.19.2"
       }
     },
     "node_modules/@types/secp256k1": {
@@ -2070,12 +1979,6 @@
         "@types/node": "*"
       }
     },
-    "node_modules/@types/semver": {
-      "version": "7.5.8",
-      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
-      "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
-      "dev": true
-    },
     "node_modules/@typescript-eslint/eslint-plugin": {
       "version": "7.18.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
@@ -2267,81 +2170,11 @@
       "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
       "dev": true
     },
-    "node_modules/@volar/language-core": {
-      "version": "2.4.0-alpha.18",
-      "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.18.tgz",
-      "integrity": "sha512-JAYeJvYQQROmVRtSBIczaPjP3DX4QW1fOqW1Ebs0d3Y3EwSNRglz03dSv0Dm61dzd0Yx3WgTW3hndDnTQqgmyg==",
-      "dependencies": {
-        "@volar/source-map": "2.4.0-alpha.18"
-      }
-    },
-    "node_modules/@volar/source-map": {
-      "version": "2.4.0-alpha.18",
-      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.18.tgz",
-      "integrity": "sha512-MTeCV9MUwwsH0sNFiZwKtFrrVZUK6p8ioZs3xFzHc2cvDXHWlYN3bChdQtwKX+FY2HG6H3CfAu1pKijolzIQ8g=="
-    },
-    "node_modules/@vue/compiler-core": {
-      "version": "3.4.34",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.34.tgz",
-      "integrity": "sha512-Z0izUf32+wAnQewjHu+pQf1yw00EGOmevl1kE+ljjjMe7oEfpQ+BI3/JNK7yMB4IrUsqLDmPecUrpj3mCP+yJQ==",
-      "dependencies": {
-        "@babel/parser": "^7.24.7",
-        "@vue/shared": "3.4.34",
-        "entities": "^4.5.0",
-        "estree-walker": "^2.0.2",
-        "source-map-js": "^1.2.0"
-      }
-    },
-    "node_modules/@vue/compiler-dom": {
-      "version": "3.4.34",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.34.tgz",
-      "integrity": "sha512-3PUOTS1h5cskdOJMExCu2TInXuM0j60DRPpSCJDqOCupCfUZCJoyQmKtRmA8EgDNZ5kcEE7vketamRZfrEuVDw==",
-      "dependencies": {
-        "@vue/compiler-core": "3.4.34",
-        "@vue/shared": "3.4.34"
-      }
-    },
-    "node_modules/@vue/compiler-vue2": {
-      "version": "2.7.16",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
-      "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
-      "dependencies": {
-        "de-indent": "^1.0.2",
-        "he": "^1.2.0"
-      }
-    },
-    "node_modules/@vue/language-core": {
-      "version": "2.0.29",
-      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.29.tgz",
-      "integrity": "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==",
-      "dependencies": {
-        "@volar/language-core": "~2.4.0-alpha.18",
-        "@vue/compiler-dom": "^3.4.0",
-        "@vue/compiler-vue2": "^2.7.16",
-        "@vue/shared": "^3.4.0",
-        "computeds": "^0.0.1",
-        "minimatch": "^9.0.3",
-        "muggle-string": "^0.4.1",
-        "path-browserify": "^1.0.1"
-      },
-      "peerDependencies": {
-        "typescript": "*"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@vue/shared": {
-      "version": "3.4.34",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.34.tgz",
-      "integrity": "sha512-x5LmiRLpRsd9KTjAB8MPKf0CDPMcuItjP0gbNqFCIgL1I8iYp4zglhj9w9FPCdIbHG2M91RVeIbArFfFTz9I3A=="
-    },
     "node_modules/acorn": {
-      "version": "8.12.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
-      "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+      "version": "8.13.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz",
+      "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==",
+      "dev": true,
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -2398,15 +2231,18 @@
       }
     },
     "node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
       "dependencies": {
-        "color-convert": "^1.9.0"
+        "color-convert": "^2.0.1"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
     "node_modules/anymatch": {
@@ -2431,15 +2267,6 @@
         "sprintf-js": "~1.0.2"
       }
     },
-    "node_modules/aria-query": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
-      "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
-      "peer": true,
-      "dependencies": {
-        "dequal": "^2.0.3"
-      }
-    },
     "node_modules/array-buffer-byte-length": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
@@ -2602,19 +2429,11 @@
         "proxy-from-env": "^1.1.0"
       }
     },
-    "node_modules/axobject-query": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
-      "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
-      "peer": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
     },
     "node_modules/base-x": {
       "version": "5.0.0",
@@ -2678,6 +2497,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
       "dependencies": {
         "balanced-match": "^1.0.0"
       }
@@ -2706,9 +2526,9 @@
       "dev": true
     },
     "node_modules/browserslist": {
-      "version": "4.23.2",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
-      "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
+      "version": "4.24.2",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
+      "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
       "dev": true,
       "funding": [
         {
@@ -2725,10 +2545,10 @@
         }
       ],
       "dependencies": {
-        "caniuse-lite": "^1.0.30001640",
-        "electron-to-chromium": "^1.4.820",
-        "node-releases": "^2.0.14",
-        "update-browserslist-db": "^1.1.0"
+        "caniuse-lite": "^1.0.30001669",
+        "electron-to-chromium": "^1.5.41",
+        "node-releases": "^2.0.18",
+        "update-browserslist-db": "^1.1.1"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -2786,9 +2606,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001644",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001644.tgz",
-      "integrity": "sha512-YGvlOZB4QhZuiis+ETS0VXR+MExbFf4fZYYeMTEE0aTQd/RdIjkTyZjLrbYVKnHzppDvnOhritRVv+i7Go6mHw==",
+      "version": "1.0.30001669",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz",
+      "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==",
       "dev": true,
       "funding": [
         {
@@ -2839,60 +2659,6 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "node_modules/chalk/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/chalk/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/chalk/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/chalk/node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/chalk/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/chardet": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
@@ -2973,41 +2739,22 @@
         "wrap-ansi": "^7.0.0"
       }
     },
-    "node_modules/code-red": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
-      "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.4.15",
-        "@types/estree": "^1.0.1",
-        "acorn": "^8.10.0",
-        "estree-walker": "^3.0.3",
-        "periscopic": "^3.1.0"
-      }
-    },
-    "node_modules/code-red/node_modules/estree-walker": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
-      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
-      "peer": true,
-      "dependencies": {
-        "@types/estree": "^1.0.0"
-      }
-    },
     "node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
       "dependencies": {
-        "color-name": "1.1.3"
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
       }
     },
     "node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
       "dev": true
     },
     "node_modules/combined-stream": {
@@ -3021,11 +2768,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/computeds": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz",
-      "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q=="
-    },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -3057,19 +2799,6 @@
         "node": ">= 8"
       }
     },
-    "node_modules/css-tree": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
-      "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
-      "peer": true,
-      "dependencies": {
-        "mdn-data": "2.0.30",
-        "source-map-js": "^1.0.1"
-      },
-      "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
-      }
-    },
     "node_modules/data-view-buffer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
@@ -3121,18 +2850,13 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/de-indent": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
-      "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="
-    },
     "node_modules/debug": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
-      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
       "dev": true,
       "dependencies": {
-        "ms": "2.1.2"
+        "ms": "^2.1.3"
       },
       "engines": {
         "node": ">=6.0"
@@ -3155,11 +2879,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/dedent-js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz",
-      "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ=="
-    },
     "node_modules/deep-eql": {
       "version": "4.1.4",
       "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
@@ -3178,6 +2897,11 @@
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true
     },
+    "node_modules/deepbookv3": {
+      "version": "1.0.0",
+      "resolved": "git+ssh://git@github.com/axelarnetwork/deepbookv3.git#08655d306ee4ee46e561c12536e6b4d8f75300bd",
+      "license": "Apache-2.0"
+    },
     "node_modules/define-data-property": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
@@ -3218,15 +2942,6 @@
         "node": ">=0.4.0"
       }
     },
-    "node_modules/dequal": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
-      "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
-      "peer": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/detect-indent": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
@@ -3282,9 +2997,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.3.tgz",
-      "integrity": "sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==",
+      "version": "1.5.45",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.45.tgz",
+      "integrity": "sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw==",
       "dev": true
     },
     "node_modules/elliptic": {
@@ -3325,17 +3040,6 @@
         "node": ">=8.6"
       }
     },
-    "node_modules/entities": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
-      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
     "node_modules/es-abstract": {
       "version": "1.23.3",
       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
@@ -3468,34 +3172,38 @@
       }
     },
     "node_modules/escalade": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
-      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
       "dev": true,
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
       "dev": true,
       "engines": {
-        "node": ">=0.8.0"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/eslint": {
-      "version": "8.57.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
-      "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+      "version": "8.57.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+      "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+      "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.6.1",
         "@eslint/eslintrc": "^2.1.4",
-        "@eslint/js": "8.57.0",
-        "@humanwhocodes/config-array": "^0.11.14",
+        "@eslint/js": "8.57.1",
+        "@humanwhocodes/config-array": "^0.13.0",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
         "@ungap/structured-clone": "^1.2.0",
@@ -3604,9 +3312,9 @@
       }
     },
     "node_modules/eslint-module-utils": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz",
-      "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==",
+      "version": "2.12.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+      "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
       "dev": true,
       "dependencies": {
         "debug": "^3.2.7"
@@ -3649,34 +3357,36 @@
       }
     },
     "node_modules/eslint-plugin-import": {
-      "version": "2.29.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
-      "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
+      "version": "2.31.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+      "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
       "dev": true,
       "dependencies": {
-        "array-includes": "^3.1.7",
-        "array.prototype.findlastindex": "^1.2.3",
+        "@rtsao/scc": "^1.1.0",
+        "array-includes": "^3.1.8",
+        "array.prototype.findlastindex": "^1.2.5",
         "array.prototype.flat": "^1.3.2",
         "array.prototype.flatmap": "^1.3.2",
         "debug": "^3.2.7",
         "doctrine": "^2.1.0",
         "eslint-import-resolver-node": "^0.3.9",
-        "eslint-module-utils": "^2.8.0",
-        "hasown": "^2.0.0",
-        "is-core-module": "^2.13.1",
+        "eslint-module-utils": "^2.12.0",
+        "hasown": "^2.0.2",
+        "is-core-module": "^2.15.1",
         "is-glob": "^4.0.3",
         "minimatch": "^3.1.2",
-        "object.fromentries": "^2.0.7",
-        "object.groupby": "^1.0.1",
-        "object.values": "^1.1.7",
+        "object.fromentries": "^2.0.8",
+        "object.groupby": "^1.0.3",
+        "object.values": "^1.2.0",
         "semver": "^6.3.1",
+        "string.prototype.trimend": "^1.0.8",
         "tsconfig-paths": "^3.15.0"
       },
       "engines": {
         "node": ">=4"
       },
       "peerDependencies": {
-        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
       }
     },
     "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
@@ -3898,18 +3608,6 @@
         "concat-map": "0.0.1"
       }
     },
-    "node_modules/eslint/node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/eslint/node_modules/find-up": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -4073,11 +3771,6 @@
         "node": ">=4.0"
       }
     },
-    "node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
     "node_modules/esutils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -4154,18 +3847,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/external-editor/node_modules/tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
-      "dev": true,
-      "dependencies": {
-        "os-tmpdir": "~1.0.2"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -4258,16 +3939,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/find-yarn-workspace-root2": {
-      "version": "1.2.16",
-      "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz",
-      "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==",
-      "dev": true,
-      "dependencies": {
-        "micromatch": "^4.0.2",
-        "pkg-dir": "^4.2.0"
-      }
-    },
     "node_modules/flat": {
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
@@ -4298,9 +3969,9 @@
       "dev": true
     },
     "node_modules/follow-redirects": {
-      "version": "1.15.6",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
-      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "version": "1.15.9",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
       "funding": [
         {
           "type": "individual",
@@ -4326,9 +3997,9 @@
       }
     },
     "node_modules/form-data": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
       "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
@@ -4578,14 +4249,14 @@
       }
     },
     "node_modules/gql.tada": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.8.3.tgz",
-      "integrity": "sha512-0H81I3M54jKTDHbnNWhXDf57Ie2d2raxnFCc93zdYjXHnrXe522jrio9AAFwqBlGx/xtaP3ILSSUw7J9H31LAA==",
+      "version": "1.8.10",
+      "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.8.10.tgz",
+      "integrity": "sha512-FrvSxgz838FYVPgZHGOSgbpOjhR+yq44rCzww3oOPJYi0OvBJjAgCiP6LEokZIYND2fUTXzQAyLgcvgw1yNP5A==",
       "dependencies": {
         "@0no-co/graphql.web": "^1.0.5",
-        "@0no-co/graphqlsp": "^1.12.9",
-        "@gql.tada/cli-utils": "1.5.2",
-        "@gql.tada/internal": "1.0.5"
+        "@0no-co/graphqlsp": "^1.12.13",
+        "@gql.tada/cli-utils": "1.6.3",
+        "@gql.tada/internal": "1.0.8"
       },
       "bin": {
         "gql-tada": "bin/cli.js",
@@ -4625,12 +4296,12 @@
       }
     },
     "node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
       }
     },
     "node_modules/has-property-descriptors": {
@@ -4705,6 +4376,7 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true,
       "bin": {
         "he": "bin/he"
       }
@@ -4738,9 +4410,9 @@
       }
     },
     "node_modules/ignore": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
-      "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
       "dev": true,
       "engines": {
         "node": ">= 4"
@@ -4879,9 +4551,9 @@
       }
     },
     "node_modules/is-core-module": {
-      "version": "2.15.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
-      "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
       "dev": true,
       "dependencies": {
         "hasown": "^2.0.2"
@@ -5007,15 +4679,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/is-reference": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
-      "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
-      "peer": true,
-      "dependencies": {
-        "@types/estree": "*"
-      }
-    },
     "node_modules/is-regex": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -5182,15 +4845,15 @@
       }
     },
     "node_modules/jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+      "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
       "dev": true,
       "bin": {
         "jsesc": "bin/jsesc"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=6"
       }
     },
     "node_modules/json-buffer": {
@@ -5255,39 +4918,18 @@
       }
     },
     "node_modules/libsodium-sumo": {
-      "version": "0.7.14",
-      "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.14.tgz",
-      "integrity": "sha512-2nDge6qlAjcwyslAhWfVumlkeSNK5+WCfKa2/VEq9prvlT5vP2FR0m0o5hmKaYqfsZ4TQVj5czQsimZvXDB1CQ=="
+      "version": "0.7.15",
+      "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz",
+      "integrity": "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw=="
     },
     "node_modules/libsodium-wrappers-sumo": {
-      "version": "0.7.14",
-      "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.14.tgz",
-      "integrity": "sha512-0lm7ZwN5a95J2yUi8R1rgQeeaVDIWnvNzgVmXmZswis4mC+bQtbDrB+QpJlL4qklaKx3hVpJjoc6ubzJFiv64Q==",
+      "version": "0.7.15",
+      "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz",
+      "integrity": "sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==",
       "dependencies": {
-        "libsodium-sumo": "^0.7.14"
+        "libsodium-sumo": "^0.7.15"
       }
     },
-    "node_modules/load-yaml-file": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz",
-      "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.5",
-        "js-yaml": "^3.13.0",
-        "pify": "^4.0.1",
-        "strip-bom": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/locate-character": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
-      "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
-      "peer": true
-    },
     "node_modules/locate-path": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -5342,14 +4984,6 @@
         "get-func-name": "^2.0.1"
       }
     },
-    "node_modules/lower-case": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
-      "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
-      "dependencies": {
-        "tslib": "^2.0.3"
-      }
-    },
     "node_modules/lru-cache": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -5359,21 +4993,6 @@
         "yallist": "^3.0.2"
       }
     },
-    "node_modules/magic-string": {
-      "version": "0.30.11",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
-      "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.5.0"
-      }
-    },
-    "node_modules/mdn-data": {
-      "version": "2.0.30",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
-      "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
-      "peer": true
-    },
     "node_modules/merge2": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -5429,6 +5048,7 @@
       "version": "9.0.5",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
       "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -5449,9 +5069,9 @@
       }
     },
     "node_modules/mocha": {
-      "version": "10.7.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.0.tgz",
-      "integrity": "sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==",
+      "version": "10.7.3",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz",
+      "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==",
       "dev": true,
       "dependencies": {
         "ansi-colors": "^4.1.3",
@@ -5498,18 +5118,6 @@
         "node": ">=0.3.1"
       }
     },
-    "node_modules/mocha/node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/mocha/node_modules/find-up": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -5526,15 +5134,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/mocha/node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/mocha/node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -5574,12 +5173,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/mocha/node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true
-    },
     "node_modules/mocha/node_modules/p-limit": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -5635,40 +5228,26 @@
       }
     },
     "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
       "dev": true
     },
-    "node_modules/muggle-string": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
-      "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="
-    },
     "node_modules/natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
       "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
       "dev": true
     },
-    "node_modules/no-case": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
-      "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
-      "dependencies": {
-        "lower-case": "^2.0.2",
-        "tslib": "^2.0.3"
-      }
-    },
     "node_modules/node-addon-api": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
       "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
     },
     "node_modules/node-gyp-build": {
-      "version": "4.8.1",
-      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz",
-      "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==",
+      "version": "4.8.2",
+      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz",
+      "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==",
       "bin": {
         "node-gyp-build": "bin.js",
         "node-gyp-build-optional": "optional.js",
@@ -5875,6 +5454,12 @@
         "node": ">=6"
       }
     },
+    "node_modules/package-manager-detector": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.2.tgz",
+      "integrity": "sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==",
+      "dev": true
+    },
     "node_modules/pako": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
@@ -5892,20 +5477,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/pascal-case": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
-      "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
-      "dependencies": {
-        "no-case": "^3.0.4",
-        "tslib": "^2.0.3"
-      }
-    },
-    "node_modules/path-browserify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
-      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
-    },
     "node_modules/path-exists": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -5957,30 +5528,10 @@
         "node": "*"
       }
     },
-    "node_modules/periscopic": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
-      "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
-      "peer": true,
-      "dependencies": {
-        "@types/estree": "^1.0.0",
-        "estree-walker": "^3.0.0",
-        "is-reference": "^3.0.0"
-      }
-    },
-    "node_modules/periscopic/node_modules/estree-walker": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
-      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
-      "peer": true,
-      "dependencies": {
-        "@types/estree": "^1.0.0"
-      }
-    },
     "node_modules/picocolors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
-      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
       "dev": true
     },
     "node_modules/picomatch": {
@@ -6004,18 +5555,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/possible-typed-array-names": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
@@ -6025,82 +5564,6 @@
         "node": ">= 0.4"
       }
     },
-    "node_modules/preferred-pm": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.4.tgz",
-      "integrity": "sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^5.0.0",
-        "find-yarn-workspace-root2": "1.2.16",
-        "path-exists": "^4.0.0",
-        "which-pm": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/preferred-pm/node_modules/find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/preferred-pm/node_modules/locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/preferred-pm/node_modules/p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "dependencies": {
-        "yocto-queue": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/preferred-pm/node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/prelude-ls": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -6271,15 +5734,15 @@
       "dev": true
     },
     "node_modules/regexp.prototype.flags": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
-      "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+      "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.6",
+        "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
         "es-errors": "^1.3.0",
-        "set-function-name": "^2.0.1"
+        "set-function-name": "^2.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6494,17 +5957,17 @@
       "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
     },
     "node_modules/secp256k1": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz",
-      "integrity": "sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.1.tgz",
+      "integrity": "sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==",
       "hasInstallScript": true,
       "dependencies": {
-        "elliptic": "^6.5.4",
+        "elliptic": "^6.5.7",
         "node-addon-api": "^5.0.0",
         "node-gyp-build": "^4.2.0"
       },
       "engines": {
-        "node": ">=14.0.0"
+        "node": ">=18.0.0"
       }
     },
     "node_modules/semver": {
@@ -6625,14 +6088,6 @@
         "url": "https://github.com/sponsors/cyyynthia"
       }
     },
-    "node_modules/source-map-js": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
-      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/spawndamnit": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz",
@@ -6806,15 +6261,15 @@
       }
     },
     "node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dev": true,
       "dependencies": {
-        "has-flag": "^3.0.0"
+        "has-flag": "^4.0.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
       }
     },
     "node_modules/supports-preserve-symlinks-flag": {
@@ -6829,53 +6284,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/svelte": {
-      "version": "4.2.19",
-      "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz",
-      "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==",
-      "peer": true,
-      "dependencies": {
-        "@ampproject/remapping": "^2.2.1",
-        "@jridgewell/sourcemap-codec": "^1.4.15",
-        "@jridgewell/trace-mapping": "^0.3.18",
-        "@types/estree": "^1.0.1",
-        "acorn": "^8.9.0",
-        "aria-query": "^5.3.0",
-        "axobject-query": "^4.0.0",
-        "code-red": "^1.0.3",
-        "css-tree": "^2.3.1",
-        "estree-walker": "^3.0.3",
-        "is-reference": "^3.0.1",
-        "locate-character": "^3.0.0",
-        "magic-string": "^0.30.4",
-        "periscopic": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/svelte/node_modules/estree-walker": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
-      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
-      "peer": true,
-      "dependencies": {
-        "@types/estree": "^1.0.0"
-      }
-    },
-    "node_modules/svelte2tsx": {
-      "version": "0.7.13",
-      "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.13.tgz",
-      "integrity": "sha512-aObZ93/kGAiLXA/I/kP+x9FriZM+GboB/ReOIGmLNbVGEd2xC+aTCppm3mk1cc9I/z60VQf7b2QDxC3jOXu3yw==",
-      "dependencies": {
-        "dedent-js": "^1.0.1",
-        "pascal-case": "^3.1.1"
-      },
-      "peerDependencies": {
-        "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0",
-        "typescript": "^4.9.4 || ^5.0.0"
-      }
-    },
     "node_modules/symbol-observable": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz",
@@ -6902,13 +6310,16 @@
       "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
     },
-    "node_modules/to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+    "node_modules/tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
       "dev": true,
+      "dependencies": {
+        "os-tmpdir": "~1.0.2"
+      },
       "engines": {
-        "node": ">=4"
+        "node": ">=0.6.0"
       }
     },
     "node_modules/to-regex-range": {
@@ -6959,11 +6370,6 @@
         "json5": "lib/cli.js"
       }
     },
-    "node_modules/tslib": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
-      "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
-    },
     "node_modules/tweetnacl": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
@@ -7076,9 +6482,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.5.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
-      "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
+      "version": "5.6.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+      "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -7103,9 +6509,9 @@
       }
     },
     "node_modules/undici-types": {
-      "version": "5.26.5",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
-      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+      "version": "6.19.8",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+      "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
     },
     "node_modules/universalify": {
       "version": "0.1.2",
@@ -7117,9 +6523,9 @@
       }
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
-      "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+      "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
       "dev": true,
       "funding": [
         {
@@ -7136,8 +6542,8 @@
         }
       ],
       "dependencies": {
-        "escalade": "^3.1.2",
-        "picocolors": "^1.0.1"
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.0"
       },
       "bin": {
         "update-browserslist-db": "cli.js"
@@ -7191,19 +6597,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/which-pm": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.2.0.tgz",
-      "integrity": "sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==",
-      "dev": true,
-      "dependencies": {
-        "load-yaml-file": "^0.2.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8.15"
-      }
-    },
     "node_modules/which-typed-array": {
       "version": "1.1.15",
       "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
@@ -7255,39 +6648,6 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "node_modules/wrap-ansi/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 527f5311..9d98ac6b 100644
--- a/package.json
+++ b/package.json
@@ -69,6 +69,7 @@
   "dependencies": {
     "@cosmjs/cosmwasm-stargate": "^0.32.2",
     "@mysten/sui": "^1.3.0",
+    "deepbookv3": "github:axelarnetwork/deepbookv3#mainnet-v1.35.2",
     "ethers": "^5.0.0",
     "secp256k1": "^5.0.0",
     "smol-toml": "^1.3.0",
diff --git a/src/common/bcs.ts b/src/common/bcs.ts
index 9fcb04a1..dda7fbe2 100644
--- a/src/common/bcs.ts
+++ b/src/common/bcs.ts
@@ -185,8 +185,14 @@ function getSquidStructs() {
     const { Channel, CoinBag } = getCommonStructs();
     const { VersionControl } = getVersionControlStructs();
 
-    const DeepbookV2SwapData = bcs.struct('DeepbookV2SwapData', {
-        swap_type: bcs.U8,
+    const SwapType = bcs.enum('SwapType', {
+        DeepbookV3: null,
+        SuiTransfer: null,
+        ItsTransfer: null,
+    });
+
+    const DeepbookV3SwapData = bcs.struct('DeepbookV3SwapData', {
+        swap_type: SwapType,
         pool_id: bcs.Address,
         has_base: bcs.Bool,
         min_output: bcs.U64,
@@ -197,18 +203,20 @@ function getSquidStructs() {
     });
 
     const SuiTransferSwapData = bcs.struct('SuiTransferSwapData', {
-        swap_type: bcs.U8,
+        swap_type: SwapType,
         coin_type: bcs.String,
         recipient: bcs.Address,
+        fallback: bcs.Bool,
     });
 
     const ItsTransferSwapData = bcs.struct('ItsTransferSwapData', {
-        swap_type: bcs.U8,
+        swap_type: SwapType,
         coin_type: bcs.String,
         token_id: bcs.Address,
         destination_chain: bcs.String,
         destination_address: bcs.vector(bcs.U8),
         metadata: bcs.vector(bcs.U8),
+        fallback: bcs.Bool,
     });
 
     const SquidV0 = bcs.struct('Squid_v0', {
@@ -224,7 +232,8 @@ function getSquidStructs() {
     });
 
     return {
-        DeepbookV2SwapData,
+        SwapType,
+        DeepbookV3SwapData,
         SuiTransferSwapData,
         ItsTransferSwapData,
         Squid,
diff --git a/src/common/tx-builder-base.ts b/src/common/tx-builder-base.ts
index 04cc9896..95d6c757 100644
--- a/src/common/tx-builder-base.ts
+++ b/src/common/tx-builder-base.ts
@@ -80,7 +80,7 @@ function getNestedStruct(tx: Transaction, type: SuiMoveNormalizedType, arg: Tran
         inside = inside.Vector;
     }
 
-    if (!inside.Struct && !inside.Reference && !inside.MutableReference) {
+    if (!inside.Struct && !inside.Reference && !inside.MutableReference && inside.TypeParameter === undefined) {
         return null;
     }
 
@@ -88,8 +88,7 @@ function getNestedStruct(tx: Transaction, type: SuiMoveNormalizedType, arg: Tran
         return null;
     }
 
-    // eslint-disable-next-line @typescript-eslint/no-explicit-any
-    if ((type as any).Struct || (type as any).Reference || (type as any).MutableReference) {
+    if (inside.Struct || inside.Reference || inside.MutableReference || inside.TypeParameter !== undefined) {
         return getObject(tx, arg);
     }
 
diff --git a/src/node/node-utils.ts b/src/node/node-utils.ts
index b3099755..50cc2be4 100644
--- a/src/node/node-utils.ts
+++ b/src/node/node-utils.ts
@@ -2,7 +2,7 @@ import { execSync } from 'child_process';
 import fs from 'fs';
 import path from 'path';
 import { Bytes } from 'ethers';
-import toml from 'smol-toml';
+import toml, { TomlPrimitive } from 'smol-toml';
 import { Dependency, DependencyNode, InterchainTokenOptions } from '../common/types';
 
 /**
@@ -71,7 +71,12 @@ export function removeFile(filePath: string) {
     fs.rmSync(filePath);
 }
 
-export function updateMoveToml(packageName: string, packageId: string, moveDir: string = `${__dirname}/../../move`) {
+export function updateMoveToml(
+    packageName: string,
+    packageId: string,
+    moveDir: string = `${__dirname}/../../move`,
+    prepToml: undefined | ((moveJson: Record<string, TomlPrimitive>) => Record<string, TomlPrimitive>) = undefined,
+) {
     // Path to the Move.toml file for the package
     const movePath = `${moveDir}/${packageName}/Move.toml`;
 
@@ -85,13 +90,17 @@ export function updateMoveToml(packageName: string, packageId: string, moveDir:
 
     // Parse the Move.toml file as JSON
     // eslint-disable-next-line @typescript-eslint/no-explicit-any
-    const moveJson = toml.parse(moveRaw) as any;
+    let moveJson = toml.parse(moveRaw);
 
     // Update the published-at field under the package section e.g. published-at = "0x01"
-    moveJson.package['published-at'] = packageId;
+    (moveJson as Record<string, Record<string, string>>).package['published-at'] = packageId;
 
     // Update the package address under the addresses section e.g. gas_service = "0x1"
-    moveJson.addresses[packageName] = packageId;
+    (moveJson as Record<string, Record<string, string>>).addresses[packageName] = packageId;
+
+    if (prepToml) {
+        moveJson = prepToml(moveJson);
+    }
 
     fs.writeFileSync(movePath, toml.stringify(moveJson));
 }
diff --git a/test/its.js b/test/its.js
index 96e7bb1a..02d0c57b 100644
--- a/test/its.js
+++ b/test/its.js
@@ -16,8 +16,8 @@ const {
     getRandomBytes32,
     calculateNextSigners,
     getSingletonChannelId,
-    getITSChannelId,
     setupTrustedAddresses,
+    getVersionedChannelId,
 } = require('./testutils');
 const { expect } = require('chai');
 const {
@@ -114,10 +114,11 @@ describe('ITS', () => {
             deployments[packageDir] = publishedReceipt;
         }
 
+        const coinType = `${deployments.example.packageId}::token::TOKEN`;
         objectIds = {
             singleton: findObjectId(deployments.example.publishTxn, 'its::Singleton'),
-            tokenTreasuryCap: findObjectId(deployments.example.publishTxn, 'TreasuryCap'),
-            tokenCoinMetadata: findObjectId(deployments.example.publishTxn, 'CoinMetadata'),
+            tokenTreasuryCap: findObjectId(deployments.example.publishTxn, `TreasuryCap<${coinType}>`),
+            tokenCoinMetadata: findObjectId(deployments.example.publishTxn, `CoinMetadata<${coinType}>`),
             its: findObjectId(deployments.its.publishTxn, 'its::ITS'),
             itsV0: findObjectId(deployments.its.publishTxn, 'its_v0::ITS_v0'),
             relayerDiscovery: findObjectId(
@@ -128,7 +129,6 @@ describe('ITS', () => {
             creatorCap: findObjectId(deployments.axelar_gateway.publishTxn, 'CreatorCap'),
             itsOwnerCap: findObjectId(deployments.its.publishTxn, `${deployments.its.packageId}::owner_cap::OwnerCap`),
         };
-
         // Mint some coins for tests
         const tokenTxBuilder = new TxBuilder(client);
 
@@ -142,7 +142,7 @@ describe('ITS', () => {
         // Find the object ids from the publish transactions
         objectIds = {
             ...objectIds,
-            itsChannel: await getITSChannelId(client, objectIds.itsV0),
+            itsChannel: await getVersionedChannelId(client, objectIds.itsV0),
             token: findObjectId(mintReceipt, 'token::TOKEN'),
         };
     });
@@ -255,7 +255,6 @@ describe('ITS', () => {
                     payload,
                     payload_hash: keccak256(payload),
                 };
-
                 await approveAndExecute(client, keypair, gatewayInfo, discoveryInfo, message);
             });
         });
diff --git a/test/squid.js b/test/squid.js
new file mode 100644
index 00000000..95343466
--- /dev/null
+++ b/test/squid.js
@@ -0,0 +1,499 @@
+/*
+This is a short spec for what there is to be done. You can check https://github.com/axelarnetwork/interchain-token-service/blob/main/test/InterchainTokenService.js for some details.
+[x] Test deployment of interchian token service.
+[x] Test `register_transaction` (this tells relayers how to execute contract calls).
+[x] Test owner functions (mint/burn).
+[x] Test public functions (`register_token` etc.).
+[x] Write an ITS example.
+[x] Use the ITS example for end to end tests.
+*/
+const { SuiClient, getFullnodeUrl } = require('@mysten/sui/client');
+const { bcs } = require('@mysten/sui/bcs');
+const {
+    publishPackage,
+    generateEd25519Keypairs,
+    findObjectId,
+    getRandomBytes32,
+    calculateNextSigners,
+    getVersionedChannelId,
+    setupTrustedAddresses,
+    approveAndExecuteMessage,
+    publishExternalPackage,
+} = require('./testutils');
+const { CLOCK_PACKAGE_ID, getDeploymentOrder, fundAccountsFromFaucet, bcsStructs, ITSMessageType, TxBuilder } = require('../dist/cjs');
+const { keccak256, defaultAbiCoder, hexlify, randomBytes } = require('ethers/lib/utils');
+const chai = require('chai');
+const { expect } = chai;
+
+const SUI = '0x2';
+
+describe('Squid', () => {
+    // Sui Client
+    let client;
+    const network = process.env.NETWORK || 'localnet';
+
+    // Store the deployed packages info
+    const deployments = {};
+
+    // Store the object ids from move transactions
+    let objectIds = {};
+
+    // A list of contracts to publish
+    const dependencies = getDeploymentOrder('squid', `${__dirname}/../move`);
+    // should be ['version_control', 'utils', 'axelar_gateway', 'gas_service', 'abi', 'governance', 'relayer_discovery', 'its', 'example']
+
+    // Parameters for Gateway Setup
+    const gatewayInfo = {};
+    const domainSeparator = getRandomBytes32();
+    const [operator, deployer, keypair] = generateEd25519Keypairs(3);
+    const minimumRotationDelay = 1000;
+    const previousSignersRetention = 15;
+    const nonce = 0;
+
+    // Parameters for Trusted Addresses
+    const trustedSourceChain = 'Avalanche';
+    const trustedSourceAddress = hexlify(randomBytes(20));
+    const coins = {};
+    const pools = {};
+
+    // Initializes the gateway object.
+    async function setupGateway() {
+        calculateNextSigners(gatewayInfo, nonce);
+        const encodedSigners = bcsStructs.gateway.WeightedSigners.serialize(gatewayInfo.signers).toBytes();
+
+        const gatewaySetupTxBuilder = new TxBuilder(client);
+
+        await gatewaySetupTxBuilder.moveCall({
+            target: `${deployments.axelar_gateway.packageId}::gateway::setup`,
+            arguments: [
+                objectIds.creatorCap,
+                operator.toSuiAddress(),
+                domainSeparator,
+                minimumRotationDelay,
+                previousSignersRetention,
+                encodedSigners,
+                CLOCK_PACKAGE_ID,
+            ],
+        });
+
+        const gatewaySetupReceipt = await gatewaySetupTxBuilder.signAndExecute(deployer);
+
+        objectIds.gateway = findObjectId(gatewaySetupReceipt, 'gateway::Gateway');
+
+        gatewayInfo.gateway = objectIds.gateway;
+        gatewayInfo.domainSeparator = domainSeparator;
+        gatewayInfo.packageId = deployments.axelar_gateway.packageId;
+        gatewayInfo.discoveryPackageId;
+        gatewayInfo.discoveryPackageId = deployments.relayer_discovery.packageId;
+        gatewayInfo.discovery = objectIds.relayerDiscovery;
+    }
+
+    // Registers the ITS in relayer discovery
+    async function registerItsTransaction() {
+        const registerTransactionBuilder = new TxBuilder(client);
+
+        await registerTransactionBuilder.moveCall({
+            target: `${deployments.its.packageId}::discovery::register_transaction`,
+            arguments: [objectIds.its, objectIds.relayerDiscovery],
+        });
+
+        await registerTransactionBuilder.signAndExecute(deployer);
+    }
+
+    // Registers Squid in relyaer discovery
+    async function registerSquidTransaction() {
+        const registerTransactionBuilder = new TxBuilder(client);
+
+        await registerTransactionBuilder.moveCall({
+            target: `${deployments.squid.packageId}::discovery::register_transaction`,
+            arguments: [objectIds.squid, objectIds.its, objectIds.gateway, objectIds.relayerDiscovery],
+        });
+
+        await registerTransactionBuilder.signAndExecute(deployer);
+    }
+
+    // Deploys the deepbook package (and the DEEP token).
+    async function deployDeepbook() {
+        deployments.token = await publishExternalPackage(client, deployer, 'token', `${__dirname}/../node_modules/deepbookv3/packages`);
+        deployments.deepbook = await publishExternalPackage(
+            client,
+            deployer,
+            'deepbook',
+            `${__dirname}/../node_modules/deepbookv3/packages`,
+        );
+    }
+
+    // Funds sui with some DEEP
+    async function giveDeepToSquid() {
+        const giveDeepBuilder = new TxBuilder(client);
+
+        await giveDeepBuilder.moveCall({
+            target: `${deployments.squid.packageId}::squid::give_deep`,
+            arguments: [objectIds.squid, objectIds.deepCoin],
+        });
+
+        await giveDeepBuilder.signAndExecute(deployer);
+    }
+
+    // Creates a balance manager (used to fund deepbook pools)
+    async function createBalanceManager(keypair = deployer) {
+        const builder = new TxBuilder(client);
+
+        const balanceManager = await builder.moveCall({
+            target: `${deployments.deepbook.packageId}::balance_manager::new`,
+            arguments: [],
+            typeArguments: [],
+        });
+
+        builder.tx.transferObjects([balanceManager], keypair.toSuiAddress());
+        const executeTxn = await builder.signAndExecute(deployer);
+        return findObjectId(executeTxn, `BalanceManager`);
+    }
+
+    // Creates a deepbook pool
+    async function createPool(coin1, coin2, tickSize = 100, lotSize = 100, minSize = 100, whitelistedPool = true, stablePool = false) {
+        const builder = new TxBuilder(client);
+
+        await builder.moveCall({
+            target: `${deployments.deepbook.packageId}::pool::create_pool_admin`,
+            arguments: [objectIds.deepbookRegistry, tickSize, lotSize, minSize, whitelistedPool, stablePool, objectIds.deepbookAdminCap],
+            typeArguments: [coins[coin1].type, coins[coin2].type],
+        });
+        const executeTxn = await builder.signAndExecute(deployer);
+
+        return findObjectId(executeTxn, `pool::Pool`, 'created', 'PoolInner');
+    }
+
+    // Funds a deepbook pool
+    async function fundPool(coin1, coin2, amount, price = 1000000000) {
+        const builder = new TxBuilder(client);
+        const tradeProof = await builder.moveCall({
+            target: `${deployments.deepbook.packageId}::balance_manager::generate_proof_as_owner`,
+            arguments: [objectIds.balanceManager],
+            typeArguments: [],
+        });
+        const input = await builder.moveCall({
+            target: `${SUI}::coin::mint`,
+            arguments: [coins[coin2].treasuryCap, amount],
+            typeArguments: [coins[coin2].type],
+        });
+        await builder.moveCall({
+            target: `${deployments.deepbook.packageId}::balance_manager::deposit`,
+            arguments: [objectIds.balanceManager, input],
+            typeArguments: [coins[coin2].type],
+        });
+        await builder.moveCall({
+            target: `${deployments.deepbook.packageId}::pool::place_limit_order`,
+            arguments: [
+                pools[coin1 + coin2],
+                objectIds.balanceManager,
+                tradeProof,
+                0,
+                0,
+                0,
+                price,
+                amount,
+                true,
+                true,
+                1000000000000000,
+                CLOCK_PACKAGE_ID,
+            ],
+            typeArguments: [coins[coin1].type, coins[coin2].type],
+        });
+
+        await builder.signAndExecute(deployer);
+    }
+
+    // Funds an ITS lock/unlock token by sending a call.
+    async function fundIts(amount, coinName = 'a') {
+        const builder = new TxBuilder(client);
+
+        const input = await builder.moveCall({
+            target: `${SUI}::coin::mint`,
+            arguments: [coins[coinName].treasuryCap, amount],
+            typeArguments: [coins[coinName].type],
+        });
+
+        const channel = await builder.moveCall({
+            target: `${deployments.axelar_gateway.packageId}::channel::new`,
+            arguments: [],
+            typeArguments: [],
+        });
+
+        const tokenId = await builder.moveCall({
+            target: `${deployments.its.packageId}::token_id::from_address`,
+            arguments: [objectIds.tokenId],
+            typeArguments: [],
+        });
+
+        const interchainTransfer = await builder.moveCall({
+            target: `${deployments.its.packageId}::its::prepare_interchain_transfer`,
+            arguments: [tokenId, input, trustedSourceChain, '0xadd1', '0x', channel],
+            typeArguments: [coins[coinName].type],
+        });
+
+        const messageTicket = await builder.moveCall({
+            target: `${deployments.its.packageId}::its::send_interchain_transfer`,
+            arguments: [objectIds.its, interchainTransfer, CLOCK_PACKAGE_ID],
+            typeArguments: [coins[coinName].type],
+        });
+
+        await builder.moveCall({
+            target: `${deployments.axelar_gateway.packageId}::gateway::send_message`,
+            arguments: [objectIds.gateway, messageTicket],
+            typeArguments: [],
+        });
+
+        await builder.moveCall({
+            target: `${deployments.axelar_gateway.packageId}::channel::destroy`,
+            arguments: [channel],
+            typeArguments: [],
+        });
+        await builder.signAndExecute(deployer);
+    }
+
+    // Registers a coin with ITS
+    async function registerCoin(coin) {
+        const builder = new TxBuilder(client);
+
+        const coinInfo = await builder.moveCall({
+            target: `${deployments.its.packageId}::coin_info::from_metadata`,
+            arguments: [coins[coin].coinMetadata, 9],
+            typeArguments: [coins[coin].type],
+        });
+        const coinManagment = await builder.moveCall({
+            target: `${deployments.its.packageId}::coin_management::new_locked`,
+            arguments: [],
+            typeArguments: [coins[coin].type],
+        });
+        await builder.moveCall({
+            target: `${deployments.its.packageId}::its::register_coin`,
+            arguments: [objectIds.its, coinInfo, coinManagment],
+            typeArguments: [coins[coin].type],
+        });
+
+        const registerTxn = await builder.signAndExecute(deployer, { showEvents: true });
+
+        objectIds.tokenId = registerTxn.events[0].parsedJson.token_id.id;
+    }
+
+    // Get the swap data for the Squid transaction. We have these be consistent but test different scenarios.
+    function getSwapData() {
+        const swap1 = bcsStructs.squid.DeepbookV3SwapData.serialize({
+            swap_type: { DeepbookV3: null },
+            pool_id: pools.ab,
+            has_base: true,
+            min_output: 1,
+            base_type: coins.a.type.slice(2),
+            quote_type: coins.b.type.slice(2),
+            lot_size: 100,
+            should_sweep: true,
+        }).toBytes();
+
+        const swap2 = bcsStructs.squid.DeepbookV3SwapData.serialize({
+            swap_type: { DeepbookV3: null },
+            pool_id: pools.bc,
+            has_base: true,
+            min_output: 1,
+            base_type: coins.b.type.slice(2),
+            quote_type: coins.c.type.slice(2),
+            lot_size: 100,
+            should_sweep: true,
+        }).toBytes();
+
+        const transfer = bcsStructs.squid.SuiTransferSwapData.serialize({
+            swap_type: { SuiTransfer: null },
+            coin_type: coins.c.type.slice(2),
+            recipient: keypair.toSuiAddress(),
+            fallback: false,
+        }).toBytes();
+
+        const fallback = bcsStructs.squid.SuiTransferSwapData.serialize({
+            swap_type: { SuiTransfer: null },
+            coin_type: coins.a.type.slice(2),
+            recipient: keypair.toSuiAddress(),
+            fallback: true,
+        }).toBytes();
+
+        const swapData = bcs.vector(bcs.vector(bcs.U8)).serialize([swap1, swap2, transfer, fallback]).toBytes();
+        return swapData;
+    }
+
+    // Query all the coins that `keypair` has, and then give them away so that future queries are informative still.
+    async function getAndLoseCoins() {
+        // wait a bit since coins sometimes take a bit to load.
+        await new Promise((resolve) => setTimeout(resolve, 1000));
+        const ownedCoins = await client.getAllCoins({
+            owner: keypair.toSuiAddress(),
+        });
+        const balances = {};
+        const builder = new TxBuilder(client);
+
+        for (const coinName of ['a', 'b', 'c']) {
+            const coin = ownedCoins.data.find((coin) => coin.coinType === coins[coinName].type);
+
+            if (!coin) {
+                balances[coinName] = 0;
+                continue;
+            }
+
+            balances[coinName] = Number(coin.balance);
+
+            builder.tx.transferObjects([coin.coinObjectId], deployer.toSuiAddress());
+        }
+
+        await builder.signAndExecute(keypair);
+        return balances;
+    }
+
+    before(async () => {
+        client = new SuiClient({ url: getFullnodeUrl(network) });
+
+        // Request funds from faucet
+        const addresses = [operator, deployer, keypair].map((keypair) => keypair.toSuiAddress());
+        await fundAccountsFromFaucet(addresses);
+
+        await deployDeepbook();
+
+        objectIds = {
+            balanceManager: await createBalanceManager(),
+            deepCoin: findObjectId(deployments.token.publishTxn, 'Coin'),
+            deepbookAdminCap: findObjectId(deployments.deepbook.publishTxn, 'DeepbookAdminCap'),
+            deepbookRegistry: findObjectId(deployments.deepbook.publishTxn, 'Registry', 'created', 'RegistryInner'),
+        };
+
+        dependencies.push('gas_service', 'example');
+
+        // Publish all packages
+        for (const packageDir of dependencies) {
+            let publishedReceipt;
+
+            if (packageDir === 'squid') {
+                publishedReceipt = await publishPackage(client, deployer, packageDir, { showEvents: true }, (moveJson) => {
+                    moveJson.dependencies.deepbook = { local: '../deepbook' };
+                    moveJson.dependencies.token = { local: '../token' };
+                    return moveJson;
+                });
+            } else {
+                publishedReceipt = await publishPackage(client, deployer, packageDir, { showEvents: true });
+            }
+
+            deployments[packageDir] = publishedReceipt;
+        }
+
+        objectIds = {
+            ...objectIds,
+            squid: findObjectId(deployments.squid.publishTxn, 'squid::Squid'),
+            squidV0: findObjectId(deployments.squid.publishTxn, 'squid_v0::Squid_v0'),
+            its: findObjectId(deployments.its.publishTxn, 'its::ITS'),
+            itsV0: findObjectId(deployments.its.publishTxn, 'its_v0::ITS_v0'),
+            relayerDiscovery: findObjectId(
+                deployments.relayer_discovery.publishTxn,
+                `${deployments.relayer_discovery.packageId}::discovery::RelayerDiscovery`,
+            ),
+            gasService: findObjectId(deployments.gas_service.publishTxn, `${deployments.gas_service.packageId}::gas_service::GasService`),
+            creatorCap: findObjectId(deployments.axelar_gateway.publishTxn, 'CreatorCap'),
+            itsOwnerCap: findObjectId(deployments.its.publishTxn, `${deployments.its.packageId}::owner_cap::OwnerCap`),
+            gateway: findObjectId(deployments.its.publishTxn, `${deployments.axelar_gateway.packageId}::gateway::Gateway`),
+        };
+        // Find the object ids from the publish transactions
+        objectIds = {
+            ...objectIds,
+            itsChannel: await getVersionedChannelId(client, objectIds.itsV0),
+            squidChannel: await getVersionedChannelId(client, objectIds.squidV0),
+        };
+
+        for (const token of ['a', 'b', 'c']) {
+            const name = `token_${token}`;
+            const type = `${deployments.example.packageId}::${name}::${name.toUpperCase()}`;
+            coins[token] = {
+                treasuryCap: findObjectId(deployments.example.publishTxn, `TreasuryCap<${type}>`),
+                coinMetadata: findObjectId(deployments.example.publishTxn, `CoinMetadata<${type}>`),
+                type,
+            };
+        }
+
+        pools.ab = await createPool('a', 'b');
+        pools.bc = await createPool('b', 'c');
+        await setupGateway();
+        await registerItsTransaction();
+        await registerSquidTransaction();
+        await setupTrustedAddresses(client, deployer, objectIds, deployments, [trustedSourceAddress], [trustedSourceChain]);
+        await registerCoin('a');
+        await giveDeepToSquid();
+    });
+
+    it('should succesfully perform a swap', async () => {
+        const swapData = getSwapData();
+        const amount = 1e6;
+
+        await fundIts(amount);
+        await fundPool('a', 'b', amount);
+        await fundPool('b', 'c', amount);
+
+        const messageType = ITSMessageType.InterchainTokenTransfer;
+        const tokenId = objectIds.tokenId;
+        const sourceAddress = trustedSourceAddress;
+        const destinationAddress = objectIds.itsChannel; // The ITS Channel ID. All ITS messages are sent to this channel
+        const data = swapData;
+        // Channel ID for Squid. This will be encoded in the payload
+        const squidChannelId = objectIds.squidChannel;
+        // ITS transfer payload from Ethereum to Sui
+        const payload = defaultAbiCoder.encode(
+            ['uint256', 'uint256', 'bytes', 'bytes', 'uint256', 'bytes'],
+            [messageType, tokenId, sourceAddress, squidChannelId, amount, data],
+        );
+
+        const message = {
+            source_chain: trustedSourceChain,
+            message_id: hexlify(randomBytes(32)),
+            source_address: trustedSourceAddress,
+            destination_id: destinationAddress,
+            payload,
+            payload_hash: keccak256(payload),
+        };
+
+        await approveAndExecuteMessage(client, keypair, gatewayInfo, message);
+
+        const balances = await getAndLoseCoins();
+        expect(balances.a).to.equal(0);
+        expect(balances.b).to.equal(0);
+        expect(balances.c).to.equal(amount);
+    });
+
+    it('should succesfully fallback whn pools are not funded properly', async () => {
+        const swapData = getSwapData();
+        const amount = 1e6;
+
+        await fundIts(amount);
+
+        const messageType = ITSMessageType.InterchainTokenTransfer;
+        const tokenId = objectIds.tokenId;
+        const sourceAddress = trustedSourceAddress;
+        const destinationAddress = objectIds.itsChannel; // The ITS Channel ID. All ITS messages are sent to this channel
+        const data = swapData;
+        // Channel ID for Squid. This will be encoded in the payload
+        const squidChannelId = objectIds.squidChannel;
+        // ITS transfer payload from Ethereum to Sui
+        const payload = defaultAbiCoder.encode(
+            ['uint256', 'uint256', 'bytes', 'bytes', 'uint256', 'bytes'],
+            [messageType, tokenId, sourceAddress, squidChannelId, amount, data],
+        );
+
+        const message = {
+            source_chain: trustedSourceChain,
+            message_id: hexlify(randomBytes(32)),
+            source_address: trustedSourceAddress,
+            destination_id: destinationAddress,
+            payload,
+            payload_hash: keccak256(payload),
+        };
+
+        await approveAndExecuteMessage(client, keypair, gatewayInfo, message);
+
+        const balances = await getAndLoseCoins();
+        expect(balances.a).to.equal(amount);
+        expect(balances.b).to.equal(0);
+        expect(balances.c).to.equal(0);
+    });
+});
diff --git a/test/testdata/interface_example_token_a.json b/test/testdata/interface_example_token_a.json
new file mode 100644
index 00000000..2c78b991
--- /dev/null
+++ b/test/testdata/interface_example_token_a.json
@@ -0,0 +1,17 @@
+{
+  "structs": {
+    "TOKEN_A": {
+      "name": "TOKEN_A",
+      "abilities": [
+        "drop"
+      ],
+      "fields": [
+        {
+          "name": "dummy_field",
+          "type": "bool"
+        }
+      ]
+    }
+  },
+  "publicFunctions": {}
+}
diff --git a/test/testdata/interface_example_token_b.json b/test/testdata/interface_example_token_b.json
new file mode 100644
index 00000000..985766ab
--- /dev/null
+++ b/test/testdata/interface_example_token_b.json
@@ -0,0 +1,17 @@
+{
+  "structs": {
+    "TOKEN_B": {
+      "name": "TOKEN_B",
+      "abilities": [
+        "drop"
+      ],
+      "fields": [
+        {
+          "name": "dummy_field",
+          "type": "bool"
+        }
+      ]
+    }
+  },
+  "publicFunctions": {}
+}
diff --git a/test/testdata/interface_example_token_c.json b/test/testdata/interface_example_token_c.json
new file mode 100644
index 00000000..99a3e9d3
--- /dev/null
+++ b/test/testdata/interface_example_token_c.json
@@ -0,0 +1,17 @@
+{
+  "structs": {
+    "TOKEN_C": {
+      "name": "TOKEN_C",
+      "abilities": [
+        "drop"
+      ],
+      "fields": [
+        {
+          "name": "dummy_field",
+          "type": "bool"
+        }
+      ]
+    }
+  },
+  "publicFunctions": {}
+}
diff --git a/test/testutils.js b/test/testutils.js
index 31d62023..852e3b69 100644
--- a/test/testutils.js
+++ b/test/testutils.js
@@ -22,12 +22,17 @@ const path = require('path');
 
 const COMMAND_TYPE_APPROVE_MESSAGES = 0;
 
-async function publishPackage(client, keypair, packageName) {
+async function publishPackage(client, keypair, packageName, options, prepToml) {
     const compileDir = `${__dirname}/../move_compile`;
     copyMovePackage(packageName, null, compileDir);
+
+    if (prepToml) {
+        updateMoveToml(packageName, '0x0', compileDir, prepToml);
+    }
+
     const builder = new TxBuilder(client);
     await builder.publishPackageAndTransferCap(packageName, keypair.toSuiAddress(), compileDir);
-    const publishTxn = await builder.signAndExecute(keypair);
+    const publishTxn = await builder.signAndExecute(keypair, options);
 
     const packageId = (publishTxn.objectChanges?.find((a) => a.type === 'published') ?? []).packageId;
 
@@ -35,6 +40,18 @@ async function publishPackage(client, keypair, packageName) {
     return { packageId, publishTxn };
 }
 
+async function publishExternalPackage(client, keypair, packageName, packageDir, options) {
+    const compileDir = `${__dirname}/../move_compile`;
+    copyMovePackage(packageName, packageDir, compileDir);
+    const builder = new TxBuilder(client);
+    await builder.publishPackageAndTransferCap(packageName, keypair.toSuiAddress(), compileDir);
+    const publishTxn = await builder.signAndExecute(keypair, options);
+
+    const packageId = (publishTxn.objectChanges?.find((a) => a.type === 'published') ?? []).packageId;
+    updateMoveToml(packageName, packageId, compileDir);
+    return { packageId, publishTxn };
+}
+
 async function publishInterchainToken(client, keypair, options) {
     const templateFilePath = `${__dirname}/../move/interchain_token/sources/interchain_token.move`;
 
@@ -292,7 +309,6 @@ async function approveAndExecuteMessage(client, keypair, gatewayInfo, messageInf
         const builder = new TxBuilder(client);
         makeCalls(builder.tx, moveCalls, messageInfo.payload);
         const resp = await builder.devInspect(keypair.toSuiAddress());
-
         const txData = resp.results[0].returnValues[0][0];
         const nextTx = Transaction.parse(new Uint8Array(txData));
         isFinal = nextTx.is_final;
@@ -351,8 +367,10 @@ function buildMoveCall(tx, moveCallInfo, payload, callContractObj, previousRetur
     };
 }
 
-function findObjectId(tx, objectType, type = 'created') {
-    return tx.objectChanges.find((change) => change.type === type && change.objectType.includes(objectType))?.objectId;
+function findObjectId(tx, objectType, type = 'created', excludes) {
+    return tx.objectChanges.find(
+        (change) => change.type === type && change.objectType.includes(objectType) && !(excludes && change.objectType.includes(excludes)),
+    )?.objectId;
 }
 
 const getBcsBytesByObjectId = async (client, objectId) => {
@@ -391,14 +409,13 @@ async function setupTrustedAddresses(client, keypair, objectIds, deployments, tr
     return trustedAddressResult;
 }
 
-async function getITSChannelId(client, itsVersionedObjectId) {
+async function getVersionedChannelId(client, versionedObjectId) {
     const response = await client.getObject({
-        id: itsVersionedObjectId,
+        id: versionedObjectId,
         options: {
             showContent: true,
         },
     });
-
     const channelId = response.data.content.fields.value.fields.channel.fields.id.id;
 
     return channelId;
@@ -406,6 +423,7 @@ async function getITSChannelId(client, itsVersionedObjectId) {
 
 module.exports = {
     publishPackage,
+    publishExternalPackage,
     findObjectId,
     getRandomBytes32,
     expectRevert,
@@ -420,6 +438,6 @@ module.exports = {
     getSingletonChannelId,
     setupTrustedAddresses,
     publishInterchainToken,
-    getITSChannelId,
+    getVersionedChannelId,
     goldenTest,
 };