@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.
Files changed (60) hide show
  1. package/README.md +30 -0
  2. package/dist/chunk-5XDX5563.js +99 -0
  3. package/dist/chunk-5XDX5563.js.map +1 -0
  4. package/dist/chunk-C2YCVBPI.js +212 -0
  5. package/dist/chunk-C2YCVBPI.js.map +1 -0
  6. package/dist/chunk-ECCGOXNA.js +1317 -0
  7. package/dist/chunk-ECCGOXNA.js.map +1 -0
  8. package/dist/chunk-HD2S3Q7L.js +746 -0
  9. package/dist/chunk-HD2S3Q7L.js.map +1 -0
  10. package/dist/chunk-L5TZCDPH.js +561 -0
  11. package/dist/chunk-L5TZCDPH.js.map +1 -0
  12. package/dist/chunk-OM4OW4KB.js +224 -0
  13. package/dist/chunk-OM4OW4KB.js.map +1 -0
  14. package/dist/chunk-PEGREDLT.js +935 -0
  15. package/dist/chunk-PEGREDLT.js.map +1 -0
  16. package/dist/chunk-TSHXXRH2.js +103 -0
  17. package/dist/chunk-TSHXXRH2.js.map +1 -0
  18. package/dist/chunk-VFVKMC4H.js +521 -0
  19. package/dist/chunk-VFVKMC4H.js.map +1 -0
  20. package/dist/chunk-YMGZDXI4.js +1209 -0
  21. package/dist/chunk-YMGZDXI4.js.map +1 -0
  22. package/dist/common-8VQQ0FSU.d.cts +146 -0
  23. package/dist/common-8VQQ0FSU.d.ts +146 -0
  24. package/dist/execute-BNKh6dT6.d.cts +187 -0
  25. package/dist/execute-CVhcKZxF.d.ts +187 -0
  26. package/dist/index.cjs +5619 -0
  27. package/dist/index.cjs.map +1 -0
  28. package/dist/index.d.cts +139 -0
  29. package/dist/index.d.ts +139 -0
  30. package/dist/index.js +200 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/intents-BSXq1HvW.d.cts +200 -0
  33. package/dist/intents-CwOttD75.d.ts +200 -0
  34. package/dist/liquidity/index.cjs +2441 -0
  35. package/dist/liquidity/index.cjs.map +1 -0
  36. package/dist/liquidity/index.d.cts +83 -0
  37. package/dist/liquidity/index.d.ts +83 -0
  38. package/dist/liquidity/index.js +32 -0
  39. package/dist/liquidity/index.js.map +1 -0
  40. package/dist/positions/index.cjs +1544 -0
  41. package/dist/positions/index.cjs.map +1 -0
  42. package/dist/positions/index.d.cts +159 -0
  43. package/dist/positions/index.d.ts +159 -0
  44. package/dist/positions/index.js +25 -0
  45. package/dist/positions/index.js.map +1 -0
  46. package/dist/pump/index.cjs +1178 -0
  47. package/dist/pump/index.cjs.map +1 -0
  48. package/dist/pump/index.d.cts +16 -0
  49. package/dist/pump/index.d.ts +16 -0
  50. package/dist/pump/index.js +29 -0
  51. package/dist/pump/index.js.map +1 -0
  52. package/dist/swap/index.cjs +2259 -0
  53. package/dist/swap/index.cjs.map +1 -0
  54. package/dist/swap/index.d.cts +33 -0
  55. package/dist/swap/index.d.ts +33 -0
  56. package/dist/swap/index.js +61 -0
  57. package/dist/swap/index.js.map +1 -0
  58. package/dist/types-BTPdCC7k.d.cts +160 -0
  59. package/dist/types-BfrouFmO.d.ts +160 -0
  60. package/package.json +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/liquidity/index.ts","../../src/liquidity/v2.ts","../../src/approval/plan.ts","../../src/common.ts","../../src/context.ts","../../src/execute-http-action.ts","../../src/approval/check.ts","../../src/approval/classic.ts","../../src/execute-plan.ts","../../src/errors.ts","../../src/internal/reads.ts","../../src/internal/tokens.ts","../../src/internal/intents.ts","../../src/liquidity/intents.ts","../../src/liquidity/v3.ts","../../src/internal/method-parameters.ts","../../src/liquidity/v4.ts","../../src/approval/permit2.ts","../../src/internal/permit2-adapter.ts","../../src/liquidity/client.ts"],"sourcesContent":["export {\n createLiquidityClient,\n LiquidityClient,\n} from './client.js'\nexport {\n createV2LiquidityClient,\n planV2AddLiquidity,\n planV2RemoveLiquidity,\n V2LiquidityClient,\n} from './v2.js'\nexport { V3LiquidityClient } from './v3.js'\nexport { V4LiquidityClient } from './v4.js'\nexport {\n SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID,\n SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID,\n SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID,\n} from './intents.js'\nexport type {\n LiquidityAmountInput,\n LiquidityPlanOptions,\n V3AddLiquidityInput,\n V3IncreaseLiquidityInput,\n V3PoolStateInput,\n V2AddLiquidityInput,\n V2RemoveLiquidityInput,\n V4IncreaseLiquidityInput,\n V4InitializePoolInput,\n V4MintPositionInput,\n V4PoolReadInput,\n V4PoolSnapshot,\n} from './types.js'\nexport type { ApprovalMode } from '../types/options.js'\nexport type { TransactionPlan } from '../types/plan.js'\n","import {\n CurrencyAmount,\n SDKError,\n TRON_ZERO_ADDRESS,\n assertTronAddress,\n type ContractCallAction,\n type TransactionIntent,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n Pair,\n buildV2AddLiquidityAction,\n buildV2AddLiquidityEthAction,\n buildV2FactoryFeeToRead,\n buildV2FactoryPairRead,\n buildV2LpApproveAction,\n buildV2PairAllowanceRead,\n buildV2PairBalanceRead,\n buildV2PairKLastRead,\n buildV2PairReservesRead,\n buildV2PairTotalSupplyRead,\n buildV2RemoveLiquidityAction,\n buildV2RemoveLiquidityEthAction,\n computeV2PairAddress,\n getV2AddLiquidityMinimums,\n getV2RemoveLiquidityMinimums,\n normalizeV2ReserveResult,\n quoteV2LiquidityAmount,\n} from '@sun-protocol/sun-sdk-sunswap-v2'\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 {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport {\n evmHexToTronAddress,\n normalizeLiquidityPercentage,\n normalizeProtocolToken,\n type ProtocolToken,\n} from '../internal/tokens.js'\nimport { attachApprovalIntent } from '../internal/intents.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V2AddLiquidityInput,\n V2RemoveLiquidityInput,\n} from './types.js'\nimport {\n liquidityIntentScope,\n SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID,\n} from './intents.js'\n\nconst DEFAULT_SLIPPAGE = '0.5%'\n\ninterface V2PairContext {\n readonly tokenA: ProtocolToken\n readonly tokenB: ProtocolToken\n readonly tokenAContract: TronAddress\n readonly tokenBContract: TronAddress\n readonly pair: TronAddress\n readonly tokenASortsBefore: boolean\n}\n\ninterface V2PairReserves {\n readonly reserveA: string\n readonly reserveB: string\n}\n\nfunction parseContractInteger(value: unknown, label: string): string {\n const normalized = Array.isArray(value) && value.length === 1 ? value[0] : value\n if (\n normalized === null\n || normalized === undefined\n || (typeof normalized !== 'string'\n && typeof normalized !== 'number'\n && typeof normalized !== 'bigint'\n && typeof normalized !== 'object')\n ) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n }\n\n try {\n const text = normalized.toString()\n if (!/^\\d+$/.test(text)) throw new Error('not an unsigned integer')\n return BigInt(text).toString()\n } catch {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n }\n}\n\nfunction parseContractAddress(value: unknown, label: string): TronAddress {\n const normalized = Array.isArray(value) && value.length === 1 ? value[0] : value\n if (typeof normalized !== 'string') {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an address contract result`, { value })\n }\n\n try {\n return /^0x[0-9a-fA-F]{40}$/.test(normalized)\n ? evmHexToTronAddress(normalized, label)\n : assertTronAddress(normalized, label)\n } catch {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an address contract result`, { value })\n }\n}\n\nfunction createPairContext(\n context: ProtocolsContext,\n tokenAInput: string,\n tokenBInput: string,\n): V2PairContext {\n const tokenA = normalizeProtocolToken(context, tokenAInput, 'tokenA')\n const tokenB = normalizeProtocolToken(context, tokenBInput, 'tokenB')\n\n if (tokenA.token.equals(tokenB.token)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 liquidity tokens must be different', {\n tokenA: tokenAInput,\n tokenB: tokenBInput,\n })\n }\n\n return {\n tokenA,\n tokenB,\n tokenAContract: tokenA.kind === 'native' ? tokenA.wrappedContractAddress : tokenA.contractAddress,\n tokenBContract: tokenB.kind === 'native' ? tokenB.wrappedContractAddress : tokenB.contractAddress,\n pair: computeV2PairAddress({\n network: context.network,\n tokenA: tokenA.kind === 'native' ? tokenA.wrappedContractAddress : tokenA.contractAddress,\n tokenB: tokenB.kind === 'native' ? tokenB.wrappedContractAddress : tokenB.contractAddress,\n }),\n tokenASortsBefore: tokenA.token.sortsBefore(tokenB.token),\n }\n}\n\nfunction parsePairReserves(result: unknown, tokenASortsBefore: boolean): V2PairReserves {\n if (!Array.isArray(result) || result.length < 2) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 pair reserves result is malformed', { result })\n }\n\n let normalized: { readonly reserve0: string; readonly reserve1: string }\n try {\n normalized = normalizeV2ReserveResult(result)\n } catch {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 pair reserves result is malformed', { result })\n }\n\n const reserve0 = parseContractInteger(normalized.reserve0, 'reserve0')\n const reserve1 = parseContractInteger(normalized.reserve1, 'reserve1')\n return tokenASortsBefore\n ? { reserveA: reserve0, reserveB: reserve1 }\n : { reserveA: reserve1, reserveB: reserve0 }\n}\n\nfunction resolveAddAmounts(input: {\n readonly amountADesired: string\n readonly amountBDesired: string\n readonly reserves: V2PairReserves\n}): { readonly amountA: string; readonly amountB: string } {\n const reserveA = BigInt(input.reserves.reserveA)\n const reserveB = BigInt(input.reserves.reserveB)\n if (reserveA === 0n && reserveB === 0n) {\n return { amountA: input.amountADesired, amountB: input.amountBDesired }\n }\n if (reserveA === 0n || reserveB === 0n) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 pair has inconsistent zero reserves', {\n reserveA: input.reserves.reserveA,\n reserveB: input.reserves.reserveB,\n })\n }\n\n const amountBOptimal = quoteV2LiquidityAmount(\n input.amountADesired,\n input.reserves.reserveA,\n input.reserves.reserveB,\n )\n if (BigInt(amountBOptimal) <= BigInt(input.amountBDesired)) {\n return { amountA: input.amountADesired, amountB: amountBOptimal }\n }\n\n const amountAOptimal = quoteV2LiquidityAmount(\n input.amountBDesired,\n input.reserves.reserveB,\n input.reserves.reserveA,\n )\n if (BigInt(amountAOptimal) > BigInt(input.amountADesired)) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 pair reserve quote exceeds desired liquidity amounts', {\n amountADesired: input.amountADesired,\n amountBDesired: input.amountBDesired,\n amountAOptimal,\n amountBOptimal,\n })\n }\n return { amountA: amountAOptimal, amountB: input.amountBDesired }\n}\n\nfunction createPairEntity(pair: V2PairContext, reserves: V2PairReserves): Pair {\n return new Pair(\n CurrencyAmount.fromRawAmount(pair.tokenA.token, reserves.reserveA),\n CurrencyAmount.fromRawAmount(pair.tokenB.token, reserves.reserveB),\n )\n}\n\nfunction validateAddAmounts(\n pair: V2PairContext,\n reserves: V2PairReserves,\n amounts: { readonly amountA: string; readonly amountB: string },\n): void {\n if (BigInt(amounts.amountA) === 0n || BigInt(amounts.amountB) === 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 add liquidity amounts must remain positive after reserve optimization', {\n ...amounts,\n ...reserves,\n })\n }\n\n if (BigInt(reserves.reserveA) !== 0n || BigInt(reserves.reserveB) !== 0n) return\n const pairEntity = createPairEntity(pair, reserves)\n try {\n pairEntity.getLiquidityMinted(\n CurrencyAmount.fromRawAmount(pairEntity.liquidityToken, '0'),\n CurrencyAmount.fromRawAmount(pair.tokenA.token, amounts.amountA),\n CurrencyAmount.fromRawAmount(pair.tokenB.token, amounts.amountB),\n )\n } catch {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Initial V2 liquidity is too small to exceed MINIMUM_LIQUIDITY', {\n ...amounts,\n })\n }\n}\n\nasync function planTokenApproval(input: {\n readonly context: ProtocolsContext\n readonly owner: TronAddress\n readonly token: ProtocolToken\n readonly amount: string\n readonly mode: V2AddLiquidityInput['approval']\n readonly router: TronAddress\n}): Promise<readonly ContractCallAction[]> {\n if (input.token.kind === 'native') return []\n const approval = await planApproval(\n input.context,\n {\n asset: { type: 'token', token: input.token.contractAddress },\n owner: input.owner,\n spender: input.router,\n amount: input.amount,\n },\n { mode: input.mode ?? 'auto' },\n )\n return attachApprovalIntent(\n approval.actions,\n liquidityIntentScope(SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID, 'add-liquidity'),\n input.token.token.symbol ?? input.token.input,\n ) as readonly ContractCallAction[]\n}\n\nfunction buildAddAction(input: {\n readonly context: ProtocolsContext\n readonly planId: string\n readonly pair: V2PairContext\n readonly amountA: string\n readonly amountB: string\n readonly amountAMin: string\n readonly amountBMin: string\n readonly recipient: TronAddress\n readonly deadline: string\n readonly router: TronAddress\n readonly feeLimit?: number\n}): ContractCallAction {\n const options = {\n network: input.context.network,\n router: input.router,\n recipient: input.recipient,\n deadline: input.deadline,\n id: `${input.planId}-tx`,\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n }\n const action = input.pair.tokenA.kind === 'native'\n ? buildV2AddLiquidityEthAction({\n ...options,\n token: input.pair.tokenB.token,\n amountTokenDesired: input.amountB,\n amountEthDesired: input.amountA,\n amountTokenMin: input.amountBMin,\n amountEthMin: input.amountAMin,\n })\n : input.pair.tokenB.kind === 'native'\n ? buildV2AddLiquidityEthAction({\n ...options,\n token: input.pair.tokenA.token,\n amountTokenDesired: input.amountA,\n amountEthDesired: input.amountB,\n amountTokenMin: input.amountAMin,\n amountEthMin: input.amountBMin,\n })\n : buildV2AddLiquidityAction({\n ...options,\n tokenA: input.pair.tokenA.token,\n tokenB: input.pair.tokenB.token,\n amountADesired: input.amountA,\n amountBDesired: input.amountB,\n amountAMin: input.amountAMin,\n amountBMin: input.amountBMin,\n })\n const intent: TransactionIntent = {\n kind: 'add-liquidity',\n scope: liquidityIntentScope(SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID, 'add-liquidity'),\n }\n return {\n ...action,\n intent,\n }\n}\n\nfunction buildRemoveAction(input: {\n readonly context: ProtocolsContext\n readonly planId: string\n readonly pair: V2PairContext\n readonly liquidity: string\n readonly amountAMin: string\n readonly amountBMin: string\n readonly recipient: TronAddress\n readonly deadline: string\n readonly router: TronAddress\n readonly feeLimit?: number\n}): ContractCallAction {\n const options = {\n network: input.context.network,\n router: input.router,\n liquidity: input.liquidity,\n recipient: input.recipient,\n deadline: input.deadline,\n id: `${input.planId}-tx`,\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n }\n let action: ContractCallAction\n if (input.pair.tokenA.kind === 'native') {\n action = buildV2RemoveLiquidityEthAction({\n ...options,\n token: input.pair.tokenB.token,\n amountTokenMin: input.amountBMin,\n amountEthMin: input.amountAMin,\n })\n } else if (input.pair.tokenB.kind === 'native') {\n action = buildV2RemoveLiquidityEthAction({\n ...options,\n token: input.pair.tokenA.token,\n amountTokenMin: input.amountAMin,\n amountEthMin: input.amountBMin,\n })\n } else {\n action = buildV2RemoveLiquidityAction({\n ...options,\n tokenA: input.pair.tokenA.token,\n tokenB: input.pair.tokenB.token,\n amountAMin: input.amountAMin,\n amountBMin: input.amountBMin,\n })\n }\n return {\n ...action,\n intent: {\n kind: 'remove-liquidity',\n scope: liquidityIntentScope(SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID, 'remove-liquidity'),\n },\n }\n}\n\nfunction resolveRemoveLiquidity(input: V2RemoveLiquidityInput, balance: string): string {\n const hasLiquidity = input.liquidity !== undefined\n const hasPercentage = input.percentage !== undefined\n if (hasLiquidity === hasPercentage) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 remove requires exactly one of liquidity or percentage')\n }\n\n const liquidity = hasLiquidity\n ? BigInt(normalizeBaseUnitAmount(input.liquidity, 'liquidity'))\n : (() => {\n const percentage = normalizeLiquidityPercentage(input.percentage, 'percentage')\n const numerator = BigInt(percentage.numerator.toString())\n const denominator = BigInt(percentage.denominator.toString())\n const result = (BigInt(balance) * numerator) / denominator\n if (result <= 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'percentage resolves to zero liquidity', {\n balance,\n percentage: percentage.toSignificant(),\n })\n }\n return result\n })()\n\n if (liquidity > BigInt(balance)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'liquidity cannot exceed wallet LP balance', {\n liquidity: liquidity.toString(),\n balance,\n })\n }\n return liquidity.toString()\n}\n\nexport async function planV2AddLiquidity(\n context: ProtocolsContext,\n input: V2AddLiquidityInput,\n): Promise<TransactionPlan> {\n const router = resolveProtocolContract(context, input.contracts, 'sunswapV2Router')\n const planId = nextPlanId(context, 'liquidity-v2-add')\n const owner = await requireWalletAddress(context, 'V2 add liquidity')\n const recipient = await normalizeRecipient(context, input.recipient, 'V2 add liquidity', owner)\n const deadline = normalizeDeadline(context, input)\n const slippageInput = input.slippage ?? DEFAULT_SLIPPAGE\n const slippage = parseSlippage(slippageInput)\n const pair = createPairContext(context, input.tokenA, input.tokenB)\n const amountADesired = normalizeBaseUnitAmount(input.amountADesired, 'amountADesired')\n const amountBDesired = normalizeBaseUnitAmount(input.amountBDesired, 'amountBDesired')\n const deployedPair = parseContractAddress(await readRequiredContract<unknown>(\n context,\n buildV2FactoryPairRead({\n network: context.network,\n tokenA: pair.tokenAContract,\n tokenB: pair.tokenBContract,\n }),\n 'V2 add liquidity pair lookup',\n ), 'V2 factory pair')\n if (deployedPair !== TRON_ZERO_ADDRESS && deployedPair !== pair.pair) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 factory pair does not match the configured CREATE2 pair', {\n factoryPair: deployedPair,\n computedPair: pair.pair,\n })\n }\n const reserves = deployedPair === TRON_ZERO_ADDRESS\n ? { reserveA: '0', reserveB: '0' }\n : parsePairReserves(await readRequiredContract<unknown>(\n context,\n buildV2PairReservesRead(pair.pair),\n 'V2 add liquidity reserves',\n ), pair.tokenASortsBefore)\n const amounts = resolveAddAmounts({ amountADesired, amountBDesired, reserves })\n validateAddAmounts(pair, reserves, amounts)\n const slippageMinimums = getV2AddLiquidityMinimums(amounts, slippage)\n const minimums = {\n amountAMin: input.amountAMin === undefined\n ? slippageMinimums.amountAMin\n : normalizeBaseUnitAmount(input.amountAMin, 'amountAMin', { allowZero: true }),\n amountBMin: input.amountBMin === undefined\n ? slippageMinimums.amountBMin\n : normalizeBaseUnitAmount(input.amountBMin, 'amountBMin', { allowZero: true }),\n }\n const approvals = [\n ...await planTokenApproval({ context, owner, token: pair.tokenA, amount: amounts.amountA, mode: input.approval, router }),\n ...await planTokenApproval({ context, owner, token: pair.tokenB, amount: amounts.amountB, mode: input.approval, router }),\n ]\n const transaction = buildAddAction({\n context,\n planId,\n pair,\n amountA: amounts.amountA,\n amountB: amounts.amountB,\n amountAMin: minimums.amountAMin,\n amountBMin: minimums.amountBMin,\n recipient,\n deadline,\n router,\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n })\n\n return {\n id: planId,\n kind: 'liquidity',\n network: context.network,\n owner,\n summary: {\n title: 'Add SunSwap V2 liquidity',\n lines: [`Pair ${pair.pair}`, `Recipient ${recipient}`],\n },\n approvals,\n transactions: [transaction],\n metadata: {\n protocol: 'sunswap-v2',\n operation: 'add-liquidity',\n pair: pair.pair,\n tokenA: input.tokenA,\n tokenB: input.tokenB,\n amountADesired,\n amountBDesired,\n amountA: amounts.amountA,\n amountB: amounts.amountB,\n amountAMin: minimums.amountAMin,\n amountBMin: minimums.amountBMin,\n owner,\n recipient,\n deadline,\n slippageBips: slippageToBips(slippageInput),\n approvalMode: input.approval ?? 'auto',\n },\n }\n}\n\nexport async function planV2RemoveLiquidity(\n context: ProtocolsContext,\n input: V2RemoveLiquidityInput,\n): Promise<TransactionPlan> {\n const router = resolveProtocolContract(context, input.contracts, 'sunswapV2Router')\n const planId = nextPlanId(context, 'liquidity-v2-remove')\n const owner = await requireWalletAddress(context, 'V2 remove liquidity')\n const recipient = await normalizeRecipient(context, input.recipient, 'V2 remove liquidity', owner)\n const deadline = normalizeDeadline(context, input)\n const slippageInput = input.slippage ?? DEFAULT_SLIPPAGE\n const slippage = parseSlippage(slippageInput)\n const approvalMode = input.approval ?? 'auto'\n if (approvalMode === 'permit2') {\n throw new SDKError('SDK_WALLET_CAPABILITY_ERROR', 'Permit2 cannot authorize a SunSwap V2 LP token', {\n approvalMode,\n })\n }\n\n const pair = createPairContext(context, input.tokenA, input.tokenB)\n const [reservesResult, totalSupplyResult, balanceResult, feeToResult, kLastResult] = await readMulticallRequired<unknown>(\n context,\n [\n buildV2PairReservesRead(pair.pair),\n buildV2PairTotalSupplyRead(pair.pair),\n buildV2PairBalanceRead(pair.pair, owner),\n buildV2FactoryFeeToRead({ network: context.network }),\n buildV2PairKLastRead(pair.pair),\n ],\n 'V2 remove liquidity state',\n )\n const reserves = parsePairReserves(reservesResult, pair.tokenASortsBefore)\n const totalSupply = parseContractInteger(totalSupplyResult, 'totalSupply')\n const balance = parseContractInteger(balanceResult, 'LP balance')\n const feeTo = parseContractAddress(feeToResult, 'V2 factory feeTo')\n const kLast = parseContractInteger(kLastResult, 'kLast')\n const feeOn = feeTo !== TRON_ZERO_ADDRESS\n if (BigInt(totalSupply) === 0n) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 pair total supply must be positive', {\n pair: pair.pair,\n totalSupply,\n })\n }\n if (BigInt(reserves.reserveA) === 0n || BigInt(reserves.reserveB) === 0n) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 pair reserves must be positive for removal', {\n pair: pair.pair,\n reserveA: reserves.reserveA,\n reserveB: reserves.reserveB,\n })\n }\n\n const liquidity = resolveRemoveLiquidity(input, balance)\n if (BigInt(liquidity) > BigInt(totalSupply)) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 LP balance exceeds pair total supply', {\n liquidity,\n totalSupply,\n })\n }\n const pairEntity = createPairEntity(pair, reserves)\n const totalSupplyAmount = CurrencyAmount.fromRawAmount(pairEntity.liquidityToken, totalSupply)\n const liquidityAmount = CurrencyAmount.fromRawAmount(pairEntity.liquidityToken, liquidity)\n const amountA = pairEntity.getLiquidityValue(\n pair.tokenA.token,\n totalSupplyAmount,\n liquidityAmount,\n feeOn,\n kLast,\n ).quotient.toString()\n const amountB = pairEntity.getLiquidityValue(\n pair.tokenB.token,\n totalSupplyAmount,\n liquidityAmount,\n feeOn,\n kLast,\n ).quotient.toString()\n if (BigInt(amountA) === 0n || BigInt(amountB) === 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 remove liquidity resolves to a zero token amount', {\n liquidity,\n amountA,\n amountB,\n })\n }\n const minimums = getV2RemoveLiquidityMinimums({ amountA, amountB }, slippage)\n const approvals: ContractCallAction[] = []\n if (approvalMode !== 'none') {\n const allowance = parseContractInteger(\n await readRequiredContract<unknown>(\n context,\n buildV2PairAllowanceRead(pair.pair, owner, router),\n 'V2 LP allowance',\n ),\n 'LP allowance',\n )\n if (BigInt(allowance) < BigInt(liquidity)) {\n approvals.push({\n ...buildV2LpApproveAction({\n pair: pair.pair,\n spender: router,\n amount: liquidity,\n id: `${planId}-approve`,\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n }),\n intent: {\n kind: 'approve',\n scope: liquidityIntentScope(SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID, 'remove-liquidity'),\n tokenSymbol: 'LP',\n },\n })\n }\n }\n\n const transaction = buildRemoveAction({\n context,\n planId,\n pair,\n liquidity,\n amountAMin: minimums.amountAMin,\n amountBMin: minimums.amountBMin,\n recipient,\n deadline,\n router,\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n })\n\n return {\n id: planId,\n kind: 'liquidity',\n network: context.network,\n owner,\n summary: {\n title: 'Remove SunSwap V2 liquidity',\n lines: [`Pair ${pair.pair}`, `LP liquidity ${liquidity}`, `Recipient ${recipient}`],\n },\n approvals,\n transactions: [transaction],\n metadata: {\n protocol: 'sunswap-v2',\n operation: 'remove-liquidity',\n pair: pair.pair,\n tokenA: input.tokenA,\n tokenB: input.tokenB,\n liquidity,\n amountA,\n amountB,\n amountAMin: minimums.amountAMin,\n amountBMin: minimums.amountBMin,\n owner,\n recipient,\n deadline,\n slippageBips: slippageToBips(slippageInput),\n approvalMode,\n feeOn,\n feeTo,\n kLast,\n },\n }\n}\n\nexport class V2LiquidityClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n readonly add = {\n plan: (input: V2AddLiquidityInput): Promise<TransactionPlan> => planV2AddLiquidity(this.context, input),\n execute: async (input: V2AddLiquidityInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await planV2AddLiquidity(this.context, input), createContextExecutor(this.context)),\n }\n\n readonly remove = {\n plan: (input: V2RemoveLiquidityInput): Promise<TransactionPlan> => planV2RemoveLiquidity(this.context, input),\n execute: async (input: V2RemoveLiquidityInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await planV2RemoveLiquidity(this.context, input), createContextExecutor(this.context)),\n }\n}\n\nexport function createV2LiquidityClient(context: ProtocolsContext): V2LiquidityClient {\n return new V2LiquidityClient(context)\n}\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\nimport { normalizeBaseUnitAmount } from '../common.js'\nimport {\n requireRuntime,\n type ProtocolsContext,\n} from '../context.js'\nimport { checkClassicAllowance } from './check.js'\nimport { buildClassicApproveAction } from './classic.js'\nimport type {\n ApprovalPlanOptions,\n ApprovalPlanResult,\n ApprovalRequirement,\n} from './types.js'\n\n/** Plans a token approval without signing or broadcasting it. */\nexport async function planApproval(\n context: ProtocolsContext,\n requirement: ApprovalRequirement,\n options: ApprovalPlanOptions = {},\n): Promise<ApprovalPlanResult> {\n const mode = options.mode ?? 'auto'\n normalizeBaseUnitAmount(requirement.amount, 'approval amount')\n\n if (requirement.asset.type === 'native') {\n return {\n mode,\n requirement,\n allowance: requirement.amount,\n sufficient: true,\n actions: [],\n }\n }\n\n if (mode === 'none') {\n return { mode, requirement, actions: [] }\n }\n\n if (mode === 'permit2') {\n throw new SDKError(\n 'SDK_WALLET_CAPABILITY_ERROR',\n 'Permit2 approval is unavailable until a Permit2 adapter is configured',\n { mode, token: requirement.asset.token },\n )\n }\n\n const runtime = requireRuntime(context, 'Token allowance check')\n const check = await checkClassicAllowance(runtime, requirement)\n if (check.sufficient) {\n return {\n mode,\n requirement,\n allowance: check.allowance,\n sufficient: true,\n actions: [],\n }\n }\n\n const action = buildClassicApproveAction(requirement, options)\n return {\n mode,\n requirement,\n allowance: check.allowance,\n sufficient: false,\n actions: action ? [action] : [],\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 type { Runtime } from '@sun-protocol/sun-sdk-runtime'\nimport type { ApprovalRequirement } from './types.js'\n\nexport async function readClassicAllowance(\n runtime: Runtime,\n requirement: ApprovalRequirement,\n): Promise<string> {\n if (requirement.asset.type === 'native') return '0'\n const result = await runtime.readContract<string | number | bigint>({\n target: requirement.asset.token,\n functionSelector: 'allowance(address,address)',\n parameters: [\n { type: 'address', value: requirement.owner },\n { type: 'address', value: requirement.spender },\n ],\n outputs: [{ type: 'uint256', name: 'allowance' }],\n })\n return BigInt(result).toString()\n}\n\nexport async function checkClassicAllowance(\n runtime: Runtime,\n requirement: ApprovalRequirement,\n): Promise<{ allowance: string; sufficient: boolean }> {\n if (requirement.asset.type === 'native') {\n return { allowance: requirement.amount, sufficient: true }\n }\n const allowance = await readClassicAllowance(runtime, requirement)\n return {\n allowance,\n sufficient: BigInt(allowance) >= BigInt(requirement.amount),\n }\n}\n","import {\n MaxUint256,\n createApproveAction,\n type ContractCallAction,\n} from '@sun-protocol/sun-sdk-core'\nimport type {\n ApprovalPlanOptions,\n ApprovalRequirement,\n} from './types.js'\n\nexport function buildClassicApproveAction(\n requirement: ApprovalRequirement,\n options: Pick<ApprovalPlanOptions, 'amount' | 'feeLimit'> = {},\n): ContractCallAction | undefined {\n if (requirement.asset.type === 'native') return undefined\n return createApproveAction({\n id: `approve-${requirement.asset.token}-${requirement.spender}`,\n target: requirement.asset.token,\n spender: requirement.spender,\n amount: options.amount === 'exact'\n ? requirement.amount\n : MaxUint256.toString(),\n ...(options.feeLimit !== undefined ? { feeLimit: options.feeLimit } : {}),\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 } 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 { 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 type {\n TransactionAction,\n TransactionIntent,\n TransactionIntentScope,\n} from '@sun-protocol/sun-sdk-core'\n\nexport function attachApprovalIntent(\n actions: readonly TransactionAction[],\n scope: TransactionIntentScope,\n tokenSymbol: string,\n): readonly TransactionAction[] {\n const intent: TransactionIntent = { kind: 'approve', scope, tokenSymbol }\n return actions.map((action) => action.execute === 'runtime'\n ? { ...action, intent }\n : action)\n}\n","import type { TransactionIntentScope } from '@sun-protocol/sun-sdk-core'\n\nexport const SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID = 'sunswap-v2'\nexport const SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID = 'sunswap-v3'\nexport const SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID = 'sunswap-v4'\n\nexport function liquidityIntentScope(\n protocol: string,\n operation: string,\n): TransactionIntentScope<'liquidity'> {\n return { domain: 'liquidity', protocol, operation }\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 {\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 TRON_ZERO_ADDRESS,\n assertTronAddress,\n type BigintIsh,\n type ContractCallAction,\n type TransactionIntentScope,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { TickMath } from '@sun-protocol/sun-sdk-sunswap-v3'\nimport {\n assertV4PoolId,\n buildV4IncreaseLiquidityAction,\n buildV4HookRegistrationBitmapRead,\n buildV4InitializePoolAction,\n buildV4MintPositionAction,\n buildV4MulticallAction,\n buildV4PoolAndPositionInfoRead,\n buildV4PoolSlot0Read,\n buildV4PoolStateReads,\n computeV4PoolId,\n createV4PoolKey,\n decodeV4HooksRegistration,\n encodeV4PoolParameters,\n encodeV4ContractCallAction,\n encodeV4Permit2ForwardCall,\n type V4PoolKey,\n type V4TokenRequirement,\n} from '@sun-protocol/sun-sdk-sunswap-v4'\nimport { planRouterPermit2Authorization } from '../approval/permit2.js'\nimport {\n createContextExecutor,\n requireWalletAddress,\n requireWalletSnapshot,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport {\n applySlippageMax,\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n slippageToBips,\n} from '../common.js'\nimport { executeTransactionPlan } from '../execute-plan.js'\nimport {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport { attachApprovalIntent } from '../internal/intents.js'\nimport { evmHexToTronAddress, normalizeProtocolToken } from '../internal/tokens.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V4IncreaseLiquidityInput,\n V4InitializePoolInput,\n V4MintPositionInput,\n V4PoolReadInput,\n V4PoolSnapshot,\n} from './types.js'\nimport {\n liquidityIntentScope,\n SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID,\n} from './intents.js'\n\ninterface V4Slot0ObjectResult {\n readonly sqrtPriceX96?: unknown\n readonly tick?: unknown\n}\n\ninterface V4PositionInfoObjectResult {\n readonly poolKey?: unknown\n readonly tickLower?: unknown\n readonly tickUpper?: unknown\n}\n\ninterface V4PoolKeySource {\n readonly poolKey?: V4PoolKey\n readonly token0?: string\n readonly token1?: string\n readonly fee?: number\n readonly tickSpacing?: number\n readonly hooks?: TronAddress | string\n readonly dynamicFee?: boolean\n readonly hooksRegistration?: number\n}\n\ninterface V4PoolKeyResolution {\n readonly poolKey: V4PoolKey\n readonly derived: boolean\n readonly amountsSwapped: boolean\n}\n\ninterface V4AmountSource {\n readonly liquidity?: BigintIsh\n readonly amount0Max?: BigintIsh\n readonly amount1Max?: BigintIsh\n readonly amount0?: BigintIsh\n readonly amount1?: BigintIsh\n readonly slippage?: V4MintPositionInput['slippage']\n readonly contracts?: V4MintPositionInput['contracts']\n readonly sqrtPriceX96?: BigintIsh\n readonly createPool?: boolean\n readonly roundingMode?: V4MintPositionInput['roundingMode']\n readonly poolInitializationMode?: V4MintPositionInput['poolInitializationMode']\n}\n\ninterface V4ResolvedLiquidityAmounts {\n readonly liquidity: string\n readonly amount0Max: string\n readonly amount1Max: string\n readonly amount0Desired: string\n readonly amount1Desired: string\n readonly derived: boolean\n}\n\ninterface V4PoolInitializationResolution {\n readonly shouldInitialize: boolean\n readonly sqrtPriceX96?: string\n}\n\ninterface V4PositionContext {\n readonly poolKey: V4PoolKey\n readonly tickLower: number\n readonly tickUpper: number\n}\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 signed24(value: bigint): number {\n const masked = value & 0xffffffn\n return Number((masked & 0x800000n) === 0n ? masked : masked - 0x1000000n)\n}\n\nfunction parsePackedPositionTicks(value: unknown): { tickLower: number; tickUpper: number } {\n const info = BigInt(String(unwrapSingle(value)))\n return {\n tickLower: signed24(info >> 8n),\n tickUpper: signed24(info >> 32n),\n }\n}\n\nfunction parseV4Address(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 parsePositionPoolKey(\n value: unknown,\n network: ProtocolsContext['network'],\n): V4PoolKey {\n if (Array.isArray(value) && value.length >= 5) {\n return createV4PoolKey({\n network,\n currencyA: parseV4Address(value[0], 'poolKey.currency0'),\n currencyB: parseV4Address(value[1], 'poolKey.currency1'),\n hooks: parseV4Address(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 (\n key.currency0 !== undefined &&\n key.currency1 !== undefined &&\n key.hooks !== undefined &&\n key.fee !== undefined &&\n key.parameters !== undefined\n ) {\n return createV4PoolKey({\n network,\n currencyA: parseV4Address(key.currency0, 'poolKey.currency0'),\n currencyB: parseV4Address(key.currency1, 'poolKey.currency1'),\n hooks: parseV4Address(key.hooks, 'poolKey.hooks'),\n fee: parseNumber(key.fee, 'poolKey.fee'),\n parameters: String(key.parameters),\n })\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position context is missing poolKey', { value })\n}\n\nfunction parseSlot0(result: unknown): { sqrtPriceX96: string; tick: number } {\n if (Array.isArray(result)) {\n return {\n sqrtPriceX96: parseString(result[0], 'sqrtPriceX96'),\n tick: parseNumber(result[1], 'tick'),\n }\n }\n if (typeof result === 'object' && result !== null) {\n const slot0 = result as V4Slot0ObjectResult\n return {\n sqrtPriceX96: parseString(slot0.sqrtPriceX96, 'sqrtPriceX96'),\n tick: parseNumber(slot0.tick, 'tick'),\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 slot0 result is malformed', { result })\n}\n\nasync function resolveV4PoolKey(context: ProtocolsContext, input: V4PoolKeySource): Promise<V4PoolKeyResolution> {\n if (input.poolKey !== undefined) {\n return { poolKey: input.poolKey, derived: false, amountsSwapped: false }\n }\n if (\n input.token0 === undefined\n || input.token1 === undefined\n || input.fee === undefined\n || input.tickSpacing === undefined\n ) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V4 poolKey or complete token pool inputs are required')\n }\n\n const token0 = normalizeProtocolToken(context, input.token0, 'token0').contractAddress\n const token1 = normalizeProtocolToken(context, input.token1, 'token1').contractAddress\n const hooks = assertTronAddress(input.hooks ?? TRON_ZERO_ADDRESS, 'hooks')\n if (input.dynamicFee && hooks === TRON_ZERO_ADDRESS) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Dynamic V4 fees require a non-zero hooks contract')\n }\n const hooksRegistration = input.hooksRegistration ?? (hooks === TRON_ZERO_ADDRESS\n ? 0\n : parseNumber(\n unwrapSingle(await readRequiredContract<unknown>(\n context,\n buildV4HookRegistrationBitmapRead({ network: context.network, hooks }),\n 'V4 hook registration read',\n )),\n 'hooksRegistration',\n ))\n const poolKey = createV4PoolKey({\n network: context.network,\n currencyA: token0,\n currencyB: token1,\n hooks,\n fee: input.dynamicFee ? 0x800000 : input.fee,\n parameters: encodeV4PoolParameters({\n tickSpacing: input.tickSpacing,\n hooksRegistration: decodeV4HooksRegistration(hooksRegistration),\n }),\n })\n return {\n poolKey,\n derived: true,\n amountsSwapped: poolKey.currency0 !== token0,\n }\n}\n\nfunction parseV4PositionContext(\n result: unknown,\n network: ProtocolsContext['network'],\n): V4PositionContext {\n let poolKey: unknown\n let tickLower: unknown\n let tickUpper: unknown\n if (Array.isArray(result)) {\n poolKey = result[0]\n if (result[2] === undefined && result[1] !== undefined) {\n const ticks = parsePackedPositionTicks(result[1])\n tickLower = ticks.tickLower\n tickUpper = ticks.tickUpper\n } else {\n tickLower = result[1]\n tickUpper = result[2]\n }\n } else if (typeof result === 'object' && result !== null) {\n const info = result as V4PositionInfoObjectResult\n poolKey = info.poolKey\n tickLower = info.tickLower\n tickUpper = info.tickUpper\n } else {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position context result is malformed', { result })\n }\n return {\n poolKey: parsePositionPoolKey(poolKey, network),\n tickLower: parseNumber(tickLower, 'tickLower'),\n tickUpper: parseNumber(tickUpper, 'tickUpper'),\n }\n}\n\nfunction assertV4PoolKeyMatches(tokenId: string, supplied: V4PoolKey, position: V4PoolKey): void {\n const suppliedPoolId = computeV4PoolId(supplied)\n const positionPoolId = computeV4PoolId(position)\n if (suppliedPoolId !== positionPoolId) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V4 pool context does not match the tokenId position', {\n tokenId,\n suppliedPoolId,\n positionPoolId,\n })\n }\n}\n\nasync function resolveV4PositionContext(\n context: ProtocolsContext,\n tokenId: string,\n contracts: V4IncreaseLiquidityInput['contracts'],\n): Promise<V4PositionContext> {\n const result = await readRequiredContract<unknown>(\n context,\n buildV4PoolAndPositionInfoRead({\n network: context.network,\n tokenId,\n positionManager: resolveProtocolContract(context, contracts, 'sunswapV4PositionManager'),\n }),\n 'V4 position context read',\n )\n return parseV4PositionContext(result, context.network)\n}\n\nasync function shouldInitializeV4Pool(\n context: ProtocolsContext,\n poolKey: V4PoolKey,\n input: V4AmountSource,\n): Promise<V4PoolInitializationResolution> {\n if (!input.createPool) return { shouldInitialize: false }\n if (input.poolInitializationMode === 'trust-input') return { shouldInitialize: true }\n try {\n const slot0Result = await readRequiredContract<unknown>(\n context,\n buildV4PoolSlot0Read({\n network: context.network,\n poolId: computeV4PoolId(poolKey),\n poolManager: resolveProtocolContract(context, input.contracts, 'sunswapV4PoolManager'),\n }),\n 'V4 pool initialization check',\n )\n const sqrtPriceX96 = parseSlot0(slot0Result).sqrtPriceX96\n return BigInt(sqrtPriceX96) === 0n\n ? { shouldInitialize: true }\n : { shouldInitialize: false, sqrtPriceX96 }\n } catch {\n return { shouldInitialize: true }\n }\n}\n\nfunction maxV4LiquidityForAmounts(input: {\n readonly sqrtPriceX96: string\n readonly tickLower: number\n readonly tickUpper: number\n readonly amount0: string\n readonly amount1: string\n}): string {\n const sqrtPrice = BigInt(input.sqrtPriceX96)\n let sqrtA = BigInt(TickMath.getSqrtRatioAtTick(input.tickLower).toString())\n let sqrtB = BigInt(TickMath.getSqrtRatioAtTick(input.tickUpper).toString())\n if (sqrtA > sqrtB) [sqrtA, sqrtB] = [sqrtB, sqrtA]\n const amount0 = BigInt(input.amount0)\n const amount1 = BigInt(input.amount1)\n const difference = sqrtB - sqrtA\n let liquidity: bigint\n if (sqrtPrice <= sqrtA) {\n liquidity = (amount0 * sqrtA * sqrtB) / (Q96 * difference)\n } else if (sqrtPrice < sqrtB) {\n const liquidity0 = (amount0 * sqrtPrice * sqrtB) / (Q96 * (sqrtB - sqrtPrice))\n const liquidity1 = (amount1 * Q96) / (sqrtPrice - sqrtA)\n liquidity = liquidity0 < liquidity1 ? liquidity0 : liquidity1\n } else {\n liquidity = (amount1 * Q96) / difference\n }\n return liquidity.toString()\n}\n\nasync function resolveV4SqrtPrice(\n context: ProtocolsContext,\n poolKey: V4PoolKey,\n input: V4AmountSource,\n): Promise<string> {\n if (input.createPool) {\n if (input.sqrtPriceX96 === undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'sqrtPriceX96 is required when createPool is true')\n }\n return normalizeBaseUnitAmount(input.sqrtPriceX96, 'sqrtPriceX96')\n }\n const slot0Result = await readRequiredContract<unknown>(\n context,\n buildV4PoolSlot0Read({\n network: context.network,\n poolId: computeV4PoolId(poolKey),\n poolManager: resolveProtocolContract(context, input.contracts, 'sunswapV4PoolManager'),\n }),\n 'V4 pool state read',\n )\n return parseSlot0(slot0Result).sqrtPriceX96\n}\n\nasync function resolveV4LiquidityAmounts(\n context: ProtocolsContext,\n input: V4AmountSource & {\n readonly poolKey: V4PoolKey\n readonly tickLower: number\n readonly tickUpper: number\n readonly amountsSwapped: boolean\n },\n): Promise<V4ResolvedLiquidityAmounts> {\n const hasResolvedAmount = input.liquidity !== undefined\n || input.amount0Max !== undefined\n || input.amount1Max !== undefined\n if (hasResolvedAmount) {\n if (input.liquidity === undefined || input.amount0Max === undefined || input.amount1Max === undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'liquidity, amount0Max, and amount1Max must be provided together')\n }\n return {\n liquidity: normalizeBaseUnitAmount(input.liquidity, 'liquidity'),\n amount0Max: normalizeBaseUnitAmount(input.amount0Max, 'amount0Max', { allowZero: true }),\n amount1Max: normalizeBaseUnitAmount(input.amount1Max, 'amount1Max', { allowZero: true }),\n amount0Desired: normalizeBaseUnitAmount(input.amount0Max, 'amount0Max', { allowZero: true }),\n amount1Desired: normalizeBaseUnitAmount(input.amount1Max, 'amount1Max', { allowZero: true }),\n derived: false,\n }\n }\n if (input.amount0 === undefined && input.amount1 === undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V4 liquidity requires at least one of amount0 or amount1')\n }\n if (input.tickLower >= input.tickUpper) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'tickLower must be less than tickUpper', {\n tickLower: input.tickLower,\n tickUpper: input.tickUpper,\n })\n }\n\n const userAmount0 = normalizeBaseUnitAmount(input.amount0 ?? '0', 'amount0', { allowZero: true })\n const userAmount1 = normalizeBaseUnitAmount(input.amount1 ?? '0', 'amount1', { allowZero: true })\n const amount0 = input.amountsSwapped ? userAmount1 : userAmount0\n const amount1 = input.amountsSwapped ? userAmount0 : userAmount1\n const liquidity = maxV4LiquidityForAmounts({\n sqrtPriceX96: await resolveV4SqrtPrice(context, input.poolKey, input),\n tickLower: input.tickLower,\n tickUpper: input.tickUpper,\n amount0,\n amount1,\n })\n if (BigInt(liquidity) <= 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V4 amount inputs resolve to zero liquidity', {\n amount0,\n amount1,\n tickLower: input.tickLower,\n tickUpper: input.tickUpper,\n })\n }\n const slippageBips = slippageToBips(input.slippage ?? '0.5%')\n const halfUp = (amount: bigint, bips: number): string =>\n ((amount * BigInt(10_000 + bips) + 5_000n) / 10_000n).toString()\n return {\n liquidity,\n amount0Max: input.roundingMode === 'half-up'\n ? halfUp(BigInt(amount0), slippageBips)\n : applySlippageMax(BigInt(amount0), slippageBips).toString(),\n amount1Max: input.roundingMode === 'half-up'\n ? halfUp(BigInt(amount1), slippageBips)\n : applySlippageMax(BigInt(amount1), slippageBips).toString(),\n amount0Desired: amount0,\n amount1Desired: amount1,\n derived: true,\n }\n}\n\nfunction nativeCallValue(\n poolKey: V4PoolKey,\n amounts: V4ResolvedLiquidityAmounts,\n mode: V4MintPositionInput['nativeCallValueMode'],\n): bigint | undefined {\n if (mode !== 'desired') return undefined\n let value = 0n\n if (poolKey.currency0 === TRON_ZERO_ADDRESS) value += BigInt(amounts.amount0Desired)\n if (poolKey.currency1 === TRON_ZERO_ADDRESS) value += BigInt(amounts.amount1Desired)\n return value\n}\n\nfunction planMetadata(input: {\n readonly operation: string\n readonly poolId?: string\n readonly tokenId?: string\n readonly owner?: string\n readonly sweepRecipient?: string\n readonly deadline?: string\n readonly poolKeyDerived?: boolean\n readonly amountsDerived?: boolean\n readonly createPool?: boolean\n}): Record<string, unknown> {\n return {\n protocol: 'sunswap-v4',\n operation: input.operation,\n ...(input.poolId !== undefined ? { poolId: input.poolId } : {}),\n ...(input.tokenId !== undefined ? { tokenId: input.tokenId } : {}),\n ...(input.owner !== undefined ? { owner: input.owner } : {}),\n ...(input.sweepRecipient !== undefined ? { sweepRecipient: input.sweepRecipient } : {}),\n ...(input.deadline !== undefined ? { deadline: input.deadline } : {}),\n ...(input.poolKeyDerived !== undefined ? { poolKeyDerived: input.poolKeyDerived } : {}),\n ...(input.amountsDerived !== undefined ? { amountsDerived: input.amountsDerived } : {}),\n ...(input.createPool !== undefined ? { createPool: input.createPool } : {}),\n }\n}\n\nasync function approvalsFromV4Action(\n context: ProtocolsContext,\n action: ContractCallAction,\n owner: TronAddress,\n mode: V4MintPositionInput['approval'],\n scope: TransactionIntentScope<'liquidity'>,\n): Promise<readonly ContractCallAction[]> {\n const requirements = (action.tokenRequirements ?? []) as readonly V4TokenRequirement[]\n const approvals: ContractCallAction[] = []\n\n for (const requirement of requirements) {\n if (BigInt(requirement.amount) === 0n) continue\n if (mode === 'none') continue\n\n const authorization = await planRouterPermit2Authorization(context, {\n owner,\n token: requirement.token,\n spender: requirement.spender,\n amount: requirement.amount,\n approval: 'approve',\n })\n for (const approval of authorization.actions) {\n if (approval.type !== 'approve' && approval.type !== 'contract-call') {\n throw new SDKError(\n 'SDK_RUNTIME_ERROR',\n 'V4 Permit2 authorization produced a non-contract action',\n { actionType: approval.type },\n )\n }\n approvals.push(...attachApprovalIntent(\n [approval],\n scope,\n requirement.token,\n ) as readonly ContractCallAction[])\n }\n }\n\n return approvals\n}\n\nexport class V4LiquidityClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n async read(input: V4PoolReadInput): Promise<V4PoolSnapshot> {\n const poolId = assertV4PoolId(input.poolId)\n const [slot0Result, liquidityResult] = await readMulticallRequired<unknown>(\n this.context,\n buildV4PoolStateReads({\n network: this.context.network,\n poolId,\n poolManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PoolManager'),\n }),\n 'V4 pool state read',\n )\n const slot0 = parseSlot0(slot0Result)\n return {\n protocol: 'sunswap-v4',\n poolId,\n sqrtPriceX96: slot0.sqrtPriceX96,\n tick: slot0.tick,\n liquidity: parseString(liquidityResult, 'liquidity'),\n }\n }\n\n readonly initialize = {\n plan: async (input: V4InitializePoolInput): Promise<TransactionPlan> => this.planInitialize(input),\n execute: async (input: V4InitializePoolInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planInitialize(input), createContextExecutor(this.context)),\n }\n\n readonly add = {\n plan: async (input: V4MintPositionInput): Promise<TransactionPlan> => this.planMint(input),\n execute: async (input: V4MintPositionInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planMint(input), createContextExecutor(this.context)),\n }\n\n readonly increase = {\n plan: async (input: V4IncreaseLiquidityInput): Promise<TransactionPlan> => this.planIncrease(input),\n execute: async (input: V4IncreaseLiquidityInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planIncrease(input), createContextExecutor(this.context)),\n }\n\n private async planInitialize(input: V4InitializePoolInput): Promise<TransactionPlan> {\n const { address: owner } = await requireWalletSnapshot(this.context, 'V4 initialize pool')\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'liquidity-v4-initialize')\n const poolKey = await resolveV4PoolKey(this.context, input)\n const action = buildV4InitializePoolAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n sqrtPriceX96: normalizeBaseUnitAmount(input.sqrtPriceX96, 'sqrtPriceX96'),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const poolId = computeV4PoolId(poolKey.poolKey)\n const transaction = {\n ...action,\n intent: {\n kind: 'create-pool' as const,\n scope: liquidityIntentScope(SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID, 'initialize-pool'),\n poolId,\n },\n }\n return {\n id: planId,\n kind: 'liquidity',\n network: this.context.network,\n owner,\n summary: {\n title: 'Initialize SunSwap V4 pool',\n lines: [`Pool ${poolId}`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: planMetadata({ operation: 'initialize-pool', poolId, poolKeyDerived: poolKey.derived }),\n }\n }\n\n private async planMint(input: V4MintPositionInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'liquidity-v4-mint')\n const { address: walletAddress } = await requireWalletSnapshot(this.context, 'V4 mint position')\n const owner = input.owner !== undefined ? assertTronAddress(input.owner, 'owner') : walletAddress\n if (owner !== walletAddress) {\n throw new SDKError('SDK_WALLET_ACCOUNT_MISMATCH', 'V4 mint owner does not match the connected wallet', {\n expectedAddress: owner,\n actualAddress: walletAddress,\n })\n }\n const deadline = normalizeDeadline(this.context, input)\n const poolKey = await resolveV4PoolKey(this.context, input)\n const initialization = await shouldInitializeV4Pool(this.context, poolKey.poolKey, input)\n const amounts = await resolveV4LiquidityAmounts(this.context, {\n ...input,\n poolKey: poolKey.poolKey,\n amountsSwapped: poolKey.amountsSwapped,\n ...(initialization.sqrtPriceX96 !== undefined ? { sqrtPriceX96: initialization.sqrtPriceX96 } : {}),\n ...(initialization.shouldInitialize ? { createPool: true } : { createPool: false }),\n })\n if (input.createPool && input.sqrtPriceX96 === undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'sqrtPriceX96 is required when createPool is true')\n }\n const hasNativeCurrency = poolKey.poolKey.currency0 === TRON_ZERO_ADDRESS\n || poolKey.poolKey.currency1 === TRON_ZERO_ADDRESS\n const sweepRecipient = hasNativeCurrency\n ? input.sweepRecipient !== undefined\n ? assertTronAddress(input.sweepRecipient, 'sweepRecipient')\n : owner\n : undefined\n const desiredNativeCallValue = nativeCallValue(poolKey.poolKey, amounts, input.nativeCallValueMode)\n const action = buildV4MintPositionAction({\n network: this.context.network,\n positionManager,\n positionConfig: { poolKey: poolKey.poolKey, tickLower: input.tickLower, tickUpper: input.tickUpper },\n liquidity: amounts.liquidity,\n amount0Max: amounts.amount0Max,\n amount1Max: amounts.amount1Max,\n owner,\n deadline,\n ...(desiredNativeCallValue !== undefined ? { callValue: desiredNativeCallValue } : {}),\n ...(sweepRecipient !== undefined ? { sweepRecipient } : {}),\n ...(input.hookData !== undefined ? { hookData: input.hookData } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const scope = liquidityIntentScope(\n SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID,\n initialization.shouldInitialize ? 'initialize-and-mint' : 'mint-position',\n )\n const approvals = await approvalsFromV4Action(this.context, action, owner, input.approval, scope)\n const poolId = computeV4PoolId(poolKey.poolKey)\n const initializeAction = initialization.shouldInitialize\n ? buildV4InitializePoolAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n sqrtPriceX96: normalizeBaseUnitAmount(input.sqrtPriceX96 as BigintIsh, 'sqrtPriceX96'),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-initialize`,\n })\n : undefined\n const calls = [\n ...(input.permit2Signatures ?? []).map(permit => encodeV4Permit2ForwardCall({ owner, permit })),\n ...(initializeAction ? [encodeV4ContractCallAction(initializeAction)] : []),\n encodeV4ContractCallAction(action),\n ]\n const transactionAction = initializeAction || input.transactionMode === 'multicall' || (input.permit2Signatures?.length ?? 0) > 0\n ? buildV4MulticallAction({\n network: this.context.network,\n positionManager,\n calls,\n ...(action.callValue !== undefined ? { callValue: action.callValue } : {}),\n ...(action.tokenRequirements !== undefined ? { tokenRequirements: action.tokenRequirements } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n : action\n const transaction = {\n ...transactionAction,\n waitForReceipt: 'included' as const,\n intent: {\n kind: 'add-liquidity' as const,\n scope,\n },\n }\n\n return {\n id: planId,\n kind: 'liquidity',\n network: this.context.network,\n owner,\n summary: {\n title: 'Mint SunSwap V4 position',\n lines: [`Pool ${poolId}`, `Owner ${owner}`],\n },\n approvals,\n transactions: [transaction],\n metadata: planMetadata({\n operation: 'mint-position',\n poolId,\n owner,\n ...(sweepRecipient !== undefined ? { sweepRecipient } : {}),\n deadline,\n poolKeyDerived: poolKey.derived,\n amountsDerived: amounts.derived,\n createPool: initialization.shouldInitialize,\n }),\n }\n }\n\n private async planIncrease(input: V4IncreaseLiquidityInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'liquidity-v4-increase')\n const owner = await requireWalletAddress(this.context, 'V4 increase liquidity')\n const deadline = normalizeDeadline(this.context, input)\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const poolKeyNeedsPosition = input.poolKey === undefined && input.token0 === undefined\n const position = await resolveV4PositionContext(this.context, tokenId, input.contracts)\n const poolKey = poolKeyNeedsPosition\n ? { poolKey: position.poolKey, derived: true, amountsSwapped: false }\n : await resolveV4PoolKey(this.context, input)\n assertV4PoolKeyMatches(tokenId, poolKey.poolKey, position.poolKey)\n const amounts = await resolveV4LiquidityAmounts(this.context, {\n ...input,\n poolKey: poolKey.poolKey,\n tickLower: position.tickLower,\n tickUpper: position.tickUpper,\n amountsSwapped: poolKey.amountsSwapped,\n })\n const hasNativeCurrency = poolKey.poolKey.currency0 === TRON_ZERO_ADDRESS\n || poolKey.poolKey.currency1 === TRON_ZERO_ADDRESS\n const sweepRecipient = hasNativeCurrency\n ? input.sweepRecipient !== undefined\n ? assertTronAddress(input.sweepRecipient, 'sweepRecipient')\n : owner\n : undefined\n const desiredNativeCallValue = nativeCallValue(poolKey.poolKey, amounts, input.nativeCallValueMode)\n const action = buildV4IncreaseLiquidityAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n tokenId,\n liquidity: amounts.liquidity,\n amount0Max: amounts.amount0Max,\n amount1Max: amounts.amount1Max,\n deadline,\n ...(desiredNativeCallValue !== undefined ? { callValue: desiredNativeCallValue } : {}),\n ...(sweepRecipient !== undefined ? { sweepRecipient } : {}),\n ...(input.hookData !== undefined ? { hookData: input.hookData } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const scope = liquidityIntentScope(SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID, 'increase-liquidity')\n const approvals = await approvalsFromV4Action(this.context, action, owner, input.approval, scope)\n const poolId = computeV4PoolId(poolKey.poolKey)\n const permitCalls = (input.permit2Signatures ?? []).map(permit => encodeV4Permit2ForwardCall({ owner, permit }))\n const transactionAction = input.transactionMode === 'multicall' || permitCalls.length > 0\n ? buildV4MulticallAction({\n network: this.context.network,\n positionManager,\n calls: [...permitCalls, encodeV4ContractCallAction(action)],\n ...(action.callValue !== undefined ? { callValue: action.callValue } : {}),\n ...(action.tokenRequirements !== undefined ? { tokenRequirements: action.tokenRequirements } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n : action\n const transaction = {\n ...transactionAction,\n waitForReceipt: 'included' as const,\n intent: {\n kind: 'add-liquidity' as const,\n scope,\n positionId: tokenId,\n },\n }\n\n return {\n id: planId,\n kind: 'liquidity',\n network: this.context.network,\n owner,\n summary: {\n title: 'Increase SunSwap V4 liquidity',\n lines: [`Position ${tokenId}`, `Pool ${poolId}`],\n },\n approvals,\n transactions: [transaction],\n metadata: planMetadata({\n operation: 'increase-liquidity',\n poolId,\n tokenId,\n owner,\n ...(sweepRecipient !== undefined ? { sweepRecipient } : {}),\n deadline,\n poolKeyDerived: poolKey.derived,\n amountsDerived: amounts.derived,\n }),\n }\n }\n}\n","import {\n SDKError,\n assertTronAddress,\n createTypedDataSignatureAction,\n type TransactionAction,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport type { WalletCapabilities } from '@sun-protocol/sun-sdk-runtime'\nimport { nextPlanId, normalizeDeadline } from '../common.js'\nimport { requireRuntime, type ProtocolsContext } from '../context.js'\nimport {\n buildPermit2AllowanceRead,\n buildPermit2HelperRead,\n buildPermit2ApproveAction,\n buildPermit2TypedData,\n normalizePermit2Allowance,\n normalizePermit2HelperResult,\n} from '../internal/permit2-adapter.js'\nimport type { ApprovalMode } from '../types/options.js'\nimport { planApproval } from './plan.js'\n\nexport interface RouterPermit2AuthorizationInput {\n readonly owner: TronAddress\n readonly token: TronAddress\n readonly spender?: TronAddress\n readonly amount: string\n readonly approval: ApprovalMode\n readonly ttlSeconds?: number\n readonly deadline?: string | number | bigint\n readonly walletCapabilities?: WalletCapabilities\n /** Shared allowance mode for the ERC20 and Permit2 approval steps. Defaults to the requested amount. */\n readonly approveAmountType?: 'exact' | 'max'\n}\n\nexport interface RouterPermit2AuthorizationPlan {\n readonly actions: readonly TransactionAction[]\n readonly signatureActionId?: string\n readonly permitSingle?: unknown\n readonly mode: 'none' | 'typed-data' | 'on-chain' | 'already-approved'\n}\n\nasync function hasTypedDataCapability(\n context: ProtocolsContext,\n capabilities: WalletCapabilities | undefined,\n): Promise<boolean> {\n if (capabilities) return capabilities.signTypedData\n return (await context.runtime?.getWallet())?.capabilities.signTypedData === true\n}\n\nfunction normalizePlanDeadlineValue(value: string | number | bigint): string | number {\n return typeof value === 'bigint' ? value.toString() : value\n}\n\nconst MAX_UINT160 = '1461501637330902918203684832716283019655932542975'\n\nexport async function planRouterPermit2Authorization(\n context: ProtocolsContext,\n input: RouterPermit2AuthorizationInput,\n): Promise<RouterPermit2AuthorizationPlan> {\n if (input.approval === 'none') {\n return { actions: [], mode: 'none' }\n }\n\n const helper = context.chain.contracts.permit2Helper\n if (!helper) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Permit2Helper is not configured for ${context.network}`, {\n network: context.network,\n contract: 'permit2Helper',\n })\n }\n const runtime = requireRuntime(context, 'Router Permit2 authorization')\n const actions: TransactionAction[] = []\n const token = assertTronAddress(input.token, 'token')\n const spender = input.spender\n ? assertTronAddress(input.spender, 'spender')\n : context.chain.contracts.universalRouter\n\n const tokenApproval = await planApproval(context, {\n asset: { type: 'token', token },\n owner: input.owner,\n spender: context.chain.contracts.permit2,\n amount: input.amount,\n }, {\n mode: 'auto',\n amount: input.approveAmountType ?? 'exact',\n })\n actions.push(...tokenApproval.actions)\n\n const approved = normalizePermit2HelperResult(await runtime.readContract(buildPermit2HelperRead({\n helper,\n permit2: context.chain.contracts.permit2,\n owner: input.owner,\n token,\n spender,\n amount: input.amount,\n })))\n const permit2Amount = input.approveAmountType === 'max'\n ? MAX_UINT160\n : input.amount\n\n if (approved) {\n return { actions, mode: 'already-approved' }\n }\n\n const expiration = normalizeDeadline(context, {\n ttlSeconds: input.ttlSeconds ?? 30 * 24 * 60 * 60,\n ...(input.deadline !== undefined\n ? { deadline: normalizePlanDeadlineValue(input.deadline) }\n : {}),\n }).toString()\n const sigDeadline = normalizeDeadline(context, { ttlSeconds: 3_600 }).toString()\n\n if (\n (input.approval === 'auto' || input.approval === 'permit2') &&\n await hasTypedDataCapability(context, input.walletCapabilities)\n ) {\n // Only signature construction needs the nonce; approval validity comes from the helper.\n const allowance = normalizePermit2Allowance(await runtime.readContract(buildPermit2AllowanceRead({\n permit2: context.chain.contracts.permit2,\n owner: input.owner,\n token,\n spender,\n })))\n const typedData = buildPermit2TypedData({\n network: context.network,\n permit2: context.chain.contracts.permit2,\n owner: input.owner,\n token,\n spender,\n amount: permit2Amount,\n expiration,\n sigDeadline,\n nonce: allowance.nonce.toString(),\n })\n const signatureActionId = `${nextPlanId(context, 'permit2')}-signature`\n actions.push(createTypedDataSignatureAction({\n id: signatureActionId,\n typedData,\n }))\n return {\n actions,\n signatureActionId,\n permitSingle: typedData.message,\n mode: 'typed-data',\n }\n }\n\n if (input.approval === 'permit2' || input.approval === 'auto' || input.approval === 'approve') {\n actions.push(buildPermit2ApproveAction({\n id: `${nextPlanId(context, 'permit2')}-approve`,\n permit2: context.chain.contracts.permit2,\n token,\n spender,\n amount: permit2Amount,\n expiration,\n }))\n return { actions, mode: 'on-chain' }\n }\n\n throw new SDKError(\n 'SDK_INVALID_ARGUMENT',\n 'Unsupported approval mode for Router Permit2 authorization',\n { approval: input.approval },\n )\n}\n","import {\n SDKError,\n createContractCallAction,\n type ContractCallAction,\n type Network,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport type { TypedDataPayload, ContractRead } from '@sun-protocol/sun-sdk-runtime'\nimport { PERMIT_TYPES, toEvmHex } from '@sun-protocol/permit2-sdk'\n\nconst PERMIT2_TYPED_DATA_CHAIN_IDS: Record<Network, number> = {\n mainnet: 728126428,\n nile: 3448148188,\n}\n\nexport interface Permit2Allowance {\n readonly amount: bigint\n readonly expiration: bigint\n readonly nonce: bigint\n}\n\n/** The helper evaluates allowance amount and expiration against chain state/time. */\nexport function buildPermit2HelperRead(input: {\n readonly helper: TronAddress\n readonly permit2: TronAddress\n readonly owner: TronAddress\n readonly token: TronAddress\n readonly spender: TronAddress\n readonly amount: string\n}): ContractRead {\n return {\n target: input.helper,\n functionSelector: 'checkPermit2Allowance(address,address,address,address,uint256)',\n parameters: [\n { type: 'address', value: input.permit2 },\n { type: 'address', value: input.token },\n { type: 'address', value: input.owner },\n { type: 'address', value: input.spender },\n { type: 'uint256', value: input.amount },\n ],\n outputs: [{ type: 'bool', name: 'approved' }],\n }\n}\n\nexport function normalizePermit2HelperResult(result: unknown): boolean {\n if (typeof result === 'boolean') return result\n if (Array.isArray(result) && result.length === 1 && typeof result[0] === 'boolean') return result[0]\n throw new SDKError('SDK_CONTRACT_ERROR', 'Invalid Permit2Helper approval result', { result })\n}\n\nexport function buildPermit2AllowanceRead(input: {\n readonly permit2: TronAddress\n readonly owner: TronAddress\n readonly token: TronAddress\n readonly spender: TronAddress\n}): ContractRead {\n return {\n target: input.permit2,\n functionSelector: 'allowance(address,address,address)',\n parameters: [\n { type: 'address', value: input.owner },\n { type: 'address', value: input.token },\n { type: 'address', value: input.spender },\n ],\n outputs: [\n { type: 'uint160', name: 'amount' },\n { type: 'uint48', name: 'expiration' },\n { type: 'uint48', name: 'nonce' },\n ],\n }\n}\n\nfunction bigintFrom(value: unknown, label: string): bigint {\n if (typeof value === 'bigint') return value\n if (typeof value === 'number' && Number.isSafeInteger(value)) return BigInt(value)\n if (typeof value === 'string' && /^[0-9]+$/.test(value)) return BigInt(value)\n throw new SDKError('SDK_CONTRACT_ERROR', `Invalid Permit2 allowance ${label}`, { value })\n}\n\nexport function normalizePermit2Allowance(result: unknown): Permit2Allowance {\n if (Array.isArray(result)) {\n return {\n amount: bigintFrom(result[0], 'amount'),\n expiration: bigintFrom(result[1], 'expiration'),\n nonce: bigintFrom(result[2], 'nonce'),\n }\n }\n\n if (typeof result === 'object' && result !== null) {\n const value = result as Record<string, unknown>\n return {\n amount: bigintFrom(value.amount ?? value[0], 'amount'),\n expiration: bigintFrom(value.expiration ?? value[1], 'expiration'),\n nonce: bigintFrom(value.nonce ?? value[2], 'nonce'),\n }\n }\n\n throw new SDKError('SDK_CONTRACT_ERROR', 'Invalid Permit2 allowance result', { result })\n}\n\nexport interface Permit2TypedDataInput {\n readonly network: Network\n readonly permit2: TronAddress\n readonly owner: TronAddress\n readonly token: TronAddress\n readonly spender: TronAddress\n readonly amount: string\n readonly expiration: string\n readonly sigDeadline: string\n readonly nonce: string\n}\n\nexport function buildPermit2TypedData(input: Permit2TypedDataInput): TypedDataPayload {\n return {\n primaryType: 'PermitSingle',\n domain: {\n name: 'Permit2',\n chainId: PERMIT2_TYPED_DATA_CHAIN_IDS[input.network],\n verifyingContract: toEvmHex(input.permit2),\n },\n types: PERMIT_TYPES,\n message: {\n details: {\n token: toEvmHex(input.token),\n amount: input.amount,\n expiration: input.expiration,\n nonce: input.nonce,\n },\n spender: toEvmHex(input.spender),\n sigDeadline: input.sigDeadline,\n },\n }\n}\n\nexport function buildPermit2ApproveAction(input: {\n readonly id: string\n readonly permit2: TronAddress\n readonly token: TronAddress\n readonly spender: TronAddress\n readonly amount: string\n readonly expiration: string\n}): ContractCallAction {\n return createContractCallAction({\n id: input.id,\n target: input.permit2,\n functionSelector: 'approve(address,address,uint160,uint48)',\n waitForReceipt: 'included',\n parameters: [\n { type: 'address', value: input.token },\n { type: 'address', value: input.spender },\n { type: 'uint160', value: input.amount },\n { type: 'uint48', value: input.expiration },\n ],\n })\n}\n","import type { ProtocolsContext } from '../context.js'\nimport { V2LiquidityClient } from './v2.js'\nimport { V3LiquidityClient } from './v3.js'\nimport { V4LiquidityClient } from './v4.js'\n\nexport class LiquidityClient {\n readonly v4: {\n readonly initialize: V4LiquidityClient['initialize']\n readonly read: V4LiquidityClient['read']\n readonly add: V4LiquidityClient['add']\n readonly increase: V4LiquidityClient['increase']\n }\n readonly v3: {\n readonly add: V3LiquidityClient['add']\n readonly increase: V3LiquidityClient['increase']\n }\n\n readonly v2: V2LiquidityClient\n\n constructor(context: ProtocolsContext) {\n this.v2 = new V2LiquidityClient(context)\n const v3Client = new V3LiquidityClient(context)\n const v4Client = new V4LiquidityClient(context)\n this.v3 = {\n add: v3Client.add,\n increase: v3Client.increase,\n }\n this.v4 = {\n initialize: v4Client.initialize,\n read: (input) => v4Client.read(input),\n add: v4Client.add,\n increase: v4Client.increase,\n }\n }\n}\n\nexport function createLiquidityClient(context: ProtocolsContext): LiquidityClient {\n return new LiquidityClient(context)\n}\n"],"mappings":"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","names":["import_sun_sdk_core","import_sun_sdk_sunswap_v2","import_sun_sdk_core","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","PERCENT_PATTERN","import_sun_sdk_core","import_sun_sdk_core","planTokenApproval","import_sun_sdk_core","import_sun_sdk_sunswap_v3","import_sun_sdk_core","import_sun_sdk_core"]}
@@ -0,0 +1,83 @@
1
+ import { P as ProtocolsContext, T as TransactionPlan, a as TransactionPlanExecutionResult } from '../common-8VQQ0FSU.cjs';
2
+ export { A as ApprovalMode } from '../common-8VQQ0FSU.cjs';
3
+ import { V as V2AddLiquidityInput, b as V2RemoveLiquidityInput, c as V3AddLiquidityInput, d as V3IncreaseLiquidityInput, i as V4PoolReadInput, j as V4PoolSnapshot, g as V4InitializePoolInput, h as V4MintPositionInput, f as V4IncreaseLiquidityInput } from '../types-BTPdCC7k.cjs';
4
+ export { L as LiquidityAmountInput, a as LiquidityPlanOptions, e as V3PoolStateInput } from '../types-BTPdCC7k.cjs';
5
+ import '@sun-protocol/sun-sdk-api';
6
+ import '@sun-protocol/sun-sdk-chains';
7
+ import '@sun-protocol/sun-sdk-core';
8
+ import '@sun-protocol/sun-sdk-runtime';
9
+ import '@sun-protocol/sun-sdk-sunswap-v4';
10
+
11
+ declare function planV2AddLiquidity(context: ProtocolsContext, input: V2AddLiquidityInput): Promise<TransactionPlan>;
12
+ declare function planV2RemoveLiquidity(context: ProtocolsContext, input: V2RemoveLiquidityInput): Promise<TransactionPlan>;
13
+ declare class V2LiquidityClient {
14
+ private readonly context;
15
+ constructor(context: ProtocolsContext);
16
+ readonly add: {
17
+ plan: (input: V2AddLiquidityInput) => Promise<TransactionPlan>;
18
+ execute: (input: V2AddLiquidityInput) => Promise<TransactionPlanExecutionResult>;
19
+ };
20
+ readonly remove: {
21
+ plan: (input: V2RemoveLiquidityInput) => Promise<TransactionPlan>;
22
+ execute: (input: V2RemoveLiquidityInput) => Promise<TransactionPlanExecutionResult>;
23
+ };
24
+ }
25
+ declare function createV2LiquidityClient(context: ProtocolsContext): V2LiquidityClient;
26
+
27
+ declare class V3LiquidityClient {
28
+ private readonly context;
29
+ constructor(context: ProtocolsContext);
30
+ readonly add: {
31
+ plan: (input: V3AddLiquidityInput) => Promise<TransactionPlan>;
32
+ execute: (input: V3AddLiquidityInput) => Promise<TransactionPlanExecutionResult>;
33
+ };
34
+ readonly increase: {
35
+ plan: (input: V3IncreaseLiquidityInput) => Promise<TransactionPlan>;
36
+ execute: (input: V3IncreaseLiquidityInput) => Promise<TransactionPlanExecutionResult>;
37
+ };
38
+ private planAdd;
39
+ private planIncrease;
40
+ }
41
+
42
+ declare class V4LiquidityClient {
43
+ private readonly context;
44
+ constructor(context: ProtocolsContext);
45
+ read(input: V4PoolReadInput): Promise<V4PoolSnapshot>;
46
+ readonly initialize: {
47
+ plan: (input: V4InitializePoolInput) => Promise<TransactionPlan>;
48
+ execute: (input: V4InitializePoolInput) => Promise<TransactionPlanExecutionResult>;
49
+ };
50
+ readonly add: {
51
+ plan: (input: V4MintPositionInput) => Promise<TransactionPlan>;
52
+ execute: (input: V4MintPositionInput) => Promise<TransactionPlanExecutionResult>;
53
+ };
54
+ readonly increase: {
55
+ plan: (input: V4IncreaseLiquidityInput) => Promise<TransactionPlan>;
56
+ execute: (input: V4IncreaseLiquidityInput) => Promise<TransactionPlanExecutionResult>;
57
+ };
58
+ private planInitialize;
59
+ private planMint;
60
+ private planIncrease;
61
+ }
62
+
63
+ declare class LiquidityClient {
64
+ readonly v4: {
65
+ readonly initialize: V4LiquidityClient['initialize'];
66
+ readonly read: V4LiquidityClient['read'];
67
+ readonly add: V4LiquidityClient['add'];
68
+ readonly increase: V4LiquidityClient['increase'];
69
+ };
70
+ readonly v3: {
71
+ readonly add: V3LiquidityClient['add'];
72
+ readonly increase: V3LiquidityClient['increase'];
73
+ };
74
+ readonly v2: V2LiquidityClient;
75
+ constructor(context: ProtocolsContext);
76
+ }
77
+ declare function createLiquidityClient(context: ProtocolsContext): LiquidityClient;
78
+
79
+ declare const SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID = "sunswap-v2";
80
+ declare const SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID = "sunswap-v3";
81
+ declare const SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID = "sunswap-v4";
82
+
83
+ export { LiquidityClient, SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID, SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID, SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID, TransactionPlan, V2AddLiquidityInput, V2LiquidityClient, V2RemoveLiquidityInput, V3AddLiquidityInput, V3IncreaseLiquidityInput, V3LiquidityClient, V4IncreaseLiquidityInput, V4InitializePoolInput, V4LiquidityClient, V4MintPositionInput, V4PoolReadInput, V4PoolSnapshot, createLiquidityClient, createV2LiquidityClient, planV2AddLiquidity, planV2RemoveLiquidity };