@sun-protocol/sun-sdk-protocols 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/dist/chunk-5XDX5563.js +99 -0
- package/dist/chunk-5XDX5563.js.map +1 -0
- package/dist/chunk-C2YCVBPI.js +212 -0
- package/dist/chunk-C2YCVBPI.js.map +1 -0
- package/dist/chunk-ECCGOXNA.js +1317 -0
- package/dist/chunk-ECCGOXNA.js.map +1 -0
- package/dist/chunk-HD2S3Q7L.js +746 -0
- package/dist/chunk-HD2S3Q7L.js.map +1 -0
- package/dist/chunk-L5TZCDPH.js +561 -0
- package/dist/chunk-L5TZCDPH.js.map +1 -0
- package/dist/chunk-OM4OW4KB.js +224 -0
- package/dist/chunk-OM4OW4KB.js.map +1 -0
- package/dist/chunk-PEGREDLT.js +935 -0
- package/dist/chunk-PEGREDLT.js.map +1 -0
- package/dist/chunk-TSHXXRH2.js +103 -0
- package/dist/chunk-TSHXXRH2.js.map +1 -0
- package/dist/chunk-VFVKMC4H.js +521 -0
- package/dist/chunk-VFVKMC4H.js.map +1 -0
- package/dist/chunk-YMGZDXI4.js +1209 -0
- package/dist/chunk-YMGZDXI4.js.map +1 -0
- package/dist/common-8VQQ0FSU.d.cts +146 -0
- package/dist/common-8VQQ0FSU.d.ts +146 -0
- package/dist/execute-BNKh6dT6.d.cts +187 -0
- package/dist/execute-CVhcKZxF.d.ts +187 -0
- package/dist/index.cjs +5619 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +139 -0
- package/dist/index.d.ts +139 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/intents-BSXq1HvW.d.cts +200 -0
- package/dist/intents-CwOttD75.d.ts +200 -0
- package/dist/liquidity/index.cjs +2441 -0
- package/dist/liquidity/index.cjs.map +1 -0
- package/dist/liquidity/index.d.cts +83 -0
- package/dist/liquidity/index.d.ts +83 -0
- package/dist/liquidity/index.js +32 -0
- package/dist/liquidity/index.js.map +1 -0
- package/dist/positions/index.cjs +1544 -0
- package/dist/positions/index.cjs.map +1 -0
- package/dist/positions/index.d.cts +159 -0
- package/dist/positions/index.d.ts +159 -0
- package/dist/positions/index.js +25 -0
- package/dist/positions/index.js.map +1 -0
- package/dist/pump/index.cjs +1178 -0
- package/dist/pump/index.cjs.map +1 -0
- package/dist/pump/index.d.cts +16 -0
- package/dist/pump/index.d.ts +16 -0
- package/dist/pump/index.js +29 -0
- package/dist/pump/index.js.map +1 -0
- package/dist/swap/index.cjs +2259 -0
- package/dist/swap/index.cjs.map +1 -0
- package/dist/swap/index.d.cts +33 -0
- package/dist/swap/index.d.ts +33 -0
- package/dist/swap/index.js +61 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/types-BTPdCC7k.d.cts +160 -0
- package/dist/types-BfrouFmO.d.ts +160 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/approval/check.ts","../src/approval/classic.ts","../src/approval/plan.ts","../src/common.ts","../src/context.ts","../src/execute-http-action.ts","../src/approval/permit2.ts","../src/internal/permit2-adapter.ts","../src/errors.ts","../src/execute-plan.ts","../src/liquidity/v2.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/liquidity/client.ts","../src/positions/v3.ts","../src/positions/execute.ts","../src/usdt-transfer.ts","../src/internal/positions.ts","../src/positions/intents.ts","../src/positions/v4.ts","../src/positions/client.ts","../src/pump/client.ts","../src/pump/buy.ts","../src/internal/v2-swap-action.ts","../src/swap/v2-execute.ts","../src/pump/execute.ts","../src/pump/plan-buy.ts","../src/pump/v2.ts","../src/pump/intents.ts","../src/pump/workflow.ts","../src/pump/launch.ts","../src/pump/launch-client.ts","../src/pump/sell.ts","../src/pump/plan-sell.ts","../src/swap/psm.ts","../src/swap/fee-limit.ts","../src/swap/workflow.ts","../src/swap/intents.ts","../src/swap/router-execute.ts","../src/internal/router-action.ts","../src/internal/universal-router-adapter.ts","../src/swap/plan.ts","../src/swap/tokens.ts","../src/swap/quote.ts","../src/swap/router.ts","../src/swap/v2.ts","../src/swap/namespace.ts","../src/sdk.ts"],"sourcesContent":["export * from './approval/index.js'\nexport {\n createProtocolsContext,\n createContextExecutor,\n requireRuntime,\n requireWalletAddress,\n requireWalletSnapshot,\n} from './context.js'\nexport {\n applySlippageMax,\n applySlippageMin,\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n normalizeRecipient,\n parseSlippage,\n slippageToBips,\n validateSlippage,\n} from './common.js'\nexport {\n normalizeProtocolError,\n withExecutionContext,\n} from './errors.js'\nexport { executeHttpAction } from './execute-http-action.js'\nexport { executeTransactionPlan } from './execute-plan.js'\nexport { SunSDK } from './sdk.js'\nexport {\n createSwapRouterClient,\n SwapRouterClient,\n} from './swap/router.js'\nexport {\n createRouterSwapExecutor,\n materializeUniversalRouterAction,\n} from './swap/router-execute.js'\nexport { createV2SwapExecutor } from './swap/v2-execute.js'\nexport { planRouterSwap } from './swap/plan.js'\nexport {\n createPsmClient,\n createPsmSwapClient,\n planPsmSwap,\n PsmSwapClient,\n quotePsmSwap,\n readPsm,\n} from './swap/psm.js'\nexport {\n createV2Client,\n createV2SwapClient,\n V2SwapClient,\n} from './swap/v2.js'\nexport {\n PSM_PROTOCOL_ID,\n UNIVERSAL_ROUTER_PROTOCOL_ID,\n WTRX_PROTOCOL_ID,\n} from './swap/intents.js'\nexport {\n SUNSWAP_V2_LIQUIDITY_PROTOCOL_ID,\n SUNSWAP_V3_LIQUIDITY_PROTOCOL_ID,\n SUNSWAP_V4_LIQUIDITY_PROTOCOL_ID,\n} from './liquidity/intents.js'\nexport {\n SUNSWAP_V3_POSITION_PROTOCOL_ID,\n SUNSWAP_V4_POSITION_PROTOCOL_ID,\n} from './positions/intents.js'\nexport {\n SUNPUMP_LAUNCHPAD_PROTOCOL_ID,\n SUNPUMP_V2_PROTOCOL_ID,\n} from './pump/intents.js'\nexport { createPumpClient, PumpClient } from './pump/client.js'\nexport { PumpBuyClient } from './pump/buy.js'\nexport { createPumpExecutor } from './pump/execute.js'\nexport { PumpLaunchClient } from './pump/launch-client.js'\nexport { PumpSellClient } from './pump/sell.js'\nexport { createLiquidityClient, LiquidityClient } from './liquidity/client.js'\nexport { createPositionsClient, PositionsClient } from './positions/client.js'\nexport {\n createV2LiquidityClient,\n planV2AddLiquidity,\n planV2RemoveLiquidity,\n V2LiquidityClient,\n} from './liquidity/v2.js'\nexport { V3LiquidityClient } from './liquidity/v3.js'\nexport { V4LiquidityClient } from './liquidity/v4.js'\nexport { V3PositionsClient } from './positions/v3.js'\nexport { assertV3PositionUsdtTransfer, createV3PositionsExecutor } from './positions/execute.js'\nexport { usdtValidateTransfer } from './usdt-transfer.js'\nexport type { UsdtReader, TransferSource, UsdtTransferValidationResult } from './usdt-transfer.js'\nexport { V4PositionsClient } from './positions/v4.js'\nexport type { ProtocolsContext } from './context.js'\nexport type {\n RouterSwapQuote,\n PsmApprovalMode,\n PsmContractOverrides,\n PsmQuote,\n PsmReadInput,\n PsmSnapshot,\n PsmSwapClientShape,\n PsmSwapDirection,\n PsmSwapInput,\n PsmSwapMode,\n PsmSwapQuote,\n SwapNamespace,\n SwapPlanOptions,\n SwapQuote,\n SwapQuoteAmounts,\n SwapQuoteInput,\n SwapQuoteKind,\n RouterRouteType,\n SwapRouterClientShape,\n SwapRouterExecuteInput,\n SwapRouterPlanInput,\n SwapTransactionOptions,\n WtrxSwapAction,\n WtrxSwapQuote,\n WtrxSwapRoute,\n V2SwapClientShape,\n V2SwapDirection,\n V2SwapMode,\n V2SwapQuote,\n V2SwapQuoteInput,\n} from './swap/types.js'\nexport type {\n PlanTimingOptions,\n RecipientOptions,\n SlippageInput,\n} from './types/common.js'\nexport type {\n AgentTokenLaunchParams,\n PumpBuyClientShape,\n PumpBuyExactTokenQuote,\n PumpBuyInput,\n PumpBuyQuote,\n PumpClientShape,\n PumpLaunchClientShape,\n PumpQuoteBuyExactTokenInput,\n PumpQuoteBuyInput,\n PumpQuoteSellInput,\n PumpSellApprovalMode,\n PumpSellClientShape,\n PumpSellInput,\n PumpSellQuote,\n PumpTokenHttpClient,\n PumpTokenInput,\n} from './pump/types.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 './liquidity/types.js'\nexport type {\n PositionActionOptions,\n PositionCollectInput,\n PositionLiquidityInput,\n PositionRemoveInput,\n V3PositionCollectInput,\n V3PositionReadInput,\n V3PositionRemoveInput,\n V3PositionSnapshot,\n V4PositionCollectInput,\n V4PositionFeesSnapshot,\n V4PositionReadInput,\n V4PositionRemoveInput,\n V4PositionSnapshot,\n} from './positions/types.js'\nexport type { TransactionPlanExecutor } from './execute-plan.js'\nexport type {\n ApprovalMode,\n ContractOverrides,\n ProtocolAdapterDependencies,\n ProtocolClientOptions,\n ProtocolClientOverrides,\n SunSDKCreateOptions,\n} from './types/options.js'\nexport type {\n ExecutedActionResult,\n PlanSummary,\n TransactionPlan,\n TransactionPlanExecutionResult,\n TransactionPlanFinalResult,\n TransactionPlanKind,\n} from './types/plan.js'\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 { 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 {\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 {\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 {\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 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 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 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","import {\n CurrencyAmount,\n Percent,\n SDKError,\n Token,\n assertTronAddress,\n type Currency,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n buildV3PositionApprovalForAllRead,\n buildV3PositionReads,\n computeV3PoolAddress,\n NonfungiblePositionManager,\n Pool,\n Position,\n type FeeAmount,\n} from '@sun-protocol/sun-sdk-sunswap-v3'\nimport {\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n normalizeRecipient,\n parseSlippage,\n slippageToBips,\n} from '../common.js'\nimport {\n requireWalletAddress,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport { executeTransactionPlan } from '../execute-plan.js'\nimport { createV3PositionsExecutor } from './execute.js'\nimport type { TransferSource, UsdtTransferContext } from '../usdt-transfer.js'\nimport { methodParametersToAction } from '../internal/method-parameters.js'\nimport { assertPositionAuthorized } from '../internal/positions.js'\nimport {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport {\n evmHexToTronAddress,\n normalizeLiquidityPercentage,\n tronAddressToEvmAddress,\n} from '../internal/tokens.js'\nimport { resolveV3PoolState } from '../liquidity/v3.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V3PositionCollectInput,\n V3PositionReadInput,\n V3PositionRemoveInput,\n V3PositionSnapshot,\n} from './types.js'\nimport {\n positionIntentScope,\n SUNSWAP_V3_POSITION_PROTOCOL_ID,\n} from './intents.js'\n\ninterface V3PositionObjectResult {\n readonly token0?: unknown\n readonly token1?: unknown\n readonly fee?: unknown\n readonly tickLower?: unknown\n readonly tickUpper?: unknown\n readonly liquidity?: unknown\n readonly tokensOwed0?: unknown\n readonly tokensOwed1?: unknown\n}\n\nfunction integerString(value: unknown, label: string): string {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint') {\n return BigInt(value.toString()).toString()\n }\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n}\n\nfunction integerNumber(value: unknown, label: string): number {\n const parsed = Number(integerString(value, label))\n if (!Number.isSafeInteger(parsed)) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be a safe integer`, { value })\n }\n return parsed\n}\n\nfunction unwrapSingle(value: unknown): unknown {\n return Array.isArray(value) && value.length === 1 ? value[0] : value\n}\n\nfunction parsePositionAddress(value: unknown, label: string): TronAddress {\n const raw = String(unwrapSingle(value))\n try {\n return assertTronAddress(raw, label)\n } catch {\n const evmHex = /^41[0-9a-fA-F]{40}$/.test(raw) ? `0x${raw.slice(2)}` : raw\n return evmHexToTronAddress(evmHex, label)\n }\n}\n\nfunction normalizePositionToken(\n context: ProtocolsContext,\n value: unknown,\n label: string,\n): { publicAddress: TronAddress; token: Token } {\n if (typeof value !== 'string') {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an address string`, { value })\n }\n const publicAddress = parsePositionAddress(value, label)\n const evmAddress = tronAddressToEvmAddress(publicAddress, label)\n\n return {\n publicAddress,\n token: new Token(context.chain.uniswapChainId, evmAddress, 6, undefined, undefined, true),\n }\n}\n\nfunction parsePositionResult(\n context: ProtocolsContext,\n tokenId: string,\n result: unknown,\n owner: TronAddress,\n approved?: TronAddress,\n operatorApproved?: boolean,\n): V3PositionSnapshot & { readonly token0Entity: Token; readonly token1Entity: Token } {\n let token0: unknown\n let token1: unknown\n let fee: unknown\n let tickLower: unknown\n let tickUpper: unknown\n let liquidity: unknown\n let tokensOwed0: unknown\n let tokensOwed1: unknown\n\n if (Array.isArray(result)) {\n token0 = result[2]\n token1 = result[3]\n fee = result[4]\n tickLower = result[5]\n tickUpper = result[6]\n liquidity = result[7]\n tokensOwed0 = result[10]\n tokensOwed1 = result[11]\n } else if (typeof result === 'object' && result !== null) {\n const position = result as V3PositionObjectResult\n token0 = position.token0\n token1 = position.token1\n fee = position.fee\n tickLower = position.tickLower\n tickUpper = position.tickUpper\n liquidity = position.liquidity\n tokensOwed0 = position.tokensOwed0\n tokensOwed1 = position.tokensOwed1\n } else {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V3 position result is malformed', { result })\n }\n\n const token0Info = normalizePositionToken(context, token0, 'token0')\n const token1Info = normalizePositionToken(context, token1, 'token1')\n\n return {\n protocol: 'sunswap-v3',\n tokenId,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n token0: token0Info.publicAddress,\n token1: token1Info.publicAddress,\n fee: integerNumber(fee, 'fee'),\n tickLower: integerNumber(tickLower, 'tickLower'),\n tickUpper: integerNumber(tickUpper, 'tickUpper'),\n liquidity: integerString(liquidity, 'liquidity'),\n tokensOwed0: integerString(tokensOwed0, 'tokensOwed0'),\n tokensOwed1: integerString(tokensOwed1, 'tokensOwed1'),\n token0Entity: token0Info.token,\n token1Entity: token1Info.token,\n }\n}\n\nfunction removePercentage(input: V3PositionRemoveInput, snapshot: V3PositionSnapshot): Percent {\n if (input.percentage !== undefined) return normalizeLiquidityPercentage(input.percentage, 'percentage')\n const liquidity = BigInt(normalizeBaseUnitAmount(input.liquidity, 'liquidity'))\n const total = BigInt(snapshot.liquidity)\n if (liquidity > total) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'liquidity cannot exceed position liquidity', {\n liquidity: liquidity.toString(),\n totalLiquidity: total.toString(),\n })\n }\n return new Percent(liquidity.toString(), total.toString())\n}\n\nfunction currencyForCollect(\n context: ProtocolsContext,\n token: Token,\n publicAddress: TronAddress,\n receiveNative: boolean | undefined,\n): Currency {\n return receiveNative && publicAddress === context.chain.contracts.wtrx\n ? context.chain.nativeCurrency\n : token\n}\n\nexport class V3PositionsClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n async read(input: V3PositionReadInput): Promise<V3PositionSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const [positionResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n buildV3PositionReads({\n network: this.context.network,\n tokenId,\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager'),\n }),\n 'V3 position read',\n )\n const owner = parsePositionAddress(ownerResult, 'owner')\n const approved = approvedResult ? parsePositionAddress(approvedResult, 'approved') : undefined\n const operator = input.operator ? assertTronAddress(input.operator, 'operator') : undefined\n const operatorApproved = operator\n ? Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV3PositionApprovalForAllRead({\n network: this.context.network,\n owner,\n operator,\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager'),\n }),\n 'V3 position operator approval read',\n ))\n : undefined\n\n const snapshot = parsePositionResult(\n this.context,\n tokenId,\n positionResult,\n owner,\n approved,\n operatorApproved,\n )\n return {\n protocol: snapshot.protocol,\n tokenId: snapshot.tokenId,\n owner: snapshot.owner,\n ...(snapshot.approved !== undefined ? { approved: snapshot.approved } : {}),\n ...(snapshot.operatorApproved !== undefined ? { operatorApproved: snapshot.operatorApproved } : {}),\n token0: snapshot.token0,\n token1: snapshot.token1,\n fee: snapshot.fee,\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n liquidity: snapshot.liquidity,\n tokensOwed0: snapshot.tokensOwed0,\n tokensOwed1: snapshot.tokensOwed1,\n }\n }\n\n readonly remove = {\n plan: async (input: V3PositionRemoveInput): Promise<TransactionPlan> => this.planRemove(input),\n execute: async (input: V3PositionRemoveInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planRemove(input), createV3PositionsExecutor(this.context)),\n }\n\n readonly collect = {\n plan: async (input: V3PositionCollectInput): Promise<TransactionPlan> => this.planCollect(input),\n execute: async (input: V3PositionCollectInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planCollect(input), createV3PositionsExecutor(this.context)),\n }\n\n private usdtTransferContext(\n snapshot: V3PositionSnapshot,\n positionManager: TronAddress,\n input: V3PositionCollectInput,\n ): UsdtTransferContext {\n const { network, chain } = this.context\n const usdtAddress = chain.contracts.usdt\n const transfersUsdt = snapshot.token0 === usdtAddress || snapshot.token1 === usdtAddress\n const sources: TransferSource[] = []\n const factory = resolveProtocolContract(this.context, input.contracts, 'sunswapV3Factory')\n // Only the configured deployment has a known factory/init-code pairing.\n // Unknown custom deployments keep an empty source list and fail closed on send.\n if (transfersUsdt && positionManager === chain.contracts.sunswapV3PositionManager && factory === chain.contracts.sunswapV3Factory) {\n sources.push({\n address: computeV3PoolAddress({ network, tokenA: snapshot.token0, tokenB: snapshot.token1, fee: snapshot.fee, factory }),\n role: 'v3-pool',\n })\n sources.push({ address: positionManager, role: 'position-manager' })\n }\n return { network, transfersUsdt, sources }\n }\n\n private async readAuthorizedPosition(\n tokenId: string,\n operation: string,\n positionManager: TronAddress,\n validationMode: V3PositionRemoveInput['validationMode'],\n ) {\n const wallet = await requireWalletAddress(this.context, operation)\n const [positionResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n buildV3PositionReads({ network: this.context.network, tokenId, positionManager }),\n operation,\n )\n const owner = parsePositionAddress(ownerResult, 'owner')\n const approved = approvedResult ? parsePositionAddress(approvedResult, 'approved') : undefined\n const operatorApproved = validationMode === 'legacy'\n ? undefined\n : Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV3PositionApprovalForAllRead({ network: this.context.network, owner, operator: wallet, positionManager }),\n `${operation} operator approval read`,\n ))\n if (validationMode !== 'legacy') {\n assertPositionAuthorized({\n tokenId,\n wallet,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n })\n }\n return {\n wallet,\n snapshot: parsePositionResult(this.context, tokenId, positionResult, owner, approved, operatorApproved),\n }\n }\n\n private async planRemove(input: V3PositionRemoveInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager')\n const planId = nextPlanId(this.context, 'position-v3-remove')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V3 remove position',\n positionManager,\n input.validationMode,\n )\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V3 remove position', wallet)\n const deadline = normalizeDeadline(this.context, input)\n const slippage = parseSlippage(input.slippage ?? '0.5%')\n const poolDerived = input.pool === undefined\n const poolState = input.pool ?? await resolveV3PoolState(this.context, {\n tokenA: snapshot.token0,\n tokenB: snapshot.token1,\n fee: snapshot.fee,\n contracts: input.contracts,\n })\n const pool = new Pool({\n tokenA: snapshot.token0Entity,\n tokenB: snapshot.token1Entity,\n fee: snapshot.fee as FeeAmount,\n sqrtRatioX96: normalizeBaseUnitAmount(poolState.sqrtRatioX96, 'sqrtRatioX96'),\n liquidity: normalizeBaseUnitAmount(poolState.liquidity, 'pool liquidity', { allowZero: true }),\n tickCurrent: poolState.tickCurrent,\n ...(poolState.tickSpacing !== undefined ? { tickSpacing: poolState.tickSpacing } : {}),\n })\n const position = new Position({\n pool,\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n liquidity: snapshot.liquidity,\n })\n const token0 = assertTronAddress(snapshot.token0, 'token0')\n const token1 = assertTronAddress(snapshot.token1, 'token1')\n const expectedCurrencyOwed0 = CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token0Entity, token0, input.receiveNative),\n input.expectedCurrencyOwed0 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed0, 'expectedCurrencyOwed0', { allowZero: true })\n : snapshot.tokensOwed0,\n )\n const expectedCurrencyOwed1 = CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token1Entity, token1, input.receiveNative),\n input.expectedCurrencyOwed1 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed1, 'expectedCurrencyOwed1', { allowZero: true })\n : snapshot.tokensOwed1,\n )\n const methodParameters = NonfungiblePositionManager.removeCallParameters(position, {\n tokenId,\n liquidityPercentage: removePercentage(input, snapshot),\n slippageTolerance: slippage,\n deadline,\n ...(input.burnToken !== undefined ? { burnToken: input.burnToken } : {}),\n collectOptions: {\n recipient: tronAddressToEvmAddress(recipient, 'recipient'),\n expectedCurrencyOwed0,\n expectedCurrencyOwed1,\n },\n })\n const action = methodParametersToAction({\n id: `${planId}-tx`,\n target: positionManager,\n methodParameters,\n metadata: { usdtTransfer: this.usdtTransferContext(snapshot, positionManager, input) },\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n intent: {\n kind: 'remove-liquidity',\n scope: positionIntentScope(SUNSWAP_V3_POSITION_PROTOCOL_ID, 'remove-position'),\n positionId: tokenId,\n },\n })\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: { title: 'Remove SunSwap V3 position liquidity', lines: [`Position ${tokenId}`, `Recipient ${recipient}`] },\n approvals: [],\n transactions: [action],\n metadata: {\n protocol: 'sunswap-v3',\n operation: 'remove-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n slippageBips: slippageToBips(input.slippage ?? '0.5%'),\n positionDerived: true,\n poolDerived,\n },\n }\n }\n\n private async planCollect(input: V3PositionCollectInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager')\n const planId = nextPlanId(this.context, 'position-v3-collect')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V3 collect position',\n positionManager,\n input.validationMode,\n )\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V3 collect position', wallet)\n const token0 = assertTronAddress(snapshot.token0, 'token0')\n const token1 = assertTronAddress(snapshot.token1, 'token1')\n const methodParameters = NonfungiblePositionManager.collectCallParameters({\n tokenId,\n recipient: tronAddressToEvmAddress(recipient, 'recipient'),\n expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token0Entity, token0, input.receiveNative),\n input.expectedCurrencyOwed0 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed0, 'expectedCurrencyOwed0', { allowZero: true })\n : snapshot.tokensOwed0,\n ),\n expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token1Entity, token1, input.receiveNative),\n input.expectedCurrencyOwed1 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed1, 'expectedCurrencyOwed1', { allowZero: true })\n : snapshot.tokensOwed1,\n ),\n })\n const action = methodParametersToAction({\n id: `${planId}-tx`,\n target: positionManager,\n methodParameters,\n metadata: { usdtTransfer: this.usdtTransferContext(snapshot, positionManager, input) },\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n intent: {\n kind: 'collect-fees',\n scope: positionIntentScope(SUNSWAP_V3_POSITION_PROTOCOL_ID, 'collect-position'),\n positionId: tokenId,\n },\n })\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: { title: 'Collect SunSwap V3 position fees', lines: [`Position ${tokenId}`, `Recipient ${recipient}`] },\n approvals: [],\n transactions: [action],\n metadata: {\n protocol: 'sunswap-v3',\n operation: 'collect-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n },\n }\n }\n}\n","import { SDKError, type ContractCallAction } from '@sun-protocol/sun-sdk-core'\nimport { createContextExecutor, type ProtocolsContext } from '../context.js'\nimport type { TransactionPlanExecutor } from '../execute-plan.js'\nimport { assertUsdtTransfer } from '../usdt-transfer.js'\n\n/** Check an SDK-built V3 remove/collect action immediately before its final send. */\nexport async function assertV3PositionUsdtTransfer(context: ProtocolsContext, action: ContractCallAction): Promise<void> {\n await assertUsdtTransfer(context, action)\n}\n\n/** Use this executor for V3 position plans, including staged execution and retries. */\nexport function createV3PositionsExecutor(context: ProtocolsContext): TransactionPlanExecutor {\n const executor = createContextExecutor(context)\n return {\n ...executor,\n sendAction: async (action) => {\n await assertV3PositionUsdtTransfer(context, action)\n if (!executor.sendAction) throw new SDKError('SDK_RUNTIME_ERROR', 'V3 position execution requires a runtime')\n return executor.sendAction(action)\n },\n }\n}\n","import { SDKError, type ContractCallAction, type Network, type TronAddress } from '@sun-protocol/sun-sdk-core'\nimport type { ContractRead } from '@sun-protocol/sun-sdk-runtime'\nimport type { ProtocolsContext } from './context.js'\nimport { normalizeTronAddress } from './internal/tokens.js'\n\nexport interface UsdtReader {\n paused(): Promise<boolean>\n isBlackListed(address: string): Promise<boolean>\n}\n\nexport interface TransferSource {\n readonly address: string\n readonly role: 'v3-pool' | 'position-manager'\n}\n\nexport type UsdtTransferValidationResult =\n | { readonly status: 'allowed' }\n | { readonly status: 'blocked'; readonly reason: 'USDT_PAUSED' }\n | { readonly status: 'blocked'; readonly reason: 'USDT_SOURCE_BLACKLISTED'; readonly sources: readonly TransferSource[] }\n | { readonly status: 'unknown'; readonly reason: 'MISSING_TRANSFER_SOURCE' | 'CHECK_FAILED' }\n\n/** Applies the USDT paused/blacklist check. Unknown results never authorize submission. */\nexport async function usdtValidateTransfer(input: {\n readonly reader: UsdtReader\n readonly transfersUsdt: boolean\n readonly sources: readonly TransferSource[]\n}): Promise<UsdtTransferValidationResult> {\n if (input.transfersUsdt === false) return { status: 'allowed' }\n if (input.transfersUsdt !== true) return { status: 'unknown', reason: 'CHECK_FAILED' }\n if (input.sources.length === 0) return { status: 'unknown', reason: 'MISSING_TRANSFER_SOURCE' }\n\n try {\n const paused = await input.reader.paused()\n if (typeof paused !== 'boolean') throw new Error('Invalid paused result')\n if (paused) return { status: 'blocked', reason: 'USDT_PAUSED' }\n\n const sources = new Map<string, TransferSource>()\n for (const source of input.sources) {\n const address = normalizeTronAddress(source.address)\n sources.set(address, { ...source, address })\n }\n const checks = await Promise.all([...sources.values()].map(async (source) => {\n const blacklisted = await input.reader.isBlackListed(source.address)\n if (typeof blacklisted !== 'boolean') throw new Error('Invalid blacklist result')\n return { source, blacklisted }\n }))\n const blocked = checks.filter((check) => check.blacklisted).map((check) => check.source)\n return blocked.length > 0\n ? { status: 'blocked', reason: 'USDT_SOURCE_BLACKLISTED', sources: blocked }\n : { status: 'allowed' }\n } catch {\n return { status: 'unknown', reason: 'CHECK_FAILED' }\n }\n}\n\n/** Static facts about an SDK-built action; never stores a previous check result. */\nexport interface UsdtTransferContext {\n readonly network: Network\n readonly transfersUsdt: boolean\n readonly sources: readonly TransferSource[]\n}\n\nfunction parseTransferContext(context: ProtocolsContext, action: ContractCallAction): UsdtTransferContext {\n const data = action.metadata?.usdtTransfer as Partial<UsdtTransferContext> | undefined\n if (!data) throw new Error('Missing USDT transfer context')\n if (data.network !== context.network ||\n typeof data.transfersUsdt !== 'boolean' || !Array.isArray(data.sources)) {\n throw new Error('Invalid USDT transfer context; rebuild the plan')\n }\n const sources = data.sources.map((source: TransferSource) => {\n if (!source || typeof source.address !== 'string' ||\n (source.role !== 'v3-pool' && source.role !== 'position-manager')) {\n throw new Error('Invalid USDT transfer source')\n }\n const address = normalizeTronAddress(source.address)\n if (source.role === 'position-manager' && address !== normalizeTronAddress(action.target)) {\n throw new Error('USDT sweep source does not match the position manager')\n }\n return { address, role: source.role }\n })\n if (!data.transfersUsdt && sources.length > 0) throw new Error('Unexpected USDT sources')\n return { network: context.network, transfersUsdt: data.transfersUsdt, sources }\n}\n\nfunction boolRead(target: TronAddress, name: 'paused' | 'isBlackListed', address?: string): ContractRead {\n return {\n target,\n functionSelector: name === 'paused' ? 'paused()' : 'isBlackListed(address)',\n parameters: address === undefined ? [] : [{ type: 'address', value: address }],\n abiFunction: {\n type: 'function', name, stateMutability: 'view',\n inputs: name === 'paused' ? [] : [{ name: '_user', type: 'address' }],\n outputs: [{ name: '', type: 'bool' }],\n },\n }\n}\n\n/** Internal execution guard, shared by the two protocol-specific executors. */\nexport async function assertUsdtTransfer(context: ProtocolsContext, action: ContractCallAction): Promise<void> {\n let result: UsdtTransferValidationResult\n if (!action.metadata?.usdtTransfer) {\n result = { status: 'unknown', reason: 'MISSING_TRANSFER_SOURCE' }\n } else {\n try {\n const data = parseTransferContext(context, action)\n if (data.transfersUsdt && !data.sources.some((source) => source.role === 'v3-pool')) {\n result = { status: 'unknown', reason: 'MISSING_TRANSFER_SOURCE' }\n } else {\n const read = (name: 'paused' | 'isBlackListed', address?: string) => {\n if (!context.runtime) throw new Error('USDT transfer validation requires a runtime')\n return context.runtime.readContract<boolean>(boolRead(context.chain.contracts.usdt, name, address))\n }\n result = await usdtValidateTransfer({\n ...data,\n reader: { paused: () => read('paused'), isBlackListed: (address) => read('isBlackListed', address) },\n })\n }\n } catch {\n result = { status: 'unknown', reason: 'CHECK_FAILED' }\n }\n }\n if (result.status === 'allowed') return\n throw new SDKError(\n result.status === 'blocked' ? 'SDK_USDT_TRANSFER_BLOCKED' : 'SDK_USDT_TRANSFER_UNKNOWN',\n result.status === 'blocked' ? 'USDT transfer is currently restricted' : 'Unable to verify USDT transfer status',\n { ...result, usdtAddress: context.chain.contracts.usdt, actionId: action.id },\n )\n}\n","import {\n SDKError,\n assertTronAddress,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\n\nexport interface PositionAuthorizationInput {\n readonly tokenId: string\n readonly wallet: TronAddress | string\n readonly owner: TronAddress | string\n readonly approved?: TronAddress | string\n readonly operatorApproved?: boolean\n}\n\nexport function assertPositionAuthorized(input: PositionAuthorizationInput): void {\n const wallet = assertTronAddress(input.wallet, 'wallet')\n const owner = assertTronAddress(input.owner, 'owner')\n const approved = input.approved ? assertTronAddress(input.approved, 'approved') : undefined\n\n if (wallet === owner || wallet === approved || input.operatorApproved === true) return\n\n throw new SDKError('SDK_WALLET_CAPABILITY_ERROR', 'Wallet is not authorized for this position', {\n tokenId: input.tokenId,\n owner,\n wallet,\n operator: wallet,\n })\n}\n","import type { TransactionIntentScope } from '@sun-protocol/sun-sdk-core'\n\nexport const SUNSWAP_V3_POSITION_PROTOCOL_ID = 'sunswap-v3'\nexport const SUNSWAP_V4_POSITION_PROTOCOL_ID = 'sunswap-v4'\n\nexport function positionIntentScope(\n protocol: string,\n operation: string,\n): TransactionIntentScope<'position'> {\n return { domain: 'position', protocol, operation }\n}\n","import {\n SDKError,\n assertTronAddress,\n type BigintIsh,\n type Percent,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { TickMath } from '@sun-protocol/sun-sdk-sunswap-v3'\nimport {\n buildV4CollectAction,\n buildV4DecreaseLiquidityAction,\n buildV4MulticallAction,\n buildV4PositionApprovalForAllRead,\n buildV4PositionFeesRead,\n buildV4PositionReads,\n buildV4PoolSlot0Read,\n computeV4PoolId,\n createV4PoolKey,\n encodeV4ContractCallAction,\n type V4PoolKey,\n} from '@sun-protocol/sun-sdk-sunswap-v4'\nimport {\n applySlippageMin,\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n normalizeRecipient,\n} from '../common.js'\nimport {\n createContextExecutor,\n requireWalletAddress,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport { executeTransactionPlan } from '../execute-plan.js'\nimport { assertPositionAuthorized } from '../internal/positions.js'\nimport {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport { evmHexToTronAddress, normalizeLiquidityPercentage } from '../internal/tokens.js'\nimport { slippageToBips } from '../common.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V4PositionCollectInput,\n V4PositionFeesSnapshot,\n V4PositionReadInput,\n V4PositionRemoveInput,\n V4PositionSnapshot,\n} from './types.js'\nimport {\n positionIntentScope,\n SUNSWAP_V4_POSITION_PROTOCOL_ID,\n} from './intents.js'\n\ninterface V4PoolAndPositionInfoObjectResult {\n readonly poolKey?: unknown\n readonly tickLower?: unknown\n readonly tickUpper?: unknown\n}\n\ntype OptionalV4PoolKey<T> = T extends unknown\n ? Omit<T, 'poolKey'> & { readonly poolKey?: V4PoolKey }\n : never\n\ntype V4PositionRemovePlanInput = OptionalV4PoolKey<V4PositionRemoveInput>\ntype V4PositionCollectPlanInput = OptionalV4PoolKey<V4PositionCollectInput>\n\nconst Q96 = 1n << 96n\n\nfunction parseString(value: unknown, label: string): string {\n if (typeof value === 'bigint' || typeof value === 'number' || typeof value === 'string') {\n return BigInt(value.toString()).toString()\n }\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n}\n\nfunction parseNumber(value: unknown, label: string): number {\n const parsed = Number(parseString(value, label))\n if (!Number.isSafeInteger(parsed)) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be a safe integer`, { value })\n }\n return parsed\n}\n\nfunction unwrapSingle(value: unknown): unknown {\n return Array.isArray(value) && value.length === 1 ? value[0] : value\n}\n\nfunction parseAddress(value: unknown, label: string): TronAddress {\n const raw = String(unwrapSingle(value))\n try {\n return assertTronAddress(raw, label)\n } catch {\n const evmHex = /^41[0-9a-fA-F]{40}$/.test(raw) ? `0x${raw.slice(2)}` : raw\n return evmHexToTronAddress(evmHex, label)\n }\n}\n\nfunction parsePoolKey(value: unknown, network: ProtocolsContext['network']): V4PoolKey | undefined {\n if (Array.isArray(value) && value.length >= 5) {\n return createV4PoolKey({\n network,\n currencyA: parseAddress(value[0], 'poolKey.currency0'),\n currencyB: parseAddress(value[1], 'poolKey.currency1'),\n hooks: parseAddress(value[2], 'poolKey.hooks'),\n fee: parseNumber(value[3], 'poolKey.fee'),\n parameters: String(value[4]),\n })\n }\n if (typeof value === 'object' && value !== null) {\n const key = value as Record<string, unknown>\n if (key.currency0 !== undefined && key.currency1 !== undefined && key.hooks !== undefined\n && key.fee !== undefined && key.parameters !== undefined) {\n return createV4PoolKey({\n network,\n currencyA: parseAddress(key.currency0, 'poolKey.currency0'),\n currencyB: parseAddress(key.currency1, 'poolKey.currency1'),\n hooks: parseAddress(key.hooks, 'poolKey.hooks'),\n fee: parseNumber(key.fee, 'poolKey.fee'),\n parameters: String(key.parameters),\n })\n }\n }\n return undefined\n}\n\nfunction signed24(value: bigint): number {\n const masked = value & 0xffffffn\n return Number((masked & 0x800000n) === 0n ? masked : masked - 0x1000000n)\n}\n\nfunction parsePackedPositionInfo(value: unknown): Pick<V4PositionSnapshot, 'tickLower' | 'tickUpper'> {\n const info = BigInt(String(unwrapSingle(value)))\n return {\n tickLower: signed24(info >> 8n),\n tickUpper: signed24(info >> 32n),\n }\n}\n\nfunction parseOptionalPoolInfo(\n result: unknown,\n network: ProtocolsContext['network'],\n): Pick<V4PositionSnapshot, 'poolKey' | 'tickLower' | 'tickUpper'> {\n if (Array.isArray(result)) {\n const poolKey = parsePoolKey(result[0], network)\n const ticks = result[2] !== undefined\n ? {\n tickLower: parseNumber(result[1], 'tickLower'),\n tickUpper: parseNumber(result[2], 'tickUpper'),\n }\n : result[1] !== undefined\n ? parsePackedPositionInfo(result[1])\n : {}\n return {\n ...(poolKey !== undefined ? { poolKey } : {}),\n ...ticks,\n }\n }\n\n if (typeof result === 'object' && result !== null) {\n const info = result as V4PoolAndPositionInfoObjectResult\n const poolKey = parsePoolKey(info.poolKey, network)\n return {\n ...(poolKey !== undefined ? { poolKey } : {}),\n ...(info.tickLower !== undefined ? { tickLower: parseNumber(info.tickLower, 'tickLower') } : {}),\n ...(info.tickUpper !== undefined ? { tickUpper: parseNumber(info.tickUpper, 'tickUpper') } : {}),\n }\n }\n\n return {}\n}\n\nfunction parseFeesResult(result: unknown): Pick<V4PositionFeesSnapshot, 'feesOwed0' | 'feesOwed1'> {\n const value = unwrapSingle(result)\n if (Array.isArray(value) && value.length >= 2) {\n return {\n feesOwed0: parseString(value[0], 'feesOwed0'),\n feesOwed1: parseString(value[1], 'feesOwed1'),\n }\n }\n if (typeof value === 'object' && value !== null) {\n const fees = value as Record<string, unknown>\n if (fees.feesOwed0 !== undefined && fees.feesOwed1 !== undefined) {\n return {\n feesOwed0: parseString(fees.feesOwed0, 'feesOwed0'),\n feesOwed1: parseString(fees.feesOwed1, 'feesOwed1'),\n }\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position fee result is malformed', { result })\n}\n\nfunction liquidityFromPercentage(totalLiquidity: BigintIsh, percentage: Percent): string {\n const total = BigInt(normalizeBaseUnitAmount(totalLiquidity, 'currentLiquidity'))\n const numerator = BigInt(percentage.numerator.toString())\n const denominator = BigInt(percentage.denominator.toString())\n const liquidity = (total * numerator) / denominator\n if (liquidity <= 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'percentage resolves to zero liquidity', {\n totalLiquidity: total.toString(),\n percentage: percentage.toSignificant(),\n })\n }\n return liquidity.toString()\n}\n\nfunction resolveRemoveLiquidity(input: V4PositionRemovePlanInput, snapshotLiquidity: string): string {\n const normalizedSnapshotLiquidity = normalizeBaseUnitAmount(snapshotLiquidity, 'position liquidity')\n if (input.currentLiquidity !== undefined && input.validationMode !== 'legacy') {\n const expectedLiquidity = normalizeBaseUnitAmount(input.currentLiquidity, 'currentLiquidity')\n if (expectedLiquidity !== normalizedSnapshotLiquidity) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'currentLiquidity is stale and does not match the on-chain position', {\n currentLiquidity: expectedLiquidity,\n positionLiquidity: normalizedSnapshotLiquidity,\n })\n }\n }\n\n const liquidity = input.liquidity !== undefined\n ? normalizeBaseUnitAmount(input.liquidity, 'liquidity')\n : liquidityFromPercentage(normalizedSnapshotLiquidity, normalizeLiquidityPercentage(input.percentage, 'percentage'))\n if (BigInt(liquidity) > BigInt(normalizedSnapshotLiquidity) && input.validationMode === 'legacy') {\n return normalizedSnapshotLiquidity\n }\n if (BigInt(liquidity) > BigInt(normalizedSnapshotLiquidity)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'liquidity cannot exceed on-chain position liquidity', {\n liquidity,\n positionLiquidity: normalizedSnapshotLiquidity,\n })\n }\n return liquidity\n}\n\nfunction parseSqrtPriceX96(result: unknown): bigint {\n const value = Array.isArray(result)\n ? result[0]\n : typeof result === 'object' && result !== null\n ? (result as { readonly sqrtPriceX96?: unknown }).sqrtPriceX96\n : undefined\n try {\n const parsed = BigInt(String(value))\n if (parsed <= 0n) throw new Error('non-positive')\n return parsed\n } catch {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 slot0 result has an invalid sqrtPriceX96', { result })\n }\n}\n\nfunction removalAmounts(snapshot: V4PositionSnapshot, liquidity: string, sqrtPriceX96: bigint): readonly [bigint, bigint] {\n if (snapshot.tickLower === undefined || snapshot.tickUpper === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position is missing ticks required to derive removal minimums', {\n tokenId: snapshot.tokenId,\n })\n }\n const sqrtA = BigInt(TickMath.getSqrtRatioAtTick(snapshot.tickLower).toString())\n const sqrtB = BigInt(TickMath.getSqrtRatioAtTick(snapshot.tickUpper).toString())\n const positionLiquidity = BigInt(liquidity)\n if (sqrtPriceX96 <= sqrtA) {\n return [(positionLiquidity * (sqrtB - sqrtA) * Q96) / (sqrtA * sqrtB), 0n]\n }\n if (sqrtPriceX96 < sqrtB) {\n return [\n (positionLiquidity * (sqrtB - sqrtPriceX96) * Q96) / (sqrtPriceX96 * sqrtB),\n (positionLiquidity * (sqrtPriceX96 - sqrtA)) / Q96,\n ]\n }\n return [0n, (positionLiquidity * (sqrtB - sqrtA)) / Q96]\n}\n\nfunction resolvePositionPoolKey(\n tokenId: string,\n supplied: V4PoolKey | undefined,\n snapshot: V4PositionSnapshot,\n): { readonly poolKey: V4PoolKey; readonly derived: boolean } {\n if (snapshot.poolKey === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position does not include a poolKey', { tokenId })\n }\n if (supplied !== undefined) {\n const suppliedPoolId = computeV4PoolId(supplied)\n const positionPoolId = computeV4PoolId(snapshot.poolKey)\n if (suppliedPoolId !== positionPoolId) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V4 poolKey does not match the tokenId position', {\n tokenId,\n suppliedPoolId,\n positionPoolId,\n })\n }\n return { poolKey: supplied, derived: false }\n }\n return { poolKey: snapshot.poolKey, derived: true }\n}\n\nfunction assertTriggerRecipient(wallet: TronAddress, recipient: TronAddress, operation: string): void {\n if (wallet !== recipient) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${operation} recipient must match the triggering wallet`, {\n wallet,\n recipient,\n })\n }\n}\n\nfunction metadata(input: {\n readonly operation: string\n readonly tokenId: string\n readonly owner?: string\n readonly recipient?: string\n readonly deadline?: string\n readonly slippageBips?: number\n readonly poolKeyDerived?: boolean\n}): Record<string, unknown> {\n return {\n protocol: 'sunswap-v4',\n operation: input.operation,\n tokenId: input.tokenId,\n ...(input.owner !== undefined ? { owner: input.owner } : {}),\n ...(input.recipient !== undefined ? { recipient: input.recipient } : {}),\n ...(input.deadline !== undefined ? { deadline: input.deadline } : {}),\n ...(input.slippageBips !== undefined ? { slippageBips: input.slippageBips } : {}),\n ...(input.poolKeyDerived !== undefined ? { poolKeyDerived: input.poolKeyDerived } : {}),\n }\n}\n\nexport class V4PositionsClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n async read(input: V4PositionReadInput): Promise<V4PositionSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const reads = buildV4PositionReads({ network: this.context.network, tokenId, positionManager })\n const [poolInfoResult, liquidityResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n reads,\n 'V4 position read',\n )\n const owner = parseAddress(ownerResult, 'owner')\n const approved = approvedResult ? parseAddress(approvedResult, 'approved') : undefined\n const operator = input.operator ? assertTronAddress(input.operator, 'operator') : undefined\n const operatorApproved = operator\n ? Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV4PositionApprovalForAllRead({ network: this.context.network, owner, operator, positionManager }),\n 'V4 position operator approval read',\n ).then(unwrapSingle))\n : undefined\n\n return {\n protocol: 'sunswap-v4',\n tokenId,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n ...parseOptionalPoolInfo(poolInfoResult, this.context.network),\n liquidity: parseString(unwrapSingle(liquidityResult), 'liquidity'),\n }\n }\n\n async fees(input: V4PositionReadInput): Promise<V4PositionFeesSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const snapshot = await this.read(input)\n if (snapshot.poolKey === undefined || snapshot.tickLower === undefined || snapshot.tickUpper === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position does not include the context required to read fees', {\n tokenId,\n })\n }\n const result = await readRequiredContract<unknown>(\n this.context,\n buildV4PositionFeesRead({\n network: this.context.network,\n tokenId,\n poolId: computeV4PoolId(snapshot.poolKey),\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n poolManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PoolManager'),\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager'),\n lpFeeHelper: resolveProtocolContract(this.context, input.contracts, 'sunswapV4LpFeeHelper'),\n }),\n 'V4 position fee read',\n )\n return {\n protocol: 'sunswap-v4',\n tokenId,\n ...parseFeesResult(result),\n }\n }\n\n readonly remove = {\n plan: async (input: V4PositionRemovePlanInput): Promise<TransactionPlan> => this.planRemove(input),\n execute: async (input: V4PositionRemovePlanInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planRemove(input), createContextExecutor(this.context)),\n }\n\n readonly collect = {\n plan: async (input: V4PositionCollectPlanInput): Promise<TransactionPlan> => this.planCollect(input),\n execute: async (input: V4PositionCollectPlanInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planCollect(input), createContextExecutor(this.context)),\n }\n\n private async readAuthorizedPosition(\n tokenId: string,\n operation: string,\n contracts: V4PositionReadInput['contracts'],\n validationMode: V4PositionRemoveInput['validationMode'],\n ): Promise<{ wallet: TronAddress; snapshot: V4PositionSnapshot }> {\n const wallet = await requireWalletAddress(this.context, operation)\n const snapshot = await this.read({\n tokenId,\n ...(validationMode === 'legacy' ? {} : { operator: wallet }),\n ...(contracts !== undefined ? { contracts } : {}),\n })\n if (validationMode !== 'legacy') {\n assertPositionAuthorized({\n tokenId,\n wallet,\n owner: snapshot.owner,\n ...(snapshot.approved !== undefined ? { approved: snapshot.approved } : {}),\n ...(snapshot.operatorApproved !== undefined ? { operatorApproved: snapshot.operatorApproved } : {}),\n })\n }\n return { wallet, snapshot }\n }\n\n private async planRemove(input: V4PositionRemovePlanInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'position-v4-remove')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V4 remove position',\n input.contracts,\n input.validationMode,\n )\n const poolKey = resolvePositionPoolKey(tokenId, input.poolKey, snapshot)\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V4 remove position', wallet)\n assertTriggerRecipient(wallet, recipient, 'V4 remove position')\n const deadline = normalizeDeadline(this.context, input)\n const slippageBips = slippageToBips(input.slippage ?? '0.5%')\n const liquidity = resolveRemoveLiquidity(input, snapshot.liquidity)\n const derivedAmounts = input.amount0Min === undefined || input.amount1Min === undefined\n ? removalAmounts(\n snapshot,\n liquidity,\n parseSqrtPriceX96(await readRequiredContract<unknown>(\n this.context,\n buildV4PoolSlot0Read({\n network: this.context.network,\n poolId: computeV4PoolId(poolKey.poolKey),\n poolManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PoolManager'),\n }),\n 'V4 removal minimum quote',\n )),\n )\n : undefined\n const amount0Min = input.amount0Min !== undefined\n ? normalizeBaseUnitAmount(input.amount0Min, 'amount0Min', { allowZero: true })\n : input.roundingMode === 'half-up'\n ? (((derivedAmounts?.[0] ?? 0n) * BigInt(10_000 - slippageBips) + 5_000n) / 10_000n).toString()\n : applySlippageMin(derivedAmounts?.[0] ?? 0n, slippageBips).toString()\n const amount1Min = input.amount1Min !== undefined\n ? normalizeBaseUnitAmount(input.amount1Min, 'amount1Min', { allowZero: true })\n : input.roundingMode === 'half-up'\n ? (((derivedAmounts?.[1] ?? 0n) * BigInt(10_000 - slippageBips) + 5_000n) / 10_000n).toString()\n : applySlippageMin(derivedAmounts?.[1] ?? 0n, slippageBips).toString()\n const decreaseAction = buildV4DecreaseLiquidityAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n tokenId,\n liquidity,\n amount0Min,\n amount1Min,\n recipient,\n deadline,\n ...(input.settlementMode !== undefined ? { settlementMode: input.settlementMode } : {}),\n ...(input.hookData !== undefined ? { hookData: input.hookData } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const transactionAction = input.transactionMode === 'multicall'\n ? buildV4MulticallAction({\n network: this.context.network,\n positionManager,\n calls: [encodeV4ContractCallAction(decreaseAction)],\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n : decreaseAction\n const action = {\n ...transactionAction,\n intent: {\n kind: 'remove-liquidity' as const,\n scope: positionIntentScope(SUNSWAP_V4_POSITION_PROTOCOL_ID, 'remove-position'),\n positionId: tokenId,\n },\n }\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: {\n title: 'Remove SunSwap V4 position liquidity',\n lines: [`Position ${tokenId}`, `Recipient ${recipient}`],\n },\n approvals: [],\n transactions: [action],\n metadata: metadata({\n operation: 'remove-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n slippageBips,\n poolKeyDerived: poolKey.derived,\n }),\n }\n }\n\n private async planCollect(input: V4PositionCollectPlanInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'position-v4-collect')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V4 collect position',\n input.contracts,\n input.validationMode,\n )\n const poolKey = resolvePositionPoolKey(tokenId, input.poolKey, snapshot)\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V4 collect position', wallet)\n assertTriggerRecipient(wallet, recipient, 'V4 collect position')\n const deadline = normalizeDeadline(this.context, input)\n const action = buildV4CollectAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n tokenId,\n recipient,\n deadline,\n ...(input.settlementMode !== undefined ? { settlementMode: input.settlementMode } : {}),\n ...(input.hookData !== undefined ? { hookData: input.hookData } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const transactionAction = input.transactionMode === 'multicall'\n ? buildV4MulticallAction({\n network: this.context.network,\n positionManager,\n calls: [encodeV4ContractCallAction(action)],\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n : action\n const transaction = {\n ...transactionAction,\n intent: {\n kind: 'collect-fees' as const,\n scope: positionIntentScope(SUNSWAP_V4_POSITION_PROTOCOL_ID, 'collect-position'),\n positionId: tokenId,\n },\n }\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: {\n title: 'Collect SunSwap V4 position fees',\n lines: [`Position ${tokenId}`, `Recipient ${recipient}`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: metadata({\n operation: 'collect-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n poolKeyDerived: poolKey.derived,\n }),\n }\n }\n}\n","import type { ProtocolsContext } from '../context.js'\nimport { V3PositionsClient } from './v3.js'\nimport { V4PositionsClient } from './v4.js'\n\nexport class PositionsClient {\n readonly v3: {\n readonly read: V3PositionsClient['read']\n readonly remove: V3PositionsClient['remove']\n readonly collect: V3PositionsClient['collect']\n }\n readonly v4: {\n readonly read: V4PositionsClient['read']\n readonly fees: V4PositionsClient['fees']\n readonly remove: V4PositionsClient['remove']\n readonly collect: V4PositionsClient['collect']\n }\n\n constructor(context: ProtocolsContext) {\n const v3Client = new V3PositionsClient(context)\n const v4Client = new V4PositionsClient(context)\n this.v3 = {\n read: (input) => v3Client.read(input),\n remove: v3Client.remove,\n collect: v3Client.collect,\n }\n this.v4 = {\n read: (input) => v4Client.read(input),\n fees: (input) => v4Client.fees(input),\n remove: v4Client.remove,\n collect: v4Client.collect,\n }\n }\n}\n\nexport function createPositionsClient(context: ProtocolsContext): PositionsClient {\n return new PositionsClient(context)\n}\n","import type { SunPumpQuery } from '@sun-protocol/sun-sdk-api'\nimport {\n getLaunchpadTokenBalance,\n getLaunchpadTokenInfo,\n getLaunchpadTokenState,\n readLaunchpadAllowance,\n} from '@sun-protocol/sun-sdk-launchpad'\nimport { SDKError, assertTronAddress } from '@sun-protocol/sun-sdk-core'\nimport { requireRuntime, type ProtocolsContext } from '../context.js'\nimport { PumpBuyClient } from './buy.js'\nimport { PumpLaunchClient } from './launch-client.js'\nimport { PumpSellClient } from './sell.js'\nimport type {\n PumpClientShape,\n PumpTokenInput,\n} from './types.js'\n\nexport class PumpClient implements PumpClientShape {\n readonly buy: PumpBuyClient\n readonly sell: PumpSellClient\n readonly launch: PumpLaunchClient\n\n readonly tokens = {\n list: async (query: SunPumpQuery = {}) => this.requireApi().listTokens(query),\n get: async (token: string) => this.requireApi().getToken(token),\n search: async (query: SunPumpQuery = {}) => this.requireApi().searchTokens(query),\n searchV2: async (query: SunPumpQuery = {}) => this.requireApi().searchTokensV2(query),\n byOwner: async (query: SunPumpQuery) => this.requireApi().tokensByOwner(query),\n holders: async (query: SunPumpQuery) => this.requireApi().tokenHolders(query),\n holdersV2: async (query: SunPumpQuery) => this.requireApi().tokenHoldersV2(query),\n favors: async (query: SunPumpQuery) => this.requireApi().userFavors(query),\n ranking: async (query: SunPumpQuery) => this.requireApi().ranking(query),\n kingOfHill: async () => this.requireApi().kingOfHill(),\n pumpList: async () => this.requireApi().pumpTokenList(),\n transactions: async (token: string, query: SunPumpQuery = {}) =>\n this.requireApi().tokenTransactions(token, query),\n ownerTransactions: async (owner: string, query: SunPumpQuery = {}) =>\n this.requireApi().userTransactions(owner, query),\n }\n\n constructor(private readonly context: ProtocolsContext) {\n this.buy = new PumpBuyClient(context)\n this.sell = new PumpSellClient(context)\n this.launch = new PumpLaunchClient(context)\n }\n\n state(input: PumpTokenInput) {\n return getLaunchpadTokenState(\n requireRuntime(this.context, 'Pump state read'),\n assertTronAddress(input.token, 'token'),\n )\n }\n\n info(input: PumpTokenInput) {\n return getLaunchpadTokenInfo(\n requireRuntime(this.context, 'Pump token info read'),\n assertTronAddress(input.token, 'token'),\n )\n }\n\n balance(input: PumpTokenInput & { readonly owner: string }) {\n return getLaunchpadTokenBalance(\n requireRuntime(this.context, 'Pump balance read'),\n assertTronAddress(input.token, 'token'),\n input.owner,\n )\n }\n\n allowance(input: PumpTokenInput & { readonly owner: string; readonly spender?: string }) {\n return readLaunchpadAllowance(\n requireRuntime(this.context, 'Pump allowance read'),\n assertTronAddress(input.token, 'token'),\n input.owner,\n input.spender ?? this.context.chain.contracts.launchpad,\n )\n }\n\n async portfolio(owner: string, query: SunPumpQuery = {}) {\n return this.requireApi().portfolio(owner, query)\n }\n\n private requireApi() {\n if (!this.context.sunPumpApi) {\n throw new SDKError('SDK_UNSUPPORTED_NETWORK', 'SunPump API is unavailable on this network', {\n network: this.context.network,\n })\n }\n return this.context.sunPumpApi\n }\n}\n\nexport function createPumpClient(context: ProtocolsContext): PumpClient {\n return new PumpClient(context)\n}\n","import {\n getLaunchpadTokenState,\n LaunchpadTokenState,\n quoteLaunchpadBuyExactToken,\n quoteLaunchpadBuyExactTrx,\n} from '@sun-protocol/sun-sdk-launchpad'\nimport {\n SDKError,\n assertTronAddress,\n type TransactionAction,\n} from '@sun-protocol/sun-sdk-core'\nimport { normalizeBaseUnitAmount } from '../common.js'\nimport { requireRuntime, type ProtocolsContext } from '../context.js'\nimport {\n executePlanAction,\n executePlanTransactions,\n executeTransactionPlan,\n isTransactionPlan,\n} from '../execute-plan.js'\nimport type {\n ExecutedActionResult,\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport { createPumpExecutor } from './execute.js'\nimport { planPumpBuy } from './plan-buy.js'\nimport type {\n PumpBuyClientShape,\n PumpBuyExactTokenQuote,\n PumpBuyInput,\n PumpBuyQuote,\n PumpQuoteBuyExactTokenInput,\n PumpQuoteBuyInput,\n} from './types.js'\nimport {\n pumpV2BuyPath,\n readPumpV2AmountsIn,\n readPumpV2AmountsOut,\n requirePumpV2Amount,\n} from './v2.js'\nimport { assertPumpPlan } from './workflow.js'\n\nconst PUMP_BUY_OPERATIONS = [\n 'launchpad-buy-exact-trx',\n 'launchpad-buy-exact-token',\n 'pump-v2-buy-exact-trx',\n 'pump-v2-buy-exact-token',\n] as const\n\nasync function quotePumpBuyByTrx(\n context: ProtocolsContext,\n input: PumpQuoteBuyInput,\n): Promise<PumpBuyQuote> {\n const runtime = requireRuntime(context, 'Pump buy quote')\n const token = assertTronAddress(input.token, 'token')\n const trxAmount = normalizeBaseUnitAmount(input.trxAmount, 'trxAmount')\n const state = await getLaunchpadTokenState(runtime, token)\n if (state === LaunchpadTokenState.TRADING) {\n return quoteLaunchpadBuyExactTrx(runtime, token, trxAmount)\n }\n if (state === LaunchpadTokenState.LAUNCHED) {\n const path = pumpV2BuyPath(context, token)\n const amounts = await readPumpV2AmountsOut(context, runtime, trxAmount, path)\n return {\n tokenAmount: requirePumpV2Amount(amounts, amounts.length - 1, 'pump-v2-buy-quote'),\n fee: '0',\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'Token is not trading on SunPump', { token, state })\n}\n\nasync function quotePumpBuyByToken(\n context: ProtocolsContext,\n input: PumpQuoteBuyExactTokenInput,\n): Promise<PumpBuyExactTokenQuote> {\n const runtime = requireRuntime(context, 'Pump exact-token buy quote')\n const token = assertTronAddress(input.token, 'token')\n const tokenAmount = normalizeBaseUnitAmount(input.tokenAmount, 'tokenAmount')\n const state = await getLaunchpadTokenState(runtime, token)\n if (state === LaunchpadTokenState.TRADING) {\n return quoteLaunchpadBuyExactToken(runtime, token, tokenAmount)\n }\n if (state === LaunchpadTokenState.LAUNCHED) {\n const path = pumpV2BuyPath(context, token)\n const amounts = await readPumpV2AmountsIn(context, runtime, tokenAmount, path)\n return {\n trxAmount: requirePumpV2Amount(amounts, 0, 'pump-v2-buy-exact-token-quote'),\n fee: '0',\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'Token is not trading on SunPump', { token, state })\n}\n\nexport class PumpBuyClient implements PumpBuyClientShape {\n constructor(private readonly context: ProtocolsContext) {}\n\n quote(input: PumpQuoteBuyInput): Promise<PumpBuyQuote>\n quote(input: PumpQuoteBuyExactTokenInput): Promise<PumpBuyExactTokenQuote>\n quote(\n input: PumpQuoteBuyInput | PumpQuoteBuyExactTokenInput,\n ): Promise<PumpBuyQuote | PumpBuyExactTokenQuote> {\n const candidate = input as Partial<PumpQuoteBuyInput & PumpQuoteBuyExactTokenInput>\n const hasTrxAmount = candidate.trxAmount !== undefined\n const hasTokenAmount = candidate.tokenAmount !== undefined\n if (hasTrxAmount === hasTokenAmount) {\n throw new SDKError(\n 'SDK_INVALID_ARGUMENT',\n 'Pump buy quote requires exactly one of trxAmount or tokenAmount',\n )\n }\n return hasTrxAmount\n ? quotePumpBuyByTrx(this.context, input as PumpQuoteBuyInput)\n : quotePumpBuyByToken(this.context, input as PumpQuoteBuyExactTokenInput)\n }\n\n plan(input: PumpBuyInput): Promise<TransactionPlan> {\n return planPumpBuy(this.context, input)\n }\n\n executeAction(action: TransactionAction): Promise<ExecutedActionResult> {\n return executePlanAction(action, createPumpExecutor(this.context))\n }\n\n submit(plan: TransactionPlan): Promise<TransactionPlanExecutionResult> {\n assertPumpPlan(plan, PUMP_BUY_OPERATIONS, 'Pump buy')\n return executePlanTransactions(plan, createPumpExecutor(this.context))\n }\n\n async execute(\n input: PumpBuyInput | TransactionPlan,\n ): Promise<TransactionPlanExecutionResult> {\n const plan = isTransactionPlan(input)\n ? input\n : await planPumpBuy(this.context, input)\n assertPumpPlan(plan, PUMP_BUY_OPERATIONS, 'Pump buy')\n return executeTransactionPlan(plan, createPumpExecutor(this.context))\n }\n}\n","import {\n buildV2SwapEthForExactTokensAction,\n buildV2SwapExactEthForTokensAction,\n buildV2SwapExactTokensForEthAction,\n buildV2SwapExactTokensForTokensAction,\n buildV2SwapTokensForExactEthAction,\n buildV2SwapTokensForExactTokensAction,\n} from '@sun-protocol/sun-sdk-sunswap-v2'\nimport {\n SDKError,\n createDeferredContractCallAction,\n type ContractCallAction,\n type DeferredContractCallAction,\n type JsonObject,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { resolveTransactionDeadline } from '../common.js'\nimport type { ProtocolsContext } from '../context.js'\n\nexport const V2_SWAP_MATERIALIZATION_KIND = 'sunswap-v2-swap'\n\nexport type V2SwapOperation =\n | 'swap-exact-eth-for-tokens'\n | 'swap-eth-for-exact-tokens'\n | 'swap-exact-tokens-for-eth'\n | 'swap-exact-tokens-for-tokens'\n | 'swap-tokens-for-exact-eth'\n | 'swap-tokens-for-exact-tokens'\n\nexport interface V2SwapMaterializationData {\n readonly operation: V2SwapOperation\n readonly path: readonly TronAddress[]\n readonly recipient: TronAddress\n readonly transactionValidForSeconds: number\n readonly amountIn?: string\n readonly amountOut?: string\n readonly amountOutMin?: string\n readonly amountInMax?: string\n}\n\nfunction requireAmount(data: V2SwapMaterializationData, key: 'amountIn' | 'amountOut' | 'amountOutMin' | 'amountInMax'): string {\n const value = data[key]\n if (value === undefined) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Deferred V2 swap is missing ${key}`, {\n operation: data.operation,\n key,\n })\n }\n return value\n}\n\nexport function createDeferredV2SwapAction(input: {\n readonly data: V2SwapMaterializationData\n}): DeferredContractCallAction {\n return createDeferredContractCallAction({\n id: `sunswap-v2-${input.data.operation}`,\n materialization: {\n kind: V2_SWAP_MATERIALIZATION_KIND,\n data: input.data as unknown as JsonObject,\n },\n })\n}\n\nexport async function materializeV2SwapAction(\n context: ProtocolsContext,\n action: DeferredContractCallAction,\n): Promise<ContractCallAction> {\n if (action.materialization.kind !== V2_SWAP_MATERIALIZATION_KIND) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Unsupported deferred action kind: ${action.materialization.kind}`)\n }\n\n const data = action.materialization.data as unknown as V2SwapMaterializationData\n const options = {\n network: context.network,\n id: action.id,\n path: data.path,\n recipient: data.recipient,\n deadline: await resolveTransactionDeadline(context, data.transactionValidForSeconds),\n }\n\n switch (data.operation) {\n case 'swap-exact-eth-for-tokens':\n return buildV2SwapExactEthForTokensAction({\n ...options,\n amountIn: requireAmount(data, 'amountIn'),\n amountOutMin: requireAmount(data, 'amountOutMin'),\n })\n case 'swap-eth-for-exact-tokens':\n return buildV2SwapEthForExactTokensAction({\n ...options,\n amountOut: requireAmount(data, 'amountOut'),\n amountInMax: requireAmount(data, 'amountInMax'),\n })\n case 'swap-exact-tokens-for-eth':\n return buildV2SwapExactTokensForEthAction({\n ...options,\n amountIn: requireAmount(data, 'amountIn'),\n amountOutMin: requireAmount(data, 'amountOutMin'),\n })\n case 'swap-exact-tokens-for-tokens':\n return buildV2SwapExactTokensForTokensAction({\n ...options,\n amountIn: requireAmount(data, 'amountIn'),\n amountOutMin: requireAmount(data, 'amountOutMin'),\n })\n case 'swap-tokens-for-exact-eth':\n return buildV2SwapTokensForExactEthAction({\n ...options,\n amountOut: requireAmount(data, 'amountOut'),\n amountInMax: requireAmount(data, 'amountInMax'),\n })\n case 'swap-tokens-for-exact-tokens':\n return buildV2SwapTokensForExactTokensAction({\n ...options,\n amountOut: requireAmount(data, 'amountOut'),\n amountInMax: requireAmount(data, 'amountInMax'),\n })\n }\n}\n","import { createContextExecutor, type ProtocolsContext } from '../context.js'\nimport type { TransactionPlanExecutor } from '../execute-plan.js'\nimport { materializeV2SwapAction } from '../internal/v2-swap-action.js'\n\n/** Creates an executor for standalone V2 swaps. */\nexport function createV2SwapExecutor(context: ProtocolsContext): TransactionPlanExecutor {\n return {\n ...createContextExecutor(context),\n materializeAction: (action) => materializeV2SwapAction(context, action),\n }\n}\n","import type { ProtocolsContext } from '../context.js'\nimport { createV2SwapExecutor } from '../swap/v2-execute.js'\n\n/** Creates an executor for Pump plans, including launched-token V2 actions. */\nexport function createPumpExecutor(context: ProtocolsContext) {\n return createV2SwapExecutor(context)\n}\n","import {\n applySlippageMax,\n applySlippageMin,\n createLaunchpadBuyAction,\n getLaunchpadTokenState,\n LaunchpadTokenState,\n quoteLaunchpadBuyExactToken,\n quoteLaunchpadBuyExactTrx,\n} from '@sun-protocol/sun-sdk-launchpad'\nimport { SDKError, assertTronAddress } from '@sun-protocol/sun-sdk-core'\nimport {\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeRecipient,\n normalizeTransactionValidForSeconds,\n slippageToBips,\n} from '../common.js'\nimport { requireRuntime, requireWalletSnapshot, type ProtocolsContext } from '../context.js'\nimport { createDeferredV2SwapAction } from '../internal/v2-swap-action.js'\nimport type { TransactionPlan } from '../types/plan.js'\nimport type { PumpBuyInput } from './types.js'\nimport {\n pumpV2BuyPath,\n readPumpV2AmountsIn,\n readPumpV2AmountsOut,\n requirePumpV2Amount,\n} from './v2.js'\nimport {\n pumpIntentScope,\n SUNPUMP_LAUNCHPAD_PROTOCOL_ID,\n SUNPUMP_V2_PROTOCOL_ID,\n} from './intents.js'\n\ntype PumpBuyMode =\n | {\n readonly kind: 'exact-trx'\n readonly trxAmount: string\n }\n | {\n readonly kind: 'exact-token'\n readonly tokenAmount: string\n }\n\nfunction normalizePumpBuyMode(input: PumpBuyInput): PumpBuyMode {\n const trxAmount = input.trxAmount\n const tokenAmount = input.tokenAmount\n if ((trxAmount === undefined) === (tokenAmount === undefined)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Pump buy requires exactly one of trxAmount or tokenAmount', {\n trxAmount,\n tokenAmount,\n })\n }\n if (trxAmount !== undefined) {\n return {\n kind: 'exact-trx',\n trxAmount: normalizeBaseUnitAmount(trxAmount, 'trxAmount'),\n }\n }\n if (tokenAmount === undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Pump buy requires tokenAmount', {\n trxAmount,\n tokenAmount,\n })\n }\n return {\n kind: 'exact-token',\n tokenAmount: normalizeBaseUnitAmount(tokenAmount, 'tokenAmount'),\n }\n}\n\nexport async function planPumpBuy(\n context: ProtocolsContext,\n input: PumpBuyInput,\n): Promise<TransactionPlan> {\n const runtime = requireRuntime(context, 'Pump buy planning')\n const { address: owner } = await requireWalletSnapshot(context, 'Pump buy planning')\n const token = assertTronAddress(input.token, 'token')\n const mode = normalizePumpBuyMode(input)\n const state = await getLaunchpadTokenState(runtime, token)\n if (state !== LaunchpadTokenState.TRADING && state !== LaunchpadTokenState.LAUNCHED) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'Token is not trading on SunPump', {\n token,\n state,\n })\n }\n\n const slippageBips = slippageToBips(input.slippage ?? '5%')\n\n if (state === LaunchpadTokenState.TRADING) {\n let trxAmount: string\n let quotedTokenAmount: string\n let fee: string\n let operation: 'launchpad-buy-exact-trx' | 'launchpad-buy-exact-token'\n let requestedTokenAmount: string | undefined\n\n if (mode.kind === 'exact-trx') {\n const quote = await quoteLaunchpadBuyExactTrx(runtime, token, mode.trxAmount)\n trxAmount = mode.trxAmount\n quotedTokenAmount = quote.tokenAmount\n fee = quote.fee\n operation = 'launchpad-buy-exact-trx'\n } else {\n const quote = await quoteLaunchpadBuyExactToken(runtime, token, mode.tokenAmount)\n trxAmount = quote.trxAmount\n quotedTokenAmount = mode.tokenAmount\n fee = quote.fee\n operation = 'launchpad-buy-exact-token'\n requestedTokenAmount = mode.tokenAmount\n }\n\n const minTokenOut = applySlippageMin(BigInt(quotedTokenAmount), slippageBips).toString()\n const transaction = {\n ...createLaunchpadBuyAction({\n launchpad: context.chain.contracts.launchpad,\n token,\n trxAmount,\n minTokenOut,\n }),\n intent: {\n kind: 'pump-buy' as const,\n scope: pumpIntentScope(SUNPUMP_LAUNCHPAD_PROTOCOL_ID, operation),\n token,\n },\n }\n\n return {\n id: nextPlanId(context, 'pump-buy'),\n kind: 'pump',\n network: context.network,\n owner,\n summary: {\n title: 'Buy SunPump token',\n lines: [`Spend ${trxAmount} sun`, `Receive at least ${minTokenOut} token units`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: {\n operation,\n token,\n trxAmount,\n ...(requestedTokenAmount ? { tokenAmount: requestedTokenAmount } : {}),\n quotedTokenAmount,\n quotedTrxAmount: trxAmount,\n fee,\n minTokenOut,\n slippageBips,\n },\n }\n }\n\n const path = pumpV2BuyPath(context, token)\n const recipient = await normalizeRecipient(context, input.recipient, 'Pump V2 buy recipient', owner)\n const transactionValidForSeconds = normalizeTransactionValidForSeconds(input.transactionValidForSeconds)\n\n if (mode.kind === 'exact-trx') {\n const amounts = await readPumpV2AmountsOut(context, runtime, mode.trxAmount, path)\n const quotedTokenAmount = requirePumpV2Amount(amounts, amounts.length - 1, 'pump-v2-buy-exact-trx')\n const minTokenOut = applySlippageMin(BigInt(quotedTokenAmount), slippageBips).toString()\n const transaction = {\n ...createDeferredV2SwapAction({\n data: {\n operation: 'swap-exact-eth-for-tokens',\n amountIn: mode.trxAmount,\n amountOutMin: minTokenOut,\n path,\n recipient,\n transactionValidForSeconds,\n },\n }),\n intent: {\n kind: 'pump-buy' as const,\n scope: pumpIntentScope(SUNPUMP_V2_PROTOCOL_ID, 'buy-exact-trx'),\n token,\n },\n }\n\n return {\n id: nextPlanId(context, 'pump-buy'),\n kind: 'pump',\n network: context.network,\n owner,\n summary: {\n title: 'Buy launched Pump token',\n lines: [`Spend ${mode.trxAmount} sun`, `Receive at least ${minTokenOut} token units`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: {\n operation: 'pump-v2-buy-exact-trx',\n token,\n trxAmount: mode.trxAmount,\n quotedTokenAmount,\n minTokenOut,\n slippageBips,\n path,\n recipient,\n transactionValidForSeconds,\n },\n }\n }\n\n const amounts = await readPumpV2AmountsIn(context, runtime, mode.tokenAmount, path)\n const quotedTrxAmount = requirePumpV2Amount(amounts, 0, 'pump-v2-buy-exact-token')\n const maxTrxIn = applySlippageMax(BigInt(quotedTrxAmount), slippageBips).toString()\n const transaction = {\n ...createDeferredV2SwapAction({\n data: {\n operation: 'swap-eth-for-exact-tokens',\n amountOut: mode.tokenAmount,\n amountInMax: maxTrxIn,\n path,\n recipient,\n transactionValidForSeconds,\n },\n }),\n intent: {\n kind: 'pump-buy' as const,\n scope: pumpIntentScope(SUNPUMP_V2_PROTOCOL_ID, 'buy-exact-token'),\n token,\n },\n }\n\n return {\n id: nextPlanId(context, 'pump-buy'),\n kind: 'pump',\n network: context.network,\n owner,\n summary: {\n title: 'Buy launched Pump token',\n lines: [`Spend at most ${maxTrxIn} sun`, `Receive ${mode.tokenAmount} token units`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: {\n operation: 'pump-v2-buy-exact-token',\n token,\n tokenAmount: mode.tokenAmount,\n quotedTrxAmount,\n maxTrxIn,\n slippageBips,\n path,\n recipient,\n transactionValidForSeconds,\n },\n }\n}\n","import {\n buildV2RouterAmountsInRead,\n buildV2RouterAmountsOutRead,\n normalizeV2AmountsResult,\n} from '@sun-protocol/sun-sdk-sunswap-v2'\nimport { SDKError, type TronAddress } from '@sun-protocol/sun-sdk-core'\nimport type { Runtime } from '@sun-protocol/sun-sdk-runtime'\nimport type { ProtocolsContext } from '../context.js'\n\nexport function pumpV2BuyPath(context: ProtocolsContext, token: TronAddress): readonly TronAddress[] {\n return [context.chain.contracts.wtrx, token]\n}\n\nexport function pumpV2SellPath(context: ProtocolsContext, token: TronAddress): readonly TronAddress[] {\n return [token, context.chain.contracts.wtrx]\n}\n\nexport async function readPumpV2AmountsOut(\n context: ProtocolsContext,\n runtime: Runtime,\n amountIn: string,\n path: readonly TronAddress[],\n): Promise<readonly string[]> {\n const result = await runtime.readContract<unknown>(\n buildV2RouterAmountsOutRead({\n network: context.network,\n amountIn,\n path,\n }),\n )\n return normalizeV2AmountsResult(result)\n}\n\nexport async function readPumpV2AmountsIn(\n context: ProtocolsContext,\n runtime: Runtime,\n amountOut: string,\n path: readonly TronAddress[],\n): Promise<readonly string[]> {\n const result = await runtime.readContract<unknown>(\n buildV2RouterAmountsInRead({\n network: context.network,\n amountOut,\n path,\n }),\n )\n return normalizeV2AmountsResult(result)\n}\n\nexport function requirePumpV2Amount(\n amounts: readonly string[],\n index: number,\n operation: string,\n): string {\n const amount = amounts[index]\n if (amount === undefined) {\n throw new SDKError('SDK_NO_ROUTE', 'SunSwap V2 returned no Pump route amount', {\n operation,\n index,\n amounts,\n })\n }\n return amount\n}\n","import type { TransactionIntentScope } from '@sun-protocol/sun-sdk-core'\n\nexport const SUNPUMP_LAUNCHPAD_PROTOCOL_ID = 'sunpump-launchpad'\nexport const SUNPUMP_V2_PROTOCOL_ID = 'sunpump-v2'\n\nexport function pumpIntentScope(\n protocol: string,\n operation: string,\n): TransactionIntentScope<'pump'> {\n return { domain: 'pump', protocol, operation }\n}\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\nimport type { TransactionPlan } from '../types/plan.js'\n\nexport function assertPumpPlan(\n plan: TransactionPlan,\n operations: readonly string[],\n clientName: string,\n): void {\n const operation = plan.metadata.operation\n if (\n plan.kind !== 'pump' ||\n typeof operation !== 'string' ||\n !operations.includes(operation) ||\n plan.transactions.length === 0\n ) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Expected a ${clientName} plan`, {\n planId: plan.id,\n kind: plan.kind,\n operation,\n transactionCount: plan.transactions.length,\n })\n }\n}\n","import { createHttpRequestAction, SDKError } from '@sun-protocol/sun-sdk-core'\nimport { nextPlanId } from '../common.js'\nimport type { ProtocolsContext } from '../context.js'\nimport type { TransactionPlan } from '../types/plan.js'\nimport type { AgentTokenLaunchParams } from './types.js'\n\nexport function planPumpAgentLaunch(\n context: ProtocolsContext,\n input: AgentTokenLaunchParams,\n): TransactionPlan {\n const baseUrl = context.endpoints.sunPump\n if (!baseUrl) {\n throw new SDKError('SDK_UNSUPPORTED_NETWORK', 'SunPump API is unavailable on this network', {\n network: context.network,\n })\n }\n const normalizedBaseUrl = baseUrl.replace(/\\/+$/, '')\n const transaction = createHttpRequestAction({\n id: `pump-agent-launch-${input.symbol}`,\n request: {\n method: 'POST',\n url: `${normalizedBaseUrl}/ai/agentTokenLaunch`,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: input,\n },\n })\n return {\n id: nextPlanId(context, 'pump-launch'),\n kind: 'pump',\n network: context.network,\n summary: {\n title: 'Launch SunPump token',\n lines: [`Launch ${input.name} (${input.symbol})`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: {\n operation: 'pump-agent-launch',\n symbol: input.symbol,\n },\n }\n}\n","import type { TransactionAction } from '@sun-protocol/sun-sdk-core'\nimport type { ProtocolsContext } from '../context.js'\nimport {\n executePlanAction,\n executePlanTransactions,\n executeTransactionPlan,\n isTransactionPlan,\n} from '../execute-plan.js'\nimport type {\n ExecutedActionResult,\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport { createPumpExecutor } from './execute.js'\nimport { planPumpAgentLaunch } from './launch.js'\nimport type { AgentTokenLaunchParams, PumpLaunchClientShape } from './types.js'\nimport { assertPumpPlan } from './workflow.js'\n\nconst PUMP_LAUNCH_OPERATIONS = ['pump-agent-launch'] as const\n\nexport class PumpLaunchClient implements PumpLaunchClientShape {\n constructor(private readonly context: ProtocolsContext) {}\n\n plan(input: AgentTokenLaunchParams): Promise<TransactionPlan> {\n return Promise.resolve(planPumpAgentLaunch(this.context, input))\n }\n\n executeAction(action: TransactionAction): Promise<ExecutedActionResult> {\n return executePlanAction(action, createPumpExecutor(this.context))\n }\n\n submit(plan: TransactionPlan): Promise<TransactionPlanExecutionResult> {\n assertPumpPlan(plan, PUMP_LAUNCH_OPERATIONS, 'Pump launch')\n return executePlanTransactions(plan, createPumpExecutor(this.context))\n }\n\n async execute(\n input: AgentTokenLaunchParams | TransactionPlan,\n ): Promise<TransactionPlanExecutionResult> {\n const plan = isTransactionPlan(input)\n ? input\n : planPumpAgentLaunch(this.context, input)\n assertPumpPlan(plan, PUMP_LAUNCH_OPERATIONS, 'Pump launch')\n return executeTransactionPlan(plan, createPumpExecutor(this.context))\n }\n}\n","import {\n getLaunchpadTokenState,\n LaunchpadTokenState,\n quoteLaunchpadSellExactToken,\n} from '@sun-protocol/sun-sdk-launchpad'\nimport {\n SDKError,\n assertTronAddress,\n type TransactionAction,\n} from '@sun-protocol/sun-sdk-core'\nimport { normalizeBaseUnitAmount } from '../common.js'\nimport { requireRuntime, type ProtocolsContext } from '../context.js'\nimport {\n executePlanAction,\n executePlanTransactions,\n executeTransactionPlan,\n isTransactionPlan,\n} from '../execute-plan.js'\nimport type {\n ExecutedActionResult,\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport { createPumpExecutor } from './execute.js'\nimport { planPumpSell } from './plan-sell.js'\nimport type {\n PumpQuoteSellInput,\n PumpSellClientShape,\n PumpSellInput,\n PumpSellQuote,\n} from './types.js'\nimport {\n pumpV2SellPath,\n readPumpV2AmountsOut,\n requirePumpV2Amount,\n} from './v2.js'\nimport { assertPumpPlan } from './workflow.js'\n\nconst PUMP_SELL_OPERATIONS = [\n 'launchpad-sell-exact-token',\n 'pump-v2-sell-exact-token',\n] as const\n\nasync function quotePumpSell(\n context: ProtocolsContext,\n input: PumpQuoteSellInput,\n): Promise<PumpSellQuote> {\n const runtime = requireRuntime(context, 'Pump sell quote')\n const token = assertTronAddress(input.token, 'token')\n const tokenAmount = normalizeBaseUnitAmount(input.tokenAmount, 'tokenAmount')\n const state = await getLaunchpadTokenState(runtime, token)\n if (state === LaunchpadTokenState.TRADING) {\n return quoteLaunchpadSellExactToken(runtime, token, tokenAmount)\n }\n if (state === LaunchpadTokenState.LAUNCHED) {\n const path = pumpV2SellPath(context, token)\n const amounts = await readPumpV2AmountsOut(context, runtime, tokenAmount, path)\n return {\n trxAmount: requirePumpV2Amount(amounts, amounts.length - 1, 'pump-v2-sell-quote'),\n fee: '0',\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'Token is not trading on SunPump', { token, state })\n}\n\nexport class PumpSellClient implements PumpSellClientShape {\n constructor(private readonly context: ProtocolsContext) {}\n\n quote(input: PumpQuoteSellInput): Promise<PumpSellQuote> {\n return quotePumpSell(this.context, input)\n }\n\n plan(input: PumpSellInput): Promise<TransactionPlan> {\n return planPumpSell(this.context, input)\n }\n\n executeAction(action: TransactionAction): Promise<ExecutedActionResult> {\n return executePlanAction(action, createPumpExecutor(this.context))\n }\n\n submit(plan: TransactionPlan): Promise<TransactionPlanExecutionResult> {\n assertPumpPlan(plan, PUMP_SELL_OPERATIONS, 'Pump sell')\n return executePlanTransactions(plan, createPumpExecutor(this.context))\n }\n\n async execute(\n input: PumpSellInput | TransactionPlan,\n ): Promise<TransactionPlanExecutionResult> {\n const plan = isTransactionPlan(input)\n ? input\n : await planPumpSell(this.context, input)\n assertPumpPlan(plan, PUMP_SELL_OPERATIONS, 'Pump sell')\n return executeTransactionPlan(plan, createPumpExecutor(this.context))\n }\n}\n","import {\n applySlippageMin,\n createLaunchpadApproveAction,\n createLaunchpadSellAction,\n getLaunchpadTokenState,\n LaunchpadTokenState,\n quoteLaunchpadSellExactToken,\n readLaunchpadAllowance,\n} from '@sun-protocol/sun-sdk-launchpad'\nimport {\n SDKError,\n assertTronAddress,\n createApproveAction,\n type TransactionAction,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeRecipient,\n normalizeTransactionValidForSeconds,\n slippageToBips,\n} from '../common.js'\nimport {\n requireRuntime,\n requireWalletSnapshot,\n type ProtocolsContext,\n} from '../context.js'\nimport { createDeferredV2SwapAction } from '../internal/v2-swap-action.js'\nimport { attachApprovalIntent } from '../internal/intents.js'\nimport type { TransactionPlan } from '../types/plan.js'\nimport type { PumpSellInput } from './types.js'\nimport {\n pumpV2SellPath,\n readPumpV2AmountsOut,\n requirePumpV2Amount,\n} from './v2.js'\nimport {\n pumpIntentScope,\n SUNPUMP_LAUNCHPAD_PROTOCOL_ID,\n SUNPUMP_V2_PROTOCOL_ID,\n} from './intents.js'\n\nexport async function planPumpSell(\n context: ProtocolsContext,\n input: PumpSellInput,\n): Promise<TransactionPlan> {\n const runtime = requireRuntime(context, 'Pump sell planning')\n const { address: walletAddress } = await requireWalletSnapshot(context, 'Pump sell planning')\n const token = assertTronAddress(input.token, 'token')\n const tokenAmount = normalizeBaseUnitAmount(input.tokenAmount, 'tokenAmount')\n const state = await getLaunchpadTokenState(runtime, token)\n if (state !== LaunchpadTokenState.TRADING && state !== LaunchpadTokenState.LAUNCHED) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'Token is not trading on SunPump', {\n token,\n state,\n })\n }\n\n const slippageBips = slippageToBips(input.slippage ?? '5%')\n const approvalMode = input.approval ?? 'auto'\n const approvals: TransactionAction[] = []\n const owner = input.owner !== undefined ? assertTronAddress(input.owner, 'owner') : walletAddress\n if (owner !== walletAddress) {\n throw new SDKError('SDK_WALLET_ACCOUNT_MISMATCH', 'Pump sell owner does not match the connected wallet', {\n expectedAddress: owner,\n actualAddress: walletAddress,\n })\n }\n let allowance: string | undefined\n\n const spender = state === LaunchpadTokenState.TRADING\n ? context.chain.contracts.launchpad\n : context.chain.contracts.sunswapV2Router\n const scope = pumpIntentScope(\n state === LaunchpadTokenState.TRADING ? SUNPUMP_LAUNCHPAD_PROTOCOL_ID : SUNPUMP_V2_PROTOCOL_ID,\n 'sell-exact-token',\n )\n\n if (approvalMode !== 'none') {\n allowance = await readLaunchpadAllowance(\n runtime,\n token,\n owner,\n spender,\n )\n if (BigInt(allowance) < BigInt(tokenAmount)) {\n approvals.push(state === LaunchpadTokenState.TRADING\n ? createLaunchpadApproveAction(token, spender)\n : createApproveAction({\n id: `pump-v2-approve-${token}`,\n target: token,\n spender,\n amount: tokenAmount,\n }))\n }\n }\n\n if (state === LaunchpadTokenState.TRADING) {\n const quote = await quoteLaunchpadSellExactToken(runtime, token, tokenAmount)\n const minTrxOut = applySlippageMin(BigInt(quote.trxAmount), slippageBips).toString()\n const transaction = {\n ...createLaunchpadSellAction({\n launchpad: context.chain.contracts.launchpad,\n token,\n tokenAmount,\n minTrxOut,\n }),\n intent: {\n kind: 'pump-sell' as const,\n scope,\n token,\n },\n }\n\n return {\n id: nextPlanId(context, 'pump-sell'),\n kind: 'pump',\n network: context.network,\n owner,\n summary: {\n title: 'Sell SunPump token',\n lines: [`Sell ${tokenAmount} token units`, `Receive at least ${minTrxOut} sun`],\n },\n approvals: attachApprovalIntent(approvals, scope, token),\n transactions: [transaction],\n metadata: {\n operation: 'launchpad-sell-exact-token',\n token,\n tokenAmount,\n quotedTrxAmount: quote.trxAmount,\n fee: quote.fee,\n minTrxOut,\n slippageBips,\n approvalMode,\n spender,\n ...(owner ? { owner } : {}),\n ...(allowance ? { allowance } : {}),\n },\n }\n }\n\n const path = pumpV2SellPath(context, token)\n const amounts = await readPumpV2AmountsOut(context, runtime, tokenAmount, path)\n const quotedTrxAmount = requirePumpV2Amount(amounts, amounts.length - 1, 'pump-v2-sell-exact-token')\n const minTrxOut = applySlippageMin(BigInt(quotedTrxAmount), slippageBips).toString()\n const recipient = await normalizeRecipient(context, input.recipient, 'Pump V2 sell recipient', owner)\n const transactionValidForSeconds = normalizeTransactionValidForSeconds(input.transactionValidForSeconds)\n const transaction = {\n ...createDeferredV2SwapAction({\n data: {\n operation: 'swap-exact-tokens-for-eth',\n amountIn: tokenAmount,\n amountOutMin: minTrxOut,\n path,\n recipient,\n transactionValidForSeconds,\n },\n }),\n intent: {\n kind: 'pump-sell' as const,\n scope,\n token,\n },\n }\n\n return {\n id: nextPlanId(context, 'pump-sell'),\n kind: 'pump',\n network: context.network,\n owner,\n summary: {\n title: 'Sell launched Pump token',\n lines: [`Sell ${tokenAmount} token units`, `Receive at least ${minTrxOut} sun`],\n },\n approvals: attachApprovalIntent(approvals, scope, token),\n transactions: [transaction],\n metadata: {\n operation: 'pump-v2-sell-exact-token',\n token,\n tokenAmount,\n quotedTrxAmount,\n minTrxOut,\n slippageBips,\n approvalMode,\n spender,\n path,\n recipient,\n transactionValidForSeconds,\n ...(owner ? { owner } : {}),\n ...(allowance ? { allowance } : {}),\n },\n }\n}\n","import {\n buildPsmBuyGemAction,\n buildPsmInfoRead,\n buildPsmSellGemAction,\n createPsmSnapshot,\n normalizePsmInfoResult,\n quotePsm,\n type PsmSnapshot,\n type PsmSwapDirection,\n type PsmSwapMode,\n} from '@sun-protocol/sun-sdk-psm'\nimport {\n SDKError,\n assertTronAddress,\n formatUnits,\n type TransactionAction,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { planApproval } from '../approval/plan.js'\nimport { nextPlanId, normalizeBaseUnitAmount, normalizeFeeLimit } from '../common.js'\nimport {\n createProtocolsContext,\n createContextExecutor,\n requireWalletSnapshot,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport {\n executePlanAction,\n executePlanTransactions,\n executeTransactionPlan,\n isTransactionPlan,\n} from '../execute-plan.js'\nimport { readRequiredContract } from '../internal/reads.js'\nimport type {\n ExecutedActionResult,\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type { ProtocolClientOptions } from '../types/options.js'\nimport type {\n PsmApprovalMode,\n PsmContractOverrides,\n PsmReadInput,\n PsmSwapClientShape,\n PsmSwapInput,\n PsmSwapQuote,\n} from './types.js'\nimport {\n DEFAULT_PSM_APPROVAL_FEE_LIMIT,\n DEFAULT_PSM_SWAP_FEE_LIMIT,\n} from './fee-limit.js'\nimport {\n assertSwapPlan,\n} from './workflow.js'\nimport {\n attachApprovalIntent,\n PSM_PROTOCOL_ID,\n swapIntentScope,\n} from './intents.js'\n\ninterface ResolvedPsmContracts {\n readonly psmUsdt: TronAddress\n readonly psmUsdd: TronAddress\n readonly psm: TronAddress\n readonly psmGemJoin: TronAddress\n readonly psmInfoReader: TronAddress\n}\n\ninterface NormalizedPsmQuoteInput {\n readonly mode: PsmSwapMode\n readonly direction: PsmSwapDirection\n readonly specifiedAmount: string\n readonly tokenIn: TronAddress\n readonly tokenOut: TronAddress\n}\n\nfunction normalizePsmApprovalMode(value: unknown): PsmApprovalMode {\n if (value === undefined) return 'auto'\n if (value === 'auto' || value === 'approve' || value === 'none') return value\n throw new SDKError('SDK_INVALID_ARGUMENT', 'unsupported PSM approval mode', {\n approval: value,\n })\n}\n\nfunction resolvePsmContracts(\n context: ProtocolsContext,\n overrides: PsmContractOverrides | undefined,\n): ResolvedPsmContracts {\n return {\n psmUsdt: resolveProtocolContract(context, overrides, 'psmUsdt'),\n psmUsdd: resolveProtocolContract(context, overrides, 'psmUsdd'),\n psm: resolveProtocolContract(context, overrides, 'psm'),\n psmGemJoin: resolveProtocolContract(context, overrides, 'psmGemJoin'),\n psmInfoReader: resolveProtocolContract(context, overrides, 'psmInfoReader'),\n }\n}\n\nfunction invalidAmountShape(mode: PsmSwapMode): never {\n throw new SDKError(\n 'SDK_INVALID_ARGUMENT',\n mode === 'exact-in'\n ? 'exact-in PSM swap requires only amountIn'\n : 'exact-out PSM swap requires only amountOut',\n { mode },\n )\n}\n\nfunction normalizeSpecifiedAmount(value: unknown, label: string): string {\n if (typeof value !== 'string') {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be a string`, {\n [label]: value,\n })\n }\n return normalizeBaseUnitAmount(value, label)\n}\n\nfunction normalizeQuoteInput(\n context: ProtocolsContext,\n input: PsmSwapInput,\n): NormalizedPsmQuoteInput {\n const mode = input.mode ?? 'exact-in'\n let specifiedAmount: string\n if (mode === 'exact-in') {\n if (input.amountIn === undefined || input.amountOut !== undefined) return invalidAmountShape(mode)\n specifiedAmount = normalizeSpecifiedAmount(input.amountIn, 'amountIn')\n } else if (mode === 'exact-out') {\n if (input.amountOut === undefined || input.amountIn !== undefined) return invalidAmountShape(mode)\n specifiedAmount = normalizeSpecifiedAmount(input.amountOut, 'amountOut')\n } else {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'unsupported PSM quote mode', { mode })\n }\n\n const tokenIn = assertTronAddress(input.tokenIn, 'tokenIn')\n const tokenOut = assertTronAddress(input.tokenOut, 'tokenOut')\n const { psmUsdt, psmUsdd } = resolvePsmContracts(context, input.contracts)\n\n let direction: PsmSwapDirection\n if (tokenIn === psmUsdt && tokenOut === psmUsdd) {\n direction = 'usdt-to-usdd'\n } else if (tokenIn === psmUsdd && tokenOut === psmUsdt) {\n direction = 'usdd-to-usdt'\n } else {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'PSM swap only supports its configured USDT/USDD pair', {\n tokenIn,\n tokenOut,\n psmUsdt,\n psmUsdd,\n })\n }\n\n return { mode, direction, specifiedAmount, tokenIn, tokenOut }\n}\n\nexport async function readPsm(\n context: ProtocolsContext,\n input: PsmReadInput = {},\n): Promise<PsmSnapshot> {\n const contracts = resolvePsmContracts(context, input.contracts)\n const result = await readRequiredContract<unknown>(\n context,\n buildPsmInfoRead({\n network: context.network,\n psm: contracts.psm,\n infoReader: contracts.psmInfoReader,\n }),\n 'PSM info read',\n )\n return createPsmSnapshot(normalizePsmInfoResult(result))\n}\n\nexport async function quotePsmSwap(\n context: ProtocolsContext,\n input: PsmSwapInput,\n): Promise<PsmSwapQuote> {\n const normalized = normalizeQuoteInput(context, input)\n const snapshot = await readPsm(context, input)\n return {\n ...quotePsm({\n mode: normalized.mode,\n direction: normalized.direction,\n specifiedAmount: normalized.specifiedAmount,\n snapshot,\n }),\n kind: 'psm',\n source: 'psm',\n tokenIn: normalized.tokenIn,\n tokenOut: normalized.tokenOut,\n }\n}\n\nexport async function planPsmSwap(\n context: ProtocolsContext,\n input: PsmSwapInput,\n): Promise<TransactionPlan> {\n const { address: owner } = await requireWalletSnapshot(context, 'PSM swap plan')\n const feeLimit = normalizeFeeLimit(input.feeLimit, DEFAULT_PSM_SWAP_FEE_LIMIT)\n const quote = await quotePsmSwap(context, input)\n const recipient = input.recipient !== undefined\n ? assertTronAddress(input.recipient, 'PSM recipient')\n : owner\n const contracts = resolvePsmContracts(context, input.contracts)\n const tokenIn = quote.direction === 'usdt-to-usdd'\n ? contracts.psmUsdt\n : contracts.psmUsdd\n const spender = quote.direction === 'usdt-to-usdd'\n ? contracts.psmGemJoin\n : contracts.psm\n const approvalMode = normalizePsmApprovalMode(input.approval)\n const approval = await planApproval(context, {\n asset: { type: 'token', token: tokenIn },\n owner,\n spender,\n amount: quote.amountIn,\n }, {\n mode: approvalMode,\n amount: 'max',\n feeLimit: DEFAULT_PSM_APPROVAL_FEE_LIMIT,\n })\n const inputSymbol = quote.direction === 'usdt-to-usdd' ? 'USDT' : 'USDD'\n const outputSymbol = quote.direction === 'usdt-to-usdd' ? 'USDD' : 'USDT'\n const inputDecimals = quote.direction === 'usdt-to-usdd' ? 6 : 18\n const outputDecimals = quote.direction === 'usdt-to-usdd' ? 18 : 6\n const intentScope = swapIntentScope(PSM_PROTOCOL_ID, quote.direction)\n const planId = nextPlanId(context, 'swap-psm')\n const actionOptions = {\n network: context.network,\n psm: contracts.psm,\n recipient,\n gemAmount: quote.gemAmount,\n feeLimit,\n id: `${planId}-swap`,\n }\n const transactionAction = quote.direction === 'usdt-to-usdd'\n ? buildPsmSellGemAction(actionOptions)\n : buildPsmBuyGemAction(actionOptions)\n const transaction = {\n ...transactionAction,\n intent: {\n kind: 'swap',\n scope: intentScope,\n from: { value: formatUnits(BigInt(quote.amountIn), inputDecimals), symbol: inputSymbol },\n to: { value: formatUnits(BigInt(quote.amountOut), outputDecimals), symbol: outputSymbol },\n ...(input.recipient === undefined ? {} : { recipient }),\n },\n } as const\n\n return {\n id: planId,\n kind: 'swap',\n network: context.network,\n owner,\n summary: {\n title: 'Swap with PSM',\n lines: [\n `Spend ${quote.amountIn} token units`,\n `Receive ${quote.amountOut} token units`,\n ],\n },\n approvals: attachApprovalIntent(approval.actions, intentScope, inputSymbol),\n transactions: [transaction],\n metadata: {\n protocol: 'psm',\n mode: quote.mode,\n direction: quote.direction,\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n specifiedAmount: quote.specifiedAmount,\n gemAmount: quote.gemAmount,\n feeAmount: quote.feeAmount,\n feeRate: quote.feeRate,\n availableAmountOut: quote.availableAmountOut,\n owner,\n recipient,\n spender,\n approvalMode,\n },\n }\n}\n\nexport class PsmSwapClient implements PsmSwapClientShape {\n constructor(private readonly context: ProtocolsContext) {}\n\n read(input: PsmReadInput = {}): Promise<PsmSnapshot> {\n return readPsm(this.context, input)\n }\n\n quote(input: PsmSwapInput): Promise<PsmSwapQuote> {\n return quotePsmSwap(this.context, input)\n }\n\n plan(input: PsmSwapInput): Promise<TransactionPlan> {\n return planPsmSwap(this.context, input)\n }\n\n executeAction(action: TransactionAction): Promise<ExecutedActionResult> {\n return executePlanAction(action, createContextExecutor(this.context))\n }\n\n submit(plan: TransactionPlan): Promise<TransactionPlanExecutionResult> {\n assertSwapPlan(plan, ['psm'], 'PSM')\n return executePlanTransactions(plan, createContextExecutor(this.context))\n }\n\n async execute(\n input: PsmSwapInput | TransactionPlan,\n ): Promise<TransactionPlanExecutionResult> {\n const plan = isTransactionPlan(input)\n ? input\n : await planPsmSwap(this.context, input)\n assertSwapPlan(plan, ['psm'], 'PSM')\n return executeTransactionPlan(plan, createContextExecutor(this.context))\n }\n}\n\nexport function createPsmSwapClient(context: ProtocolsContext): PsmSwapClient {\n return new PsmSwapClient(context)\n}\n\nexport function createPsmClient(options: ProtocolClientOptions): PsmSwapClient {\n return createPsmSwapClient(createProtocolsContext(options))\n}\n","export const DEFAULT_WTRX_SWAP_FEE_LIMIT = 1_000_000_000\nexport const DEFAULT_UNIVERSAL_ROUTER_SWAP_FEE_LIMIT = 500_000_000\nexport const DEFAULT_PSM_SWAP_FEE_LIMIT = 250_000_000\nexport const DEFAULT_PSM_APPROVAL_FEE_LIMIT = 1_000_000_000\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\nimport type { TransactionPlan } from '../types/plan.js'\n\nexport function assertSwapPlan(\n plan: TransactionPlan,\n protocols: readonly string[],\n clientName: string,\n): void {\n const protocol = plan.metadata.protocol\n if (\n plan.kind !== 'swap' ||\n typeof protocol !== 'string' ||\n !protocols.includes(protocol) ||\n plan.transactions.length === 0\n ) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Expected a ${clientName} swap plan`, {\n planId: plan.id,\n kind: plan.kind,\n protocol,\n transactionCount: plan.transactions.length,\n })\n }\n}\n","import type { RouterRoute } from '@sun-protocol/sun-sdk-api'\nimport {\n SDKError,\n type TransactionIntentScope,\n} from '@sun-protocol/sun-sdk-core'\n\nexport { attachApprovalIntent } from '../internal/intents.js'\n\nexport const UNIVERSAL_ROUTER_PROTOCOL_ID = 'universal-router'\nexport const PSM_PROTOCOL_ID = 'psm'\nexport const WTRX_PROTOCOL_ID = 'wtrx'\n\nexport function swapIntentScope(\n protocol: string,\n operation?: string,\n): TransactionIntentScope<'swap'> {\n return {\n domain: 'swap',\n protocol,\n ...(operation === undefined ? {} : { operation }),\n }\n}\n\nexport function routerRouteSymbols(route: RouterRoute): {\n readonly from: string\n readonly to: string\n} {\n const symbols = route.symbols\n if (\n !Array.isArray(symbols) ||\n symbols.length < 2 ||\n symbols.some((symbol) => typeof symbol !== 'string' || symbol.length === 0)\n ) {\n throw new SDKError('SDK_API_ERROR', 'Selected Router route is missing token symbols')\n }\n\n return {\n from: symbols[0] as string,\n to: symbols[symbols.length - 1] as string,\n }\n}\n","import {\n SDKError,\n type DeferredContractCallAction,\n} from '@sun-protocol/sun-sdk-core'\nimport { createContextExecutor, type ProtocolsContext } from '../context.js'\nimport type { TransactionPlanExecutor } from '../execute-plan.js'\nimport {\n UNIVERSAL_ROUTER_MATERIALIZATION_KIND,\n type UniversalRouterMaterializationData,\n} from '../internal/router-action.js'\nimport { buildUniversalRouterSwapAction } from '../internal/universal-router-adapter.js'\nimport { resolveTransactionDeadline } from '../common.js'\nimport type { ExecutedActionResult } from '../types/plan.js'\nimport type { SwapTransactionOptions } from './types.js'\nimport { assertUsdtTransfer } from '../usdt-transfer.js'\n\nfunction signatureFromResults(\n actionId: string | undefined,\n completed: readonly ExecutedActionResult[],\n): string | undefined {\n if (!actionId) return undefined\n const result = completed.find((item) => item.action.id === actionId)?.result\n return typeof result === 'string' ? (result.startsWith('0x') ? result : `0x${result}`) : undefined\n}\n\n/** Materializes the final Router transaction from a caller-provided Permit2 signature. */\nasync function materializeUniversalRouterActionWithSignature(\n context: ProtocolsContext,\n action: DeferredContractCallAction,\n permitSignature?: string,\n) {\n if (action.materialization.kind !== UNIVERSAL_ROUTER_MATERIALIZATION_KIND) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Unsupported deferred action kind: ${action.materialization.kind}`)\n }\n const data = action.materialization.data as unknown as UniversalRouterMaterializationData\n\n if (data.network !== context.network) {\n throw new SDKError('SDK_USDT_TRANSFER_UNKNOWN', 'Network changed; rebuild the swap plan', { reason: 'CHECK_FAILED' })\n }\n\n if (data.signatureActionId && !permitSignature) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Router swap requires the planned Permit2 signature', {\n actionId: action.id,\n signatureActionId: data.signatureActionId,\n })\n }\n if (data.signatureActionId && !data.permitSingle) {\n throw new SDKError('SDK_RUNTIME_ERROR', 'Router swap plan is missing Permit2 permit data', {\n actionId: action.id,\n signatureActionId: data.signatureActionId,\n })\n }\n\n const normalizedSignature = permitSignature\n ? (permitSignature.startsWith('0x') ? permitSignature : `0x${permitSignature}`)\n : undefined\n const permit = normalizedSignature && data.permitSingle\n ? { ...(data.permitSingle as Record<string, unknown>), signature: normalizedSignature as `0x${string}` }\n : undefined\n\n return buildUniversalRouterSwapAction({\n network: context.network,\n chain: context.chain,\n route: data.route,\n slippageBips: BigInt(data.slippageBips),\n deadline: await resolveTransactionDeadline(context, data.transactionValidForSeconds),\n ...(data.recipient ? { recipient: data.recipient } : {}),\n ...(permit ? { permit: permit as never } : {}),\n ...(data.feeLimit !== undefined ? { feeLimit: data.feeLimit } : {}),\n })\n}\n\n/**\n * Materializes a deferred Universal Router action with results collected by a\n * staged UI, including a Permit2 signature produced by an earlier action.\n */\nexport async function materializeUniversalRouterAction(\n context: ProtocolsContext,\n action: DeferredContractCallAction,\n completedActions: readonly ExecutedActionResult[],\n) {\n const data = action.materialization.data as unknown as UniversalRouterMaterializationData\n const signature = signatureFromResults(data.signatureActionId, completedActions)\n return materializeUniversalRouterActionWithSignature(context, action, signature)\n}\n\n/** Creates an executor for Router plans, including approvals and WTRX actions. */\nexport function createRouterSwapExecutor(\n context: ProtocolsContext,\n options?: SwapTransactionOptions,\n): TransactionPlanExecutor {\n const executor = createContextExecutor(context)\n return {\n ...executor,\n sendAction: async (action) => {\n if (action.target === context.chain.contracts.universalRouter || action.intent?.scope.protocol === 'universal-router' && action.intent.kind === 'swap') {\n await assertUsdtTransfer(context, action)\n }\n if (!executor.sendAction) throw new SDKError('SDK_RUNTIME_ERROR', 'Swap execution requires a runtime')\n return executor.sendAction(action)\n },\n materializeAction: (action, completed) => options\n ? materializeUniversalRouterActionWithSignature(context, action, options.permitSignature)\n : materializeUniversalRouterAction(context, action, completed),\n }\n}\n","import {\n createDeferredContractCallAction,\n type DeferredContractCallAction,\n type Network,\n type TransactionIntent,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport type { RouterRoute } from '@sun-protocol/sun-sdk-api'\n\nexport const UNIVERSAL_ROUTER_MATERIALIZATION_KIND = 'universal-router-swap'\n\ntype JsonPrimitive = string | number | boolean | null\ntype JsonValue = JsonPrimitive | JsonObject | JsonValue[]\ninterface JsonObject {\n readonly [key: string]: JsonValue\n}\n\nexport interface UniversalRouterMaterializationData {\n readonly network: Network\n readonly route: RouterRoute\n readonly slippageBips: string\n readonly transactionValidForSeconds: number\n readonly recipient?: TronAddress\n readonly signatureActionId?: string\n readonly permitSingle?: JsonObject\n readonly feeLimit?: number\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map(toJsonValue)\n }\n\n if (typeof value === 'object') {\n const objectValue = value as Record<string, unknown>\n const result: Record<string, JsonValue> = {}\n for (const [key, entry] of Object.entries(objectValue)) {\n if (entry !== undefined) {\n result[key] = toJsonValue(entry)\n }\n }\n return result\n }\n\n throw new TypeError(`Value is not JSON-serializable: ${typeof value}`)\n}\n\nfunction toJsonObject(value: unknown): JsonObject {\n const normalized = toJsonValue(value)\n if (normalized === null || Array.isArray(normalized) || typeof normalized !== 'object') {\n throw new TypeError('Value is not a JSON object')\n }\n return normalized\n}\n\nexport function createUniversalRouterDeferredAction(input: {\n readonly id: string\n readonly data: UniversalRouterMaterializationData\n readonly intent?: TransactionIntent\n}): DeferredContractCallAction {\n return createDeferredContractCallAction({\n id: input.id,\n materialization: {\n kind: UNIVERSAL_ROUTER_MATERIALIZATION_KIND,\n data: toJsonObject(input.data),\n },\n ...(input.intent !== undefined ? { intent: input.intent } : {}),\n })\n}\n","import type { RouterRoute } from '@sun-protocol/sun-sdk-api'\nimport type { ChainConfig } from '@sun-protocol/sun-sdk-chains'\nimport {\n SDKError,\n createContractCallAction,\n type ContractCallAction,\n type Network,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n Address,\n TradePlanner,\n parseRouteAPIResponse,\n PoolType,\n PoolVersion,\n type Permit2Signature,\n type RouteData,\n} from '@sun-protocol/universal-router-sdk'\nimport type { TronAddress } from '@sun-protocol/sun-sdk-core'\nimport { computeV3PoolAddress } from '@sun-protocol/sun-sdk-sunswap-v3'\nimport { normalizeTronAddress } from './tokens.js'\nimport type { TransferSource, UsdtTransferContext } from '../usdt-transfer.js'\nimport { normalizeFeeLimit } from '../common.js'\nimport { DEFAULT_UNIVERSAL_ROUTER_SWAP_FEE_LIMIT } from '../swap/fee-limit.js'\n\nexport interface BuildUniversalRouterSwapActionInput {\n readonly network: Network\n readonly chain: ChainConfig\n readonly route: RouterRoute\n readonly slippageBips: bigint\n readonly deadline: string\n readonly recipient?: TronAddress\n readonly permit?: Permit2Signature\n readonly feeLimit?: number\n}\n\nfunction requireString(route: RouterRoute, key: keyof RouteData): string {\n const value = route[key]\n if (typeof value !== 'string') {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Router route is missing ${String(key)}`, { key, route })\n }\n return value\n}\n\nfunction requireStringArray(route: RouterRoute, key: keyof RouteData): string[] {\n const value = route[key]\n if (!Array.isArray(value) || !value.every((item) => typeof item === 'string')) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Router route is missing ${String(key)}`, { key, route })\n }\n return value\n}\n\nfunction normalizePoolKey(poolKey: unknown): RouteData['poolKeys'][number] {\n if (poolKey === null || poolKey === undefined) {\n return null\n }\n if (typeof poolKey !== 'object') {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Router route poolKey must be an object or null', { poolKey })\n }\n\n const value = poolKey as Record<string, unknown>\n const token0 = value.token0 ?? value.currency0\n const token1 = value.token1 ?? value.currency1\n if (\n typeof token0 !== 'string' ||\n typeof token1 !== 'string' ||\n typeof value.hooks !== 'string' ||\n typeof value.fee !== 'number' ||\n typeof value.parameters !== 'string'\n ) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Router route poolKey has invalid fields', { poolKey })\n }\n\n return {\n token0,\n token1,\n hooks: value.hooks,\n fee: value.fee,\n parameters: value.parameters,\n }\n}\n\nfunction normalizeRouteData(route: RouterRoute): RouteData {\n const poolKeysRaw = route.poolKeys\n if (!Array.isArray(poolKeysRaw)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Router route is missing poolKeys', { route })\n }\n\n return {\n amountIn: requireString(route, 'amountIn'),\n amountInRaw: requireString(route, 'amountInRaw'),\n amountOut: requireString(route, 'amountOut'),\n amountOutRaw: requireString(route, 'amountOutRaw'),\n amountOutMinimum: typeof route.amountOutMinimum === 'string' ? route.amountOutMinimum : '0',\n amountOutMinimumRaw: typeof route.amountOutMinimumRaw === 'string' ? route.amountOutMinimumRaw : '0',\n inUsd: typeof route.inUsd === 'string' ? route.inUsd : '0',\n outUsd: typeof route.outUsd === 'string' ? route.outUsd : '0',\n impact: typeof route.impact === 'string' ? route.impact : '0',\n fee: typeof route.fee === 'string' ? route.fee : '0',\n containsUnverifiedHook: route.containsUnverifiedHook === true,\n tokens: requireStringArray(route, 'tokens'),\n symbols: requireStringArray(route, 'symbols'),\n poolFees: requireStringArray(route, 'poolFees'),\n poolVersions: requireStringArray(route, 'poolVersions'),\n poolKeys: poolKeysRaw.map(normalizePoolKey),\n stepAmountsOut: requireStringArray(route, 'stepAmountsOut'),\n ...(typeof route.amountInReferralBips === 'number' ? { amountInReferralBips: route.amountInReferralBips } : {}),\n ...(typeof route.amountOutReferralBips === 'number' ? { amountOutReferralBips: route.amountOutReferralBips } : {}),\n }\n}\n\nfunction routeStartsWithNativeTrx(chain: ChainConfig, route: RouteData): boolean {\n return route.tokens[0] === chain.contracts.trx\n}\n\nexport function buildUniversalRouterSwapAction(input: BuildUniversalRouterSwapActionInput): ContractCallAction {\n const routeData = normalizeRouteData(input.route)\n const hops = routeData.poolVersions.length\n if (hops === 0 || routeData.tokens.length !== hops + 1 || routeData.poolFees.length < hops ||\n routeData.poolVersions.some((version) => !Object.values(PoolVersion).includes(version as PoolVersion))) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Router route has inconsistent hop data')\n }\n routeData.tokens = routeData.tokens.map((token) => normalizeTronAddress(token))\n const swapTradeRoute = parseRouteAPIResponse(routeData, input.network === 'nile', {\n slippageBips: input.slippageBips,\n })\n if (input.recipient) {\n swapTradeRoute.recipient = new Address(input.recipient)\n }\n const tradePlanner = new TradePlanner([swapTradeRoute], false, {\n permitOptions: input.permit\n ? { permitEnabled: true, permit: input.permit }\n : { permitEnabled: false },\n })\n\n tradePlanner.encode()\n\n const usdtAddress = input.chain.contracts.usdt\n const sources = new Map<string, TransferSource>()\n swapTradeRoute.pools.forEach((pool, index) => {\n if (pool.type !== PoolType.V3 || routeData.tokens[index + 1] !== usdtAddress) return\n const address = computeV3PoolAddress({\n network: input.network,\n tokenA: routeData.tokens[index]!,\n tokenB: usdtAddress,\n fee: pool.fee,\n factory: input.chain.contracts.sunswapV3Factory,\n wrappedNative: input.chain.contracts.wtrx,\n })\n sources.set(address, { address, role: 'v3-pool' })\n })\n const usdtTransfer: UsdtTransferContext = {\n network: input.network, transfersUsdt: sources.size > 0, sources: [...sources.values()],\n }\n\n return createContractCallAction({\n id: 'universal-router-swap',\n target: input.chain.contracts.universalRouter,\n functionSelector: 'execute(bytes,bytes[],uint256)',\n parameters: [\n { type: 'bytes', value: tradePlanner.commands },\n { type: 'bytes[]', value: tradePlanner.inputs },\n { type: 'uint256', value: input.deadline },\n ],\n ...(routeStartsWithNativeTrx(input.chain, routeData) ? { callValue: BigInt(routeData.amountInRaw) } : {}),\n feeLimit: normalizeFeeLimit(input.feeLimit, DEFAULT_UNIVERSAL_ROUTER_SWAP_FEE_LIMIT),\n metadata: { usdtTransfer },\n })\n}\n","import {\n SDKError,\n assertTronAddress,\n createContractCallAction,\n formatUnits,\n type TransactionAction,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n nextPlanId,\n normalizeFeeLimit,\n normalizeRecipient,\n normalizeTransactionValidForSeconds,\n slippageToBips,\n} from '../common.js'\nimport { requireWalletSnapshot, type ProtocolsContext } from '../context.js'\nimport { planRouterPermit2Authorization } from '../approval/permit2.js'\nimport { createUniversalRouterDeferredAction } from '../internal/router-action.js'\nimport type { TransactionPlan } from '../types/plan.js'\nimport type {\n RouterSwapQuote,\n SwapRouterPlanInput,\n WtrxSwapQuote,\n WtrxSwapRoute,\n} from './types.js'\nimport { isNativeTrxToken } from './tokens.js'\nimport {\n DEFAULT_UNIVERSAL_ROUTER_SWAP_FEE_LIMIT,\n DEFAULT_WTRX_SWAP_FEE_LIMIT,\n} from './fee-limit.js'\nimport {\n attachApprovalIntent,\n routerRouteSymbols,\n swapIntentScope,\n UNIVERSAL_ROUTER_PROTOCOL_ID,\n WTRX_PROTOCOL_ID,\n} from './intents.js'\n\nfunction stringifyRoute(route: unknown): string | undefined {\n try {\n return JSON.stringify(route)\n } catch {\n return undefined\n }\n}\n\nfunction findSelectedRouteIndex(quote: RouterSwapQuote, route: SwapRouterPlanInput['route']): number {\n const serializedRoute = stringifyRoute(route)\n return quote.routes.findIndex((candidate) => {\n if (candidate === route) return true\n if (serializedRoute === undefined) return false\n return stringifyRoute(candidate) === serializedRoute\n })\n}\n\nfunction isWtrxRoute(route: unknown): route is WtrxSwapRoute {\n return typeof route === 'object' &&\n route !== null &&\n ((route as { type?: unknown }).type === 'WTRX_WRAP' || (route as { type?: unknown }).type === 'WTRX_UNWRAP')\n}\n\nexport function buildWtrxSwapPlan(\n context: ProtocolsContext,\n quote: WtrxSwapQuote,\n route: WtrxSwapRoute,\n owner: TronAddress,\n feeLimit?: number,\n): TransactionPlan {\n if (stringifyRoute(route) !== stringifyRoute(quote.route)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Selected WTRX route must come from the quote', {\n quoteRoute: quote.route,\n route,\n })\n }\n\n const resolvedFeeLimit = normalizeFeeLimit(feeLimit, DEFAULT_WTRX_SWAP_FEE_LIMIT)\n const intent = {\n kind: quote.action,\n scope: swapIntentScope(WTRX_PROTOCOL_ID, quote.action),\n amount: formatUnits(BigInt(quote.amountIn), context.chain.nativeCurrency.decimals),\n } as const\n const transaction = quote.action === 'wrap'\n ? createContractCallAction({\n id: `${nextPlanId(context, 'swap-wtrx')}-wrap`,\n target: context.chain.contracts.wtrx,\n functionSelector: 'deposit()',\n parameters: [],\n callValue: BigInt(quote.amountIn),\n feeLimit: resolvedFeeLimit,\n intent,\n })\n : createContractCallAction({\n id: `${nextPlanId(context, 'swap-wtrx')}-unwrap`,\n target: context.chain.contracts.wtrx,\n functionSelector: 'withdraw(uint256)',\n parameters: [{ type: 'uint256', value: quote.amountIn }],\n feeLimit: resolvedFeeLimit,\n intent,\n })\n\n return {\n id: nextPlanId(context, 'swap-wtrx'),\n kind: 'swap',\n network: context.network,\n owner,\n summary: {\n title: quote.action === 'wrap' ? 'Wrap TRX' : 'Unwrap WTRX',\n lines: [`Amount ${quote.amountIn}`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: {\n protocol: 'wtrx',\n action: quote.action,\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n tokenIn: quote.tokenIn,\n tokenOut: quote.tokenOut,\n feeLimit: resolvedFeeLimit,\n },\n }\n}\n\nexport async function planRouterSwap(\n context: ProtocolsContext,\n input: SwapRouterPlanInput,\n): Promise<TransactionPlan> {\n const { wallet, address: owner } = await requireWalletSnapshot(context, 'Router swap plan')\n if (input.quote.kind === 'wtrx') {\n if (!isWtrxRoute(input.route)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'WTRX swap planning requires a WTRX route')\n }\n return buildWtrxSwapPlan(context, input.quote, input.route, owner, input.feeLimit)\n }\n\n const selectedRouteIndex = findSelectedRouteIndex(input.quote, input.route)\n if (selectedRouteIndex < 0) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Selected route must come from quote.routes', {\n routeCount: input.quote.routes.length,\n tokenIn: input.quote.tokenIn,\n tokenOut: input.quote.tokenOut,\n amountIn: input.quote.amountIn,\n })\n }\n const selectedRoute = input.quote.routes[selectedRouteIndex]\n if (!selectedRoute) {\n throw new SDKError('SDK_RUNTIME_ERROR', 'Selected router route could not be resolved after validation', {\n selectedRouteIndex,\n routeCount: input.quote.routes.length,\n })\n }\n const symbols = routerRouteSymbols(selectedRoute)\n const intentScope = swapIntentScope(UNIVERSAL_ROUTER_PROTOCOL_ID)\n\n const recipient = await normalizeRecipient(context, input.recipient, 'Router swap recipient', owner)\n const transactionValidForSeconds = normalizeTransactionValidForSeconds(input.transactionValidForSeconds)\n const slippageBips = slippageToBips(input.slippage ?? '0.5%')\n const feeLimit = normalizeFeeLimit(input.feeLimit, DEFAULT_UNIVERSAL_ROUTER_SWAP_FEE_LIMIT)\n\n const tokenIn = input.quote.tokenIn\n const approvals: TransactionAction[] = []\n let signatureActionId: string | undefined\n let permitSingle: unknown\n\n if (!isNativeTrxToken(context, tokenIn)) {\n const authorization = await planRouterPermit2Authorization(context, {\n owner,\n token: assertTronAddress(tokenIn, 'tokenIn'),\n amount: input.quote.amountIn,\n approval: input.approval ?? 'auto',\n approveAmountType: 'max',\n walletCapabilities: wallet.capabilities,\n })\n approvals.push(...attachApprovalIntent(authorization.actions, intentScope, symbols.from))\n signatureActionId = authorization.signatureActionId\n permitSingle = authorization.permitSingle\n }\n\n const transaction = createUniversalRouterDeferredAction({\n id: `${nextPlanId(context, 'swap-router')}-execute`,\n data: {\n network: context.network,\n route: selectedRoute,\n slippageBips: slippageBips.toString(),\n transactionValidForSeconds,\n recipient,\n feeLimit,\n ...(signatureActionId ? { signatureActionId } : {}),\n ...(permitSingle ? { permitSingle: permitSingle as never } : {}),\n },\n intent: {\n kind: 'swap',\n scope: intentScope,\n from: { value: selectedRoute.amountIn, symbol: symbols.from },\n to: { value: selectedRoute.amountOut, symbol: symbols.to },\n ...(input.recipient === undefined ? {} : { recipient }),\n },\n })\n\n return {\n id: nextPlanId(context, 'swap-router'),\n kind: 'swap',\n network: context.network,\n owner,\n summary: {\n title: 'Swap with Universal Router',\n lines: [`Spend ${selectedRoute.amountIn}`, `Expected output ${selectedRoute.amountOut}`],\n },\n approvals,\n transactions: [transaction],\n metadata: {\n protocol: 'universal-router',\n selectedRouteIndex,\n tokenIn: input.quote.tokenIn,\n tokenOut: input.quote.tokenOut,\n amountIn: selectedRoute.amountInRaw,\n amountOut: selectedRoute.amountOutRaw,\n amountInFormatted: selectedRoute.amountIn,\n amountOutFormatted: selectedRoute.amountOut,\n slippageBips,\n recipient,\n transactionValidForSeconds,\n feeLimit,\n },\n }\n}\n","import { SDKError, assertTronAddress, type TronAddress } from '@sun-protocol/sun-sdk-core'\nimport { normalizeBaseUnitAmount } from '../common.js'\nimport type { ProtocolsContext } from '../context.js'\nimport type {\n V2SwapDirection,\n WtrxSwapAction,\n WtrxSwapQuote,\n} from './types.js'\n\nexport interface V2PathInfo {\n readonly direction: V2SwapDirection\n readonly path: readonly TronAddress[]\n readonly token: TronAddress\n}\n\nexport function isNativeTrxToken(context: ProtocolsContext, token: string): boolean {\n return token.toUpperCase() === 'TRX' || token === context.chain.contracts.trx\n}\n\nexport function normalizeRouterToken(context: ProtocolsContext, token: string): string {\n return isNativeTrxToken(context, token) ? context.chain.contracts.trx : assertTronAddress(token, 'token')\n}\n\nexport function normalizeV2TrxPairPath(\n context: ProtocolsContext,\n input: { readonly tokenIn: string; readonly tokenOut: string },\n): V2PathInfo {\n const tokenInIsTrx = isNativeTrxToken(context, input.tokenIn)\n const tokenOutIsTrx = isNativeTrxToken(context, input.tokenOut)\n if (tokenInIsTrx === tokenOutIsTrx) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 swap currently supports exactly one TRX side', {\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n })\n }\n\n const token = assertTronAddress(tokenInIsTrx ? input.tokenOut : input.tokenIn, 'token')\n return tokenInIsTrx\n ? { direction: 'trx-to-token', token, path: [context.chain.contracts.wtrx, token] }\n : { direction: 'token-to-trx', token, path: [token, context.chain.contracts.wtrx] }\n}\n\nfunction normalizeV2PathToken(context: ProtocolsContext, token: string, label: string): TronAddress {\n if (isNativeTrxToken(context, token) || token === context.chain.contracts.wtrx) {\n return context.chain.contracts.wtrx\n }\n return assertTronAddress(token, label)\n}\n\nexport function isWrappedTrxToken(context: ProtocolsContext, token: string): boolean {\n return token === context.chain.contracts.wtrx\n}\n\nexport function detectWtrxSwap(\n context: ProtocolsContext,\n input: { readonly tokenIn: string; readonly tokenOut: string; readonly amountIn: string },\n): WtrxSwapQuote | undefined {\n const amountIn = normalizeBaseUnitAmount(input.amountIn, 'amountIn')\n const tokenInIsTrx = isNativeTrxToken(context, input.tokenIn)\n const tokenOutIsTrx = isNativeTrxToken(context, input.tokenOut)\n const tokenInIsWtrx = isWrappedTrxToken(context, input.tokenIn)\n const tokenOutIsWtrx = isWrappedTrxToken(context, input.tokenOut)\n\n let action: WtrxSwapAction | undefined\n if (tokenInIsTrx && tokenOutIsWtrx) action = 'wrap'\n if (tokenInIsWtrx && tokenOutIsTrx) action = 'unwrap'\n if (!action) return undefined\n\n return {\n kind: 'wtrx',\n source: 'wtrx',\n action,\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n amountIn,\n amountOut: amountIn,\n route: {\n type: action === 'wrap' ? 'WTRX_WRAP' : 'WTRX_UNWRAP',\n amountIn,\n amountOut: amountIn,\n },\n }\n}\n\nexport function normalizeV2SwapPath(\n context: ProtocolsContext,\n input: { readonly tokenIn: string; readonly tokenOut: string; readonly path?: readonly string[] },\n): V2PathInfo {\n const tokenInIsTrx = isNativeTrxToken(context, input.tokenIn)\n const tokenOutIsTrx = isNativeTrxToken(context, input.tokenOut)\n const tokenInIsWtrx = isWrappedTrxToken(context, input.tokenIn)\n const tokenOutIsWtrx = isWrappedTrxToken(context, input.tokenOut)\n if ((tokenInIsTrx && (tokenOutIsTrx || tokenOutIsWtrx)) || (tokenInIsWtrx && tokenOutIsTrx)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 swap does not handle TRX wrap or unwrap', {\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n })\n }\n\n const inputToken = normalizeV2PathToken(context, input.tokenIn, 'tokenIn')\n const outputToken = normalizeV2PathToken(context, input.tokenOut, 'tokenOut')\n const path = (input.path ?? [input.tokenIn, input.tokenOut]).map((token, index) =>\n normalizeV2PathToken(context, token, `path[${index}]`),\n )\n const originalPath = input.path ?? [input.tokenIn, input.tokenOut]\n\n if (inputToken === outputToken) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 swap tokenIn and tokenOut must differ', {\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n })\n }\n\n if (path.length < 2 || path[0] !== inputToken || path[path.length - 1] !== outputToken) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 swap path must start with tokenIn and end with tokenOut', {\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n path: originalPath,\n })\n }\n\n if (path.some((token, index) => index > 0 && token === path[index - 1])) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V2 swap path must not contain duplicate adjacent tokens', {\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n path: originalPath,\n })\n }\n\n const direction: V2SwapDirection = tokenInIsTrx\n ? 'trx-to-token'\n : tokenOutIsTrx\n ? 'token-to-trx'\n : 'token-to-token'\n\n return { direction, token: tokenInIsTrx ? outputToken : inputToken, path }\n}\n","import { SDKError } from '@sun-protocol/sun-sdk-core'\nimport type { RouterRoute } from '@sun-protocol/sun-sdk-api'\nimport { normalizeBaseUnitAmount } from '../common.js'\nimport type { ProtocolsContext } from '../context.js'\nimport {\n detectWtrxSwap,\n normalizeRouterToken,\n} from './tokens.js'\nimport type {\n RouterSwapQuote,\n SwapQuote,\n SwapQuoteInput,\n} from './types.js'\n\nfunction requireRoutes(response: { readonly code: number; readonly message?: string; readonly data: unknown }): never | readonly unknown[] {\n if (response.code !== 0) {\n throw new SDKError('SDK_NO_ROUTE', response.message ?? 'Router API returned no route', {\n code: response.code,\n message: response.message,\n })\n }\n if (!Array.isArray(response.data) || response.data.length === 0) {\n throw new SDKError('SDK_NO_ROUTE', 'Router API returned no route', {\n code: response.code,\n })\n }\n return response.data\n}\n\nfunction normalizeRouteTypeList(input: SwapQuoteInput): string | undefined {\n if (input.routerRouteTypes !== undefined && input.typeList !== undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Use routerRouteTypes or typeList, not both', {\n routerRouteTypes: input.routerRouteTypes,\n typeList: input.typeList,\n })\n }\n return input.routerRouteTypes !== undefined ? input.routerRouteTypes.join(',') : input.typeList\n}\n\ntype RequiredRouterAmountField = 'amountIn' | 'amountInRaw' | 'amountOut' | 'amountOutRaw'\n\nfunction requireRouterAmountString(\n route: Record<string, unknown>,\n field: RequiredRouterAmountField,\n routeIndex: number,\n): string {\n const value = route[field]\n if (typeof value !== 'string' || value.length === 0) {\n throw new SDKError('SDK_API_ERROR', `Router route has invalid ${field}`, {\n routeIndex,\n field,\n value,\n })\n }\n return value\n}\n\nfunction normalizeRouterRawAmount(\n value: string,\n field: 'amountInRaw' | 'amountOutRaw',\n routeIndex: number,\n): string {\n try {\n return normalizeBaseUnitAmount(value, `Router route ${field}`)\n } catch {\n throw new SDKError('SDK_API_ERROR', `Router route has invalid ${field}`, {\n routeIndex,\n field,\n value,\n })\n }\n}\n\nfunction validateRouterRoute(\n route: unknown,\n routeIndex: number,\n requestedAmountIn: string,\n): RouterRoute {\n if (typeof route !== 'object' || route === null || Array.isArray(route)) {\n throw new SDKError('SDK_API_ERROR', 'Router route must be an object', {\n routeIndex,\n route,\n })\n }\n\n const routeRecord = route as Record<string, unknown>\n const amountIn = requireRouterAmountString(routeRecord, 'amountIn', routeIndex)\n const amountOut = requireRouterAmountString(routeRecord, 'amountOut', routeIndex)\n const amountInRaw = normalizeRouterRawAmount(\n requireRouterAmountString(routeRecord, 'amountInRaw', routeIndex),\n 'amountInRaw',\n routeIndex,\n )\n const amountOutRaw = normalizeRouterRawAmount(\n requireRouterAmountString(routeRecord, 'amountOutRaw', routeIndex),\n 'amountOutRaw',\n routeIndex,\n )\n\n if (amountInRaw !== requestedAmountIn) {\n throw new SDKError('SDK_API_ERROR', 'Router route input amount does not match the request', {\n routeIndex,\n requestedAmountIn,\n routeAmountInRaw: amountInRaw,\n })\n }\n\n return {\n ...routeRecord,\n amountIn,\n amountInRaw,\n amountOut,\n amountOutRaw,\n }\n}\n\nexport async function quoteRouterSwap(context: ProtocolsContext, input: SwapQuoteInput): Promise<SwapQuote> {\n const wtrxQuote = detectWtrxSwap(context, input)\n if (wtrxQuote) return wtrxQuote\n\n const amountIn = normalizeBaseUnitAmount(input.amountIn, 'amountIn')\n const typeList = normalizeRouteTypeList(input)\n const routerEndpoint = context.endpoints.router\n if (!routerEndpoint) {\n throw new SDKError('SDK_UNSUPPORTED_NETWORK', 'Router API endpoint is not configured for this network', {\n network: context.network,\n })\n }\n const routesResponse = await context.routerApi.getRoutes(routerEndpoint, {\n fromToken: normalizeRouterToken(context, input.tokenIn),\n toToken: normalizeRouterToken(context, input.tokenOut),\n amountIn,\n ...(typeList !== undefined ? { typeList } : {}),\n ...(input.includeUnverifiedV4Hook !== undefined\n ? { includeUnverifiedV4Hook: input.includeUnverifiedV4Hook }\n : {}),\n })\n const routes: RouterSwapQuote['routes'] = requireRoutes(routesResponse).map((route, routeIndex) =>\n validateRouterRoute(route, routeIndex, amountIn))\n const bestRoute = routes[0]\n if (!bestRoute) {\n throw new SDKError('SDK_NO_ROUTE', 'Router API returned no route')\n }\n\n return {\n kind: 'router',\n source: 'router',\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n amountIn: bestRoute.amountInRaw,\n amountOut: bestRoute.amountOutRaw,\n amountInFormatted: bestRoute.amountIn,\n amountOutFormatted: bestRoute.amountOut,\n routes,\n bestRoute,\n }\n}\n\n/** @deprecated Use `quoteRouterSwap` for the explicit Router API. */\nexport const quoteSwap = quoteRouterSwap\n","import type { TransactionAction } from '@sun-protocol/sun-sdk-core'\nimport { createProtocolsContext, type ProtocolsContext } from '../context.js'\nimport {\n executePlanAction,\n executePlanTransactions,\n executeTransactionPlan,\n isTransactionPlan,\n} from '../execute-plan.js'\nimport type { ProtocolClientOptions } from '../types/options.js'\nimport type {\n ExecutedActionResult,\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport { createRouterSwapExecutor } from './router-execute.js'\nimport { planRouterSwap } from './plan.js'\nimport { quoteRouterSwap } from './quote.js'\nimport type {\n SwapQuote,\n SwapQuoteInput,\n SwapRouterClientShape,\n SwapRouterExecuteInput,\n SwapRouterPlanInput,\n SwapTransactionOptions,\n} from './types.js'\nimport {\n assertSwapPlan,\n} from './workflow.js'\n\n/** Router client for both all-in-one and staged TransactionPlan workflows. */\nexport class SwapRouterClient implements SwapRouterClientShape {\n constructor(private readonly context: ProtocolsContext) {}\n\n quote(input: SwapQuoteInput): Promise<SwapQuote> {\n return quoteRouterSwap(this.context, input)\n }\n\n plan(input: SwapRouterPlanInput): Promise<TransactionPlan> {\n return planRouterSwap(this.context, input)\n }\n\n executeAction(action: TransactionAction): Promise<ExecutedActionResult> {\n return executePlanAction(action, createRouterSwapExecutor(this.context))\n }\n\n async submit(\n plan: TransactionPlan,\n options: SwapTransactionOptions = {},\n ): Promise<TransactionPlanExecutionResult> {\n assertSwapPlan(plan, ['universal-router', 'wtrx'], 'Router')\n return executePlanTransactions(\n plan,\n createRouterSwapExecutor(this.context, options),\n )\n }\n\n async execute(\n input: SwapRouterExecuteInput | TransactionPlan,\n ): Promise<TransactionPlanExecutionResult> {\n const plan = isTransactionPlan(input)\n ? input\n : await planRouterSwap(this.context, input)\n assertSwapPlan(plan, ['universal-router', 'wtrx'], 'Router')\n return executeTransactionPlan(plan, createRouterSwapExecutor(this.context))\n }\n}\n\nexport function createSwapRouterClient(options: ProtocolClientOptions): SwapRouterClient {\n return new SwapRouterClient(createProtocolsContext(options))\n}\n","import {\n buildV2RouterAllowedTradingPairRead,\n buildV2RouterAmountsInRead,\n buildV2RouterAmountsOutRead,\n normalizeV2AmountsResult,\n} from '@sun-protocol/sun-sdk-sunswap-v2'\nimport {\n SDKError,\n assertTronAddress,\n type TransactionAction,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n applySlippageMax,\n applySlippageMin,\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeRecipient,\n normalizeTransactionValidForSeconds,\n slippageToBips,\n} from '../common.js'\nimport {\n createProtocolsContext,\n requireRuntime,\n requireWalletSnapshot,\n type ProtocolsContext,\n} from '../context.js'\nimport {\n executePlanAction,\n executePlanTransactions,\n executeTransactionPlan,\n isTransactionPlan,\n} from '../execute-plan.js'\nimport { createDeferredV2SwapAction } from '../internal/v2-swap-action.js'\nimport { planApproval } from '../approval/plan.js'\nimport type {\n ExecutedActionResult,\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type { ProtocolClientOptions } from '../types/options.js'\nimport { normalizeV2SwapPath } from './tokens.js'\nimport type {\n V2SwapClientShape,\n V2SwapMode,\n V2SwapQuote,\n V2SwapQuoteInput,\n} from './types.js'\nimport { createV2SwapExecutor } from './v2-execute.js'\nimport {\n assertSwapPlan,\n} from './workflow.js'\n\nfunction normalizeV2Mode(input: V2SwapQuoteInput): V2SwapMode {\n const mode = input.mode ?? 'exact-in'\n if (mode === 'exact-in') {\n normalizeBaseUnitAmount(input.amountIn ?? '', 'amountIn')\n if (input.amountOut !== undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'exact-in V2 swap does not accept amountOut')\n }\n return mode\n }\n\n normalizeBaseUnitAmount(input.amountOut ?? '', 'amountOut')\n if (input.amountIn !== undefined) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'exact-out V2 swap does not accept amountIn')\n }\n return mode\n}\n\nfunction requireAmount(amounts: readonly string[], index: number, operation: string): string {\n const amount = amounts[index]\n if (amount === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 router returned an incomplete amount path', {\n operation,\n amounts,\n })\n }\n return amount\n}\n\nfunction requireAmountPath(amounts: readonly string[], path: readonly string[], operation: string): void {\n if (amounts.length !== path.length) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V2 router returned an incomplete amount path', {\n operation,\n amounts,\n path,\n })\n }\n}\n\nfunction normalizeAllowedTradingPairResult(result: unknown): boolean {\n if (typeof result === 'boolean') return result\n if (Array.isArray(result) && typeof result[0] === 'boolean') return result[0]\n return Boolean(result)\n}\n\nasync function assertV2PathAllowed(context: ProtocolsContext, path: readonly string[]): Promise<void> {\n const runtime = requireRuntime(context, 'V2 allowed trading pair check')\n for (let index = 0; index < path.length - 1; index += 1) {\n const tokenA = assertTronAddress(path[index] ?? '', `path[${index}]`)\n const tokenB = assertTronAddress(path[index + 1] ?? '', `path[${index + 1}]`)\n const allowed = normalizeAllowedTradingPairResult(await runtime.readContract(buildV2RouterAllowedTradingPairRead({\n network: context.network,\n tokenA,\n tokenB,\n })))\n\n if (!allowed) {\n throw new SDKError('SDK_NO_ROUTE', 'SunSwap V2 router does not allow this trading pair', {\n operation: 'v2-allowed-trading-pair-check',\n blockedPair: [tokenA, tokenB],\n path,\n })\n }\n }\n}\n\nasync function quoteV2Swap(context: ProtocolsContext, input: V2SwapQuoteInput): Promise<V2SwapQuote> {\n const runtime = requireRuntime(context, 'V2 swap quote')\n const mode = normalizeV2Mode(input)\n const pathInfo = normalizeV2SwapPath(context, input)\n await assertV2PathAllowed(context, pathInfo.path)\n\n if (mode === 'exact-in') {\n const amountIn = normalizeBaseUnitAmount(input.amountIn ?? '', 'amountIn')\n const amounts = normalizeV2AmountsResult(await runtime.readContract(buildV2RouterAmountsOutRead({\n network: context.network,\n amountIn,\n path: pathInfo.path,\n })))\n requireAmountPath(amounts, pathInfo.path, 'v2-exact-in-quote')\n return {\n kind: 'v2',\n source: 'v2',\n mode,\n direction: pathInfo.direction,\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n amountIn,\n amountOut: requireAmount(amounts, amounts.length - 1, 'v2-exact-in-quote'),\n path: pathInfo.path,\n }\n }\n\n const amountOut = normalizeBaseUnitAmount(input.amountOut ?? '', 'amountOut')\n const amounts = normalizeV2AmountsResult(await runtime.readContract(buildV2RouterAmountsInRead({\n network: context.network,\n amountOut,\n path: pathInfo.path,\n })))\n requireAmountPath(amounts, pathInfo.path, 'v2-exact-out-quote')\n return {\n kind: 'v2',\n source: 'v2',\n mode,\n direction: pathInfo.direction,\n tokenIn: input.tokenIn,\n tokenOut: input.tokenOut,\n amountIn: requireAmount(amounts, 0, 'v2-exact-out-quote'),\n amountOut,\n path: pathInfo.path,\n }\n}\n\nasync function planV2Swap(context: ProtocolsContext, input: V2SwapQuoteInput): Promise<TransactionPlan> {\n const { address: owner } = await requireWalletSnapshot(context, 'V2 swap plan')\n const quote = await quoteV2Swap(context, input)\n const recipient = await normalizeRecipient(context, input.recipient, 'V2 swap recipient', owner)\n const transactionValidForSeconds = normalizeTransactionValidForSeconds(input.transactionValidForSeconds)\n const slippageBips = slippageToBips(input.slippage ?? '0.5%')\n const approvals: TransactionAction[] = []\n\n if (quote.mode === 'exact-in' && quote.direction === 'trx-to-token') {\n const minAmountOut = applySlippageMin(BigInt(quote.amountOut), slippageBips).toString()\n const transaction = createDeferredV2SwapAction({\n data: {\n operation: 'swap-exact-eth-for-tokens',\n amountIn: quote.amountIn,\n amountOutMin: minAmountOut,\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n },\n })\n return {\n id: nextPlanId(context, 'swap-v2'),\n kind: 'swap',\n network: context.network,\n owner,\n summary: {\n title: 'Swap with SunSwap V2',\n lines: [`Spend ${quote.amountIn} sun`, `Receive at least ${minAmountOut} token units`],\n },\n approvals,\n transactions: [transaction],\n metadata: {\n protocol: 'sunswap-v2',\n mode: quote.mode,\n direction: quote.direction,\n amountIn: quote.amountIn,\n quotedAmountOut: quote.amountOut,\n minAmountOut,\n slippageBips,\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n },\n }\n }\n\n if (quote.mode === 'exact-out' && quote.direction === 'trx-to-token') {\n const maxAmountIn = applySlippageMax(BigInt(quote.amountIn), slippageBips).toString()\n const transaction = createDeferredV2SwapAction({\n data: {\n operation: 'swap-eth-for-exact-tokens',\n amountOut: quote.amountOut,\n amountInMax: maxAmountIn,\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n },\n })\n return {\n id: nextPlanId(context, 'swap-v2'),\n kind: 'swap',\n network: context.network,\n owner,\n summary: {\n title: 'Swap with SunSwap V2',\n lines: [`Spend at most ${maxAmountIn} sun`, `Receive ${quote.amountOut} token units`],\n },\n approvals,\n transactions: [transaction],\n metadata: {\n protocol: 'sunswap-v2',\n mode: quote.mode,\n direction: quote.direction,\n amountOut: quote.amountOut,\n quotedAmountIn: quote.amountIn,\n maxAmountIn,\n slippageBips,\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n },\n }\n }\n\n const tokenInputAmount = quote.mode === 'exact-in'\n ? quote.amountIn\n : applySlippageMax(BigInt(quote.amountIn), slippageBips).toString()\n const approval = await planApproval(context, {\n asset: { type: 'token', token: assertTronAddress(input.tokenIn, 'tokenIn') },\n owner,\n spender: context.chain.contracts.sunswapV2Router,\n amount: tokenInputAmount,\n }, {\n mode: input.approval ?? 'auto',\n amount: 'exact',\n })\n approvals.push(...approval.actions)\n\n if (quote.mode === 'exact-in') {\n const minAmountOut = applySlippageMin(BigInt(quote.amountOut), slippageBips).toString()\n const transaction = quote.direction === 'token-to-trx'\n ? createDeferredV2SwapAction({\n data: {\n operation: 'swap-exact-tokens-for-eth',\n amountIn: quote.amountIn,\n amountOutMin: minAmountOut,\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n },\n })\n : createDeferredV2SwapAction({\n data: {\n operation: 'swap-exact-tokens-for-tokens',\n amountIn: quote.amountIn,\n amountOutMin: minAmountOut,\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n },\n })\n return {\n id: nextPlanId(context, 'swap-v2'),\n kind: 'swap',\n network: context.network,\n owner,\n summary: {\n title: 'Swap with SunSwap V2',\n lines: [\n `Sell ${quote.amountIn} token units`,\n `Receive at least ${minAmountOut} ${quote.direction === 'token-to-trx' ? 'sun' : 'token units'}`,\n ],\n },\n approvals,\n transactions: [transaction],\n metadata: {\n protocol: 'sunswap-v2',\n mode: quote.mode,\n direction: quote.direction,\n amountIn: quote.amountIn,\n quotedAmountOut: quote.amountOut,\n minAmountOut,\n slippageBips,\n approvalMode: input.approval ?? 'auto',\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n owner,\n spender: context.chain.contracts.sunswapV2Router,\n },\n }\n }\n\n const maxAmountIn = tokenInputAmount\n const transaction = quote.direction === 'token-to-trx'\n ? createDeferredV2SwapAction({\n data: {\n operation: 'swap-tokens-for-exact-eth',\n amountOut: quote.amountOut,\n amountInMax: maxAmountIn,\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n },\n })\n : createDeferredV2SwapAction({\n data: {\n operation: 'swap-tokens-for-exact-tokens',\n amountOut: quote.amountOut,\n amountInMax: maxAmountIn,\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n },\n })\n return {\n id: nextPlanId(context, 'swap-v2'),\n kind: 'swap',\n network: context.network,\n owner,\n summary: {\n title: 'Swap with SunSwap V2',\n lines: [\n `Spend at most ${maxAmountIn} token units`,\n `Receive ${quote.amountOut} ${quote.direction === 'token-to-trx' ? 'sun' : 'token units'}`,\n ],\n },\n approvals,\n transactions: [transaction],\n metadata: {\n protocol: 'sunswap-v2',\n mode: quote.mode,\n direction: quote.direction,\n amountOut: quote.amountOut,\n quotedAmountIn: quote.amountIn,\n maxAmountIn,\n slippageBips,\n approvalMode: input.approval ?? 'auto',\n path: quote.path,\n recipient,\n transactionValidForSeconds,\n owner,\n spender: context.chain.contracts.sunswapV2Router,\n },\n }\n}\n\nexport class V2SwapClient implements V2SwapClientShape {\n constructor(private readonly context: ProtocolsContext) {}\n\n quote(_input: V2SwapQuoteInput): Promise<V2SwapQuote> {\n return quoteV2Swap(this.context, _input)\n }\n\n plan(input: V2SwapQuoteInput): Promise<TransactionPlan> {\n return planV2Swap(this.context, input)\n }\n\n executeAction(action: TransactionAction): Promise<ExecutedActionResult> {\n return executePlanAction(action, createV2SwapExecutor(this.context))\n }\n\n submit(plan: TransactionPlan): Promise<TransactionPlanExecutionResult> {\n assertSwapPlan(plan, ['sunswap-v2'], 'SunSwap V2')\n return executePlanTransactions(plan, createV2SwapExecutor(this.context))\n }\n\n async execute(\n input: V2SwapQuoteInput | TransactionPlan,\n ): Promise<TransactionPlanExecutionResult> {\n const plan = isTransactionPlan(input)\n ? input\n : await planV2Swap(this.context, input)\n assertSwapPlan(plan, ['sunswap-v2'], 'SunSwap V2')\n return executeTransactionPlan(plan, createV2SwapExecutor(this.context))\n }\n}\n\nexport function createV2SwapClient(context: ProtocolsContext): V2SwapClient {\n return new V2SwapClient(context)\n}\n\nexport function createV2Client(options: ProtocolClientOptions): V2SwapClient {\n return createV2SwapClient(createProtocolsContext(options))\n}\n","import type { ProtocolsContext } from '../context.js'\nimport { createPsmSwapClient } from './psm.js'\nimport { SwapRouterClient } from './router.js'\nimport type { SwapNamespace } from './types.js'\nimport { createV2SwapClient } from './v2.js'\n\nexport function createSwapNamespace(context: ProtocolsContext): SwapNamespace {\n return {\n router: new SwapRouterClient(context),\n v2: createV2SwapClient(context),\n psm: createPsmSwapClient(context),\n }\n}\n","import type { ChainConfig } from '@sun-protocol/sun-sdk-chains'\nimport type { Network } from '@sun-protocol/sun-sdk-core'\nimport type { ContractClient, Runtime, WalletAdapter } from '@sun-protocol/sun-sdk-runtime'\nimport {\n createProtocolsContext,\n type ProtocolsContext,\n} from './context.js'\nimport { createLiquidityClient, type LiquidityClient } from './liquidity/client.js'\nimport { createPositionsClient, type PositionsClient } from './positions/client.js'\nimport { createPumpClient, type PumpClient } from './pump/client.js'\nimport { createSwapNamespace } from './swap/namespace.js'\nimport type { SwapNamespace } from './swap/types.js'\nimport type { SunSDKCreateOptions } from './types/options.js'\n\nexport class SunSDK {\n readonly network: Network\n readonly chain: ChainConfig\n readonly runtime: Runtime | undefined\n readonly contract: ContractClient | undefined\n readonly wallet: WalletAdapter | undefined\n readonly context: ProtocolsContext\n readonly pump: PumpClient\n readonly swap: SwapNamespace\n readonly liquidity: LiquidityClient\n readonly positions: PositionsClient\n\n private constructor(context: ProtocolsContext) {\n this.context = context\n this.network = context.network\n this.chain = context.chain\n this.runtime = context.runtime\n this.contract = context.runtime?.contract\n this.wallet = context.runtime?.wallet\n this.pump = createPumpClient(context)\n this.swap = createSwapNamespace(context)\n this.liquidity = createLiquidityClient(context)\n this.positions = createPositionsClient(context)\n }\n\n static async create(options: SunSDKCreateOptions): Promise<SunSDK> {\n return new SunSDK(createProtocolsContext(options))\n }\n}\n"],"mappings":"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","names":["import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_api","import_sun_sdk_core","import_sun_sdk_core","nextPlanId","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_sunswap_v2","import_sun_sdk_core","import_sun_sdk_chains","import_sun_sdk_core","PERCENT_PATTERN","evmHexToTronAddressV2","metadata","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_sunswap_v3","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","integerString","integerNumber","unwrapSingle","import_sun_sdk_core","import_sun_sdk_sunswap_v3","import_sun_sdk_sunswap_v4","Q96","parseString","parseNumber","unwrapSingle","signed24","resolveRemoveLiquidity","import_sun_sdk_launchpad","import_sun_sdk_core","import_sun_sdk_launchpad","import_sun_sdk_core","import_sun_sdk_sunswap_v2","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_sunswap_v2","import_sun_sdk_core","transaction","amounts","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_launchpad","import_sun_sdk_core","import_sun_sdk_launchpad","import_sun_sdk_core","minTrxOut","transaction","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_sunswap_v3","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_core","import_sun_sdk_sunswap_v2","import_sun_sdk_core","requireAmount","amounts","transaction","maxAmountIn"]}
|