@cetusprotocol/dlmm-sdk
SDK提供DLMM(Dynamic Liquidity Market Maker)模块,用于具有不同模式的专门流动性业务,以适应各种交易策略. 这个模块使用户能够灵活地进行复杂的流动资金业务,以管理其职位.
特征
- 多重流动性战略: Spot、BidAsk和各种贸易办法的曲线战略
- 综合池管理: 创建、查询和管理 DLMM 池
- 高级职位管理: 增加/转移流动资金、收取费用和奖励
- 灵活交换操作: 支持A对B和B对A互换
- 伙伴融合: 内设伙伴和转介系统
- 丰富的功能: Bin计算、价格转换和流动性管理工具
- 多网络支持: 主网和测试网的工程
开始
如何使用 DLMM SDK ?
安装
开始使用 DLMM SDK,您首先需要在您的 TypeScript 项目中安装:
npm install @cetusprotocol/dlmm-sdk
设置
将 SDK 导入到您打算使用的 TypeScript 文件 :
import { CetusDlmmSDK } from '@cetusprotocol/dlmm-sdk'
初始化 SDK
以所需的配置参数初始化 SDK. 这通常包括在必要时建立网络.
选项1: 使用默认主网配置
const sdk = CetusDlmmSDK.createSDK()
备选案文2:指定网络环境
// For mainnet
const sdk = CetusDlmmSDK.createSDK({ env: 'mainnet' })
// For testnet
const sdk = CetusDlmmSDK.createSDK({ env: 'testnet' })
选项3:使用自定义 RPC URL
const sdk = CetusDlmmSDK.createSDK({
env: 'mainnet',
full_rpc_url: 'YOUR_FULL_NODE_URL'
})
选项4:使用自定义 SuiGrpcClient
import { SuiGrpcClient } from '@mysten/sui/client'
const suiClient = new SuiGrpcClient({ url: 'YOUR_RPC_URL' })
const sdk = CetusDlmmSDK.createSDK({ env: 'mainnet', sui_client: suiClient })
使用量
连接钱包后,如果需要使用钱包地址来做某事,应当设置在 sdk.setSenderAddress。 。 。 .
const wallet = 'YOUR_WALLET_ADDRESS'
sdk.setSenderAddress(wallet)
如果您需要更改您的 RPC URL, 您可以按以下方式进行 :
const new_rpc_url = 'YOUR_NEW_FULL_NODE_URL'
sdk.updateFullRpcUrl(new_rpc_url)
共同参数
pool_id: 流动性池的标识bin_id: 池中垃圾桶的标识bin_step: 垃圾桶之间的步骤大小coin_type_a打开coin_type_b: 交易配对的硬币类型标识符coin_decimal_a打开coin_decimal_b: 每种硬币的十进制位置
默认收费选项
SDK为不同类型的交易配对提供预定义的收费配置. 这些配置根据资产波动和市场特点得到优化:
const dlmmDefaultFeeOptions = [
{ binStep: 1, baseFactor: 10000, fee: '0.0001' },
{ binStep: 1, baseFactor: 20000, fee: '0.0002' },
{ binStep: 2, baseFactor: 15000, fee: '0.0003' },
{ binStep: 2, baseFactor: 20000, fee: '0.0004' },
{ binStep: 5, baseFactor: 10000, fee: '0.0005' },
{ binStep: 10, baseFactor: 10000, fee: '0.001' },
{ binStep: 15, baseFactor: 10000, fee: '0.0015' },
{ binStep: 20, baseFactor: 10000, fee: '0.002' },
{ binStep: 25, baseFactor: 10000, fee: '0.0025' },
{ binStep: 30, baseFactor: 10000, fee: '0.003' },
{ binStep: 50, baseFactor: 8000, fee: '0.004' },
{ binStep: 80, baseFactor: 7500, fee: '0.006' },
{ binStep: 100, baseFactor: 8000, fee: '0.008' },
{ binStep: 100, baseFactor: 10000, fee: '0.01' },
{ binStep: 200, baseFactor: 10000, fee: '0.02' },
{ binStep: 400, baseFactor: 10000, fee: '0.04' }
]
参数解释:
binStep:宾馆之间的阶梯尺寸,确定池子的价格颗粒. 更小的数值提供了更细小的价格分辨率,但需要更多的计算资源.baseFactor: 收费计算中使用的乘数,会影响池的整体收费结构.fee: 十进制交易收费率(如"0.0001"=0.01%). 这是每次互换交易收取的费用.
收费等级建议:
- 低收费(0.01%-0.05%): 稳定配对或低挥发性主流资产的最佳
- 中等费用(0.1% - 0.3%): 适用于中等挥发性资产或主流交易配对
- 高收费(0.4%-4%): 推荐高挥发性资产、代币或小市场上限配对
在创建新池时, 请选择最符合您交易配对特性的收费配置 :
// Example: Create a pool for a stable pair (USDC/USDT)
const stablePairConfig = { binStep: 1, baseFactor: 10000, fee: '0.0001' }
// Example: Create a pool for a volatile altcoin pair
const altcoinConfig = { binStep: 100, baseFactor: 10000, fee: '0.01' }
1. 集合业务
获取池信息
// Get all pools
const pools = await sdk.Pool.getPools()
// Get specific pool
const pool = await sdk.Pool.getPool(pool_id)
// Get specific pools by their IDs
const assign_pools = await sdk.Pool.getAssignPoolList([
'0x...',
// Add more pool IDs as needed
])
// Get bin information
const bin_info = await sdk.Pool.getBinInfo(pool_id, bin_id, bin_step)
// Get pool bin information
const pool_bin_info = await sdk.Pool.getPoolBinInfo(pool_id)
// Get bin step configurations
const bin_step_configs = await sdk.Pool.getBinStepConfigs()
// Get pool transaction list
const pool_transactions = await sdk.Pool.getPoolTransactionList({
pool_id: '0x...',
pagination_args: { limit: 10 }
})
创建池
创建池有两种方式:
方法 1: 只创建池
// Create a new pool without adding liquidity
const bin_step = 2
const base_factor = 10000
const price = '1.1'
const active_id = BinUtils.getBinIdFromPrice(price, bin_step, true, 6, 6)
const tx = new Transaction()
await sdk.Pool.createPoolPayload({
active_id,
bin_step,
coin_type_a: '0x...::usdc::USDC',
coin_type_b: '0x...::usdt::USDT',
base_factor,
}, tx)
方法2:在一个交易中创建集合并添加流动性
// Create pool and add liquidity in one transaction
const bin_step = 2
const base_factor = 10000
const price = '1.1'
const active_id = BinUtils.getBinIdFromPrice(price, bin_step, true, 6, 6)
// Calculate liquidity distribution
const bin_infos = sdk.Position.calculateAddLiquidityInfo({
active_id,
bin_step,
lower_bin_id: active_id - 10,
upper_bin_id: active_id + 10,
amount_a_in_active_bin: '0',
amount_b_in_active_bin: '0',
strategy_type: StrategyType.Spot,
coin_amount: '10000000',
fix_amount_a: true,
})
const createAndAddTx = await sdk.Pool.createPoolAndAddLiquidityPayload({
active_id,
lower_bin_id: active_id - 10,
upper_bin_id: active_id + 10,
bin_step,
bin_infos,
coin_type_a: '0x14a71d857b34677a7d57e0feb303df1adb515a37780645ab763d42ce8d1a5e48::usdc::USDC',
coin_type_b: '0x14a71d857b34677a7d57e0feb303df1adb515a37780645ab763d42ce8d1a5e48::eth::ETH',
strategy_type: StrategyType.Spot,
use_bin_infos: false,
base_factor,
})
2. 职位业务
获取位置信息
// Get owner's position list
const positions = await sdk.Position.getOwnerPositionList(wallet)
// Get specific position
const position = await sdk.Position.getPosition(position_id)
3. 收费业务
收费和报酬计算
为了计算职位的收费和奖励,您可以使用 fetchPositionFeeAndReward 方法。 此方法允许您同时获得一个或多个职位的收费和奖励数据:
// First get the pool information
const pool = await sdk.Pool.getPool(pool_id)
const { id, coin_type_a, coin_type_b, reward_manager } = pool
// Fetch fee and reward data
const { feeData, rewardData } = await sdk.Position.fetchPositionFeeAndReward([
{
pool_id: id,
position_id: position_id,
reward_coins: reward_manager.rewards.map((reward) => reward.reward_coin),
coin_type_a,
coin_type_b,
},
])
费率计算
// Get total fee rate for a pool
const totalFeeRate = await sdk.Pool.getTotalFeeRate({
pool_id,
coin_type_a,
coin_type_b
})
// Get variable fee from pool parameters
const variableFee = FeeUtils.getVariableFee(pool.variable_parameters)
console.log('Variable fee:', variableFee)
console.log('Variable fee percentage:', d(variableFee).div(d(FEE_PRECISION)).toString())
获取总计返回值
这个 getTotalFeeRate 方法返回 a FeeRate 包含下列字段的天体:
type FeeRate = {
base_fee_rate: string // Base fee rate
var_fee_rate: string // Variable fee rate
total_fee_rate: string // Total fee rate
}
字段描述 :
base_fee_rate: 基费标准,从池中计算bin_step财务报告和审定财务报表base_factor,是一个固定值var_fee_rate:可变费率,根据池的起伏累积器动态计算(volatility_accumulator),随着市场波动而变化total_fee_rate: 总费率等值base_fee_rate + var_fee_rate,但不超过最高费率限额(MAX_FEE_RATE = 100,000,000(中文(简体) )
收费率精度 :
- 所有费率价值
FEE_PRECISION = 1,000,000,000作为精度单位 - 要获得实际百分比,将收费率除以
FEE_PRECISION - 示例:如果
total_fee_rate实值3000000,实际费率为3000000 / 1000000000 = 0.003 = 0.3%
用法示例:
const feeRate = await sdk.Pool.getTotalFeeRate({
pool_id: "0x...",
coin_type_a: "0x...",
coin_type_b: "0x..."
})
// Calculate actual percentages
const baseFeePercentage = d(feeRate.base_fee_rate).div(d(FEE_PRECISION)).mul(100).toString()
const varFeePercentage = d(feeRate.var_fee_rate).div(d(FEE_PRECISION)).mul(100).toString()
const totalFeePercentage = d(feeRate.total_fee_rate).div(d(FEE_PRECISION)).mul(100).toString()
console.log(`Base fee rate: ${baseFeePercentage}%`)
console.log(`Variable fee rate: ${varFeePercentage}%`)
console.log(`Total fee rate: ${totalFeePercentage}%`)
收费工具方法
这个 FeeUtils 类为计算费用提供了几种实用方法:
1. 联合国. getVariableFee(variableParameters: VariableParameters): string
根据集合参数和市场波动来计算可变收费.
import { FeeUtils } from '@cetusprotocol/dlmm-sdk'
const variableFee = FeeUtils.getVariableFee(pool.variable_parameters)
console.log('Variable fee:', variableFee)
console.log('Variable fee percentage:', d(variableFee).div(d(FEE_PRECISION)).toString())
2. 联合国. calculateCompositionFee(amount: string, total_fee_rate: string): string
计算流动性业务的组成费.
const compositionFee = FeeUtils.calculateCompositionFee(amount, total_fee_rate)
3个. calculateProtocolFee(fee_amount: string, protocol_fee_rate: string): string
根据费用数额和协议费计算协议费.
const protocolFee = FeeUtils.calculateProtocolFee(fee_amount, protocol_fee_rate)
4.四. getProtocolFees(fee_a: string, fee_b: string, protocol_fee_rate: string)
计算两个令牌的一对协议费.
const { protocol_fee_a, protocol_fee_b } = FeeUtils.getProtocolFees(fee_a, fee_b, protocol_fee_rate)
console.log('Protocol fee A:', protocol_fee_a)
console.log('Protocol fee B:', protocol_fee_b)
5 (韩语). getCompositionFees(active_bin: BinAmount, used_bin: BinAmount, variableParameters: VariableParameters)
考虑到可变参数,计算活动箱和使用箱的构成费.
const { fees_a, fees_b } = FeeUtils.getCompositionFees(active_bin, used_bin, variableParameters)
console.log('Composition fees A:', fees_a)
console.log('Composition fees B:', fees_b)
收费单位方法摘要 :
| 方法 | 说明 | 参数 | 回返 |
|---|---|---|---|
getVariableFee | 从集合参数计算可变费用 | variableParameters | string |
calculateCompositionFee | 计算某一数额的构成费 | amount, (中文(简体) ), total_fee_rate | string |
calculateProtocolFee | 计算协议费 | fee_amount, (中文(简体) ), protocol_fee_rate | string |
getProtocolFees | 计算两个令牌的协议费 | fee_a, (中文(简体) ), fee_b, (中文(简体) ), protocol_fee_rate | {protocol_fee_a, protocol_fee_b} |
getCompositionFees | 计算垃圾箱的组装费 | active_bin, (中文(简体) ), used_bin, (中文(简体) ), variableParameters | {fees_a, fees_b} |
收费和奖励
您可通过多种方式从岗位上收取费用:
- 收费和奖励数字 :
// Build collect fee and reward transaction
const tx = await sdk.Position.collectRewardAndFeePayload([{
pool_id,
position_id,
reward_coins: reward_manager.rewards.map((reward) => reward.reward_coin),
coin_type_a,
coin_type_b
}])
// Simulate or send the transaction
const sim_result = await sdk.FullClient.sendSimulationTransaction(tx, wallet)
4. 流动性业务
添加流动性
DLMM SDK提供了两种增加流动性的主要方法:
calculateAddLiquidityInfo(option)- 计算各垃圾箱之间的流动资金分布addLiquidityPayload(option, tx?)- 创建交易有效载荷来增加流动性
方法1: calculateAddLiquidityInfo(option: CalculateAddLiquidityOption | CalculateAddLiquidityAutoFillOption)
这种方法根据您的策略和参数计算流动性应如何在不同的垃圾箱之间分配.
参数 CalculateAddLiquidityOption数字 :
interface CalculateAddLiquidityOption {
pool_id: string // Pool ID
amount_a: string // Amount of token A to add
amount_b: string // Amount of token B to add
active_id: number // Current active bin ID
bin_step: number // Bin step size
lower_bin_id: number // Lower bound of bin range
upper_bin_id: number // Upper bound of bin range
active_bin_of_pool?: { // Active bin amounts (if active bin is in range)
amount_a: string
amount_b: string
}
strategy_type: StrategyType // Liquidity strategy (Spot, BidAsk, Curve)
}
参数 CalculateAddLiquidityAutoFillOption数字 :
interface CalculateAddLiquidityAutoFillOption {
pool_id: string // Pool ID
coin_amount: string // Fixed amount of one token
fix_amount_a: boolean // true for token A, false for token B
active_id: number // Current active bin ID
bin_step: number // Bin step size
lower_bin_id: number // Lower bound of bin range
upper_bin_id: number // Upper bound of bin range
active_bin_of_pool?: { // Active bin amounts (if active bin is in range)
amount_a: string
amount_b: string
}
strategy_type: StrategyType // Liquidity strategy (Spot, BidAsk, Curve)
}
方法2: addLiquidityPayload(option: AddLiquidityOption | OpenAndAddLiquidityOption, tx?: Transaction)
这种方法创造了交易有效载荷,用于将流动性添加到现有位置或打开新位置.
参数 AddLiquidityOption (现有职位):
interface AddLiquidityOption {
pool_id: string // Pool ID
bin_infos: BinLiquidityInfo // Calculated bin distribution from calculateAddLiquidityInfo
coin_type_a: string // Token A coin type
coin_type_b: string // Token B coin type
active_id: number // Current active bin ID
position_id: string // Existing position ID
collect_fee: boolean // Whether to collect fees
reward_coins: string[] // Reward coin types
strategy_type: StrategyType // Liquidity strategy
use_bin_infos: boolean // Whether to use calculated bin_infos
max_price_slippage: number // Maximum price slippage tolerance
bin_step: number // Bin step size
}
参数 OpenAndAddLiquidityOption (新职位):
interface OpenAndAddLiquidityOption {
pool_id: string // Pool ID
bin_infos: BinLiquidityInfo // Calculated bin distribution from calculateAddLiquidityInfo
coin_type_a: string // Token A coin type
coin_type_b: string // Token B coin type
lower_bin_id: number // Lower bound of bin range
upper_bin_id: number // Upper bound of bin range
active_id: number // Current active bin ID
strategy_type: StrategyType // Liquidity strategy
use_bin_infos: boolean // Whether to use calculated bin_infos
max_price_slippage: number // Maximum price slippage tolerance
bin_step: number // Bin step size
}
完整示例 - 在现有位置上添加流动性:
// Step 1: Calculate liquidity distribution
const calculateOption: CalculateAddLiquidityOption = {
pool_id: '0x...',
amount_a: '1000000',
amount_b: '1200000',
active_id: 100,
bin_step: 2,
lower_bin_id: 90,
upper_bin_id: 110,
active_bin_of_pool: amounts_in_active_bin, // Optional: if active bin is in range
strategy_type: StrategyType.Spot
}
const bin_infos = await sdk.Position.calculateAddLiquidityInfo(calculateOption)
// Step 2: Create transaction payload
const addLiquidityOption: AddLiquidityOption = {
pool_id: '0x...',
bin_infos: bin_infos,
coin_type_a: '0x...::usdc::USDC',
coin_type_b: '0x...::usdt::USDT',
active_id: 100,
position_id: '0x...',
collect_fee: true,
reward_coins: [],
strategy_type: StrategyType.Spot,
use_bin_infos: false,
max_price_slippage: 0.01,
bin_step: 2
}
const tx = sdk.Position.addLiquidityPayload(addLiquidityOption)
完整示例 - 打开新位置 :
// Step 1: Calculate liquidity distribution
const calculateOption: CalculateAddLiquidityOption = {
pool_id: '0x...',
amount_a: '1000000',
amount_b: '1200000',
active_id: 100,
bin_step: 2,
lower_bin_id: 90,
upper_bin_id: 110,
active_bin_of_pool: amounts_in_active_bin,
strategy_type: StrategyType.Spot
}
const bin_infos = await sdk.Position.calculateAddLiquidityInfo(calculateOption)
// Step 2: Create transaction payload for new position
const openPositionOption: OpenAndAddLiquidityOption = {
pool_id: '0x...',
bin_infos: bin_infos,
coin_type_a: '0x...::usdc::USDC',
coin_type_b: '0x...::usdt::USDT',
lower_bin_id: 90,
upper_bin_id: 110,
active_id: 100,
strategy_type: StrategyType.Spot,
use_bin_infos: false,
max_price_slippage: 0.01,
bin_step: 2
}
const tx = sdk.Position.addLiquidityPayload(openPositionOption)
重要参数注释:
active_bin_of_pool: 当活性垃圾桶落在您的位置范围内时, 此参数至关重要 。 使用getActiveBinIfInRange()以获取正确的值.use_bin_infos: 当false,合同在内部计算流动性分配true,它使用提供的bin_infos。 。 。 .max_price_slippage:在交易执行过程中防止价格波动(如0.01=1%的滑行容忍度).collect_fee:仅适用于现有职位;确定在增加流动资金时是否收取累积费用.strategy_type: 影响流动资金如何在垃圾箱之间分配:Spot: 甚至按时价分配BidAsk: 集中在特定价格水平Curve: 曲线后平滑分布
增加流动性有三种战略:Spot、BidAsk和Curve。 下面是使用每个:
- 点点战略数字 :
// Get pool information
const pool = await sdk.Pool.getPool(pool_id)
const { active_id, bin_step, bin_manager } = pool
// Get amounts in active bin if it's within the range
const amounts_in_active_bin = await sdk.Position.getActiveBinIfInRange(
bin_manager.bin_manager_handle,
lower_bin_id,
upper_bin_id,
active_id,
bin_step
)
// Calculate liquidity distribution
const calculateOption = {
pool_id,
amount_a: '1000000',
amount_b: '1200000',
active_id,
bin_step,
lower_bin_id: -10,
upper_bin_id: 10,
amount_a_in_active_bin: amounts_in_active_bin?.amount_a || '0',
amount_b_in_active_bin: amounts_in_active_bin?.amount_b || '0',
strategy_type: StrategyType.Spot
}
const bin_infos = await sdk.Position.calculateAddLiquidityInfo(calculateOption)
// For new position
const addOption = {
pool_id,
amount_a,
amount_b,
active_id,
bin_step,
lower_bin_id,
upper_bin_id,
active_bin_of_pool: amounts_in_active_bin,
strategy_type: StrategyType.Spot,
}
const tx = sdk.Position.addLiquidityPayload(addOption)
// For existing position
const addOption = {
pool_id,
bin_infos: bin_infos,
coin_type_a,
coin_type_b,
active_id,
position_id,
collect_fee: true,
reward_coins: [],
strategy_type: StrategyType.Spot,
use_bin_infos: false,
max_price_slippage: 0.01,
bin_step,
}
const tx = sdk.Position.addLiquidityPayload(addOption)
说明: amount_a_in_active_bin 财务报告和审定财务报表 amount_b_in_active_bin 参数用于计算在您位置范围内的正态流动资金分布。 这些值是使用下列方法获得的: getActiveBinIfInRange 方法,该方法:
- 检查活动本是否在指定范围内
- 如果在活动框内, 返回这两个符号的金额
- 返回未定义的已激活的 bin 在区域外
- 投标战略数字 :
// Similar to Spot strategy but with different strategy_type
const calculateOption = {
amount_a: '1000000',
amount_b: '1200000',
active_id,
bin_step,
lower_bin_id: -10,
upper_bin_id: 10,
amount_a_in_active_bin: '0',
amount_b_in_active_bin: '0',
strategy_type: StrategyType.BidAsk
}
- 曲线策略数字 :
// Similar to Spot strategy but with different strategy_type
const calculateOption = {
amount_a: '1000000',
amount_b: '1200000',
active_id,
bin_step,
lower_bin_id: -10,
upper_bin_id: 10,
amount_a_in_active_bin: '0',
amount_b_in_active_bin: '0',
strategy_type: StrategyType.Curve
}
- 固定数额战略数字 :
// Calculate with fixed amount of one token
const calculateOption = {
coin_amount: '1000000',
fix_amount_a: true, // true for token A, false for token B
active_id,
bin_step,
lower_bin_id: -10,
upper_bin_id: 10,
amount_a_in_active_bin: '0',
amount_b_in_active_bin: '0',
strategy_type: StrategyType.Spot // or BidAsk or Curve
}
- 添加流动性与价格数字 :
// Add liquidity with specific price range
const addOption = {
pool_id,
bin_infos,
coin_type_a: pool.coin_type_a,
coin_type_b: pool.coin_type_b,
price_base_coin: 'coin_a',
price: price.toString(),
lower_price,
upper_price,
bin_step,
amount_a_in_active_bin: amounts_in_active_bin?.amount_a || '0',
amount_b_in_active_bin: amounts_in_active_bin?.amount_b || '0',
strategy_type: StrategyType.Spot,
decimals_a: 6,
decimals_b: 6,
max_bin_slippage: 0.01,
active_id,
// If use_bin_infos is true, liquidity is allocated according to bin_infos; otherwise, it is calculated internally by the contract
use_bin_infos: false,
}
const tx = sdk.Position.addLiquidityWithPricePayload(addOption)
删除流动性
有两种方法可以消除流动性:
- 随两个数量一起删除数字 :
// Get position and pool information
const pool = await sdk.Pool.getPool(pool_id)
const position = await sdk.Position.getPosition(position_id)
const { active_id, bin_step, bin_manager } = pool
// Get active bin information
const active_bin = await sdk.Pool.getBinInfo(bin_manager.bin_manager_handle, active_id, bin_step)
const liquidity_shares_data = parseLiquidityShares(position.liquidity_shares, bin_step, position.lower_bin_id, active_bin)
// Calculate removal amounts
const calculateOption = {
bins: liquidity_shares_data.bins,
active_id,
fix_amount_a: true,
coin_amount: '100000'
}
const bin_infos = sdk.Position.calculateRemoveLiquidityInfo(calculateOption)
// Build and send transaction
const removeOption = {
pool_id,
bin_infos,
coin_type_a: pool.coin_type_a,
coin_type_b: pool.coin_type_b,
position_id,
active_id,
slippage: 0.01,
reward_coins: [],
collect_fee: true,
reward_coins: [],
bin_step,
remove_percent: 0.5, // If remove_percent is specified, bin_infos will not be effective
}
const tx = sdk.Position.removeLiquidityPayload(removeOption)
- 只删除一个托肯数字 :
const calculateOption = {
bins: liquidity_shares_data.bins,
active_id,
is_only_a: true, // true for token A, false for token B
coin_amount: '100000'
}
关闭位置
// Close position (This will collect all fees, rewards and remove all liquidity)
const tx = sdk.Position.closePositionPayload({
pool_id,
position_id,
coin_type_a,
coin_type_b,
reward_coins: pool.reward_manager.rewards.map(reward => reward.reward_coin) // Required: Must include all reward coin types from the pool
})
// Simulate or send the transaction
const sim_result = await sdk.FullClient.sendSimulationTransaction(tx, wallet)
注: 结束职位将:
- 收取所有累计费用
- 收集所有待定的奖赏(必须包括池中的所有奖赏硬币)
- 从位置移除全部流动性
- 删除该位置
5. 交换业务
// Get pool information
const pool = await sdk.Pool.getPool(pool_id)
const { coin_type_a, coin_type_b } = pool
// Get swap quote
const quote_obj = await sdk.Swap.preSwapQuote({
pool_id,
a2b: true, // true for A to B, false for B to A
by_amount_in: true, // true for exact input, false for exact output
in_amount: '2000000',
coin_type_a,
coin_type_b
})
// Build and send swap transaction
const tx = sdk.Swap.swapPayload({
coin_type_a,
coin_type_b,
quote_obj,
by_amount_in: true,
slippage: 0.01
})
6. 伙伴业务
伙伴管理
// Get partner list
const partnerList = await sdk.Partner.getPartnerList()
// Get specific partner
const partner = await sdk.Partner.getPartner(partner_id)
// Get partner capability ID
const partnerCapId = await sdk.Partner.getPartnerCapId(account, partner_id)
// Get partner balance
const partnerBalance = await sdk.Partner.getPartnerBalance(partner_id)
// Create partner
const start_time = Math.floor(Date.now() / 1000) + 5000
const tx = sdk.Partner.createPartnerPayload({
name: 'test partner',
ref_fee_rate: 0.01,
start_time,
end_time: start_time + 9 * 24 * 3600,
recipient: account,
})
// Update referral fee rate
const updateFeeTx = await sdk.Partner.updateRefFeeRatePayload({
partner_id: '0x..',
ref_fee_rate: 0.02,
})
// Update time range
const start_time = Math.floor(Date.now() / 1000)
const updateTimeTx = await sdk.Partner.updateTimeRangePayload({
partner_id: '0x..',
start_time,
end_time: start_time + 10 * 7 * 24 * 3600,
})
// claim ref fee
const tx = await sdk.Position.claimRefFeePayload({
partner_id: "0x..",
partner_cap_id: "0x..", // Optional parameter
fee_coin_types: [coin_type]
})
// Simulate or send the transaction
const sim_result = await sdk.FullClient.sendSimulationTransaction(tx, wallet)
7. 奖励业务
奖励管理
// Initialize rewards for a pool
const initTx = sdk.Reward.initRewardPayload({
pool_id,
reward_coin_types: ['0x2::sui::SUI', '0x5::usdc::USDC']
})
// Add reward to a pool
const addRewardTx = sdk.Reward.addRewardPayload({
pool_id,
reward_coin_type: '0x2::sui::SUI',
reward_amount: '1000000',
end_time_seconds: Math.floor(Date.now() / 1000) + 30 * 24 * 3600, // 30 days
start_time_seconds: Math.floor(Date.now() / 1000) + 3600, // 1 hour from now
})
// Update reward access (public/private)
const accessTx = sdk.Reward.updateRewardAccessPayload({
pool_id,
type: 'to_public', // or 'to_private'
})
// Manage reward whitelist
const whitelistTx = sdk.Reward.updateRewardWhiteListPayload({
reward_coin_types: ['0x2::sui::SUI'],
type: 'add' // or 'remove'
})
8. 配置管理
SDK 通过 Config 模块 :
// Get global DLMM configuration
const globalConfig = await sdk.Config.getDlmmGlobalConfig()
// Get bin step configuration list
const binStepConfigs = await sdk.Config.getBinStepConfigList(pool_id)
// Fetch all SDK configurations
const sdkConfigs = await sdk.Config.fetchDlmmSdkConfigs()
// Get reward period emission data
const rewardEmission = await sdk.Reward.getRewardPeriodEmission(
reward_manager_id,
reward_period,
current_time
)
9. 本业务
SDK提供综合的公用功能,以通过 BinUtils 类 :
import { BinUtils } from '@cetusprotocol/dlmm-sdk'
// Convert price to bin ID
const binId = BinUtils.getBinIdFromPrice(
'1040.07', // price
2, // bin step
true, // is base coin A
6, // decimals for coin A
9 // decimals for coin B
)
// Convert bin ID to price
const price = BinUtils.getPriceFromBinId(
-4787, // bin ID
2, // bin step
6, // decimals for coin A
9 // decimals for coin B
)
// Get Q price from bin ID
const q_price = BinUtils.getQPriceFromId(
-4400, // bin ID
100 // bin step
)
// Get price per lamport from Q price
const price_per_lamport = BinUtils.getPricePerLamportFromQPrice(q_price)
// Get liquidity from amounts
const liquidity = BinUtils.getLiquidity('0', '266666', '18431994054197767090')
// Get amount A from liquidity
const amountA = BinUtils.getAmountAFromLiquidity('4101094304427826916657468', '18461505896777422276')
// Get amount B from liquidity
const amountB = BinUtils.getAmountBFromLiquidity('4919119455159831291232256')
// Split bin liquidity info
const split_bin_infos = BinUtils.splitBinLiquidityInfo(bin_infos, 0, 70)
// Get position count between bin ranges
const positionCount = BinUtils.getPositionCount(-750, 845)
// Find min/max bin ID for a given bin step
const { minBinId, maxBinId } = BinUtils.findMinMaxBinId(10)
这些公用事业功能在下列情况下特别有用:
- 确定流动性头寸的价格幅度
- 计算交易战略的最佳宾站范围
- 在不同的价格表述之间转换
- 二. 管理各垃圾箱之间的流动资金分配
- 分析位置密度和分布
9. 高级业务
验证活动 ID 剪贴页
// Validate that the active ID hasn't moved too much
const isValid = await sdk.Position.validateActiveIdSlippage({
pool_id,
active_id,
max_bin_slippage: 0.01
})
更新职位费和奖励
// Update position fee and reward information
await sdk.Position.updatePositionFeeAndRewards({
pool_id,
position_id,
coin_type_a,
coin_type_b
})
解决问题
共同问题
1. 交易模拟失败
// Always simulate transactions before sending
const simResult = await sdk.FullClient.sendSimulationTransaction(tx, wallet)
if (simResult.effects.status.status === 'failure') {
console.error('Transaction simulation failed:', simResult.effects.status.error)
}
2. 天然气预算不足
// Set appropriate gas budget for complex operations
tx.setGasBudget(10000000000) // 10 SUI
3. 活动本位范围验证
// Always check if active bin is within your position range
const amounts_in_active_bin = await sdk.Position.getActiveBinIfInRange(
pool.bin_manager.bin_manager_handle,
lower_bin_id,
upper_bin_id,
active_id,
bin_step
)
4. 价格滑行保护
// Use appropriate slippage protection
const isValid = await sdk.Position.validateActiveIdSlippage({
pool_id,
active_id,
max_bin_slippage: 0.01 // 1% slippage tolerance
})
调试提示
1. 打印交易细节
import { printTransaction } from '@cetusprotocol/common-sdk'
// Print transaction for debugging
printTransaction(tx)
2. 检查池状态
// Always verify pool state before operations
const pool = await sdk.Pool.getPool(pool_id)
console.log('Pool active_id:', pool.active_id)
console.log('Pool bin_step:', pool.bin_step)
3. 验证位置数据
// Parse and validate position liquidity shares
const active_bin = await sdk.Pool.getBinInfo(pool.bin_manager.bin_manager_handle, pool.active_id, pool.bin_step)
const liquidity_shares_data = parseLiquidityShares(position.liquidity_shares, pool.bin_step, position.lower_bin_id, active_bin)
console.log('Liquidity shares data:', liquidity_shares_data)
更多关于 Cetus
使用以下链接来进一步了解 Cetus :
学习更多与Cetus合作 Cetus 文档。 。 。 .
加入Cetus社区 Cetus 迪斯科尔。 。 。 .
许可证
麻省理工学院