@sun-protocol/sun-sdk-protocols 0.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +30 -0
  2. package/dist/chunk-5XDX5563.js +99 -0
  3. package/dist/chunk-5XDX5563.js.map +1 -0
  4. package/dist/chunk-C2YCVBPI.js +212 -0
  5. package/dist/chunk-C2YCVBPI.js.map +1 -0
  6. package/dist/chunk-ECCGOXNA.js +1317 -0
  7. package/dist/chunk-ECCGOXNA.js.map +1 -0
  8. package/dist/chunk-HD2S3Q7L.js +746 -0
  9. package/dist/chunk-HD2S3Q7L.js.map +1 -0
  10. package/dist/chunk-L5TZCDPH.js +561 -0
  11. package/dist/chunk-L5TZCDPH.js.map +1 -0
  12. package/dist/chunk-OM4OW4KB.js +224 -0
  13. package/dist/chunk-OM4OW4KB.js.map +1 -0
  14. package/dist/chunk-PEGREDLT.js +935 -0
  15. package/dist/chunk-PEGREDLT.js.map +1 -0
  16. package/dist/chunk-TSHXXRH2.js +103 -0
  17. package/dist/chunk-TSHXXRH2.js.map +1 -0
  18. package/dist/chunk-VFVKMC4H.js +521 -0
  19. package/dist/chunk-VFVKMC4H.js.map +1 -0
  20. package/dist/chunk-YMGZDXI4.js +1209 -0
  21. package/dist/chunk-YMGZDXI4.js.map +1 -0
  22. package/dist/common-8VQQ0FSU.d.cts +146 -0
  23. package/dist/common-8VQQ0FSU.d.ts +146 -0
  24. package/dist/execute-BNKh6dT6.d.cts +187 -0
  25. package/dist/execute-CVhcKZxF.d.ts +187 -0
  26. package/dist/index.cjs +5619 -0
  27. package/dist/index.cjs.map +1 -0
  28. package/dist/index.d.cts +139 -0
  29. package/dist/index.d.ts +139 -0
  30. package/dist/index.js +200 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/intents-BSXq1HvW.d.cts +200 -0
  33. package/dist/intents-CwOttD75.d.ts +200 -0
  34. package/dist/liquidity/index.cjs +2441 -0
  35. package/dist/liquidity/index.cjs.map +1 -0
  36. package/dist/liquidity/index.d.cts +83 -0
  37. package/dist/liquidity/index.d.ts +83 -0
  38. package/dist/liquidity/index.js +32 -0
  39. package/dist/liquidity/index.js.map +1 -0
  40. package/dist/positions/index.cjs +1544 -0
  41. package/dist/positions/index.cjs.map +1 -0
  42. package/dist/positions/index.d.cts +159 -0
  43. package/dist/positions/index.d.ts +159 -0
  44. package/dist/positions/index.js +25 -0
  45. package/dist/positions/index.js.map +1 -0
  46. package/dist/pump/index.cjs +1178 -0
  47. package/dist/pump/index.cjs.map +1 -0
  48. package/dist/pump/index.d.cts +16 -0
  49. package/dist/pump/index.d.ts +16 -0
  50. package/dist/pump/index.js +29 -0
  51. package/dist/pump/index.js.map +1 -0
  52. package/dist/swap/index.cjs +2259 -0
  53. package/dist/swap/index.cjs.map +1 -0
  54. package/dist/swap/index.d.cts +33 -0
  55. package/dist/swap/index.d.ts +33 -0
  56. package/dist/swap/index.js +61 -0
  57. package/dist/swap/index.js.map +1 -0
  58. package/dist/types-BTPdCC7k.d.cts +160 -0
  59. package/dist/types-BfrouFmO.d.ts +160 -0
  60. package/package.json +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/swap/intents.ts","../src/swap/psm.ts","../src/swap/fee-limit.ts","../src/swap/workflow.ts","../src/swap/router-execute.ts","../src/internal/router-action.ts","../src/internal/universal-router-adapter.ts","../src/swap/tokens.ts","../src/swap/plan.ts","../src/swap/quote.ts","../src/swap/router.ts","../src/swap/v2.ts"],"sourcesContent":["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 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 {\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 { 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 {\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 } 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"],"mappings":"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","names":["SDKError","SDKError","SDKError","SDKError","SDKError","SDKError","SDKError","SDKError","assertTronAddress","assertTronAddress","SDKError","SDKError","assertTronAddress","createContractCallAction","formatUnits","SDKError","formatUnits","createContractCallAction","assertTronAddress","SDKError","SDKError","SDKError","assertTronAddress","SDKError","assertTronAddress","amounts","transaction","maxAmountIn"]}