@mysten/deepbook-v3 1.0.9 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @mysten/deepbook-v3
2
2
 
3
+ ## 1.0.10
4
+
5
+ ### Patch Changes
6
+
7
+ - 05765dc: checkManagerBalancesWithAddress and getMarginManagerBalances added to support querying
8
+ balnces in a single RPC call for multiple managers and assets
9
+
3
10
  ## 1.0.9
4
11
 
5
12
  ### Patch Changes
package/dist/client.d.mts CHANGED
@@ -94,6 +94,13 @@ declare class DeepBookClient {
94
94
  coinType: string;
95
95
  balance: number;
96
96
  }>;
97
+ /**
98
+ * @description Check multiple coin balances for multiple balance managers by address in a single dry run call
99
+ * @param {string[]} managerAddresses The on-chain addresses of the BalanceManagers
100
+ * @param {string[]} coinKeys Keys of the coins to check balances for
101
+ * @returns {Promise<Record<string, Record<string, number>>>} Object keyed by manager address, mapping coinType to balance
102
+ */
103
+ checkManagerBalancesWithAddress(managerAddresses: string[], coinKeys: string[]): Promise<Record<string, Record<string, number>>>;
97
104
  /**
98
105
  * @description Check if a pool is whitelisted
99
106
  * @param {string} poolKey Key of the pool
@@ -659,6 +666,17 @@ declare class DeepBookClient {
659
666
  * @returns {Promise<string>} The DEEP token balance
660
667
  */
661
668
  getMarginManagerDeepBalance(marginManagerKey: string, decimals?: number): Promise<string>;
669
+ /**
670
+ * @description Get base, quote, and DEEP balances for multiple margin managers in a single dry run call
671
+ * @param {Record<string, string>} marginManagers Map of marginManagerId -> poolKey
672
+ * @param {number} decimals Number of decimal places for formatting (default: 9)
673
+ * @returns {Promise<Record<string, { base: string, quote: string, deep: string }>>} Object keyed by managerId
674
+ */
675
+ getMarginManagerBalances(marginManagers: Record<string, string>, decimals?: number): Promise<Record<string, {
676
+ base: string;
677
+ quote: string;
678
+ deep: string;
679
+ }>>;
662
680
  /**
663
681
  * @description Get account order details for a margin manager.
664
682
  * This retrieves the balance manager from the margin manager and returns order details.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/client.mjs CHANGED
@@ -127,6 +127,46 @@ var DeepBookClient = class {
127
127
  };
128
128
  }
129
129
  /**
130
+ * @description Check multiple coin balances for multiple balance managers by address in a single dry run call
131
+ * @param {string[]} managerAddresses The on-chain addresses of the BalanceManagers
132
+ * @param {string[]} coinKeys Keys of the coins to check balances for
133
+ * @returns {Promise<Record<string, Record<string, number>>>} Object keyed by manager address, mapping coinType to balance
134
+ */
135
+ async checkManagerBalancesWithAddress(managerAddresses, coinKeys) {
136
+ if (managerAddresses.length === 0 || coinKeys.length === 0) return {};
137
+ const tx = new Transaction();
138
+ const coins = coinKeys.map((coinKey) => this.#config.getCoin(coinKey));
139
+ for (const managerAddress of managerAddresses) for (const coin of coins) tx.moveCall({
140
+ target: `${this.#config.DEEPBOOK_PACKAGE_ID}::balance_manager::balance`,
141
+ arguments: [tx.object(managerAddress)],
142
+ typeArguments: [coin.type]
143
+ });
144
+ const res = await this.#client.core.simulateTransaction({
145
+ transaction: tx,
146
+ include: {
147
+ commandResults: true,
148
+ effects: true
149
+ }
150
+ });
151
+ if (res.FailedTransaction) throw new Error(`Transaction failed: ${res.FailedTransaction.status.error?.message || "Unknown error"}`);
152
+ if (!res.commandResults) throw new Error("Failed to get manager balances: No command results");
153
+ const results = {};
154
+ for (let m = 0; m < managerAddresses.length; m++) {
155
+ const managerAddress = managerAddresses[m];
156
+ const managerBalances = {};
157
+ for (let c = 0; c < coins.length; c++) {
158
+ const coin = coins[c];
159
+ const commandResult = res.commandResults[m * coins.length + c];
160
+ if (!commandResult || !commandResult.returnValues) throw new Error(`Failed to get balance for ${coin.type}: No return values`);
161
+ const bytes = commandResult.returnValues[0].bcs;
162
+ const parsed_balance = bcs.U64.parse(bytes);
163
+ managerBalances[coin.type] = Number((Number(parsed_balance) / coin.scalar).toFixed(9));
164
+ }
165
+ results[managerAddress] = managerBalances;
166
+ }
167
+ return results;
168
+ }
169
+ /**
130
170
  * @description Check if a pool is whitelisted
131
171
  * @param {string} poolKey Key of the pool
132
172
  * @returns {Promise<boolean>} Boolean indicating if the pool is whitelisted
@@ -1517,6 +1557,49 @@ var DeepBookClient = class {
1517
1557
  return this.#formatTokenAmount(BigInt(bcs.U64.parse(bytes)), deepCoin.scalar, decimals);
1518
1558
  }
1519
1559
  /**
1560
+ * @description Get base, quote, and DEEP balances for multiple margin managers in a single dry run call
1561
+ * @param {Record<string, string>} marginManagers Map of marginManagerId -> poolKey
1562
+ * @param {number} decimals Number of decimal places for formatting (default: 9)
1563
+ * @returns {Promise<Record<string, { base: string, quote: string, deep: string }>>} Object keyed by managerId
1564
+ */
1565
+ async getMarginManagerBalances(marginManagers, decimals = 9) {
1566
+ const entries = Object.entries(marginManagers);
1567
+ if (entries.length === 0) return {};
1568
+ const tx = new Transaction();
1569
+ for (const [managerId, poolKey] of entries) {
1570
+ tx.add(this.marginManager.baseBalance(poolKey, managerId));
1571
+ tx.add(this.marginManager.quoteBalance(poolKey, managerId));
1572
+ tx.add(this.marginManager.deepBalance(poolKey, managerId));
1573
+ }
1574
+ const res = await this.#client.core.simulateTransaction({
1575
+ transaction: tx,
1576
+ include: {
1577
+ commandResults: true,
1578
+ effects: true
1579
+ }
1580
+ });
1581
+ if (res.FailedTransaction) throw new Error(`Transaction failed: ${res.FailedTransaction.status.error?.message || "Unknown error"}`);
1582
+ if (!res.commandResults) throw new Error("Failed to get margin manager balances: No command results");
1583
+ const results = {};
1584
+ const deepCoin = this.#config.getCoin("DEEP");
1585
+ for (let i = 0; i < entries.length; i++) {
1586
+ const [managerId, poolKey] = entries[i];
1587
+ const pool = this.#config.getPool(poolKey);
1588
+ const baseCoin = this.#config.getCoin(pool.baseCoin);
1589
+ const quoteCoin = this.#config.getCoin(pool.quoteCoin);
1590
+ const baseResult = res.commandResults[i * 3];
1591
+ const quoteResult = res.commandResults[i * 3 + 1];
1592
+ const deepResult = res.commandResults[i * 3 + 2];
1593
+ if (!baseResult?.returnValues || !quoteResult?.returnValues || !deepResult?.returnValues) throw new Error(`Failed to get balances for margin manager ${managerId}: No return values`);
1594
+ results[managerId] = {
1595
+ base: this.#formatTokenAmount(BigInt(bcs.U64.parse(baseResult.returnValues[0].bcs)), baseCoin.scalar, decimals),
1596
+ quote: this.#formatTokenAmount(BigInt(bcs.U64.parse(quoteResult.returnValues[0].bcs)), quoteCoin.scalar, decimals),
1597
+ deep: this.#formatTokenAmount(BigInt(bcs.U64.parse(deepResult.returnValues[0].bcs)), deepCoin.scalar, decimals)
1598
+ };
1599
+ }
1600
+ return results;
1601
+ }
1602
+ /**
1520
1603
  * @description Get account order details for a margin manager.
1521
1604
  * This retrieves the balance manager from the margin manager and returns order details.
1522
1605
  * @param {string} marginManagerKey The key to identify the margin manager
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","names":["#client","#address","#config","#formatTokenAmount"],"sources":["../src/client.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { bcs } from '@mysten/sui/bcs';\nimport { Account, Order, OrderDeepPrice, VecSet } from './types/bcs.js';\nimport type { ClientWithCoreApi, SuiClientRegistration, SuiClientTypes } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport { BalanceManagerContract } from './transactions/balanceManager.js';\nimport { DeepBookContract } from './transactions/deepbook.js';\nimport { DeepBookAdminContract } from './transactions/deepbookAdmin.js';\nimport { FlashLoanContract } from './transactions/flashLoans.js';\nimport { GovernanceContract } from './transactions/governance.js';\nimport type {\n\tBalanceManager,\n\tMarginManager,\n\tCanPlaceLimitOrderParams,\n\tCanPlaceMarketOrderParams,\n} from './types/index.js';\nimport {\n\tDEEP_SCALAR,\n\tDeepBookConfig,\n\tFLOAT_SCALAR,\n\tPRICE_INFO_OBJECT_MAX_AGE_MS,\n} from './utils/config.js';\nimport type { CoinMap, PoolMap } from './utils/constants.js';\nimport { MarginAdminContract } from './transactions/marginAdmin.js';\nimport { MarginMaintainerContract } from './transactions/marginMaintainer.js';\nimport { MarginPoolContract } from './transactions/marginPool.js';\nimport { MarginManagerContract } from './transactions/marginManager.js';\nimport { MarginRegistryContract } from './transactions/marginRegistry.js';\nimport { MarginLiquidationsContract } from './transactions/marginLiquidations.js';\nimport { SuiPriceServiceConnection } from './pyth/pyth.js';\nimport { SuiPythClient } from './pyth/pyth.js';\nimport { PriceInfoObject } from './contracts/pyth/price_info.js';\nimport { PoolProxyContract } from './transactions/poolProxy.js';\nimport { MarginTPSLContract } from './transactions/marginTPSL.js';\n\nexport interface DeepBookCompatibleClient extends ClientWithCoreApi {}\n\nexport interface DeepBookOptions<Name = 'deepbook'> {\n\taddress: string;\n\tbalanceManagers?: { [key: string]: BalanceManager };\n\tmarginManagers?: { [key: string]: MarginManager };\n\tcoins?: CoinMap;\n\tpools?: PoolMap;\n\tadminCap?: string;\n\tmarginAdminCap?: string;\n\tmarginMaintainerCap?: string;\n\tname?: Name;\n}\n\nexport interface DeepBookClientOptions extends DeepBookOptions {\n\tclient: DeepBookCompatibleClient;\n\tnetwork: SuiClientTypes.Network;\n}\n\nexport function deepbook<Name extends string = 'deepbook'>({\n\tname = 'deepbook' as Name,\n\t...options\n}: DeepBookOptions<Name>): SuiClientRegistration<DeepBookCompatibleClient, Name, DeepBookClient> {\n\treturn {\n\t\tname,\n\t\tregister: (client) => {\n\t\t\treturn new DeepBookClient({\n\t\t\t\tclient,\n\t\t\t\tnetwork: client.network,\n\t\t\t\t...options,\n\t\t\t});\n\t\t},\n\t};\n}\n\n/**\n * DeepBookClient class for managing DeepBook operations.\n */\nexport class DeepBookClient {\n\t#client: DeepBookCompatibleClient;\n\t#config: DeepBookConfig;\n\t#address: string;\n\tbalanceManager: BalanceManagerContract;\n\tdeepBook: DeepBookContract;\n\tdeepBookAdmin: DeepBookAdminContract;\n\tflashLoans: FlashLoanContract;\n\tgovernance: GovernanceContract;\n\tmarginAdmin: MarginAdminContract;\n\tmarginMaintainer: MarginMaintainerContract;\n\tmarginPool: MarginPoolContract;\n\tmarginManager: MarginManagerContract;\n\tmarginRegistry: MarginRegistryContract;\n\tmarginLiquidations: MarginLiquidationsContract;\n\tpoolProxy: PoolProxyContract;\n\tmarginTPSL: MarginTPSLContract;\n\n\t/**\n\t * Creates a new DeepBookClient instance\n\t */\n\tconstructor({\n\t\tclient,\n\t\taddress,\n\t\tnetwork,\n\t\tbalanceManagers,\n\t\tmarginManagers,\n\t\tcoins,\n\t\tpools,\n\t\tadminCap,\n\t\tmarginAdminCap,\n\t\tmarginMaintainerCap,\n\t}: DeepBookClientOptions) {\n\t\tthis.#client = client;\n\t\tthis.#address = normalizeSuiAddress(address);\n\t\tthis.#config = new DeepBookConfig({\n\t\t\taddress: this.#address,\n\t\t\tnetwork,\n\t\t\tbalanceManagers,\n\t\t\tmarginManagers,\n\t\t\tcoins,\n\t\t\tpools,\n\t\t\tadminCap,\n\t\t\tmarginAdminCap,\n\t\t\tmarginMaintainerCap,\n\t\t});\n\t\tthis.balanceManager = new BalanceManagerContract(this.#config);\n\t\tthis.deepBook = new DeepBookContract(this.#config);\n\t\tthis.deepBookAdmin = new DeepBookAdminContract(this.#config);\n\t\tthis.flashLoans = new FlashLoanContract(this.#config);\n\t\tthis.governance = new GovernanceContract(this.#config);\n\t\tthis.marginAdmin = new MarginAdminContract(this.#config);\n\t\tthis.marginMaintainer = new MarginMaintainerContract(this.#config);\n\t\tthis.marginPool = new MarginPoolContract(this.#config);\n\t\tthis.marginManager = new MarginManagerContract(this.#config);\n\t\tthis.marginRegistry = new MarginRegistryContract(this.#config);\n\t\tthis.marginLiquidations = new MarginLiquidationsContract(this.#config);\n\t\tthis.poolProxy = new PoolProxyContract(this.#config);\n\t\tthis.marginTPSL = new MarginTPSLContract(this.#config);\n\t}\n\n\t/**\n\t * @description Check the balance of a balance manager for a specific coin\n\t * @param {string} managerKey Key of the balance manager\n\t * @param {string} coinKey Key of the coin\n\t * @returns {Promise<{ coinType: string, balance: number }>} An object with coin type and balance\n\t */\n\tasync checkManagerBalance(managerKey: string, coinKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst coin = this.#config.getCoin(coinKey);\n\n\t\ttx.add(this.balanceManager.checkManagerBalance(managerKey, coinKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst parsed_balance = bcs.U64.parse(bytes);\n\t\tconst balanceNumber = Number(parsed_balance);\n\t\tconst adjusted_balance = balanceNumber / coin.scalar;\n\n\t\treturn {\n\t\t\tcoinType: coin.type,\n\t\t\tbalance: Number(adjusted_balance.toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Check the balance of a BalanceManager by its address directly\n\t * @param {string} managerAddress The on-chain address of the BalanceManager\n\t * @param {string} coinKey Key of the coin\n\t * @returns {Promise<{ coinType: string, balance: number }>} An object with coin type and balance\n\t */\n\tasync checkManagerBalanceWithAddress(managerAddress: string, coinKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst coin = this.#config.getCoin(coinKey);\n\n\t\ttx.moveCall({\n\t\t\ttarget: `${this.#config.DEEPBOOK_PACKAGE_ID}::balance_manager::balance`,\n\t\t\targuments: [tx.object(managerAddress)],\n\t\t\ttypeArguments: [coin.type],\n\t\t});\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst parsed_balance = bcs.U64.parse(bytes);\n\t\tconst balanceNumber = Number(parsed_balance);\n\t\tconst adjusted_balance = balanceNumber / coin.scalar;\n\n\t\treturn {\n\t\t\tcoinType: coin.type,\n\t\t\tbalance: Number(adjusted_balance.toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Check if a pool is whitelisted\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<boolean>} Boolean indicating if the pool is whitelisted\n\t */\n\tasync whitelisted(poolKey: string) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.whitelisted(poolKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst whitelisted = bcs.Bool.parse(bytes);\n\n\t\treturn whitelisted;\n\t}\n\n\t/**\n\t * @description Get the quote quantity out for a given base quantity\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity to convert\n\t * @returns {Promise<{ baseQuantity: number, baseOut: number, quoteOut: number, deepRequired: number }>}\n\t * An object with base quantity, base out, quote out, and deep required for the dry run\n\t */\n\tasync getQuoteQuantityOut(poolKey: string, baseQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuoteQuantityOut(poolKey, baseQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the base quantity out for a given quote quantity\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} quoteQuantity Quote quantity to convert\n\t * @returns {Promise<{ quoteQuantity: number, baseOut: number, quoteOut: number, deepRequired: number }>}\n\t * An object with quote quantity, base out, quote out, and deep required for the dry run\n\t */\n\tasync getBaseQuantityOut(poolKey: string, quoteQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getBaseQuantityOut(poolKey, quoteQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tquoteQuantity: quoteQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the output quantities for given base and quote quantities. Only one quantity can be non-zero\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity to convert\n\t * @param {number} quoteQuantity Quote quantity to convert\n\t * @returns {Promise<{ baseQuantity: number, quoteQuantity: number, baseOut: number, quoteOut: number, deepRequired: number }>}\n\t * An object with base quantity, quote quantity, base out, quote out, and deep required for the dry run\n\t */\n\tasync getQuantityOut(poolKey: string, baseQuantity: number, quoteQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuantityOut(poolKey, baseQuantity, quoteQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseQuantity,\n\t\t\tquoteQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get open orders for a balance manager in a pool\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey Key of the balance manager\n\t * @returns {Promise<Array>} An array of open order IDs\n\t */\n\tasync accountOpenOrders(poolKey: string, managerKey: string) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.accountOpenOrders(poolKey, managerKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst order_ids = res.commandResults![0].returnValues[0].bcs;\n\n\t\treturn VecSet(bcs.u128()).parse(new Uint8Array(order_ids)).contents;\n\t}\n\n\t/**\n\t * @description Get the order information for a specific order in a pool\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} orderId Order ID\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the order information\n\t */\n\tasync getOrder(poolKey: string, orderId: string) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.getOrder(poolKey, orderId));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst orderInformation = res.commandResults![0].returnValues[0].bcs;\n\t\t\treturn Order.parse(new Uint8Array(orderInformation));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * @description Get the order information for a specific order in a pool, with normalized price\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} orderId Order ID\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the order information with normalized price\n\t */\n\tasync getOrderNormalized(poolKey: string, orderId: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getOrder(poolKey, orderId));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst orderInformation = res.commandResults![0].returnValues[0].bcs;\n\t\t\tconst orderInfo = Order.parse(new Uint8Array(orderInformation));\n\n\t\t\tif (!orderInfo) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst baseCoin = this.#config.getCoin(this.#config.getPool(poolKey).baseCoin);\n\t\t\tconst quoteCoin = this.#config.getCoin(this.#config.getPool(poolKey).quoteCoin);\n\t\t\tconst { isBid, price: rawPrice } = this.decodeOrderId(BigInt(orderInfo.order_id));\n\t\t\tconst normalizedPrice = (rawPrice * baseCoin.scalar) / quoteCoin.scalar / FLOAT_SCALAR;\n\n\t\t\tconst normalizedOrderInfo = {\n\t\t\t\t...orderInfo,\n\t\t\t\tquantity: String((Number(orderInfo.quantity) / baseCoin.scalar).toFixed(9)),\n\t\t\t\tfilled_quantity: String((Number(orderInfo.filled_quantity) / baseCoin.scalar).toFixed(9)),\n\t\t\t\torder_deep_price: {\n\t\t\t\t\t...orderInfo.order_deep_price,\n\t\t\t\t\tdeep_per_asset: String(\n\t\t\t\t\t\t(Number(orderInfo.order_deep_price.deep_per_asset) / DEEP_SCALAR).toFixed(9),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tisBid,\n\t\t\t\tnormalized_price: normalizedPrice.toFixed(9),\n\t\t\t};\n\t\t\treturn normalizedOrderInfo;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * @description Retrieves information for multiple specific orders in a pool.\n\t * @param {string} poolKey - The key identifying the pool from which to retrieve order information.\n\t * @param {string[]} orderIds - List of order IDs to retrieve information for.\n\t * @returns {Promise<Object[] | null>} A promise that resolves to an array of order objects, each containing details such as\n\t * balance manager ID, order ID, client order ID, quantity, filled quantity, fee information, order price, epoch, status,\n\t * and expiration timestamp. Returns `null` if the retrieval fails.\n\t */\n\tasync getOrders(poolKey: string, orderIds: string[]) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.getOrders(poolKey, orderIds));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst orderInformation = res.commandResults![0].returnValues[0].bcs;\n\t\t\treturn bcs.vector(Order).parse(new Uint8Array(orderInformation));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * @description Get level 2 order book specifying range of price\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} priceLow Lower bound of the price range\n\t * @param {number} priceHigh Upper bound of the price range\n\t * @param {boolean} isBid Whether to get bid or ask orders\n\t * @returns {Promise<{ prices: Array<number>, quantities: Array<number> }>}\n\t * An object with arrays of prices and quantities\n\t */\n\tasync getLevel2Range(poolKey: string, priceLow: number, priceHigh: number, isBid: boolean) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\ttx.add(this.deepBook.getLevel2Range(poolKey, priceLow, priceHigh, isBid));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst prices = res.commandResults![0].returnValues[0].bcs;\n\t\tconst parsed_prices = bcs.vector(bcs.u64()).parse(new Uint8Array(prices));\n\t\tconst quantities = res.commandResults![0].returnValues[1].bcs;\n\t\tconst parsed_quantities = bcs.vector(bcs.u64()).parse(new Uint8Array(quantities));\n\n\t\treturn {\n\t\t\tprices: parsed_prices.map((price) =>\n\t\t\t\tNumber(((Number(price) / FLOAT_SCALAR / quoteCoin.scalar) * baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t\tquantities: parsed_quantities.map((price) =>\n\t\t\t\tNumber((Number(price) / baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get level 2 order book ticks from mid-price for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} ticks Number of ticks from mid-price\n\t * @returns {Promise<{ bid_prices: Array<number>, bid_quantities: Array<number>, ask_prices: Array<number>, ask_quantities: Array<number> }>}\n\t * An object with arrays of prices and quantities\n\t */\n\tasync getLevel2TicksFromMid(poolKey: string, ticks: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\ttx.add(this.deepBook.getLevel2TicksFromMid(poolKey, ticks));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bid_prices = res.commandResults![0].returnValues[0].bcs;\n\t\tconst bid_parsed_prices = bcs.vector(bcs.u64()).parse(new Uint8Array(bid_prices));\n\t\tconst bid_quantities = res.commandResults![0].returnValues[1].bcs;\n\t\tconst bid_parsed_quantities = bcs.vector(bcs.u64()).parse(new Uint8Array(bid_quantities));\n\n\t\tconst ask_prices = res.commandResults![0].returnValues[2].bcs;\n\t\tconst ask_parsed_prices = bcs.vector(bcs.u64()).parse(new Uint8Array(ask_prices));\n\t\tconst ask_quantities = res.commandResults![0].returnValues[3].bcs;\n\t\tconst ask_parsed_quantities = bcs.vector(bcs.u64()).parse(new Uint8Array(ask_quantities));\n\n\t\treturn {\n\t\t\tbid_prices: bid_parsed_prices.map((price) =>\n\t\t\t\tNumber(((Number(price) / FLOAT_SCALAR / quoteCoin.scalar) * baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t\tbid_quantities: bid_parsed_quantities.map((quantity) =>\n\t\t\t\tNumber((Number(quantity) / baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t\task_prices: ask_parsed_prices.map((price) =>\n\t\t\t\tNumber(((Number(price) / FLOAT_SCALAR / quoteCoin.scalar) * baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t\task_quantities: ask_parsed_quantities.map((quantity) =>\n\t\t\t\tNumber((Number(quantity) / baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the vault balances for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{ base: number, quote: number, deep: number }>}\n\t * An object with base, quote, and deep balances in the vault\n\t */\n\tasync vaultBalances(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.vaultBalances(poolKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseInVault = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteInVault = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepInVault = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbase: Number((baseInVault / baseScalar).toFixed(9)),\n\t\t\tquote: Number((quoteInVault / quoteScalar).toFixed(9)),\n\t\t\tdeep: Number((deepInVault / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the pool ID by asset types\n\t * @param {string} baseType Type of the base asset\n\t * @param {string} quoteType Type of the quote asset\n\t * @returns {Promise<string>} The address of the pool\n\t */\n\tasync getPoolIdByAssets(baseType: string, quoteType: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getPoolIdByAssets(baseType, quoteType));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst address = bcs.Address.parse(res.commandResults![0].returnValues[0].bcs);\n\n\t\treturn address;\n\t}\n\n\t/**\n\t * @description Get the mid price for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<number>} The mid price\n\t */\n\tasync midPrice(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\ttx.add(this.deepBook.midPrice(poolKey));\n\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst parsed_mid_price = Number(bcs.U64.parse(bytes));\n\t\tconst adjusted_mid_price =\n\t\t\t(parsed_mid_price * baseCoin.scalar) / quoteCoin.scalar / FLOAT_SCALAR;\n\n\t\treturn Number(adjusted_mid_price.toFixed(9));\n\t}\n\n\t/**\n\t * @description Get the trade parameters for a given pool, including taker fee, maker fee, and stake required.\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{ takerFee: number, makerFee: number, stakeRequired: number }>}\n\t */\n\tasync poolTradeParams(poolKey: string) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.poolTradeParams(poolKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst takerFee = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst makerFee = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst stakeRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\ttakerFee: Number(takerFee / FLOAT_SCALAR),\n\t\t\tmakerFee: Number(makerFee / FLOAT_SCALAR),\n\t\t\tstakeRequired: Number(stakeRequired / DEEP_SCALAR),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the trade parameters for a given pool, including tick size, lot size, and min size.\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{ tickSize: number, lotSize: number, minSize: number }>}\n\t */\n\tasync poolBookParams(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.poolBookParams(poolKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst tickSize = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst lotSize = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst minSize = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\ttickSize: Number((tickSize * baseScalar) / quoteScalar / FLOAT_SCALAR),\n\t\t\tlotSize: Number(lotSize / baseScalar),\n\t\t\tminSize: Number(minSize / baseScalar),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the account information for a given pool and balance manager\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey The key of the BalanceManager\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the account information\n\t */\n\tasync account(poolKey: string, managerKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.account(poolKey, managerKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst accountInformation = res.commandResults![0].returnValues[0].bcs;\n\t\tconst accountInfo = Account.parse(new Uint8Array(accountInformation));\n\n\t\treturn {\n\t\t\tepoch: accountInfo.epoch,\n\t\t\topen_orders: accountInfo.open_orders,\n\t\t\ttaker_volume: Number(accountInfo.taker_volume) / baseScalar,\n\t\t\tmaker_volume: Number(accountInfo.maker_volume) / baseScalar,\n\t\t\tactive_stake: Number(accountInfo.active_stake) / DEEP_SCALAR,\n\t\t\tinactive_stake: Number(accountInfo.inactive_stake) / DEEP_SCALAR,\n\t\t\tcreated_proposal: accountInfo.created_proposal,\n\t\t\tvoted_proposal: accountInfo.voted_proposal,\n\t\t\tunclaimed_rebates: {\n\t\t\t\tbase: Number(accountInfo.unclaimed_rebates.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.unclaimed_rebates.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.unclaimed_rebates.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t\tsettled_balances: {\n\t\t\t\tbase: Number(accountInfo.settled_balances.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.settled_balances.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.settled_balances.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t\towed_balances: {\n\t\t\t\tbase: Number(accountInfo.owed_balances.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.owed_balances.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.owed_balances.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the locked balances for a pool and balance manager\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey The key of the BalanceManager\n\t * @returns {Promise<{ base: number, quote: number, deep: number }>}\n\t * An object with base, quote, and deep locked for the balance manager in the pool\n\t */\n\tasync lockedBalance(poolKey: string, balanceManagerKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.lockedBalance(poolKey, balanceManagerKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbase: Number((baseLocked / baseScalar).toFixed(9)),\n\t\t\tquote: Number((quoteLocked / quoteScalar).toFixed(9)),\n\t\t\tdeep: Number((deepLocked / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the DEEP price conversion for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{ asset_is_base: bool, deep_per_quote: number }>} Deep price conversion\n\t */\n\tasync getPoolDeepPrice(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\ttx.add(this.deepBook.getPoolDeepPrice(poolKey));\n\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\t\tconst deepCoin = this.#config.getCoin('DEEP');\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst poolDeepPriceBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst poolDeepPrice = OrderDeepPrice.parse(new Uint8Array(poolDeepPriceBytes));\n\n\t\tif (poolDeepPrice.asset_is_base) {\n\t\t\treturn {\n\t\t\t\tasset_is_base: poolDeepPrice.asset_is_base,\n\t\t\t\tdeep_per_base:\n\t\t\t\t\t((Number(poolDeepPrice.deep_per_asset) / FLOAT_SCALAR) * baseCoin.scalar) /\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tasset_is_base: poolDeepPrice.asset_is_base,\n\t\t\t\tdeep_per_quote:\n\t\t\t\t\t((Number(poolDeepPrice.deep_per_asset) / FLOAT_SCALAR) * quoteCoin.scalar) /\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * @description Decode the order ID to get bid/ask status, price, and orderId\n\t * @param {bigint} encodedOrderId Encoded order ID\n\t * @returns {Object} Object containing isBid, price, and orderId\n\t */\n\tdecodeOrderId(encodedOrderId: bigint): { isBid: boolean; price: number; orderId: number } {\n\t\tconst isBid = encodedOrderId >> 127n === 0n;\n\t\tconst price = Number((encodedOrderId >> 64n) & ((1n << 63n) - 1n));\n\t\tconst orderId = Number(encodedOrderId & ((1n << 64n) - 1n));\n\n\t\treturn { isBid, price, orderId };\n\t}\n\n\t/**\n\t * @description Get all balance manager IDs for a given owner\n\t * @param {string} owner The owner address to get balance manager IDs for\n\t * @returns {Promise<string[]>} Array of balance manager ID strings\n\t */\n\tasync getBalanceManagerIds(owner: string): Promise<string[]> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getBalanceManagerIds(owner));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst vecOfAddresses = bcs.vector(bcs.Address).parse(bytes);\n\n\t\treturn vecOfAddresses.map((id: string) => normalizeSuiAddress(id));\n\t}\n\n\t/**\n\t * @description Get the owner of the referral (DeepBookPoolReferral)\n\t * @param {string} referral The ID of the referral to get the owner of\n\t * @returns {Promise<string>} The owner of the referral\n\t */\n\tasync balanceManagerReferralOwner(referral: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.balanceManager.balanceManagerReferralOwner(referral));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst owner = bcs.Address.parse(bytes);\n\n\t\treturn owner;\n\t}\n\n\t/**\n\t * @description Get the referral balances for a pool and referral (DeepBookPoolReferral)\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} referral The referral ID to get balances for\n\t * @returns {Promise<{ base: number, quote: number, deep: number }>} Object with base, quote, and deep balances\n\t */\n\tasync getPoolReferralBalances(\n\t\tpoolKey: string,\n\t\treferral: string,\n\t): Promise<{ base: number; quote: number; deep: number }> {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getPoolReferralBalances(poolKey, referral));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\t// The function returns three u64 values: (base, quote, deep)\n\t\tconst baseBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst quoteBytes = res.commandResults![0].returnValues[1].bcs;\n\t\tconst deepBytes = res.commandResults![0].returnValues[2].bcs;\n\n\t\tconst baseBalance = Number(bcs.U64.parse(baseBytes));\n\t\tconst quoteBalance = Number(bcs.U64.parse(quoteBytes));\n\t\tconst deepBalance = Number(bcs.U64.parse(deepBytes));\n\n\t\treturn {\n\t\t\tbase: baseBalance / baseScalar,\n\t\t\tquote: quoteBalance / quoteScalar,\n\t\t\tdeep: deepBalance / DEEP_SCALAR,\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the pool ID associated with a referral (DeepBookPoolReferral)\n\t * @param {string} referral The referral (DeepBookPoolReferral) to get the pool ID for\n\t * @returns {Promise<string>} The pool ID\n\t */\n\tasync balanceManagerReferralPoolId(referral: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.balanceManager.balanceManagerReferralPoolId(referral));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst poolId = bcs.Address.parse(bytes);\n\n\t\treturn normalizeSuiAddress(poolId);\n\t}\n\n\t/**\n\t * @description Get the multiplier for a referral (DeepBookPoolReferral)\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} referral The referral (DeepBookPoolReferral) to get the multiplier for\n\t * @returns {Promise<number>} The multiplier value\n\t */\n\tasync poolReferralMultiplier(poolKey: string, referral: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.poolReferralMultiplier(poolKey, referral));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst multiplier = Number(bcs.U64.parse(bytes));\n\n\t\treturn multiplier / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the referral ID from a balance manager for a specific pool\n\t * @param {string} managerKey Key of the balance manager\n\t * @param {string} poolKey Key of the pool to get the referral for\n\t * @returns {Promise<string | null>} The referral ID or null if not set\n\t */\n\tasync getBalanceManagerReferralId(managerKey: string, poolKey: string): Promise<string | null> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.balanceManager.getBalanceManagerReferralId(managerKey, poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\t\tconst optionId = bcs.option(bcs.Address).parse(bytes);\n\t\t\tif (optionId === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn normalizeSuiAddress(optionId);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync getPriceInfoObject(tx: Transaction, coinKey: string): Promise<string> {\n\t\tconst currentTime = Date.now();\n\t\tconst priceInfoObjectAge = await this.getPriceInfoObjectAge(coinKey);\n\t\tif (\n\t\t\tpriceInfoObjectAge &&\n\t\t\tcurrentTime - priceInfoObjectAge * 1000 < PRICE_INFO_OBJECT_MAX_AGE_MS\n\t\t) {\n\t\t\treturn await this.#config.getCoin(coinKey).priceInfoObjectId!;\n\t\t}\n\n\t\t// Initialize connection to the Sui Price Service\n\t\tconst endpoint =\n\t\t\tthis.#config.network === 'testnet'\n\t\t\t\t? 'https://hermes-beta.pyth.network'\n\t\t\t\t: 'https://hermes.pyth.network';\n\t\tconst connection = new SuiPriceServiceConnection(endpoint);\n\n\t\t// List of price feed IDs\n\t\tconst priceIDs = [\n\t\t\tthis.#config.getCoin(coinKey).feed!, // ASSET/USD price ID\n\t\t];\n\n\t\t// Fetch price feed update data\n\t\tconst priceUpdateData = await connection.getPriceFeedsUpdateData(priceIDs);\n\n\t\t// Initialize Sui Client and Pyth Client\n\t\tconst wormholeStateId = this.#config.pyth.wormholeStateId;\n\t\tconst pythStateId = this.#config.pyth.pythStateId;\n\n\t\tconst client = new SuiPythClient(this.#client, pythStateId, wormholeStateId);\n\n\t\treturn (await client.updatePriceFeeds(tx, priceUpdateData, priceIDs))[0]; // returns priceInfoObjectIds\n\t}\n\n\t/**\n\t * @description Batch update price info objects for multiple coins. Only updates stale feeds.\n\t * This is more efficient than calling getPriceInfoObject multiple times as it:\n\t * 1. Batch fetches all price info object ages in one RPC call\n\t * 2. Fetches all stale price updates from Pyth in a single API call\n\t * @param {Transaction} tx Transaction to add price update commands to\n\t * @param {string[]} coinKeys Array of coin keys to update prices for\n\t * @returns {Promise<Record<string, string>>} Map of coinKey -> priceInfoObjectId\n\t */\n\tasync getPriceInfoObjects(tx: Transaction, coinKeys: string[]): Promise<Record<string, string>> {\n\t\tif (coinKeys.length === 0) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\n\t\t// Build map of coinKey -> priceInfoObjectId and collect all object IDs\n\t\tconst coinToObjectId: Record<string, string> = {};\n\t\tconst objectIds: string[] = [];\n\t\tfor (const coinKey of coinKeys) {\n\t\t\tconst priceInfoObjectId = this.#config.getCoin(coinKey).priceInfoObjectId!;\n\t\t\tcoinToObjectId[coinKey] = priceInfoObjectId;\n\t\t\tobjectIds.push(priceInfoObjectId);\n\t\t}\n\n\t\t// Batch fetch all price info objects in one RPC call\n\t\tconst res = await this.#client.core.getObjects({\n\t\t\tobjectIds,\n\t\t\tinclude: { content: true },\n\t\t});\n\n\t\t// Parse each object and determine which are stale\n\t\tconst staleCoinKeys: string[] = [];\n\t\tconst result: Record<string, string> = {};\n\n\t\tfor (let i = 0; i < coinKeys.length; i++) {\n\t\t\tconst coinKey = coinKeys[i];\n\t\t\tconst obj = res.objects[i];\n\n\t\t\tif (obj instanceof Error || !obj?.content) {\n\t\t\t\t// If we can't fetch the object, mark it as stale to force update\n\t\t\t\tstaleCoinKeys.push(coinKey);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst priceInfoObject = PriceInfoObject.parse(obj.content);\n\t\t\tconst arrivalTime = Number(priceInfoObject.price_info.arrival_time);\n\t\t\tconst age = currentTime - arrivalTime * 1000;\n\n\t\t\tif (age >= PRICE_INFO_OBJECT_MAX_AGE_MS) {\n\t\t\t\tstaleCoinKeys.push(coinKey);\n\t\t\t} else {\n\t\t\t\t// Fresh price, just return the existing object ID\n\t\t\t\tresult[coinKey] = coinToObjectId[coinKey];\n\t\t\t}\n\t\t}\n\n\t\t// If no stale feeds, return early\n\t\tif (staleCoinKeys.length === 0) {\n\t\t\treturn result;\n\t\t}\n\n\t\t// Collect all feed IDs for stale coins\n\t\tconst staleFeedIds: string[] = [];\n\t\tconst feedIdToCoinKey: Record<string, string> = {};\n\t\tfor (const coinKey of staleCoinKeys) {\n\t\t\tconst feedId = this.#config.getCoin(coinKey).feed!;\n\t\t\tstaleFeedIds.push(feedId);\n\t\t\tfeedIdToCoinKey[feedId] = coinKey;\n\t\t}\n\n\t\t// Initialize connection to the Sui Price Service\n\t\tconst endpoint =\n\t\t\tthis.#config.network === 'testnet'\n\t\t\t\t? 'https://hermes-beta.pyth.network'\n\t\t\t\t: 'https://hermes.pyth.network';\n\t\tconst connection = new SuiPriceServiceConnection(endpoint);\n\n\t\t// Fetch all stale price updates from Pyth in a single API call\n\t\tconst priceUpdateData = await connection.getPriceFeedsUpdateData(staleFeedIds);\n\n\t\t// Initialize Pyth Client\n\t\tconst wormholeStateId = this.#config.pyth.wormholeStateId;\n\t\tconst pythStateId = this.#config.pyth.pythStateId;\n\t\tconst pythClient = new SuiPythClient(this.#client, pythStateId, wormholeStateId);\n\n\t\t// Update all stale feeds in the transaction\n\t\tconst updatedObjectIds = await pythClient.updatePriceFeeds(tx, priceUpdateData, staleFeedIds);\n\n\t\t// Map the updated object IDs back to coin keys\n\t\tfor (let i = 0; i < staleFeedIds.length; i++) {\n\t\t\tconst coinKey = feedIdToCoinKey[staleFeedIds[i]];\n\t\t\tresult[coinKey] = updatedObjectIds[i];\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * @description Get the age of the price info object for a specific coin\n\t * @param {string} coinKey Key of the coin\n\t * @returns {Promise<number>} The arrival time of the price info object\n\t */\n\tasync getPriceInfoObjectAge(coinKey: string) {\n\t\tconst priceInfoObjectId = this.#config.getCoin(coinKey).priceInfoObjectId!;\n\t\tconst res = await this.#client.core.getObject({\n\t\t\tobjectId: priceInfoObjectId,\n\t\t\tinclude: {\n\t\t\t\tcontent: true,\n\t\t\t},\n\t\t});\n\n\t\tif (!res.object?.content) {\n\t\t\tthrow new Error(`Price info object not found for ${coinKey}`);\n\t\t}\n\n\t\tconst priceInfoObject = PriceInfoObject.parse(res.object.content);\n\t\treturn Number(priceInfoObject.price_info.arrival_time);\n\t}\n\n\t// === Margin Pool View Methods ===\n\n\t/**\n\t * @description Get the margin pool ID\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<string>} The margin pool ID\n\t */\n\tasync getMarginPoolId(coinKey: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.getId(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.Address.parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if a deepbook pool is allowed for borrowing from margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {string} deepbookPoolId The ID of the deepbook pool\n\t * @returns {Promise<boolean>} Whether the deepbook pool is allowed\n\t */\n\tasync isDeepbookPoolAllowed(coinKey: string, deepbookPoolId: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.deepbookPoolAllowed(coinKey, deepbookPoolId));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the total supply amount in the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The total supply amount as a string\n\t */\n\tasync getMarginPoolTotalSupply(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.totalSupply(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the total supply shares in the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The total supply shares as a string\n\t */\n\tasync getMarginPoolSupplyShares(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.supplyShares(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawShares = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawShares, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the total borrow amount in the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The total borrow amount as a string\n\t */\n\tasync getMarginPoolTotalBorrow(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.totalBorrow(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the total borrow shares in the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The total borrow shares as a string\n\t */\n\tasync getMarginPoolBorrowShares(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.borrowShares(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawShares = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawShares, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the last update timestamp of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<number>} The last update timestamp in milliseconds\n\t */\n\tasync getMarginPoolLastUpdateTimestamp(coinKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.lastUpdateTimestamp(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn Number(bcs.U64.parse(bytes));\n\t}\n\n\t/**\n\t * @description Get the supply cap of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The supply cap as a string\n\t */\n\tasync getMarginPoolSupplyCap(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.supplyCap(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the max utilization rate of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<number>} The max utilization rate (as a decimal, e.g., 0.95 for 95%)\n\t */\n\tasync getMarginPoolMaxUtilizationRate(coinKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.maxUtilizationRate(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawRate = Number(bcs.U64.parse(bytes));\n\t\treturn rawRate / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the protocol spread of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<number>} The protocol spread (as a decimal)\n\t */\n\tasync getMarginPoolProtocolSpread(coinKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.protocolSpread(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawSpread = Number(bcs.U64.parse(bytes));\n\t\treturn rawSpread / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the minimum borrow amount for the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The minimum borrow amount as a string\n\t */\n\tasync getMarginPoolMinBorrow(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.minBorrow(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the current interest rate of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<number>} The current interest rate (as a decimal)\n\t */\n\tasync getMarginPoolInterestRate(coinKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.interestRate(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawRate = Number(bcs.U64.parse(bytes));\n\t\treturn rawRate / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get user supply shares for a supplier cap\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {string} supplierCapId The ID of the supplier cap\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The user's supply shares as a string\n\t */\n\tasync getUserSupplyShares(\n\t\tcoinKey: string,\n\t\tsupplierCapId: string,\n\t\tdecimals: number = 6,\n\t): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.userSupplyShares(coinKey, supplierCapId));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawShares = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawShares, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get user supply amount for a supplier cap\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {string} supplierCapId The ID of the supplier cap\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The user's supply amount as a string\n\t */\n\tasync getUserSupplyAmount(\n\t\tcoinKey: string,\n\t\tsupplierCapId: string,\n\t\tdecimals: number = 6,\n\t): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.userSupplyAmount(coinKey, supplierCapId));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t// === Margin Manager Read-Only Functions ===\n\n\t/**\n\t * @description Get the owner address of a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The owner address\n\t */\n\tasync getMarginManagerOwner(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.ownerByPoolKey(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn normalizeSuiAddress(bcs.Address.parse(bytes));\n\t}\n\n\t/**\n\t * @description Get the DeepBook pool ID associated with a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The DeepBook pool ID\n\t */\n\tasync getMarginManagerDeepbookPool(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.deepbookPool(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn normalizeSuiAddress(bcs.Address.parse(bytes));\n\t}\n\n\t/**\n\t * @description Get the margin pool ID (if any) associated with a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string | null>} The margin pool ID or null if no active loan\n\t */\n\tasync getMarginManagerMarginPoolId(marginManagerKey: string): Promise<string | null> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.marginPoolId(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst option = bcs.option(bcs.Address).parse(bytes);\n\t\treturn option ? normalizeSuiAddress(option) : null;\n\t}\n\n\t/**\n\t * @description Get borrowed shares for both base and quote assets\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<{baseShares: string, quoteShares: string}>} The borrowed shares\n\t */\n\tasync getMarginManagerBorrowedShares(\n\t\tmarginManagerKey: string,\n\t): Promise<{ baseShares: string; quoteShares: string }> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.borrowedShares(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst quoteBytes = res.commandResults![0].returnValues[1].bcs;\n\t\tconst baseShares = bcs.U64.parse(baseBytes).toString();\n\t\tconst quoteShares = bcs.U64.parse(quoteBytes).toString();\n\n\t\treturn { baseShares, quoteShares };\n\t}\n\n\t/**\n\t * @description Get borrowed base shares\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The borrowed base shares\n\t */\n\tasync getMarginManagerBorrowedBaseShares(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.borrowedBaseShares(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.U64.parse(bytes).toString();\n\t}\n\n\t/**\n\t * @description Get borrowed quote shares\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The borrowed quote shares\n\t */\n\tasync getMarginManagerBorrowedQuoteShares(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.borrowedQuoteShares(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.U64.parse(bytes).toString();\n\t}\n\n\t/**\n\t * @description Check if margin manager has base asset debt\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<boolean>} True if has base debt, false otherwise\n\t */\n\tasync getMarginManagerHasBaseDebt(marginManagerKey: string): Promise<boolean> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.hasBaseDebt(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the balance manager ID for a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The balance manager ID\n\t */\n\tasync getMarginManagerBalanceManagerId(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.balanceManager(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn normalizeSuiAddress(bcs.Address.parse(bytes));\n\t}\n\n\t/**\n\t * @description Calculate assets (base and quote) for a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<{baseAsset: string, quoteAsset: string}>} The base and quote assets\n\t */\n\tasync getMarginManagerAssets(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 6,\n\t): Promise<{ baseAsset: string; quoteAsset: string }> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.calculateAssets(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst quoteBytes = res.commandResults![0].returnValues[1].bcs;\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\tconst baseAsset = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(baseBytes)),\n\t\t\tbaseCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst quoteAsset = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(quoteBytes)),\n\t\t\tquoteCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\n\t\treturn { baseAsset, quoteAsset };\n\t}\n\n\t/**\n\t * @description Calculate debts (base and quote) for a margin manager\n\t * NOTE: This function automatically determines whether to use base or quote margin pool\n\t * based on hasBaseDebt. You don't need to specify the debt coin type.\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<{baseDebt: string, quoteDebt: string}>} The base and quote debts\n\t */\n\tasync getMarginManagerDebts(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 6,\n\t): Promise<{ baseDebt: string; quoteDebt: string }> {\n\t\t// First check if the margin manager has base debt\n\t\tconst hasBaseDebt = await this.getMarginManagerHasBaseDebt(marginManagerKey);\n\n\t\t// Get the manager and pool configuration\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst debtCoinKey = hasBaseDebt ? pool.baseCoin : pool.quoteCoin;\n\n\t\t// Now call calculateDebts with the correct debt coin\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.calculateDebts(manager.poolKey, debtCoinKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager debts: ${'Unknown error'}`);\n\t\t}\n\n\t\t// The Move function returns a tuple (u64, u64), so returnValues has 2 elements\n\t\tconst baseBytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst quoteBytes = res.commandResults[0].returnValues[1].bcs;\n\t\tconst debtCoin = this.#config.getCoin(debtCoinKey);\n\n\t\tconst baseDebt = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(baseBytes)),\n\t\t\tdebtCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst quoteDebt = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(quoteBytes)),\n\t\t\tdebtCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\n\t\treturn { baseDebt, quoteDebt };\n\t}\n\n\t/**\n\t * @description Get comprehensive state information for a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<{\n\t * managerId: string,\n\t * deepbookPoolId: string,\n\t * riskRatio: number,\n\t * baseAsset: string,\n\t * quoteAsset: string,\n\t * baseDebt: string,\n\t * quoteDebt: string,\n\t * basePythPrice: string,\n\t * basePythDecimals: number,\n\t * quotePythPrice: string,\n\t * quotePythDecimals: number\n\t * }>} Comprehensive margin manager state\n\t */\n\tasync getMarginManagerState(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 6,\n\t): Promise<{\n\t\tmanagerId: string;\n\t\tdeepbookPoolId: string;\n\t\triskRatio: number;\n\t\tbaseAsset: string;\n\t\tquoteAsset: string;\n\t\tbaseDebt: string;\n\t\tquoteDebt: string;\n\t\tbasePythPrice: string;\n\t\tbasePythDecimals: number;\n\t\tquotePythPrice: string;\n\t\tquotePythDecimals: number;\n\t\tcurrentPrice: bigint;\n\t\tlowestTriggerAbovePrice: bigint;\n\t\thighestTriggerBelowPrice: bigint;\n\t}> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.managerState(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager state: Unknown error`);\n\t\t}\n\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\t// Parse all 11 return values\n\t\tconst managerId = normalizeSuiAddress(\n\t\t\tbcs.Address.parse(res.commandResults[0].returnValues[0].bcs),\n\t\t);\n\t\tconst deepbookPoolId = normalizeSuiAddress(\n\t\t\tbcs.Address.parse(res.commandResults[0].returnValues[1].bcs),\n\t\t);\n\t\tconst riskRatio =\n\t\t\tNumber(bcs.U64.parse(res.commandResults[0].returnValues[2].bcs)) / FLOAT_SCALAR;\n\t\tconst baseAsset = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(res.commandResults[0].returnValues[3].bcs)),\n\t\t\tbaseCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst quoteAsset = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(res.commandResults[0].returnValues[4].bcs)),\n\t\t\tquoteCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst baseDebt = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(res.commandResults[0].returnValues[5].bcs)),\n\t\t\tbaseCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst quoteDebt = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(res.commandResults[0].returnValues[6].bcs)),\n\t\t\tquoteCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst basePythPrice = bcs.U64.parse(res.commandResults[0].returnValues[7].bcs);\n\t\tconst basePythDecimals = Number(\n\t\t\tbcs.u8().parse(new Uint8Array(res.commandResults[0].returnValues[8].bcs)),\n\t\t);\n\t\tconst quotePythPrice = bcs.U64.parse(res.commandResults[0].returnValues[9].bcs);\n\t\tconst quotePythDecimals = Number(\n\t\t\tbcs.u8().parse(new Uint8Array(res.commandResults[0].returnValues[10].bcs)),\n\t\t);\n\t\tconst currentPrice = BigInt(bcs.U64.parse(res.commandResults[0].returnValues[11].bcs));\n\t\tconst lowestTriggerAbovePrice = BigInt(\n\t\t\tbcs.U64.parse(res.commandResults[0].returnValues[12].bcs),\n\t\t);\n\t\tconst highestTriggerBelowPrice = BigInt(\n\t\t\tbcs.U64.parse(res.commandResults[0].returnValues[13].bcs),\n\t\t);\n\n\t\treturn {\n\t\t\tmanagerId,\n\t\t\tdeepbookPoolId,\n\t\t\triskRatio,\n\t\t\tbaseAsset,\n\t\t\tquoteAsset,\n\t\t\tbaseDebt,\n\t\t\tquoteDebt,\n\t\t\tbasePythPrice: basePythPrice.toString(),\n\t\t\tbasePythDecimals,\n\t\t\tquotePythPrice: quotePythPrice.toString(),\n\t\t\tquotePythDecimals,\n\t\t\tcurrentPrice,\n\t\t\tlowestTriggerAbovePrice,\n\t\t\thighestTriggerBelowPrice,\n\t\t};\n\t}\n\n\t/**\n\t * @description Get comprehensive state information for multiple margin managers.\n\t * @param {Record<string, string>} marginManagers Map of marginManagerId -> poolKey\n\t * @param {number} decimals Number of decimal places for formatting (default: 6)\n\t * @returns {Promise<Record<string, {...}>>} Object keyed by managerId with state data\n\t */\n\tasync getMarginManagerStates(\n\t\tmarginManagers: Record<string, string>,\n\t\tdecimals: number = 6,\n\t): Promise<\n\t\tRecord<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmanagerId: string;\n\t\t\t\tdeepbookPoolId: string;\n\t\t\t\triskRatio: number;\n\t\t\t\tbaseAsset: string;\n\t\t\t\tquoteAsset: string;\n\t\t\t\tbaseDebt: string;\n\t\t\t\tquoteDebt: string;\n\t\t\t\tbasePythPrice: string;\n\t\t\t\tbasePythDecimals: number;\n\t\t\t\tquotePythPrice: string;\n\t\t\t\tquotePythDecimals: number;\n\t\t\t\tcurrentPrice: bigint;\n\t\t\t\tlowestTriggerAbovePrice: bigint;\n\t\t\t\thighestTriggerBelowPrice: bigint;\n\t\t\t}\n\t\t>\n\t> {\n\t\tconst entries = Object.entries(marginManagers);\n\t\tif (entries.length === 0) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst tx = new Transaction();\n\n\t\t// Add a managerState call for each margin manager\n\t\tfor (const [managerId, poolKey] of entries) {\n\t\t\ttx.add(this.marginManager.managerState(poolKey, managerId));\n\t\t}\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults) {\n\t\t\tthrow new Error(`Failed to get margin manager states: Unknown error`);\n\t\t}\n\n\t\tconst results: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmanagerId: string;\n\t\t\t\tdeepbookPoolId: string;\n\t\t\t\triskRatio: number;\n\t\t\t\tbaseAsset: string;\n\t\t\t\tquoteAsset: string;\n\t\t\t\tbaseDebt: string;\n\t\t\t\tquoteDebt: string;\n\t\t\t\tbasePythPrice: string;\n\t\t\t\tbasePythDecimals: number;\n\t\t\t\tquotePythPrice: string;\n\t\t\t\tquotePythDecimals: number;\n\t\t\t\tcurrentPrice: bigint;\n\t\t\t\tlowestTriggerAbovePrice: bigint;\n\t\t\t\thighestTriggerBelowPrice: bigint;\n\t\t\t}\n\t\t> = {};\n\n\t\t// Parse each command result\n\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\tconst commandResult = res.commandResults[i];\n\t\t\tif (!commandResult || !commandResult.returnValues) {\n\t\t\t\tthrow new Error(`Failed to get margin manager state for index ${i}: No return values`);\n\t\t\t}\n\n\t\t\tconst [, poolKey] = entries[i];\n\t\t\tconst pool = this.#config.getPool(poolKey);\n\t\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\t\tconst managerId = normalizeSuiAddress(bcs.Address.parse(commandResult.returnValues[0].bcs));\n\t\t\tconst deepbookPoolId = normalizeSuiAddress(\n\t\t\t\tbcs.Address.parse(commandResult.returnValues[1].bcs),\n\t\t\t);\n\t\t\tconst riskRatio = Number(bcs.U64.parse(commandResult.returnValues[2].bcs)) / FLOAT_SCALAR;\n\t\t\tconst baseAsset = this.#formatTokenAmount(\n\t\t\t\tBigInt(bcs.U64.parse(commandResult.returnValues[3].bcs)),\n\t\t\t\tbaseCoin.scalar,\n\t\t\t\tdecimals,\n\t\t\t);\n\t\t\tconst quoteAsset = this.#formatTokenAmount(\n\t\t\t\tBigInt(bcs.U64.parse(commandResult.returnValues[4].bcs)),\n\t\t\t\tquoteCoin.scalar,\n\t\t\t\tdecimals,\n\t\t\t);\n\t\t\tconst baseDebt = this.#formatTokenAmount(\n\t\t\t\tBigInt(bcs.U64.parse(commandResult.returnValues[5].bcs)),\n\t\t\t\tbaseCoin.scalar,\n\t\t\t\tdecimals,\n\t\t\t);\n\t\t\tconst quoteDebt = this.#formatTokenAmount(\n\t\t\t\tBigInt(bcs.U64.parse(commandResult.returnValues[6].bcs)),\n\t\t\t\tquoteCoin.scalar,\n\t\t\t\tdecimals,\n\t\t\t);\n\t\t\tconst basePythPrice = bcs.U64.parse(commandResult.returnValues[7].bcs);\n\t\t\tconst basePythDecimals = Number(\n\t\t\t\tbcs.u8().parse(new Uint8Array(commandResult.returnValues[8].bcs)),\n\t\t\t);\n\t\t\tconst quotePythPrice = bcs.U64.parse(commandResult.returnValues[9].bcs);\n\t\t\tconst quotePythDecimals = Number(\n\t\t\t\tbcs.u8().parse(new Uint8Array(commandResult.returnValues[10].bcs)),\n\t\t\t);\n\t\t\tconst currentPrice = BigInt(bcs.U64.parse(commandResult.returnValues[11].bcs));\n\t\t\tconst lowestTriggerAbovePrice = BigInt(bcs.U64.parse(commandResult.returnValues[12].bcs));\n\t\t\tconst highestTriggerBelowPrice = BigInt(bcs.U64.parse(commandResult.returnValues[13].bcs));\n\n\t\t\tresults[managerId] = {\n\t\t\t\tmanagerId,\n\t\t\t\tdeepbookPoolId,\n\t\t\t\triskRatio,\n\t\t\t\tbaseAsset,\n\t\t\t\tquoteAsset,\n\t\t\t\tbaseDebt,\n\t\t\t\tquoteDebt,\n\t\t\t\tbasePythPrice: basePythPrice.toString(),\n\t\t\t\tbasePythDecimals,\n\t\t\t\tquotePythPrice: quotePythPrice.toString(),\n\t\t\t\tquotePythDecimals,\n\t\t\t\tcurrentPrice,\n\t\t\t\tlowestTriggerAbovePrice,\n\t\t\t\thighestTriggerBelowPrice,\n\t\t\t};\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * @description Get the base asset balance of a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The base asset balance\n\t */\n\tasync getMarginManagerBaseBalance(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 9,\n\t): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.baseBalance(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager base balance: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\n\t\treturn this.#formatTokenAmount(BigInt(bcs.U64.parse(bytes)), baseCoin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the quote asset balance of a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The quote asset balance\n\t */\n\tasync getMarginManagerQuoteBalance(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 9,\n\t): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.quoteBalance(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager quote balance: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\treturn this.#formatTokenAmount(BigInt(bcs.U64.parse(bytes)), quoteCoin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the DEEP token balance of a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The DEEP token balance\n\t */\n\tasync getMarginManagerDeepBalance(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 6,\n\t): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.deepBalance(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager DEEP balance: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst deepCoin = this.#config.getCoin('DEEP');\n\n\t\treturn this.#formatTokenAmount(BigInt(bcs.U64.parse(bytes)), deepCoin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get account order details for a margin manager.\n\t * This retrieves the balance manager from the margin manager and returns order details.\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<Array>} Array of order details\n\t */\n\tasync getMarginAccountOrderDetails(marginManagerKey: string) {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.getMarginAccountOrderDetails(manager.poolKey, manager.address));\n\n\t\ttx.setSenderIfNotSet(normalizeSuiAddress(this.#address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get conditional order IDs: Unknown error`);\n\t\t}\n\n\t\ttry {\n\t\t\tconst bytes = res.commandResults[1].returnValues[0].bcs;\n\t\t\treturn bcs.vector(Order).parse(bytes);\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t// === Margin TPSL (Take Profit / Stop Loss) Read-Only Functions ===\n\n\t/**\n\t * @description Get all conditional order IDs for a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string[]>} Array of conditional order IDs\n\t */\n\tasync getConditionalOrderIds(marginManagerKey: string): Promise<string[]> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginTPSL.conditionalOrderIds(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get conditional order IDs: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst orderIds = bcs.vector(bcs.u64()).parse(bytes);\n\t\treturn orderIds.map((id) => id.toString());\n\t}\n\n\t/**\n\t * @description Get the lowest trigger price for trigger_above orders\n\t * Returns MAX_U64 if there are no trigger_above orders\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<bigint>} The lowest trigger above price\n\t */\n\tasync getLowestTriggerAbovePrice(marginManagerKey: string): Promise<bigint> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginTPSL.lowestTriggerAbovePrice(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get lowest trigger above price: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\treturn BigInt(bcs.U64.parse(bytes));\n\t}\n\n\t/**\n\t * @description Get the highest trigger price for trigger_below orders\n\t * Returns 0 if there are no trigger_below orders\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<bigint>} The highest trigger below price\n\t */\n\tasync getHighestTriggerBelowPrice(marginManagerKey: string): Promise<bigint> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginTPSL.highestTriggerBelowPrice(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get highest trigger below price: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\treturn BigInt(bcs.U64.parse(bytes));\n\t}\n\n\t// === Margin Registry Functions ===\n\n\t/**\n\t * @description Check if a deepbook pool is enabled for margin trading\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<boolean>} True if the pool is enabled for margin trading\n\t */\n\tasync isPoolEnabledForMargin(poolKey: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.poolEnabled(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.Bool.parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the margin manager IDs for a given owner address\n\t * @param {string} owner The owner address\n\t * @returns {Promise<string[]>} Array of margin manager IDs\n\t */\n\tasync getMarginManagerIdsForOwner(owner: string): Promise<string[]> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.getMarginManagerIds(owner));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst vecSet = VecSet(bcs.Address).parse(bytes);\n\t\treturn vecSet.contents.map((id) => normalizeSuiAddress(id));\n\t}\n\n\t/**\n\t * @description Get the base margin pool ID for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<string>} The base margin pool ID\n\t */\n\tasync getBaseMarginPoolId(poolKey: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.baseMarginPoolId(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst id = bcs.Address.parse(bytes);\n\t\treturn '0x' + id;\n\t}\n\n\t/**\n\t * @description Get the quote margin pool ID for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<string>} The quote margin pool ID\n\t */\n\tasync getQuoteMarginPoolId(poolKey: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.quoteMarginPoolId(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst id = bcs.Address.parse(bytes);\n\t\treturn '0x' + id;\n\t}\n\n\t/**\n\t * @description Get the minimum withdraw risk ratio for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The minimum withdraw risk ratio as a decimal (e.g., 1.5 for 150%)\n\t */\n\tasync getMinWithdrawRiskRatio(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.minWithdrawRiskRatio(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst ratio = Number(bcs.U64.parse(bytes));\n\t\treturn ratio / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the minimum borrow risk ratio for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The minimum borrow risk ratio as a decimal (e.g., 1.25 for 125%)\n\t */\n\tasync getMinBorrowRiskRatio(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.minBorrowRiskRatio(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst ratio = Number(bcs.U64.parse(bytes));\n\t\treturn ratio / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the liquidation risk ratio for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The liquidation risk ratio as a decimal (e.g., 1.125 for 112.5%)\n\t */\n\tasync getLiquidationRiskRatio(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.liquidationRiskRatio(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst ratio = Number(bcs.U64.parse(bytes));\n\t\treturn ratio / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the target liquidation risk ratio for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The target liquidation risk ratio as a decimal (e.g., 1.25 for 125%)\n\t */\n\tasync getTargetLiquidationRiskRatio(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.targetLiquidationRiskRatio(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst ratio = Number(bcs.U64.parse(bytes));\n\t\treturn ratio / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the user liquidation reward for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The user liquidation reward as a decimal (e.g., 0.05 for 5%)\n\t */\n\tasync getUserLiquidationReward(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.userLiquidationReward(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst reward = Number(bcs.U64.parse(bytes));\n\t\treturn reward / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the pool liquidation reward for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The pool liquidation reward as a decimal (e.g., 0.05 for 5%)\n\t */\n\tasync getPoolLiquidationReward(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.poolLiquidationReward(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst reward = Number(bcs.U64.parse(bytes));\n\t\treturn reward / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get all allowed maintainer cap IDs\n\t * @returns {Promise<string[]>} Array of allowed maintainer cap IDs\n\t */\n\tasync getAllowedMaintainers(): Promise<string[]> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.allowedMaintainers());\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst vecSet = VecSet(bcs.Address).parse(bytes);\n\t\treturn vecSet.contents.map((id) => normalizeSuiAddress(id));\n\t}\n\n\t/**\n\t * @description Get all allowed pause cap IDs\n\t * @returns {Promise<string[]>} Array of allowed pause cap IDs\n\t */\n\tasync getAllowedPauseCaps(): Promise<string[]> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.allowedPauseCaps());\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst vecSet = VecSet(bcs.Address).parse(bytes);\n\t\treturn vecSet.contents.map((id) => normalizeSuiAddress(id));\n\t}\n\n\t/**\n\t * @description Check if a pool is a stable pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<boolean>} Whether the pool is a stable pool\n\t */\n\tasync stablePool(poolKey: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.stablePool(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if a pool is registered\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<boolean>} Whether the pool is registered\n\t */\n\tasync registeredPool(poolKey: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.registeredPool(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the quote quantity out using input token as fee\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity\n\t * @returns {Promise<{baseQuantity: number, baseOut: number, quoteOut: number, deepRequired: number}>}\n\t */\n\tasync getQuoteQuantityOutInputFee(poolKey: string, baseQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuoteQuantityOutInputFee(poolKey, baseQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the base quantity out using input token as fee\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} quoteQuantity Quote quantity\n\t * @returns {Promise<{quoteQuantity: number, baseOut: number, quoteOut: number, deepRequired: number}>}\n\t */\n\tasync getBaseQuantityOutInputFee(poolKey: string, quoteQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getBaseQuantityOutInputFee(poolKey, quoteQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tquoteQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the quantity out using input token as fee\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity\n\t * @param {number} quoteQuantity Quote quantity\n\t * @returns {Promise<{baseQuantity: number, quoteQuantity: number, baseOut: number, quoteOut: number, deepRequired: number}>}\n\t */\n\tasync getQuantityOutInputFee(poolKey: string, baseQuantity: number, quoteQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuantityOutInputFee(poolKey, baseQuantity, quoteQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseQuantity,\n\t\t\tquoteQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the base quantity needed to receive target quote quantity\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} targetQuoteQuantity Target quote quantity\n\t * @param {boolean} payWithDeep Whether to pay fees with DEEP\n\t * @returns {Promise<{baseIn: number, quoteOut: number, deepRequired: number}>}\n\t */\n\tasync getBaseQuantityIn(poolKey: string, targetQuoteQuantity: number, payWithDeep: boolean) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getBaseQuantityIn(poolKey, targetQuoteQuantity, payWithDeep));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseIn = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseIn: Number((baseIn / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the quote quantity needed to receive target base quantity\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} targetBaseQuantity Target base quantity\n\t * @param {boolean} payWithDeep Whether to pay fees with DEEP\n\t * @returns {Promise<{baseOut: number, quoteIn: number, deepRequired: number}>}\n\t */\n\tasync getQuoteQuantityIn(poolKey: string, targetBaseQuantity: number, payWithDeep: boolean) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuoteQuantityIn(poolKey, targetBaseQuantity, payWithDeep));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteIn = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteIn: Number((quoteIn / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get account order details for a balance manager\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey Key of the balance manager\n\t * @returns {Promise<Array>} Array of order details\n\t */\n\tasync getAccountOrderDetails(poolKey: string, managerKey: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getAccountOrderDetails(poolKey, managerKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst orderInformation = res.commandResults![0].returnValues[0].bcs;\n\t\t\treturn bcs.vector(Order).parse(new Uint8Array(orderInformation));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * @description Get the DEEP required for an order\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity\n\t * @param {number} price Price\n\t * @returns {Promise<{deepRequiredTaker: number, deepRequiredMaker: number}>}\n\t */\n\tasync getOrderDeepRequired(poolKey: string, baseQuantity: number, price: number) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getOrderDeepRequired(poolKey, baseQuantity, price));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst deepRequiredTaker = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst deepRequiredMaker = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\n\t\treturn {\n\t\t\tdeepRequiredTaker: Number((deepRequiredTaker / DEEP_SCALAR).toFixed(9)),\n\t\t\tdeepRequiredMaker: Number((deepRequiredMaker / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Check if account exists for a balance manager\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey Key of the balance manager\n\t * @returns {Promise<boolean>} Whether account exists\n\t */\n\tasync accountExists(poolKey: string, managerKey: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.accountExists(poolKey, managerKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the next epoch trade parameters\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{takerFee: number, makerFee: number, stakeRequired: number}>}\n\t */\n\tasync poolTradeParamsNext(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.poolTradeParamsNext(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst takerFee = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst makerFee = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst stakeRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\ttakerFee: takerFee / FLOAT_SCALAR,\n\t\t\tmakerFee: makerFee / FLOAT_SCALAR,\n\t\t\tstakeRequired: stakeRequired / DEEP_SCALAR,\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the quorum for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<number>} The quorum amount in DEEP\n\t */\n\tasync quorum(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.quorum(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst quorum = Number(bcs.U64.parse(bytes));\n\t\treturn quorum / DEEP_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the pool ID\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<string>} The pool ID\n\t */\n\tasync poolId(poolKey: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.poolId(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn normalizeSuiAddress(bcs.Address.parse(bytes));\n\t}\n\n\t/**\n\t * @description Check if a limit order can be placed\n\t * @param {CanPlaceLimitOrderParams} params Parameters for checking limit order placement\n\t * @returns {Promise<boolean>} Whether order can be placed\n\t */\n\tasync canPlaceLimitOrder(params: CanPlaceLimitOrderParams): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.canPlaceLimitOrder(params));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if a market order can be placed\n\t * @param {CanPlaceMarketOrderParams} params Parameters for checking market order placement\n\t * @returns {Promise<boolean>} Whether order can be placed\n\t */\n\tasync canPlaceMarketOrder(params: CanPlaceMarketOrderParams): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.canPlaceMarketOrder(params));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if market order params are valid\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} quantity Quantity\n\t * @returns {Promise<boolean>} Whether params are valid\n\t */\n\tasync checkMarketOrderParams(poolKey: string, quantity: number): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.checkMarketOrderParams(poolKey, quantity));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if limit order params are valid\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} price Price\n\t * @param {number} quantity Quantity\n\t * @param {number} expireTimestamp Expiration timestamp\n\t * @returns {Promise<boolean>} Whether params are valid\n\t */\n\tasync checkLimitOrderParams(\n\t\tpoolKey: string,\n\t\tprice: number,\n\t\tquantity: number,\n\t\texpireTimestamp: number,\n\t): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.checkLimitOrderParams(poolKey, price, quantity, expireTimestamp));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Helper function to format token amounts without floating point errors\n\t * @param {bigint} rawAmount The raw amount as bigint\n\t * @param {number} scalar The token scalar (e.g., 1000000000 for 9 decimals)\n\t * @param {number} decimals Number of decimal places to show\n\t * @returns {string} Formatted amount as string\n\t */\n\t#formatTokenAmount(rawAmount: bigint, scalar: number, decimals: number): string {\n\t\tconst scalarBigInt = BigInt(scalar);\n\t\tconst integerPart = rawAmount / scalarBigInt;\n\t\tconst fractionalPart = rawAmount % scalarBigInt;\n\n\t\t// If no fractional part, return just the integer\n\t\tif (fractionalPart === 0n) {\n\t\t\treturn integerPart.toString();\n\t\t}\n\n\t\t// Convert fractional part to string with leading zeros\n\t\tconst scalarDigits = scalar.toString().length - 1;\n\t\tconst fractionalStr = fractionalPart.toString().padStart(scalarDigits, '0');\n\n\t\t// Truncate to desired decimal places\n\t\tconst truncated = fractionalStr.slice(0, decimals);\n\n\t\t// Remove trailing zeros for cleaner output\n\t\tconst trimmed = truncated.replace(/0+$/, '');\n\n\t\t// If nothing left after trimming, return just integer\n\t\tif (!trimmed) {\n\t\t\treturn integerPart.toString();\n\t\t}\n\n\t\treturn `${integerPart}.${trimmed}`;\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.mjs","names":["#client","#address","#config","#formatTokenAmount"],"sources":["../src/client.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { bcs } from '@mysten/sui/bcs';\nimport { Account, Order, OrderDeepPrice, VecSet } from './types/bcs.js';\nimport type { ClientWithCoreApi, SuiClientRegistration, SuiClientTypes } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport { BalanceManagerContract } from './transactions/balanceManager.js';\nimport { DeepBookContract } from './transactions/deepbook.js';\nimport { DeepBookAdminContract } from './transactions/deepbookAdmin.js';\nimport { FlashLoanContract } from './transactions/flashLoans.js';\nimport { GovernanceContract } from './transactions/governance.js';\nimport type {\n\tBalanceManager,\n\tMarginManager,\n\tCanPlaceLimitOrderParams,\n\tCanPlaceMarketOrderParams,\n} from './types/index.js';\nimport {\n\tDEEP_SCALAR,\n\tDeepBookConfig,\n\tFLOAT_SCALAR,\n\tPRICE_INFO_OBJECT_MAX_AGE_MS,\n} from './utils/config.js';\nimport type { CoinMap, PoolMap } from './utils/constants.js';\nimport { MarginAdminContract } from './transactions/marginAdmin.js';\nimport { MarginMaintainerContract } from './transactions/marginMaintainer.js';\nimport { MarginPoolContract } from './transactions/marginPool.js';\nimport { MarginManagerContract } from './transactions/marginManager.js';\nimport { MarginRegistryContract } from './transactions/marginRegistry.js';\nimport { MarginLiquidationsContract } from './transactions/marginLiquidations.js';\nimport { SuiPriceServiceConnection } from './pyth/pyth.js';\nimport { SuiPythClient } from './pyth/pyth.js';\nimport { PriceInfoObject } from './contracts/pyth/price_info.js';\nimport { PoolProxyContract } from './transactions/poolProxy.js';\nimport { MarginTPSLContract } from './transactions/marginTPSL.js';\n\nexport interface DeepBookCompatibleClient extends ClientWithCoreApi {}\n\nexport interface DeepBookOptions<Name = 'deepbook'> {\n\taddress: string;\n\tbalanceManagers?: { [key: string]: BalanceManager };\n\tmarginManagers?: { [key: string]: MarginManager };\n\tcoins?: CoinMap;\n\tpools?: PoolMap;\n\tadminCap?: string;\n\tmarginAdminCap?: string;\n\tmarginMaintainerCap?: string;\n\tname?: Name;\n}\n\nexport interface DeepBookClientOptions extends DeepBookOptions {\n\tclient: DeepBookCompatibleClient;\n\tnetwork: SuiClientTypes.Network;\n}\n\nexport function deepbook<Name extends string = 'deepbook'>({\n\tname = 'deepbook' as Name,\n\t...options\n}: DeepBookOptions<Name>): SuiClientRegistration<DeepBookCompatibleClient, Name, DeepBookClient> {\n\treturn {\n\t\tname,\n\t\tregister: (client) => {\n\t\t\treturn new DeepBookClient({\n\t\t\t\tclient,\n\t\t\t\tnetwork: client.network,\n\t\t\t\t...options,\n\t\t\t});\n\t\t},\n\t};\n}\n\n/**\n * DeepBookClient class for managing DeepBook operations.\n */\nexport class DeepBookClient {\n\t#client: DeepBookCompatibleClient;\n\t#config: DeepBookConfig;\n\t#address: string;\n\tbalanceManager: BalanceManagerContract;\n\tdeepBook: DeepBookContract;\n\tdeepBookAdmin: DeepBookAdminContract;\n\tflashLoans: FlashLoanContract;\n\tgovernance: GovernanceContract;\n\tmarginAdmin: MarginAdminContract;\n\tmarginMaintainer: MarginMaintainerContract;\n\tmarginPool: MarginPoolContract;\n\tmarginManager: MarginManagerContract;\n\tmarginRegistry: MarginRegistryContract;\n\tmarginLiquidations: MarginLiquidationsContract;\n\tpoolProxy: PoolProxyContract;\n\tmarginTPSL: MarginTPSLContract;\n\n\t/**\n\t * Creates a new DeepBookClient instance\n\t */\n\tconstructor({\n\t\tclient,\n\t\taddress,\n\t\tnetwork,\n\t\tbalanceManagers,\n\t\tmarginManagers,\n\t\tcoins,\n\t\tpools,\n\t\tadminCap,\n\t\tmarginAdminCap,\n\t\tmarginMaintainerCap,\n\t}: DeepBookClientOptions) {\n\t\tthis.#client = client;\n\t\tthis.#address = normalizeSuiAddress(address);\n\t\tthis.#config = new DeepBookConfig({\n\t\t\taddress: this.#address,\n\t\t\tnetwork,\n\t\t\tbalanceManagers,\n\t\t\tmarginManagers,\n\t\t\tcoins,\n\t\t\tpools,\n\t\t\tadminCap,\n\t\t\tmarginAdminCap,\n\t\t\tmarginMaintainerCap,\n\t\t});\n\t\tthis.balanceManager = new BalanceManagerContract(this.#config);\n\t\tthis.deepBook = new DeepBookContract(this.#config);\n\t\tthis.deepBookAdmin = new DeepBookAdminContract(this.#config);\n\t\tthis.flashLoans = new FlashLoanContract(this.#config);\n\t\tthis.governance = new GovernanceContract(this.#config);\n\t\tthis.marginAdmin = new MarginAdminContract(this.#config);\n\t\tthis.marginMaintainer = new MarginMaintainerContract(this.#config);\n\t\tthis.marginPool = new MarginPoolContract(this.#config);\n\t\tthis.marginManager = new MarginManagerContract(this.#config);\n\t\tthis.marginRegistry = new MarginRegistryContract(this.#config);\n\t\tthis.marginLiquidations = new MarginLiquidationsContract(this.#config);\n\t\tthis.poolProxy = new PoolProxyContract(this.#config);\n\t\tthis.marginTPSL = new MarginTPSLContract(this.#config);\n\t}\n\n\t/**\n\t * @description Check the balance of a balance manager for a specific coin\n\t * @param {string} managerKey Key of the balance manager\n\t * @param {string} coinKey Key of the coin\n\t * @returns {Promise<{ coinType: string, balance: number }>} An object with coin type and balance\n\t */\n\tasync checkManagerBalance(managerKey: string, coinKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst coin = this.#config.getCoin(coinKey);\n\n\t\ttx.add(this.balanceManager.checkManagerBalance(managerKey, coinKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst parsed_balance = bcs.U64.parse(bytes);\n\t\tconst balanceNumber = Number(parsed_balance);\n\t\tconst adjusted_balance = balanceNumber / coin.scalar;\n\n\t\treturn {\n\t\t\tcoinType: coin.type,\n\t\t\tbalance: Number(adjusted_balance.toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Check the balance of a BalanceManager by its address directly\n\t * @param {string} managerAddress The on-chain address of the BalanceManager\n\t * @param {string} coinKey Key of the coin\n\t * @returns {Promise<{ coinType: string, balance: number }>} An object with coin type and balance\n\t */\n\tasync checkManagerBalanceWithAddress(managerAddress: string, coinKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst coin = this.#config.getCoin(coinKey);\n\n\t\ttx.moveCall({\n\t\t\ttarget: `${this.#config.DEEPBOOK_PACKAGE_ID}::balance_manager::balance`,\n\t\t\targuments: [tx.object(managerAddress)],\n\t\t\ttypeArguments: [coin.type],\n\t\t});\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst parsed_balance = bcs.U64.parse(bytes);\n\t\tconst balanceNumber = Number(parsed_balance);\n\t\tconst adjusted_balance = balanceNumber / coin.scalar;\n\n\t\treturn {\n\t\t\tcoinType: coin.type,\n\t\t\tbalance: Number(adjusted_balance.toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Check multiple coin balances for multiple balance managers by address in a single dry run call\n\t * @param {string[]} managerAddresses The on-chain addresses of the BalanceManagers\n\t * @param {string[]} coinKeys Keys of the coins to check balances for\n\t * @returns {Promise<Record<string, Record<string, number>>>} Object keyed by manager address, mapping coinType to balance\n\t */\n\tasync checkManagerBalancesWithAddress(managerAddresses: string[], coinKeys: string[]) {\n\t\tif (managerAddresses.length === 0 || coinKeys.length === 0) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst tx = new Transaction();\n\t\tconst coins = coinKeys.map((coinKey) => this.#config.getCoin(coinKey));\n\n\t\tfor (const managerAddress of managerAddresses) {\n\t\t\tfor (const coin of coins) {\n\t\t\t\ttx.moveCall({\n\t\t\t\t\ttarget: `${this.#config.DEEPBOOK_PACKAGE_ID}::balance_manager::balance`,\n\t\t\t\t\targuments: [tx.object(managerAddress)],\n\t\t\t\t\ttypeArguments: [coin.type],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults) {\n\t\t\tthrow new Error('Failed to get manager balances: No command results');\n\t\t}\n\n\t\tconst results: Record<string, Record<string, number>> = {};\n\n\t\tfor (let m = 0; m < managerAddresses.length; m++) {\n\t\t\tconst managerAddress = managerAddresses[m];\n\t\t\tconst managerBalances: Record<string, number> = {};\n\n\t\t\tfor (let c = 0; c < coins.length; c++) {\n\t\t\t\tconst coin = coins[c];\n\t\t\t\tconst commandResult = res.commandResults[m * coins.length + c];\n\n\t\t\t\tif (!commandResult || !commandResult.returnValues) {\n\t\t\t\t\tthrow new Error(`Failed to get balance for ${coin.type}: No return values`);\n\t\t\t\t}\n\n\t\t\t\tconst bytes = commandResult.returnValues[0].bcs;\n\t\t\t\tconst parsed_balance = bcs.U64.parse(bytes);\n\t\t\t\tmanagerBalances[coin.type] = Number((Number(parsed_balance) / coin.scalar).toFixed(9));\n\t\t\t}\n\n\t\t\tresults[managerAddress] = managerBalances;\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * @description Check if a pool is whitelisted\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<boolean>} Boolean indicating if the pool is whitelisted\n\t */\n\tasync whitelisted(poolKey: string) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.whitelisted(poolKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst whitelisted = bcs.Bool.parse(bytes);\n\n\t\treturn whitelisted;\n\t}\n\n\t/**\n\t * @description Get the quote quantity out for a given base quantity\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity to convert\n\t * @returns {Promise<{ baseQuantity: number, baseOut: number, quoteOut: number, deepRequired: number }>}\n\t * An object with base quantity, base out, quote out, and deep required for the dry run\n\t */\n\tasync getQuoteQuantityOut(poolKey: string, baseQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuoteQuantityOut(poolKey, baseQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the base quantity out for a given quote quantity\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} quoteQuantity Quote quantity to convert\n\t * @returns {Promise<{ quoteQuantity: number, baseOut: number, quoteOut: number, deepRequired: number }>}\n\t * An object with quote quantity, base out, quote out, and deep required for the dry run\n\t */\n\tasync getBaseQuantityOut(poolKey: string, quoteQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getBaseQuantityOut(poolKey, quoteQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tquoteQuantity: quoteQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the output quantities for given base and quote quantities. Only one quantity can be non-zero\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity to convert\n\t * @param {number} quoteQuantity Quote quantity to convert\n\t * @returns {Promise<{ baseQuantity: number, quoteQuantity: number, baseOut: number, quoteOut: number, deepRequired: number }>}\n\t * An object with base quantity, quote quantity, base out, quote out, and deep required for the dry run\n\t */\n\tasync getQuantityOut(poolKey: string, baseQuantity: number, quoteQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuantityOut(poolKey, baseQuantity, quoteQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseQuantity,\n\t\t\tquoteQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get open orders for a balance manager in a pool\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey Key of the balance manager\n\t * @returns {Promise<Array>} An array of open order IDs\n\t */\n\tasync accountOpenOrders(poolKey: string, managerKey: string) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.accountOpenOrders(poolKey, managerKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst order_ids = res.commandResults![0].returnValues[0].bcs;\n\n\t\treturn VecSet(bcs.u128()).parse(new Uint8Array(order_ids)).contents;\n\t}\n\n\t/**\n\t * @description Get the order information for a specific order in a pool\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} orderId Order ID\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the order information\n\t */\n\tasync getOrder(poolKey: string, orderId: string) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.getOrder(poolKey, orderId));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst orderInformation = res.commandResults![0].returnValues[0].bcs;\n\t\t\treturn Order.parse(new Uint8Array(orderInformation));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * @description Get the order information for a specific order in a pool, with normalized price\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} orderId Order ID\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the order information with normalized price\n\t */\n\tasync getOrderNormalized(poolKey: string, orderId: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getOrder(poolKey, orderId));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst orderInformation = res.commandResults![0].returnValues[0].bcs;\n\t\t\tconst orderInfo = Order.parse(new Uint8Array(orderInformation));\n\n\t\t\tif (!orderInfo) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst baseCoin = this.#config.getCoin(this.#config.getPool(poolKey).baseCoin);\n\t\t\tconst quoteCoin = this.#config.getCoin(this.#config.getPool(poolKey).quoteCoin);\n\t\t\tconst { isBid, price: rawPrice } = this.decodeOrderId(BigInt(orderInfo.order_id));\n\t\t\tconst normalizedPrice = (rawPrice * baseCoin.scalar) / quoteCoin.scalar / FLOAT_SCALAR;\n\n\t\t\tconst normalizedOrderInfo = {\n\t\t\t\t...orderInfo,\n\t\t\t\tquantity: String((Number(orderInfo.quantity) / baseCoin.scalar).toFixed(9)),\n\t\t\t\tfilled_quantity: String((Number(orderInfo.filled_quantity) / baseCoin.scalar).toFixed(9)),\n\t\t\t\torder_deep_price: {\n\t\t\t\t\t...orderInfo.order_deep_price,\n\t\t\t\t\tdeep_per_asset: String(\n\t\t\t\t\t\t(Number(orderInfo.order_deep_price.deep_per_asset) / DEEP_SCALAR).toFixed(9),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tisBid,\n\t\t\t\tnormalized_price: normalizedPrice.toFixed(9),\n\t\t\t};\n\t\t\treturn normalizedOrderInfo;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * @description Retrieves information for multiple specific orders in a pool.\n\t * @param {string} poolKey - The key identifying the pool from which to retrieve order information.\n\t * @param {string[]} orderIds - List of order IDs to retrieve information for.\n\t * @returns {Promise<Object[] | null>} A promise that resolves to an array of order objects, each containing details such as\n\t * balance manager ID, order ID, client order ID, quantity, filled quantity, fee information, order price, epoch, status,\n\t * and expiration timestamp. Returns `null` if the retrieval fails.\n\t */\n\tasync getOrders(poolKey: string, orderIds: string[]) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.getOrders(poolKey, orderIds));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst orderInformation = res.commandResults![0].returnValues[0].bcs;\n\t\t\treturn bcs.vector(Order).parse(new Uint8Array(orderInformation));\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * @description Get level 2 order book specifying range of price\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} priceLow Lower bound of the price range\n\t * @param {number} priceHigh Upper bound of the price range\n\t * @param {boolean} isBid Whether to get bid or ask orders\n\t * @returns {Promise<{ prices: Array<number>, quantities: Array<number> }>}\n\t * An object with arrays of prices and quantities\n\t */\n\tasync getLevel2Range(poolKey: string, priceLow: number, priceHigh: number, isBid: boolean) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\ttx.add(this.deepBook.getLevel2Range(poolKey, priceLow, priceHigh, isBid));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst prices = res.commandResults![0].returnValues[0].bcs;\n\t\tconst parsed_prices = bcs.vector(bcs.u64()).parse(new Uint8Array(prices));\n\t\tconst quantities = res.commandResults![0].returnValues[1].bcs;\n\t\tconst parsed_quantities = bcs.vector(bcs.u64()).parse(new Uint8Array(quantities));\n\n\t\treturn {\n\t\t\tprices: parsed_prices.map((price) =>\n\t\t\t\tNumber(((Number(price) / FLOAT_SCALAR / quoteCoin.scalar) * baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t\tquantities: parsed_quantities.map((price) =>\n\t\t\t\tNumber((Number(price) / baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get level 2 order book ticks from mid-price for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} ticks Number of ticks from mid-price\n\t * @returns {Promise<{ bid_prices: Array<number>, bid_quantities: Array<number>, ask_prices: Array<number>, ask_quantities: Array<number> }>}\n\t * An object with arrays of prices and quantities\n\t */\n\tasync getLevel2TicksFromMid(poolKey: string, ticks: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\ttx.add(this.deepBook.getLevel2TicksFromMid(poolKey, ticks));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bid_prices = res.commandResults![0].returnValues[0].bcs;\n\t\tconst bid_parsed_prices = bcs.vector(bcs.u64()).parse(new Uint8Array(bid_prices));\n\t\tconst bid_quantities = res.commandResults![0].returnValues[1].bcs;\n\t\tconst bid_parsed_quantities = bcs.vector(bcs.u64()).parse(new Uint8Array(bid_quantities));\n\n\t\tconst ask_prices = res.commandResults![0].returnValues[2].bcs;\n\t\tconst ask_parsed_prices = bcs.vector(bcs.u64()).parse(new Uint8Array(ask_prices));\n\t\tconst ask_quantities = res.commandResults![0].returnValues[3].bcs;\n\t\tconst ask_parsed_quantities = bcs.vector(bcs.u64()).parse(new Uint8Array(ask_quantities));\n\n\t\treturn {\n\t\t\tbid_prices: bid_parsed_prices.map((price) =>\n\t\t\t\tNumber(((Number(price) / FLOAT_SCALAR / quoteCoin.scalar) * baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t\tbid_quantities: bid_parsed_quantities.map((quantity) =>\n\t\t\t\tNumber((Number(quantity) / baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t\task_prices: ask_parsed_prices.map((price) =>\n\t\t\t\tNumber(((Number(price) / FLOAT_SCALAR / quoteCoin.scalar) * baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t\task_quantities: ask_parsed_quantities.map((quantity) =>\n\t\t\t\tNumber((Number(quantity) / baseCoin.scalar).toFixed(9)),\n\t\t\t),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the vault balances for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{ base: number, quote: number, deep: number }>}\n\t * An object with base, quote, and deep balances in the vault\n\t */\n\tasync vaultBalances(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.vaultBalances(poolKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseInVault = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteInVault = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepInVault = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbase: Number((baseInVault / baseScalar).toFixed(9)),\n\t\t\tquote: Number((quoteInVault / quoteScalar).toFixed(9)),\n\t\t\tdeep: Number((deepInVault / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the pool ID by asset types\n\t * @param {string} baseType Type of the base asset\n\t * @param {string} quoteType Type of the quote asset\n\t * @returns {Promise<string>} The address of the pool\n\t */\n\tasync getPoolIdByAssets(baseType: string, quoteType: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getPoolIdByAssets(baseType, quoteType));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst address = bcs.Address.parse(res.commandResults![0].returnValues[0].bcs);\n\n\t\treturn address;\n\t}\n\n\t/**\n\t * @description Get the mid price for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<number>} The mid price\n\t */\n\tasync midPrice(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\ttx.add(this.deepBook.midPrice(poolKey));\n\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst parsed_mid_price = Number(bcs.U64.parse(bytes));\n\t\tconst adjusted_mid_price =\n\t\t\t(parsed_mid_price * baseCoin.scalar) / quoteCoin.scalar / FLOAT_SCALAR;\n\n\t\treturn Number(adjusted_mid_price.toFixed(9));\n\t}\n\n\t/**\n\t * @description Get the trade parameters for a given pool, including taker fee, maker fee, and stake required.\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{ takerFee: number, makerFee: number, stakeRequired: number }>}\n\t */\n\tasync poolTradeParams(poolKey: string) {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.poolTradeParams(poolKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst takerFee = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst makerFee = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst stakeRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\ttakerFee: Number(takerFee / FLOAT_SCALAR),\n\t\t\tmakerFee: Number(makerFee / FLOAT_SCALAR),\n\t\t\tstakeRequired: Number(stakeRequired / DEEP_SCALAR),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the trade parameters for a given pool, including tick size, lot size, and min size.\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{ tickSize: number, lotSize: number, minSize: number }>}\n\t */\n\tasync poolBookParams(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.poolBookParams(poolKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst tickSize = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst lotSize = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst minSize = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\ttickSize: Number((tickSize * baseScalar) / quoteScalar / FLOAT_SCALAR),\n\t\t\tlotSize: Number(lotSize / baseScalar),\n\t\t\tminSize: Number(minSize / baseScalar),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the account information for a given pool and balance manager\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey The key of the BalanceManager\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the account information\n\t */\n\tasync account(poolKey: string, managerKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.account(poolKey, managerKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst accountInformation = res.commandResults![0].returnValues[0].bcs;\n\t\tconst accountInfo = Account.parse(new Uint8Array(accountInformation));\n\n\t\treturn {\n\t\t\tepoch: accountInfo.epoch,\n\t\t\topen_orders: accountInfo.open_orders,\n\t\t\ttaker_volume: Number(accountInfo.taker_volume) / baseScalar,\n\t\t\tmaker_volume: Number(accountInfo.maker_volume) / baseScalar,\n\t\t\tactive_stake: Number(accountInfo.active_stake) / DEEP_SCALAR,\n\t\t\tinactive_stake: Number(accountInfo.inactive_stake) / DEEP_SCALAR,\n\t\t\tcreated_proposal: accountInfo.created_proposal,\n\t\t\tvoted_proposal: accountInfo.voted_proposal,\n\t\t\tunclaimed_rebates: {\n\t\t\t\tbase: Number(accountInfo.unclaimed_rebates.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.unclaimed_rebates.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.unclaimed_rebates.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t\tsettled_balances: {\n\t\t\t\tbase: Number(accountInfo.settled_balances.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.settled_balances.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.settled_balances.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t\towed_balances: {\n\t\t\t\tbase: Number(accountInfo.owed_balances.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.owed_balances.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.owed_balances.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the locked balances for a pool and balance manager\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey The key of the BalanceManager\n\t * @returns {Promise<{ base: number, quote: number, deep: number }>}\n\t * An object with base, quote, and deep locked for the balance manager in the pool\n\t */\n\tasync lockedBalance(poolKey: string, balanceManagerKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.lockedBalance(poolKey, balanceManagerKey));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbase: Number((baseLocked / baseScalar).toFixed(9)),\n\t\t\tquote: Number((quoteLocked / quoteScalar).toFixed(9)),\n\t\t\tdeep: Number((deepLocked / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the DEEP price conversion for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{ asset_is_base: bool, deep_per_quote: number }>} Deep price conversion\n\t */\n\tasync getPoolDeepPrice(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\ttx.add(this.deepBook.getPoolDeepPrice(poolKey));\n\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\t\tconst deepCoin = this.#config.getCoin('DEEP');\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst poolDeepPriceBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst poolDeepPrice = OrderDeepPrice.parse(new Uint8Array(poolDeepPriceBytes));\n\n\t\tif (poolDeepPrice.asset_is_base) {\n\t\t\treturn {\n\t\t\t\tasset_is_base: poolDeepPrice.asset_is_base,\n\t\t\t\tdeep_per_base:\n\t\t\t\t\t((Number(poolDeepPrice.deep_per_asset) / FLOAT_SCALAR) * baseCoin.scalar) /\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tasset_is_base: poolDeepPrice.asset_is_base,\n\t\t\t\tdeep_per_quote:\n\t\t\t\t\t((Number(poolDeepPrice.deep_per_asset) / FLOAT_SCALAR) * quoteCoin.scalar) /\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * @description Decode the order ID to get bid/ask status, price, and orderId\n\t * @param {bigint} encodedOrderId Encoded order ID\n\t * @returns {Object} Object containing isBid, price, and orderId\n\t */\n\tdecodeOrderId(encodedOrderId: bigint): { isBid: boolean; price: number; orderId: number } {\n\t\tconst isBid = encodedOrderId >> 127n === 0n;\n\t\tconst price = Number((encodedOrderId >> 64n) & ((1n << 63n) - 1n));\n\t\tconst orderId = Number(encodedOrderId & ((1n << 64n) - 1n));\n\n\t\treturn { isBid, price, orderId };\n\t}\n\n\t/**\n\t * @description Get all balance manager IDs for a given owner\n\t * @param {string} owner The owner address to get balance manager IDs for\n\t * @returns {Promise<string[]>} Array of balance manager ID strings\n\t */\n\tasync getBalanceManagerIds(owner: string): Promise<string[]> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getBalanceManagerIds(owner));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst vecOfAddresses = bcs.vector(bcs.Address).parse(bytes);\n\n\t\treturn vecOfAddresses.map((id: string) => normalizeSuiAddress(id));\n\t}\n\n\t/**\n\t * @description Get the owner of the referral (DeepBookPoolReferral)\n\t * @param {string} referral The ID of the referral to get the owner of\n\t * @returns {Promise<string>} The owner of the referral\n\t */\n\tasync balanceManagerReferralOwner(referral: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.balanceManager.balanceManagerReferralOwner(referral));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst owner = bcs.Address.parse(bytes);\n\n\t\treturn owner;\n\t}\n\n\t/**\n\t * @description Get the referral balances for a pool and referral (DeepBookPoolReferral)\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} referral The referral ID to get balances for\n\t * @returns {Promise<{ base: number, quote: number, deep: number }>} Object with base, quote, and deep balances\n\t */\n\tasync getPoolReferralBalances(\n\t\tpoolKey: string,\n\t\treferral: string,\n\t): Promise<{ base: number; quote: number; deep: number }> {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getPoolReferralBalances(poolKey, referral));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\t// The function returns three u64 values: (base, quote, deep)\n\t\tconst baseBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst quoteBytes = res.commandResults![0].returnValues[1].bcs;\n\t\tconst deepBytes = res.commandResults![0].returnValues[2].bcs;\n\n\t\tconst baseBalance = Number(bcs.U64.parse(baseBytes));\n\t\tconst quoteBalance = Number(bcs.U64.parse(quoteBytes));\n\t\tconst deepBalance = Number(bcs.U64.parse(deepBytes));\n\n\t\treturn {\n\t\t\tbase: baseBalance / baseScalar,\n\t\t\tquote: quoteBalance / quoteScalar,\n\t\t\tdeep: deepBalance / DEEP_SCALAR,\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the pool ID associated with a referral (DeepBookPoolReferral)\n\t * @param {string} referral The referral (DeepBookPoolReferral) to get the pool ID for\n\t * @returns {Promise<string>} The pool ID\n\t */\n\tasync balanceManagerReferralPoolId(referral: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.balanceManager.balanceManagerReferralPoolId(referral));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst poolId = bcs.Address.parse(bytes);\n\n\t\treturn normalizeSuiAddress(poolId);\n\t}\n\n\t/**\n\t * @description Get the multiplier for a referral (DeepBookPoolReferral)\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} referral The referral (DeepBookPoolReferral) to get the multiplier for\n\t * @returns {Promise<number>} The multiplier value\n\t */\n\tasync poolReferralMultiplier(poolKey: string, referral: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\n\t\ttx.add(this.deepBook.poolReferralMultiplier(poolKey, referral));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst multiplier = Number(bcs.U64.parse(bytes));\n\n\t\treturn multiplier / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the referral ID from a balance manager for a specific pool\n\t * @param {string} managerKey Key of the balance manager\n\t * @param {string} poolKey Key of the pool to get the referral for\n\t * @returns {Promise<string | null>} The referral ID or null if not set\n\t */\n\tasync getBalanceManagerReferralId(managerKey: string, poolKey: string): Promise<string | null> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.balanceManager.getBalanceManagerReferralId(managerKey, poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\t\tconst optionId = bcs.option(bcs.Address).parse(bytes);\n\t\t\tif (optionId === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn normalizeSuiAddress(optionId);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync getPriceInfoObject(tx: Transaction, coinKey: string): Promise<string> {\n\t\tconst currentTime = Date.now();\n\t\tconst priceInfoObjectAge = await this.getPriceInfoObjectAge(coinKey);\n\t\tif (\n\t\t\tpriceInfoObjectAge &&\n\t\t\tcurrentTime - priceInfoObjectAge * 1000 < PRICE_INFO_OBJECT_MAX_AGE_MS\n\t\t) {\n\t\t\treturn await this.#config.getCoin(coinKey).priceInfoObjectId!;\n\t\t}\n\n\t\t// Initialize connection to the Sui Price Service\n\t\tconst endpoint =\n\t\t\tthis.#config.network === 'testnet'\n\t\t\t\t? 'https://hermes-beta.pyth.network'\n\t\t\t\t: 'https://hermes.pyth.network';\n\t\tconst connection = new SuiPriceServiceConnection(endpoint);\n\n\t\t// List of price feed IDs\n\t\tconst priceIDs = [\n\t\t\tthis.#config.getCoin(coinKey).feed!, // ASSET/USD price ID\n\t\t];\n\n\t\t// Fetch price feed update data\n\t\tconst priceUpdateData = await connection.getPriceFeedsUpdateData(priceIDs);\n\n\t\t// Initialize Sui Client and Pyth Client\n\t\tconst wormholeStateId = this.#config.pyth.wormholeStateId;\n\t\tconst pythStateId = this.#config.pyth.pythStateId;\n\n\t\tconst client = new SuiPythClient(this.#client, pythStateId, wormholeStateId);\n\n\t\treturn (await client.updatePriceFeeds(tx, priceUpdateData, priceIDs))[0]; // returns priceInfoObjectIds\n\t}\n\n\t/**\n\t * @description Batch update price info objects for multiple coins. Only updates stale feeds.\n\t * This is more efficient than calling getPriceInfoObject multiple times as it:\n\t * 1. Batch fetches all price info object ages in one RPC call\n\t * 2. Fetches all stale price updates from Pyth in a single API call\n\t * @param {Transaction} tx Transaction to add price update commands to\n\t * @param {string[]} coinKeys Array of coin keys to update prices for\n\t * @returns {Promise<Record<string, string>>} Map of coinKey -> priceInfoObjectId\n\t */\n\tasync getPriceInfoObjects(tx: Transaction, coinKeys: string[]): Promise<Record<string, string>> {\n\t\tif (coinKeys.length === 0) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\n\t\t// Build map of coinKey -> priceInfoObjectId and collect all object IDs\n\t\tconst coinToObjectId: Record<string, string> = {};\n\t\tconst objectIds: string[] = [];\n\t\tfor (const coinKey of coinKeys) {\n\t\t\tconst priceInfoObjectId = this.#config.getCoin(coinKey).priceInfoObjectId!;\n\t\t\tcoinToObjectId[coinKey] = priceInfoObjectId;\n\t\t\tobjectIds.push(priceInfoObjectId);\n\t\t}\n\n\t\t// Batch fetch all price info objects in one RPC call\n\t\tconst res = await this.#client.core.getObjects({\n\t\t\tobjectIds,\n\t\t\tinclude: { content: true },\n\t\t});\n\n\t\t// Parse each object and determine which are stale\n\t\tconst staleCoinKeys: string[] = [];\n\t\tconst result: Record<string, string> = {};\n\n\t\tfor (let i = 0; i < coinKeys.length; i++) {\n\t\t\tconst coinKey = coinKeys[i];\n\t\t\tconst obj = res.objects[i];\n\n\t\t\tif (obj instanceof Error || !obj?.content) {\n\t\t\t\t// If we can't fetch the object, mark it as stale to force update\n\t\t\t\tstaleCoinKeys.push(coinKey);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst priceInfoObject = PriceInfoObject.parse(obj.content);\n\t\t\tconst arrivalTime = Number(priceInfoObject.price_info.arrival_time);\n\t\t\tconst age = currentTime - arrivalTime * 1000;\n\n\t\t\tif (age >= PRICE_INFO_OBJECT_MAX_AGE_MS) {\n\t\t\t\tstaleCoinKeys.push(coinKey);\n\t\t\t} else {\n\t\t\t\t// Fresh price, just return the existing object ID\n\t\t\t\tresult[coinKey] = coinToObjectId[coinKey];\n\t\t\t}\n\t\t}\n\n\t\t// If no stale feeds, return early\n\t\tif (staleCoinKeys.length === 0) {\n\t\t\treturn result;\n\t\t}\n\n\t\t// Collect all feed IDs for stale coins\n\t\tconst staleFeedIds: string[] = [];\n\t\tconst feedIdToCoinKey: Record<string, string> = {};\n\t\tfor (const coinKey of staleCoinKeys) {\n\t\t\tconst feedId = this.#config.getCoin(coinKey).feed!;\n\t\t\tstaleFeedIds.push(feedId);\n\t\t\tfeedIdToCoinKey[feedId] = coinKey;\n\t\t}\n\n\t\t// Initialize connection to the Sui Price Service\n\t\tconst endpoint =\n\t\t\tthis.#config.network === 'testnet'\n\t\t\t\t? 'https://hermes-beta.pyth.network'\n\t\t\t\t: 'https://hermes.pyth.network';\n\t\tconst connection = new SuiPriceServiceConnection(endpoint);\n\n\t\t// Fetch all stale price updates from Pyth in a single API call\n\t\tconst priceUpdateData = await connection.getPriceFeedsUpdateData(staleFeedIds);\n\n\t\t// Initialize Pyth Client\n\t\tconst wormholeStateId = this.#config.pyth.wormholeStateId;\n\t\tconst pythStateId = this.#config.pyth.pythStateId;\n\t\tconst pythClient = new SuiPythClient(this.#client, pythStateId, wormholeStateId);\n\n\t\t// Update all stale feeds in the transaction\n\t\tconst updatedObjectIds = await pythClient.updatePriceFeeds(tx, priceUpdateData, staleFeedIds);\n\n\t\t// Map the updated object IDs back to coin keys\n\t\tfor (let i = 0; i < staleFeedIds.length; i++) {\n\t\t\tconst coinKey = feedIdToCoinKey[staleFeedIds[i]];\n\t\t\tresult[coinKey] = updatedObjectIds[i];\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * @description Get the age of the price info object for a specific coin\n\t * @param {string} coinKey Key of the coin\n\t * @returns {Promise<number>} The arrival time of the price info object\n\t */\n\tasync getPriceInfoObjectAge(coinKey: string) {\n\t\tconst priceInfoObjectId = this.#config.getCoin(coinKey).priceInfoObjectId!;\n\t\tconst res = await this.#client.core.getObject({\n\t\t\tobjectId: priceInfoObjectId,\n\t\t\tinclude: {\n\t\t\t\tcontent: true,\n\t\t\t},\n\t\t});\n\n\t\tif (!res.object?.content) {\n\t\t\tthrow new Error(`Price info object not found for ${coinKey}`);\n\t\t}\n\n\t\tconst priceInfoObject = PriceInfoObject.parse(res.object.content);\n\t\treturn Number(priceInfoObject.price_info.arrival_time);\n\t}\n\n\t// === Margin Pool View Methods ===\n\n\t/**\n\t * @description Get the margin pool ID\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<string>} The margin pool ID\n\t */\n\tasync getMarginPoolId(coinKey: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.getId(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.Address.parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if a deepbook pool is allowed for borrowing from margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {string} deepbookPoolId The ID of the deepbook pool\n\t * @returns {Promise<boolean>} Whether the deepbook pool is allowed\n\t */\n\tasync isDeepbookPoolAllowed(coinKey: string, deepbookPoolId: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.deepbookPoolAllowed(coinKey, deepbookPoolId));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the total supply amount in the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The total supply amount as a string\n\t */\n\tasync getMarginPoolTotalSupply(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.totalSupply(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the total supply shares in the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The total supply shares as a string\n\t */\n\tasync getMarginPoolSupplyShares(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.supplyShares(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawShares = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawShares, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the total borrow amount in the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The total borrow amount as a string\n\t */\n\tasync getMarginPoolTotalBorrow(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.totalBorrow(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the total borrow shares in the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The total borrow shares as a string\n\t */\n\tasync getMarginPoolBorrowShares(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.borrowShares(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawShares = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawShares, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the last update timestamp of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<number>} The last update timestamp in milliseconds\n\t */\n\tasync getMarginPoolLastUpdateTimestamp(coinKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.lastUpdateTimestamp(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn Number(bcs.U64.parse(bytes));\n\t}\n\n\t/**\n\t * @description Get the supply cap of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The supply cap as a string\n\t */\n\tasync getMarginPoolSupplyCap(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.supplyCap(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the max utilization rate of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<number>} The max utilization rate (as a decimal, e.g., 0.95 for 95%)\n\t */\n\tasync getMarginPoolMaxUtilizationRate(coinKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.maxUtilizationRate(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawRate = Number(bcs.U64.parse(bytes));\n\t\treturn rawRate / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the protocol spread of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<number>} The protocol spread (as a decimal)\n\t */\n\tasync getMarginPoolProtocolSpread(coinKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.protocolSpread(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawSpread = Number(bcs.U64.parse(bytes));\n\t\treturn rawSpread / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the minimum borrow amount for the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The minimum borrow amount as a string\n\t */\n\tasync getMarginPoolMinBorrow(coinKey: string, decimals: number = 6): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.minBorrow(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the current interest rate of the margin pool\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @returns {Promise<number>} The current interest rate (as a decimal)\n\t */\n\tasync getMarginPoolInterestRate(coinKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.interestRate(coinKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawRate = Number(bcs.U64.parse(bytes));\n\t\treturn rawRate / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get user supply shares for a supplier cap\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {string} supplierCapId The ID of the supplier cap\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The user's supply shares as a string\n\t */\n\tasync getUserSupplyShares(\n\t\tcoinKey: string,\n\t\tsupplierCapId: string,\n\t\tdecimals: number = 6,\n\t): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.userSupplyShares(coinKey, supplierCapId));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawShares = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawShares, coin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get user supply amount for a supplier cap\n\t * @param {string} coinKey The key to identify the margin pool\n\t * @param {string} supplierCapId The ID of the supplier cap\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The user's supply amount as a string\n\t */\n\tasync getUserSupplyAmount(\n\t\tcoinKey: string,\n\t\tsupplierCapId: string,\n\t\tdecimals: number = 6,\n\t): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginPool.userSupplyAmount(coinKey, supplierCapId));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst rawAmount = BigInt(bcs.U64.parse(bytes));\n\t\tconst coin = this.#config.getCoin(coinKey);\n\t\treturn this.#formatTokenAmount(rawAmount, coin.scalar, decimals);\n\t}\n\n\t// === Margin Manager Read-Only Functions ===\n\n\t/**\n\t * @description Get the owner address of a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The owner address\n\t */\n\tasync getMarginManagerOwner(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.ownerByPoolKey(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn normalizeSuiAddress(bcs.Address.parse(bytes));\n\t}\n\n\t/**\n\t * @description Get the DeepBook pool ID associated with a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The DeepBook pool ID\n\t */\n\tasync getMarginManagerDeepbookPool(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.deepbookPool(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn normalizeSuiAddress(bcs.Address.parse(bytes));\n\t}\n\n\t/**\n\t * @description Get the margin pool ID (if any) associated with a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string | null>} The margin pool ID or null if no active loan\n\t */\n\tasync getMarginManagerMarginPoolId(marginManagerKey: string): Promise<string | null> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.marginPoolId(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst option = bcs.option(bcs.Address).parse(bytes);\n\t\treturn option ? normalizeSuiAddress(option) : null;\n\t}\n\n\t/**\n\t * @description Get borrowed shares for both base and quote assets\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<{baseShares: string, quoteShares: string}>} The borrowed shares\n\t */\n\tasync getMarginManagerBorrowedShares(\n\t\tmarginManagerKey: string,\n\t): Promise<{ baseShares: string; quoteShares: string }> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.borrowedShares(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst quoteBytes = res.commandResults![0].returnValues[1].bcs;\n\t\tconst baseShares = bcs.U64.parse(baseBytes).toString();\n\t\tconst quoteShares = bcs.U64.parse(quoteBytes).toString();\n\n\t\treturn { baseShares, quoteShares };\n\t}\n\n\t/**\n\t * @description Get borrowed base shares\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The borrowed base shares\n\t */\n\tasync getMarginManagerBorrowedBaseShares(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.borrowedBaseShares(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.U64.parse(bytes).toString();\n\t}\n\n\t/**\n\t * @description Get borrowed quote shares\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The borrowed quote shares\n\t */\n\tasync getMarginManagerBorrowedQuoteShares(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.borrowedQuoteShares(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.U64.parse(bytes).toString();\n\t}\n\n\t/**\n\t * @description Check if margin manager has base asset debt\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<boolean>} True if has base debt, false otherwise\n\t */\n\tasync getMarginManagerHasBaseDebt(marginManagerKey: string): Promise<boolean> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.hasBaseDebt(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the balance manager ID for a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string>} The balance manager ID\n\t */\n\tasync getMarginManagerBalanceManagerId(marginManagerKey: string): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.balanceManager(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn normalizeSuiAddress(bcs.Address.parse(bytes));\n\t}\n\n\t/**\n\t * @description Calculate assets (base and quote) for a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<{baseAsset: string, quoteAsset: string}>} The base and quote assets\n\t */\n\tasync getMarginManagerAssets(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 6,\n\t): Promise<{ baseAsset: string; quoteAsset: string }> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.calculateAssets(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst quoteBytes = res.commandResults![0].returnValues[1].bcs;\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\tconst baseAsset = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(baseBytes)),\n\t\t\tbaseCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst quoteAsset = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(quoteBytes)),\n\t\t\tquoteCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\n\t\treturn { baseAsset, quoteAsset };\n\t}\n\n\t/**\n\t * @description Calculate debts (base and quote) for a margin manager\n\t * NOTE: This function automatically determines whether to use base or quote margin pool\n\t * based on hasBaseDebt. You don't need to specify the debt coin type.\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<{baseDebt: string, quoteDebt: string}>} The base and quote debts\n\t */\n\tasync getMarginManagerDebts(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 6,\n\t): Promise<{ baseDebt: string; quoteDebt: string }> {\n\t\t// First check if the margin manager has base debt\n\t\tconst hasBaseDebt = await this.getMarginManagerHasBaseDebt(marginManagerKey);\n\n\t\t// Get the manager and pool configuration\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst debtCoinKey = hasBaseDebt ? pool.baseCoin : pool.quoteCoin;\n\n\t\t// Now call calculateDebts with the correct debt coin\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.calculateDebts(manager.poolKey, debtCoinKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager debts: ${'Unknown error'}`);\n\t\t}\n\n\t\t// The Move function returns a tuple (u64, u64), so returnValues has 2 elements\n\t\tconst baseBytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst quoteBytes = res.commandResults[0].returnValues[1].bcs;\n\t\tconst debtCoin = this.#config.getCoin(debtCoinKey);\n\n\t\tconst baseDebt = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(baseBytes)),\n\t\t\tdebtCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst quoteDebt = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(quoteBytes)),\n\t\t\tdebtCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\n\t\treturn { baseDebt, quoteDebt };\n\t}\n\n\t/**\n\t * @description Get comprehensive state information for a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<{\n\t * managerId: string,\n\t * deepbookPoolId: string,\n\t * riskRatio: number,\n\t * baseAsset: string,\n\t * quoteAsset: string,\n\t * baseDebt: string,\n\t * quoteDebt: string,\n\t * basePythPrice: string,\n\t * basePythDecimals: number,\n\t * quotePythPrice: string,\n\t * quotePythDecimals: number\n\t * }>} Comprehensive margin manager state\n\t */\n\tasync getMarginManagerState(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 6,\n\t): Promise<{\n\t\tmanagerId: string;\n\t\tdeepbookPoolId: string;\n\t\triskRatio: number;\n\t\tbaseAsset: string;\n\t\tquoteAsset: string;\n\t\tbaseDebt: string;\n\t\tquoteDebt: string;\n\t\tbasePythPrice: string;\n\t\tbasePythDecimals: number;\n\t\tquotePythPrice: string;\n\t\tquotePythDecimals: number;\n\t\tcurrentPrice: bigint;\n\t\tlowestTriggerAbovePrice: bigint;\n\t\thighestTriggerBelowPrice: bigint;\n\t}> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.managerState(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager state: Unknown error`);\n\t\t}\n\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\t// Parse all 11 return values\n\t\tconst managerId = normalizeSuiAddress(\n\t\t\tbcs.Address.parse(res.commandResults[0].returnValues[0].bcs),\n\t\t);\n\t\tconst deepbookPoolId = normalizeSuiAddress(\n\t\t\tbcs.Address.parse(res.commandResults[0].returnValues[1].bcs),\n\t\t);\n\t\tconst riskRatio =\n\t\t\tNumber(bcs.U64.parse(res.commandResults[0].returnValues[2].bcs)) / FLOAT_SCALAR;\n\t\tconst baseAsset = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(res.commandResults[0].returnValues[3].bcs)),\n\t\t\tbaseCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst quoteAsset = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(res.commandResults[0].returnValues[4].bcs)),\n\t\t\tquoteCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst baseDebt = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(res.commandResults[0].returnValues[5].bcs)),\n\t\t\tbaseCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst quoteDebt = this.#formatTokenAmount(\n\t\t\tBigInt(bcs.U64.parse(res.commandResults[0].returnValues[6].bcs)),\n\t\t\tquoteCoin.scalar,\n\t\t\tdecimals,\n\t\t);\n\t\tconst basePythPrice = bcs.U64.parse(res.commandResults[0].returnValues[7].bcs);\n\t\tconst basePythDecimals = Number(\n\t\t\tbcs.u8().parse(new Uint8Array(res.commandResults[0].returnValues[8].bcs)),\n\t\t);\n\t\tconst quotePythPrice = bcs.U64.parse(res.commandResults[0].returnValues[9].bcs);\n\t\tconst quotePythDecimals = Number(\n\t\t\tbcs.u8().parse(new Uint8Array(res.commandResults[0].returnValues[10].bcs)),\n\t\t);\n\t\tconst currentPrice = BigInt(bcs.U64.parse(res.commandResults[0].returnValues[11].bcs));\n\t\tconst lowestTriggerAbovePrice = BigInt(\n\t\t\tbcs.U64.parse(res.commandResults[0].returnValues[12].bcs),\n\t\t);\n\t\tconst highestTriggerBelowPrice = BigInt(\n\t\t\tbcs.U64.parse(res.commandResults[0].returnValues[13].bcs),\n\t\t);\n\n\t\treturn {\n\t\t\tmanagerId,\n\t\t\tdeepbookPoolId,\n\t\t\triskRatio,\n\t\t\tbaseAsset,\n\t\t\tquoteAsset,\n\t\t\tbaseDebt,\n\t\t\tquoteDebt,\n\t\t\tbasePythPrice: basePythPrice.toString(),\n\t\t\tbasePythDecimals,\n\t\t\tquotePythPrice: quotePythPrice.toString(),\n\t\t\tquotePythDecimals,\n\t\t\tcurrentPrice,\n\t\t\tlowestTriggerAbovePrice,\n\t\t\thighestTriggerBelowPrice,\n\t\t};\n\t}\n\n\t/**\n\t * @description Get comprehensive state information for multiple margin managers.\n\t * @param {Record<string, string>} marginManagers Map of marginManagerId -> poolKey\n\t * @param {number} decimals Number of decimal places for formatting (default: 6)\n\t * @returns {Promise<Record<string, {...}>>} Object keyed by managerId with state data\n\t */\n\tasync getMarginManagerStates(\n\t\tmarginManagers: Record<string, string>,\n\t\tdecimals: number = 6,\n\t): Promise<\n\t\tRecord<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmanagerId: string;\n\t\t\t\tdeepbookPoolId: string;\n\t\t\t\triskRatio: number;\n\t\t\t\tbaseAsset: string;\n\t\t\t\tquoteAsset: string;\n\t\t\t\tbaseDebt: string;\n\t\t\t\tquoteDebt: string;\n\t\t\t\tbasePythPrice: string;\n\t\t\t\tbasePythDecimals: number;\n\t\t\t\tquotePythPrice: string;\n\t\t\t\tquotePythDecimals: number;\n\t\t\t\tcurrentPrice: bigint;\n\t\t\t\tlowestTriggerAbovePrice: bigint;\n\t\t\t\thighestTriggerBelowPrice: bigint;\n\t\t\t}\n\t\t>\n\t> {\n\t\tconst entries = Object.entries(marginManagers);\n\t\tif (entries.length === 0) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst tx = new Transaction();\n\n\t\t// Add a managerState call for each margin manager\n\t\tfor (const [managerId, poolKey] of entries) {\n\t\t\ttx.add(this.marginManager.managerState(poolKey, managerId));\n\t\t}\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults) {\n\t\t\tthrow new Error(`Failed to get margin manager states: Unknown error`);\n\t\t}\n\n\t\tconst results: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmanagerId: string;\n\t\t\t\tdeepbookPoolId: string;\n\t\t\t\triskRatio: number;\n\t\t\t\tbaseAsset: string;\n\t\t\t\tquoteAsset: string;\n\t\t\t\tbaseDebt: string;\n\t\t\t\tquoteDebt: string;\n\t\t\t\tbasePythPrice: string;\n\t\t\t\tbasePythDecimals: number;\n\t\t\t\tquotePythPrice: string;\n\t\t\t\tquotePythDecimals: number;\n\t\t\t\tcurrentPrice: bigint;\n\t\t\t\tlowestTriggerAbovePrice: bigint;\n\t\t\t\thighestTriggerBelowPrice: bigint;\n\t\t\t}\n\t\t> = {};\n\n\t\t// Parse each command result\n\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\tconst commandResult = res.commandResults[i];\n\t\t\tif (!commandResult || !commandResult.returnValues) {\n\t\t\t\tthrow new Error(`Failed to get margin manager state for index ${i}: No return values`);\n\t\t\t}\n\n\t\t\tconst [, poolKey] = entries[i];\n\t\t\tconst pool = this.#config.getPool(poolKey);\n\t\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\t\tconst managerId = normalizeSuiAddress(bcs.Address.parse(commandResult.returnValues[0].bcs));\n\t\t\tconst deepbookPoolId = normalizeSuiAddress(\n\t\t\t\tbcs.Address.parse(commandResult.returnValues[1].bcs),\n\t\t\t);\n\t\t\tconst riskRatio = Number(bcs.U64.parse(commandResult.returnValues[2].bcs)) / FLOAT_SCALAR;\n\t\t\tconst baseAsset = this.#formatTokenAmount(\n\t\t\t\tBigInt(bcs.U64.parse(commandResult.returnValues[3].bcs)),\n\t\t\t\tbaseCoin.scalar,\n\t\t\t\tdecimals,\n\t\t\t);\n\t\t\tconst quoteAsset = this.#formatTokenAmount(\n\t\t\t\tBigInt(bcs.U64.parse(commandResult.returnValues[4].bcs)),\n\t\t\t\tquoteCoin.scalar,\n\t\t\t\tdecimals,\n\t\t\t);\n\t\t\tconst baseDebt = this.#formatTokenAmount(\n\t\t\t\tBigInt(bcs.U64.parse(commandResult.returnValues[5].bcs)),\n\t\t\t\tbaseCoin.scalar,\n\t\t\t\tdecimals,\n\t\t\t);\n\t\t\tconst quoteDebt = this.#formatTokenAmount(\n\t\t\t\tBigInt(bcs.U64.parse(commandResult.returnValues[6].bcs)),\n\t\t\t\tquoteCoin.scalar,\n\t\t\t\tdecimals,\n\t\t\t);\n\t\t\tconst basePythPrice = bcs.U64.parse(commandResult.returnValues[7].bcs);\n\t\t\tconst basePythDecimals = Number(\n\t\t\t\tbcs.u8().parse(new Uint8Array(commandResult.returnValues[8].bcs)),\n\t\t\t);\n\t\t\tconst quotePythPrice = bcs.U64.parse(commandResult.returnValues[9].bcs);\n\t\t\tconst quotePythDecimals = Number(\n\t\t\t\tbcs.u8().parse(new Uint8Array(commandResult.returnValues[10].bcs)),\n\t\t\t);\n\t\t\tconst currentPrice = BigInt(bcs.U64.parse(commandResult.returnValues[11].bcs));\n\t\t\tconst lowestTriggerAbovePrice = BigInt(bcs.U64.parse(commandResult.returnValues[12].bcs));\n\t\t\tconst highestTriggerBelowPrice = BigInt(bcs.U64.parse(commandResult.returnValues[13].bcs));\n\n\t\t\tresults[managerId] = {\n\t\t\t\tmanagerId,\n\t\t\t\tdeepbookPoolId,\n\t\t\t\triskRatio,\n\t\t\t\tbaseAsset,\n\t\t\t\tquoteAsset,\n\t\t\t\tbaseDebt,\n\t\t\t\tquoteDebt,\n\t\t\t\tbasePythPrice: basePythPrice.toString(),\n\t\t\t\tbasePythDecimals,\n\t\t\t\tquotePythPrice: quotePythPrice.toString(),\n\t\t\t\tquotePythDecimals,\n\t\t\t\tcurrentPrice,\n\t\t\t\tlowestTriggerAbovePrice,\n\t\t\t\thighestTriggerBelowPrice,\n\t\t\t};\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * @description Get the base asset balance of a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The base asset balance\n\t */\n\tasync getMarginManagerBaseBalance(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 9,\n\t): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.baseBalance(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager base balance: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\n\t\treturn this.#formatTokenAmount(BigInt(bcs.U64.parse(bytes)), baseCoin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the quote asset balance of a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The quote asset balance\n\t */\n\tasync getMarginManagerQuoteBalance(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 9,\n\t): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.quoteBalance(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager quote balance: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst pool = this.#config.getPool(manager.poolKey);\n\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\treturn this.#formatTokenAmount(BigInt(bcs.U64.parse(bytes)), quoteCoin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get the DEEP token balance of a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @param {number} decimals Number of decimal places to show (default: 6)\n\t * @returns {Promise<string>} The DEEP token balance\n\t */\n\tasync getMarginManagerDeepBalance(\n\t\tmarginManagerKey: string,\n\t\tdecimals: number = 6,\n\t): Promise<string> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.deepBalance(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get margin manager DEEP balance: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst deepCoin = this.#config.getCoin('DEEP');\n\n\t\treturn this.#formatTokenAmount(BigInt(bcs.U64.parse(bytes)), deepCoin.scalar, decimals);\n\t}\n\n\t/**\n\t * @description Get base, quote, and DEEP balances for multiple margin managers in a single dry run call\n\t * @param {Record<string, string>} marginManagers Map of marginManagerId -> poolKey\n\t * @param {number} decimals Number of decimal places for formatting (default: 9)\n\t * @returns {Promise<Record<string, { base: string, quote: string, deep: string }>>} Object keyed by managerId\n\t */\n\tasync getMarginManagerBalances(\n\t\tmarginManagers: Record<string, string>,\n\t\tdecimals: number = 9,\n\t): Promise<Record<string, { base: string; quote: string; deep: string }>> {\n\t\tconst entries = Object.entries(marginManagers);\n\t\tif (entries.length === 0) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst tx = new Transaction();\n\n\t\t// 3 calls per manager: base, quote, deep\n\t\tfor (const [managerId, poolKey] of entries) {\n\t\t\ttx.add(this.marginManager.baseBalance(poolKey, managerId));\n\t\t\ttx.add(this.marginManager.quoteBalance(poolKey, managerId));\n\t\t\ttx.add(this.marginManager.deepBalance(poolKey, managerId));\n\t\t}\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults) {\n\t\t\tthrow new Error('Failed to get margin manager balances: No command results');\n\t\t}\n\n\t\tconst results: Record<string, { base: string; quote: string; deep: string }> = {};\n\t\tconst deepCoin = this.#config.getCoin('DEEP');\n\n\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\tconst [managerId, poolKey] = entries[i];\n\t\t\tconst pool = this.#config.getPool(poolKey);\n\t\t\tconst baseCoin = this.#config.getCoin(pool.baseCoin);\n\t\t\tconst quoteCoin = this.#config.getCoin(pool.quoteCoin);\n\n\t\t\tconst baseResult = res.commandResults[i * 3];\n\t\t\tconst quoteResult = res.commandResults[i * 3 + 1];\n\t\t\tconst deepResult = res.commandResults[i * 3 + 2];\n\n\t\t\tif (!baseResult?.returnValues || !quoteResult?.returnValues || !deepResult?.returnValues) {\n\t\t\t\tthrow new Error(`Failed to get balances for margin manager ${managerId}: No return values`);\n\t\t\t}\n\n\t\t\tresults[managerId] = {\n\t\t\t\tbase: this.#formatTokenAmount(\n\t\t\t\t\tBigInt(bcs.U64.parse(baseResult.returnValues[0].bcs)),\n\t\t\t\t\tbaseCoin.scalar,\n\t\t\t\t\tdecimals,\n\t\t\t\t),\n\t\t\t\tquote: this.#formatTokenAmount(\n\t\t\t\t\tBigInt(bcs.U64.parse(quoteResult.returnValues[0].bcs)),\n\t\t\t\t\tquoteCoin.scalar,\n\t\t\t\t\tdecimals,\n\t\t\t\t),\n\t\t\t\tdeep: this.#formatTokenAmount(\n\t\t\t\t\tBigInt(bcs.U64.parse(deepResult.returnValues[0].bcs)),\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t\t\tdecimals,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * @description Get account order details for a margin manager.\n\t * This retrieves the balance manager from the margin manager and returns order details.\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<Array>} Array of order details\n\t */\n\tasync getMarginAccountOrderDetails(marginManagerKey: string) {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginManager.getMarginAccountOrderDetails(manager.poolKey, manager.address));\n\n\t\ttx.setSenderIfNotSet(normalizeSuiAddress(this.#address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get conditional order IDs: Unknown error`);\n\t\t}\n\n\t\ttry {\n\t\t\tconst bytes = res.commandResults[1].returnValues[0].bcs;\n\t\t\treturn bcs.vector(Order).parse(bytes);\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t// === Margin TPSL (Take Profit / Stop Loss) Read-Only Functions ===\n\n\t/**\n\t * @description Get all conditional order IDs for a margin manager\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<string[]>} Array of conditional order IDs\n\t */\n\tasync getConditionalOrderIds(marginManagerKey: string): Promise<string[]> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginTPSL.conditionalOrderIds(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get conditional order IDs: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\tconst orderIds = bcs.vector(bcs.u64()).parse(bytes);\n\t\treturn orderIds.map((id) => id.toString());\n\t}\n\n\t/**\n\t * @description Get the lowest trigger price for trigger_above orders\n\t * Returns MAX_U64 if there are no trigger_above orders\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<bigint>} The lowest trigger above price\n\t */\n\tasync getLowestTriggerAbovePrice(marginManagerKey: string): Promise<bigint> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginTPSL.lowestTriggerAbovePrice(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get lowest trigger above price: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\treturn BigInt(bcs.U64.parse(bytes));\n\t}\n\n\t/**\n\t * @description Get the highest trigger price for trigger_below orders\n\t * Returns 0 if there are no trigger_below orders\n\t * @param {string} marginManagerKey The key to identify the margin manager\n\t * @returns {Promise<bigint>} The highest trigger below price\n\t */\n\tasync getHighestTriggerBelowPrice(marginManagerKey: string): Promise<bigint> {\n\t\tconst manager = this.#config.getMarginManager(marginManagerKey);\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginTPSL.highestTriggerBelowPrice(manager.poolKey, manager.address));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tif (res.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!res.commandResults || !res.commandResults[0] || !res.commandResults[0].returnValues) {\n\t\t\tthrow new Error(`Failed to get highest trigger below price: Unknown error`);\n\t\t}\n\n\t\tconst bytes = res.commandResults[0].returnValues[0].bcs;\n\t\treturn BigInt(bcs.U64.parse(bytes));\n\t}\n\n\t// === Margin Registry Functions ===\n\n\t/**\n\t * @description Check if a deepbook pool is enabled for margin trading\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<boolean>} True if the pool is enabled for margin trading\n\t */\n\tasync isPoolEnabledForMargin(poolKey: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.poolEnabled(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.Bool.parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the margin manager IDs for a given owner address\n\t * @param {string} owner The owner address\n\t * @returns {Promise<string[]>} Array of margin manager IDs\n\t */\n\tasync getMarginManagerIdsForOwner(owner: string): Promise<string[]> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.getMarginManagerIds(owner));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst vecSet = VecSet(bcs.Address).parse(bytes);\n\t\treturn vecSet.contents.map((id) => normalizeSuiAddress(id));\n\t}\n\n\t/**\n\t * @description Get the base margin pool ID for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<string>} The base margin pool ID\n\t */\n\tasync getBaseMarginPoolId(poolKey: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.baseMarginPoolId(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst id = bcs.Address.parse(bytes);\n\t\treturn '0x' + id;\n\t}\n\n\t/**\n\t * @description Get the quote margin pool ID for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<string>} The quote margin pool ID\n\t */\n\tasync getQuoteMarginPoolId(poolKey: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.quoteMarginPoolId(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst id = bcs.Address.parse(bytes);\n\t\treturn '0x' + id;\n\t}\n\n\t/**\n\t * @description Get the minimum withdraw risk ratio for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The minimum withdraw risk ratio as a decimal (e.g., 1.5 for 150%)\n\t */\n\tasync getMinWithdrawRiskRatio(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.minWithdrawRiskRatio(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst ratio = Number(bcs.U64.parse(bytes));\n\t\treturn ratio / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the minimum borrow risk ratio for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The minimum borrow risk ratio as a decimal (e.g., 1.25 for 125%)\n\t */\n\tasync getMinBorrowRiskRatio(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.minBorrowRiskRatio(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst ratio = Number(bcs.U64.parse(bytes));\n\t\treturn ratio / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the liquidation risk ratio for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The liquidation risk ratio as a decimal (e.g., 1.125 for 112.5%)\n\t */\n\tasync getLiquidationRiskRatio(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.liquidationRiskRatio(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst ratio = Number(bcs.U64.parse(bytes));\n\t\treturn ratio / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the target liquidation risk ratio for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The target liquidation risk ratio as a decimal (e.g., 1.25 for 125%)\n\t */\n\tasync getTargetLiquidationRiskRatio(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.targetLiquidationRiskRatio(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst ratio = Number(bcs.U64.parse(bytes));\n\t\treturn ratio / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the user liquidation reward for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The user liquidation reward as a decimal (e.g., 0.05 for 5%)\n\t */\n\tasync getUserLiquidationReward(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.userLiquidationReward(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst reward = Number(bcs.U64.parse(bytes));\n\t\treturn reward / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the pool liquidation reward for a deepbook pool\n\t * @param {string} poolKey The key to identify the pool\n\t * @returns {Promise<number>} The pool liquidation reward as a decimal (e.g., 0.05 for 5%)\n\t */\n\tasync getPoolLiquidationReward(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.poolLiquidationReward(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst reward = Number(bcs.U64.parse(bytes));\n\t\treturn reward / FLOAT_SCALAR;\n\t}\n\n\t/**\n\t * @description Get all allowed maintainer cap IDs\n\t * @returns {Promise<string[]>} Array of allowed maintainer cap IDs\n\t */\n\tasync getAllowedMaintainers(): Promise<string[]> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.allowedMaintainers());\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst vecSet = VecSet(bcs.Address).parse(bytes);\n\t\treturn vecSet.contents.map((id) => normalizeSuiAddress(id));\n\t}\n\n\t/**\n\t * @description Get all allowed pause cap IDs\n\t * @returns {Promise<string[]>} Array of allowed pause cap IDs\n\t */\n\tasync getAllowedPauseCaps(): Promise<string[]> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.marginRegistry.allowedPauseCaps());\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst vecSet = VecSet(bcs.Address).parse(bytes);\n\t\treturn vecSet.contents.map((id) => normalizeSuiAddress(id));\n\t}\n\n\t/**\n\t * @description Check if a pool is a stable pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<boolean>} Whether the pool is a stable pool\n\t */\n\tasync stablePool(poolKey: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.stablePool(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if a pool is registered\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<boolean>} Whether the pool is registered\n\t */\n\tasync registeredPool(poolKey: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.registeredPool(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the quote quantity out using input token as fee\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity\n\t * @returns {Promise<{baseQuantity: number, baseOut: number, quoteOut: number, deepRequired: number}>}\n\t */\n\tasync getQuoteQuantityOutInputFee(poolKey: string, baseQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuoteQuantityOutInputFee(poolKey, baseQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the base quantity out using input token as fee\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} quoteQuantity Quote quantity\n\t * @returns {Promise<{quoteQuantity: number, baseOut: number, quoteOut: number, deepRequired: number}>}\n\t */\n\tasync getBaseQuantityOutInputFee(poolKey: string, quoteQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getBaseQuantityOutInputFee(poolKey, quoteQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tquoteQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the quantity out using input token as fee\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity\n\t * @param {number} quoteQuantity Quote quantity\n\t * @returns {Promise<{baseQuantity: number, quoteQuantity: number, baseOut: number, quoteOut: number, deepRequired: number}>}\n\t */\n\tasync getQuantityOutInputFee(poolKey: string, baseQuantity: number, quoteQuantity: number) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuantityOutInputFee(poolKey, baseQuantity, quoteQuantity));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseQuantity,\n\t\t\tquoteQuantity,\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the base quantity needed to receive target quote quantity\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} targetQuoteQuantity Target quote quantity\n\t * @param {boolean} payWithDeep Whether to pay fees with DEEP\n\t * @returns {Promise<{baseIn: number, quoteOut: number, deepRequired: number}>}\n\t */\n\tasync getBaseQuantityIn(poolKey: string, targetQuoteQuantity: number, payWithDeep: boolean) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getBaseQuantityIn(poolKey, targetQuoteQuantity, payWithDeep));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseIn = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseIn: Number((baseIn / baseScalar).toFixed(9)),\n\t\t\tquoteOut: Number((quoteOut / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the quote quantity needed to receive target base quantity\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} targetBaseQuantity Target base quantity\n\t * @param {boolean} payWithDeep Whether to pay fees with DEEP\n\t * @returns {Promise<{baseOut: number, quoteIn: number, deepRequired: number}>}\n\t */\n\tasync getQuoteQuantityIn(poolKey: string, targetBaseQuantity: number, payWithDeep: boolean) {\n\t\tconst tx = new Transaction();\n\t\tconst pool = this.#config.getPool(poolKey);\n\t\tconst baseScalar = this.#config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.deepBook.getQuoteQuantityIn(poolKey, targetBaseQuantity, payWithDeep));\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseOut = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteIn = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbaseOut: Number((baseOut / baseScalar).toFixed(9)),\n\t\t\tquoteIn: Number((quoteIn / quoteScalar).toFixed(9)),\n\t\t\tdeepRequired: Number((deepRequired / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Get account order details for a balance manager\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey Key of the balance manager\n\t * @returns {Promise<Array>} Array of order details\n\t */\n\tasync getAccountOrderDetails(poolKey: string, managerKey: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getAccountOrderDetails(poolKey, managerKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\ttry {\n\t\t\tconst orderInformation = res.commandResults![0].returnValues[0].bcs;\n\t\t\treturn bcs.vector(Order).parse(new Uint8Array(orderInformation));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * @description Get the DEEP required for an order\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} baseQuantity Base quantity\n\t * @param {number} price Price\n\t * @returns {Promise<{deepRequiredTaker: number, deepRequiredMaker: number}>}\n\t */\n\tasync getOrderDeepRequired(poolKey: string, baseQuantity: number, price: number) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.getOrderDeepRequired(poolKey, baseQuantity, price));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst deepRequiredTaker = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst deepRequiredMaker = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\n\t\treturn {\n\t\t\tdeepRequiredTaker: Number((deepRequiredTaker / DEEP_SCALAR).toFixed(9)),\n\t\t\tdeepRequiredMaker: Number((deepRequiredMaker / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\t/**\n\t * @description Check if account exists for a balance manager\n\t * @param {string} poolKey Key of the pool\n\t * @param {string} managerKey Key of the balance manager\n\t * @returns {Promise<boolean>} Whether account exists\n\t */\n\tasync accountExists(poolKey: string, managerKey: string): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.accountExists(poolKey, managerKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Get the next epoch trade parameters\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<{takerFee: number, makerFee: number, stakeRequired: number}>}\n\t */\n\tasync poolTradeParamsNext(poolKey: string) {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.poolTradeParamsNext(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst takerFee = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst makerFee = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst stakeRequired = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\ttakerFee: takerFee / FLOAT_SCALAR,\n\t\t\tmakerFee: makerFee / FLOAT_SCALAR,\n\t\t\tstakeRequired: stakeRequired / DEEP_SCALAR,\n\t\t};\n\t}\n\n\t/**\n\t * @description Get the quorum for a pool\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<number>} The quorum amount in DEEP\n\t */\n\tasync quorum(poolKey: string): Promise<number> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.quorum(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst quorum = Number(bcs.U64.parse(bytes));\n\t\treturn quorum / DEEP_SCALAR;\n\t}\n\n\t/**\n\t * @description Get the pool ID\n\t * @param {string} poolKey Key of the pool\n\t * @returns {Promise<string>} The pool ID\n\t */\n\tasync poolId(poolKey: string): Promise<string> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.poolId(poolKey));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn normalizeSuiAddress(bcs.Address.parse(bytes));\n\t}\n\n\t/**\n\t * @description Check if a limit order can be placed\n\t * @param {CanPlaceLimitOrderParams} params Parameters for checking limit order placement\n\t * @returns {Promise<boolean>} Whether order can be placed\n\t */\n\tasync canPlaceLimitOrder(params: CanPlaceLimitOrderParams): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.canPlaceLimitOrder(params));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if a market order can be placed\n\t * @param {CanPlaceMarketOrderParams} params Parameters for checking market order placement\n\t * @returns {Promise<boolean>} Whether order can be placed\n\t */\n\tasync canPlaceMarketOrder(params: CanPlaceMarketOrderParams): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.canPlaceMarketOrder(params));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if market order params are valid\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} quantity Quantity\n\t * @returns {Promise<boolean>} Whether params are valid\n\t */\n\tasync checkMarketOrderParams(poolKey: string, quantity: number): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.checkMarketOrderParams(poolKey, quantity));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Check if limit order params are valid\n\t * @param {string} poolKey Key of the pool\n\t * @param {number} price Price\n\t * @param {number} quantity Quantity\n\t * @param {number} expireTimestamp Expiration timestamp\n\t * @returns {Promise<boolean>} Whether params are valid\n\t */\n\tasync checkLimitOrderParams(\n\t\tpoolKey: string,\n\t\tprice: number,\n\t\tquantity: number,\n\t\texpireTimestamp: number,\n\t): Promise<boolean> {\n\t\tconst tx = new Transaction();\n\t\ttx.add(this.deepBook.checkLimitOrderParams(poolKey, price, quantity, expireTimestamp));\n\n\t\tconst res = await this.#client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst bytes = res.commandResults![0].returnValues[0].bcs;\n\t\treturn bcs.bool().parse(bytes);\n\t}\n\n\t/**\n\t * @description Helper function to format token amounts without floating point errors\n\t * @param {bigint} rawAmount The raw amount as bigint\n\t * @param {number} scalar The token scalar (e.g., 1000000000 for 9 decimals)\n\t * @param {number} decimals Number of decimal places to show\n\t * @returns {string} Formatted amount as string\n\t */\n\t#formatTokenAmount(rawAmount: bigint, scalar: number, decimals: number): string {\n\t\tconst scalarBigInt = BigInt(scalar);\n\t\tconst integerPart = rawAmount / scalarBigInt;\n\t\tconst fractionalPart = rawAmount % scalarBigInt;\n\n\t\t// If no fractional part, return just the integer\n\t\tif (fractionalPart === 0n) {\n\t\t\treturn integerPart.toString();\n\t\t}\n\n\t\t// Convert fractional part to string with leading zeros\n\t\tconst scalarDigits = scalar.toString().length - 1;\n\t\tconst fractionalStr = fractionalPart.toString().padStart(scalarDigits, '0');\n\n\t\t// Truncate to desired decimal places\n\t\tconst truncated = fractionalStr.slice(0, decimals);\n\n\t\t// Remove trailing zeros for cleaner output\n\t\tconst trimmed = truncated.replace(/0+$/, '');\n\n\t\t// If nothing left after trimming, return just integer\n\t\tif (!trimmed) {\n\t\t\treturn integerPart.toString();\n\t\t}\n\n\t\treturn `${integerPart}.${trimmed}`;\n\t}\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@mysten/deepbook-v3",
3
3
  "author": "Mysten Labs <build@mystenlabs.com>",
4
4
  "description": "Sui Deepbook SDK",
5
- "version": "1.0.9",
5
+ "version": "1.0.10",
6
6
  "license": "Apache-2.0",
7
7
  "type": "module",
8
8
  "main": "./dist/index.mjs",
@@ -46,11 +46,11 @@
46
46
  "vite": "^7.3.1",
47
47
  "vitest": "^4.0.17",
48
48
  "wait-on": "^9.0.3",
49
- "@mysten/sui": "^2.3.2",
49
+ "@mysten/sui": "^2.4.0",
50
50
  "@mysten/codegen": "^0.8.2"
51
51
  },
52
52
  "peerDependencies": {
53
- "@mysten/sui": "^2.3.2"
53
+ "@mysten/sui": "^2.4.0"
54
54
  },
55
55
  "scripts": {
56
56
  "clean": "rm -rf tsconfig.tsbuildinfo ./dist",
package/src/client.ts CHANGED
@@ -194,6 +194,70 @@ export class DeepBookClient {
194
194
  };
195
195
  }
196
196
 
197
+ /**
198
+ * @description Check multiple coin balances for multiple balance managers by address in a single dry run call
199
+ * @param {string[]} managerAddresses The on-chain addresses of the BalanceManagers
200
+ * @param {string[]} coinKeys Keys of the coins to check balances for
201
+ * @returns {Promise<Record<string, Record<string, number>>>} Object keyed by manager address, mapping coinType to balance
202
+ */
203
+ async checkManagerBalancesWithAddress(managerAddresses: string[], coinKeys: string[]) {
204
+ if (managerAddresses.length === 0 || coinKeys.length === 0) {
205
+ return {};
206
+ }
207
+
208
+ const tx = new Transaction();
209
+ const coins = coinKeys.map((coinKey) => this.#config.getCoin(coinKey));
210
+
211
+ for (const managerAddress of managerAddresses) {
212
+ for (const coin of coins) {
213
+ tx.moveCall({
214
+ target: `${this.#config.DEEPBOOK_PACKAGE_ID}::balance_manager::balance`,
215
+ arguments: [tx.object(managerAddress)],
216
+ typeArguments: [coin.type],
217
+ });
218
+ }
219
+ }
220
+
221
+ const res = await this.#client.core.simulateTransaction({
222
+ transaction: tx,
223
+ include: { commandResults: true, effects: true },
224
+ });
225
+
226
+ if (res.FailedTransaction) {
227
+ throw new Error(
228
+ `Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,
229
+ );
230
+ }
231
+
232
+ if (!res.commandResults) {
233
+ throw new Error('Failed to get manager balances: No command results');
234
+ }
235
+
236
+ const results: Record<string, Record<string, number>> = {};
237
+
238
+ for (let m = 0; m < managerAddresses.length; m++) {
239
+ const managerAddress = managerAddresses[m];
240
+ const managerBalances: Record<string, number> = {};
241
+
242
+ for (let c = 0; c < coins.length; c++) {
243
+ const coin = coins[c];
244
+ const commandResult = res.commandResults[m * coins.length + c];
245
+
246
+ if (!commandResult || !commandResult.returnValues) {
247
+ throw new Error(`Failed to get balance for ${coin.type}: No return values`);
248
+ }
249
+
250
+ const bytes = commandResult.returnValues[0].bcs;
251
+ const parsed_balance = bcs.U64.parse(bytes);
252
+ managerBalances[coin.type] = Number((Number(parsed_balance) / coin.scalar).toFixed(9));
253
+ }
254
+
255
+ results[managerAddress] = managerBalances;
256
+ }
257
+
258
+ return results;
259
+ }
260
+
197
261
  /**
198
262
  * @description Check if a pool is whitelisted
199
263
  * @param {string} poolKey Key of the pool
@@ -1990,6 +2054,84 @@ export class DeepBookClient {
1990
2054
  return this.#formatTokenAmount(BigInt(bcs.U64.parse(bytes)), deepCoin.scalar, decimals);
1991
2055
  }
1992
2056
 
2057
+ /**
2058
+ * @description Get base, quote, and DEEP balances for multiple margin managers in a single dry run call
2059
+ * @param {Record<string, string>} marginManagers Map of marginManagerId -> poolKey
2060
+ * @param {number} decimals Number of decimal places for formatting (default: 9)
2061
+ * @returns {Promise<Record<string, { base: string, quote: string, deep: string }>>} Object keyed by managerId
2062
+ */
2063
+ async getMarginManagerBalances(
2064
+ marginManagers: Record<string, string>,
2065
+ decimals: number = 9,
2066
+ ): Promise<Record<string, { base: string; quote: string; deep: string }>> {
2067
+ const entries = Object.entries(marginManagers);
2068
+ if (entries.length === 0) {
2069
+ return {};
2070
+ }
2071
+
2072
+ const tx = new Transaction();
2073
+
2074
+ // 3 calls per manager: base, quote, deep
2075
+ for (const [managerId, poolKey] of entries) {
2076
+ tx.add(this.marginManager.baseBalance(poolKey, managerId));
2077
+ tx.add(this.marginManager.quoteBalance(poolKey, managerId));
2078
+ tx.add(this.marginManager.deepBalance(poolKey, managerId));
2079
+ }
2080
+
2081
+ const res = await this.#client.core.simulateTransaction({
2082
+ transaction: tx,
2083
+ include: { commandResults: true, effects: true },
2084
+ });
2085
+
2086
+ if (res.FailedTransaction) {
2087
+ throw new Error(
2088
+ `Transaction failed: ${res.FailedTransaction.status.error?.message || 'Unknown error'}`,
2089
+ );
2090
+ }
2091
+
2092
+ if (!res.commandResults) {
2093
+ throw new Error('Failed to get margin manager balances: No command results');
2094
+ }
2095
+
2096
+ const results: Record<string, { base: string; quote: string; deep: string }> = {};
2097
+ const deepCoin = this.#config.getCoin('DEEP');
2098
+
2099
+ for (let i = 0; i < entries.length; i++) {
2100
+ const [managerId, poolKey] = entries[i];
2101
+ const pool = this.#config.getPool(poolKey);
2102
+ const baseCoin = this.#config.getCoin(pool.baseCoin);
2103
+ const quoteCoin = this.#config.getCoin(pool.quoteCoin);
2104
+
2105
+ const baseResult = res.commandResults[i * 3];
2106
+ const quoteResult = res.commandResults[i * 3 + 1];
2107
+ const deepResult = res.commandResults[i * 3 + 2];
2108
+
2109
+ if (!baseResult?.returnValues || !quoteResult?.returnValues || !deepResult?.returnValues) {
2110
+ throw new Error(`Failed to get balances for margin manager ${managerId}: No return values`);
2111
+ }
2112
+
2113
+ results[managerId] = {
2114
+ base: this.#formatTokenAmount(
2115
+ BigInt(bcs.U64.parse(baseResult.returnValues[0].bcs)),
2116
+ baseCoin.scalar,
2117
+ decimals,
2118
+ ),
2119
+ quote: this.#formatTokenAmount(
2120
+ BigInt(bcs.U64.parse(quoteResult.returnValues[0].bcs)),
2121
+ quoteCoin.scalar,
2122
+ decimals,
2123
+ ),
2124
+ deep: this.#formatTokenAmount(
2125
+ BigInt(bcs.U64.parse(deepResult.returnValues[0].bcs)),
2126
+ deepCoin.scalar,
2127
+ decimals,
2128
+ ),
2129
+ };
2130
+ }
2131
+
2132
+ return results;
2133
+ }
2134
+
1993
2135
  /**
1994
2136
  * @description Get account order details for a margin manager.
1995
2137
  * This retrieves the balance manager from the margin manager and returns order details.