@sun-protocol/sun-sdk-protocols 0.1.0-beta.0
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/README.md +30 -0
- package/dist/chunk-5XDX5563.js +99 -0
- package/dist/chunk-5XDX5563.js.map +1 -0
- package/dist/chunk-C2YCVBPI.js +212 -0
- package/dist/chunk-C2YCVBPI.js.map +1 -0
- package/dist/chunk-ECCGOXNA.js +1317 -0
- package/dist/chunk-ECCGOXNA.js.map +1 -0
- package/dist/chunk-HD2S3Q7L.js +746 -0
- package/dist/chunk-HD2S3Q7L.js.map +1 -0
- package/dist/chunk-L5TZCDPH.js +561 -0
- package/dist/chunk-L5TZCDPH.js.map +1 -0
- package/dist/chunk-OM4OW4KB.js +224 -0
- package/dist/chunk-OM4OW4KB.js.map +1 -0
- package/dist/chunk-PEGREDLT.js +935 -0
- package/dist/chunk-PEGREDLT.js.map +1 -0
- package/dist/chunk-TSHXXRH2.js +103 -0
- package/dist/chunk-TSHXXRH2.js.map +1 -0
- package/dist/chunk-VFVKMC4H.js +521 -0
- package/dist/chunk-VFVKMC4H.js.map +1 -0
- package/dist/chunk-YMGZDXI4.js +1209 -0
- package/dist/chunk-YMGZDXI4.js.map +1 -0
- package/dist/common-8VQQ0FSU.d.cts +146 -0
- package/dist/common-8VQQ0FSU.d.ts +146 -0
- package/dist/execute-BNKh6dT6.d.cts +187 -0
- package/dist/execute-CVhcKZxF.d.ts +187 -0
- package/dist/index.cjs +5619 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +139 -0
- package/dist/index.d.ts +139 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/intents-BSXq1HvW.d.cts +200 -0
- package/dist/intents-CwOttD75.d.ts +200 -0
- package/dist/liquidity/index.cjs +2441 -0
- package/dist/liquidity/index.cjs.map +1 -0
- package/dist/liquidity/index.d.cts +83 -0
- package/dist/liquidity/index.d.ts +83 -0
- package/dist/liquidity/index.js +32 -0
- package/dist/liquidity/index.js.map +1 -0
- package/dist/positions/index.cjs +1544 -0
- package/dist/positions/index.cjs.map +1 -0
- package/dist/positions/index.d.cts +159 -0
- package/dist/positions/index.d.ts +159 -0
- package/dist/positions/index.js +25 -0
- package/dist/positions/index.js.map +1 -0
- package/dist/pump/index.cjs +1178 -0
- package/dist/pump/index.cjs.map +1 -0
- package/dist/pump/index.d.cts +16 -0
- package/dist/pump/index.d.ts +16 -0
- package/dist/pump/index.js +29 -0
- package/dist/pump/index.js.map +1 -0
- package/dist/swap/index.cjs +2259 -0
- package/dist/swap/index.cjs.map +1 -0
- package/dist/swap/index.d.cts +33 -0
- package/dist/swap/index.d.ts +33 -0
- package/dist/swap/index.js +61 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/types-BTPdCC7k.d.cts +160 -0
- package/dist/types-BfrouFmO.d.ts +160 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/positions/index.ts","../../src/positions/v3.ts","../../src/common.ts","../../src/context.ts","../../src/execute-http-action.ts","../../src/execute-plan.ts","../../src/errors.ts","../../src/positions/execute.ts","../../src/usdt-transfer.ts","../../src/internal/tokens.ts","../../src/internal/method-parameters.ts","../../src/internal/positions.ts","../../src/internal/reads.ts","../../src/liquidity/v3.ts","../../src/positions/intents.ts","../../src/positions/v4.ts","../../src/positions/client.ts"],"sourcesContent":["export {\n createPositionsClient,\n PositionsClient,\n} from './client.js'\nexport { V3PositionsClient } from './v3.js'\nexport { assertV3PositionUsdtTransfer, createV3PositionsExecutor } from './execute.js'\nexport { V4PositionsClient } from './v4.js'\nexport {\n SUNSWAP_V3_POSITION_PROTOCOL_ID,\n SUNSWAP_V4_POSITION_PROTOCOL_ID,\n} from './intents.js'\nexport type {\n PositionActionOptions,\n PositionCollectInput,\n PositionLiquidityInput,\n PositionRemoveInput,\n V3PositionCollectInput,\n V3PositionReadInput,\n V3PositionRemoveInput,\n V3PositionSnapshot,\n V4PositionCollectInput,\n V4PositionFeesSnapshot,\n V4PositionReadInput,\n V4PositionRemoveInput,\n V4PositionSnapshot,\n} from './types.js'\nexport type { ApprovalMode } from '../types/options.js'\nexport type { TransactionPlan } from '../types/plan.js'\n","import {\n CurrencyAmount,\n Percent,\n SDKError,\n Token,\n assertTronAddress,\n type Currency,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n buildV3PositionApprovalForAllRead,\n buildV3PositionReads,\n computeV3PoolAddress,\n NonfungiblePositionManager,\n Pool,\n Position,\n type FeeAmount,\n} from '@sun-protocol/sun-sdk-sunswap-v3'\nimport {\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n normalizeRecipient,\n parseSlippage,\n slippageToBips,\n} from '../common.js'\nimport {\n requireWalletAddress,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport { executeTransactionPlan } from '../execute-plan.js'\nimport { createV3PositionsExecutor } from './execute.js'\nimport type { TransferSource, UsdtTransferContext } from '../usdt-transfer.js'\nimport { methodParametersToAction } from '../internal/method-parameters.js'\nimport { assertPositionAuthorized } from '../internal/positions.js'\nimport {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport {\n evmHexToTronAddress,\n normalizeLiquidityPercentage,\n tronAddressToEvmAddress,\n} from '../internal/tokens.js'\nimport { resolveV3PoolState } from '../liquidity/v3.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V3PositionCollectInput,\n V3PositionReadInput,\n V3PositionRemoveInput,\n V3PositionSnapshot,\n} from './types.js'\nimport {\n positionIntentScope,\n SUNSWAP_V3_POSITION_PROTOCOL_ID,\n} from './intents.js'\n\ninterface V3PositionObjectResult {\n readonly token0?: unknown\n readonly token1?: unknown\n readonly fee?: unknown\n readonly tickLower?: unknown\n readonly tickUpper?: unknown\n readonly liquidity?: unknown\n readonly tokensOwed0?: unknown\n readonly tokensOwed1?: unknown\n}\n\nfunction integerString(value: unknown, label: string): string {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint') {\n return BigInt(value.toString()).toString()\n }\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n}\n\nfunction integerNumber(value: unknown, label: string): number {\n const parsed = Number(integerString(value, label))\n if (!Number.isSafeInteger(parsed)) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be a safe integer`, { value })\n }\n return parsed\n}\n\nfunction unwrapSingle(value: unknown): unknown {\n return Array.isArray(value) && value.length === 1 ? value[0] : value\n}\n\nfunction parsePositionAddress(value: unknown, label: string): TronAddress {\n const raw = String(unwrapSingle(value))\n try {\n return assertTronAddress(raw, label)\n } catch {\n const evmHex = /^41[0-9a-fA-F]{40}$/.test(raw) ? `0x${raw.slice(2)}` : raw\n return evmHexToTronAddress(evmHex, label)\n }\n}\n\nfunction normalizePositionToken(\n context: ProtocolsContext,\n value: unknown,\n label: string,\n): { publicAddress: TronAddress; token: Token } {\n if (typeof value !== 'string') {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an address string`, { value })\n }\n const publicAddress = parsePositionAddress(value, label)\n const evmAddress = tronAddressToEvmAddress(publicAddress, label)\n\n return {\n publicAddress,\n token: new Token(context.chain.uniswapChainId, evmAddress, 6, undefined, undefined, true),\n }\n}\n\nfunction parsePositionResult(\n context: ProtocolsContext,\n tokenId: string,\n result: unknown,\n owner: TronAddress,\n approved?: TronAddress,\n operatorApproved?: boolean,\n): V3PositionSnapshot & { readonly token0Entity: Token; readonly token1Entity: Token } {\n let token0: unknown\n let token1: unknown\n let fee: unknown\n let tickLower: unknown\n let tickUpper: unknown\n let liquidity: unknown\n let tokensOwed0: unknown\n let tokensOwed1: unknown\n\n if (Array.isArray(result)) {\n token0 = result[2]\n token1 = result[3]\n fee = result[4]\n tickLower = result[5]\n tickUpper = result[6]\n liquidity = result[7]\n tokensOwed0 = result[10]\n tokensOwed1 = result[11]\n } else if (typeof result === 'object' && result !== null) {\n const position = result as V3PositionObjectResult\n token0 = position.token0\n token1 = position.token1\n fee = position.fee\n tickLower = position.tickLower\n tickUpper = position.tickUpper\n liquidity = position.liquidity\n tokensOwed0 = position.tokensOwed0\n tokensOwed1 = position.tokensOwed1\n } else {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V3 position result is malformed', { result })\n }\n\n const token0Info = normalizePositionToken(context, token0, 'token0')\n const token1Info = normalizePositionToken(context, token1, 'token1')\n\n return {\n protocol: 'sunswap-v3',\n tokenId,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n token0: token0Info.publicAddress,\n token1: token1Info.publicAddress,\n fee: integerNumber(fee, 'fee'),\n tickLower: integerNumber(tickLower, 'tickLower'),\n tickUpper: integerNumber(tickUpper, 'tickUpper'),\n liquidity: integerString(liquidity, 'liquidity'),\n tokensOwed0: integerString(tokensOwed0, 'tokensOwed0'),\n tokensOwed1: integerString(tokensOwed1, 'tokensOwed1'),\n token0Entity: token0Info.token,\n token1Entity: token1Info.token,\n }\n}\n\nfunction removePercentage(input: V3PositionRemoveInput, snapshot: V3PositionSnapshot): Percent {\n if (input.percentage !== undefined) return normalizeLiquidityPercentage(input.percentage, 'percentage')\n const liquidity = BigInt(normalizeBaseUnitAmount(input.liquidity, 'liquidity'))\n const total = BigInt(snapshot.liquidity)\n if (liquidity > total) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'liquidity cannot exceed position liquidity', {\n liquidity: liquidity.toString(),\n totalLiquidity: total.toString(),\n })\n }\n return new Percent(liquidity.toString(), total.toString())\n}\n\nfunction currencyForCollect(\n context: ProtocolsContext,\n token: Token,\n publicAddress: TronAddress,\n receiveNative: boolean | undefined,\n): Currency {\n return receiveNative && publicAddress === context.chain.contracts.wtrx\n ? context.chain.nativeCurrency\n : token\n}\n\nexport class V3PositionsClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n async read(input: V3PositionReadInput): Promise<V3PositionSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const [positionResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n buildV3PositionReads({\n network: this.context.network,\n tokenId,\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager'),\n }),\n 'V3 position read',\n )\n const owner = parsePositionAddress(ownerResult, 'owner')\n const approved = approvedResult ? parsePositionAddress(approvedResult, 'approved') : undefined\n const operator = input.operator ? assertTronAddress(input.operator, 'operator') : undefined\n const operatorApproved = operator\n ? Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV3PositionApprovalForAllRead({\n network: this.context.network,\n owner,\n operator,\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager'),\n }),\n 'V3 position operator approval read',\n ))\n : undefined\n\n const snapshot = parsePositionResult(\n this.context,\n tokenId,\n positionResult,\n owner,\n approved,\n operatorApproved,\n )\n return {\n protocol: snapshot.protocol,\n tokenId: snapshot.tokenId,\n owner: snapshot.owner,\n ...(snapshot.approved !== undefined ? { approved: snapshot.approved } : {}),\n ...(snapshot.operatorApproved !== undefined ? { operatorApproved: snapshot.operatorApproved } : {}),\n token0: snapshot.token0,\n token1: snapshot.token1,\n fee: snapshot.fee,\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n liquidity: snapshot.liquidity,\n tokensOwed0: snapshot.tokensOwed0,\n tokensOwed1: snapshot.tokensOwed1,\n }\n }\n\n readonly remove = {\n plan: async (input: V3PositionRemoveInput): Promise<TransactionPlan> => this.planRemove(input),\n execute: async (input: V3PositionRemoveInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planRemove(input), createV3PositionsExecutor(this.context)),\n }\n\n readonly collect = {\n plan: async (input: V3PositionCollectInput): Promise<TransactionPlan> => this.planCollect(input),\n execute: async (input: V3PositionCollectInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planCollect(input), createV3PositionsExecutor(this.context)),\n }\n\n private usdtTransferContext(\n snapshot: V3PositionSnapshot,\n positionManager: TronAddress,\n input: V3PositionCollectInput,\n ): UsdtTransferContext {\n const { network, chain } = this.context\n const usdtAddress = chain.contracts.usdt\n const transfersUsdt = snapshot.token0 === usdtAddress || snapshot.token1 === usdtAddress\n const sources: TransferSource[] = []\n const factory = resolveProtocolContract(this.context, input.contracts, 'sunswapV3Factory')\n // Only the configured deployment has a known factory/init-code pairing.\n // Unknown custom deployments keep an empty source list and fail closed on send.\n if (transfersUsdt && positionManager === chain.contracts.sunswapV3PositionManager && factory === chain.contracts.sunswapV3Factory) {\n sources.push({\n address: computeV3PoolAddress({ network, tokenA: snapshot.token0, tokenB: snapshot.token1, fee: snapshot.fee, factory }),\n role: 'v3-pool',\n })\n sources.push({ address: positionManager, role: 'position-manager' })\n }\n return { network, transfersUsdt, sources }\n }\n\n private async readAuthorizedPosition(\n tokenId: string,\n operation: string,\n positionManager: TronAddress,\n validationMode: V3PositionRemoveInput['validationMode'],\n ) {\n const wallet = await requireWalletAddress(this.context, operation)\n const [positionResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n buildV3PositionReads({ network: this.context.network, tokenId, positionManager }),\n operation,\n )\n const owner = parsePositionAddress(ownerResult, 'owner')\n const approved = approvedResult ? parsePositionAddress(approvedResult, 'approved') : undefined\n const operatorApproved = validationMode === 'legacy'\n ? undefined\n : Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV3PositionApprovalForAllRead({ network: this.context.network, owner, operator: wallet, positionManager }),\n `${operation} operator approval read`,\n ))\n if (validationMode !== 'legacy') {\n assertPositionAuthorized({\n tokenId,\n wallet,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n })\n }\n return {\n wallet,\n snapshot: parsePositionResult(this.context, tokenId, positionResult, owner, approved, operatorApproved),\n }\n }\n\n private async planRemove(input: V3PositionRemoveInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager')\n const planId = nextPlanId(this.context, 'position-v3-remove')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V3 remove position',\n positionManager,\n input.validationMode,\n )\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V3 remove position', wallet)\n const deadline = normalizeDeadline(this.context, input)\n const slippage = parseSlippage(input.slippage ?? '0.5%')\n const poolDerived = input.pool === undefined\n const poolState = input.pool ?? await resolveV3PoolState(this.context, {\n tokenA: snapshot.token0,\n tokenB: snapshot.token1,\n fee: snapshot.fee,\n contracts: input.contracts,\n })\n const pool = new Pool({\n tokenA: snapshot.token0Entity,\n tokenB: snapshot.token1Entity,\n fee: snapshot.fee as FeeAmount,\n sqrtRatioX96: normalizeBaseUnitAmount(poolState.sqrtRatioX96, 'sqrtRatioX96'),\n liquidity: normalizeBaseUnitAmount(poolState.liquidity, 'pool liquidity', { allowZero: true }),\n tickCurrent: poolState.tickCurrent,\n ...(poolState.tickSpacing !== undefined ? { tickSpacing: poolState.tickSpacing } : {}),\n })\n const position = new Position({\n pool,\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n liquidity: snapshot.liquidity,\n })\n const token0 = assertTronAddress(snapshot.token0, 'token0')\n const token1 = assertTronAddress(snapshot.token1, 'token1')\n const expectedCurrencyOwed0 = CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token0Entity, token0, input.receiveNative),\n input.expectedCurrencyOwed0 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed0, 'expectedCurrencyOwed0', { allowZero: true })\n : snapshot.tokensOwed0,\n )\n const expectedCurrencyOwed1 = CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token1Entity, token1, input.receiveNative),\n input.expectedCurrencyOwed1 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed1, 'expectedCurrencyOwed1', { allowZero: true })\n : snapshot.tokensOwed1,\n )\n const methodParameters = NonfungiblePositionManager.removeCallParameters(position, {\n tokenId,\n liquidityPercentage: removePercentage(input, snapshot),\n slippageTolerance: slippage,\n deadline,\n ...(input.burnToken !== undefined ? { burnToken: input.burnToken } : {}),\n collectOptions: {\n recipient: tronAddressToEvmAddress(recipient, 'recipient'),\n expectedCurrencyOwed0,\n expectedCurrencyOwed1,\n },\n })\n const action = methodParametersToAction({\n id: `${planId}-tx`,\n target: positionManager,\n methodParameters,\n metadata: { usdtTransfer: this.usdtTransferContext(snapshot, positionManager, input) },\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n intent: {\n kind: 'remove-liquidity',\n scope: positionIntentScope(SUNSWAP_V3_POSITION_PROTOCOL_ID, 'remove-position'),\n positionId: tokenId,\n },\n })\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: { title: 'Remove SunSwap V3 position liquidity', lines: [`Position ${tokenId}`, `Recipient ${recipient}`] },\n approvals: [],\n transactions: [action],\n metadata: {\n protocol: 'sunswap-v3',\n operation: 'remove-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n slippageBips: slippageToBips(input.slippage ?? '0.5%'),\n positionDerived: true,\n poolDerived,\n },\n }\n }\n\n private async planCollect(input: V3PositionCollectInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager')\n const planId = nextPlanId(this.context, 'position-v3-collect')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V3 collect position',\n positionManager,\n input.validationMode,\n )\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V3 collect position', wallet)\n const token0 = assertTronAddress(snapshot.token0, 'token0')\n const token1 = assertTronAddress(snapshot.token1, 'token1')\n const methodParameters = NonfungiblePositionManager.collectCallParameters({\n tokenId,\n recipient: tronAddressToEvmAddress(recipient, 'recipient'),\n expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token0Entity, token0, input.receiveNative),\n input.expectedCurrencyOwed0 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed0, 'expectedCurrencyOwed0', { allowZero: true })\n : snapshot.tokensOwed0,\n ),\n expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token1Entity, token1, input.receiveNative),\n input.expectedCurrencyOwed1 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed1, 'expectedCurrencyOwed1', { allowZero: true })\n : snapshot.tokensOwed1,\n ),\n })\n const action = methodParametersToAction({\n id: `${planId}-tx`,\n target: positionManager,\n methodParameters,\n metadata: { usdtTransfer: this.usdtTransferContext(snapshot, positionManager, input) },\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n intent: {\n kind: 'collect-fees',\n scope: positionIntentScope(SUNSWAP_V3_POSITION_PROTOCOL_ID, 'collect-position'),\n positionId: tokenId,\n },\n })\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: { title: 'Collect SunSwap V3 position fees', lines: [`Position ${tokenId}`, `Recipient ${recipient}`] },\n approvals: [],\n transactions: [action],\n metadata: {\n protocol: 'sunswap-v3',\n operation: 'collect-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n },\n }\n }\n}\n","import {\n Percent,\n SDKError,\n assertTronAddress,\n type BigintIsh,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport type { ProtocolsContext } from './context.js'\nimport { requireWalletAddress } from './context.js'\nimport type {\n PlanTimingOptions,\n SlippageInput,\n} from './types/common.js'\n\nconst PERCENT_PATTERN = /^(\\d+)(?:\\.(\\d+))?%$/\nconst BASE_UNIT_PATTERN = /^\\d+$/\n\nexport function parseSlippage(value: SlippageInput): Percent {\n if (value instanceof Percent) {\n validateSlippage(value)\n return value\n }\n\n const match = PERCENT_PATTERN.exec(value)\n if (!match) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Slippage must be a percentage string', {\n slippage: value,\n })\n }\n\n const whole = match[1] ?? '0'\n const fraction = match[2] ?? ''\n const scale = 10n ** BigInt(fraction.length)\n const percentageUnits = BigInt(whole) * scale + BigInt(fraction || '0')\n const percent = new Percent(percentageUnits.toString(), (100n * scale).toString())\n validateSlippage(percent)\n return percent\n}\n\nexport function validateSlippage(value: Percent): void {\n if (value.lessThan(0) || value.greaterThan(1)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Slippage must be between 0% and 100%', {\n slippage: value.toSignificant(),\n })\n }\n}\n\nexport function slippageToBips(value: SlippageInput): number {\n const percent = parseSlippage(value)\n const numerator = BigInt(percent.numerator.toString()) * 10_000n\n const denominator = BigInt(percent.denominator.toString())\n if (numerator % denominator !== 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Slippage must resolve to a whole basis point', {\n slippage: typeof value === 'string' ? value : value.toSignificant(),\n })\n }\n return Number(numerator / denominator)\n}\n\nexport function applySlippageMin(expected: bigint, slippageBips: number): bigint {\n return (expected * BigInt(10_000 - slippageBips)) / 10_000n\n}\n\nexport function applySlippageMax(expected: bigint, slippageBips: number): bigint {\n const numerator = expected * BigInt(10_000 + slippageBips)\n return (numerator + 9_999n) / 10_000n\n}\n\nexport function normalizeBaseUnitAmount(\n value: BigintIsh,\n label = 'amount',\n options: { allowZero?: boolean } = {},\n): string {\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be a safe integer`, {\n label,\n value,\n })\n }\n const text = value.toString()\n if (!BASE_UNIT_PATTERN.test(text)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be an unsigned base-unit integer`, {\n label,\n value: text,\n })\n }\n\n const amount = BigInt(text)\n if (options.allowZero ? amount < 0n : amount <= 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be ${options.allowZero ? 'non-negative' : 'positive'}`, {\n label,\n value: text,\n })\n }\n return amount.toString()\n}\n\nexport function normalizeDeadline(\n context: ProtocolsContext,\n options: PlanTimingOptions = {},\n): string {\n if (options.deadline !== undefined) {\n return normalizeBaseUnitAmount(options.deadline, 'deadline')\n }\n\n const ttlSeconds = options.ttlSeconds ?? 1_200\n if (!Number.isSafeInteger(ttlSeconds) || ttlSeconds <= 0) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'ttlSeconds must be a positive safe integer', {\n ttlSeconds,\n })\n }\n\n return (BigInt(Math.floor(context.now() / 1_000)) + BigInt(ttlSeconds)).toString()\n}\n\nexport function normalizeTransactionValidForSeconds(value: number | undefined): number {\n const transactionValidForSeconds = value ?? 1_200\n if (!Number.isSafeInteger(transactionValidForSeconds) || transactionValidForSeconds <= 0) {\n throw new SDKError(\n 'SDK_INVALID_ARGUMENT',\n 'transactionValidForSeconds must be a positive safe integer',\n { transactionValidForSeconds },\n )\n }\n return transactionValidForSeconds\n}\n\nexport function normalizeFeeLimit(value: number | undefined, defaultValue: number): number {\n const feeLimit = value ?? defaultValue\n if (!Number.isSafeInteger(feeLimit) || feeLimit <= 0) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'feeLimit must be a positive safe integer in sun', {\n feeLimit,\n })\n }\n return feeLimit\n}\n\nexport async function resolveTransactionDeadline(\n context: ProtocolsContext,\n transactionValidForSeconds: number,\n): Promise<string> {\n const nowSeconds = BigInt(Math.ceil(await context.getTransactionTime() / 1_000))\n return (nowSeconds + BigInt(transactionValidForSeconds)).toString()\n}\n\nexport async function normalizeRecipient(\n context: ProtocolsContext,\n recipient: TronAddress | string | undefined,\n operation: string,\n walletAddress?: TronAddress,\n): Promise<TronAddress> {\n if (recipient !== undefined) return assertTronAddress(recipient, 'recipient')\n if (walletAddress !== undefined) return walletAddress\n return requireWalletAddress(context, operation)\n}\n\nexport function nextPlanId(context: ProtocolsContext, prefix: string): string {\n return `${prefix}-${context.idFactory()}`\n}\n","import {\n RouterApiClient,\n SunPumpApiClient,\n defaultFetch,\n defaultJsonParser,\n getServerTime,\n type FetchLike,\n type JsonParser,\n} from '@sun-protocol/sun-sdk-api'\nimport {\n getChainConfig,\n getNetworkEndpoints,\n type ChainConfig,\n type NetworkEndpoints,\n} from '@sun-protocol/sun-sdk-chains'\nimport {\n SDKError,\n assertTronAddress,\n type Network,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { createRuntime, type Runtime, type WalletAdapter } from '@sun-protocol/sun-sdk-runtime'\nimport { executeHttpAction } from './execute-http-action.js'\nimport type { TransactionPlanExecutor } from './execute-plan.js'\nimport type {\n ProtocolAdapterDependencies,\n ContractOverrides,\n ProtocolContractName,\n SunSDKCreateOptions,\n} from './types/options.js'\n\nexport interface ProtocolsContext {\n readonly network: Network\n readonly chain: ChainConfig\n readonly endpoints: NetworkEndpoints\n readonly runtime?: Runtime\n readonly fetchImpl: FetchLike\n readonly jsonParser?: JsonParser\n readonly routerApi: RouterApiClient\n readonly sunPumpApi?: SunPumpApiClient\n readonly adapters: ProtocolAdapterDependencies\n readonly now: () => number\n readonly getTransactionTime: () => Promise<number>\n readonly idFactory: () => string\n}\n\nfunction createDefaultIdFactory(): () => string {\n let nextPlanId = 0\n return () => {\n nextPlanId += 1\n return `sun-plan-${nextPlanId}`\n }\n}\n\n/**\n * Creates the public context used by staged transaction orchestration.\n *\n * Keep this available to consumers that render and execute TransactionPlan\n * actions one step at a time instead of using a client's execute() shortcut.\n */\nexport function createProtocolsContext(options: SunSDKCreateOptions): ProtocolsContext {\n if (options.runtime && (options.tronClient || options.wallet || options.getWallet || options.onSubmitted)) {\n throw new SDKError(\n 'SDK_INVALID_ARGUMENT',\n 'Use either runtime or tronClient/wallet/onSubmitted when creating a protocol client',\n )\n }\n if (options.wallet && !options.tronClient) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'wallet requires a tronClient')\n }\n if (options.getWallet && !options.tronClient) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'getWallet requires a tronClient')\n }\n if (options.wallet && options.getWallet) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Use either wallet or getWallet when creating a protocol client')\n }\n\n const runtime = options.runtime ?? (options.tronClient\n ? createRuntime({\n network: options.network,\n tronClient: options.tronClient,\n ...(options.wallet ? { wallet: options.wallet } : {}),\n ...(options.getWallet ? { getWallet: options.getWallet } : {}),\n ...(options.onSubmitted ? { onSubmitted: options.onSubmitted } : {}),\n })\n : undefined)\n\n if (runtime && runtime.network !== options.network) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Protocols runtime network mismatch', {\n sdkNetwork: options.network,\n runtimeNetwork: runtime.network,\n })\n }\n\n const chain = getChainConfig(options.network)\n const endpoints = { ...getNetworkEndpoints(options.network), ...options.endpoints }\n const fetchImpl = options.fetchImpl ?? defaultFetch\n const jsonParser = options.jsonParser ?? defaultJsonParser\n const now = options.now ?? Date.now\n const getTransactionTime = options.getTransactionTime ?? (() => getServerTime(endpoints.time, fetchImpl, jsonParser))\n const sunPumpApi = options.clients?.sunPumpApi ??\n (endpoints.sunPump\n ? new SunPumpApiClient({ baseUrl: endpoints.sunPump, fetchImpl, jsonParser })\n : undefined)\n\n return {\n network: options.network,\n chain,\n endpoints,\n ...(runtime ? { runtime } : {}),\n fetchImpl,\n jsonParser,\n routerApi: options.clients?.routerApi ?? new RouterApiClient({ fetchImpl, jsonParser }),\n ...(sunPumpApi ? { sunPumpApi } : {}),\n adapters: options.adapters ?? {},\n now,\n getTransactionTime: async () => {\n try {\n const timestamp = await getTransactionTime()\n if (Number.isSafeInteger(timestamp) && timestamp > 0) return timestamp\n } catch {\n // Preserve the local-time fallback, sampled after the request fails.\n }\n return now()\n },\n idFactory: options.idFactory ?? createDefaultIdFactory(),\n }\n}\n\nexport function requireRuntime(context: ProtocolsContext, operation: string): Runtime {\n if (!context.runtime) {\n throw new SDKError('SDK_RUNTIME_ERROR', `${operation} requires a runtime`, {\n operation,\n network: context.network,\n })\n }\n return context.runtime\n}\n\nexport function resolveProtocolContract(\n context: ProtocolsContext,\n overrides: ContractOverrides | undefined,\n name: ProtocolContractName,\n): TronAddress {\n const configured = context.chain.contracts as Partial<Record<ProtocolContractName, TronAddress>>\n const address = overrides?.[name] ?? configured[name]\n if (!address) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `No configured address for ${name}`, { name })\n }\n return assertTronAddress(address, name)\n}\n\nexport async function requireWalletAddress(\n context: ProtocolsContext,\n operation: string,\n): Promise<TronAddress> {\n return (await requireWalletSnapshot(context, operation)).address\n}\n\nexport interface ProtocolWalletSnapshot {\n readonly wallet: WalletAdapter\n readonly address: TronAddress\n}\n\n/** Resolves one wallet adapter for the current plan boundary. */\nexport async function requireWalletSnapshot(\n context: ProtocolsContext,\n operation: string,\n): Promise<ProtocolWalletSnapshot> {\n const runtime = requireRuntime(context, operation)\n const wallet = await runtime.requireWallet(operation)\n return {\n wallet,\n address: assertTronAddress(await wallet.getAddress(), 'wallet address'),\n }\n}\n\n/** Creates the base public executor for staged TransactionPlan execution. */\nexport function createContextExecutor(context: ProtocolsContext): TransactionPlanExecutor {\n const runtime = context.runtime\n let walletPromise: ReturnType<Runtime['requireWallet']> | undefined\n const requireExecutionWallet = () => {\n walletPromise ??= runtime?.requireWallet('transaction plan execution')\n if (!walletPromise) {\n return Promise.reject(new SDKError('SDK_RUNTIME_ERROR', 'Transaction plan execution requires a runtime'))\n }\n return walletPromise\n }\n return {\n network: context.network,\n ...(runtime\n ? {\n getAddress: async () => {\n const wallet = await requireExecutionWallet()\n return assertTronAddress(await wallet.getAddress(), 'wallet address')\n },\n sendAction: async (action: Parameters<Runtime['sendAction']>[0]) => {\n const wallet = await requireExecutionWallet()\n return runtime.sendAction(action, { wallet })\n },\n ...(runtime.waitForTransactionReceipt\n ? { waitForTransactionReceipt: runtime.waitForTransactionReceipt.bind(runtime) }\n : {}),\n signTypedData: async (payload: Parameters<Runtime['signTypedData']>[0]) => {\n const wallet = await requireExecutionWallet()\n return runtime.signTypedData(payload, { wallet })\n },\n }\n : {}),\n executeHttpAction: (action) => executeHttpAction(action, context.fetchImpl, context.jsonParser),\n }\n}\n","import {\n defaultJsonParser,\n requestJson,\n type FetchLike,\n type JsonParser,\n} from '@sun-protocol/sun-sdk-api'\nimport {\n SDKError,\n type HttpRequestAction,\n type TransactionAction,\n} from '@sun-protocol/sun-sdk-core'\n\nexport async function executeHttpAction(\n action: TransactionAction,\n fetchImpl: FetchLike,\n jsonParser: JsonParser = defaultJsonParser,\n): Promise<unknown> {\n if (action.type !== 'http-request' || action.execute !== 'api') {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Action ${action.id} is not an HTTP action`, {\n actionId: action.id,\n actionType: action.type,\n })\n }\n\n const request = (action as HttpRequestAction).request\n const headers: Record<string, string> = {\n Accept: 'application/json',\n ...request.headers,\n }\n let body: BodyInit | undefined\n if (request.body !== undefined) {\n if (typeof request.body === 'string') {\n body = request.body\n } else {\n body = JSON.stringify(request.body)\n if (!headers['Content-Type']) headers['Content-Type'] = 'application/json'\n }\n }\n\n return requestJson(request.url, {\n service: 'Protocols HTTP action',\n fetchImpl,\n jsonParser,\n init: {\n method: request.method,\n headers,\n ...(body !== undefined ? { body } : {}),\n },\n })\n}\n","import {\n SDKError,\n type ContractCallAction,\n type DeferredContractCallAction,\n type Network,\n type TransactionAction,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport type { TypedDataPayload } from '@sun-protocol/sun-sdk-runtime'\nimport type { Runtime } from '@sun-protocol/sun-sdk-runtime'\nimport {\n normalizeProtocolError,\n withExecutionContext,\n} from './errors.js'\nimport type { ExecutedActionResult, TransactionPlan, TransactionPlanExecutionResult } from './types/plan.js'\n\nexport interface TransactionPlanExecutor {\n readonly network?: Network\n getAddress?(): Promise<TronAddress>\n sendAction?: Runtime['sendAction']\n waitForTransactionReceipt?: NonNullable<Runtime['waitForTransactionReceipt']>\n signTypedData?: Runtime['signTypedData']\n executeHttpAction?(action: TransactionAction): Promise<unknown>\n materializeAction?(\n action: DeferredContractCallAction,\n completedActions: readonly ExecutedActionResult[],\n ): Promise<ContractCallAction>\n}\n\n/** Executes one plan action without retaining any client-side execution state. */\nexport async function executePlanAction(\n action: TransactionAction,\n executor: TransactionPlanExecutor,\n completedActions: readonly ExecutedActionResult[] = [],\n): Promise<ExecutedActionResult> {\n try {\n if (action.waitForReceipt && !executor.waitForTransactionReceipt) {\n throw new SDKError(\n 'SDK_RUNTIME_ERROR',\n `Action ${action.id} requires transaction receipt waiting capability`,\n { actionId: action.id, finality: action.waitForReceipt },\n )\n }\n\n if (action.execute === 'runtime') {\n let actionToSend: ContractCallAction\n let materializedAction: ContractCallAction | undefined\n\n if (action.type === 'deferred-contract-call') {\n if (!executor.materializeAction) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Action ${action.id} requires a deferred action materializer`)\n }\n const resolvedAction = await executor.materializeAction(action, completedActions)\n materializedAction = {\n ...resolvedAction,\n id: action.id,\n ...(action.intent === undefined ? {} : { intent: action.intent }),\n }\n actionToSend = materializedAction\n } else if (action.type === 'contract-call' || action.type === 'approve') {\n actionToSend = action\n } else {\n throw new SDKError(\n 'SDK_RUNTIME_ERROR',\n `Runtime action ${action.id} materialized to unsupported type: ${action.type}`,\n )\n }\n\n if (!executor.sendAction) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Action ${action.id} requires a runtime executor`)\n }\n const result = await executor.sendAction(actionToSend)\n const receipt = action.waitForReceipt && executor.waitForTransactionReceipt\n ? await executor.waitForTransactionReceipt(result.txid, { finality: action.waitForReceipt })\n : undefined\n if (receipt && !receipt.success) {\n throw new SDKError('SDK_CONTRACT_ERROR', `Transaction ${result.txid} failed`, {\n actionId: action.id,\n txid: result.txid,\n receipt,\n })\n }\n return {\n action,\n result,\n txid: result.txid,\n ...(receipt ? { receipt } : {}),\n ...(materializedAction ? { materializedAction } : {}),\n }\n }\n\n if (action.execute === 'wallet-signature') {\n if (!action.typedData) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Action ${action.id} is missing typedData`)\n }\n if (!executor.signTypedData) {\n throw new SDKError('SDK_WALLET_CAPABILITY_ERROR', `Action ${action.id} requires typed-data signing`)\n }\n const signature = await executor.signTypedData(action.typedData as TypedDataPayload)\n return { action, result: signature }\n }\n\n if (action.execute === 'api') {\n if (!executor.executeHttpAction) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Action ${action.id} requires an API executor`)\n }\n return { action, result: await executor.executeHttpAction(action) }\n }\n\n throw new SDKError('SDK_RUNTIME_ERROR', 'Unsupported action executor')\n } catch (error) {\n const normalized = normalizeProtocolError(\n error,\n action.execute === 'api' ? 'SDK_API_ERROR' : 'SDK_RUNTIME_ERROR',\n `Failed to execute action ${action.id}`,\n )\n throw withExecutionContext(normalized, {\n actionId: action.id,\n completedActionIds: completedActions.map((result) => result.action.id),\n })\n }\n}\n\nexport async function executeTransactionPlan(\n plan: TransactionPlan,\n executor: TransactionPlanExecutor,\n): Promise<TransactionPlanExecutionResult> {\n if (executor.network && executor.network !== plan.network) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Plan and executor network mismatch', {\n planNetwork: plan.network,\n executorNetwork: executor.network,\n })\n }\n if (plan.owner) {\n if (!executor.getAddress) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Plan ${plan.id} requires a wallet address`, {\n planId: plan.id,\n owner: plan.owner,\n })\n }\n const actualAddress = await executor.getAddress()\n if (actualAddress !== plan.owner) {\n throw new SDKError(\n 'SDK_WALLET_ACCOUNT_MISMATCH',\n 'Transaction plan was created for a different wallet',\n {\n planId: plan.id,\n expectedAddress: plan.owner,\n actualAddress,\n },\n )\n }\n }\n\n const orderedActions = [...plan.approvals, ...plan.transactions]\n const receiptAction = orderedActions.find((action) => action.waitForReceipt !== undefined)\n if (receiptAction && !executor.waitForTransactionReceipt) {\n throw new SDKError(\n 'SDK_RUNTIME_ERROR',\n `Action ${receiptAction.id} requires transaction receipt waiting capability`,\n { planId: plan.id, actionId: receiptAction.id, finality: receiptAction.waitForReceipt },\n )\n }\n const actionResults: ExecutedActionResult[] = []\n const txids: string[] = []\n let finalResult: TransactionPlanExecutionResult['finalResult']\n\n for (const action of orderedActions) {\n const actionResult = await executePlanAction(action, executor, actionResults)\n actionResults.push(actionResult)\n\n if (action.execute === 'runtime') {\n if (!actionResult.txid) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Runtime action ${action.id} did not return a transaction id`)\n }\n txids.push(actionResult.txid)\n const raw = typeof actionResult.result === 'object' && actionResult.result !== null\n ? (actionResult.result as { raw?: unknown }).raw\n : undefined\n finalResult = { type: 'transaction', txid: actionResult.txid, raw }\n continue\n }\n\n if (action.execute === 'wallet-signature') {\n finalResult = { type: 'signature', signature: actionResult.result as string }\n continue\n }\n\n finalResult = { type: 'api', data: actionResult.result }\n }\n\n return {\n plan,\n actions: actionResults,\n txids,\n finalResult,\n }\n}\n\nexport function isTransactionPlan(input: unknown): input is TransactionPlan {\n if (typeof input !== 'object' || input === null) return false\n const candidate = input as Partial<TransactionPlan>\n return Array.isArray(candidate.approvals) && Array.isArray(candidate.transactions)\n}\n\n/** Executes only a plan's final transactions and preserves the caller's original plan. */\nexport async function executePlanTransactions(\n plan: TransactionPlan,\n executor: TransactionPlanExecutor,\n): Promise<TransactionPlanExecutionResult> {\n const result = await executeTransactionPlan(\n { ...plan, approvals: [] },\n executor,\n )\n return { ...result, plan }\n}\n","import {\n SDKError,\n} from '@sun-protocol/sun-sdk-core'\n\nfunction isWalletRejection(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false\n const candidate = error as { code?: unknown; message?: unknown }\n return candidate.code === 4001 ||\n (typeof candidate.message === 'string' && /reject|denied|cancel/i.test(candidate.message))\n}\n\nexport function normalizeProtocolError(\n error: unknown,\n fallbackCode: string,\n message: string,\n context: Record<string, unknown> = {},\n): SDKError<string> {\n if (error instanceof SDKError) return error as SDKError<string>\n const code = isWalletRejection(error) ? 'SDK_WALLET_REJECTED' : fallbackCode\n return new SDKError(code, message, { ...context, cause: error })\n}\n\nexport function withExecutionContext(\n error: SDKError<string>,\n context: {\n readonly actionId: string\n readonly completedActionIds: readonly string[]\n },\n): SDKError<string> {\n return new SDKError<string>(error.code, error.message, {\n ...error.context,\n actionId: context.actionId,\n completedActionIds: context.completedActionIds,\n cause: error,\n })\n}\n","import { SDKError, type ContractCallAction } from '@sun-protocol/sun-sdk-core'\nimport { createContextExecutor, type ProtocolsContext } from '../context.js'\nimport type { TransactionPlanExecutor } from '../execute-plan.js'\nimport { assertUsdtTransfer } from '../usdt-transfer.js'\n\n/** Check an SDK-built V3 remove/collect action immediately before its final send. */\nexport async function assertV3PositionUsdtTransfer(context: ProtocolsContext, action: ContractCallAction): Promise<void> {\n await assertUsdtTransfer(context, action)\n}\n\n/** Use this executor for V3 position plans, including staged execution and retries. */\nexport function createV3PositionsExecutor(context: ProtocolsContext): TransactionPlanExecutor {\n const executor = createContextExecutor(context)\n return {\n ...executor,\n sendAction: async (action) => {\n await assertV3PositionUsdtTransfer(context, action)\n if (!executor.sendAction) throw new SDKError('SDK_RUNTIME_ERROR', 'V3 position execution requires a runtime')\n return executor.sendAction(action)\n },\n }\n}\n","import { SDKError, type ContractCallAction, type Network, type TronAddress } from '@sun-protocol/sun-sdk-core'\nimport type { ContractRead } from '@sun-protocol/sun-sdk-runtime'\nimport type { ProtocolsContext } from './context.js'\nimport { normalizeTronAddress } from './internal/tokens.js'\n\nexport interface UsdtReader {\n paused(): Promise<boolean>\n isBlackListed(address: string): Promise<boolean>\n}\n\nexport interface TransferSource {\n readonly address: string\n readonly role: 'v3-pool' | 'position-manager'\n}\n\nexport type UsdtTransferValidationResult =\n | { readonly status: 'allowed' }\n | { readonly status: 'blocked'; readonly reason: 'USDT_PAUSED' }\n | { readonly status: 'blocked'; readonly reason: 'USDT_SOURCE_BLACKLISTED'; readonly sources: readonly TransferSource[] }\n | { readonly status: 'unknown'; readonly reason: 'MISSING_TRANSFER_SOURCE' | 'CHECK_FAILED' }\n\n/** Applies the USDT paused/blacklist check. Unknown results never authorize submission. */\nexport async function usdtValidateTransfer(input: {\n readonly reader: UsdtReader\n readonly transfersUsdt: boolean\n readonly sources: readonly TransferSource[]\n}): Promise<UsdtTransferValidationResult> {\n if (input.transfersUsdt === false) return { status: 'allowed' }\n if (input.transfersUsdt !== true) return { status: 'unknown', reason: 'CHECK_FAILED' }\n if (input.sources.length === 0) return { status: 'unknown', reason: 'MISSING_TRANSFER_SOURCE' }\n\n try {\n const paused = await input.reader.paused()\n if (typeof paused !== 'boolean') throw new Error('Invalid paused result')\n if (paused) return { status: 'blocked', reason: 'USDT_PAUSED' }\n\n const sources = new Map<string, TransferSource>()\n for (const source of input.sources) {\n const address = normalizeTronAddress(source.address)\n sources.set(address, { ...source, address })\n }\n const checks = await Promise.all([...sources.values()].map(async (source) => {\n const blacklisted = await input.reader.isBlackListed(source.address)\n if (typeof blacklisted !== 'boolean') throw new Error('Invalid blacklist result')\n return { source, blacklisted }\n }))\n const blocked = checks.filter((check) => check.blacklisted).map((check) => check.source)\n return blocked.length > 0\n ? { status: 'blocked', reason: 'USDT_SOURCE_BLACKLISTED', sources: blocked }\n : { status: 'allowed' }\n } catch {\n return { status: 'unknown', reason: 'CHECK_FAILED' }\n }\n}\n\n/** Static facts about an SDK-built action; never stores a previous check result. */\nexport interface UsdtTransferContext {\n readonly network: Network\n readonly transfersUsdt: boolean\n readonly sources: readonly TransferSource[]\n}\n\nfunction parseTransferContext(context: ProtocolsContext, action: ContractCallAction): UsdtTransferContext {\n const data = action.metadata?.usdtTransfer as Partial<UsdtTransferContext> | undefined\n if (!data) throw new Error('Missing USDT transfer context')\n if (data.network !== context.network ||\n typeof data.transfersUsdt !== 'boolean' || !Array.isArray(data.sources)) {\n throw new Error('Invalid USDT transfer context; rebuild the plan')\n }\n const sources = data.sources.map((source: TransferSource) => {\n if (!source || typeof source.address !== 'string' ||\n (source.role !== 'v3-pool' && source.role !== 'position-manager')) {\n throw new Error('Invalid USDT transfer source')\n }\n const address = normalizeTronAddress(source.address)\n if (source.role === 'position-manager' && address !== normalizeTronAddress(action.target)) {\n throw new Error('USDT sweep source does not match the position manager')\n }\n return { address, role: source.role }\n })\n if (!data.transfersUsdt && sources.length > 0) throw new Error('Unexpected USDT sources')\n return { network: context.network, transfersUsdt: data.transfersUsdt, sources }\n}\n\nfunction boolRead(target: TronAddress, name: 'paused' | 'isBlackListed', address?: string): ContractRead {\n return {\n target,\n functionSelector: name === 'paused' ? 'paused()' : 'isBlackListed(address)',\n parameters: address === undefined ? [] : [{ type: 'address', value: address }],\n abiFunction: {\n type: 'function', name, stateMutability: 'view',\n inputs: name === 'paused' ? [] : [{ name: '_user', type: 'address' }],\n outputs: [{ name: '', type: 'bool' }],\n },\n }\n}\n\n/** Internal execution guard, shared by the two protocol-specific executors. */\nexport async function assertUsdtTransfer(context: ProtocolsContext, action: ContractCallAction): Promise<void> {\n let result: UsdtTransferValidationResult\n if (!action.metadata?.usdtTransfer) {\n result = { status: 'unknown', reason: 'MISSING_TRANSFER_SOURCE' }\n } else {\n try {\n const data = parseTransferContext(context, action)\n if (data.transfersUsdt && !data.sources.some((source) => source.role === 'v3-pool')) {\n result = { status: 'unknown', reason: 'MISSING_TRANSFER_SOURCE' }\n } else {\n const read = (name: 'paused' | 'isBlackListed', address?: string) => {\n if (!context.runtime) throw new Error('USDT transfer validation requires a runtime')\n return context.runtime.readContract<boolean>(boolRead(context.chain.contracts.usdt, name, address))\n }\n result = await usdtValidateTransfer({\n ...data,\n reader: { paused: () => read('paused'), isBlackListed: (address) => read('isBlackListed', address) },\n })\n }\n } catch {\n result = { status: 'unknown', reason: 'CHECK_FAILED' }\n }\n }\n if (result.status === 'allowed') return\n throw new SDKError(\n result.status === 'blocked' ? 'SDK_USDT_TRANSFER_BLOCKED' : 'SDK_USDT_TRANSFER_UNKNOWN',\n result.status === 'blocked' ? 'USDT transfer is currently restricted' : 'Unable to verify USDT transfer status',\n { ...result, usdtAddress: context.chain.contracts.usdt, actionId: action.id },\n )\n}\n","import { getWrappedNativeAddress } from '@sun-protocol/sun-sdk-chains'\nimport {\n Percent,\n SDKError,\n TRON_ZERO_ADDRESS,\n Token,\n assertTronAddress,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n evmHexToTronAddress as evmHexToTronAddressV2,\n tronAddressToEvmHex,\n} from '@sun-protocol/sun-sdk-sunswap-v2'\nimport type { ProtocolsContext } from '../context.js'\nimport type { SlippageInput } from '../types/common.js'\n\nconst PERCENT_PATTERN = /^(\\d+)(?:\\.(\\d+))?%$/\n\nexport type ProtocolTokenKind = 'native' | 'token'\n\nexport interface ProtocolToken {\n readonly kind: ProtocolTokenKind\n readonly input: string\n readonly contractAddress: TronAddress\n readonly wrappedContractAddress: TronAddress\n readonly token: Token\n}\n\nexport function isNativeTrxInput(context: ProtocolsContext, token: string): boolean {\n return token.toUpperCase() === 'TRX' || token === context.chain.contracts.trx\n}\n\nexport function evmHexToTronAddress(address: string, label = 'address'): TronAddress {\n const normalized = address.startsWith('0x') ? address.toLowerCase() : `0x${address.toLowerCase()}`\n return evmHexToTronAddressV2(normalized, label)\n}\n\nexport function tronAddressToEvmAddress(address: TronAddress | string, label = 'address'): `0x${string}` {\n return `0x${tronAddressToEvmHex(assertTronAddress(address, label))}`\n}\n\n/** Canonical address for comparing configured tokens with decoded contract results. */\nexport function normalizeTronAddress(address: string, label = 'address'): TronAddress {\n if (/^41[0-9a-fA-F]{40}$/.test(address)) return evmHexToTronAddress(`0x${address.slice(2)}`, label)\n if (/^0x[0-9a-fA-F]{40}$/.test(address)) return evmHexToTronAddress(address, label)\n return evmHexToTronAddress(tronAddressToEvmAddress(address, label), label)\n}\n\nexport function normalizeProtocolToken(\n context: ProtocolsContext,\n token: string,\n label: string,\n metadata: { readonly decimals?: number; readonly symbol?: string; readonly name?: string } = {},\n): ProtocolToken {\n const wrappedContractAddress = getWrappedNativeAddress(context.network)\n const kind: ProtocolTokenKind = isNativeTrxInput(context, token) ? 'native' : 'token'\n const contractAddress = kind === 'native' ? TRON_ZERO_ADDRESS : assertTronAddress(token, label)\n const mathAddress = kind === 'native' ? wrappedContractAddress : contractAddress\n const evmAddress = `0x${tronAddressToEvmHex(mathAddress)}`.toLowerCase()\n\n return {\n kind,\n input: token,\n contractAddress,\n wrappedContractAddress,\n token: new Token(\n context.chain.uniswapChainId,\n evmAddress,\n metadata.decimals ?? 6,\n metadata.symbol,\n metadata.name,\n true,\n ),\n }\n}\n\nfunction parseLiquidityPercentageInput(value: SlippageInput | Percent, label: string): Percent {\n if (value instanceof Percent) return value\n\n const match = PERCENT_PATTERN.exec(value)\n if (!match) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be a percentage string`, {\n label,\n percentage: value,\n })\n }\n\n const whole = match[1] ?? '0'\n const fraction = match[2] ?? ''\n const scale = 10n ** BigInt(fraction.length)\n const percentageUnits = BigInt(whole) * scale + BigInt(fraction || '0')\n return new Percent(percentageUnits.toString(), (100n * scale).toString())\n}\n\nexport function normalizeLiquidityPercentage(value: SlippageInput | Percent, label: string): Percent {\n const percent = parseLiquidityPercentageInput(value, label)\n if (percent.equalTo(0)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be greater than 0%`, {\n label,\n percentage: percent.toSignificant(),\n })\n }\n if (percent.greaterThan(1)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be at most 100%`, {\n label,\n percentage: percent.toSignificant(),\n })\n }\n return percent\n}\n","import {\n createContractCallAction,\n type ContractCallAction,\n type ContractParameter,\n type TransactionReceiptFinality,\n type TransactionIntent,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\n\nexport interface ProtocolMethodParameters {\n readonly calldata: string\n readonly value: string\n readonly function_selector: string\n readonly parameter: readonly ContractParameter[] | readonly unknown[]\n}\n\nexport interface MethodParametersToActionInput {\n readonly id: string\n readonly target: TronAddress\n readonly methodParameters: ProtocolMethodParameters\n readonly feeLimit?: number\n readonly waitForReceipt?: TransactionReceiptFinality\n readonly metadata?: Record<string, unknown>\n readonly intent?: TransactionIntent\n}\n\nexport function methodParametersToAction(input: MethodParametersToActionInput): ContractCallAction {\n return createContractCallAction({\n id: input.id,\n target: input.target,\n functionSelector: input.methodParameters.function_selector,\n parameters: input.methodParameters.parameter as readonly ContractParameter[],\n callValue: BigInt(input.methodParameters.value),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n ...(input.waitForReceipt !== undefined ? { waitForReceipt: input.waitForReceipt } : {}),\n ...(input.metadata !== undefined ? { metadata: input.metadata } : {}),\n ...(input.intent !== undefined ? { intent: input.intent } : {}),\n })\n}\n","import {\n SDKError,\n assertTronAddress,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\n\nexport interface PositionAuthorizationInput {\n readonly tokenId: string\n readonly wallet: TronAddress | string\n readonly owner: TronAddress | string\n readonly approved?: TronAddress | string\n readonly operatorApproved?: boolean\n}\n\nexport function assertPositionAuthorized(input: PositionAuthorizationInput): void {\n const wallet = assertTronAddress(input.wallet, 'wallet')\n const owner = assertTronAddress(input.owner, 'owner')\n const approved = input.approved ? assertTronAddress(input.approved, 'approved') : undefined\n\n if (wallet === owner || wallet === approved || input.operatorApproved === true) return\n\n throw new SDKError('SDK_WALLET_CAPABILITY_ERROR', 'Wallet is not authorized for this position', {\n tokenId: input.tokenId,\n owner,\n wallet,\n operator: wallet,\n })\n}\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\nimport type { ContractRead, MulticallResult } from '@sun-protocol/sun-sdk-runtime'\nimport {\n requireRuntime,\n type ProtocolsContext,\n} from '../context.js'\n\nexport async function readRequiredContract<T>(\n context: ProtocolsContext,\n call: ContractRead,\n operation: string,\n): Promise<T> {\n const runtime = requireRuntime(context, operation)\n const value = await runtime.readContract<T>(call)\n if (value === undefined || value === null) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${operation} returned an empty result`, { call })\n }\n return value\n}\n\nexport async function readMulticallRequired<T>(\n context: ProtocolsContext,\n calls: readonly ContractRead[],\n operation: string,\n): Promise<readonly T[]> {\n const runtime = requireRuntime(context, operation)\n const results = await runtime.multicall<T>(calls)\n return results.map((result: MulticallResult<T>, index: number) => {\n if (!result.success || result.value === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${operation} multicall item failed`, {\n index,\n call: calls[index],\n error: result.error,\n })\n }\n return result.value\n })\n}\n","import {\n SDKError,\n assertTronAddress,\n type BigintIsh,\n type ContractCallAction,\n type Token,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n buildV3PoolStateReads,\n buildV3PositionRead,\n computeV3PoolAddress,\n Multicall,\n nearestUsableTick,\n NonfungiblePositionManager,\n Pool,\n Position,\n TickMath,\n type FeeAmount,\n} from '@sun-protocol/sun-sdk-sunswap-v3'\nimport { planApproval } from '../approval/plan.js'\nimport {\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n normalizeRecipient,\n parseSlippage,\n slippageToBips,\n} from '../common.js'\nimport {\n createContextExecutor,\n requireWalletAddress,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport { executeTransactionPlan } from '../execute-plan.js'\nimport { methodParametersToAction } from '../internal/method-parameters.js'\nimport { attachApprovalIntent } from '../internal/intents.js'\nimport {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport {\n evmHexToTronAddress,\n normalizeProtocolToken,\n tronAddressToEvmAddress,\n type ProtocolToken,\n} from '../internal/tokens.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V3AddLiquidityInput,\n V3IncreaseLiquidityInput,\n V3PoolStateInput,\n} from './types.js'\nimport {\n liquidityIntentScope,\n SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID,\n} from './intents.js'\n\nexport interface V3PoolLookupInput {\n readonly tokenA: string\n readonly tokenB: string\n readonly fee: number\n readonly contracts?: V3AddLiquidityInput['contracts']\n}\n\nexport interface V3PositionContext {\n readonly tokenA: TronAddress\n readonly tokenB: TronAddress\n readonly fee: number\n readonly tickLower: number\n readonly tickUpper: number\n}\n\ninterface V3Slot0ObjectResult {\n readonly sqrtPriceX96?: unknown\n readonly sqrtRatioX96?: unknown\n readonly tick?: unknown\n}\n\ninterface V3PositionObjectResult {\n readonly token0?: unknown\n readonly token1?: unknown\n readonly fee?: unknown\n readonly tickLower?: unknown\n readonly tickUpper?: unknown\n}\n\nfunction integerString(value: unknown, label: string): string {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint') {\n return BigInt(value.toString()).toString()\n }\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n}\n\nfunction integerNumber(value: unknown, label: string): number {\n const parsed = Number(integerString(value, label))\n if (!Number.isSafeInteger(parsed)) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be a safe integer`, { value })\n }\n return parsed\n}\n\nfunction positionToken(value: unknown, label: string): TronAddress {\n if (typeof value !== 'string') {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an address string`, { value })\n }\n if (value.startsWith('0x')) return evmHexToTronAddress(value, label)\n if (/^41[0-9a-fA-F]{40}$/.test(value)) {\n return evmHexToTronAddress(`0x${value.slice(2)}`, label)\n }\n return assertTronAddress(value, label)\n}\n\nfunction parseV3Slot0(result: unknown): { sqrtRatioX96: string; tickCurrent: number } {\n if (Array.isArray(result)) {\n return {\n sqrtRatioX96: integerString(result[0], 'sqrtRatioX96'),\n tickCurrent: integerNumber(result[1], 'tickCurrent'),\n }\n }\n if (typeof result === 'object' && result !== null) {\n const slot0 = result as V3Slot0ObjectResult\n return {\n sqrtRatioX96: integerString(slot0.sqrtPriceX96 ?? slot0.sqrtRatioX96, 'sqrtRatioX96'),\n tickCurrent: integerNumber(slot0.tick, 'tickCurrent'),\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'V3 slot0 result is malformed', { result })\n}\n\nexport async function resolveV3PoolState(\n context: ProtocolsContext,\n input: V3PoolLookupInput,\n): Promise<V3PoolStateInput> {\n const tokenA = normalizeProtocolToken(context, input.tokenA, 'tokenA')\n const tokenB = normalizeProtocolToken(context, input.tokenB, 'tokenB')\n const poolAddress = computeV3PoolAddress({\n network: context.network,\n tokenA: tokenA.contractAddress,\n tokenB: tokenB.contractAddress,\n fee: input.fee,\n factory: resolveProtocolContract(context, input.contracts, 'sunswapV3Factory'),\n })\n const [slot0Result, liquidityResult, feeResult, tickSpacingResult] = await readMulticallRequired<unknown>(\n context,\n buildV3PoolStateReads({ pool: poolAddress }),\n 'V3 pool state read',\n )\n const fee = integerNumber(feeResult, 'fee')\n if (fee !== input.fee) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V3 pool fee does not match requested fee', {\n pool: poolAddress,\n requestedFee: input.fee,\n poolFee: fee,\n })\n }\n const slot0 = parseV3Slot0(slot0Result)\n return {\n sqrtRatioX96: slot0.sqrtRatioX96,\n liquidity: integerString(liquidityResult, 'liquidity'),\n tickCurrent: slot0.tickCurrent,\n tickSpacing: integerNumber(tickSpacingResult, 'tickSpacing'),\n }\n}\n\nexport async function resolveV3PositionContext(\n context: ProtocolsContext,\n tokenId: BigintIsh,\n contracts?: V3IncreaseLiquidityInput['contracts'],\n): Promise<V3PositionContext> {\n const result = await readRequiredContract<unknown>(\n context,\n buildV3PositionRead({\n network: context.network,\n tokenId,\n positionManager: resolveProtocolContract(context, contracts, 'sunswapV3PositionManager'),\n }),\n 'V3 position context read',\n )\n let token0: unknown\n let token1: unknown\n let fee: unknown\n let tickLower: unknown\n let tickUpper: unknown\n if (Array.isArray(result)) {\n token0 = result[2]\n token1 = result[3]\n fee = result[4]\n tickLower = result[5]\n tickUpper = result[6]\n } else if (typeof result === 'object' && result !== null) {\n const position = result as V3PositionObjectResult\n token0 = position.token0\n token1 = position.token1\n fee = position.fee\n tickLower = position.tickLower\n tickUpper = position.tickUpper\n } else {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V3 position result is malformed', { result })\n }\n return {\n tokenA: positionToken(token0, 'token0'),\n tokenB: positionToken(token1, 'token1'),\n fee: integerNumber(fee, 'fee'),\n tickLower: integerNumber(tickLower, 'tickLower'),\n tickUpper: integerNumber(tickUpper, 'tickUpper'),\n }\n}\n\nexport function normalizeSingleSideAmounts(input: {\n readonly amount0?: BigintIsh\n readonly amount1?: BigintIsh\n}): { amount0: BigintIsh; amount1: BigintIsh } {\n if (input.amount0 === undefined && input.amount1 === undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V3 liquidity requires at least one of amount0 or amount1')\n }\n return {\n amount0: input.amount0 ?? '0',\n amount1: input.amount1 ?? '0',\n }\n}\n\nfunction assertV3PositionContextMatches(\n context: ProtocolsContext,\n tokenId: string,\n input: V3IncreaseLiquidityInput,\n position: V3PositionContext,\n): void {\n const mismatches: Record<string, { readonly supplied: unknown; readonly position: unknown }> = {}\n const suppliedTokenA = input.tokenA === undefined\n ? undefined\n : normalizeV3ContextToken(context, input.tokenA, 'tokenA')\n const suppliedTokenB = input.tokenB === undefined\n ? undefined\n : normalizeV3ContextToken(context, input.tokenB, 'tokenB')\n const positionTokens = [position.tokenA, position.tokenB] as const\n if (suppliedTokenA !== undefined && suppliedTokenB !== undefined) {\n const pairMatches = (suppliedTokenA === position.tokenA && suppliedTokenB === position.tokenB)\n || (suppliedTokenA === position.tokenB && suppliedTokenB === position.tokenA)\n if (!pairMatches) {\n mismatches.tokens = { supplied: [suppliedTokenA, suppliedTokenB], position: positionTokens }\n }\n } else {\n if (suppliedTokenA !== undefined && !positionTokens.includes(suppliedTokenA)) {\n mismatches.tokenA = { supplied: suppliedTokenA, position: positionTokens }\n }\n if (suppliedTokenB !== undefined && !positionTokens.includes(suppliedTokenB)) {\n mismatches.tokenB = { supplied: suppliedTokenB, position: positionTokens }\n }\n }\n if (input.fee !== undefined && input.fee !== position.fee) {\n mismatches.fee = { supplied: input.fee, position: position.fee }\n }\n if (input.tickLower !== undefined && input.tickLower !== position.tickLower) {\n mismatches.tickLower = { supplied: input.tickLower, position: position.tickLower }\n }\n if (input.tickUpper !== undefined && input.tickUpper !== position.tickUpper) {\n mismatches.tickUpper = { supplied: input.tickUpper, position: position.tickUpper }\n }\n if (Object.keys(mismatches).length > 0) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V3 increase context does not match the tokenId position', {\n tokenId,\n mismatches,\n })\n }\n}\n\nfunction normalizeV3ContextToken(context: ProtocolsContext, token: string, label: string): TronAddress {\n const normalized = normalizeProtocolToken(context, token, label)\n return normalized.kind === 'native' ? normalized.wrappedContractAddress : normalized.contractAddress\n}\n\nfunction resolveTickRange(input: {\n readonly tickLower?: number\n readonly tickUpper?: number\n readonly tickRangeWidth?: number\n readonly pool: V3PoolStateInput\n}): { tickLower: number; tickUpper: number; derived: boolean } {\n if (input.tickLower !== undefined && input.tickUpper !== undefined) {\n return { tickLower: input.tickLower, tickUpper: input.tickUpper, derived: false }\n }\n if (input.tickLower !== undefined || input.tickUpper !== undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'tickLower and tickUpper must be provided together')\n }\n if (!Number.isInteger(input.tickRangeWidth) || (input.tickRangeWidth ?? 0) <= 0) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'tickRangeWidth must be a positive integer when ticks are omitted', {\n tickRangeWidth: input.tickRangeWidth,\n })\n }\n const tickSpacing = input.pool.tickSpacing\n if (tickSpacing === undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'pool tickSpacing is required to derive a tick range')\n }\n const width = input.tickRangeWidth as number\n const lowerTarget = Math.max(TickMath.MIN_TICK, input.pool.tickCurrent - width * tickSpacing)\n const upperTarget = Math.min(TickMath.MAX_TICK, input.pool.tickCurrent + width * tickSpacing)\n let tickLower = nearestUsableTick(lowerTarget, tickSpacing)\n let tickUpper = nearestUsableTick(upperTarget, tickSpacing)\n if (tickUpper - tickLower < tickSpacing) {\n const maxUsableTick = nearestUsableTick(TickMath.MAX_TICK, tickSpacing)\n if (tickUpper < maxUsableTick) tickUpper += tickSpacing\n else tickLower -= tickSpacing\n }\n return {\n tickLower,\n tickUpper,\n derived: true,\n }\n}\n\nfunction createPool(input: {\n readonly context: ProtocolsContext\n readonly tokenA: string\n readonly tokenB: string\n readonly fee: number\n readonly pool: V3PoolStateInput\n}): { pool: Pool; tokenA: ProtocolToken; tokenB: ProtocolToken } {\n const tokenA = normalizeProtocolToken(input.context, input.tokenA, 'tokenA')\n const tokenB = normalizeProtocolToken(input.context, input.tokenB, 'tokenB')\n return {\n tokenA,\n tokenB,\n pool: new Pool({\n tokenA: tokenA.token,\n tokenB: tokenB.token,\n fee: input.fee as FeeAmount,\n sqrtRatioX96: normalizeBaseUnitAmount(input.pool.sqrtRatioX96, 'sqrtRatioX96'),\n liquidity: normalizeBaseUnitAmount(input.pool.liquidity, 'pool liquidity', { allowZero: true }),\n tickCurrent: input.pool.tickCurrent,\n ...(input.pool.tickSpacing !== undefined ? { tickSpacing: input.pool.tickSpacing } : {}),\n }),\n }\n}\n\nfunction createPosition(input: {\n readonly pool: Pool\n readonly tickLower: number\n readonly tickUpper: number\n readonly amount0: string\n readonly amount1: string\n readonly useFullPrecision?: boolean\n}): Position {\n return Position.fromAmounts({\n pool: input.pool,\n tickLower: input.tickLower,\n tickUpper: input.tickUpper,\n amount0: input.amount0,\n amount1: input.amount1,\n useFullPrecision: input.useFullPrecision ?? true,\n })\n}\n\nfunction isNativePoolToken(poolToken: Token, tokenA: ProtocolToken, tokenB: ProtocolToken): boolean {\n return (tokenA.kind === 'native' && poolToken.equals(tokenA.token)) || (tokenB.kind === 'native' && poolToken.equals(tokenB.token))\n}\n\nasync function planTokenApproval(input: {\n readonly context: ProtocolsContext\n readonly owner: TronAddress\n readonly token: Token\n readonly amount: string\n readonly spender: TronAddress\n readonly approval: V3AddLiquidityInput['approval']\n readonly tokenA: ProtocolToken\n readonly tokenB: ProtocolToken\n readonly operation: 'add-liquidity' | 'increase-liquidity'\n}): Promise<readonly ContractCallAction[]> {\n if (isNativePoolToken(input.token, input.tokenA, input.tokenB)) return []\n if (BigInt(input.amount) === 0n) return []\n const approval = await planApproval(\n input.context,\n {\n asset: { type: 'token', token: evmHexToTronAddress(input.token.address) },\n owner: input.owner,\n spender: input.spender,\n amount: input.amount,\n },\n { mode: input.approval ?? 'auto' },\n )\n return attachApprovalIntent(\n approval.actions,\n liquidityIntentScope(SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID, input.operation),\n input.token.symbol ?? input.token.address,\n ) as readonly ContractCallAction[]\n}\n\nfunction amountForToken(position: Position, token: Token): string {\n if (position.pool.token0.equals(token)) return position.mintAmounts.amount0.toString()\n return position.mintAmounts.amount1.toString()\n}\n\nfunction applyExplicitAddMinimums(\n methodParameters: ReturnType<typeof NonfungiblePositionManager.addCallParameters>,\n amount0Min: string,\n amount1Min: string,\n): ReturnType<typeof NonfungiblePositionManager.addCallParameters> {\n const parameter = methodParameters.parameter[0] as {\n readonly type: 'bytes[]'\n readonly value: readonly string[]\n }\n const mintSelector = NonfungiblePositionManager.INTERFACE.getSighash('mint')\n const calldatas = parameter.value.map((calldata) => {\n if (!calldata.startsWith(mintSelector)) return calldata\n const [mint] = NonfungiblePositionManager.INTERFACE.decodeFunctionData('mint', calldata) as unknown as [{\n readonly token0: string\n readonly token1: string\n readonly fee: unknown\n readonly tickLower: unknown\n readonly tickUpper: unknown\n readonly amount0Desired: unknown\n readonly amount1Desired: unknown\n readonly recipient: string\n readonly deadline: unknown\n }]\n return NonfungiblePositionManager.INTERFACE.encodeFunctionData('mint', [{\n token0: mint.token0,\n token1: mint.token1,\n fee: mint.fee,\n tickLower: mint.tickLower,\n tickUpper: mint.tickUpper,\n amount0Desired: mint.amount0Desired,\n amount1Desired: mint.amount1Desired,\n amount0Min,\n amount1Min,\n recipient: mint.recipient,\n deadline: mint.deadline,\n }])\n })\n return {\n ...methodParameters,\n calldata: Multicall.encodeMulticall(calldatas),\n parameter: [{ type: 'bytes[]', value: calldatas }],\n }\n}\n\nexport class V3LiquidityClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n readonly add = {\n plan: async (input: V3AddLiquidityInput): Promise<TransactionPlan> => this.planAdd(input),\n execute: async (input: V3AddLiquidityInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planAdd(input), createContextExecutor(this.context)),\n }\n\n readonly increase = {\n plan: async (input: V3IncreaseLiquidityInput): Promise<TransactionPlan> => this.planIncrease(input),\n execute: async (input: V3IncreaseLiquidityInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planIncrease(input), createContextExecutor(this.context)),\n }\n\n private async planAdd(input: V3AddLiquidityInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager')\n const planId = nextPlanId(this.context, 'liquidity-v3-add')\n const owner = await requireWalletAddress(this.context, 'V3 add liquidity')\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V3 add liquidity', owner)\n const deadline = normalizeDeadline(this.context, input)\n const amounts = normalizeSingleSideAmounts(input)\n const amount0 = normalizeBaseUnitAmount(amounts.amount0, 'amount0', { allowZero: true })\n const amount1 = normalizeBaseUnitAmount(amounts.amount1, 'amount1', { allowZero: true })\n const poolDerived = input.pool === undefined\n const poolState = input.pool ?? await resolveV3PoolState(this.context, input)\n const tickRange = resolveTickRange({\n ...(input.tickLower !== undefined ? { tickLower: input.tickLower } : {}),\n ...(input.tickUpper !== undefined ? { tickUpper: input.tickUpper } : {}),\n ...(input.tickRangeWidth !== undefined ? { tickRangeWidth: input.tickRangeWidth } : {}),\n pool: poolState,\n })\n const { pool, tokenA, tokenB } = createPool({\n context: this.context,\n tokenA: input.tokenA,\n tokenB: input.tokenB,\n fee: input.fee,\n pool: poolState,\n })\n const position = createPosition({\n pool,\n tickLower: tickRange.tickLower,\n tickUpper: tickRange.tickUpper,\n amount0,\n amount1,\n ...(input.useFullPrecision !== undefined ? { useFullPrecision: input.useFullPrecision } : {}),\n })\n const slippageTolerance = parseSlippage(input.slippage ?? '0.5%')\n const slippageMinimums = position.mintAmountsWithSlippage(slippageTolerance)\n const amount0Min = input.amount0Min === undefined\n ? slippageMinimums.amount0.toString()\n : normalizeBaseUnitAmount(input.amount0Min, 'amount0Min', { allowZero: true })\n const amount1Min = input.amount1Min === undefined\n ? slippageMinimums.amount1.toString()\n : normalizeBaseUnitAmount(input.amount1Min, 'amount1Min', { allowZero: true })\n const generatedMethodParameters = NonfungiblePositionManager.addCallParameters(position, {\n recipient: tronAddressToEvmAddress(recipient, 'recipient'),\n ...(input.createPool !== undefined ? { createPool: input.createPool } : {}),\n slippageTolerance,\n deadline,\n ...(tokenA.kind === 'native' || tokenB.kind === 'native' ? { useNative: this.context.chain.nativeCurrency } : {}),\n })\n const methodParameters = input.amount0Min === undefined && input.amount1Min === undefined\n ? generatedMethodParameters\n : applyExplicitAddMinimums(generatedMethodParameters, amount0Min, amount1Min)\n const action = methodParametersToAction({\n id: `${planId}-tx`,\n target: positionManager,\n methodParameters,\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n waitForReceipt: 'included',\n intent: {\n kind: 'add-liquidity',\n scope: liquidityIntentScope(SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID, 'add-liquidity'),\n },\n })\n const approvals = [\n ...await planTokenApproval({\n context: this.context,\n owner,\n token: pool.token0,\n amount: amountForToken(position, pool.token0),\n spender: positionManager,\n approval: input.approval,\n tokenA,\n tokenB,\n operation: 'add-liquidity',\n }),\n ...await planTokenApproval({\n context: this.context,\n owner,\n token: pool.token1,\n amount: amountForToken(position, pool.token1),\n spender: positionManager,\n approval: input.approval,\n tokenA,\n tokenB,\n operation: 'add-liquidity',\n }),\n ]\n\n return {\n id: planId,\n kind: 'liquidity',\n network: this.context.network,\n owner,\n summary: { title: 'Add SunSwap V3 liquidity', lines: [`Recipient ${recipient}`] },\n approvals,\n transactions: [action],\n metadata: {\n protocol: 'sunswap-v3',\n operation: 'add-liquidity',\n recipient,\n deadline,\n slippageBips: slippageToBips(input.slippage ?? '0.5%'),\n poolDerived,\n tickRangeDerived: tickRange.derived,\n tickLower: tickRange.tickLower,\n tickUpper: tickRange.tickUpper,\n },\n }\n }\n\n private async planIncrease(input: V3IncreaseLiquidityInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager')\n const planId = nextPlanId(this.context, 'liquidity-v3-increase')\n const owner = await requireWalletAddress(this.context, 'V3 increase liquidity')\n const deadline = normalizeDeadline(this.context, input)\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const amounts = normalizeSingleSideAmounts(input)\n const amount0 = normalizeBaseUnitAmount(amounts.amount0, 'amount0', { allowZero: true })\n const amount1 = normalizeBaseUnitAmount(amounts.amount1, 'amount1', { allowZero: true })\n const positionDerived = input.tokenA === undefined\n || input.tokenB === undefined\n || input.fee === undefined\n || input.tickLower === undefined\n || input.tickUpper === undefined\n const positionContext = await resolveV3PositionContext(this.context, tokenId, input.contracts)\n assertV3PositionContextMatches(this.context, tokenId, input, positionContext)\n const tokenAInput = input.tokenA ?? positionContext.tokenA\n const tokenBInput = input.tokenB ?? positionContext.tokenB\n const fee = input.fee ?? positionContext.fee\n const tickLower = input.tickLower ?? positionContext.tickLower\n const tickUpper = input.tickUpper ?? positionContext.tickUpper\n if (tokenAInput === undefined || tokenBInput === undefined || fee === undefined || tickLower === undefined || tickUpper === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V3 position context is incomplete', { tokenId })\n }\n const poolDerived = input.pool === undefined\n const poolState = input.pool ?? await resolveV3PoolState(this.context, {\n tokenA: tokenAInput,\n tokenB: tokenBInput,\n fee,\n contracts: input.contracts,\n })\n const { pool, tokenA, tokenB } = createPool({\n context: this.context,\n tokenA: tokenAInput,\n tokenB: tokenBInput,\n fee,\n pool: poolState,\n })\n const position = createPosition({\n pool,\n tickLower,\n tickUpper,\n amount0,\n amount1,\n ...(input.useFullPrecision !== undefined ? { useFullPrecision: input.useFullPrecision } : {}),\n })\n const methodParameters = NonfungiblePositionManager.addCallParameters(position, {\n tokenId,\n slippageTolerance: parseSlippage(input.slippage ?? '0.5%'),\n deadline,\n ...(tokenA.kind === 'native' || tokenB.kind === 'native' ? { useNative: this.context.chain.nativeCurrency } : {}),\n })\n const action = methodParametersToAction({\n id: `${planId}-tx`,\n target: positionManager,\n methodParameters,\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n waitForReceipt: 'included',\n intent: {\n kind: 'add-liquidity',\n scope: liquidityIntentScope(SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID, 'increase-liquidity'),\n positionId: tokenId,\n },\n })\n const approvals = [\n ...await planTokenApproval({\n context: this.context,\n owner,\n token: pool.token0,\n amount: amountForToken(position, pool.token0),\n spender: positionManager,\n approval: input.approval,\n tokenA,\n tokenB,\n operation: 'increase-liquidity',\n }),\n ...await planTokenApproval({\n context: this.context,\n owner,\n token: pool.token1,\n amount: amountForToken(position, pool.token1),\n spender: positionManager,\n approval: input.approval,\n tokenA,\n tokenB,\n operation: 'increase-liquidity',\n }),\n ]\n\n return {\n id: planId,\n kind: 'liquidity',\n network: this.context.network,\n owner,\n summary: { title: 'Increase SunSwap V3 liquidity', lines: [`Position ${tokenId}`] },\n approvals,\n transactions: [action],\n metadata: {\n protocol: 'sunswap-v3',\n operation: 'increase-liquidity',\n tokenId,\n deadline,\n slippageBips: slippageToBips(input.slippage ?? '0.5%'),\n positionDerived,\n poolDerived,\n },\n }\n }\n}\n","import type { TransactionIntentScope } from '@sun-protocol/sun-sdk-core'\n\nexport const SUNSWAP_V3_POSITION_PROTOCOL_ID = 'sunswap-v3'\nexport const SUNSWAP_V4_POSITION_PROTOCOL_ID = 'sunswap-v4'\n\nexport function positionIntentScope(\n protocol: string,\n operation: string,\n): TransactionIntentScope<'position'> {\n return { domain: 'position', protocol, operation }\n}\n","import {\n SDKError,\n assertTronAddress,\n type BigintIsh,\n type Percent,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { TickMath } from '@sun-protocol/sun-sdk-sunswap-v3'\nimport {\n buildV4CollectAction,\n buildV4DecreaseLiquidityAction,\n buildV4MulticallAction,\n buildV4PositionApprovalForAllRead,\n buildV4PositionFeesRead,\n buildV4PositionReads,\n buildV4PoolSlot0Read,\n computeV4PoolId,\n createV4PoolKey,\n encodeV4ContractCallAction,\n type V4PoolKey,\n} from '@sun-protocol/sun-sdk-sunswap-v4'\nimport {\n applySlippageMin,\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n normalizeRecipient,\n} from '../common.js'\nimport {\n createContextExecutor,\n requireWalletAddress,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport { executeTransactionPlan } from '../execute-plan.js'\nimport { assertPositionAuthorized } from '../internal/positions.js'\nimport {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport { evmHexToTronAddress, normalizeLiquidityPercentage } from '../internal/tokens.js'\nimport { slippageToBips } from '../common.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V4PositionCollectInput,\n V4PositionFeesSnapshot,\n V4PositionReadInput,\n V4PositionRemoveInput,\n V4PositionSnapshot,\n} from './types.js'\nimport {\n positionIntentScope,\n SUNSWAP_V4_POSITION_PROTOCOL_ID,\n} from './intents.js'\n\ninterface V4PoolAndPositionInfoObjectResult {\n readonly poolKey?: unknown\n readonly tickLower?: unknown\n readonly tickUpper?: unknown\n}\n\ntype OptionalV4PoolKey<T> = T extends unknown\n ? Omit<T, 'poolKey'> & { readonly poolKey?: V4PoolKey }\n : never\n\ntype V4PositionRemovePlanInput = OptionalV4PoolKey<V4PositionRemoveInput>\ntype V4PositionCollectPlanInput = OptionalV4PoolKey<V4PositionCollectInput>\n\nconst Q96 = 1n << 96n\n\nfunction parseString(value: unknown, label: string): string {\n if (typeof value === 'bigint' || typeof value === 'number' || typeof value === 'string') {\n return BigInt(value.toString()).toString()\n }\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n}\n\nfunction parseNumber(value: unknown, label: string): number {\n const parsed = Number(parseString(value, label))\n if (!Number.isSafeInteger(parsed)) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be a safe integer`, { value })\n }\n return parsed\n}\n\nfunction unwrapSingle(value: unknown): unknown {\n return Array.isArray(value) && value.length === 1 ? value[0] : value\n}\n\nfunction parseAddress(value: unknown, label: string): TronAddress {\n const raw = String(unwrapSingle(value))\n try {\n return assertTronAddress(raw, label)\n } catch {\n const evmHex = /^41[0-9a-fA-F]{40}$/.test(raw) ? `0x${raw.slice(2)}` : raw\n return evmHexToTronAddress(evmHex, label)\n }\n}\n\nfunction parsePoolKey(value: unknown, network: ProtocolsContext['network']): V4PoolKey | undefined {\n if (Array.isArray(value) && value.length >= 5) {\n return createV4PoolKey({\n network,\n currencyA: parseAddress(value[0], 'poolKey.currency0'),\n currencyB: parseAddress(value[1], 'poolKey.currency1'),\n hooks: parseAddress(value[2], 'poolKey.hooks'),\n fee: parseNumber(value[3], 'poolKey.fee'),\n parameters: String(value[4]),\n })\n }\n if (typeof value === 'object' && value !== null) {\n const key = value as Record<string, unknown>\n if (key.currency0 !== undefined && key.currency1 !== undefined && key.hooks !== undefined\n && key.fee !== undefined && key.parameters !== undefined) {\n return createV4PoolKey({\n network,\n currencyA: parseAddress(key.currency0, 'poolKey.currency0'),\n currencyB: parseAddress(key.currency1, 'poolKey.currency1'),\n hooks: parseAddress(key.hooks, 'poolKey.hooks'),\n fee: parseNumber(key.fee, 'poolKey.fee'),\n parameters: String(key.parameters),\n })\n }\n }\n return undefined\n}\n\nfunction signed24(value: bigint): number {\n const masked = value & 0xffffffn\n return Number((masked & 0x800000n) === 0n ? masked : masked - 0x1000000n)\n}\n\nfunction parsePackedPositionInfo(value: unknown): Pick<V4PositionSnapshot, 'tickLower' | 'tickUpper'> {\n const info = BigInt(String(unwrapSingle(value)))\n return {\n tickLower: signed24(info >> 8n),\n tickUpper: signed24(info >> 32n),\n }\n}\n\nfunction parseOptionalPoolInfo(\n result: unknown,\n network: ProtocolsContext['network'],\n): Pick<V4PositionSnapshot, 'poolKey' | 'tickLower' | 'tickUpper'> {\n if (Array.isArray(result)) {\n const poolKey = parsePoolKey(result[0], network)\n const ticks = result[2] !== undefined\n ? {\n tickLower: parseNumber(result[1], 'tickLower'),\n tickUpper: parseNumber(result[2], 'tickUpper'),\n }\n : result[1] !== undefined\n ? parsePackedPositionInfo(result[1])\n : {}\n return {\n ...(poolKey !== undefined ? { poolKey } : {}),\n ...ticks,\n }\n }\n\n if (typeof result === 'object' && result !== null) {\n const info = result as V4PoolAndPositionInfoObjectResult\n const poolKey = parsePoolKey(info.poolKey, network)\n return {\n ...(poolKey !== undefined ? { poolKey } : {}),\n ...(info.tickLower !== undefined ? { tickLower: parseNumber(info.tickLower, 'tickLower') } : {}),\n ...(info.tickUpper !== undefined ? { tickUpper: parseNumber(info.tickUpper, 'tickUpper') } : {}),\n }\n }\n\n return {}\n}\n\nfunction parseFeesResult(result: unknown): Pick<V4PositionFeesSnapshot, 'feesOwed0' | 'feesOwed1'> {\n const value = unwrapSingle(result)\n if (Array.isArray(value) && value.length >= 2) {\n return {\n feesOwed0: parseString(value[0], 'feesOwed0'),\n feesOwed1: parseString(value[1], 'feesOwed1'),\n }\n }\n if (typeof value === 'object' && value !== null) {\n const fees = value as Record<string, unknown>\n if (fees.feesOwed0 !== undefined && fees.feesOwed1 !== undefined) {\n return {\n feesOwed0: parseString(fees.feesOwed0, 'feesOwed0'),\n feesOwed1: parseString(fees.feesOwed1, 'feesOwed1'),\n }\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position fee result is malformed', { result })\n}\n\nfunction liquidityFromPercentage(totalLiquidity: BigintIsh, percentage: Percent): string {\n const total = BigInt(normalizeBaseUnitAmount(totalLiquidity, 'currentLiquidity'))\n const numerator = BigInt(percentage.numerator.toString())\n const denominator = BigInt(percentage.denominator.toString())\n const liquidity = (total * numerator) / denominator\n if (liquidity <= 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'percentage resolves to zero liquidity', {\n totalLiquidity: total.toString(),\n percentage: percentage.toSignificant(),\n })\n }\n return liquidity.toString()\n}\n\nfunction resolveRemoveLiquidity(input: V4PositionRemovePlanInput, snapshotLiquidity: string): string {\n const normalizedSnapshotLiquidity = normalizeBaseUnitAmount(snapshotLiquidity, 'position liquidity')\n if (input.currentLiquidity !== undefined && input.validationMode !== 'legacy') {\n const expectedLiquidity = normalizeBaseUnitAmount(input.currentLiquidity, 'currentLiquidity')\n if (expectedLiquidity !== normalizedSnapshotLiquidity) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'currentLiquidity is stale and does not match the on-chain position', {\n currentLiquidity: expectedLiquidity,\n positionLiquidity: normalizedSnapshotLiquidity,\n })\n }\n }\n\n const liquidity = input.liquidity !== undefined\n ? normalizeBaseUnitAmount(input.liquidity, 'liquidity')\n : liquidityFromPercentage(normalizedSnapshotLiquidity, normalizeLiquidityPercentage(input.percentage, 'percentage'))\n if (BigInt(liquidity) > BigInt(normalizedSnapshotLiquidity) && input.validationMode === 'legacy') {\n return normalizedSnapshotLiquidity\n }\n if (BigInt(liquidity) > BigInt(normalizedSnapshotLiquidity)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'liquidity cannot exceed on-chain position liquidity', {\n liquidity,\n positionLiquidity: normalizedSnapshotLiquidity,\n })\n }\n return liquidity\n}\n\nfunction parseSqrtPriceX96(result: unknown): bigint {\n const value = Array.isArray(result)\n ? result[0]\n : typeof result === 'object' && result !== null\n ? (result as { readonly sqrtPriceX96?: unknown }).sqrtPriceX96\n : undefined\n try {\n const parsed = BigInt(String(value))\n if (parsed <= 0n) throw new Error('non-positive')\n return parsed\n } catch {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 slot0 result has an invalid sqrtPriceX96', { result })\n }\n}\n\nfunction removalAmounts(snapshot: V4PositionSnapshot, liquidity: string, sqrtPriceX96: bigint): readonly [bigint, bigint] {\n if (snapshot.tickLower === undefined || snapshot.tickUpper === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position is missing ticks required to derive removal minimums', {\n tokenId: snapshot.tokenId,\n })\n }\n const sqrtA = BigInt(TickMath.getSqrtRatioAtTick(snapshot.tickLower).toString())\n const sqrtB = BigInt(TickMath.getSqrtRatioAtTick(snapshot.tickUpper).toString())\n const positionLiquidity = BigInt(liquidity)\n if (sqrtPriceX96 <= sqrtA) {\n return [(positionLiquidity * (sqrtB - sqrtA) * Q96) / (sqrtA * sqrtB), 0n]\n }\n if (sqrtPriceX96 < sqrtB) {\n return [\n (positionLiquidity * (sqrtB - sqrtPriceX96) * Q96) / (sqrtPriceX96 * sqrtB),\n (positionLiquidity * (sqrtPriceX96 - sqrtA)) / Q96,\n ]\n }\n return [0n, (positionLiquidity * (sqrtB - sqrtA)) / Q96]\n}\n\nfunction resolvePositionPoolKey(\n tokenId: string,\n supplied: V4PoolKey | undefined,\n snapshot: V4PositionSnapshot,\n): { readonly poolKey: V4PoolKey; readonly derived: boolean } {\n if (snapshot.poolKey === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position does not include a poolKey', { tokenId })\n }\n if (supplied !== undefined) {\n const suppliedPoolId = computeV4PoolId(supplied)\n const positionPoolId = computeV4PoolId(snapshot.poolKey)\n if (suppliedPoolId !== positionPoolId) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V4 poolKey does not match the tokenId position', {\n tokenId,\n suppliedPoolId,\n positionPoolId,\n })\n }\n return { poolKey: supplied, derived: false }\n }\n return { poolKey: snapshot.poolKey, derived: true }\n}\n\nfunction assertTriggerRecipient(wallet: TronAddress, recipient: TronAddress, operation: string): void {\n if (wallet !== recipient) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${operation} recipient must match the triggering wallet`, {\n wallet,\n recipient,\n })\n }\n}\n\nfunction metadata(input: {\n readonly operation: string\n readonly tokenId: string\n readonly owner?: string\n readonly recipient?: string\n readonly deadline?: string\n readonly slippageBips?: number\n readonly poolKeyDerived?: boolean\n}): Record<string, unknown> {\n return {\n protocol: 'sunswap-v4',\n operation: input.operation,\n tokenId: input.tokenId,\n ...(input.owner !== undefined ? { owner: input.owner } : {}),\n ...(input.recipient !== undefined ? { recipient: input.recipient } : {}),\n ...(input.deadline !== undefined ? { deadline: input.deadline } : {}),\n ...(input.slippageBips !== undefined ? { slippageBips: input.slippageBips } : {}),\n ...(input.poolKeyDerived !== undefined ? { poolKeyDerived: input.poolKeyDerived } : {}),\n }\n}\n\nexport class V4PositionsClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n async read(input: V4PositionReadInput): Promise<V4PositionSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const reads = buildV4PositionReads({ network: this.context.network, tokenId, positionManager })\n const [poolInfoResult, liquidityResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n reads,\n 'V4 position read',\n )\n const owner = parseAddress(ownerResult, 'owner')\n const approved = approvedResult ? parseAddress(approvedResult, 'approved') : undefined\n const operator = input.operator ? assertTronAddress(input.operator, 'operator') : undefined\n const operatorApproved = operator\n ? Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV4PositionApprovalForAllRead({ network: this.context.network, owner, operator, positionManager }),\n 'V4 position operator approval read',\n ).then(unwrapSingle))\n : undefined\n\n return {\n protocol: 'sunswap-v4',\n tokenId,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n ...parseOptionalPoolInfo(poolInfoResult, this.context.network),\n liquidity: parseString(unwrapSingle(liquidityResult), 'liquidity'),\n }\n }\n\n async fees(input: V4PositionReadInput): Promise<V4PositionFeesSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const snapshot = await this.read(input)\n if (snapshot.poolKey === undefined || snapshot.tickLower === undefined || snapshot.tickUpper === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position does not include the context required to read fees', {\n tokenId,\n })\n }\n const result = await readRequiredContract<unknown>(\n this.context,\n buildV4PositionFeesRead({\n network: this.context.network,\n tokenId,\n poolId: computeV4PoolId(snapshot.poolKey),\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n poolManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PoolManager'),\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager'),\n lpFeeHelper: resolveProtocolContract(this.context, input.contracts, 'sunswapV4LpFeeHelper'),\n }),\n 'V4 position fee read',\n )\n return {\n protocol: 'sunswap-v4',\n tokenId,\n ...parseFeesResult(result),\n }\n }\n\n readonly remove = {\n plan: async (input: V4PositionRemovePlanInput): Promise<TransactionPlan> => this.planRemove(input),\n execute: async (input: V4PositionRemovePlanInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planRemove(input), createContextExecutor(this.context)),\n }\n\n readonly collect = {\n plan: async (input: V4PositionCollectPlanInput): Promise<TransactionPlan> => this.planCollect(input),\n execute: async (input: V4PositionCollectPlanInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planCollect(input), createContextExecutor(this.context)),\n }\n\n private async readAuthorizedPosition(\n tokenId: string,\n operation: string,\n contracts: V4PositionReadInput['contracts'],\n validationMode: V4PositionRemoveInput['validationMode'],\n ): Promise<{ wallet: TronAddress; snapshot: V4PositionSnapshot }> {\n const wallet = await requireWalletAddress(this.context, operation)\n const snapshot = await this.read({\n tokenId,\n ...(validationMode === 'legacy' ? {} : { operator: wallet }),\n ...(contracts !== undefined ? { contracts } : {}),\n })\n if (validationMode !== 'legacy') {\n assertPositionAuthorized({\n tokenId,\n wallet,\n owner: snapshot.owner,\n ...(snapshot.approved !== undefined ? { approved: snapshot.approved } : {}),\n ...(snapshot.operatorApproved !== undefined ? { operatorApproved: snapshot.operatorApproved } : {}),\n })\n }\n return { wallet, snapshot }\n }\n\n private async planRemove(input: V4PositionRemovePlanInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'position-v4-remove')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V4 remove position',\n input.contracts,\n input.validationMode,\n )\n const poolKey = resolvePositionPoolKey(tokenId, input.poolKey, snapshot)\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V4 remove position', wallet)\n assertTriggerRecipient(wallet, recipient, 'V4 remove position')\n const deadline = normalizeDeadline(this.context, input)\n const slippageBips = slippageToBips(input.slippage ?? '0.5%')\n const liquidity = resolveRemoveLiquidity(input, snapshot.liquidity)\n const derivedAmounts = input.amount0Min === undefined || input.amount1Min === undefined\n ? removalAmounts(\n snapshot,\n liquidity,\n parseSqrtPriceX96(await readRequiredContract<unknown>(\n this.context,\n buildV4PoolSlot0Read({\n network: this.context.network,\n poolId: computeV4PoolId(poolKey.poolKey),\n poolManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PoolManager'),\n }),\n 'V4 removal minimum quote',\n )),\n )\n : undefined\n const amount0Min = input.amount0Min !== undefined\n ? normalizeBaseUnitAmount(input.amount0Min, 'amount0Min', { allowZero: true })\n : input.roundingMode === 'half-up'\n ? (((derivedAmounts?.[0] ?? 0n) * BigInt(10_000 - slippageBips) + 5_000n) / 10_000n).toString()\n : applySlippageMin(derivedAmounts?.[0] ?? 0n, slippageBips).toString()\n const amount1Min = input.amount1Min !== undefined\n ? normalizeBaseUnitAmount(input.amount1Min, 'amount1Min', { allowZero: true })\n : input.roundingMode === 'half-up'\n ? (((derivedAmounts?.[1] ?? 0n) * BigInt(10_000 - slippageBips) + 5_000n) / 10_000n).toString()\n : applySlippageMin(derivedAmounts?.[1] ?? 0n, slippageBips).toString()\n const decreaseAction = buildV4DecreaseLiquidityAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n tokenId,\n liquidity,\n amount0Min,\n amount1Min,\n recipient,\n deadline,\n ...(input.settlementMode !== undefined ? { settlementMode: input.settlementMode } : {}),\n ...(input.hookData !== undefined ? { hookData: input.hookData } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const transactionAction = input.transactionMode === 'multicall'\n ? buildV4MulticallAction({\n network: this.context.network,\n positionManager,\n calls: [encodeV4ContractCallAction(decreaseAction)],\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n : decreaseAction\n const action = {\n ...transactionAction,\n intent: {\n kind: 'remove-liquidity' as const,\n scope: positionIntentScope(SUNSWAP_V4_POSITION_PROTOCOL_ID, 'remove-position'),\n positionId: tokenId,\n },\n }\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: {\n title: 'Remove SunSwap V4 position liquidity',\n lines: [`Position ${tokenId}`, `Recipient ${recipient}`],\n },\n approvals: [],\n transactions: [action],\n metadata: metadata({\n operation: 'remove-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n slippageBips,\n poolKeyDerived: poolKey.derived,\n }),\n }\n }\n\n private async planCollect(input: V4PositionCollectPlanInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'position-v4-collect')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V4 collect position',\n input.contracts,\n input.validationMode,\n )\n const poolKey = resolvePositionPoolKey(tokenId, input.poolKey, snapshot)\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V4 collect position', wallet)\n assertTriggerRecipient(wallet, recipient, 'V4 collect position')\n const deadline = normalizeDeadline(this.context, input)\n const action = buildV4CollectAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n tokenId,\n recipient,\n deadline,\n ...(input.settlementMode !== undefined ? { settlementMode: input.settlementMode } : {}),\n ...(input.hookData !== undefined ? { hookData: input.hookData } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const transactionAction = input.transactionMode === 'multicall'\n ? buildV4MulticallAction({\n network: this.context.network,\n positionManager,\n calls: [encodeV4ContractCallAction(action)],\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n : action\n const transaction = {\n ...transactionAction,\n intent: {\n kind: 'collect-fees' as const,\n scope: positionIntentScope(SUNSWAP_V4_POSITION_PROTOCOL_ID, 'collect-position'),\n positionId: tokenId,\n },\n }\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: {\n title: 'Collect SunSwap V4 position fees',\n lines: [`Position ${tokenId}`, `Recipient ${recipient}`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: metadata({\n operation: 'collect-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n poolKeyDerived: poolKey.derived,\n }),\n }\n }\n}\n","import type { ProtocolsContext } from '../context.js'\nimport { V3PositionsClient } from './v3.js'\nimport { V4PositionsClient } from './v4.js'\n\nexport class PositionsClient {\n readonly v3: {\n readonly read: V3PositionsClient['read']\n readonly remove: V3PositionsClient['remove']\n readonly collect: V3PositionsClient['collect']\n }\n readonly v4: {\n readonly read: V4PositionsClient['read']\n readonly fees: V4PositionsClient['fees']\n readonly remove: V4PositionsClient['remove']\n readonly collect: V4PositionsClient['collect']\n }\n\n constructor(context: ProtocolsContext) {\n const v3Client = new V3PositionsClient(context)\n const v4Client = new V4PositionsClient(context)\n this.v3 = {\n read: (input) => v3Client.read(input),\n remove: v3Client.remove,\n collect: v3Client.collect,\n }\n this.v4 = {\n read: (input) => v4Client.read(input),\n fees: (input) => v4Client.fees(input),\n remove: v4Client.remove,\n collect: v4Client.collect,\n }\n }\n}\n\nexport function createPositionsClient(context: ProtocolsContext): PositionsClient {\n return new PositionsClient(context)\n}\n"],"mappings":"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","names":["import_sun_sdk_core","import_sun_sdk_sunswap_v3","import_sun_sdk_core","import_sun_sdk_api","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_chains","import_sun_sdk_core","PERCENT_PATTERN","evmHexToTronAddressV2","metadata","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","integerString","integerNumber","import_sun_sdk_core","import_sun_sdk_sunswap_v3","unwrapSingle"]}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { S as SlippageInput, C as ContractOverrides, P as ProtocolsContext, T as TransactionPlan, a as TransactionPlanExecutionResult, b as TransactionPlanExecutor } from '../common-8VQQ0FSU.cjs';
|
|
2
|
+
export { A as ApprovalMode } from '../common-8VQQ0FSU.cjs';
|
|
3
|
+
import { BigintIsh, Percent, ContractCallAction } from '@sun-protocol/sun-sdk-core';
|
|
4
|
+
import { V4PoolKey } from '@sun-protocol/sun-sdk-sunswap-v4';
|
|
5
|
+
import { a as LiquidityPlanOptions, e as V3PoolStateInput, k as V4ExecutionOptions } from '../types-BTPdCC7k.cjs';
|
|
6
|
+
import '@sun-protocol/sun-sdk-api';
|
|
7
|
+
import '@sun-protocol/sun-sdk-chains';
|
|
8
|
+
import '@sun-protocol/sun-sdk-runtime';
|
|
9
|
+
|
|
10
|
+
type PositionLiquidityInput = {
|
|
11
|
+
readonly liquidity: BigintIsh;
|
|
12
|
+
readonly percentage?: never;
|
|
13
|
+
} | {
|
|
14
|
+
readonly liquidity?: never;
|
|
15
|
+
readonly percentage: SlippageInput | Percent;
|
|
16
|
+
};
|
|
17
|
+
interface PositionActionOptions extends LiquidityPlanOptions {
|
|
18
|
+
readonly tokenId: BigintIsh;
|
|
19
|
+
readonly receiveNative?: boolean;
|
|
20
|
+
/** Keep strict SDK guards by default; legacy defers authorization/stale-state failures to the contract. */
|
|
21
|
+
readonly validationMode?: 'strict' | 'legacy';
|
|
22
|
+
}
|
|
23
|
+
type PositionRemoveInput = PositionActionOptions & PositionLiquidityInput;
|
|
24
|
+
type PositionCollectInput = PositionActionOptions;
|
|
25
|
+
interface V3PositionSnapshot {
|
|
26
|
+
readonly protocol: 'sunswap-v3';
|
|
27
|
+
readonly tokenId: string;
|
|
28
|
+
readonly owner: string;
|
|
29
|
+
readonly approved?: string;
|
|
30
|
+
readonly operatorApproved?: boolean;
|
|
31
|
+
readonly token0: string;
|
|
32
|
+
readonly token1: string;
|
|
33
|
+
readonly fee: number;
|
|
34
|
+
readonly tickLower: number;
|
|
35
|
+
readonly tickUpper: number;
|
|
36
|
+
readonly liquidity: string;
|
|
37
|
+
readonly tokensOwed0: string;
|
|
38
|
+
readonly tokensOwed1: string;
|
|
39
|
+
}
|
|
40
|
+
interface V3PositionReadInput {
|
|
41
|
+
readonly tokenId: BigintIsh;
|
|
42
|
+
readonly operator?: string;
|
|
43
|
+
readonly contracts?: ContractOverrides;
|
|
44
|
+
}
|
|
45
|
+
type V3PositionRemoveInput = PositionActionOptions & PositionLiquidityInput & {
|
|
46
|
+
readonly pool?: V3PoolStateInput;
|
|
47
|
+
readonly receiveNative?: boolean;
|
|
48
|
+
readonly burnToken?: boolean;
|
|
49
|
+
readonly expectedCurrencyOwed0?: BigintIsh;
|
|
50
|
+
readonly expectedCurrencyOwed1?: BigintIsh;
|
|
51
|
+
};
|
|
52
|
+
interface V3PositionCollectInput extends PositionActionOptions {
|
|
53
|
+
readonly receiveNative?: boolean;
|
|
54
|
+
readonly expectedCurrencyOwed0?: BigintIsh;
|
|
55
|
+
readonly expectedCurrencyOwed1?: BigintIsh;
|
|
56
|
+
}
|
|
57
|
+
interface V4PositionSnapshot {
|
|
58
|
+
readonly protocol: 'sunswap-v4';
|
|
59
|
+
readonly tokenId: string;
|
|
60
|
+
readonly owner: string;
|
|
61
|
+
readonly approved?: string;
|
|
62
|
+
readonly operatorApproved?: boolean;
|
|
63
|
+
readonly poolKey?: V4PoolKey;
|
|
64
|
+
readonly tickLower?: number;
|
|
65
|
+
readonly tickUpper?: number;
|
|
66
|
+
readonly liquidity: string;
|
|
67
|
+
}
|
|
68
|
+
interface V4PositionReadInput {
|
|
69
|
+
readonly tokenId: BigintIsh;
|
|
70
|
+
readonly operator?: string;
|
|
71
|
+
readonly contracts?: ContractOverrides;
|
|
72
|
+
}
|
|
73
|
+
interface V4PositionFeesSnapshot {
|
|
74
|
+
readonly protocol: 'sunswap-v4';
|
|
75
|
+
readonly tokenId: string;
|
|
76
|
+
readonly feesOwed0: string;
|
|
77
|
+
readonly feesOwed1: string;
|
|
78
|
+
}
|
|
79
|
+
type V4PositionRemoveInput = PositionActionOptions & PositionLiquidityInput & V4ExecutionOptions & {
|
|
80
|
+
readonly poolKey?: V4PoolKey;
|
|
81
|
+
readonly amount0Min?: BigintIsh;
|
|
82
|
+
readonly amount1Min?: BigintIsh;
|
|
83
|
+
/** Optional stale-state guard that must equal the latest on-chain position liquidity. */
|
|
84
|
+
readonly currentLiquidity?: BigintIsh;
|
|
85
|
+
readonly hookData?: string;
|
|
86
|
+
readonly settlementMode?: 'take-pair' | 'close-currency';
|
|
87
|
+
};
|
|
88
|
+
interface V4PositionCollectInput extends PositionActionOptions, V4ExecutionOptions {
|
|
89
|
+
readonly poolKey?: V4PoolKey;
|
|
90
|
+
readonly hookData?: string;
|
|
91
|
+
readonly settlementMode?: 'take-pair' | 'close-currency';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
declare class V3PositionsClient {
|
|
95
|
+
private readonly context;
|
|
96
|
+
constructor(context: ProtocolsContext);
|
|
97
|
+
read(input: V3PositionReadInput): Promise<V3PositionSnapshot>;
|
|
98
|
+
readonly remove: {
|
|
99
|
+
plan: (input: V3PositionRemoveInput) => Promise<TransactionPlan>;
|
|
100
|
+
execute: (input: V3PositionRemoveInput) => Promise<TransactionPlanExecutionResult>;
|
|
101
|
+
};
|
|
102
|
+
readonly collect: {
|
|
103
|
+
plan: (input: V3PositionCollectInput) => Promise<TransactionPlan>;
|
|
104
|
+
execute: (input: V3PositionCollectInput) => Promise<TransactionPlanExecutionResult>;
|
|
105
|
+
};
|
|
106
|
+
private usdtTransferContext;
|
|
107
|
+
private readAuthorizedPosition;
|
|
108
|
+
private planRemove;
|
|
109
|
+
private planCollect;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
type OptionalV4PoolKey<T> = T extends unknown ? Omit<T, 'poolKey'> & {
|
|
113
|
+
readonly poolKey?: V4PoolKey;
|
|
114
|
+
} : never;
|
|
115
|
+
type V4PositionRemovePlanInput = OptionalV4PoolKey<V4PositionRemoveInput>;
|
|
116
|
+
type V4PositionCollectPlanInput = OptionalV4PoolKey<V4PositionCollectInput>;
|
|
117
|
+
declare class V4PositionsClient {
|
|
118
|
+
private readonly context;
|
|
119
|
+
constructor(context: ProtocolsContext);
|
|
120
|
+
read(input: V4PositionReadInput): Promise<V4PositionSnapshot>;
|
|
121
|
+
fees(input: V4PositionReadInput): Promise<V4PositionFeesSnapshot>;
|
|
122
|
+
readonly remove: {
|
|
123
|
+
plan: (input: V4PositionRemovePlanInput) => Promise<TransactionPlan>;
|
|
124
|
+
execute: (input: V4PositionRemovePlanInput) => Promise<TransactionPlanExecutionResult>;
|
|
125
|
+
};
|
|
126
|
+
readonly collect: {
|
|
127
|
+
plan: (input: V4PositionCollectPlanInput) => Promise<TransactionPlan>;
|
|
128
|
+
execute: (input: V4PositionCollectPlanInput) => Promise<TransactionPlanExecutionResult>;
|
|
129
|
+
};
|
|
130
|
+
private readAuthorizedPosition;
|
|
131
|
+
private planRemove;
|
|
132
|
+
private planCollect;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
declare class PositionsClient {
|
|
136
|
+
readonly v3: {
|
|
137
|
+
readonly read: V3PositionsClient['read'];
|
|
138
|
+
readonly remove: V3PositionsClient['remove'];
|
|
139
|
+
readonly collect: V3PositionsClient['collect'];
|
|
140
|
+
};
|
|
141
|
+
readonly v4: {
|
|
142
|
+
readonly read: V4PositionsClient['read'];
|
|
143
|
+
readonly fees: V4PositionsClient['fees'];
|
|
144
|
+
readonly remove: V4PositionsClient['remove'];
|
|
145
|
+
readonly collect: V4PositionsClient['collect'];
|
|
146
|
+
};
|
|
147
|
+
constructor(context: ProtocolsContext);
|
|
148
|
+
}
|
|
149
|
+
declare function createPositionsClient(context: ProtocolsContext): PositionsClient;
|
|
150
|
+
|
|
151
|
+
declare const SUNSWAP_V3_POSITION_PROTOCOL_ID = "sunswap-v3";
|
|
152
|
+
declare const SUNSWAP_V4_POSITION_PROTOCOL_ID = "sunswap-v4";
|
|
153
|
+
|
|
154
|
+
/** Check an SDK-built V3 remove/collect action immediately before its final send. */
|
|
155
|
+
declare function assertV3PositionUsdtTransfer(context: ProtocolsContext, action: ContractCallAction): Promise<void>;
|
|
156
|
+
/** Use this executor for V3 position plans, including staged execution and retries. */
|
|
157
|
+
declare function createV3PositionsExecutor(context: ProtocolsContext): TransactionPlanExecutor;
|
|
158
|
+
|
|
159
|
+
export { type PositionActionOptions, type PositionCollectInput, type PositionLiquidityInput, type PositionRemoveInput, PositionsClient, SUNSWAP_V3_POSITION_PROTOCOL_ID, SUNSWAP_V4_POSITION_PROTOCOL_ID, TransactionPlan, type V3PositionCollectInput, type V3PositionReadInput, type V3PositionRemoveInput, type V3PositionSnapshot, V3PositionsClient, type V4PositionCollectInput, type V4PositionFeesSnapshot, type V4PositionReadInput, type V4PositionRemoveInput, type V4PositionSnapshot, V4PositionsClient, assertV3PositionUsdtTransfer, createPositionsClient, createV3PositionsExecutor };
|