@sun-protocol/sun-sdk-protocols 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/dist/chunk-5XDX5563.js +99 -0
- package/dist/chunk-5XDX5563.js.map +1 -0
- package/dist/chunk-C2YCVBPI.js +212 -0
- package/dist/chunk-C2YCVBPI.js.map +1 -0
- package/dist/chunk-ECCGOXNA.js +1317 -0
- package/dist/chunk-ECCGOXNA.js.map +1 -0
- package/dist/chunk-HD2S3Q7L.js +746 -0
- package/dist/chunk-HD2S3Q7L.js.map +1 -0
- package/dist/chunk-L5TZCDPH.js +561 -0
- package/dist/chunk-L5TZCDPH.js.map +1 -0
- package/dist/chunk-OM4OW4KB.js +224 -0
- package/dist/chunk-OM4OW4KB.js.map +1 -0
- package/dist/chunk-PEGREDLT.js +935 -0
- package/dist/chunk-PEGREDLT.js.map +1 -0
- package/dist/chunk-TSHXXRH2.js +103 -0
- package/dist/chunk-TSHXXRH2.js.map +1 -0
- package/dist/chunk-VFVKMC4H.js +521 -0
- package/dist/chunk-VFVKMC4H.js.map +1 -0
- package/dist/chunk-YMGZDXI4.js +1209 -0
- package/dist/chunk-YMGZDXI4.js.map +1 -0
- package/dist/common-8VQQ0FSU.d.cts +146 -0
- package/dist/common-8VQQ0FSU.d.ts +146 -0
- package/dist/execute-BNKh6dT6.d.cts +187 -0
- package/dist/execute-CVhcKZxF.d.ts +187 -0
- package/dist/index.cjs +5619 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +139 -0
- package/dist/index.d.ts +139 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/intents-BSXq1HvW.d.cts +200 -0
- package/dist/intents-CwOttD75.d.ts +200 -0
- package/dist/liquidity/index.cjs +2441 -0
- package/dist/liquidity/index.cjs.map +1 -0
- package/dist/liquidity/index.d.cts +83 -0
- package/dist/liquidity/index.d.ts +83 -0
- package/dist/liquidity/index.js +32 -0
- package/dist/liquidity/index.js.map +1 -0
- package/dist/positions/index.cjs +1544 -0
- package/dist/positions/index.cjs.map +1 -0
- package/dist/positions/index.d.cts +159 -0
- package/dist/positions/index.d.ts +159 -0
- package/dist/positions/index.js +25 -0
- package/dist/positions/index.js.map +1 -0
- package/dist/pump/index.cjs +1178 -0
- package/dist/pump/index.cjs.map +1 -0
- package/dist/pump/index.d.cts +16 -0
- package/dist/pump/index.d.ts +16 -0
- package/dist/pump/index.js +29 -0
- package/dist/pump/index.js.map +1 -0
- package/dist/swap/index.cjs +2259 -0
- package/dist/swap/index.cjs.map +1 -0
- package/dist/swap/index.d.cts +33 -0
- package/dist/swap/index.d.ts +33 -0
- package/dist/swap/index.js +61 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/types-BTPdCC7k.d.cts +160 -0
- package/dist/types-BfrouFmO.d.ts +160 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/positions/execute.ts","../src/positions/intents.ts","../src/positions/v3.ts","../src/internal/positions.ts","../src/positions/v4.ts","../src/positions/client.ts"],"sourcesContent":["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 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 CurrencyAmount,\n Percent,\n SDKError,\n Token,\n assertTronAddress,\n type Currency,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport {\n buildV3PositionApprovalForAllRead,\n buildV3PositionReads,\n computeV3PoolAddress,\n NonfungiblePositionManager,\n Pool,\n Position,\n type FeeAmount,\n} from '@sun-protocol/sun-sdk-sunswap-v3'\nimport {\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n normalizeRecipient,\n parseSlippage,\n slippageToBips,\n} from '../common.js'\nimport {\n requireWalletAddress,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport { executeTransactionPlan } from '../execute-plan.js'\nimport { createV3PositionsExecutor } from './execute.js'\nimport type { TransferSource, UsdtTransferContext } from '../usdt-transfer.js'\nimport { methodParametersToAction } from '../internal/method-parameters.js'\nimport { assertPositionAuthorized } from '../internal/positions.js'\nimport {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport {\n evmHexToTronAddress,\n normalizeLiquidityPercentage,\n tronAddressToEvmAddress,\n} from '../internal/tokens.js'\nimport { resolveV3PoolState } from '../liquidity/v3.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V3PositionCollectInput,\n V3PositionReadInput,\n V3PositionRemoveInput,\n V3PositionSnapshot,\n} from './types.js'\nimport {\n positionIntentScope,\n SUNSWAP_V3_POSITION_PROTOCOL_ID,\n} from './intents.js'\n\ninterface V3PositionObjectResult {\n readonly token0?: unknown\n readonly token1?: unknown\n readonly fee?: unknown\n readonly tickLower?: unknown\n readonly tickUpper?: unknown\n readonly liquidity?: unknown\n readonly tokensOwed0?: unknown\n readonly tokensOwed1?: unknown\n}\n\nfunction integerString(value: unknown, label: string): string {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint') {\n return BigInt(value.toString()).toString()\n }\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n}\n\nfunction integerNumber(value: unknown, label: string): number {\n const parsed = Number(integerString(value, label))\n if (!Number.isSafeInteger(parsed)) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be a safe integer`, { value })\n }\n return parsed\n}\n\nfunction unwrapSingle(value: unknown): unknown {\n return Array.isArray(value) && value.length === 1 ? value[0] : value\n}\n\nfunction parsePositionAddress(value: unknown, label: string): TronAddress {\n const raw = String(unwrapSingle(value))\n try {\n return assertTronAddress(raw, label)\n } catch {\n const evmHex = /^41[0-9a-fA-F]{40}$/.test(raw) ? `0x${raw.slice(2)}` : raw\n return evmHexToTronAddress(evmHex, label)\n }\n}\n\nfunction normalizePositionToken(\n context: ProtocolsContext,\n value: unknown,\n label: string,\n): { publicAddress: TronAddress; token: Token } {\n if (typeof value !== 'string') {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an address string`, { value })\n }\n const publicAddress = parsePositionAddress(value, label)\n const evmAddress = tronAddressToEvmAddress(publicAddress, label)\n\n return {\n publicAddress,\n token: new Token(context.chain.uniswapChainId, evmAddress, 6, undefined, undefined, true),\n }\n}\n\nfunction parsePositionResult(\n context: ProtocolsContext,\n tokenId: string,\n result: unknown,\n owner: TronAddress,\n approved?: TronAddress,\n operatorApproved?: boolean,\n): V3PositionSnapshot & { readonly token0Entity: Token; readonly token1Entity: Token } {\n let token0: unknown\n let token1: unknown\n let fee: unknown\n let tickLower: unknown\n let tickUpper: unknown\n let liquidity: unknown\n let tokensOwed0: unknown\n let tokensOwed1: unknown\n\n if (Array.isArray(result)) {\n token0 = result[2]\n token1 = result[3]\n fee = result[4]\n tickLower = result[5]\n tickUpper = result[6]\n liquidity = result[7]\n tokensOwed0 = result[10]\n tokensOwed1 = result[11]\n } else if (typeof result === 'object' && result !== null) {\n const position = result as V3PositionObjectResult\n token0 = position.token0\n token1 = position.token1\n fee = position.fee\n tickLower = position.tickLower\n tickUpper = position.tickUpper\n liquidity = position.liquidity\n tokensOwed0 = position.tokensOwed0\n tokensOwed1 = position.tokensOwed1\n } else {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V3 position result is malformed', { result })\n }\n\n const token0Info = normalizePositionToken(context, token0, 'token0')\n const token1Info = normalizePositionToken(context, token1, 'token1')\n\n return {\n protocol: 'sunswap-v3',\n tokenId,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n token0: token0Info.publicAddress,\n token1: token1Info.publicAddress,\n fee: integerNumber(fee, 'fee'),\n tickLower: integerNumber(tickLower, 'tickLower'),\n tickUpper: integerNumber(tickUpper, 'tickUpper'),\n liquidity: integerString(liquidity, 'liquidity'),\n tokensOwed0: integerString(tokensOwed0, 'tokensOwed0'),\n tokensOwed1: integerString(tokensOwed1, 'tokensOwed1'),\n token0Entity: token0Info.token,\n token1Entity: token1Info.token,\n }\n}\n\nfunction removePercentage(input: V3PositionRemoveInput, snapshot: V3PositionSnapshot): Percent {\n if (input.percentage !== undefined) return normalizeLiquidityPercentage(input.percentage, 'percentage')\n const liquidity = BigInt(normalizeBaseUnitAmount(input.liquidity, 'liquidity'))\n const total = BigInt(snapshot.liquidity)\n if (liquidity > total) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'liquidity cannot exceed position liquidity', {\n liquidity: liquidity.toString(),\n totalLiquidity: total.toString(),\n })\n }\n return new Percent(liquidity.toString(), total.toString())\n}\n\nfunction currencyForCollect(\n context: ProtocolsContext,\n token: Token,\n publicAddress: TronAddress,\n receiveNative: boolean | undefined,\n): Currency {\n return receiveNative && publicAddress === context.chain.contracts.wtrx\n ? context.chain.nativeCurrency\n : token\n}\n\nexport class V3PositionsClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n async read(input: V3PositionReadInput): Promise<V3PositionSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const [positionResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n buildV3PositionReads({\n network: this.context.network,\n tokenId,\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager'),\n }),\n 'V3 position read',\n )\n const owner = parsePositionAddress(ownerResult, 'owner')\n const approved = approvedResult ? parsePositionAddress(approvedResult, 'approved') : undefined\n const operator = input.operator ? assertTronAddress(input.operator, 'operator') : undefined\n const operatorApproved = operator\n ? Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV3PositionApprovalForAllRead({\n network: this.context.network,\n owner,\n operator,\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager'),\n }),\n 'V3 position operator approval read',\n ))\n : undefined\n\n const snapshot = parsePositionResult(\n this.context,\n tokenId,\n positionResult,\n owner,\n approved,\n operatorApproved,\n )\n return {\n protocol: snapshot.protocol,\n tokenId: snapshot.tokenId,\n owner: snapshot.owner,\n ...(snapshot.approved !== undefined ? { approved: snapshot.approved } : {}),\n ...(snapshot.operatorApproved !== undefined ? { operatorApproved: snapshot.operatorApproved } : {}),\n token0: snapshot.token0,\n token1: snapshot.token1,\n fee: snapshot.fee,\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n liquidity: snapshot.liquidity,\n tokensOwed0: snapshot.tokensOwed0,\n tokensOwed1: snapshot.tokensOwed1,\n }\n }\n\n readonly remove = {\n plan: async (input: V3PositionRemoveInput): Promise<TransactionPlan> => this.planRemove(input),\n execute: async (input: V3PositionRemoveInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planRemove(input), createV3PositionsExecutor(this.context)),\n }\n\n readonly collect = {\n plan: async (input: V3PositionCollectInput): Promise<TransactionPlan> => this.planCollect(input),\n execute: async (input: V3PositionCollectInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planCollect(input), createV3PositionsExecutor(this.context)),\n }\n\n private usdtTransferContext(\n snapshot: V3PositionSnapshot,\n positionManager: TronAddress,\n input: V3PositionCollectInput,\n ): UsdtTransferContext {\n const { network, chain } = this.context\n const usdtAddress = chain.contracts.usdt\n const transfersUsdt = snapshot.token0 === usdtAddress || snapshot.token1 === usdtAddress\n const sources: TransferSource[] = []\n const factory = resolveProtocolContract(this.context, input.contracts, 'sunswapV3Factory')\n // Only the configured deployment has a known factory/init-code pairing.\n // Unknown custom deployments keep an empty source list and fail closed on send.\n if (transfersUsdt && positionManager === chain.contracts.sunswapV3PositionManager && factory === chain.contracts.sunswapV3Factory) {\n sources.push({\n address: computeV3PoolAddress({ network, tokenA: snapshot.token0, tokenB: snapshot.token1, fee: snapshot.fee, factory }),\n role: 'v3-pool',\n })\n sources.push({ address: positionManager, role: 'position-manager' })\n }\n return { network, transfersUsdt, sources }\n }\n\n private async readAuthorizedPosition(\n tokenId: string,\n operation: string,\n positionManager: TronAddress,\n validationMode: V3PositionRemoveInput['validationMode'],\n ) {\n const wallet = await requireWalletAddress(this.context, operation)\n const [positionResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n buildV3PositionReads({ network: this.context.network, tokenId, positionManager }),\n operation,\n )\n const owner = parsePositionAddress(ownerResult, 'owner')\n const approved = approvedResult ? parsePositionAddress(approvedResult, 'approved') : undefined\n const operatorApproved = validationMode === 'legacy'\n ? undefined\n : Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV3PositionApprovalForAllRead({ network: this.context.network, owner, operator: wallet, positionManager }),\n `${operation} operator approval read`,\n ))\n if (validationMode !== 'legacy') {\n assertPositionAuthorized({\n tokenId,\n wallet,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n })\n }\n return {\n wallet,\n snapshot: parsePositionResult(this.context, tokenId, positionResult, owner, approved, operatorApproved),\n }\n }\n\n private async planRemove(input: V3PositionRemoveInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager')\n const planId = nextPlanId(this.context, 'position-v3-remove')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V3 remove position',\n positionManager,\n input.validationMode,\n )\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V3 remove position', wallet)\n const deadline = normalizeDeadline(this.context, input)\n const slippage = parseSlippage(input.slippage ?? '0.5%')\n const poolDerived = input.pool === undefined\n const poolState = input.pool ?? await resolveV3PoolState(this.context, {\n tokenA: snapshot.token0,\n tokenB: snapshot.token1,\n fee: snapshot.fee,\n contracts: input.contracts,\n })\n const pool = new Pool({\n tokenA: snapshot.token0Entity,\n tokenB: snapshot.token1Entity,\n fee: snapshot.fee as FeeAmount,\n sqrtRatioX96: normalizeBaseUnitAmount(poolState.sqrtRatioX96, 'sqrtRatioX96'),\n liquidity: normalizeBaseUnitAmount(poolState.liquidity, 'pool liquidity', { allowZero: true }),\n tickCurrent: poolState.tickCurrent,\n ...(poolState.tickSpacing !== undefined ? { tickSpacing: poolState.tickSpacing } : {}),\n })\n const position = new Position({\n pool,\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n liquidity: snapshot.liquidity,\n })\n const token0 = assertTronAddress(snapshot.token0, 'token0')\n const token1 = assertTronAddress(snapshot.token1, 'token1')\n const expectedCurrencyOwed0 = CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token0Entity, token0, input.receiveNative),\n input.expectedCurrencyOwed0 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed0, 'expectedCurrencyOwed0', { allowZero: true })\n : snapshot.tokensOwed0,\n )\n const expectedCurrencyOwed1 = CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token1Entity, token1, input.receiveNative),\n input.expectedCurrencyOwed1 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed1, 'expectedCurrencyOwed1', { allowZero: true })\n : snapshot.tokensOwed1,\n )\n const methodParameters = NonfungiblePositionManager.removeCallParameters(position, {\n tokenId,\n liquidityPercentage: removePercentage(input, snapshot),\n slippageTolerance: slippage,\n deadline,\n ...(input.burnToken !== undefined ? { burnToken: input.burnToken } : {}),\n collectOptions: {\n recipient: tronAddressToEvmAddress(recipient, 'recipient'),\n expectedCurrencyOwed0,\n expectedCurrencyOwed1,\n },\n })\n const action = methodParametersToAction({\n id: `${planId}-tx`,\n target: positionManager,\n methodParameters,\n metadata: { usdtTransfer: this.usdtTransferContext(snapshot, positionManager, input) },\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n intent: {\n kind: 'remove-liquidity',\n scope: positionIntentScope(SUNSWAP_V3_POSITION_PROTOCOL_ID, 'remove-position'),\n positionId: tokenId,\n },\n })\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: { title: 'Remove SunSwap V3 position liquidity', lines: [`Position ${tokenId}`, `Recipient ${recipient}`] },\n approvals: [],\n transactions: [action],\n metadata: {\n protocol: 'sunswap-v3',\n operation: 'remove-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n slippageBips: slippageToBips(input.slippage ?? '0.5%'),\n positionDerived: true,\n poolDerived,\n },\n }\n }\n\n private async planCollect(input: V3PositionCollectInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV3PositionManager')\n const planId = nextPlanId(this.context, 'position-v3-collect')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V3 collect position',\n positionManager,\n input.validationMode,\n )\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V3 collect position', wallet)\n const token0 = assertTronAddress(snapshot.token0, 'token0')\n const token1 = assertTronAddress(snapshot.token1, 'token1')\n const methodParameters = NonfungiblePositionManager.collectCallParameters({\n tokenId,\n recipient: tronAddressToEvmAddress(recipient, 'recipient'),\n expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token0Entity, token0, input.receiveNative),\n input.expectedCurrencyOwed0 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed0, 'expectedCurrencyOwed0', { allowZero: true })\n : snapshot.tokensOwed0,\n ),\n expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(\n currencyForCollect(this.context, snapshot.token1Entity, token1, input.receiveNative),\n input.expectedCurrencyOwed1 !== undefined\n ? normalizeBaseUnitAmount(input.expectedCurrencyOwed1, 'expectedCurrencyOwed1', { allowZero: true })\n : snapshot.tokensOwed1,\n ),\n })\n const action = methodParametersToAction({\n id: `${planId}-tx`,\n target: positionManager,\n methodParameters,\n metadata: { usdtTransfer: this.usdtTransferContext(snapshot, positionManager, input) },\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n intent: {\n kind: 'collect-fees',\n scope: positionIntentScope(SUNSWAP_V3_POSITION_PROTOCOL_ID, 'collect-position'),\n positionId: tokenId,\n },\n })\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: { title: 'Collect SunSwap V3 position fees', lines: [`Position ${tokenId}`, `Recipient ${recipient}`] },\n approvals: [],\n transactions: [action],\n metadata: {\n protocol: 'sunswap-v3',\n operation: 'collect-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n },\n }\n }\n}\n","import {\n 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 {\n SDKError,\n assertTronAddress,\n type BigintIsh,\n type Percent,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { TickMath } from '@sun-protocol/sun-sdk-sunswap-v3'\nimport {\n buildV4CollectAction,\n buildV4DecreaseLiquidityAction,\n buildV4MulticallAction,\n buildV4PositionApprovalForAllRead,\n buildV4PositionFeesRead,\n buildV4PositionReads,\n buildV4PoolSlot0Read,\n computeV4PoolId,\n createV4PoolKey,\n encodeV4ContractCallAction,\n type V4PoolKey,\n} from '@sun-protocol/sun-sdk-sunswap-v4'\nimport {\n applySlippageMin,\n nextPlanId,\n normalizeBaseUnitAmount,\n normalizeDeadline,\n normalizeRecipient,\n} from '../common.js'\nimport {\n createContextExecutor,\n requireWalletAddress,\n resolveProtocolContract,\n type ProtocolsContext,\n} from '../context.js'\nimport { executeTransactionPlan } from '../execute-plan.js'\nimport { assertPositionAuthorized } from '../internal/positions.js'\nimport {\n readMulticallRequired,\n readRequiredContract,\n} from '../internal/reads.js'\nimport { evmHexToTronAddress, normalizeLiquidityPercentage } from '../internal/tokens.js'\nimport { slippageToBips } from '../common.js'\nimport type {\n TransactionPlan,\n TransactionPlanExecutionResult,\n} from '../types/plan.js'\nimport type {\n V4PositionCollectInput,\n V4PositionFeesSnapshot,\n V4PositionReadInput,\n V4PositionRemoveInput,\n V4PositionSnapshot,\n} from './types.js'\nimport {\n positionIntentScope,\n SUNSWAP_V4_POSITION_PROTOCOL_ID,\n} from './intents.js'\n\ninterface V4PoolAndPositionInfoObjectResult {\n readonly poolKey?: unknown\n readonly tickLower?: unknown\n readonly tickUpper?: unknown\n}\n\ntype OptionalV4PoolKey<T> = T extends unknown\n ? Omit<T, 'poolKey'> & { readonly poolKey?: V4PoolKey }\n : never\n\ntype V4PositionRemovePlanInput = OptionalV4PoolKey<V4PositionRemoveInput>\ntype V4PositionCollectPlanInput = OptionalV4PoolKey<V4PositionCollectInput>\n\nconst Q96 = 1n << 96n\n\nfunction parseString(value: unknown, label: string): string {\n if (typeof value === 'bigint' || typeof value === 'number' || typeof value === 'string') {\n return BigInt(value.toString()).toString()\n }\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be an integer-like contract result`, { value })\n}\n\nfunction parseNumber(value: unknown, label: string): number {\n const parsed = Number(parseString(value, label))\n if (!Number.isSafeInteger(parsed)) {\n throw new SDKError('SDK_CONTRACT_ERROR', `${label} must be a safe integer`, { value })\n }\n return parsed\n}\n\nfunction unwrapSingle(value: unknown): unknown {\n return Array.isArray(value) && value.length === 1 ? value[0] : value\n}\n\nfunction parseAddress(value: unknown, label: string): TronAddress {\n const raw = String(unwrapSingle(value))\n try {\n return assertTronAddress(raw, label)\n } catch {\n const evmHex = /^41[0-9a-fA-F]{40}$/.test(raw) ? `0x${raw.slice(2)}` : raw\n return evmHexToTronAddress(evmHex, label)\n }\n}\n\nfunction parsePoolKey(value: unknown, network: ProtocolsContext['network']): V4PoolKey | undefined {\n if (Array.isArray(value) && value.length >= 5) {\n return createV4PoolKey({\n network,\n currencyA: parseAddress(value[0], 'poolKey.currency0'),\n currencyB: parseAddress(value[1], 'poolKey.currency1'),\n hooks: parseAddress(value[2], 'poolKey.hooks'),\n fee: parseNumber(value[3], 'poolKey.fee'),\n parameters: String(value[4]),\n })\n }\n if (typeof value === 'object' && value !== null) {\n const key = value as Record<string, unknown>\n if (key.currency0 !== undefined && key.currency1 !== undefined && key.hooks !== undefined\n && key.fee !== undefined && key.parameters !== undefined) {\n return createV4PoolKey({\n network,\n currencyA: parseAddress(key.currency0, 'poolKey.currency0'),\n currencyB: parseAddress(key.currency1, 'poolKey.currency1'),\n hooks: parseAddress(key.hooks, 'poolKey.hooks'),\n fee: parseNumber(key.fee, 'poolKey.fee'),\n parameters: String(key.parameters),\n })\n }\n }\n return undefined\n}\n\nfunction signed24(value: bigint): number {\n const masked = value & 0xffffffn\n return Number((masked & 0x800000n) === 0n ? masked : masked - 0x1000000n)\n}\n\nfunction parsePackedPositionInfo(value: unknown): Pick<V4PositionSnapshot, 'tickLower' | 'tickUpper'> {\n const info = BigInt(String(unwrapSingle(value)))\n return {\n tickLower: signed24(info >> 8n),\n tickUpper: signed24(info >> 32n),\n }\n}\n\nfunction parseOptionalPoolInfo(\n result: unknown,\n network: ProtocolsContext['network'],\n): Pick<V4PositionSnapshot, 'poolKey' | 'tickLower' | 'tickUpper'> {\n if (Array.isArray(result)) {\n const poolKey = parsePoolKey(result[0], network)\n const ticks = result[2] !== undefined\n ? {\n tickLower: parseNumber(result[1], 'tickLower'),\n tickUpper: parseNumber(result[2], 'tickUpper'),\n }\n : result[1] !== undefined\n ? parsePackedPositionInfo(result[1])\n : {}\n return {\n ...(poolKey !== undefined ? { poolKey } : {}),\n ...ticks,\n }\n }\n\n if (typeof result === 'object' && result !== null) {\n const info = result as V4PoolAndPositionInfoObjectResult\n const poolKey = parsePoolKey(info.poolKey, network)\n return {\n ...(poolKey !== undefined ? { poolKey } : {}),\n ...(info.tickLower !== undefined ? { tickLower: parseNumber(info.tickLower, 'tickLower') } : {}),\n ...(info.tickUpper !== undefined ? { tickUpper: parseNumber(info.tickUpper, 'tickUpper') } : {}),\n }\n }\n\n return {}\n}\n\nfunction parseFeesResult(result: unknown): Pick<V4PositionFeesSnapshot, 'feesOwed0' | 'feesOwed1'> {\n const value = unwrapSingle(result)\n if (Array.isArray(value) && value.length >= 2) {\n return {\n feesOwed0: parseString(value[0], 'feesOwed0'),\n feesOwed1: parseString(value[1], 'feesOwed1'),\n }\n }\n if (typeof value === 'object' && value !== null) {\n const fees = value as Record<string, unknown>\n if (fees.feesOwed0 !== undefined && fees.feesOwed1 !== undefined) {\n return {\n feesOwed0: parseString(fees.feesOwed0, 'feesOwed0'),\n feesOwed1: parseString(fees.feesOwed1, 'feesOwed1'),\n }\n }\n }\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position fee result is malformed', { result })\n}\n\nfunction liquidityFromPercentage(totalLiquidity: BigintIsh, percentage: Percent): string {\n const total = BigInt(normalizeBaseUnitAmount(totalLiquidity, 'currentLiquidity'))\n const numerator = BigInt(percentage.numerator.toString())\n const denominator = BigInt(percentage.denominator.toString())\n const liquidity = (total * numerator) / denominator\n if (liquidity <= 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'percentage resolves to zero liquidity', {\n totalLiquidity: total.toString(),\n percentage: percentage.toSignificant(),\n })\n }\n return liquidity.toString()\n}\n\nfunction resolveRemoveLiquidity(input: V4PositionRemovePlanInput, snapshotLiquidity: string): string {\n const normalizedSnapshotLiquidity = normalizeBaseUnitAmount(snapshotLiquidity, 'position liquidity')\n if (input.currentLiquidity !== undefined && input.validationMode !== 'legacy') {\n const expectedLiquidity = normalizeBaseUnitAmount(input.currentLiquidity, 'currentLiquidity')\n if (expectedLiquidity !== normalizedSnapshotLiquidity) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'currentLiquidity is stale and does not match the on-chain position', {\n currentLiquidity: expectedLiquidity,\n positionLiquidity: normalizedSnapshotLiquidity,\n })\n }\n }\n\n const liquidity = input.liquidity !== undefined\n ? normalizeBaseUnitAmount(input.liquidity, 'liquidity')\n : liquidityFromPercentage(normalizedSnapshotLiquidity, normalizeLiquidityPercentage(input.percentage, 'percentage'))\n if (BigInt(liquidity) > BigInt(normalizedSnapshotLiquidity) && input.validationMode === 'legacy') {\n return normalizedSnapshotLiquidity\n }\n if (BigInt(liquidity) > BigInt(normalizedSnapshotLiquidity)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'liquidity cannot exceed on-chain position liquidity', {\n liquidity,\n positionLiquidity: normalizedSnapshotLiquidity,\n })\n }\n return liquidity\n}\n\nfunction parseSqrtPriceX96(result: unknown): bigint {\n const value = Array.isArray(result)\n ? result[0]\n : typeof result === 'object' && result !== null\n ? (result as { readonly sqrtPriceX96?: unknown }).sqrtPriceX96\n : undefined\n try {\n const parsed = BigInt(String(value))\n if (parsed <= 0n) throw new Error('non-positive')\n return parsed\n } catch {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 slot0 result has an invalid sqrtPriceX96', { result })\n }\n}\n\nfunction removalAmounts(snapshot: V4PositionSnapshot, liquidity: string, sqrtPriceX96: bigint): readonly [bigint, bigint] {\n if (snapshot.tickLower === undefined || snapshot.tickUpper === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position is missing ticks required to derive removal minimums', {\n tokenId: snapshot.tokenId,\n })\n }\n const sqrtA = BigInt(TickMath.getSqrtRatioAtTick(snapshot.tickLower).toString())\n const sqrtB = BigInt(TickMath.getSqrtRatioAtTick(snapshot.tickUpper).toString())\n const positionLiquidity = BigInt(liquidity)\n if (sqrtPriceX96 <= sqrtA) {\n return [(positionLiquidity * (sqrtB - sqrtA) * Q96) / (sqrtA * sqrtB), 0n]\n }\n if (sqrtPriceX96 < sqrtB) {\n return [\n (positionLiquidity * (sqrtB - sqrtPriceX96) * Q96) / (sqrtPriceX96 * sqrtB),\n (positionLiquidity * (sqrtPriceX96 - sqrtA)) / Q96,\n ]\n }\n return [0n, (positionLiquidity * (sqrtB - sqrtA)) / Q96]\n}\n\nfunction resolvePositionPoolKey(\n tokenId: string,\n supplied: V4PoolKey | undefined,\n snapshot: V4PositionSnapshot,\n): { readonly poolKey: V4PoolKey; readonly derived: boolean } {\n if (snapshot.poolKey === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position does not include a poolKey', { tokenId })\n }\n if (supplied !== undefined) {\n const suppliedPoolId = computeV4PoolId(supplied)\n const positionPoolId = computeV4PoolId(snapshot.poolKey)\n if (suppliedPoolId !== positionPoolId) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'V4 poolKey does not match the tokenId position', {\n tokenId,\n suppliedPoolId,\n positionPoolId,\n })\n }\n return { poolKey: supplied, derived: false }\n }\n return { poolKey: snapshot.poolKey, derived: true }\n}\n\nfunction assertTriggerRecipient(wallet: TronAddress, recipient: TronAddress, operation: string): void {\n if (wallet !== recipient) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${operation} recipient must match the triggering wallet`, {\n wallet,\n recipient,\n })\n }\n}\n\nfunction metadata(input: {\n readonly operation: string\n readonly tokenId: string\n readonly owner?: string\n readonly recipient?: string\n readonly deadline?: string\n readonly slippageBips?: number\n readonly poolKeyDerived?: boolean\n}): Record<string, unknown> {\n return {\n protocol: 'sunswap-v4',\n operation: input.operation,\n tokenId: input.tokenId,\n ...(input.owner !== undefined ? { owner: input.owner } : {}),\n ...(input.recipient !== undefined ? { recipient: input.recipient } : {}),\n ...(input.deadline !== undefined ? { deadline: input.deadline } : {}),\n ...(input.slippageBips !== undefined ? { slippageBips: input.slippageBips } : {}),\n ...(input.poolKeyDerived !== undefined ? { poolKeyDerived: input.poolKeyDerived } : {}),\n }\n}\n\nexport class V4PositionsClient {\n constructor(private readonly context: ProtocolsContext) {}\n\n async read(input: V4PositionReadInput): Promise<V4PositionSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const reads = buildV4PositionReads({ network: this.context.network, tokenId, positionManager })\n const [poolInfoResult, liquidityResult, ownerResult, approvedResult] = await readMulticallRequired<unknown>(\n this.context,\n reads,\n 'V4 position read',\n )\n const owner = parseAddress(ownerResult, 'owner')\n const approved = approvedResult ? parseAddress(approvedResult, 'approved') : undefined\n const operator = input.operator ? assertTronAddress(input.operator, 'operator') : undefined\n const operatorApproved = operator\n ? Boolean(await readRequiredContract<boolean>(\n this.context,\n buildV4PositionApprovalForAllRead({ network: this.context.network, owner, operator, positionManager }),\n 'V4 position operator approval read',\n ).then(unwrapSingle))\n : undefined\n\n return {\n protocol: 'sunswap-v4',\n tokenId,\n owner,\n ...(approved !== undefined ? { approved } : {}),\n ...(operatorApproved !== undefined ? { operatorApproved } : {}),\n ...parseOptionalPoolInfo(poolInfoResult, this.context.network),\n liquidity: parseString(unwrapSingle(liquidityResult), 'liquidity'),\n }\n }\n\n async fees(input: V4PositionReadInput): Promise<V4PositionFeesSnapshot> {\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const snapshot = await this.read(input)\n if (snapshot.poolKey === undefined || snapshot.tickLower === undefined || snapshot.tickUpper === undefined) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'V4 position does not include the context required to read fees', {\n tokenId,\n })\n }\n const result = await readRequiredContract<unknown>(\n this.context,\n buildV4PositionFeesRead({\n network: this.context.network,\n tokenId,\n poolId: computeV4PoolId(snapshot.poolKey),\n tickLower: snapshot.tickLower,\n tickUpper: snapshot.tickUpper,\n poolManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PoolManager'),\n positionManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager'),\n lpFeeHelper: resolveProtocolContract(this.context, input.contracts, 'sunswapV4LpFeeHelper'),\n }),\n 'V4 position fee read',\n )\n return {\n protocol: 'sunswap-v4',\n tokenId,\n ...parseFeesResult(result),\n }\n }\n\n readonly remove = {\n plan: async (input: V4PositionRemovePlanInput): Promise<TransactionPlan> => this.planRemove(input),\n execute: async (input: V4PositionRemovePlanInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planRemove(input), createContextExecutor(this.context)),\n }\n\n readonly collect = {\n plan: async (input: V4PositionCollectPlanInput): Promise<TransactionPlan> => this.planCollect(input),\n execute: async (input: V4PositionCollectPlanInput): Promise<TransactionPlanExecutionResult> =>\n executeTransactionPlan(await this.planCollect(input), createContextExecutor(this.context)),\n }\n\n private async readAuthorizedPosition(\n tokenId: string,\n operation: string,\n contracts: V4PositionReadInput['contracts'],\n validationMode: V4PositionRemoveInput['validationMode'],\n ): Promise<{ wallet: TronAddress; snapshot: V4PositionSnapshot }> {\n const wallet = await requireWalletAddress(this.context, operation)\n const snapshot = await this.read({\n tokenId,\n ...(validationMode === 'legacy' ? {} : { operator: wallet }),\n ...(contracts !== undefined ? { contracts } : {}),\n })\n if (validationMode !== 'legacy') {\n assertPositionAuthorized({\n tokenId,\n wallet,\n owner: snapshot.owner,\n ...(snapshot.approved !== undefined ? { approved: snapshot.approved } : {}),\n ...(snapshot.operatorApproved !== undefined ? { operatorApproved: snapshot.operatorApproved } : {}),\n })\n }\n return { wallet, snapshot }\n }\n\n private async planRemove(input: V4PositionRemovePlanInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'position-v4-remove')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V4 remove position',\n input.contracts,\n input.validationMode,\n )\n const poolKey = resolvePositionPoolKey(tokenId, input.poolKey, snapshot)\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V4 remove position', wallet)\n assertTriggerRecipient(wallet, recipient, 'V4 remove position')\n const deadline = normalizeDeadline(this.context, input)\n const slippageBips = slippageToBips(input.slippage ?? '0.5%')\n const liquidity = resolveRemoveLiquidity(input, snapshot.liquidity)\n const derivedAmounts = input.amount0Min === undefined || input.amount1Min === undefined\n ? removalAmounts(\n snapshot,\n liquidity,\n parseSqrtPriceX96(await readRequiredContract<unknown>(\n this.context,\n buildV4PoolSlot0Read({\n network: this.context.network,\n poolId: computeV4PoolId(poolKey.poolKey),\n poolManager: resolveProtocolContract(this.context, input.contracts, 'sunswapV4PoolManager'),\n }),\n 'V4 removal minimum quote',\n )),\n )\n : undefined\n const amount0Min = input.amount0Min !== undefined\n ? normalizeBaseUnitAmount(input.amount0Min, 'amount0Min', { allowZero: true })\n : input.roundingMode === 'half-up'\n ? (((derivedAmounts?.[0] ?? 0n) * BigInt(10_000 - slippageBips) + 5_000n) / 10_000n).toString()\n : applySlippageMin(derivedAmounts?.[0] ?? 0n, slippageBips).toString()\n const amount1Min = input.amount1Min !== undefined\n ? normalizeBaseUnitAmount(input.amount1Min, 'amount1Min', { allowZero: true })\n : input.roundingMode === 'half-up'\n ? (((derivedAmounts?.[1] ?? 0n) * BigInt(10_000 - slippageBips) + 5_000n) / 10_000n).toString()\n : applySlippageMin(derivedAmounts?.[1] ?? 0n, slippageBips).toString()\n const decreaseAction = buildV4DecreaseLiquidityAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n tokenId,\n liquidity,\n amount0Min,\n amount1Min,\n recipient,\n deadline,\n ...(input.settlementMode !== undefined ? { settlementMode: input.settlementMode } : {}),\n ...(input.hookData !== undefined ? { hookData: input.hookData } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const transactionAction = input.transactionMode === 'multicall'\n ? buildV4MulticallAction({\n network: this.context.network,\n positionManager,\n calls: [encodeV4ContractCallAction(decreaseAction)],\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n : decreaseAction\n const action = {\n ...transactionAction,\n intent: {\n kind: 'remove-liquidity' as const,\n scope: positionIntentScope(SUNSWAP_V4_POSITION_PROTOCOL_ID, 'remove-position'),\n positionId: tokenId,\n },\n }\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: {\n title: 'Remove SunSwap V4 position liquidity',\n lines: [`Position ${tokenId}`, `Recipient ${recipient}`],\n },\n approvals: [],\n transactions: [action],\n metadata: metadata({\n operation: 'remove-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n slippageBips,\n poolKeyDerived: poolKey.derived,\n }),\n }\n }\n\n private async planCollect(input: V4PositionCollectPlanInput): Promise<TransactionPlan> {\n const positionManager = resolveProtocolContract(this.context, input.contracts, 'sunswapV4PositionManager')\n const planId = nextPlanId(this.context, 'position-v4-collect')\n const tokenId = normalizeBaseUnitAmount(input.tokenId, 'tokenId')\n const { wallet, snapshot } = await this.readAuthorizedPosition(\n tokenId,\n 'V4 collect position',\n input.contracts,\n input.validationMode,\n )\n const poolKey = resolvePositionPoolKey(tokenId, input.poolKey, snapshot)\n const recipient = await normalizeRecipient(this.context, input.recipient, 'V4 collect position', wallet)\n assertTriggerRecipient(wallet, recipient, 'V4 collect position')\n const deadline = normalizeDeadline(this.context, input)\n const action = buildV4CollectAction({\n network: this.context.network,\n positionManager,\n poolKey: poolKey.poolKey,\n tokenId,\n recipient,\n deadline,\n ...(input.settlementMode !== undefined ? { settlementMode: input.settlementMode } : {}),\n ...(input.hookData !== undefined ? { hookData: input.hookData } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n const transactionAction = input.transactionMode === 'multicall'\n ? buildV4MulticallAction({\n network: this.context.network,\n positionManager,\n calls: [encodeV4ContractCallAction(action)],\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n id: `${planId}-tx`,\n })\n : action\n const transaction = {\n ...transactionAction,\n intent: {\n kind: 'collect-fees' as const,\n scope: positionIntentScope(SUNSWAP_V4_POSITION_PROTOCOL_ID, 'collect-position'),\n positionId: tokenId,\n },\n }\n\n return {\n id: planId,\n kind: 'position',\n network: this.context.network,\n owner: wallet,\n summary: {\n title: 'Collect SunSwap V4 position fees',\n lines: [`Position ${tokenId}`, `Recipient ${recipient}`],\n },\n approvals: [],\n transactions: [transaction],\n metadata: metadata({\n operation: 'collect-position',\n tokenId,\n owner: snapshot.owner,\n recipient,\n deadline,\n poolKeyDerived: poolKey.derived,\n }),\n }\n }\n}\n","import type { ProtocolsContext } from '../context.js'\nimport { V3PositionsClient } from './v3.js'\nimport { V4PositionsClient } from './v4.js'\n\nexport class PositionsClient {\n readonly v3: {\n readonly read: V3PositionsClient['read']\n readonly remove: V3PositionsClient['remove']\n readonly collect: V3PositionsClient['collect']\n }\n readonly v4: {\n readonly read: V4PositionsClient['read']\n readonly fees: V4PositionsClient['fees']\n readonly remove: V4PositionsClient['remove']\n readonly collect: V4PositionsClient['collect']\n }\n\n constructor(context: ProtocolsContext) {\n const v3Client = new V3PositionsClient(context)\n const v4Client = new V4PositionsClient(context)\n this.v3 = {\n read: (input) => v3Client.read(input),\n remove: v3Client.remove,\n collect: v3Client.collect,\n }\n this.v4 = {\n read: (input) => v4Client.read(input),\n fees: (input) => v4Client.fees(input),\n remove: v4Client.remove,\n collect: v4Client.collect,\n }\n }\n}\n\nexport function createPositionsClient(context: ProtocolsContext): PositionsClient {\n return new PositionsClient(context)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAyC;AAMlD,eAAsB,6BAA6B,SAA2B,QAA2C;AACvH,QAAM,mBAAmB,SAAS,MAAM;AAC1C;AAGO,SAAS,0BAA0B,SAAoD;AAC5F,QAAM,WAAW,sBAAsB,OAAO;AAC9C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,OAAO,WAAW;AAC5B,YAAM,6BAA6B,SAAS,MAAM;AAClD,UAAI,CAAC,SAAS,WAAY,OAAM,IAAI,SAAS,qBAAqB,0CAA0C;AAC5G,aAAO,SAAS,WAAW,MAAM;AAAA,IACnC;AAAA,EACF;AACF;;;ACnBO,IAAM,kCAAkC;AACxC,IAAM,kCAAkC;AAExC,SAAS,oBACd,UACA,WACoC;AACpC,SAAO,EAAE,QAAQ,YAAY,UAAU,UAAU;AACnD;;;ACVA;AAAA,EACE;AAAA,EACA;AAAA,EACA,YAAAA;AAAA,EACA;AAAA,EACA,qBAAAC;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACjBP;AAAA,EACE,YAAAC;AAAA,EACA;AAAA,OAEK;AAUA,SAAS,yBAAyB,OAAyC;AAChF,QAAM,SAAS,kBAAkB,MAAM,QAAQ,QAAQ;AACvD,QAAM,QAAQ,kBAAkB,MAAM,OAAO,OAAO;AACpD,QAAM,WAAW,MAAM,WAAW,kBAAkB,MAAM,UAAU,UAAU,IAAI;AAElF,MAAI,WAAW,SAAS,WAAW,YAAY,MAAM,qBAAqB,KAAM;AAEhF,QAAM,IAAIA,UAAS,+BAA+B,8CAA8C;AAAA,IAC9F,SAAS,MAAM;AAAA,IACf;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AACH;;;AD6CA,SAAS,cAAc,OAAgB,OAAuB;AAC5D,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AACvF,WAAO,OAAO,MAAM,SAAS,CAAC,EAAE,SAAS;AAAA,EAC3C;AACA,QAAM,IAAIC,UAAS,sBAAsB,GAAG,KAAK,4CAA4C,EAAE,MAAM,CAAC;AACxG;AAEA,SAAS,cAAc,OAAgB,OAAuB;AAC5D,QAAM,SAAS,OAAO,cAAc,OAAO,KAAK,CAAC;AACjD,MAAI,CAAC,OAAO,cAAc,MAAM,GAAG;AACjC,UAAM,IAAIA,UAAS,sBAAsB,GAAG,KAAK,2BAA2B,EAAE,MAAM,CAAC;AAAA,EACvF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAyB;AAC7C,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI;AACjE;AAEA,SAAS,qBAAqB,OAAgB,OAA4B;AACxE,QAAM,MAAM,OAAO,aAAa,KAAK,CAAC;AACtC,MAAI;AACF,WAAOC,mBAAkB,KAAK,KAAK;AAAA,EACrC,QAAQ;AACN,UAAM,SAAS,sBAAsB,KAAK,GAAG,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK;AACvE,WAAO,oBAAoB,QAAQ,KAAK;AAAA,EAC1C;AACF;AAEA,SAAS,uBACP,SACA,OACA,OAC8C;AAC9C,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAID,UAAS,sBAAsB,GAAG,KAAK,8BAA8B,EAAE,MAAM,CAAC;AAAA,EAC1F;AACA,QAAM,gBAAgB,qBAAqB,OAAO,KAAK;AACvD,QAAM,aAAa,wBAAwB,eAAe,KAAK;AAE/D,SAAO;AAAA,IACL;AAAA,IACA,OAAO,IAAI,MAAM,QAAQ,MAAM,gBAAgB,YAAY,GAAG,QAAW,QAAW,IAAI;AAAA,EAC1F;AACF;AAEA,SAAS,oBACP,SACA,SACA,QACA,OACA,UACA,kBACqF;AACrF,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAS,OAAO,CAAC;AACjB,aAAS,OAAO,CAAC;AACjB,UAAM,OAAO,CAAC;AACd,gBAAY,OAAO,CAAC;AACpB,gBAAY,OAAO,CAAC;AACpB,gBAAY,OAAO,CAAC;AACpB,kBAAc,OAAO,EAAE;AACvB,kBAAc,OAAO,EAAE;AAAA,EACzB,WAAW,OAAO,WAAW,YAAY,WAAW,MAAM;AACxD,UAAM,WAAW;AACjB,aAAS,SAAS;AAClB,aAAS,SAAS;AAClB,UAAM,SAAS;AACf,gBAAY,SAAS;AACrB,gBAAY,SAAS;AACrB,gBAAY,SAAS;AACrB,kBAAc,SAAS;AACvB,kBAAc,SAAS;AAAA,EACzB,OAAO;AACL,UAAM,IAAIA,UAAS,sBAAsB,mCAAmC,EAAE,OAAO,CAAC;AAAA,EACxF;AAEA,QAAM,aAAa,uBAAuB,SAAS,QAAQ,QAAQ;AACnE,QAAM,aAAa,uBAAuB,SAAS,QAAQ,QAAQ;AAEnE,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,GAAI,qBAAqB,SAAY,EAAE,iBAAiB,IAAI,CAAC;AAAA,IAC7D,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW;AAAA,IACnB,KAAK,cAAc,KAAK,KAAK;AAAA,IAC7B,WAAW,cAAc,WAAW,WAAW;AAAA,IAC/C,WAAW,cAAc,WAAW,WAAW;AAAA,IAC/C,WAAW,cAAc,WAAW,WAAW;AAAA,IAC/C,aAAa,cAAc,aAAa,aAAa;AAAA,IACrD,aAAa,cAAc,aAAa,aAAa;AAAA,IACrD,cAAc,WAAW;AAAA,IACzB,cAAc,WAAW;AAAA,EAC3B;AACF;AAEA,SAAS,iBAAiB,OAA8B,UAAuC;AAC7F,MAAI,MAAM,eAAe,OAAW,QAAO,6BAA6B,MAAM,YAAY,YAAY;AACtG,QAAM,YAAY,OAAO,wBAAwB,MAAM,WAAW,WAAW,CAAC;AAC9E,QAAM,QAAQ,OAAO,SAAS,SAAS;AACvC,MAAI,YAAY,OAAO;AACrB,UAAM,IAAIA,UAAS,wBAAwB,8CAA8C;AAAA,MACvF,WAAW,UAAU,SAAS;AAAA,MAC9B,gBAAgB,MAAM,SAAS;AAAA,IACjC,CAAC;AAAA,EACH;AACA,SAAO,IAAI,QAAQ,UAAU,SAAS,GAAG,MAAM,SAAS,CAAC;AAC3D;AAEA,SAAS,mBACP,SACA,OACA,eACA,eACU;AACV,SAAO,iBAAiB,kBAAkB,QAAQ,MAAM,UAAU,OAC9D,QAAQ,MAAM,iBACd;AACN;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAA5B;AAAA,EAE7B,MAAM,KAAK,OAAyD;AAClE,UAAM,UAAU,wBAAwB,MAAM,SAAS,SAAS;AAChE,UAAM,CAAC,gBAAgB,aAAa,cAAc,IAAI,MAAM;AAAA,MAC1D,KAAK;AAAA,MACL,qBAAqB;AAAA,QACnB,SAAS,KAAK,QAAQ;AAAA,QACtB;AAAA,QACA,iBAAiB,wBAAwB,KAAK,SAAS,MAAM,WAAW,0BAA0B;AAAA,MACpG,CAAC;AAAA,MACD;AAAA,IACF;AACA,UAAM,QAAQ,qBAAqB,aAAa,OAAO;AACvD,UAAM,WAAW,iBAAiB,qBAAqB,gBAAgB,UAAU,IAAI;AACrF,UAAM,WAAW,MAAM,WAAWC,mBAAkB,MAAM,UAAU,UAAU,IAAI;AAClF,UAAM,mBAAmB,WACrB,QAAQ,MAAM;AAAA,MACZ,KAAK;AAAA,MACL,kCAAkC;AAAA,QAChC,SAAS,KAAK,QAAQ;AAAA,QACtB;AAAA,QACA;AAAA,QACA,iBAAiB,wBAAwB,KAAK,SAAS,MAAM,WAAW,0BAA0B;AAAA,MACpG,CAAC;AAAA,MACD;AAAA,IACF,CAAC,IACD;AAEJ,UAAM,WAAW;AAAA,MACf,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU,SAAS;AAAA,MACnB,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MACzE,GAAI,SAAS,qBAAqB,SAAY,EAAE,kBAAkB,SAAS,iBAAiB,IAAI,CAAC;AAAA,MACjG,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,KAAK,SAAS;AAAA,MACd,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,MACpB,aAAa,SAAS;AAAA,MACtB,aAAa,SAAS;AAAA,IACxB;AAAA,EACF;AAAA,EAES,SAAS;AAAA,IAChB,MAAM,OAAO,UAA2D,KAAK,WAAW,KAAK;AAAA,IAC7F,SAAS,OAAO,UACd,uBAAuB,MAAM,KAAK,WAAW,KAAK,GAAG,0BAA0B,KAAK,OAAO,CAAC;AAAA,EAChG;AAAA,EAES,UAAU;AAAA,IACjB,MAAM,OAAO,UAA4D,KAAK,YAAY,KAAK;AAAA,IAC/F,SAAS,OAAO,UACd,uBAAuB,MAAM,KAAK,YAAY,KAAK,GAAG,0BAA0B,KAAK,OAAO,CAAC;AAAA,EACjG;AAAA,EAEQ,oBACN,UACA,iBACA,OACqB;AACrB,UAAM,EAAE,SAAS,MAAM,IAAI,KAAK;AAChC,UAAM,cAAc,MAAM,UAAU;AACpC,UAAM,gBAAgB,SAAS,WAAW,eAAe,SAAS,WAAW;AAC7E,UAAM,UAA4B,CAAC;AACnC,UAAM,UAAU,wBAAwB,KAAK,SAAS,MAAM,WAAW,kBAAkB;AAGzF,QAAI,iBAAiB,oBAAoB,MAAM,UAAU,4BAA4B,YAAY,MAAM,UAAU,kBAAkB;AACjI,cAAQ,KAAK;AAAA,QACX,SAAS,qBAAqB,EAAE,SAAS,QAAQ,SAAS,QAAQ,QAAQ,SAAS,QAAQ,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,QACvH,MAAM;AAAA,MACR,CAAC;AACD,cAAQ,KAAK,EAAE,SAAS,iBAAiB,MAAM,mBAAmB,CAAC;AAAA,IACrE;AACA,WAAO,EAAE,SAAS,eAAe,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAc,uBACZ,SACA,WACA,iBACA,gBACA;AACA,UAAM,SAAS,MAAM,qBAAqB,KAAK,SAAS,SAAS;AACjE,UAAM,CAAC,gBAAgB,aAAa,cAAc,IAAI,MAAM;AAAA,MAC1D,KAAK;AAAA,MACL,qBAAqB,EAAE,SAAS,KAAK,QAAQ,SAAS,SAAS,gBAAgB,CAAC;AAAA,MAChF;AAAA,IACF;AACA,UAAM,QAAQ,qBAAqB,aAAa,OAAO;AACvD,UAAM,WAAW,iBAAiB,qBAAqB,gBAAgB,UAAU,IAAI;AACrF,UAAM,mBAAmB,mBAAmB,WACxC,SACA,QAAQ,MAAM;AAAA,MACZ,KAAK;AAAA,MACL,kCAAkC,EAAE,SAAS,KAAK,QAAQ,SAAS,OAAO,UAAU,QAAQ,gBAAgB,CAAC;AAAA,MAC7G,GAAG,SAAS;AAAA,IACd,CAAC;AACL,QAAI,mBAAmB,UAAU;AAC/B,+BAAyB;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,QAC7C,GAAI,qBAAqB,SAAY,EAAE,iBAAiB,IAAI,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL;AAAA,MACA,UAAU,oBAAoB,KAAK,SAAS,SAAS,gBAAgB,OAAO,UAAU,gBAAgB;AAAA,IACxG;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,OAAwD;AAC/E,UAAM,kBAAkB,wBAAwB,KAAK,SAAS,MAAM,WAAW,0BAA0B;AACzG,UAAM,SAAS,WAAW,KAAK,SAAS,oBAAoB;AAC5D,UAAM,UAAU,wBAAwB,MAAM,SAAS,SAAS;AAChE,UAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AACA,UAAM,YAAY,MAAM,mBAAmB,KAAK,SAAS,MAAM,WAAW,sBAAsB,MAAM;AACtG,UAAM,WAAW,kBAAkB,KAAK,SAAS,KAAK;AACtD,UAAM,WAAW,cAAc,MAAM,YAAY,MAAM;AACvD,UAAM,cAAc,MAAM,SAAS;AACnC,UAAM,YAAY,MAAM,QAAQ,MAAM,mBAAmB,KAAK,SAAS;AAAA,MACrE,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,KAAK,SAAS;AAAA,MACd,WAAW,MAAM;AAAA,IACnB,CAAC;AACD,UAAM,OAAO,IAAI,KAAK;AAAA,MACpB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,KAAK,SAAS;AAAA,MACd,cAAc,wBAAwB,UAAU,cAAc,cAAc;AAAA,MAC5E,WAAW,wBAAwB,UAAU,WAAW,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7F,aAAa,UAAU;AAAA,MACvB,GAAI,UAAU,gBAAgB,SAAY,EAAE,aAAa,UAAU,YAAY,IAAI,CAAC;AAAA,IACtF,CAAC;AACD,UAAM,WAAW,IAAI,SAAS;AAAA,MAC5B;AAAA,MACA,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,IACtB,CAAC;AACD,UAAM,SAASA,mBAAkB,SAAS,QAAQ,QAAQ;AAC1D,UAAM,SAASA,mBAAkB,SAAS,QAAQ,QAAQ;AAC1D,UAAM,wBAAwB,eAAe;AAAA,MAC3C,mBAAmB,KAAK,SAAS,SAAS,cAAc,QAAQ,MAAM,aAAa;AAAA,MACnF,MAAM,0BAA0B,SAC5B,wBAAwB,MAAM,uBAAuB,yBAAyB,EAAE,WAAW,KAAK,CAAC,IACjG,SAAS;AAAA,IACf;AACA,UAAM,wBAAwB,eAAe;AAAA,MAC3C,mBAAmB,KAAK,SAAS,SAAS,cAAc,QAAQ,MAAM,aAAa;AAAA,MACnF,MAAM,0BAA0B,SAC5B,wBAAwB,MAAM,uBAAuB,yBAAyB,EAAE,WAAW,KAAK,CAAC,IACjG,SAAS;AAAA,IACf;AACA,UAAM,mBAAmB,2BAA2B,qBAAqB,UAAU;AAAA,MACjF;AAAA,MACA,qBAAqB,iBAAiB,OAAO,QAAQ;AAAA,MACrD,mBAAmB;AAAA,MACnB;AAAA,MACA,GAAI,MAAM,cAAc,SAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MACtE,gBAAgB;AAAA,QACd,WAAW,wBAAwB,WAAW,WAAW;AAAA,QACzD;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,SAAS,yBAAyB;AAAA,MACtC,IAAI,GAAG,MAAM;AAAA,MACb,QAAQ;AAAA,MACR;AAAA,MACA,UAAU,EAAE,cAAc,KAAK,oBAAoB,UAAU,iBAAiB,KAAK,EAAE;AAAA,MACrF,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,oBAAoB,iCAAiC,iBAAiB;AAAA,QAC7E,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,KAAK,QAAQ;AAAA,MACtB,OAAO;AAAA,MACP,SAAS,EAAE,OAAO,wCAAwC,OAAO,CAAC,YAAY,OAAO,IAAI,aAAa,SAAS,EAAE,EAAE;AAAA,MACnH,WAAW,CAAC;AAAA,MACZ,cAAc,CAAC,MAAM;AAAA,MACrB,UAAU;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,QACA,OAAO,SAAS;AAAA,QAChB;AAAA,QACA;AAAA,QACA,cAAc,eAAe,MAAM,YAAY,MAAM;AAAA,QACrD,iBAAiB;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,OAAyD;AACjF,UAAM,kBAAkB,wBAAwB,KAAK,SAAS,MAAM,WAAW,0BAA0B;AACzG,UAAM,SAAS,WAAW,KAAK,SAAS,qBAAqB;AAC7D,UAAM,UAAU,wBAAwB,MAAM,SAAS,SAAS;AAChE,UAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AACA,UAAM,YAAY,MAAM,mBAAmB,KAAK,SAAS,MAAM,WAAW,uBAAuB,MAAM;AACvG,UAAM,SAASA,mBAAkB,SAAS,QAAQ,QAAQ;AAC1D,UAAM,SAASA,mBAAkB,SAAS,QAAQ,QAAQ;AAC1D,UAAM,mBAAmB,2BAA2B,sBAAsB;AAAA,MACxE;AAAA,MACA,WAAW,wBAAwB,WAAW,WAAW;AAAA,MACzD,uBAAuB,eAAe;AAAA,QACpC,mBAAmB,KAAK,SAAS,SAAS,cAAc,QAAQ,MAAM,aAAa;AAAA,QACnF,MAAM,0BAA0B,SAC5B,wBAAwB,MAAM,uBAAuB,yBAAyB,EAAE,WAAW,KAAK,CAAC,IACjG,SAAS;AAAA,MACf;AAAA,MACA,uBAAuB,eAAe;AAAA,QACpC,mBAAmB,KAAK,SAAS,SAAS,cAAc,QAAQ,MAAM,aAAa;AAAA,QACnF,MAAM,0BAA0B,SAC5B,wBAAwB,MAAM,uBAAuB,yBAAyB,EAAE,WAAW,KAAK,CAAC,IACjG,SAAS;AAAA,MACf;AAAA,IACF,CAAC;AACD,UAAM,SAAS,yBAAyB;AAAA,MACtC,IAAI,GAAG,MAAM;AAAA,MACb,QAAQ;AAAA,MACR;AAAA,MACA,UAAU,EAAE,cAAc,KAAK,oBAAoB,UAAU,iBAAiB,KAAK,EAAE;AAAA,MACrF,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,oBAAoB,iCAAiC,kBAAkB;AAAA,QAC9E,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,KAAK,QAAQ;AAAA,MACtB,OAAO;AAAA,MACP,SAAS,EAAE,OAAO,oCAAoC,OAAO,CAAC,YAAY,OAAO,IAAI,aAAa,SAAS,EAAE,EAAE;AAAA,MAC/G,WAAW,CAAC;AAAA,MACZ,cAAc,CAAC,MAAM;AAAA,MACrB,UAAU;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,QACA,OAAO,SAAS;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AEpeA;AAAA,EACE,YAAAC;AAAA,EACA,qBAAAC;AAAA,OAIK;AACP,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAmDP,IAAM,MAAM,MAAM;AAElB,SAAS,YAAY,OAAgB,OAAuB;AAC1D,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AACvF,WAAO,OAAO,MAAM,SAAS,CAAC,EAAE,SAAS;AAAA,EAC3C;AACA,QAAM,IAAIC,UAAS,sBAAsB,GAAG,KAAK,4CAA4C,EAAE,MAAM,CAAC;AACxG;AAEA,SAAS,YAAY,OAAgB,OAAuB;AAC1D,QAAM,SAAS,OAAO,YAAY,OAAO,KAAK,CAAC;AAC/C,MAAI,CAAC,OAAO,cAAc,MAAM,GAAG;AACjC,UAAM,IAAIA,UAAS,sBAAsB,GAAG,KAAK,2BAA2B,EAAE,MAAM,CAAC;AAAA,EACvF;AACA,SAAO;AACT;AAEA,SAASC,cAAa,OAAyB;AAC7C,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI;AACjE;AAEA,SAAS,aAAa,OAAgB,OAA4B;AAChE,QAAM,MAAM,OAAOA,cAAa,KAAK,CAAC;AACtC,MAAI;AACF,WAAOC,mBAAkB,KAAK,KAAK;AAAA,EACrC,QAAQ;AACN,UAAM,SAAS,sBAAsB,KAAK,GAAG,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK;AACvE,WAAO,oBAAoB,QAAQ,KAAK;AAAA,EAC1C;AACF;AAEA,SAAS,aAAa,OAAgB,SAA6D;AACjG,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,GAAG;AAC7C,WAAO,gBAAgB;AAAA,MACrB;AAAA,MACA,WAAW,aAAa,MAAM,CAAC,GAAG,mBAAmB;AAAA,MACrD,WAAW,aAAa,MAAM,CAAC,GAAG,mBAAmB;AAAA,MACrD,OAAO,aAAa,MAAM,CAAC,GAAG,eAAe;AAAA,MAC7C,KAAK,YAAY,MAAM,CAAC,GAAG,aAAa;AAAA,MACxC,YAAY,OAAO,MAAM,CAAC,CAAC;AAAA,IAC7B,CAAC;AAAA,EACH;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,MAAM;AACZ,QAAI,IAAI,cAAc,UAAa,IAAI,cAAc,UAAa,IAAI,UAAU,UAC3E,IAAI,QAAQ,UAAa,IAAI,eAAe,QAAW;AAC1D,aAAO,gBAAgB;AAAA,QACrB;AAAA,QACA,WAAW,aAAa,IAAI,WAAW,mBAAmB;AAAA,QAC1D,WAAW,aAAa,IAAI,WAAW,mBAAmB;AAAA,QAC1D,OAAO,aAAa,IAAI,OAAO,eAAe;AAAA,QAC9C,KAAK,YAAY,IAAI,KAAK,aAAa;AAAA,QACvC,YAAY,OAAO,IAAI,UAAU;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAAuB;AACvC,QAAM,SAAS,QAAQ;AACvB,SAAO,QAAQ,SAAS,eAAe,KAAK,SAAS,SAAS,UAAU;AAC1E;AAEA,SAAS,wBAAwB,OAAqE;AACpG,QAAM,OAAO,OAAO,OAAOD,cAAa,KAAK,CAAC,CAAC;AAC/C,SAAO;AAAA,IACL,WAAW,SAAS,QAAQ,EAAE;AAAA,IAC9B,WAAW,SAAS,QAAQ,GAAG;AAAA,EACjC;AACF;AAEA,SAAS,sBACP,QACA,SACiE;AACjE,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,UAAM,UAAU,aAAa,OAAO,CAAC,GAAG,OAAO;AAC/C,UAAM,QAAQ,OAAO,CAAC,MAAM,SACxB;AAAA,MACE,WAAW,YAAY,OAAO,CAAC,GAAG,WAAW;AAAA,MAC7C,WAAW,YAAY,OAAO,CAAC,GAAG,WAAW;AAAA,IAC/C,IACA,OAAO,CAAC,MAAM,SACZ,wBAAwB,OAAO,CAAC,CAAC,IACjC,CAAC;AACP,WAAO;AAAA,MACL,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,GAAG;AAAA,IACL;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,UAAM,OAAO;AACb,UAAM,UAAU,aAAa,KAAK,SAAS,OAAO;AAClD,WAAO;AAAA,MACL,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,YAAY,KAAK,WAAW,WAAW,EAAE,IAAI,CAAC;AAAA,MAC9F,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,YAAY,KAAK,WAAW,WAAW,EAAE,IAAI,CAAC;AAAA,IAChG;AAAA,EACF;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,gBAAgB,QAA0E;AACjG,QAAM,QAAQA,cAAa,MAAM;AACjC,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,GAAG;AAC7C,WAAO;AAAA,MACL,WAAW,YAAY,MAAM,CAAC,GAAG,WAAW;AAAA,MAC5C,WAAW,YAAY,MAAM,CAAC,GAAG,WAAW;AAAA,IAC9C;AAAA,EACF;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,OAAO;AACb,QAAI,KAAK,cAAc,UAAa,KAAK,cAAc,QAAW;AAChE,aAAO;AAAA,QACL,WAAW,YAAY,KAAK,WAAW,WAAW;AAAA,QAClD,WAAW,YAAY,KAAK,WAAW,WAAW;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAID,UAAS,sBAAsB,uCAAuC,EAAE,OAAO,CAAC;AAC5F;AAEA,SAAS,wBAAwB,gBAA2B,YAA6B;AACvF,QAAM,QAAQ,OAAO,wBAAwB,gBAAgB,kBAAkB,CAAC;AAChF,QAAM,YAAY,OAAO,WAAW,UAAU,SAAS,CAAC;AACxD,QAAM,cAAc,OAAO,WAAW,YAAY,SAAS,CAAC;AAC5D,QAAM,YAAa,QAAQ,YAAa;AACxC,MAAI,aAAa,IAAI;AACnB,UAAM,IAAIA,UAAS,wBAAwB,yCAAyC;AAAA,MAClF,gBAAgB,MAAM,SAAS;AAAA,MAC/B,YAAY,WAAW,cAAc;AAAA,IACvC,CAAC;AAAA,EACH;AACA,SAAO,UAAU,SAAS;AAC5B;AAEA,SAAS,uBAAuB,OAAkC,mBAAmC;AACnG,QAAM,8BAA8B,wBAAwB,mBAAmB,oBAAoB;AACnG,MAAI,MAAM,qBAAqB,UAAa,MAAM,mBAAmB,UAAU;AAC7E,UAAM,oBAAoB,wBAAwB,MAAM,kBAAkB,kBAAkB;AAC5F,QAAI,sBAAsB,6BAA6B;AACrD,YAAM,IAAIA,UAAS,wBAAwB,sEAAsE;AAAA,QAC/G,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,cAAc,SAClC,wBAAwB,MAAM,WAAW,WAAW,IACpD,wBAAwB,6BAA6B,6BAA6B,MAAM,YAAY,YAAY,CAAC;AACrH,MAAI,OAAO,SAAS,IAAI,OAAO,2BAA2B,KAAK,MAAM,mBAAmB,UAAU;AAChG,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,IAAI,OAAO,2BAA2B,GAAG;AAC3D,UAAM,IAAIA,UAAS,wBAAwB,uDAAuD;AAAA,MAChG;AAAA,MACA,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAyB;AAClD,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAC9B,OAAO,CAAC,IACR,OAAO,WAAW,YAAY,WAAW,OACtC,OAA+C,eAChD;AACN,MAAI;AACF,UAAM,SAAS,OAAO,OAAO,KAAK,CAAC;AACnC,QAAI,UAAU,GAAI,OAAM,IAAI,MAAM,cAAc;AAChD,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,IAAIA,UAAS,sBAAsB,+CAA+C,EAAE,OAAO,CAAC;AAAA,EACpG;AACF;AAEA,SAAS,eAAe,UAA8B,WAAmB,cAAiD;AACxH,MAAI,SAAS,cAAc,UAAa,SAAS,cAAc,QAAW;AACxE,UAAM,IAAIA,UAAS,sBAAsB,oEAAoE;AAAA,MAC3G,SAAS,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AACA,QAAM,QAAQ,OAAO,SAAS,mBAAmB,SAAS,SAAS,EAAE,SAAS,CAAC;AAC/E,QAAM,QAAQ,OAAO,SAAS,mBAAmB,SAAS,SAAS,EAAE,SAAS,CAAC;AAC/E,QAAM,oBAAoB,OAAO,SAAS;AAC1C,MAAI,gBAAgB,OAAO;AACzB,WAAO,CAAE,qBAAqB,QAAQ,SAAS,OAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3E;AACA,MAAI,eAAe,OAAO;AACxB,WAAO;AAAA,MACJ,qBAAqB,QAAQ,gBAAgB,OAAQ,eAAe;AAAA,MACpE,qBAAqB,eAAe,SAAU;AAAA,IACjD;AAAA,EACF;AACA,SAAO,CAAC,IAAK,qBAAqB,QAAQ,SAAU,GAAG;AACzD;AAEA,SAAS,uBACP,SACA,UACA,UAC4D;AAC5D,MAAI,SAAS,YAAY,QAAW;AAClC,UAAM,IAAIA,UAAS,sBAAsB,0CAA0C,EAAE,QAAQ,CAAC;AAAA,EAChG;AACA,MAAI,aAAa,QAAW;AAC1B,UAAM,iBAAiB,gBAAgB,QAAQ;AAC/C,UAAM,iBAAiB,gBAAgB,SAAS,OAAO;AACvD,QAAI,mBAAmB,gBAAgB;AACrC,YAAM,IAAIA,UAAS,wBAAwB,kDAAkD;AAAA,QAC3F;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,EAAE,SAAS,UAAU,SAAS,MAAM;AAAA,EAC7C;AACA,SAAO,EAAE,SAAS,SAAS,SAAS,SAAS,KAAK;AACpD;AAEA,SAAS,uBAAuB,QAAqB,WAAwB,WAAyB;AACpG,MAAI,WAAW,WAAW;AACxB,UAAM,IAAIA,UAAS,wBAAwB,GAAG,SAAS,+CAA+C;AAAA,MACpG;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,SAAS,OAQU;AAC1B,SAAO;AAAA,IACL,UAAU;AAAA,IACV,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,IAC1D,GAAI,MAAM,cAAc,SAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,IACtE,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IACnE,GAAI,MAAM,iBAAiB,SAAY,EAAE,cAAc,MAAM,aAAa,IAAI,CAAC;AAAA,IAC/E,GAAI,MAAM,mBAAmB,SAAY,EAAE,gBAAgB,MAAM,eAAe,IAAI,CAAC;AAAA,EACvF;AACF;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,SAA2B;AAA3B;AAAA,EAA4B;AAAA,EAA5B;AAAA,EAE7B,MAAM,KAAK,OAAyD;AAClE,UAAM,UAAU,wBAAwB,MAAM,SAAS,SAAS;AAChE,UAAM,kBAAkB,wBAAwB,KAAK,SAAS,MAAM,WAAW,0BAA0B;AACzG,UAAM,QAAQ,qBAAqB,EAAE,SAAS,KAAK,QAAQ,SAAS,SAAS,gBAAgB,CAAC;AAC9F,UAAM,CAAC,gBAAgB,iBAAiB,aAAa,cAAc,IAAI,MAAM;AAAA,MAC3E,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,UAAM,QAAQ,aAAa,aAAa,OAAO;AAC/C,UAAM,WAAW,iBAAiB,aAAa,gBAAgB,UAAU,IAAI;AAC7E,UAAM,WAAW,MAAM,WAAWE,mBAAkB,MAAM,UAAU,UAAU,IAAI;AAClF,UAAM,mBAAmB,WACrB,QAAQ,MAAM;AAAA,MACZ,KAAK;AAAA,MACL,kCAAkC,EAAE,SAAS,KAAK,QAAQ,SAAS,OAAO,UAAU,gBAAgB,CAAC;AAAA,MACrG;AAAA,IACF,EAAE,KAAKD,aAAY,CAAC,IACpB;AAEJ,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,MAC7C,GAAI,qBAAqB,SAAY,EAAE,iBAAiB,IAAI,CAAC;AAAA,MAC7D,GAAG,sBAAsB,gBAAgB,KAAK,QAAQ,OAAO;AAAA,MAC7D,WAAW,YAAYA,cAAa,eAAe,GAAG,WAAW;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,OAA6D;AACtE,UAAM,UAAU,wBAAwB,MAAM,SAAS,SAAS;AAChE,UAAM,WAAW,MAAM,KAAK,KAAK,KAAK;AACtC,QAAI,SAAS,YAAY,UAAa,SAAS,cAAc,UAAa,SAAS,cAAc,QAAW;AAC1G,YAAM,IAAID,UAAS,sBAAsB,kEAAkE;AAAA,QACzG;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,SAAS,MAAM;AAAA,MACnB,KAAK;AAAA,MACL,wBAAwB;AAAA,QACtB,SAAS,KAAK,QAAQ;AAAA,QACtB;AAAA,QACA,QAAQ,gBAAgB,SAAS,OAAO;AAAA,QACxC,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,QACpB,aAAa,wBAAwB,KAAK,SAAS,MAAM,WAAW,sBAAsB;AAAA,QAC1F,iBAAiB,wBAAwB,KAAK,SAAS,MAAM,WAAW,0BAA0B;AAAA,QAClG,aAAa,wBAAwB,KAAK,SAAS,MAAM,WAAW,sBAAsB;AAAA,MAC5F,CAAC;AAAA,MACD;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA,GAAG,gBAAgB,MAAM;AAAA,IAC3B;AAAA,EACF;AAAA,EAES,SAAS;AAAA,IAChB,MAAM,OAAO,UAA+D,KAAK,WAAW,KAAK;AAAA,IACjG,SAAS,OAAO,UACd,uBAAuB,MAAM,KAAK,WAAW,KAAK,GAAG,sBAAsB,KAAK,OAAO,CAAC;AAAA,EAC5F;AAAA,EAES,UAAU;AAAA,IACjB,MAAM,OAAO,UAAgE,KAAK,YAAY,KAAK;AAAA,IACnG,SAAS,OAAO,UACd,uBAAuB,MAAM,KAAK,YAAY,KAAK,GAAG,sBAAsB,KAAK,OAAO,CAAC;AAAA,EAC7F;AAAA,EAEA,MAAc,uBACZ,SACA,WACA,WACA,gBACgE;AAChE,UAAM,SAAS,MAAM,qBAAqB,KAAK,SAAS,SAAS;AACjE,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B;AAAA,MACA,GAAI,mBAAmB,WAAW,CAAC,IAAI,EAAE,UAAU,OAAO;AAAA,MAC1D,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjD,CAAC;AACD,QAAI,mBAAmB,UAAU;AAC/B,+BAAyB;AAAA,QACvB;AAAA,QACA;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,QACzE,GAAI,SAAS,qBAAqB,SAAY,EAAE,kBAAkB,SAAS,iBAAiB,IAAI,CAAC;AAAA,MACnG,CAAC;AAAA,IACH;AACA,WAAO,EAAE,QAAQ,SAAS;AAAA,EAC5B;AAAA,EAEA,MAAc,WAAW,OAA4D;AACnF,UAAM,kBAAkB,wBAAwB,KAAK,SAAS,MAAM,WAAW,0BAA0B;AACzG,UAAM,SAAS,WAAW,KAAK,SAAS,oBAAoB;AAC5D,UAAM,UAAU,wBAAwB,MAAM,SAAS,SAAS;AAChE,UAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,UAAM,UAAU,uBAAuB,SAAS,MAAM,SAAS,QAAQ;AACvE,UAAM,YAAY,MAAM,mBAAmB,KAAK,SAAS,MAAM,WAAW,sBAAsB,MAAM;AACtG,2BAAuB,QAAQ,WAAW,oBAAoB;AAC9D,UAAM,WAAW,kBAAkB,KAAK,SAAS,KAAK;AACtD,UAAM,eAAe,eAAe,MAAM,YAAY,MAAM;AAC5D,UAAM,YAAY,uBAAuB,OAAO,SAAS,SAAS;AAClE,UAAM,iBAAiB,MAAM,eAAe,UAAa,MAAM,eAAe,SAC1E;AAAA,MACE;AAAA,MACA;AAAA,MACA,kBAAkB,MAAM;AAAA,QACtB,KAAK;AAAA,QACL,qBAAqB;AAAA,UACnB,SAAS,KAAK,QAAQ;AAAA,UACtB,QAAQ,gBAAgB,QAAQ,OAAO;AAAA,UACvC,aAAa,wBAAwB,KAAK,SAAS,MAAM,WAAW,sBAAsB;AAAA,QAC5F,CAAC;AAAA,QACD;AAAA,MACF,CAAC;AAAA,IACH,IACA;AACJ,UAAM,aAAa,MAAM,eAAe,SACpC,wBAAwB,MAAM,YAAY,cAAc,EAAE,WAAW,KAAK,CAAC,IAC3E,MAAM,iBAAiB,eAClB,iBAAiB,CAAC,KAAK,MAAM,OAAO,MAAS,YAAY,IAAI,SAAU,QAAS,SAAS,IAC5F,iBAAiB,iBAAiB,CAAC,KAAK,IAAI,YAAY,EAAE,SAAS;AACzE,UAAM,aAAa,MAAM,eAAe,SACpC,wBAAwB,MAAM,YAAY,cAAc,EAAE,WAAW,KAAK,CAAC,IAC3E,MAAM,iBAAiB,eAClB,iBAAiB,CAAC,KAAK,MAAM,OAAO,MAAS,YAAY,IAAI,SAAU,QAAS,SAAS,IAC5F,iBAAiB,iBAAiB,CAAC,KAAK,IAAI,YAAY,EAAE,SAAS;AACzE,UAAM,iBAAiB,+BAA+B;AAAA,MACpD,SAAS,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,MAAM,mBAAmB,SAAY,EAAE,gBAAgB,MAAM,eAAe,IAAI,CAAC;AAAA,MACrF,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,IAAI,GAAG,MAAM;AAAA,IACf,CAAC;AACD,UAAM,oBAAoB,MAAM,oBAAoB,cAChD,uBAAuB;AAAA,MACrB,SAAS,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,OAAO,CAAC,2BAA2B,cAAc,CAAC;AAAA,MAClD,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,IAAI,GAAG,MAAM;AAAA,IACf,CAAC,IACD;AACJ,UAAM,SAAS;AAAA,MACb,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,oBAAoB,iCAAiC,iBAAiB;AAAA,QAC7E,YAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,KAAK,QAAQ;AAAA,MACtB,OAAO;AAAA,MACP,SAAS;AAAA,QACP,OAAO;AAAA,QACP,OAAO,CAAC,YAAY,OAAO,IAAI,aAAa,SAAS,EAAE;AAAA,MACzD;AAAA,MACA,WAAW,CAAC;AAAA,MACZ,cAAc,CAAC,MAAM;AAAA,MACrB,UAAU,SAAS;AAAA,QACjB,WAAW;AAAA,QACX;AAAA,QACA,OAAO,SAAS;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,QAAQ;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,OAA6D;AACrF,UAAM,kBAAkB,wBAAwB,KAAK,SAAS,MAAM,WAAW,0BAA0B;AACzG,UAAM,SAAS,WAAW,KAAK,SAAS,qBAAqB;AAC7D,UAAM,UAAU,wBAAwB,MAAM,SAAS,SAAS;AAChE,UAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,UAAM,UAAU,uBAAuB,SAAS,MAAM,SAAS,QAAQ;AACvE,UAAM,YAAY,MAAM,mBAAmB,KAAK,SAAS,MAAM,WAAW,uBAAuB,MAAM;AACvG,2BAAuB,QAAQ,WAAW,qBAAqB;AAC/D,UAAM,WAAW,kBAAkB,KAAK,SAAS,KAAK;AACtD,UAAM,SAAS,qBAAqB;AAAA,MAClC,SAAS,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,MAAM,mBAAmB,SAAY,EAAE,gBAAgB,MAAM,eAAe,IAAI,CAAC;AAAA,MACrF,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,IAAI,GAAG,MAAM;AAAA,IACf,CAAC;AACD,UAAM,oBAAoB,MAAM,oBAAoB,cAChD,uBAAuB;AAAA,MACrB,SAAS,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,OAAO,CAAC,2BAA2B,MAAM,CAAC;AAAA,MAC1C,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,IAAI,GAAG,MAAM;AAAA,IACf,CAAC,IACD;AACJ,UAAM,cAAc;AAAA,MAClB,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,oBAAoB,iCAAiC,kBAAkB;AAAA,QAC9E,YAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,KAAK,QAAQ;AAAA,MACtB,OAAO;AAAA,MACP,SAAS;AAAA,QACP,OAAO;AAAA,QACP,OAAO,CAAC,YAAY,OAAO,IAAI,aAAa,SAAS,EAAE;AAAA,MACzD;AAAA,MACA,WAAW,CAAC;AAAA,MACZ,cAAc,CAAC,WAAW;AAAA,MAC1B,UAAU,SAAS;AAAA,QACjB,WAAW;AAAA,QACX;AAAA,QACA,OAAO,SAAS;AAAA,QAChB;AAAA,QACA;AAAA,QACA,gBAAgB,QAAQ;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACvkBO,IAAM,kBAAN,MAAsB;AAAA,EAClB;AAAA,EAKA;AAAA,EAOT,YAAY,SAA2B;AACrC,UAAM,WAAW,IAAI,kBAAkB,OAAO;AAC9C,UAAM,WAAW,IAAI,kBAAkB,OAAO;AAC9C,SAAK,KAAK;AAAA,MACR,MAAM,CAAC,UAAU,SAAS,KAAK,KAAK;AAAA,MACpC,QAAQ,SAAS;AAAA,MACjB,SAAS,SAAS;AAAA,IACpB;AACA,SAAK,KAAK;AAAA,MACR,MAAM,CAAC,UAAU,SAAS,KAAK,KAAK;AAAA,MACpC,MAAM,CAAC,UAAU,SAAS,KAAK,KAAK;AAAA,MACpC,QAAQ,SAAS;AAAA,MACjB,SAAS,SAAS;AAAA,IACpB;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,SAA4C;AAChF,SAAO,IAAI,gBAAgB,OAAO;AACpC;","names":["SDKError","assertTronAddress","SDKError","SDKError","assertTronAddress","SDKError","assertTronAddress","SDKError","unwrapSingle","assertTronAddress"]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContextExecutor,
|
|
3
|
+
resolveTransactionDeadline
|
|
4
|
+
} from "./chunk-VFVKMC4H.js";
|
|
5
|
+
|
|
6
|
+
// src/internal/v2-swap-action.ts
|
|
7
|
+
import {
|
|
8
|
+
buildV2SwapEthForExactTokensAction,
|
|
9
|
+
buildV2SwapExactEthForTokensAction,
|
|
10
|
+
buildV2SwapExactTokensForEthAction,
|
|
11
|
+
buildV2SwapExactTokensForTokensAction,
|
|
12
|
+
buildV2SwapTokensForExactEthAction,
|
|
13
|
+
buildV2SwapTokensForExactTokensAction
|
|
14
|
+
} from "@sun-protocol/sun-sdk-sunswap-v2";
|
|
15
|
+
import {
|
|
16
|
+
SDKError,
|
|
17
|
+
createDeferredContractCallAction
|
|
18
|
+
} from "@sun-protocol/sun-sdk-core";
|
|
19
|
+
var V2_SWAP_MATERIALIZATION_KIND = "sunswap-v2-swap";
|
|
20
|
+
function requireAmount(data, key) {
|
|
21
|
+
const value = data[key];
|
|
22
|
+
if (value === void 0) {
|
|
23
|
+
throw new SDKError("SDK_RUNTIME_ERROR", `Deferred V2 swap is missing ${key}`, {
|
|
24
|
+
operation: data.operation,
|
|
25
|
+
key
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function createDeferredV2SwapAction(input) {
|
|
31
|
+
return createDeferredContractCallAction({
|
|
32
|
+
id: `sunswap-v2-${input.data.operation}`,
|
|
33
|
+
materialization: {
|
|
34
|
+
kind: V2_SWAP_MATERIALIZATION_KIND,
|
|
35
|
+
data: input.data
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async function materializeV2SwapAction(context, action) {
|
|
40
|
+
if (action.materialization.kind !== V2_SWAP_MATERIALIZATION_KIND) {
|
|
41
|
+
throw new SDKError("SDK_RUNTIME_ERROR", `Unsupported deferred action kind: ${action.materialization.kind}`);
|
|
42
|
+
}
|
|
43
|
+
const data = action.materialization.data;
|
|
44
|
+
const options = {
|
|
45
|
+
network: context.network,
|
|
46
|
+
id: action.id,
|
|
47
|
+
path: data.path,
|
|
48
|
+
recipient: data.recipient,
|
|
49
|
+
deadline: await resolveTransactionDeadline(context, data.transactionValidForSeconds)
|
|
50
|
+
};
|
|
51
|
+
switch (data.operation) {
|
|
52
|
+
case "swap-exact-eth-for-tokens":
|
|
53
|
+
return buildV2SwapExactEthForTokensAction({
|
|
54
|
+
...options,
|
|
55
|
+
amountIn: requireAmount(data, "amountIn"),
|
|
56
|
+
amountOutMin: requireAmount(data, "amountOutMin")
|
|
57
|
+
});
|
|
58
|
+
case "swap-eth-for-exact-tokens":
|
|
59
|
+
return buildV2SwapEthForExactTokensAction({
|
|
60
|
+
...options,
|
|
61
|
+
amountOut: requireAmount(data, "amountOut"),
|
|
62
|
+
amountInMax: requireAmount(data, "amountInMax")
|
|
63
|
+
});
|
|
64
|
+
case "swap-exact-tokens-for-eth":
|
|
65
|
+
return buildV2SwapExactTokensForEthAction({
|
|
66
|
+
...options,
|
|
67
|
+
amountIn: requireAmount(data, "amountIn"),
|
|
68
|
+
amountOutMin: requireAmount(data, "amountOutMin")
|
|
69
|
+
});
|
|
70
|
+
case "swap-exact-tokens-for-tokens":
|
|
71
|
+
return buildV2SwapExactTokensForTokensAction({
|
|
72
|
+
...options,
|
|
73
|
+
amountIn: requireAmount(data, "amountIn"),
|
|
74
|
+
amountOutMin: requireAmount(data, "amountOutMin")
|
|
75
|
+
});
|
|
76
|
+
case "swap-tokens-for-exact-eth":
|
|
77
|
+
return buildV2SwapTokensForExactEthAction({
|
|
78
|
+
...options,
|
|
79
|
+
amountOut: requireAmount(data, "amountOut"),
|
|
80
|
+
amountInMax: requireAmount(data, "amountInMax")
|
|
81
|
+
});
|
|
82
|
+
case "swap-tokens-for-exact-tokens":
|
|
83
|
+
return buildV2SwapTokensForExactTokensAction({
|
|
84
|
+
...options,
|
|
85
|
+
amountOut: requireAmount(data, "amountOut"),
|
|
86
|
+
amountInMax: requireAmount(data, "amountInMax")
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/swap/v2-execute.ts
|
|
92
|
+
function createV2SwapExecutor(context) {
|
|
93
|
+
return {
|
|
94
|
+
...createContextExecutor(context),
|
|
95
|
+
materializeAction: (action) => materializeV2SwapAction(context, action)
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export {
|
|
100
|
+
createDeferredV2SwapAction,
|
|
101
|
+
createV2SwapExecutor
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=chunk-TSHXXRH2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/v2-swap-action.ts","../src/swap/v2-execute.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AAIA,IAAM,+BAA+B;AAqB5C,SAAS,cAAc,MAAiC,KAAwE;AAC9H,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,SAAS,qBAAqB,+BAA+B,GAAG,IAAI;AAAA,MAC5E,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,2BAA2B,OAEZ;AAC7B,SAAO,iCAAiC;AAAA,IACtC,IAAI,cAAc,MAAM,KAAK,SAAS;AAAA,IACtC,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,wBACpB,SACA,QAC6B;AAC7B,MAAI,OAAO,gBAAgB,SAAS,8BAA8B;AAChE,UAAM,IAAI,SAAS,qBAAqB,qCAAqC,OAAO,gBAAgB,IAAI,EAAE;AAAA,EAC5G;AAEA,QAAM,OAAO,OAAO,gBAAgB;AACpC,QAAM,UAAU;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,IAAI,OAAO;AAAA,IACX,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,UAAU,MAAM,2BAA2B,SAAS,KAAK,0BAA0B;AAAA,EACrF;AAEA,UAAQ,KAAK,WAAW;AAAA,IACtB,KAAK;AACH,aAAO,mCAAmC;AAAA,QACxC,GAAG;AAAA,QACH,UAAU,cAAc,MAAM,UAAU;AAAA,QACxC,cAAc,cAAc,MAAM,cAAc;AAAA,MAClD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,mCAAmC;AAAA,QACxC,GAAG;AAAA,QACH,WAAW,cAAc,MAAM,WAAW;AAAA,QAC1C,aAAa,cAAc,MAAM,aAAa;AAAA,MAChD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,mCAAmC;AAAA,QACxC,GAAG;AAAA,QACH,UAAU,cAAc,MAAM,UAAU;AAAA,QACxC,cAAc,cAAc,MAAM,cAAc;AAAA,MAClD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,sCAAsC;AAAA,QAC3C,GAAG;AAAA,QACH,UAAU,cAAc,MAAM,UAAU;AAAA,QACxC,cAAc,cAAc,MAAM,cAAc;AAAA,MAClD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,mCAAmC;AAAA,QACxC,GAAG;AAAA,QACH,WAAW,cAAc,MAAM,WAAW;AAAA,QAC1C,aAAa,cAAc,MAAM,aAAa;AAAA,MAChD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,sCAAsC;AAAA,QAC3C,GAAG;AAAA,QACH,WAAW,cAAc,MAAM,WAAW;AAAA,QAC1C,aAAa,cAAc,MAAM,aAAa;AAAA,MAChD,CAAC;AAAA,EACL;AACF;;;ACjHO,SAAS,qBAAqB,SAAoD;AACvF,SAAO;AAAA,IACL,GAAG,sBAAsB,OAAO;AAAA,IAChC,mBAAmB,CAAC,WAAW,wBAAwB,SAAS,MAAM;AAAA,EACxE;AACF;","names":[]}
|