Skip to main content

Trade and Swap

This section shows how to construct and execute a trade on the DeepBook protocol.

Create a pool

When you create a pool in DeepBook, you need to specify the BaseAsset, QuoteAsset, tick_size, and lot_size. You also need to pay a transaction fee (in SUI) to create a pool.

Function signature for create_pool in Move contract

/// Parameters expected by this function
///
/// 0. `[registry]` Object ID refers to the pool registry
/// 1. `[tick_size]` Minimal Price Change Accuracy of this pool
/// 2. `[lot_size]` Minimal lot Change Accuracy of this pool
/// 3. `[coin]` Object ID of the sui coin, to pay fee for create pool (100 MIST sui charged)

/// Returns the AccountCap
public fun create_pool<BaseAsset, QuoteAsset, SUI>(
registry: &mut Registry,
tick_size: u64,
lot_size: u64,
coin: Coin<SUI>,
ctx: &mut TxContext,
)

TypeScript SDK for invoking create_pool

/**
* @description: Create pool for trading pair
* @param tickSize: Minimal Price Change Accuracy of this pool
* @param lotSize: Minimal Lot Change Accuracy of this pool
* @param token1: Full coin type(recommend) or coin name of the base asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param token2: Full coin type(recommend) of quote asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::usdt::USDT" for example
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId and registryId should be set in configs.json, if it is not set, the transaction will fail.
*/
public createPool(
tickSize: number,
lotSize: number,
token1: string,
token2: string,
overrides: Overrides = new Overrides(),
): TransactionBlock {
const coinType1 = convertToTokenType(token1, this.records);
const coinType2 = convertToTokenType(token2, this.records);
// we have to split sui as a param into the code
const [coin] = overrides.txb.splitCoins(overrides.txb.gas, [overrides.txb.pure(200000000)]);
overrides.txb.moveCall({
typeArguments: [coinType1, coinType2, '0x2::sui::SUI'],
target: `${this.configs.swapPackageId}::clob::create_pool`,
arguments: [
overrides.txb.object(String(this.configs.registryId)),
overrides.txb.pure(tickSize),
overrides.txb.pure(lotSize),
coin,
],
});
overrides.txb.setGasBudget(overrides.gasBudget);
return overrides.txb;
}

Create an order

There are two types of orders, limit order and market order in DeepBook.

For limit order, you need to create a custodian account the first time you interact with a particular pool and deposit assets to the pool.

Scaling precision

Tokens are created with different decimal precision. For example, SUI has nine decimals of precision, while the wormhole wrapped ethereum USDC has six decimals of precision. To accommodate proper pricing within DeepBook, every decimal is scaled with 10^9 precision. All the decimals in DeepBook meet the equation: 10^9 \* (priceInRealWorld/priceInDeepBook) = (10^baseAssetDecimal) / (10^quoteAssetDecimal).

Let's walk through an example between SUI/USDC. For this example, assume Sui price is $1.10 and is the base asset of the SUI/USDC trading pair.

Thus, the calculation is 10^9 \* (1.10/ P_d) = 1000, where P_d should be the price of sui in the DeepBook SUI/USDC trading pair. You can solve for P_d = 1100000, so if the user wants to sell SUI at the market price in DeepBook, they should enter a price with six decimal points of precision.

Limit order

Limit order type

There are four types of restrictions that you could put on limit orders.

  • NO_RESTRICTION: 0

    Fill as much quantity as possible in the current transaction as taker, and inject the remaining as a maker order.

  • IMMEDIATE_OR_CANCEL: 1

    Fill as much quantity as possible in the current transaction as taker, and cancel the rest of the order.

  • FILL_OR_KILL: 2

    Only fill if the entire order size can be filled as taker in the current transaction. Otherwise, abort the entire transaction.

  • POST_OR_ABORT: 3

    Only proceed if the entire order size can be posted to the order book as maker in the current transaction. Otherwise, abort the entire transaction.

Custodian account

Before placing a limit order, traders need to host a custodian account with asset deposited. Traders could generate a custodian account by invoking create_account to get an AccountCap object authorizing them to access their custodian accounts. The AccountCap object is the key to the custodian account, and if you transfer this object to others, the new owner has access to all the funds and orders in the custodian account.

Function signature for create_account in Move contract

/// Parameters expected by this func
///
/// 0. `[ctx]` Information about the current transaction.

/// Returns the AccountCap
public fun create_account(ctx: &mut TxContext): AccountCap {
mint_account_cap(ctx)
}

TypeScript SDK for invoking create_account

/**
* @description: Create and Transfer custodian account to user
* @param currentAddress: current user address
* @param needsTransfer: if needs transfer the cap to user, default true, if false, which means we need to use the cap in the next transaction.
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId should be set in configs.json, if it is not set, the transaction will fail.
*/
async createAccount(
currentAddress: string,
needsTransfer: boolean = true,
overrides: Overrides = new Overrides(),
): Promise<TransactionBlock | TransactionArgument> {
let [cap] = overrides.txb.moveCall({
typeArguments: [],
target: `${this.configs.swapPackageId}::clob::create_account`,
arguments: [],
});
if (!needsTransfer) {
return cap;
} else {
overrides.txb.transferObjects([cap], overrides.txb.pure(currentAddress));
overrides.txb.setSenderIfNotSet(currentAddress);
overrides.txb.setGasBudget(overrides.gasBudget);
return overrides.txb;
}
}

Deposit asset

Traders could deposit base/quote assets to their custodian account, so they could later use it for placing limit orders. We provide two functions to deposit base and quote assets, respectively.

Function signature for deposit base asset in Move contract

/// Parameters expected by this func
///
/// 0. `[pool]` Object ID refers to the pool containing the trading pair
/// 1. `[coin]` Object ID of the base asset coin
/// 2. `[account_cap]` Object ID of the account_cap authorizing the
/// accessilility to the escrow account

/// Returns none
public fun deposit_base<BaseAsset, QuoteAsset>(
pool: &mut Pool<BaseAsset, QuoteAsset>,
coin: Coin<BaseAsset>,
account_cap: &AccountCap
)

TypeScript SDK for invoking deposit_base

/**
* @description: Deposit base asset into custodian account
* @param accountCap: Object id of Account Capacity under user address, created after invoking createAccount
* @param token1: Full coin type(recommend) or coin name of the base asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param token2: Full coin type(recommend) of quote asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::usdt::USDT" for example
* @param coin: Object id of coin to deposit
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId should be set in configs.json, if it is not set, the transaction will fail.
*/
public depositBase(
token1: string,
token2: string,
coin: string | TransactionArgument,
accountCap: string,
overrides: Overrides = new Overrides(),
): TransactionBlock {
const tokenType1 = convertToTokenType(token1, this.records);
const tokenType2 = convertToTokenType(token2, this.records);
const poolInfo = getPoolInfoByRecords(tokenType1, tokenType2, this.records);
overrides.txb.moveCall({
typeArguments: [tokenType1, tokenType2],
target: `${this.configs.swapPackageId}::clob::deposit_base`,
arguments: [
overrides.txb.object(String(poolInfo.clob)),
typeof coin == 'string' ? overrides.txb.object(coin) : coin,
overrides.txb.object(String(accountCap)),
],
});
overrides.txb.setGasBudget(overrides.gasBudget);
return overrides.txb;
}

Function signature for deposit_quote in contract

/// Parameters expected by this func
///
/// 0. `[pool]` Object ID refers to the pool containing the trading pair
/// 1. `[coin]` Object ID of the coin
/// 2. `[account_cap]` Object ID of the account_cap authorizing the
/// accessilility to the escrow account

/// Returns none
public fun deposit_quote<BaseAsset, QuoteAsset>(
pool: &mut Pool<BaseAsset, QuoteAsset>,
coin: Coin<QuoteAsset>,
account_cap: &AccountCap
)

TypeScript SDK for invoking deposit_quote

/**
* @description: Deposit quote asset into custodian account
* @param accountCap: Object id of Account Capacity under user address, created after invoking createAccount
* @param token1: Full coin type(recommend) or coin name of the base asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param token2: Full coin type(recommend) of quote asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::usdt::USDT" for example
* @param coin: Object id of coin to deposit
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId should be set in configs.json, if it is not set, the transaction will fail.
*/
public depositQuote(
token1: string,
token2: string,
coin: string | TransactionArgument,
accountCap: string | TransactionArgument,
overrides: Overrides = new Overrides(),
): TransactionBlock {
const tokenType1 = convertToTokenType(token1, this.records);
const tokenType2 = convertToTokenType(token2, this.records);
const poolInfo = getPoolInfoByRecords(tokenType1, tokenType2, this.records);
overrides.txb.moveCall({
typeArguments: [tokenType1, tokenType2],
target: `${this.configs.swapPackageId}::clob::deposit_quote`,
arguments: [
overrides.txb.object(String(poolInfo.clob)),
typeof coin == 'string' ? overrides.txb.object(coin) : coin,
typeof accountCap == 'string' ? overrides.txb.object(String(accountCap)) : accountCap,
],
});
overrides.txb.setGasBudget(overrides.gasBudget);
return overrides.txb;
}

Place limit order

Ensure you have a custodian account with enough base/quote assets to trade. You can now place limit orders on DeepBook with the following functions:

Function signature for placing limit order in Move contract

/// Parameters expected by this func
///
/// 0. `[pool]` Object ID refers to the pool of the trading pair
/// 1. `[price]` Price of the placed limit order to sell or buy
/// 2. `[quantity]` Quantity of the base asset want to sell or buy
/// 3. `[is_bid]` Flag indicate sell base asset out or buy base asset in
/// 4. `[expire_timestamp]` Expire timestamp in ms in absolute value inclusive., if exceeded, order turn invalid
/// 5. `[restriction]` Object ID of the pool containing the trading pair
/// 6. `[clock]` Object ID of global system clock
/// 7. `[account_cap]` Object ID of the account_cap authorizing the
/// accessilility to the escrow account
/// 8. `[ctx]` Information about the current transaction.

/// Returns (base quantity filled, quote quantity filled, whether a maker order is being placed, order id of the maker order)
public fun place_limit_order<BaseAsset, QuoteAsset>(
pool: &mut Pool<BaseAsset, QuoteAsset>,
price: u64,
quantity: u64,
is_bid: bool,
expire_timestamp: u64,
restriction: u8,
clock: &Clock,
account_cap: &AccountCap,
ctx: &mut TxContext
): (u64, u64, bool, u64)

TypeScript SDK for invoking place_limit_order

/**
* @description: place a limit order
* @param token1: Full coin type(recommend) of base asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param token2: Full coin type(recommend) of quote asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param price: price of the limit order
* @param quantity: quantity of the limit order in BASE ASSET.
* @param isBid: true for buying base with quote, false for selling base for quote
* @param expireTimestamp: expire timestamp of the limit order
* @param restriction restrictions on limit orders, explain in doc for more details
* @param accountCap: account cap for the limit order
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId should be set in configs.json, if it is not set, the transaction will fail.
*/
public placeLimitOrder(
token1: string,
token2: string,
price: number,
quantity: number,
isBid: boolean,
expireTimestamp: number,
restriction: number,
accountCap: string | TransactionArgument,
overrides: Overrides = new Overrides(),
): TransactionBlock {
const tokenType1 = convertToTokenType(token1, this.records);
const tokenType2 = convertToTokenType(token2, this.records);
const poolInfo = getPoolInfoByRecords(tokenType1, tokenType2, this.records);
overrides.txb.moveCall({
typeArguments: [tokenType1, tokenType2],
target: `${this.configs.swapPackageId}::clob::place_limit_order`,
arguments: [
overrides.txb.object(String(poolInfo.clob)),
overrides.txb.pure(Math.floor(price * F)),
overrides.txb.pure(quantity),
overrides.txb.pure(isBid),
overrides.txb.pure(Math.floor(expireTimestamp)),
overrides.txb.pure(restriction),
overrides.txb.object(normalizeSuiObjectId(this.configs.clock)),
typeof accountCap == "string" ? overrides.txb.object(accountCap) : accountCap,
],
});
overrides.txb.setGasBudget(overrides.gasBudget);
return overrides.txb;
}

Place market order

Placing a market order does not require a custodian account. The remaining order is canceled if it can be filled only partially.

Function signature for placing market order in Move contract:

/// Parameters expected by this func
///
/// 0. `[pool]` Object ID refers to the pool of the trading pair
/// 1. `[quantity]` Quantity of the base asset usr want to buy or sell
/// 2. `[is_bid]` Flag indicates buy or sell, true for buy and false for sell
/// 3. `[base_coin]` Object id of base coin, can be zero balance
/// 4. `[quote_coin]` Object id of the quote coin, can be zero balance
/// 5. `[clock]` Object ID refers to global system clock
/// 6. `[ctx]` Information about the transaction currently being executed.

/// Returns the base asset coin and quote asset coin after transaction
public fun place_market_order<BaseAsset, QuoteAsset>(
pool: &mut Pool<BaseAsset, QuoteAsset>,
quantity: u64,
is_bid: bool,
base_coin: Coin<BaseAsset>,
quote_coin: Coin<QuoteAsset>,
clock: &Clock,
ctx: &mut TxContext,
): (Coin<BaseAsset>, Coin<QuoteAsset>)

TypeScript SDK for invoking place_market_order

/**
* @description: place a market order
* @param tokenObjectIn: Object id of the token to buy or sell
* @param tokenOut: Full coin type(recommend) or coin name of the asset one want to get "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param amountIn: amount of token to buy or sell
* @param currentAddress: user address
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId should be set in configs.json, if it is not set, the transaction will fail.
*/
public async placeMarketOrder(
tokenObjectIn: string,
tokenOut: string,
amountIn: number,
currentAddress: string,
overrides: Overrides = new Overrides(),
): Promise<TransactionBlock> {
// in this case, we assume that the tokenIn--tokenOut always exists.
const tokenTypeOut = convertToTokenType(tokenOut, this.records);
const tokenIn = overrides.txb.object(tokenObjectIn);
const tokenInfo = await this.provider.getObject({
id: tokenObjectIn,
options: {
showType: true,
},
});
const tokenTypeIn = tokenInfo.data.type.split('<')[1].split('>')[0];
let base_coin_ret, quote_coin_ret, amount;
const poolInfo: PoolInfo = getPoolInfoByRecords(tokenTypeIn, tokenTypeOut, this.records);
let _isBid, _tokenIn, _tokenOut, _amount;
if (!poolInfo.needChange) {
_isBid = false;
_tokenIn = tokenIn;
_tokenOut = this.mint(tokenTypeOut, 0, {txb: overrides.txb});
_amount = overrides.txb.object(String(amountIn));
} else {
_isBid = true;
// _tokenIn = this.mint(txb, nextPath, 0)
_tokenOut = tokenIn;
_amount = overrides.txb.object(String(amountIn));
}
if (_isBid) {
// here swap_exact_quote_for_base
[base_coin_ret, quote_coin_ret, amount] = overrides.txb.moveCall({
typeArguments: [
poolInfo.needChange ? tokenTypeOut : tokenTypeIn,
poolInfo.needChange ? tokenTypeIn : tokenTypeOut,
],
target: `${this.configs.swapPackageId}::clob::swap_exact_quote_for_base`,
arguments: [
overrides.txb.object(String(poolInfo.clob)),
_amount,
overrides.txb.object(normalizeSuiObjectId(this.configs.clock)),
_tokenOut,
],
});
} else {
// here swap_exact_base_for_quote
[base_coin_ret, quote_coin_ret, amount] = overrides.txb.moveCall({
typeArguments: [
poolInfo.needChange ? tokenTypeOut : tokenTypeIn,
poolInfo.needChange ? tokenTypeIn : tokenTypeOut,
],
target: `${this.configs.swapPackageId}::clob::swap_exact_base_for_quote`,
arguments: [
overrides.txb.object(String(poolInfo.clob)),
_amount,
_tokenIn,
_tokenOut,
overrides.txb.object(normalizeSuiObjectId(this.configs.clock)),
],
});
}
overrides.txb.transferObjects([base_coin_ret], overrides.txb.pure(currentAddress));
overrides.txb.transferObjects([quote_coin_ret], overrides.txb.pure(currentAddress));
overrides.txb.setSenderIfNotSet(currentAddress);
overrides.txb.setGasBudget(overrides.gasBudget);
return overrides.txb;
}

Cancel order

Cancel single order

Cancel a limit order placed onto the CLOB. Abort if order_id is invalid or if the order is not submitted by the transaction sender.

Function signature for canceling single order in Move contract

/// parameters expected by this func
///
/// 0. `[pool]` Object ID refers to the pool of the trading pair
/// 1. `[order_id]` Order ID of the placed limit order
/// 2. `[account_cap]` Object ID of the account_cap authorizing the
/// accessilility to the escrow account

/// Returns none
public fun cancel_order<BaseAsset, QuoteAsset>(
pool: &mut Pool<BaseAsset, QuoteAsset>,
order_id: u64,
account_cap: &AccountCap
)

TypeScript SDK for invoking cancel_order

/**
* @description: cancel single order
* @param token1: Full coin type(recommend) of base asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param token2: Full coin type(recommend) of quote asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param orderId: Order id to cancel corresponding order
* @param accountCap: Object id of account capacity under usr address, created after invoking createAccount
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId should be set in configs.json, if it is not set, the transaction will fail.
*/
public async cancelOrder(
token1: string,
token2: string,
orderId: bigint,
accountCap: string,
overrides: Overrides = new Overrides(),
): Promise<TransactionBlock> {
const tokenType1 = convertToTokenType(token1, this.records);
const tokenType2 = convertToTokenType(token2, this.records);
const poolInfo: PoolInfo = getPoolInfoByRecords(tokenType1, tokenType2, this.records);
overrides.txb.moveCall({
typeArguments: [tokenType1, tokenType2],
target: `${this.configs.swapPackageId}::clob::cancel_order`,
arguments: [
overrides.txb.object(poolInfo.clob),
overrides.txb.pure(String(orderId)),
overrides.txb.object(accountCap),
],
});
overrides.txb.setGasBudget(overrides.gasBudget);
return overrides.txb;
}

Cancel all orders

Cancel all limit orders under a certain account capacity.

Function signature for canceling single order in Move contract

/// parameters expected by this func
///
/// 0. `[pool]` Object ID refers to the pool of the trading pair
/// 1. `[account_cap]` Object ID of the account_cap authorizing the
/// accessilility to the escrow account

/// Returns none
public fun cancel_all_orders<BaseAsset, QuoteAsset>(
pool: &mut Pool<BaseAsset, QuoteAsset>,
account_cap: &AccountCap
)

TypeScript SDK for cancel all orders

/**
* @description: Cancel all limit orders under a certain account capacity
* @param token1: Full coin type(recommend) of base asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param token2: Full coin type(recommend) of quote asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::usdt::USDT" for example
* @param accountCap: Object id of account capacity under usr address, created after invoking createAccount
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId should be set in configs.json, if it is not set, the transaction will fail.
*/
public async cancelAllOrders(
token1: string,
token2: string,
accountCap: string,
overrides: Overrides = new Overrides(),
): Promise<TransactionBlock> {
const tokenType1 = convertToTokenType(token1, this.records);
const tokenType2 = convertToTokenType(token2, this.records);
const poolInfo: PoolInfo = getPoolInfoByRecords(tokenType1, tokenType2, this.records);
overrides.txb.moveCall({
typeArguments: [token1, token2],
target: `${this.configs.swapPackageId}::clob::cancel_all_orders`,
arguments: [overrides.txb.object(poolInfo.clob), overrides.txb.object(accountCap)],
});
overrides.txb.setGasBudget(overrides.gasBudget);
return overrides.txb;
}

Batch cancel orders

Cancel multiple limit orders to save gas costs. Abort if any of the order ids is invalid or is not submitted by the sender. Note that this function can reduce gas costs even further if the caller has multiple orders at the same price level and if orders with the same price are grouped in the vector.

For example, if we have the following order_id to price mapping, {0: 100., 1: 200., 2: 100., 3: 200.}. Grouping order_ids like [0, 2, 1, 3] would make it the most gas efficient.

Function signature for batch cancel order

/// parameters expected by this func
///
/// 0. `[pool]` Object ID refers to the pool containing the trading pair
/// 1. `[order_ids]` List of object ID of the pool containing the trading pair
/// 2. `[account_cap]` Object ID of the account_cap authorize the
/// accessilility to the escrow account

/// Returns none
public fun batch_cancel_order<BaseAsset, QuoteAsset>(
pool: &mut Pool<BaseAsset, QuoteAsset>,
order_ids: vector<u64>,
account_cap: &AccountCap
)

TypeScript SDK for cancel all orders

/**
* @description: batch cancel order
* @param token1: Full coin type(recommend) of base asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::wbtc::WBTC" for example
* @param token2: Full coin type(recommend) of quote asset "0x3d0d0ce17dcd3b40c2d839d96ce66871ffb40e1154a8dd99af72292b3d10d7fc::usdt::USDT" for example
* @param orderIds: Order ids to cancel corresponding orders
* @param accountCap: Object id of account capacity under usr address, created after invoking createAccount
* @param overrides: overriders for blockchain params. Like gas budget, transaction block and the provider, default we will set to the max gas budget, and create a new transaction block
* @notice: the packageId should be set in configs.json, if it is not set, the transaction will fail.
*/
public async batchCancelOrder(
token1: string,
token2: string,
orderIds: Uint8Array,
accountCap: string,
overrides: Overrides = new Overrides(),
): Promise<TransactionBlock> {
const tokenType1 = convertToTokenType(token1, this.records);
const tokenType2 = convertToTokenType(token2, this.records);
const poolInfo: PoolInfo = getPoolInfoByRecords(tokenType1, tokenType2, this.records);
overrides.txb.moveCall({
typeArguments: [tokenType1, tokenType2],
target: `${this.configs.swapPackageId}::clob::batch_cancel_order`,
arguments: [
overrides.txb.object(String(poolInfo.clob)),
overrides.txb.pure(String(orderIds)),
overrides.txb.object(accountCap),
],
});
overrides.txb.setGasBudget(defaultGasBudget);
return overrides.txb;
}