区间转换器
FullRangeConvertorV2
FullRangeConvertorV2 将 V3 窄区间仓位转换为全区间仓位,并在同一笔交易中将新仓位锁入 BDexV3LiquidityLocker。
convertToFullRangeAndLock
function convertToFullRangeAndLock(
LockParams lockParams,
SlippageChecks slippageParams
) external payable returns (
uint256 newLockId,
uint256 amountLiquidity0,
uint256 amountLiquidity1,
uint256 refund0,
uint256 refund1
);
调用前,NFT Owner 必须将 lockParams.nft_id 授权给 FullRangeConvertorV2。
lockParams
struct LockParams {
INonfungiblePositionManager nftPositionManager;
uint256 nft_id;
address dustRecipient;
address owner;
address additionalCollector;
address collectAddress;
uint256 unlockDate;
uint16 countryCode;
string feeName;
bytes[] r;
}
| 参数 | 说明 |
|---|---|
nftPositionManager | 原仓位 NFT 所属的 Position Manager(BDex),必须已加入 Locker 白名单。 |
nft_id | 要转换并锁仓的 NFT ID。 |
dustRecipient | 接收未用于新流动性的 token0/token1,以及锁仓初始收取结果的地址。 |
owner | 新锁仓的 Owner。 |
additionalCollector | 允许额外执行手续费收取的地址。 |
collectAddress | 自动收取手续费时的接收地址,不能为零地址。 |
unlockDate | 秒级解锁时间,必须晚于当前时间;永久锁仓使用 ETERNAL_LOCK。 |
countryCode | Locker 支持的国家或地区代码。 |
feeName | Locker 费用方案名称;默认使用 DEFAULT。 |
r | 动态费用签名参数;不使用动态费用时传空数组 []。 |
slippageParams
struct SlippageChecks {
uint256 amount0LiquidityMin;
uint256 amount1LiquidityMin;
uint256 amount0RefundMin;
uint256 amount1RefundMin;
}
| 参数 | 说明 |
|---|---|
amount0LiquidityMin | 铸造全区间 NFT 时,token0 的最小投入数量。窄区间转换时必须大于 0。 |
amount1LiquidityMin | 铸造全区间 NFT 时,token1 的最小投入数量。窄区间转换时必须大于 0。 |
amount0RefundMin | 转换后退还给 dustRecipient 的 token0 最小数量,通常传 0。 |
amount1RefundMin | 转换后退还给 dustRecipient 的 token1 最小数量,通常传 0。 |
amount0RefundMin 和 amount1RefundMin 表示最小退款量,并非最大滑点或最大损失。
msg.value
当 feeName 对应的固定费用使用原生代币时,msg.value 必须与该费用方案的 flatFee 完全一致。
当前 Converter 不支持支付 ERC20 固定费用,因此不能使用 flatFeeToken != address(0) 且 flatFee > 0 的费用方案。
返回值
| 返回值 | 说明 |
|---|---|
newLockId | 新创建的 Locker Lock ID。 |
amountLiquidity0 | 实际用于新全区间流动性的 token0 数量。 |
amountLiquidity1 | 实际用于新全区间流动性的 token1 数量。 |
refund0 | 退还给 dustRecipient 的 token0 数量。 |
refund1 | 退还给 dustRecipient 的 token1 数量。 |
如果原 NFT 已经是全区间仓位,合约会跳过重新铸造并直接锁仓;此时流动性投入量和退款量均返回 0。
getRangeAndMaxTick
function getRangeAndMaxTick(
INonfungiblePositionManager nftPositionManager,
uint256 nftId
) external view returns (
bool isFullRange,
int24 maxTick
);
| 参数或返回值 | 说明 |
|---|---|
nftPositionManager | NFT 所属的 Position Manager。 |
nftId | 要查询的 NFT ID。 |
isFullRange | 当前 NFT 是否已经是全区间仓位。 |
maxTick | 当前费率等级对应的最大可用 Tick。全区间为 [-maxTick, maxTick]。 |
tickSpacingToMaxTick
function tickSpacingToMaxTick(
int24 tickSpacing
) external pure returns (int24 maxTick);
| 参数或返回值 | 说明 |
|---|---|
tickSpacing | Pool 费率等级对应的 Tick 间距。 |
maxTick | 该 Tick 间距对应的最大可用 Tick。 |