@sun-protocol/sun-sdk-sunswap-v2 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/actions.ts","../src/utils.ts","../src/constants.ts","../src/errors.ts","../src/entities/pair.ts","../src/entities/route.ts","../src/entities/trade.ts","../src/reads.ts","../src/router.ts"],"sourcesContent":["import { getContractAddress } from '@sun-protocol/sun-sdk-chains'\nimport {\n createApproveAction,\n createContractCallAction,\n type BigintIsh,\n type ContractCallAction,\n type Network,\n type Token,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { evmHexToTronAddress } from './utils.js'\n\nexport const V2_ROUTER_SELECTORS = {\n addLiquidity: 'addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256)',\n addLiquidityETH: 'addLiquidityETH(address,uint256,uint256,uint256,address,uint256)',\n removeLiquidity: 'removeLiquidity(address,address,uint256,uint256,uint256,address,uint256)',\n removeLiquidityETH: 'removeLiquidityETH(address,uint256,uint256,uint256,address,uint256)',\n swapExactETHForTokens: 'swapExactETHForTokens(uint256,address[],address,uint256)',\n swapETHForExactTokens: 'swapETHForExactTokens(uint256,address[],address,uint256)',\n swapExactTokensForETH: 'swapExactTokensForETH(uint256,uint256,address[],address,uint256)',\n swapExactTokensForTokens: 'swapExactTokensForTokens(uint256,uint256,address[],address,uint256)',\n swapTokensForExactETH: 'swapTokensForExactETH(uint256,uint256,address[],address,uint256)',\n swapTokensForExactTokens: 'swapTokensForExactTokens(uint256,uint256,address[],address,uint256)',\n} as const\n\nexport interface V2ActionOptions {\n readonly network: Network\n readonly router?: TronAddress\n readonly feeLimit?: number\n readonly id?: string\n}\n\nexport interface BuildV2AddLiquidityActionParams extends V2ActionOptions {\n readonly tokenA: Token\n readonly tokenB: Token\n readonly amountADesired: BigintIsh\n readonly amountBDesired: BigintIsh\n readonly amountAMin: BigintIsh\n readonly amountBMin: BigintIsh\n readonly recipient: TronAddress\n readonly deadline: BigintIsh\n}\n\nexport interface BuildV2RemoveLiquidityActionParams extends V2ActionOptions {\n readonly tokenA: Token\n readonly tokenB: Token\n readonly liquidity: BigintIsh\n readonly amountAMin: BigintIsh\n readonly amountBMin: BigintIsh\n readonly recipient: TronAddress\n readonly deadline: BigintIsh\n}\n\nexport interface BuildV2AddLiquidityEthActionParams extends V2ActionOptions {\n readonly token: Token\n readonly amountTokenDesired: BigintIsh\n readonly amountEthDesired: BigintIsh\n readonly amountTokenMin: BigintIsh\n readonly amountEthMin: BigintIsh\n readonly recipient: TronAddress\n readonly deadline: BigintIsh\n}\n\nexport interface BuildV2RemoveLiquidityEthActionParams extends V2ActionOptions {\n readonly token: Token\n readonly liquidity: BigintIsh\n readonly amountTokenMin: BigintIsh\n readonly amountEthMin: BigintIsh\n readonly recipient: TronAddress\n readonly deadline: BigintIsh\n}\n\nexport interface V2SwapActionOptions extends V2ActionOptions {\n readonly path: readonly TronAddress[]\n readonly recipient: TronAddress\n readonly deadline: BigintIsh\n}\n\nexport interface BuildV2SwapExactEthForTokensActionParams extends V2SwapActionOptions {\n readonly amountIn: BigintIsh\n readonly amountOutMin: BigintIsh\n}\n\nexport interface BuildV2SwapEthForExactTokensActionParams extends V2SwapActionOptions {\n readonly amountOut: BigintIsh\n readonly amountInMax: BigintIsh\n}\n\nexport interface BuildV2SwapExactTokensForEthActionParams extends V2SwapActionOptions {\n readonly amountIn: BigintIsh\n readonly amountOutMin: BigintIsh\n}\n\nexport interface BuildV2SwapExactTokensForTokensActionParams extends V2SwapActionOptions {\n readonly amountIn: BigintIsh\n readonly amountOutMin: BigintIsh\n}\n\nexport interface BuildV2SwapTokensForExactEthActionParams extends V2SwapActionOptions {\n readonly amountOut: BigintIsh\n readonly amountInMax: BigintIsh\n}\n\nexport interface BuildV2SwapTokensForExactTokensActionParams extends V2SwapActionOptions {\n readonly amountOut: BigintIsh\n readonly amountInMax: BigintIsh\n}\n\nfunction routerTarget(params: V2ActionOptions): TronAddress {\n return params.router ?? getContractAddress(params.network, 'sunswapV2Router')\n}\n\nfunction valueOf(value: BigintIsh): string {\n return value.toString()\n}\n\nfunction actionId(params: V2ActionOptions, suffix: string): string {\n return params.id ?? `sunswap-v2-${suffix}-${params.network}`\n}\n\nexport function buildV2AddLiquidityAction(params: BuildV2AddLiquidityActionParams): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'add-liquidity'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.addLiquidity,\n parameters: [\n { type: 'address', value: evmHexToTronAddress(params.tokenA.address, 'tokenA') },\n { type: 'address', value: evmHexToTronAddress(params.tokenB.address, 'tokenB') },\n { type: 'uint256', value: valueOf(params.amountADesired) },\n { type: 'uint256', value: valueOf(params.amountBDesired) },\n { type: 'uint256', value: valueOf(params.amountAMin) },\n { type: 'uint256', value: valueOf(params.amountBMin) },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2RemoveLiquidityAction(params: BuildV2RemoveLiquidityActionParams): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'remove-liquidity'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.removeLiquidity,\n parameters: [\n { type: 'address', value: evmHexToTronAddress(params.tokenA.address, 'tokenA') },\n { type: 'address', value: evmHexToTronAddress(params.tokenB.address, 'tokenB') },\n { type: 'uint256', value: valueOf(params.liquidity) },\n { type: 'uint256', value: valueOf(params.amountAMin) },\n { type: 'uint256', value: valueOf(params.amountBMin) },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2AddLiquidityEthAction(params: BuildV2AddLiquidityEthActionParams): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'add-liquidity-eth'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.addLiquidityETH,\n parameters: [\n { type: 'address', value: evmHexToTronAddress(params.token.address, 'token') },\n { type: 'uint256', value: valueOf(params.amountTokenDesired) },\n { type: 'uint256', value: valueOf(params.amountTokenMin) },\n { type: 'uint256', value: valueOf(params.amountEthMin) },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n callValue: BigInt(valueOf(params.amountEthDesired)),\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2RemoveLiquidityEthAction(params: BuildV2RemoveLiquidityEthActionParams): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'remove-liquidity-eth'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.removeLiquidityETH,\n parameters: [\n { type: 'address', value: evmHexToTronAddress(params.token.address, 'token') },\n { type: 'uint256', value: valueOf(params.liquidity) },\n { type: 'uint256', value: valueOf(params.amountTokenMin) },\n { type: 'uint256', value: valueOf(params.amountEthMin) },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2SwapExactEthForTokensAction(\n params: BuildV2SwapExactEthForTokensActionParams,\n): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'swap-exact-eth-for-tokens'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.swapExactETHForTokens,\n parameters: [\n { type: 'uint256', value: valueOf(params.amountOutMin) },\n { type: 'address[]', value: params.path },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n callValue: BigInt(valueOf(params.amountIn)),\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2SwapEthForExactTokensAction(\n params: BuildV2SwapEthForExactTokensActionParams,\n): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'swap-eth-for-exact-tokens'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.swapETHForExactTokens,\n parameters: [\n { type: 'uint256', value: valueOf(params.amountOut) },\n { type: 'address[]', value: params.path },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n callValue: BigInt(valueOf(params.amountInMax)),\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2SwapExactTokensForEthAction(\n params: BuildV2SwapExactTokensForEthActionParams,\n): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'swap-exact-tokens-for-eth'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.swapExactTokensForETH,\n parameters: [\n { type: 'uint256', value: valueOf(params.amountIn) },\n { type: 'uint256', value: valueOf(params.amountOutMin) },\n { type: 'address[]', value: params.path },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2SwapExactTokensForTokensAction(\n params: BuildV2SwapExactTokensForTokensActionParams,\n): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'swap-exact-tokens-for-tokens'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.swapExactTokensForTokens,\n parameters: [\n { type: 'uint256', value: valueOf(params.amountIn) },\n { type: 'uint256', value: valueOf(params.amountOutMin) },\n { type: 'address[]', value: params.path },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2SwapTokensForExactEthAction(\n params: BuildV2SwapTokensForExactEthActionParams,\n): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'swap-tokens-for-exact-eth'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.swapTokensForExactETH,\n parameters: [\n { type: 'uint256', value: valueOf(params.amountOut) },\n { type: 'uint256', value: valueOf(params.amountInMax) },\n { type: 'address[]', value: params.path },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2SwapTokensForExactTokensAction(\n params: BuildV2SwapTokensForExactTokensActionParams,\n): ContractCallAction {\n return createContractCallAction({\n id: actionId(params, 'swap-tokens-for-exact-tokens'),\n target: routerTarget(params),\n functionSelector: V2_ROUTER_SELECTORS.swapTokensForExactTokens,\n parameters: [\n { type: 'uint256', value: valueOf(params.amountOut) },\n { type: 'uint256', value: valueOf(params.amountInMax) },\n { type: 'address[]', value: params.path },\n { type: 'address', value: params.recipient },\n { type: 'uint256', value: valueOf(params.deadline) },\n ],\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n\nexport function buildV2LpApproveAction(params: {\n readonly pair: TronAddress\n readonly spender: TronAddress\n readonly amount: BigintIsh\n readonly feeLimit?: number\n readonly id?: string\n}): ContractCallAction {\n return createApproveAction({\n id: params.id ?? `sunswap-v2-lp-approve-${params.pair}`,\n target: params.pair,\n spender: params.spender,\n amount: valueOf(params.amount),\n ...(params.feeLimit !== undefined ? { feeLimit: params.feeLimit } : {}),\n })\n}\n","import { getContractAddress, getWrappedNativeAddress } from '@sun-protocol/sun-sdk-chains'\nimport { keccak256 } from '@ethersproject/keccak256'\nimport { sha256 } from '@noble/hashes/sha256'\nimport { Percent, SDK_ERROR_CODES, sdkInvariant, type BigintIsh, type Network, type Token, type TronAddress } from '@sun-protocol/sun-sdk-core'\nimport type { V2PairKey } from './types.js'\n\nexport const V2_INIT_CODE_HASH: Record<Network, `0x${string}`> = {\n mainnet: '0x6d3f89421f83e4b62e628de8fc7ff2b014a79bf8fd8e8b0ea46e4a1d9409b67d',\n nile: '0x9dd9bfc2f6c1103a6c01d9c6a4044e4b8a9361f92df2728cdc3729922d56748e',\n}\n\nexport interface ComputeV2PairAddressParams {\n readonly network: Network\n readonly tokenA: TronAddress | string\n readonly tokenB: TronAddress | string\n readonly factory?: TronAddress | string\n readonly initCodeHash?: string\n readonly wrappedNative?: TronAddress | string\n}\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\nconst BASE58_ZERO = '1'\nconst HEX_20_BYTES_PATTERN = /^0x[a-fA-F0-9]{40}$/\nconst HEX_20_BYTES_NO_PREFIX_PATTERN = /^[a-fA-F0-9]{40}$/\nconst HEX_32_BYTES_PATTERN = /^(?:0x)?[a-fA-F0-9]{64}$/\nconst TRON_ADDRESS_PAYLOAD_BYTES = 25\nconst TRON_ADDRESS_BYTES = 21\nconst TRON_PREFIX_HEX = '41'\n\nfunction toBigInt(value: BigintIsh): bigint {\n return BigInt(value.toString())\n}\n\nfunction validatePositive(value: bigint, label: string): void {\n sdkInvariant(value > 0n, SDK_ERROR_CODES.SDK_INVALID_ARGUMENT, `${label} must be positive`, {\n [label]: value.toString(),\n })\n}\n\nexport function sortV2Tokens(tokenA: Token, tokenB: Token): readonly [Token, Token] {\n return tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]\n}\n\nfunction decodeBase58(value: string): Uint8Array {\n let decoded = 0n\n\n for (const char of value) {\n const index = BASE58_ALPHABET.indexOf(char)\n sdkInvariant(index >= 0, SDK_ERROR_CODES.SDK_INVALID_ARGUMENT, 'Invalid base58 character', { value, char })\n decoded = decoded * 58n + BigInt(index)\n }\n\n const bytes: number[] = []\n while (decoded > 0n) {\n bytes.unshift(Number(decoded & 0xffn))\n decoded >>= 8n\n }\n\n for (const char of value) {\n if (char !== '1') break\n bytes.unshift(0)\n }\n\n return Uint8Array.from(bytes)\n}\n\nfunction encodeBase58(bytes: Uint8Array): string {\n let value = 0n\n for (const byte of bytes) {\n value = (value << 8n) + BigInt(byte)\n }\n\n let encoded = ''\n while (value > 0n) {\n const mod = Number(value % 58n)\n const char = BASE58_ALPHABET[mod]\n sdkInvariant(char !== undefined, SDK_ERROR_CODES.SDK_INVALID_ARGUMENT, 'Invalid base58 remainder', { mod })\n encoded = char + encoded\n value /= 58n\n }\n\n for (const byte of bytes) {\n if (byte !== 0) break\n encoded = `${BASE58_ZERO}${encoded}`\n }\n\n return encoded || BASE58_ZERO\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('')\n}\n\nfunction hexToBytes(hex: string, label: string): Uint8Array {\n const normalized = hex.startsWith('0x') ? hex.slice(2) : hex\n sdkInvariant(/^[a-fA-F0-9]*$/.test(normalized) && normalized.length % 2 === 0, SDK_ERROR_CODES.SDK_INVALID_ARGUMENT, `${label} must be even-length hex`, {\n label,\n value: hex,\n })\n const bytes = new Uint8Array(normalized.length / 2)\n for (let i = 0; i < bytes.length; i += 1) {\n bytes[i] = Number.parseInt(normalized.slice(i * 2, i * 2 + 2), 16)\n }\n return bytes\n}\n\nfunction checksum(payload: Uint8Array): Uint8Array {\n return sha256(sha256(payload)).slice(0, 4)\n}\n\nfunction tronPayloadToBase58(payload: Uint8Array): TronAddress {\n const bytes = new Uint8Array(TRON_ADDRESS_PAYLOAD_BYTES)\n bytes.set(payload, 0)\n bytes.set(checksum(payload), TRON_ADDRESS_BYTES)\n return encodeBase58(bytes) as TronAddress\n}\n\nexport function tronAddressToEvmHex(address: string, label = 'address'): string {\n if (HEX_20_BYTES_PATTERN.test(address)) return address.slice(2).toLowerCase()\n if (HEX_20_BYTES_NO_PREFIX_PATTERN.test(address)) return address.toLowerCase()\n\n const decoded = decodeBase58(address)\n sdkInvariant(\n decoded.length === TRON_ADDRESS_PAYLOAD_BYTES,\n SDK_ERROR_CODES.SDK_INVALID_ARGUMENT,\n `${label} must be a TRON base58 address or 20-byte EVM hex address`,\n { label, value: address },\n )\n const body = decoded.slice(0, TRON_ADDRESS_BYTES)\n const expectedChecksum = checksum(body)\n const actualChecksum = decoded.slice(TRON_ADDRESS_BYTES)\n sdkInvariant(\n bytesToHex(expectedChecksum) === bytesToHex(actualChecksum),\n SDK_ERROR_CODES.SDK_INVALID_ARGUMENT,\n `${label} has invalid TRON base58 checksum`,\n { label, value: address },\n )\n sdkInvariant(body[0] === 0x41, SDK_ERROR_CODES.SDK_INVALID_ARGUMENT, `${label} must use TRON 0x41 prefix`, {\n label,\n value: address,\n })\n return bytesToHex(body.slice(1))\n}\n\nexport function evmHexToTronAddress(address: string, label = 'address'): TronAddress {\n sdkInvariant(HEX_20_BYTES_PATTERN.test(address), SDK_ERROR_CODES.SDK_INVALID_ARGUMENT, `${label} must be a 20-byte EVM hex address`, {\n label,\n value: address,\n })\n return tronPayloadToBase58(hexToBytes(`${TRON_PREFIX_HEX}${address.slice(2)}`, label))\n}\n\nexport function tronCreate2Address(params: {\n readonly factoryAddress: string\n readonly salt: string\n readonly initCodeHash: string\n}): TronAddress {\n const factory = tronAddressToEvmHex(params.factoryAddress, 'factory')\n const salt = normalizeV2InitCodeHash(params.salt)\n const initCodeHash = normalizeV2InitCodeHash(params.initCodeHash)\n const hash = keccak256(hexToBytes(`${TRON_PREFIX_HEX}${factory}${salt}${initCodeHash}`, 'CREATE2 input')).slice(2)\n return tronPayloadToBase58(hexToBytes(`${TRON_PREFIX_HEX}${hash.slice(-40)}`, 'contract address'))\n}\n\nfunction normalizeV2InitCodeHash(value: string): string {\n sdkInvariant(HEX_32_BYTES_PATTERN.test(value), SDK_ERROR_CODES.SDK_INVALID_ARGUMENT, 'V2 initCodeHash must be bytes32 hex', {\n value,\n })\n return value.startsWith('0x') ? value.slice(2).toLowerCase() : value.toLowerCase()\n}\n\nfunction normalizeV2TokenAddress(address: string, wrappedNative: string, label: string): string {\n const normalized = address === 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb' ? wrappedNative : address\n return tronAddressToEvmHex(normalized, label)\n}\n\nexport function computeV2PairAddress(params: ComputeV2PairAddressParams): TronAddress {\n const wrappedNative = params.wrappedNative ?? getWrappedNativeAddress(params.network)\n const tokenA = normalizeV2TokenAddress(params.tokenA, wrappedNative, 'tokenA')\n const tokenB = normalizeV2TokenAddress(params.tokenB, wrappedNative, 'tokenB')\n sdkInvariant(tokenA !== tokenB, SDK_ERROR_CODES.SDK_INVALID_ARGUMENT, 'V2 pair tokens must be different', {\n tokenA: params.tokenA,\n tokenB: params.tokenB,\n })\n\n const [token0, token1] = tokenA < tokenB ? [tokenA, tokenB] : [tokenB, tokenA]\n const factory = tronAddressToEvmHex(params.factory ?? getContractAddress(params.network, 'sunswapV2Factory'), 'factory')\n const tokenHash = keccak256(hexToBytes(`${token0}${token1}`, 'token salt')).slice(2)\n const initCodeHash = normalizeV2InitCodeHash(params.initCodeHash ?? V2_INIT_CODE_HASH[params.network]!)\n return tronCreate2Address({ factoryAddress: factory, salt: tokenHash, initCodeHash })\n}\n\nexport function createV2PairKey(input: { network: V2PairKey['network']; tokenA: Token; tokenB: Token }): V2PairKey {\n const [token0, token1] = sortV2Tokens(input.tokenA, input.tokenB)\n return { network: input.network, token0, token1 }\n}\n\nexport function quoteV2LiquidityAmount(amountA: BigintIsh, reserveA: BigintIsh, reserveB: BigintIsh): string {\n const amount = toBigInt(amountA)\n const reserveIn = toBigInt(reserveA)\n const reserveOut = toBigInt(reserveB)\n validatePositive(amount, 'amountA')\n validatePositive(reserveIn, 'reserveA')\n validatePositive(reserveOut, 'reserveB')\n return ((amount * reserveOut) / reserveIn).toString()\n}\n\nexport function applyV2SlippageMin(amount: BigintIsh, slippageTolerance: Percent): string {\n sdkInvariant(\n !slippageTolerance.lessThan(0),\n SDK_ERROR_CODES.SDK_INVALID_ARGUMENT,\n 'Slippage tolerance cannot be negative',\n { slippageTolerance: slippageTolerance.toSignificant() },\n )\n sdkInvariant(\n !slippageTolerance.greaterThan(1),\n SDK_ERROR_CODES.SDK_INVALID_ARGUMENT,\n 'Slippage tolerance cannot exceed 100%',\n { slippageTolerance: slippageTolerance.toSignificant() },\n )\n return new Percent(1).subtract(slippageTolerance).multiply(amount.toString()).quotient.toString()\n}\n\nexport function getV2AddLiquidityMinimums(\n amounts: { amountA: BigintIsh; amountB: BigintIsh },\n slippageTolerance: Percent,\n): { amountAMin: string; amountBMin: string } {\n return {\n amountAMin: applyV2SlippageMin(amounts.amountA, slippageTolerance),\n amountBMin: applyV2SlippageMin(amounts.amountB, slippageTolerance),\n }\n}\n\nexport function getV2RemoveLiquidityMinimums(\n amounts: { amountA: BigintIsh; amountB: BigintIsh },\n slippageTolerance: Percent,\n): { amountAMin: string; amountBMin: string } {\n return getV2AddLiquidityMinimums(amounts, slippageTolerance)\n}\n","import { Percent } from '@sun-protocol/sun-sdk-core'\nimport JSBI from 'jsbi'\n\nexport const FACTORY_ADDRESS = '0x689abaeeed3f0bb3585773192e23224cac25dd41'\n\nexport const FACTORY_ADDRESS_MAP: { [chainId: number]: string } = {\n 728126428: FACTORY_ADDRESS,\n 3448148188: '0x55f7d5d874a73f21c0851c62d374307985f440fc',\n}\n\nexport const INIT_CODE_HASH = '0x6d3f89421f83e4b62e628de8fc7ff2b014a79bf8fd8e8b0ea46e4a1d9409b67d'\n\nexport const INIT_CODE_HASH_MAP: { [chainId: number]: string } = {\n 728126428: INIT_CODE_HASH,\n 3448148188: '0x9dd9bfc2f6c1103a6c01d9c6a4044e4b8a9361f92df2728cdc3729922d56748e',\n}\n\nexport const MINIMUM_LIQUIDITY = JSBI.BigInt(1000)\n\nexport const ZERO = JSBI.BigInt(0)\nexport const ONE = JSBI.BigInt(1)\nexport const FIVE = JSBI.BigInt(5)\nexport const _997 = JSBI.BigInt(997)\nexport const _1000 = JSBI.BigInt(1000)\nexport const BASIS_POINTS = JSBI.BigInt(10000)\n\nexport const ZERO_PERCENT = new Percent(ZERO)\nexport const ONE_HUNDRED_PERCENT = new Percent(ONE)\n","export class InsufficientReservesError extends Error {\n public readonly isInsufficientReservesError = true as const\n\n public constructor() {\n super('Insufficient reserves')\n this.name = this.constructor.name\n }\n}\n\nexport class InsufficientInputAmountError extends Error {\n public readonly isInsufficientInputAmountError = true as const\n\n public constructor() {\n super('Insufficient input amount')\n this.name = this.constructor.name\n }\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { keccak256, pack } from '@ethersproject/solidity'\nimport { CurrencyAmount, Percent, Price, sqrt, Token, type BigintIsh } from '@sun-protocol/sun-sdk-core'\nimport JSBI from 'jsbi'\nimport invariant from 'tiny-invariant'\nimport {\n _1000,\n _997,\n BASIS_POINTS,\n FACTORY_ADDRESS,\n FACTORY_ADDRESS_MAP,\n FIVE,\n INIT_CODE_HASH,\n INIT_CODE_HASH_MAP,\n MINIMUM_LIQUIDITY,\n ONE,\n ONE_HUNDRED_PERCENT,\n ZERO,\n ZERO_PERCENT,\n} from '../constants.js'\nimport { InsufficientInputAmountError, InsufficientReservesError } from '../errors.js'\nimport { tronAddressToEvmHex, tronCreate2Address } from '../utils.js'\n\nexport const computePairAddress = ({\n factoryAddress,\n tokenA,\n tokenB,\n initCodeHashManualOverride,\n}: {\n factoryAddress: string\n tokenA: Token\n tokenB: Token\n initCodeHashManualOverride?: string\n}): string => {\n const [token0, token1] = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]\n const salt = keccak256(['bytes'], [pack(['address', 'address'], [token0.address, token1.address])])\n const tronAddress = tronCreate2Address({\n factoryAddress,\n salt,\n initCodeHash: initCodeHashManualOverride ?? INIT_CODE_HASH_MAP[tokenA.chainId] ?? INIT_CODE_HASH,\n })\n return `0x${tronAddressToEvmHex(tronAddress)}`\n}\n\nexport class Pair {\n public readonly liquidityToken: Token\n private readonly tokenAmounts: [CurrencyAmount<Token>, CurrencyAmount<Token>]\n\n public static getAddress(tokenA: Token, tokenB: Token): string {\n const factoryAddress = FACTORY_ADDRESS_MAP[tokenA.chainId] ?? FACTORY_ADDRESS\n return computePairAddress({ factoryAddress, tokenA, tokenB })\n }\n\n public constructor(currencyAmountA: CurrencyAmount<Token>, tokenAmountB: CurrencyAmount<Token>) {\n const tokenAmounts: [CurrencyAmount<Token>, CurrencyAmount<Token>] = currencyAmountA.currency.sortsBefore(tokenAmountB.currency)\n ? [currencyAmountA, tokenAmountB]\n : [tokenAmountB, currencyAmountA]\n this.liquidityToken = new Token(\n tokenAmounts[0].currency.chainId,\n Pair.getAddress(tokenAmounts[0].currency, tokenAmounts[1].currency),\n 18,\n 'UNI-V2',\n 'Uniswap V2',\n )\n this.tokenAmounts = tokenAmounts\n }\n\n public involvesToken(token: Token): boolean {\n return token.equals(this.token0) || token.equals(this.token1)\n }\n\n public get token0Price(): Price<Token, Token> {\n const result = this.tokenAmounts[1].divide(this.tokenAmounts[0])\n return new Price(this.token0, this.token1, result.denominator, result.numerator)\n }\n\n public get token1Price(): Price<Token, Token> {\n const result = this.tokenAmounts[0].divide(this.tokenAmounts[1])\n return new Price(this.token1, this.token0, result.denominator, result.numerator)\n }\n\n public priceOf(token: Token): Price<Token, Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n return token.equals(this.token0) ? this.token0Price : this.token1Price\n }\n\n public get chainId(): number {\n return this.token0.chainId\n }\n\n public get token0(): Token {\n return this.tokenAmounts[0].currency\n }\n\n public get token1(): Token {\n return this.tokenAmounts[1].currency\n }\n\n public get reserve0(): CurrencyAmount<Token> {\n return this.tokenAmounts[0]\n }\n\n public get reserve1(): CurrencyAmount<Token> {\n return this.tokenAmounts[1]\n }\n\n public reserveOf(token: Token): CurrencyAmount<Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n return token.equals(this.token0) ? this.reserve0 : this.reserve1\n }\n\n public getOutputAmount(inputAmount: CurrencyAmount<Token>, calculateFotFees = true): [CurrencyAmount<Token>, Pair] {\n invariant(this.involvesToken(inputAmount.currency), 'TOKEN')\n if (JSBI.equal(this.reserve0.quotient, ZERO) || JSBI.equal(this.reserve1.quotient, ZERO)) {\n throw new InsufficientReservesError()\n }\n\n const inputReserve = this.reserveOf(inputAmount.currency)\n const outputReserve = this.reserveOf(inputAmount.currency.equals(this.token0) ? this.token1 : this.token0)\n const percentAfterSellFees = calculateFotFees ? this.derivePercentAfterSellFees(inputAmount) : ZERO_PERCENT\n const inputAmountAfterTax = percentAfterSellFees.greaterThan(ZERO_PERCENT)\n ? CurrencyAmount.fromRawAmount(inputAmount.currency, percentAfterSellFees.multiply(inputAmount).quotient)\n : inputAmount\n const inputAmountWithFeeAndAfterTax = JSBI.multiply(inputAmountAfterTax.quotient, _997)\n const numerator = JSBI.multiply(inputAmountWithFeeAndAfterTax, outputReserve.quotient)\n const denominator = JSBI.add(JSBI.multiply(inputReserve.quotient, _1000), inputAmountWithFeeAndAfterTax)\n const outputAmount = CurrencyAmount.fromRawAmount(\n inputAmount.currency.equals(this.token0) ? this.token1 : this.token0,\n JSBI.divide(numerator, denominator),\n )\n if (JSBI.equal(outputAmount.quotient, ZERO)) {\n throw new InsufficientInputAmountError()\n }\n\n const percentAfterBuyFees = calculateFotFees ? this.derivePercentAfterBuyFees(outputAmount) : ZERO_PERCENT\n const outputAmountAfterTax = percentAfterBuyFees.greaterThan(ZERO_PERCENT)\n ? CurrencyAmount.fromRawAmount(outputAmount.currency, outputAmount.multiply(percentAfterBuyFees).quotient)\n : outputAmount\n if (JSBI.equal(outputAmountAfterTax.quotient, ZERO)) {\n throw new InsufficientInputAmountError()\n }\n\n return [outputAmountAfterTax, new Pair(inputReserve.add(inputAmountAfterTax), outputReserve.subtract(outputAmountAfterTax))]\n }\n\n public getInputAmount(outputAmount: CurrencyAmount<Token>, calculateFotFees = true): [CurrencyAmount<Token>, Pair] {\n invariant(this.involvesToken(outputAmount.currency), 'TOKEN')\n const percentAfterBuyFees = calculateFotFees ? this.derivePercentAfterBuyFees(outputAmount) : ZERO_PERCENT\n const outputAmountBeforeTax = percentAfterBuyFees.greaterThan(ZERO_PERCENT)\n ? CurrencyAmount.fromRawAmount(outputAmount.currency, JSBI.add(outputAmount.divide(percentAfterBuyFees).quotient, ONE))\n : outputAmount\n if (\n JSBI.equal(this.reserve0.quotient, ZERO) ||\n JSBI.equal(this.reserve1.quotient, ZERO) ||\n JSBI.greaterThanOrEqual(outputAmount.quotient, this.reserveOf(outputAmount.currency).quotient) ||\n JSBI.greaterThanOrEqual(outputAmountBeforeTax.quotient, this.reserveOf(outputAmount.currency).quotient)\n ) {\n throw new InsufficientReservesError()\n }\n\n const outputReserve = this.reserveOf(outputAmount.currency)\n const inputReserve = this.reserveOf(outputAmount.currency.equals(this.token0) ? this.token1 : this.token0)\n const numerator = JSBI.multiply(JSBI.multiply(inputReserve.quotient, outputAmountBeforeTax.quotient), _1000)\n const denominator = JSBI.multiply(JSBI.subtract(outputReserve.quotient, outputAmountBeforeTax.quotient), _997)\n const inputAmount = CurrencyAmount.fromRawAmount(\n outputAmount.currency.equals(this.token0) ? this.token1 : this.token0,\n JSBI.add(JSBI.divide(numerator, denominator), ONE),\n )\n const percentAfterSellFees = calculateFotFees ? this.derivePercentAfterSellFees(inputAmount) : ZERO_PERCENT\n const inputAmountBeforeTax = percentAfterSellFees.greaterThan(ZERO_PERCENT)\n ? CurrencyAmount.fromRawAmount(inputAmount.currency, JSBI.add(inputAmount.divide(percentAfterSellFees).quotient, ONE))\n : inputAmount\n return [inputAmountBeforeTax, new Pair(inputReserve.add(inputAmount), outputReserve.subtract(outputAmount))]\n }\n\n public getLiquidityMinted(\n totalSupply: CurrencyAmount<Token>,\n tokenAmountA: CurrencyAmount<Token>,\n tokenAmountB: CurrencyAmount<Token>,\n ): CurrencyAmount<Token> {\n invariant(totalSupply.currency.equals(this.liquidityToken), 'LIQUIDITY')\n const tokenAmounts: [CurrencyAmount<Token>, CurrencyAmount<Token>] = tokenAmountA.currency.sortsBefore(tokenAmountB.currency)\n ? [tokenAmountA, tokenAmountB]\n : [tokenAmountB, tokenAmountA]\n invariant(tokenAmounts[0].currency.equals(this.token0) && tokenAmounts[1].currency.equals(this.token1), 'TOKEN')\n\n let liquidity: JSBI\n if (JSBI.equal(totalSupply.quotient, ZERO)) {\n liquidity = JSBI.subtract(sqrt(JSBI.multiply(tokenAmounts[0].quotient, tokenAmounts[1].quotient)), MINIMUM_LIQUIDITY)\n } else {\n const amount0 = JSBI.divide(JSBI.multiply(tokenAmounts[0].quotient, totalSupply.quotient), this.reserve0.quotient)\n const amount1 = JSBI.divide(JSBI.multiply(tokenAmounts[1].quotient, totalSupply.quotient), this.reserve1.quotient)\n liquidity = JSBI.lessThanOrEqual(amount0, amount1) ? amount0 : amount1\n }\n if (!JSBI.greaterThan(liquidity, ZERO)) {\n throw new InsufficientInputAmountError()\n }\n return CurrencyAmount.fromRawAmount(this.liquidityToken, liquidity)\n }\n\n public getLiquidityValue(\n token: Token,\n totalSupply: CurrencyAmount<Token>,\n liquidity: CurrencyAmount<Token>,\n feeOn = false,\n kLast?: BigintIsh,\n ): CurrencyAmount<Token> {\n invariant(this.involvesToken(token), 'TOKEN')\n invariant(totalSupply.currency.equals(this.liquidityToken), 'TOTAL_SUPPLY')\n invariant(liquidity.currency.equals(this.liquidityToken), 'LIQUIDITY')\n invariant(JSBI.lessThanOrEqual(liquidity.quotient, totalSupply.quotient), 'LIQUIDITY')\n\n let totalSupplyAdjusted: CurrencyAmount<Token>\n if (!feeOn) {\n totalSupplyAdjusted = totalSupply\n } else {\n invariant(!!kLast, 'K_LAST')\n const kLastParsed = JSBI.BigInt(kLast)\n if (!JSBI.equal(kLastParsed, ZERO)) {\n const rootK = sqrt(JSBI.multiply(this.reserve0.quotient, this.reserve1.quotient))\n const rootKLast = sqrt(kLastParsed)\n if (JSBI.greaterThan(rootK, rootKLast)) {\n const numerator = JSBI.multiply(totalSupply.quotient, JSBI.subtract(rootK, rootKLast))\n const denominator = JSBI.add(JSBI.multiply(rootK, FIVE), rootKLast)\n const feeLiquidity = JSBI.divide(numerator, denominator)\n totalSupplyAdjusted = totalSupply.add(CurrencyAmount.fromRawAmount(this.liquidityToken, feeLiquidity))\n } else {\n totalSupplyAdjusted = totalSupply\n }\n } else {\n totalSupplyAdjusted = totalSupply\n }\n }\n\n return CurrencyAmount.fromRawAmount(\n token,\n JSBI.divide(JSBI.multiply(liquidity.quotient, this.reserveOf(token).quotient), totalSupplyAdjusted.quotient),\n )\n }\n\n private derivePercentAfterSellFees(inputAmount: CurrencyAmount<Token>): Percent {\n const sellFeeBips = this.token0.wrapped.equals(inputAmount.wrapped.currency)\n ? this.token0.wrapped.sellFeeBps\n : this.token1.wrapped.sellFeeBps\n if (sellFeeBips?.gt(BigNumber.from(0))) {\n return ONE_HUNDRED_PERCENT.subtract(new Percent(JSBI.BigInt(sellFeeBips)).divide(BASIS_POINTS))\n }\n return ZERO_PERCENT\n }\n\n private derivePercentAfterBuyFees(outputAmount: CurrencyAmount<Token>): Percent {\n const buyFeeBps = this.token0.wrapped.equals(outputAmount.wrapped.currency)\n ? this.token0.wrapped.buyFeeBps\n : this.token1.wrapped.buyFeeBps\n if (buyFeeBps?.gt(BigNumber.from(0))) {\n return ONE_HUNDRED_PERCENT.subtract(new Percent(JSBI.BigInt(buyFeeBps)).divide(BASIS_POINTS))\n }\n return ZERO_PERCENT\n }\n}\n","import { Price, type Currency, type Token } from '@sun-protocol/sun-sdk-core'\nimport invariant from 'tiny-invariant'\nimport type { Pair } from './pair.js'\n\nexport class Route<TInput extends Currency, TOutput extends Currency> {\n public readonly pairs: Pair[]\n public readonly path: Token[]\n public readonly input: TInput\n public readonly output: TOutput\n\n private _midPrice: Price<TInput, TOutput> | null = null\n\n public constructor(pairs: Pair[], input: TInput, output?: TOutput) {\n invariant(pairs.length > 0, 'PAIRS')\n const firstPair = pairs[0]!\n const chainId = firstPair.chainId\n invariant(pairs.every((pair) => pair.chainId === chainId), 'CHAIN_IDS')\n\n const wrappedInput = input.wrapped\n invariant(firstPair.involvesToken(wrappedInput), 'INPUT')\n invariant(typeof output === 'undefined' || pairs[pairs.length - 1]!.involvesToken(output.wrapped), 'OUTPUT')\n\n const path: Token[] = [wrappedInput]\n for (const [i, pair] of pairs.entries()) {\n const currentInput = path[i]!\n invariant(currentInput.equals(pair.token0) || currentInput.equals(pair.token1), 'PATH')\n const currentOutput = currentInput.equals(pair.token0) ? pair.token1 : pair.token0\n path.push(currentOutput)\n }\n\n this.pairs = pairs\n this.path = path\n this.input = input\n this.output = output ?? (path[path.length - 1] as TOutput)\n }\n\n public get midPrice(): Price<TInput, TOutput> {\n if (this._midPrice !== null) return this._midPrice\n\n const prices: Price<Currency, Currency>[] = []\n for (const [i, pair] of this.pairs.entries()) {\n prices.push(\n this.path[i]!.equals(pair.token0)\n ? new Price(pair.reserve0.currency, pair.reserve1.currency, pair.reserve0.quotient, pair.reserve1.quotient)\n : new Price(pair.reserve1.currency, pair.reserve0.currency, pair.reserve1.quotient, pair.reserve0.quotient),\n )\n }\n\n const reduced = prices.slice(1).reduce((accumulator, currentValue) => accumulator.multiply(currentValue), prices[0]!)\n return (this._midPrice = new Price(this.input, this.output, reduced.denominator, reduced.numerator))\n }\n\n public get chainId(): number {\n return this.pairs[0]!.chainId\n }\n}\n","import type {\n Percent} from '@sun-protocol/sun-sdk-core';\nimport {\n computePriceImpact,\n CurrencyAmount,\n Fraction,\n Price,\n sortedInsert,\n TradeType,\n type Currency,\n} from '@sun-protocol/sun-sdk-core'\nimport JSBI from 'jsbi'\nimport invariant from 'tiny-invariant'\nimport { ONE, ZERO } from '../constants.js'\nimport type { Pair } from './pair.js'\nimport { Route } from './route.js'\n\ninterface InputOutput<TInput extends Currency, TOutput extends Currency> {\n readonly inputAmount: CurrencyAmount<TInput>\n readonly outputAmount: CurrencyAmount<TOutput>\n}\n\nexport function inputOutputComparator<TInput extends Currency, TOutput extends Currency>(\n a: InputOutput<TInput, TOutput>,\n b: InputOutput<TInput, TOutput>,\n): number {\n invariant(a.inputAmount.currency.equals(b.inputAmount.currency), 'INPUT_CURRENCY')\n invariant(a.outputAmount.currency.equals(b.outputAmount.currency), 'OUTPUT_CURRENCY')\n\n if (a.outputAmount.equalTo(b.outputAmount)) {\n if (a.inputAmount.equalTo(b.inputAmount)) return 0\n return a.inputAmount.lessThan(b.inputAmount) ? -1 : 1\n }\n return a.outputAmount.lessThan(b.outputAmount) ? 1 : -1\n}\n\nexport function tradeComparator<TInput extends Currency, TOutput extends Currency, TTradeType extends TradeType>(\n a: Trade<TInput, TOutput, TTradeType>,\n b: Trade<TInput, TOutput, TTradeType>,\n): number {\n const ioComp = inputOutputComparator(a, b)\n if (ioComp !== 0) return ioComp\n if (a.priceImpact.lessThan(b.priceImpact)) return -1\n if (a.priceImpact.greaterThan(b.priceImpact)) return 1\n return a.route.path.length - b.route.path.length\n}\n\nexport interface BestTradeOptions {\n maxNumResults?: number\n maxHops?: number\n}\n\nexport class Trade<TInput extends Currency, TOutput extends Currency, TTradeType extends TradeType> {\n public readonly route: Route<TInput, TOutput>\n public readonly tradeType: TTradeType\n public readonly inputAmount: CurrencyAmount<TInput>\n public readonly outputAmount: CurrencyAmount<TOutput>\n public readonly executionPrice: Price<TInput, TOutput>\n public readonly priceImpact: Percent\n\n public static exactIn<TInput extends Currency, TOutput extends Currency>(\n route: Route<TInput, TOutput>,\n amountIn: CurrencyAmount<TInput>,\n ): Trade<TInput, TOutput, TradeType.EXACT_INPUT> {\n return new Trade(route, amountIn, TradeType.EXACT_INPUT)\n }\n\n public static exactOut<TInput extends Currency, TOutput extends Currency>(\n route: Route<TInput, TOutput>,\n amountOut: CurrencyAmount<TOutput>,\n ): Trade<TInput, TOutput, TradeType.EXACT_OUTPUT> {\n return new Trade(route, amountOut, TradeType.EXACT_OUTPUT)\n }\n\n public constructor(\n route: Route<TInput, TOutput>,\n amount: TTradeType extends TradeType.EXACT_INPUT ? CurrencyAmount<TInput> : CurrencyAmount<TOutput>,\n tradeType: TTradeType,\n ) {\n this.route = route\n this.tradeType = tradeType\n\n const tokenAmounts = new Array<CurrencyAmount<Currency>>(route.path.length)\n if (tradeType === TradeType.EXACT_INPUT) {\n invariant(amount.currency.equals(route.input), 'INPUT')\n tokenAmounts[0] = amount.wrapped\n for (let i = 0; i < route.path.length - 1; i += 1) {\n const pair = route.pairs[i]!\n const [outputAmount] = pair.getOutputAmount(tokenAmounts[i]!.wrapped)\n tokenAmounts[i + 1] = outputAmount\n }\n this.inputAmount = CurrencyAmount.fromFractionalAmount(route.input, amount.numerator, amount.denominator)\n this.outputAmount = CurrencyAmount.fromFractionalAmount(\n route.output,\n tokenAmounts[tokenAmounts.length - 1]!.numerator,\n tokenAmounts[tokenAmounts.length - 1]!.denominator,\n )\n } else {\n invariant(amount.currency.equals(route.output), 'OUTPUT')\n tokenAmounts[tokenAmounts.length - 1] = amount.wrapped\n for (let i = route.path.length - 1; i > 0; i -= 1) {\n const pair = route.pairs[i - 1]!\n const [inputAmount] = pair.getInputAmount(tokenAmounts[i]!.wrapped)\n tokenAmounts[i - 1] = inputAmount\n }\n this.inputAmount = CurrencyAmount.fromFractionalAmount(route.input, tokenAmounts[0]!.numerator, tokenAmounts[0]!.denominator)\n this.outputAmount = CurrencyAmount.fromFractionalAmount(route.output, amount.numerator, amount.denominator)\n }\n\n this.executionPrice = new Price(this.inputAmount.currency, this.outputAmount.currency, this.inputAmount.quotient, this.outputAmount.quotient)\n this.priceImpact = computePriceImpact(route.midPrice, this.inputAmount, this.outputAmount)\n }\n\n public minimumAmountOut(slippageTolerance: Percent): CurrencyAmount<TOutput> {\n invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE')\n if (this.tradeType === TradeType.EXACT_OUTPUT) return this.outputAmount\n\n const slippageAdjustedAmountOut = new Fraction(ONE).subtract(slippageTolerance).multiply(this.outputAmount.quotient).quotient\n const clampedAmount = JSBI.greaterThan(slippageAdjustedAmountOut, JSBI.BigInt(0)) ? slippageAdjustedAmountOut : JSBI.BigInt(0)\n return CurrencyAmount.fromRawAmount(this.outputAmount.currency, clampedAmount)\n }\n\n public maximumAmountIn(slippageTolerance: Percent): CurrencyAmount<TInput> {\n invariant(!slippageTolerance.lessThan(ZERO), 'SLIPPAGE_TOLERANCE')\n if (this.tradeType === TradeType.EXACT_INPUT) return this.inputAmount\n\n const slippageAdjustedAmountIn = new Fraction(ONE).add(slippageTolerance).multiply(this.inputAmount.quotient).quotient\n return CurrencyAmount.fromRawAmount(this.inputAmount.currency, slippageAdjustedAmountIn)\n }\n\n public static bestTradeExactIn<TInput extends Currency, TOutput extends Currency>(\n pairs: Pair[],\n currencyAmountIn: CurrencyAmount<TInput>,\n currencyOut: TOutput,\n { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {},\n currentPairs: Pair[] = [],\n nextAmountIn: CurrencyAmount<Currency> = currencyAmountIn,\n bestTrades: Trade<TInput, TOutput, TradeType.EXACT_INPUT>[] = [],\n ): Trade<TInput, TOutput, TradeType.EXACT_INPUT>[] {\n invariant(pairs.length > 0, 'PAIRS')\n invariant(maxHops > 0, 'MAX_HOPS')\n invariant(currencyAmountIn === nextAmountIn || currentPairs.length > 0, 'INVALID_RECURSION')\n\n const amountIn = nextAmountIn.wrapped\n const tokenOut = currencyOut.wrapped\n for (let i = 0; i < pairs.length; i += 1) {\n const pair = pairs[i]!\n if (!pair.token0.equals(amountIn.currency) && !pair.token1.equals(amountIn.currency)) continue\n if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue\n\n let amountOut: CurrencyAmount<Currency>\n try {\n ;[amountOut] = pair.getOutputAmount(amountIn)\n } catch (error) {\n if ((error as { readonly isInsufficientInputAmountError?: boolean }).isInsufficientInputAmountError) continue\n throw error\n }\n\n if (amountOut.currency.equals(tokenOut)) {\n sortedInsert(\n bestTrades,\n new Trade(new Route([...currentPairs, pair], currencyAmountIn.currency, currencyOut), currencyAmountIn, TradeType.EXACT_INPUT),\n maxNumResults,\n tradeComparator,\n )\n } else if (maxHops > 1 && pairs.length > 1) {\n const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1))\n Trade.bestTradeExactIn(\n pairsExcludingThisPair,\n currencyAmountIn,\n currencyOut,\n { maxNumResults, maxHops: maxHops - 1 },\n [...currentPairs, pair],\n amountOut,\n bestTrades,\n )\n }\n }\n\n return bestTrades\n }\n\n public worstExecutionPrice(slippageTolerance: Percent): Price<TInput, TOutput> {\n return new Price(\n this.inputAmount.currency,\n this.outputAmount.currency,\n this.maximumAmountIn(slippageTolerance).quotient,\n this.minimumAmountOut(slippageTolerance).quotient,\n )\n }\n\n public static bestTradeExactOut<TInput extends Currency, TOutput extends Currency>(\n pairs: Pair[],\n currencyIn: TInput,\n currencyAmountOut: CurrencyAmount<TOutput>,\n { maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {},\n currentPairs: Pair[] = [],\n nextAmountOut: CurrencyAmount<Currency> = currencyAmountOut,\n bestTrades: Trade<TInput, TOutput, TradeType.EXACT_OUTPUT>[] = [],\n ): Trade<TInput, TOutput, TradeType.EXACT_OUTPUT>[] {\n invariant(pairs.length > 0, 'PAIRS')\n invariant(maxHops > 0, 'MAX_HOPS')\n invariant(currencyAmountOut === nextAmountOut || currentPairs.length > 0, 'INVALID_RECURSION')\n\n const amountOut = nextAmountOut.wrapped\n const tokenIn = currencyIn.wrapped\n for (let i = 0; i < pairs.length; i += 1) {\n const pair = pairs[i]!\n if (!pair.token0.equals(amountOut.currency) && !pair.token1.equals(amountOut.currency)) continue\n if (pair.reserve0.equalTo(ZERO) || pair.reserve1.equalTo(ZERO)) continue\n\n let amountIn: CurrencyAmount<Currency>\n try {\n ;[amountIn] = pair.getInputAmount(amountOut)\n } catch (error) {\n if ((error as { readonly isInsufficientReservesError?: boolean }).isInsufficientReservesError) continue\n throw error\n }\n\n if (amountIn.currency.equals(tokenIn)) {\n sortedInsert(\n bestTrades,\n new Trade(new Route([pair, ...currentPairs], currencyIn, currencyAmountOut.currency), currencyAmountOut, TradeType.EXACT_OUTPUT),\n maxNumResults,\n tradeComparator,\n )\n } else if (maxHops > 1 && pairs.length > 1) {\n const pairsExcludingThisPair = pairs.slice(0, i).concat(pairs.slice(i + 1))\n Trade.bestTradeExactOut(\n pairsExcludingThisPair,\n currencyIn,\n currencyAmountOut,\n { maxNumResults, maxHops: maxHops - 1 },\n [pair, ...currentPairs],\n amountIn,\n bestTrades,\n )\n }\n }\n\n return bestTrades\n }\n}\n","import { getContractAddress } from '@sun-protocol/sun-sdk-chains'\nimport type {\n BigintIsh,\n ContractParameter,\n Network,\n TronAddress,\n} from '@sun-protocol/sun-sdk-core'\n\nexport interface V2ContractReadSpec {\n readonly target: TronAddress\n readonly functionSelector: string\n readonly parameters?: readonly ContractParameter[]\n readonly outputs?: readonly { readonly type: string; readonly name?: string }[]\n readonly metadata?: Record<string, unknown>\n}\n\nexport const V2_PAIR_READ_SELECTORS = {\n getReserves: 'getReserves()',\n totalSupply: 'totalSupply()',\n kLast: 'kLast()',\n balanceOf: 'balanceOf(address)',\n allowance: 'allowance(address,address)',\n} as const\n\nexport const V2_FACTORY_READ_SELECTORS = {\n getPair: 'getPair(address,address)',\n feeTo: 'feeTo()',\n} as const\n\nexport const V2_ROUTER_READ_SELECTORS = {\n getAmountsOut: 'getAmountsOut(uint256,address[])',\n getAmountsIn: 'getAmountsIn(uint256,address[])',\n isAllowedTradingPair: 'isAllowedTradingPair(address,address)',\n} as const\n\nexport interface V2RouterReadOptions {\n readonly network: Network\n readonly router?: TronAddress\n}\n\nexport interface V2FactoryReadOptions {\n readonly network: Network\n readonly factory?: TronAddress\n}\n\nexport interface BuildV2FactoryPairReadParams extends V2FactoryReadOptions {\n readonly tokenA: TronAddress\n readonly tokenB: TronAddress\n}\n\nexport interface BuildV2RouterAmountsOutReadParams extends V2RouterReadOptions {\n readonly amountIn: BigintIsh\n readonly path: readonly TronAddress[]\n}\n\nexport interface BuildV2RouterAmountsInReadParams extends V2RouterReadOptions {\n readonly amountOut: BigintIsh\n readonly path: readonly TronAddress[]\n}\n\nexport interface BuildV2RouterAllowedTradingPairReadParams extends V2RouterReadOptions {\n readonly tokenA: TronAddress\n readonly tokenB: TronAddress\n}\n\nfunction valueOf(value: BigintIsh): string {\n return value.toString()\n}\n\nexport function buildV2PairReservesRead(pair: TronAddress): V2ContractReadSpec {\n return {\n target: pair,\n functionSelector: V2_PAIR_READ_SELECTORS.getReserves,\n metadata: { protocol: 'sunswap-v2', contract: 'pair', action: 'get-reserves' },\n }\n}\n\nexport function buildV2PairTotalSupplyRead(pair: TronAddress): V2ContractReadSpec {\n return {\n target: pair,\n functionSelector: V2_PAIR_READ_SELECTORS.totalSupply,\n metadata: { protocol: 'sunswap-v2', contract: 'pair', action: 'total-supply' },\n }\n}\n\nexport function buildV2PairKLastRead(pair: TronAddress): V2ContractReadSpec {\n return {\n target: pair,\n functionSelector: V2_PAIR_READ_SELECTORS.kLast,\n outputs: [{ type: 'uint256', name: 'kLast' }],\n metadata: { protocol: 'sunswap-v2', contract: 'pair', action: 'k-last' },\n }\n}\n\nexport function buildV2PairBalanceRead(pair: TronAddress, owner: TronAddress): V2ContractReadSpec {\n return {\n target: pair,\n functionSelector: V2_PAIR_READ_SELECTORS.balanceOf,\n parameters: [{ type: 'address', value: owner }],\n metadata: { protocol: 'sunswap-v2', contract: 'pair', action: 'balance-of' },\n }\n}\n\nexport function buildV2PairAllowanceRead(pair: TronAddress, owner: TronAddress, spender: TronAddress): V2ContractReadSpec {\n return {\n target: pair,\n functionSelector: V2_PAIR_READ_SELECTORS.allowance,\n parameters: [\n { type: 'address', value: owner },\n { type: 'address', value: spender },\n ],\n metadata: { protocol: 'sunswap-v2', contract: 'pair', action: 'allowance' },\n }\n}\n\nfunction routerTarget(params: V2RouterReadOptions): TronAddress {\n return params.router ?? getContractAddress(params.network, 'sunswapV2Router')\n}\n\nfunction factoryTarget(params: V2FactoryReadOptions): TronAddress {\n return params.factory ?? getContractAddress(params.network, 'sunswapV2Factory')\n}\n\nexport function buildV2FactoryPairRead(params: BuildV2FactoryPairReadParams): V2ContractReadSpec {\n return {\n target: factoryTarget(params),\n functionSelector: V2_FACTORY_READ_SELECTORS.getPair,\n parameters: [\n { type: 'address', value: params.tokenA },\n { type: 'address', value: params.tokenB },\n ],\n outputs: [{ type: 'address', name: 'pair' }],\n metadata: {\n protocol: 'sunswap-v2',\n contract: 'factory',\n action: 'get-pair',\n network: params.network,\n },\n }\n}\n\nexport function buildV2FactoryFeeToRead(params: V2FactoryReadOptions): V2ContractReadSpec {\n return {\n target: factoryTarget(params),\n functionSelector: V2_FACTORY_READ_SELECTORS.feeTo,\n outputs: [{ type: 'address', name: 'feeTo' }],\n metadata: {\n protocol: 'sunswap-v2',\n contract: 'factory',\n action: 'fee-to',\n network: params.network,\n },\n }\n}\n\nexport function buildV2RouterAmountsOutRead(params: BuildV2RouterAmountsOutReadParams): V2ContractReadSpec {\n return {\n target: routerTarget(params),\n functionSelector: V2_ROUTER_READ_SELECTORS.getAmountsOut,\n parameters: [\n { type: 'uint256', value: valueOf(params.amountIn) },\n { type: 'address[]', value: params.path },\n ],\n metadata: {\n protocol: 'sunswap-v2',\n contract: 'router',\n action: 'get-amounts-out',\n network: params.network,\n },\n }\n}\n\nexport function buildV2RouterAmountsInRead(params: BuildV2RouterAmountsInReadParams): V2ContractReadSpec {\n return {\n target: routerTarget(params),\n functionSelector: V2_ROUTER_READ_SELECTORS.getAmountsIn,\n parameters: [\n { type: 'uint256', value: valueOf(params.amountOut) },\n { type: 'address[]', value: params.path },\n ],\n metadata: {\n protocol: 'sunswap-v2',\n contract: 'router',\n action: 'get-amounts-in',\n network: params.network,\n },\n }\n}\n\nexport function buildV2RouterAllowedTradingPairRead(\n params: BuildV2RouterAllowedTradingPairReadParams,\n): V2ContractReadSpec {\n return {\n target: routerTarget(params),\n functionSelector: V2_ROUTER_READ_SELECTORS.isAllowedTradingPair,\n parameters: [\n { type: 'address', value: params.tokenA },\n { type: 'address', value: params.tokenB },\n ],\n metadata: {\n protocol: 'sunswap-v2',\n contract: 'router',\n action: 'is-allowed-trading-pair',\n network: params.network,\n },\n }\n}\n\nexport function normalizeV2ReserveResult(result: readonly unknown[]): { reserve0: string; reserve1: string } {\n return {\n reserve0: valueOf(result[0] as BigintIsh),\n reserve1: valueOf(result[1] as BigintIsh),\n }\n}\n\nexport function normalizeV2AmountsResult(result: unknown): string[] {\n const values = Array.isArray((result as { readonly amounts?: unknown })?.amounts)\n ? (result as { readonly amounts: readonly unknown[] }).amounts\n : Array.isArray(result)\n ? result\n : []\n return values.map((value) => valueOf(value as BigintIsh))\n}\n","import { TradeType, validateAndParseAddress, type Currency, type Percent } from '@sun-protocol/sun-sdk-core'\nimport invariant from 'tiny-invariant'\nimport type { Trade } from './entities/trade.js'\n\nexport interface TradeOptions {\n readonly allowedSlippage: Percent\n readonly ttl: number\n readonly recipient: string\n readonly feeOnTransfer?: boolean\n}\n\nexport interface TradeOptionsDeadline extends Omit<TradeOptions, 'ttl'> {\n readonly deadline: number\n}\n\nexport interface SwapParameters {\n readonly methodName: string\n readonly args: (string | string[])[]\n readonly value: string\n}\n\nfunction toHex(currencyAmount: { readonly quotient: { toString(radix?: number): string } }): string {\n return `0x${currencyAmount.quotient.toString(16)}`\n}\n\nconst ZERO_HEX = '0x0'\n\nexport abstract class Router {\n private constructor() {}\n\n public static swapCallParameters(trade: Trade<Currency, Currency, TradeType>, options: TradeOptions | TradeOptionsDeadline): SwapParameters {\n const etherIn = trade.inputAmount.currency.isNative\n const etherOut = trade.outputAmount.currency.isNative\n invariant(!(etherIn && etherOut), 'ETHER_IN_OUT')\n invariant(!('ttl' in options) || options.ttl > 0, 'TTL')\n\n const to = validateAndParseAddress(options.recipient)\n const amountIn = toHex(trade.maximumAmountIn(options.allowedSlippage))\n const amountOut = toHex(trade.minimumAmountOut(options.allowedSlippage))\n const path = trade.route.path.map((token) => token.address)\n const deadline = 'ttl' in options\n ? `0x${(Math.floor(new Date().getTime() / 1000) + options.ttl).toString(16)}`\n : `0x${options.deadline.toString(16)}`\n const useFeeOnTransfer = Boolean(options.feeOnTransfer)\n\n let methodName = ''\n let args: (string | string[])[] = []\n let value = ZERO_HEX\n\n switch (trade.tradeType) {\n case TradeType.EXACT_INPUT:\n if (etherIn) {\n methodName = useFeeOnTransfer ? 'swapExactETHForTokensSupportingFeeOnTransferTokens' : 'swapExactETHForTokens'\n args = [amountOut, path, to, deadline]\n value = amountIn\n } else if (etherOut) {\n methodName = useFeeOnTransfer ? 'swapExactTokensForETHSupportingFeeOnTransferTokens' : 'swapExactTokensForETH'\n args = [amountIn, amountOut, path, to, deadline]\n value = ZERO_HEX\n } else {\n methodName = useFeeOnTransfer ? 'swapExactTokensForTokensSupportingFeeOnTransferTokens' : 'swapExactTokensForTokens'\n args = [amountIn, amountOut, path, to, deadline]\n value = ZERO_HEX\n }\n break\n case TradeType.EXACT_OUTPUT:\n invariant(!useFeeOnTransfer, 'EXACT_OUT_FOT')\n if (etherIn) {\n methodName = 'swapETHForExactTokens'\n args = [amountOut, path, to, deadline]\n value = amountIn\n } else if (etherOut) {\n methodName = 'swapTokensForExactETH'\n args = [amountOut, amountIn, path, to, deadline]\n value = ZERO_HEX\n } else {\n methodName = 'swapTokensForExactTokens'\n args = [amountOut, amountIn, path, to, deadline]\n value = ZERO_HEX\n }\n break\n }\n\n return { methodName, args, value }\n }\n}\n"],"mappings":";AAAA,SAAS,sBAAAA,2BAA0B;AACnC;AAAA,EACE;AAAA,EACA;AAAA,OAMK;;;ACTP,SAAS,oBAAoB,+BAA+B;AAC5D,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,SAAS,iBAAiB,oBAAgF;AAG5G,IAAM,oBAAoD;AAAA,EAC/D,SAAS;AAAA,EACT,MAAM;AACR;AAWA,IAAM,kBAAkB;AACxB,IAAM,cAAc;AACpB,IAAM,uBAAuB;AAC7B,IAAM,iCAAiC;AACvC,IAAM,uBAAuB;AAC7B,IAAM,6BAA6B;AACnC,IAAM,qBAAqB;AAC3B,IAAM,kBAAkB;AAExB,SAAS,SAAS,OAA0B;AAC1C,SAAO,OAAO,MAAM,SAAS,CAAC;AAChC;AAEA,SAAS,iBAAiB,OAAe,OAAqB;AAC5D,eAAa,QAAQ,IAAI,gBAAgB,sBAAsB,GAAG,KAAK,qBAAqB;AAAA,IAC1F,CAAC,KAAK,GAAG,MAAM,SAAS;AAAA,EAC1B,CAAC;AACH;AAEO,SAAS,aAAa,QAAe,QAAwC;AAClF,SAAO,OAAO,YAAY,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM;AACxE;AAEA,SAAS,aAAa,OAA2B;AAC/C,MAAI,UAAU;AAEd,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,gBAAgB,QAAQ,IAAI;AAC1C,iBAAa,SAAS,GAAG,gBAAgB,sBAAsB,4BAA4B,EAAE,OAAO,KAAK,CAAC;AAC1G,cAAU,UAAU,MAAM,OAAO,KAAK;AAAA,EACxC;AAEA,QAAM,QAAkB,CAAC;AACzB,SAAO,UAAU,IAAI;AACnB,UAAM,QAAQ,OAAO,UAAU,KAAK,CAAC;AACrC,gBAAY;AAAA,EACd;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,IAAK;AAClB,UAAM,QAAQ,CAAC;AAAA,EACjB;AAEA,SAAO,WAAW,KAAK,KAAK;AAC9B;AAEA,SAAS,aAAa,OAA2B;AAC/C,MAAI,QAAQ;AACZ,aAAW,QAAQ,OAAO;AACxB,aAAS,SAAS,MAAM,OAAO,IAAI;AAAA,EACrC;AAEA,MAAI,UAAU;AACd,SAAO,QAAQ,IAAI;AACjB,UAAM,MAAM,OAAO,QAAQ,GAAG;AAC9B,UAAM,OAAO,gBAAgB,GAAG;AAChC,iBAAa,SAAS,QAAW,gBAAgB,sBAAsB,4BAA4B,EAAE,IAAI,CAAC;AAC1G,cAAU,OAAO;AACjB,aAAS;AAAA,EACX;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,EAAG;AAChB,cAAU,GAAG,WAAW,GAAG,OAAO;AAAA,EACpC;AAEA,SAAO,WAAW;AACpB;AAEA,SAAS,WAAW,OAA2B;AAC7C,SAAO,MAAM,KAAK,KAAK,EACpB,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAChD,KAAK,EAAE;AACZ;AAEA,SAAS,WAAW,KAAa,OAA2B;AAC1D,QAAM,aAAa,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI;AACzD,eAAa,iBAAiB,KAAK,UAAU,KAAK,WAAW,SAAS,MAAM,GAAG,gBAAgB,sBAAsB,GAAG,KAAK,4BAA4B;AAAA,IACvJ;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACD,QAAM,QAAQ,IAAI,WAAW,WAAW,SAAS,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,UAAM,CAAC,IAAI,OAAO,SAAS,WAAW,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;AAAA,EACnE;AACA,SAAO;AACT;AAEA,SAAS,SAAS,SAAiC;AACjD,SAAO,OAAO,OAAO,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC;AAC3C;AAEA,SAAS,oBAAoB,SAAkC;AAC7D,QAAM,QAAQ,IAAI,WAAW,0BAA0B;AACvD,QAAM,IAAI,SAAS,CAAC;AACpB,QAAM,IAAI,SAAS,OAAO,GAAG,kBAAkB;AAC/C,SAAO,aAAa,KAAK;AAC3B;AAEO,SAAS,oBAAoB,SAAiB,QAAQ,WAAmB;AAC9E,MAAI,qBAAqB,KAAK,OAAO,EAAG,QAAO,QAAQ,MAAM,CAAC,EAAE,YAAY;AAC5E,MAAI,+BAA+B,KAAK,OAAO,EAAG,QAAO,QAAQ,YAAY;AAE7E,QAAM,UAAU,aAAa,OAAO;AACpC;AAAA,IACE,QAAQ,WAAW;AAAA,IACnB,gBAAgB;AAAA,IAChB,GAAG,KAAK;AAAA,IACR,EAAE,OAAO,OAAO,QAAQ;AAAA,EAC1B;AACA,QAAM,OAAO,QAAQ,MAAM,GAAG,kBAAkB;AAChD,QAAM,mBAAmB,SAAS,IAAI;AACtC,QAAM,iBAAiB,QAAQ,MAAM,kBAAkB;AACvD;AAAA,IACE,WAAW,gBAAgB,MAAM,WAAW,cAAc;AAAA,IAC1D,gBAAgB;AAAA,IAChB,GAAG,KAAK;AAAA,IACR,EAAE,OAAO,OAAO,QAAQ;AAAA,EAC1B;AACA,eAAa,KAAK,CAAC,MAAM,IAAM,gBAAgB,sBAAsB,GAAG,KAAK,8BAA8B;AAAA,IACzG;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACD,SAAO,WAAW,KAAK,MAAM,CAAC,CAAC;AACjC;AAEO,SAAS,oBAAoB,SAAiB,QAAQ,WAAwB;AACnF,eAAa,qBAAqB,KAAK,OAAO,GAAG,gBAAgB,sBAAsB,GAAG,KAAK,sCAAsC;AAAA,IACnI;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACD,SAAO,oBAAoB,WAAW,GAAG,eAAe,GAAG,QAAQ,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC;AACvF;AAEO,SAAS,mBAAmB,QAInB;AACd,QAAM,UAAU,oBAAoB,OAAO,gBAAgB,SAAS;AACpE,QAAM,OAAO,wBAAwB,OAAO,IAAI;AAChD,QAAM,eAAe,wBAAwB,OAAO,YAAY;AAChE,QAAM,OAAO,UAAU,WAAW,GAAG,eAAe,GAAG,OAAO,GAAG,IAAI,GAAG,YAAY,IAAI,eAAe,CAAC,EAAE,MAAM,CAAC;AACjH,SAAO,oBAAoB,WAAW,GAAG,eAAe,GAAG,KAAK,MAAM,GAAG,CAAC,IAAI,kBAAkB,CAAC;AACnG;AAEA,SAAS,wBAAwB,OAAuB;AACtD,eAAa,qBAAqB,KAAK,KAAK,GAAG,gBAAgB,sBAAsB,uCAAuC;AAAA,IAC1H;AAAA,EACF,CAAC;AACD,SAAO,MAAM,WAAW,IAAI,IAAI,MAAM,MAAM,CAAC,EAAE,YAAY,IAAI,MAAM,YAAY;AACnF;AAEA,SAAS,wBAAwB,SAAiB,eAAuB,OAAuB;AAC9F,QAAM,aAAa,YAAY,uCAAuC,gBAAgB;AACtF,SAAO,oBAAoB,YAAY,KAAK;AAC9C;AAEO,SAAS,qBAAqB,QAAiD;AACpF,QAAM,gBAAgB,OAAO,iBAAiB,wBAAwB,OAAO,OAAO;AACpF,QAAM,SAAS,wBAAwB,OAAO,QAAQ,eAAe,QAAQ;AAC7E,QAAM,SAAS,wBAAwB,OAAO,QAAQ,eAAe,QAAQ;AAC7E,eAAa,WAAW,QAAQ,gBAAgB,sBAAsB,oCAAoC;AAAA,IACxG,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,EACjB,CAAC;AAED,QAAM,CAAC,QAAQ,MAAM,IAAI,SAAS,SAAS,CAAC,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM;AAC7E,QAAM,UAAU,oBAAoB,OAAO,WAAW,mBAAmB,OAAO,SAAS,kBAAkB,GAAG,SAAS;AACvH,QAAM,YAAY,UAAU,WAAW,GAAG,MAAM,GAAG,MAAM,IAAI,YAAY,CAAC,EAAE,MAAM,CAAC;AACnF,QAAM,eAAe,wBAAwB,OAAO,gBAAgB,kBAAkB,OAAO,OAAO,CAAE;AACtG,SAAO,mBAAmB,EAAE,gBAAgB,SAAS,MAAM,WAAW,aAAa,CAAC;AACtF;AAEO,SAAS,gBAAgB,OAAmF;AACjH,QAAM,CAAC,QAAQ,MAAM,IAAI,aAAa,MAAM,QAAQ,MAAM,MAAM;AAChE,SAAO,EAAE,SAAS,MAAM,SAAS,QAAQ,OAAO;AAClD;AAEO,SAAS,uBAAuB,SAAoB,UAAqB,UAA6B;AAC3G,QAAM,SAAS,SAAS,OAAO;AAC/B,QAAM,YAAY,SAAS,QAAQ;AACnC,QAAM,aAAa,SAAS,QAAQ;AACpC,mBAAiB,QAAQ,SAAS;AAClC,mBAAiB,WAAW,UAAU;AACtC,mBAAiB,YAAY,UAAU;AACvC,UAAS,SAAS,aAAc,WAAW,SAAS;AACtD;AAEO,SAAS,mBAAmB,QAAmB,mBAAoC;AACxF;AAAA,IACE,CAAC,kBAAkB,SAAS,CAAC;AAAA,IAC7B,gBAAgB;AAAA,IAChB;AAAA,IACA,EAAE,mBAAmB,kBAAkB,cAAc,EAAE;AAAA,EACzD;AACA;AAAA,IACE,CAAC,kBAAkB,YAAY,CAAC;AAAA,IAChC,gBAAgB;AAAA,IAChB;AAAA,IACA,EAAE,mBAAmB,kBAAkB,cAAc,EAAE;AAAA,EACzD;AACA,SAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,SAAS,OAAO,SAAS,CAAC,EAAE,SAAS,SAAS;AAClG;AAEO,SAAS,0BACd,SACA,mBAC4C;AAC5C,SAAO;AAAA,IACL,YAAY,mBAAmB,QAAQ,SAAS,iBAAiB;AAAA,IACjE,YAAY,mBAAmB,QAAQ,SAAS,iBAAiB;AAAA,EACnE;AACF;AAEO,SAAS,6BACd,SACA,mBAC4C;AAC5C,SAAO,0BAA0B,SAAS,iBAAiB;AAC7D;;;ADpOO,IAAM,sBAAsB;AAAA,EACjC,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,0BAA0B;AAC5B;AAqFA,SAAS,aAAa,QAAsC;AAC1D,SAAO,OAAO,UAAUC,oBAAmB,OAAO,SAAS,iBAAiB;AAC9E;AAEA,SAAS,QAAQ,OAA0B;AACzC,SAAO,MAAM,SAAS;AACxB;AAEA,SAAS,SAAS,QAAyB,QAAwB;AACjE,SAAO,OAAO,MAAM,cAAc,MAAM,IAAI,OAAO,OAAO;AAC5D;AAEO,SAAS,0BAA0B,QAA6D;AACrG,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,eAAe;AAAA,IACpC,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,oBAAoB,OAAO,OAAO,SAAS,QAAQ,EAAE;AAAA,MAC/E,EAAE,MAAM,WAAW,OAAO,oBAAoB,OAAO,OAAO,SAAS,QAAQ,EAAE;AAAA,MAC/E,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,cAAc,EAAE;AAAA,MACzD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,cAAc,EAAE;AAAA,MACzD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,UAAU,EAAE;AAAA,MACrD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,UAAU,EAAE;AAAA,MACrD,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,6BAA6B,QAAgE;AAC3G,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,kBAAkB;AAAA,IACvC,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,oBAAoB,OAAO,OAAO,SAAS,QAAQ,EAAE;AAAA,MAC/E,EAAE,MAAM,WAAW,OAAO,oBAAoB,OAAO,OAAO,SAAS,QAAQ,EAAE;AAAA,MAC/E,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,SAAS,EAAE;AAAA,MACpD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,UAAU,EAAE;AAAA,MACrD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,UAAU,EAAE;AAAA,MACrD,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,6BAA6B,QAAgE;AAC3G,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,mBAAmB;AAAA,IACxC,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,oBAAoB,OAAO,MAAM,SAAS,OAAO,EAAE;AAAA,MAC7E,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,kBAAkB,EAAE;AAAA,MAC7D,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,cAAc,EAAE;AAAA,MACzD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,YAAY,EAAE;AAAA,MACvD,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,WAAW,OAAO,QAAQ,OAAO,gBAAgB,CAAC;AAAA,IAClD,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,gCAAgC,QAAmE;AACjH,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,sBAAsB;AAAA,IAC3C,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,oBAAoB,OAAO,MAAM,SAAS,OAAO,EAAE;AAAA,MAC7E,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,SAAS,EAAE;AAAA,MACpD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,cAAc,EAAE;AAAA,MACzD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,YAAY,EAAE;AAAA,MACvD,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,mCACd,QACoB;AACpB,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,2BAA2B;AAAA,IAChD,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,YAAY,EAAE;AAAA,MACvD,EAAE,MAAM,aAAa,OAAO,OAAO,KAAK;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,WAAW,OAAO,QAAQ,OAAO,QAAQ,CAAC;AAAA,IAC1C,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,mCACd,QACoB;AACpB,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,2BAA2B;AAAA,IAChD,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,SAAS,EAAE;AAAA,MACpD,EAAE,MAAM,aAAa,OAAO,OAAO,KAAK;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,WAAW,OAAO,QAAQ,OAAO,WAAW,CAAC;AAAA,IAC7C,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,mCACd,QACoB;AACpB,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,2BAA2B;AAAA,IAChD,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,MACnD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,YAAY,EAAE;AAAA,MACvD,EAAE,MAAM,aAAa,OAAO,OAAO,KAAK;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,sCACd,QACoB;AACpB,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,8BAA8B;AAAA,IACnD,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,MACnD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,YAAY,EAAE;AAAA,MACvD,EAAE,MAAM,aAAa,OAAO,OAAO,KAAK;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,mCACd,QACoB;AACpB,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,2BAA2B;AAAA,IAChD,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,SAAS,EAAE;AAAA,MACpD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,WAAW,EAAE;AAAA,MACtD,EAAE,MAAM,aAAa,OAAO,OAAO,KAAK;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,sCACd,QACoB;AACpB,SAAO,yBAAyB;AAAA,IAC9B,IAAI,SAAS,QAAQ,8BAA8B;AAAA,IACnD,QAAQ,aAAa,MAAM;AAAA,IAC3B,kBAAkB,oBAAoB;AAAA,IACtC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,SAAS,EAAE;AAAA,MACpD,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,WAAW,EAAE;AAAA,MACtD,EAAE,MAAM,aAAa,OAAO,OAAO,KAAK;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,OAAO,UAAU;AAAA,MAC3C,EAAE,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACrD;AAAA,IACA,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,uBAAuB,QAMhB;AACrB,SAAO,oBAAoB;AAAA,IACzB,IAAI,OAAO,MAAM,yBAAyB,OAAO,IAAI;AAAA,IACrD,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO;AAAA,IAChB,QAAQ,QAAQ,OAAO,MAAM;AAAA,IAC7B,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;;;AE1TA,SAAS,WAAAC,gBAAe;AACxB,OAAO,UAAU;AAEV,IAAM,kBAAkB;AAExB,IAAM,sBAAqD;AAAA,EAChE,WAAW;AAAA,EACX,YAAY;AACd;AAEO,IAAM,iBAAiB;AAEvB,IAAM,qBAAoD;AAAA,EAC/D,WAAW;AAAA,EACX,YAAY;AACd;AAEO,IAAM,oBAAoB,KAAK,OAAO,GAAI;AAE1C,IAAM,OAAO,KAAK,OAAO,CAAC;AAC1B,IAAM,MAAM,KAAK,OAAO,CAAC;AACzB,IAAM,OAAO,KAAK,OAAO,CAAC;AAC1B,IAAM,OAAO,KAAK,OAAO,GAAG;AAC5B,IAAM,QAAQ,KAAK,OAAO,GAAI;AAC9B,IAAM,eAAe,KAAK,OAAO,GAAK;AAEtC,IAAM,eAAe,IAAIA,SAAQ,IAAI;AACrC,IAAM,sBAAsB,IAAIA,SAAQ,GAAG;;;AC3B3C,IAAM,4BAAN,cAAwC,MAAM;AAAA,EACnC,8BAA8B;AAAA,EAEvC,cAAc;AACnB,UAAM,uBAAuB;AAC7B,SAAK,OAAO,KAAK,YAAY;AAAA,EAC/B;AACF;AAEO,IAAM,+BAAN,cAA2C,MAAM;AAAA,EACtC,iCAAiC;AAAA,EAE1C,cAAc;AACnB,UAAM,2BAA2B;AACjC,SAAK,OAAO,KAAK,YAAY;AAAA,EAC/B;AACF;;;AChBA,SAAS,iBAAiB;AAC1B,SAAS,aAAAC,YAAW,YAAY;AAChC,SAAS,gBAAgB,WAAAC,UAAS,OAAO,MAAM,aAA6B;AAC5E,OAAOC,WAAU;AACjB,OAAO,eAAe;AAmBf,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKc;AACZ,QAAM,CAAC,QAAQ,MAAM,IAAI,OAAO,YAAY,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM;AACxF,QAAM,OAAOC,WAAU,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,SAAS,GAAG,CAAC,OAAO,SAAS,OAAO,OAAO,CAAC,CAAC,CAAC;AAClG,QAAM,cAAc,mBAAmB;AAAA,IACrC;AAAA,IACA;AAAA,IACA,cAAc,8BAA8B,mBAAmB,OAAO,OAAO,KAAK;AAAA,EACpF,CAAC;AACD,SAAO,KAAK,oBAAoB,WAAW,CAAC;AAC9C;AAEO,IAAM,OAAN,MAAM,MAAK;AAAA,EACA;AAAA,EACC;AAAA,EAEjB,OAAc,WAAW,QAAe,QAAuB;AAC7D,UAAM,iBAAiB,oBAAoB,OAAO,OAAO,KAAK;AAC9D,WAAO,mBAAmB,EAAE,gBAAgB,QAAQ,OAAO,CAAC;AAAA,EAC9D;AAAA,EAEO,YAAY,iBAAwC,cAAqC;AAC9F,UAAM,eAA+D,gBAAgB,SAAS,YAAY,aAAa,QAAQ,IAC3H,CAAC,iBAAiB,YAAY,IAC9B,CAAC,cAAc,eAAe;AAClC,SAAK,iBAAiB,IAAI;AAAA,MACxB,aAAa,CAAC,EAAE,SAAS;AAAA,MACzB,MAAK,WAAW,aAAa,CAAC,EAAE,UAAU,aAAa,CAAC,EAAE,QAAQ;AAAA,MAClE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,eAAe;AAAA,EACtB;AAAA,EAEO,cAAc,OAAuB;AAC1C,WAAO,MAAM,OAAO,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM;AAAA,EAC9D;AAAA,EAEA,IAAW,cAAmC;AAC5C,UAAM,SAAS,KAAK,aAAa,CAAC,EAAE,OAAO,KAAK,aAAa,CAAC,CAAC;AAC/D,WAAO,IAAI,MAAM,KAAK,QAAQ,KAAK,QAAQ,OAAO,aAAa,OAAO,SAAS;AAAA,EACjF;AAAA,EAEA,IAAW,cAAmC;AAC5C,UAAM,SAAS,KAAK,aAAa,CAAC,EAAE,OAAO,KAAK,aAAa,CAAC,CAAC;AAC/D,WAAO,IAAI,MAAM,KAAK,QAAQ,KAAK,QAAQ,OAAO,aAAa,OAAO,SAAS;AAAA,EACjF;AAAA,EAEO,QAAQ,OAAmC;AAChD,cAAU,KAAK,cAAc,KAAK,GAAG,OAAO;AAC5C,WAAO,MAAM,OAAO,KAAK,MAAM,IAAI,KAAK,cAAc,KAAK;AAAA,EAC7D;AAAA,EAEA,IAAW,UAAkB;AAC3B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAW,SAAgB;AACzB,WAAO,KAAK,aAAa,CAAC,EAAE;AAAA,EAC9B;AAAA,EAEA,IAAW,SAAgB;AACzB,WAAO,KAAK,aAAa,CAAC,EAAE;AAAA,EAC9B;AAAA,EAEA,IAAW,WAAkC;AAC3C,WAAO,KAAK,aAAa,CAAC;AAAA,EAC5B;AAAA,EAEA,IAAW,WAAkC;AAC3C,WAAO,KAAK,aAAa,CAAC;AAAA,EAC5B;AAAA,EAEO,UAAU,OAAqC;AACpD,cAAU,KAAK,cAAc,KAAK,GAAG,OAAO;AAC5C,WAAO,MAAM,OAAO,KAAK,MAAM,IAAI,KAAK,WAAW,KAAK;AAAA,EAC1D;AAAA,EAEO,gBAAgB,aAAoC,mBAAmB,MAAqC;AACjH,cAAU,KAAK,cAAc,YAAY,QAAQ,GAAG,OAAO;AAC3D,QAAIC,MAAK,MAAM,KAAK,SAAS,UAAU,IAAI,KAAKA,MAAK,MAAM,KAAK,SAAS,UAAU,IAAI,GAAG;AACxF,YAAM,IAAI,0BAA0B;AAAA,IACtC;AAEA,UAAM,eAAe,KAAK,UAAU,YAAY,QAAQ;AACxD,UAAM,gBAAgB,KAAK,UAAU,YAAY,SAAS,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK,MAAM;AACzG,UAAM,uBAAuB,mBAAmB,KAAK,2BAA2B,WAAW,IAAI;AAC/F,UAAM,sBAAsB,qBAAqB,YAAY,YAAY,IACrE,eAAe,cAAc,YAAY,UAAU,qBAAqB,SAAS,WAAW,EAAE,QAAQ,IACtG;AACJ,UAAM,gCAAgCA,MAAK,SAAS,oBAAoB,UAAU,IAAI;AACtF,UAAM,YAAYA,MAAK,SAAS,+BAA+B,cAAc,QAAQ;AACrF,UAAM,cAAcA,MAAK,IAAIA,MAAK,SAAS,aAAa,UAAU,KAAK,GAAG,6BAA6B;AACvG,UAAM,eAAe,eAAe;AAAA,MAClC,YAAY,SAAS,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK;AAAA,MAC9DA,MAAK,OAAO,WAAW,WAAW;AAAA,IACpC;AACA,QAAIA,MAAK,MAAM,aAAa,UAAU,IAAI,GAAG;AAC3C,YAAM,IAAI,6BAA6B;AAAA,IACzC;AAEA,UAAM,sBAAsB,mBAAmB,KAAK,0BAA0B,YAAY,IAAI;AAC9F,UAAM,uBAAuB,oBAAoB,YAAY,YAAY,IACrE,eAAe,cAAc,aAAa,UAAU,aAAa,SAAS,mBAAmB,EAAE,QAAQ,IACvG;AACJ,QAAIA,MAAK,MAAM,qBAAqB,UAAU,IAAI,GAAG;AACnD,YAAM,IAAI,6BAA6B;AAAA,IACzC;AAEA,WAAO,CAAC,sBAAsB,IAAI,MAAK,aAAa,IAAI,mBAAmB,GAAG,cAAc,SAAS,oBAAoB,CAAC,CAAC;AAAA,EAC7H;AAAA,EAEO,eAAe,cAAqC,mBAAmB,MAAqC;AACjH,cAAU,KAAK,cAAc,aAAa,QAAQ,GAAG,OAAO;AAC5D,UAAM,sBAAsB,mBAAmB,KAAK,0BAA0B,YAAY,IAAI;AAC9F,UAAM,wBAAwB,oBAAoB,YAAY,YAAY,IACtE,eAAe,cAAc,aAAa,UAAUA,MAAK,IAAI,aAAa,OAAO,mBAAmB,EAAE,UAAU,GAAG,CAAC,IACpH;AACJ,QACEA,MAAK,MAAM,KAAK,SAAS,UAAU,IAAI,KACvCA,MAAK,MAAM,KAAK,SAAS,UAAU,IAAI,KACvCA,MAAK,mBAAmB,aAAa,UAAU,KAAK,UAAU,aAAa,QAAQ,EAAE,QAAQ,KAC7FA,MAAK,mBAAmB,sBAAsB,UAAU,KAAK,UAAU,aAAa,QAAQ,EAAE,QAAQ,GACtG;AACA,YAAM,IAAI,0BAA0B;AAAA,IACtC;AAEA,UAAM,gBAAgB,KAAK,UAAU,aAAa,QAAQ;AAC1D,UAAM,eAAe,KAAK,UAAU,aAAa,SAAS,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK,MAAM;AACzG,UAAM,YAAYA,MAAK,SAASA,MAAK,SAAS,aAAa,UAAU,sBAAsB,QAAQ,GAAG,KAAK;AAC3G,UAAM,cAAcA,MAAK,SAASA,MAAK,SAAS,cAAc,UAAU,sBAAsB,QAAQ,GAAG,IAAI;AAC7G,UAAM,cAAc,eAAe;AAAA,MACjC,aAAa,SAAS,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK;AAAA,MAC/DA,MAAK,IAAIA,MAAK,OAAO,WAAW,WAAW,GAAG,GAAG;AAAA,IACnD;AACA,UAAM,uBAAuB,mBAAmB,KAAK,2BAA2B,WAAW,IAAI;AAC/F,UAAM,uBAAuB,qBAAqB,YAAY,YAAY,IACtE,eAAe,cAAc,YAAY,UAAUA,MAAK,IAAI,YAAY,OAAO,oBAAoB,EAAE,UAAU,GAAG,CAAC,IACnH;AACJ,WAAO,CAAC,sBAAsB,IAAI,MAAK,aAAa,IAAI,WAAW,GAAG,cAAc,SAAS,YAAY,CAAC,CAAC;AAAA,EAC7G;AAAA,EAEO,mBACL,aACA,cACA,cACuB;AACvB,cAAU,YAAY,SAAS,OAAO,KAAK,cAAc,GAAG,WAAW;AACvE,UAAM,eAA+D,aAAa,SAAS,YAAY,aAAa,QAAQ,IACxH,CAAC,cAAc,YAAY,IAC3B,CAAC,cAAc,YAAY;AAC/B,cAAU,aAAa,CAAC,EAAE,SAAS,OAAO,KAAK,MAAM,KAAK,aAAa,CAAC,EAAE,SAAS,OAAO,KAAK,MAAM,GAAG,OAAO;AAE/G,QAAI;AACJ,QAAIA,MAAK,MAAM,YAAY,UAAU,IAAI,GAAG;AAC1C,kBAAYA,MAAK,SAAS,KAAKA,MAAK,SAAS,aAAa,CAAC,EAAE,UAAU,aAAa,CAAC,EAAE,QAAQ,CAAC,GAAG,iBAAiB;AAAA,IACtH,OAAO;AACL,YAAM,UAAUA,MAAK,OAAOA,MAAK,SAAS,aAAa,CAAC,EAAE,UAAU,YAAY,QAAQ,GAAG,KAAK,SAAS,QAAQ;AACjH,YAAM,UAAUA,MAAK,OAAOA,MAAK,SAAS,aAAa,CAAC,EAAE,UAAU,YAAY,QAAQ,GAAG,KAAK,SAAS,QAAQ;AACjH,kBAAYA,MAAK,gBAAgB,SAAS,OAAO,IAAI,UAAU;AAAA,IACjE;AACA,QAAI,CAACA,MAAK,YAAY,WAAW,IAAI,GAAG;AACtC,YAAM,IAAI,6BAA6B;AAAA,IACzC;AACA,WAAO,eAAe,cAAc,KAAK,gBAAgB,SAAS;AAAA,EACpE;AAAA,EAEO,kBACL,OACA,aACA,WACA,QAAQ,OACR,OACuB;AACvB,cAAU,KAAK,cAAc,KAAK,GAAG,OAAO;AAC5C,cAAU,YAAY,SAAS,OAAO,KAAK,cAAc,GAAG,cAAc;AAC1E,cAAU,UAAU,SAAS,OAAO,KAAK,cAAc,GAAG,WAAW;AACrE,cAAUA,MAAK,gBAAgB,UAAU,UAAU,YAAY,QAAQ,GAAG,WAAW;AAErF,QAAI;AACJ,QAAI,CAAC,OAAO;AACV,4BAAsB;AAAA,IACxB,OAAO;AACL,gBAAU,CAAC,CAAC,OAAO,QAAQ;AAC3B,YAAM,cAAcA,MAAK,OAAO,KAAK;AACrC,UAAI,CAACA,MAAK,MAAM,aAAa,IAAI,GAAG;AAClC,cAAM,QAAQ,KAAKA,MAAK,SAAS,KAAK,SAAS,UAAU,KAAK,SAAS,QAAQ,CAAC;AAChF,cAAM,YAAY,KAAK,WAAW;AAClC,YAAIA,MAAK,YAAY,OAAO,SAAS,GAAG;AACtC,gBAAM,YAAYA,MAAK,SAAS,YAAY,UAAUA,MAAK,SAAS,OAAO,SAAS,CAAC;AACrF,gBAAM,cAAcA,MAAK,IAAIA,MAAK,SAAS,OAAO,IAAI,GAAG,SAAS;AAClE,gBAAM,eAAeA,MAAK,OAAO,WAAW,WAAW;AACvD,gCAAsB,YAAY,IAAI,eAAe,cAAc,KAAK,gBAAgB,YAAY,CAAC;AAAA,QACvG,OAAO;AACL,gCAAsB;AAAA,QACxB;AAAA,MACF,OAAO;AACL,8BAAsB;AAAA,MACxB;AAAA,IACF;AAEA,WAAO,eAAe;AAAA,MACpB;AAAA,MACAA,MAAK,OAAOA,MAAK,SAAS,UAAU,UAAU,KAAK,UAAU,KAAK,EAAE,QAAQ,GAAG,oBAAoB,QAAQ;AAAA,IAC7G;AAAA,EACF;AAAA,EAEQ,2BAA2B,aAA6C;AAC9E,UAAM,cAAc,KAAK,OAAO,QAAQ,OAAO,YAAY,QAAQ,QAAQ,IACvE,KAAK,OAAO,QAAQ,aACpB,KAAK,OAAO,QAAQ;AACxB,QAAI,aAAa,GAAG,UAAU,KAAK,CAAC,CAAC,GAAG;AACtC,aAAO,oBAAoB,SAAS,IAAIC,SAAQD,MAAK,OAAO,WAAW,CAAC,EAAE,OAAO,YAAY,CAAC;AAAA,IAChG;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,cAA8C;AAC9E,UAAM,YAAY,KAAK,OAAO,QAAQ,OAAO,aAAa,QAAQ,QAAQ,IACtE,KAAK,OAAO,QAAQ,YACpB,KAAK,OAAO,QAAQ;AACxB,QAAI,WAAW,GAAG,UAAU,KAAK,CAAC,CAAC,GAAG;AACpC,aAAO,oBAAoB,SAAS,IAAIC,SAAQD,MAAK,OAAO,SAAS,CAAC,EAAE,OAAO,YAAY,CAAC;AAAA,IAC9F;AACA,WAAO;AAAA,EACT;AACF;;;ACnQA,SAAS,SAAAE,cAAwC;AACjD,OAAOC,gBAAe;AAGf,IAAM,QAAN,MAA+D;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAA2C;AAAA,EAE5C,YAAY,OAAe,OAAe,QAAkB;AACjE,IAAAA,WAAU,MAAM,SAAS,GAAG,OAAO;AACnC,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,UAAU,UAAU;AAC1B,IAAAA,WAAU,MAAM,MAAM,CAAC,SAAS,KAAK,YAAY,OAAO,GAAG,WAAW;AAEtE,UAAM,eAAe,MAAM;AAC3B,IAAAA,WAAU,UAAU,cAAc,YAAY,GAAG,OAAO;AACxD,IAAAA,WAAU,OAAO,WAAW,eAAe,MAAM,MAAM,SAAS,CAAC,EAAG,cAAc,OAAO,OAAO,GAAG,QAAQ;AAE3G,UAAM,OAAgB,CAAC,YAAY;AACnC,eAAW,CAAC,GAAG,IAAI,KAAK,MAAM,QAAQ,GAAG;AACvC,YAAM,eAAe,KAAK,CAAC;AAC3B,MAAAA,WAAU,aAAa,OAAO,KAAK,MAAM,KAAK,aAAa,OAAO,KAAK,MAAM,GAAG,MAAM;AACtF,YAAM,gBAAgB,aAAa,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK;AAC5E,WAAK,KAAK,aAAa;AAAA,IACzB;AAEA,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,SAAS,UAAW,KAAK,KAAK,SAAS,CAAC;AAAA,EAC/C;AAAA,EAEA,IAAW,WAAmC;AAC5C,QAAI,KAAK,cAAc,KAAM,QAAO,KAAK;AAEzC,UAAM,SAAsC,CAAC;AAC7C,eAAW,CAAC,GAAG,IAAI,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC5C,aAAO;AAAA,QACL,KAAK,KAAK,CAAC,EAAG,OAAO,KAAK,MAAM,IAC5B,IAAID,OAAM,KAAK,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS,QAAQ,IACxG,IAAIA,OAAM,KAAK,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS,QAAQ;AAAA,MAC9G;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,iBAAiB,YAAY,SAAS,YAAY,GAAG,OAAO,CAAC,CAAE;AACpH,WAAQ,KAAK,YAAY,IAAIA,OAAM,KAAK,OAAO,KAAK,QAAQ,QAAQ,aAAa,QAAQ,SAAS;AAAA,EACpG;AAAA,EAEA,IAAW,UAAkB;AAC3B,WAAO,KAAK,MAAM,CAAC,EAAG;AAAA,EACxB;AACF;;;ACrDA;AAAA,EACE;AAAA,EACA,kBAAAE;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,OAAOC,WAAU;AACjB,OAAOC,gBAAe;AAUf,SAAS,sBACd,GACA,GACQ;AACR,EAAAC,WAAU,EAAE,YAAY,SAAS,OAAO,EAAE,YAAY,QAAQ,GAAG,gBAAgB;AACjF,EAAAA,WAAU,EAAE,aAAa,SAAS,OAAO,EAAE,aAAa,QAAQ,GAAG,iBAAiB;AAEpF,MAAI,EAAE,aAAa,QAAQ,EAAE,YAAY,GAAG;AAC1C,QAAI,EAAE,YAAY,QAAQ,EAAE,WAAW,EAAG,QAAO;AACjD,WAAO,EAAE,YAAY,SAAS,EAAE,WAAW,IAAI,KAAK;AAAA,EACtD;AACA,SAAO,EAAE,aAAa,SAAS,EAAE,YAAY,IAAI,IAAI;AACvD;AAEO,SAAS,gBACd,GACA,GACQ;AACR,QAAM,SAAS,sBAAsB,GAAG,CAAC;AACzC,MAAI,WAAW,EAAG,QAAO;AACzB,MAAI,EAAE,YAAY,SAAS,EAAE,WAAW,EAAG,QAAO;AAClD,MAAI,EAAE,YAAY,YAAY,EAAE,WAAW,EAAG,QAAO;AACrD,SAAO,EAAE,MAAM,KAAK,SAAS,EAAE,MAAM,KAAK;AAC5C;AAOO,IAAM,QAAN,MAAM,OAAuF;AAAA,EAClF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,OAAc,QACZ,OACA,UAC+C;AAC/C,WAAO,IAAI,OAAM,OAAO,UAAU,UAAU,WAAW;AAAA,EACzD;AAAA,EAEA,OAAc,SACZ,OACA,WACgD;AAChD,WAAO,IAAI,OAAM,OAAO,WAAW,UAAU,YAAY;AAAA,EAC3D;AAAA,EAEO,YACL,OACA,QACA,WACA;AACA,SAAK,QAAQ;AACb,SAAK,YAAY;AAEjB,UAAM,eAAe,IAAI,MAAgC,MAAM,KAAK,MAAM;AAC1E,QAAI,cAAc,UAAU,aAAa;AACvC,MAAAA,WAAU,OAAO,SAAS,OAAO,MAAM,KAAK,GAAG,OAAO;AACtD,mBAAa,CAAC,IAAI,OAAO;AACzB,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK,SAAS,GAAG,KAAK,GAAG;AACjD,cAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,cAAM,CAAC,YAAY,IAAI,KAAK,gBAAgB,aAAa,CAAC,EAAG,OAAO;AACpE,qBAAa,IAAI,CAAC,IAAI;AAAA,MACxB;AACA,WAAK,cAAcC,gBAAe,qBAAqB,MAAM,OAAO,OAAO,WAAW,OAAO,WAAW;AACxG,WAAK,eAAeA,gBAAe;AAAA,QACjC,MAAM;AAAA,QACN,aAAa,aAAa,SAAS,CAAC,EAAG;AAAA,QACvC,aAAa,aAAa,SAAS,CAAC,EAAG;AAAA,MACzC;AAAA,IACF,OAAO;AACL,MAAAD,WAAU,OAAO,SAAS,OAAO,MAAM,MAAM,GAAG,QAAQ;AACxD,mBAAa,aAAa,SAAS,CAAC,IAAI,OAAO;AAC/C,eAAS,IAAI,MAAM,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG;AACjD,cAAM,OAAO,MAAM,MAAM,IAAI,CAAC;AAC9B,cAAM,CAAC,WAAW,IAAI,KAAK,eAAe,aAAa,CAAC,EAAG,OAAO;AAClE,qBAAa,IAAI,CAAC,IAAI;AAAA,MACxB;AACA,WAAK,cAAcC,gBAAe,qBAAqB,MAAM,OAAO,aAAa,CAAC,EAAG,WAAW,aAAa,CAAC,EAAG,WAAW;AAC5H,WAAK,eAAeA,gBAAe,qBAAqB,MAAM,QAAQ,OAAO,WAAW,OAAO,WAAW;AAAA,IAC5G;AAEA,SAAK,iBAAiB,IAAIC,OAAM,KAAK,YAAY,UAAU,KAAK,aAAa,UAAU,KAAK,YAAY,UAAU,KAAK,aAAa,QAAQ;AAC5I,SAAK,cAAc,mBAAmB,MAAM,UAAU,KAAK,aAAa,KAAK,YAAY;AAAA,EAC3F;AAAA,EAEO,iBAAiB,mBAAqD;AAC3E,IAAAF,WAAU,CAAC,kBAAkB,SAAS,IAAI,GAAG,oBAAoB;AACjE,QAAI,KAAK,cAAc,UAAU,aAAc,QAAO,KAAK;AAE3D,UAAM,4BAA4B,IAAI,SAAS,GAAG,EAAE,SAAS,iBAAiB,EAAE,SAAS,KAAK,aAAa,QAAQ,EAAE;AACrH,UAAM,gBAAgBG,MAAK,YAAY,2BAA2BA,MAAK,OAAO,CAAC,CAAC,IAAI,4BAA4BA,MAAK,OAAO,CAAC;AAC7H,WAAOF,gBAAe,cAAc,KAAK,aAAa,UAAU,aAAa;AAAA,EAC/E;AAAA,EAEO,gBAAgB,mBAAoD;AACzE,IAAAD,WAAU,CAAC,kBAAkB,SAAS,IAAI,GAAG,oBAAoB;AACjE,QAAI,KAAK,cAAc,UAAU,YAAa,QAAO,KAAK;AAE1D,UAAM,2BAA2B,IAAI,SAAS,GAAG,EAAE,IAAI,iBAAiB,EAAE,SAAS,KAAK,YAAY,QAAQ,EAAE;AAC9G,WAAOC,gBAAe,cAAc,KAAK,YAAY,UAAU,wBAAwB;AAAA,EACzF;AAAA,EAEA,OAAc,iBACZ,OACA,kBACA,aACA,EAAE,gBAAgB,GAAG,UAAU,EAAE,IAAsB,CAAC,GACxD,eAAuB,CAAC,GACxB,eAAyC,kBACzC,aAA8D,CAAC,GACd;AACjD,IAAAD,WAAU,MAAM,SAAS,GAAG,OAAO;AACnC,IAAAA,WAAU,UAAU,GAAG,UAAU;AACjC,IAAAA,WAAU,qBAAqB,gBAAgB,aAAa,SAAS,GAAG,mBAAmB;AAE3F,UAAM,WAAW,aAAa;AAC9B,UAAM,WAAW,YAAY;AAC7B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,CAAC,KAAK,OAAO,OAAO,SAAS,QAAQ,KAAK,CAAC,KAAK,OAAO,OAAO,SAAS,QAAQ,EAAG;AACtF,UAAI,KAAK,SAAS,QAAQ,IAAI,KAAK,KAAK,SAAS,QAAQ,IAAI,EAAG;AAEhE,UAAI;AACJ,UAAI;AACF;AAAC,SAAC,SAAS,IAAI,KAAK,gBAAgB,QAAQ;AAAA,MAC9C,SAAS,OAAO;AACd,YAAK,MAAgE,+BAAgC;AACrG,cAAM;AAAA,MACR;AAEA,UAAI,UAAU,SAAS,OAAO,QAAQ,GAAG;AACvC;AAAA,UACE;AAAA,UACA,IAAI,OAAM,IAAI,MAAM,CAAC,GAAG,cAAc,IAAI,GAAG,iBAAiB,UAAU,WAAW,GAAG,kBAAkB,UAAU,WAAW;AAAA,UAC7H;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,UAAU,KAAK,MAAM,SAAS,GAAG;AAC1C,cAAM,yBAAyB,MAAM,MAAM,GAAG,CAAC,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC,CAAC;AAC1E,eAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE,eAAe,SAAS,UAAU,EAAE;AAAA,UACtC,CAAC,GAAG,cAAc,IAAI;AAAA,UACtB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,oBAAoB,mBAAoD;AAC7E,WAAO,IAAIE;AAAA,MACT,KAAK,YAAY;AAAA,MACjB,KAAK,aAAa;AAAA,MAClB,KAAK,gBAAgB,iBAAiB,EAAE;AAAA,MACxC,KAAK,iBAAiB,iBAAiB,EAAE;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,OAAc,kBACZ,OACA,YACA,mBACA,EAAE,gBAAgB,GAAG,UAAU,EAAE,IAAsB,CAAC,GACxD,eAAuB,CAAC,GACxB,gBAA0C,mBAC1C,aAA+D,CAAC,GACd;AAClD,IAAAF,WAAU,MAAM,SAAS,GAAG,OAAO;AACnC,IAAAA,WAAU,UAAU,GAAG,UAAU;AACjC,IAAAA,WAAU,sBAAsB,iBAAiB,aAAa,SAAS,GAAG,mBAAmB;AAE7F,UAAM,YAAY,cAAc;AAChC,UAAM,UAAU,WAAW;AAC3B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,CAAC,KAAK,OAAO,OAAO,UAAU,QAAQ,KAAK,CAAC,KAAK,OAAO,OAAO,UAAU,QAAQ,EAAG;AACxF,UAAI,KAAK,SAAS,QAAQ,IAAI,KAAK,KAAK,SAAS,QAAQ,IAAI,EAAG;AAEhE,UAAI;AACJ,UAAI;AACF;AAAC,SAAC,QAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,MAC7C,SAAS,OAAO;AACd,YAAK,MAA6D,4BAA6B;AAC/F,cAAM;AAAA,MACR;AAEA,UAAI,SAAS,SAAS,OAAO,OAAO,GAAG;AACrC;AAAA,UACE;AAAA,UACA,IAAI,OAAM,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,GAAG,YAAY,kBAAkB,QAAQ,GAAG,mBAAmB,UAAU,YAAY;AAAA,UAC/H;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,UAAU,KAAK,MAAM,SAAS,GAAG;AAC1C,cAAM,yBAAyB,MAAM,MAAM,GAAG,CAAC,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC,CAAC;AAC1E,eAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE,eAAe,SAAS,UAAU,EAAE;AAAA,UACtC,CAAC,MAAM,GAAG,YAAY;AAAA,UACtB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AClPA,SAAS,sBAAAI,2BAA0B;AAgB5B,IAAM,yBAAyB;AAAA,EACpC,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AACb;AAEO,IAAM,4BAA4B;AAAA,EACvC,SAAS;AAAA,EACT,OAAO;AACT;AAEO,IAAM,2BAA2B;AAAA,EACtC,eAAe;AAAA,EACf,cAAc;AAAA,EACd,sBAAsB;AACxB;AAgCA,SAASC,SAAQ,OAA0B;AACzC,SAAO,MAAM,SAAS;AACxB;AAEO,SAAS,wBAAwB,MAAuC;AAC7E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,kBAAkB,uBAAuB;AAAA,IACzC,UAAU,EAAE,UAAU,cAAc,UAAU,QAAQ,QAAQ,eAAe;AAAA,EAC/E;AACF;AAEO,SAAS,2BAA2B,MAAuC;AAChF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,kBAAkB,uBAAuB;AAAA,IACzC,UAAU,EAAE,UAAU,cAAc,UAAU,QAAQ,QAAQ,eAAe;AAAA,EAC/E;AACF;AAEO,SAAS,qBAAqB,MAAuC;AAC1E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,kBAAkB,uBAAuB;AAAA,IACzC,SAAS,CAAC,EAAE,MAAM,WAAW,MAAM,QAAQ,CAAC;AAAA,IAC5C,UAAU,EAAE,UAAU,cAAc,UAAU,QAAQ,QAAQ,SAAS;AAAA,EACzE;AACF;AAEO,SAAS,uBAAuB,MAAmB,OAAwC;AAChG,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,kBAAkB,uBAAuB;AAAA,IACzC,YAAY,CAAC,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IAC9C,UAAU,EAAE,UAAU,cAAc,UAAU,QAAQ,QAAQ,aAAa;AAAA,EAC7E;AACF;AAEO,SAAS,yBAAyB,MAAmB,OAAoB,SAA0C;AACxH,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,kBAAkB,uBAAuB;AAAA,IACzC,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,MAAM;AAAA,MAChC,EAAE,MAAM,WAAW,OAAO,QAAQ;AAAA,IACpC;AAAA,IACA,UAAU,EAAE,UAAU,cAAc,UAAU,QAAQ,QAAQ,YAAY;AAAA,EAC5E;AACF;AAEA,SAASC,cAAa,QAA0C;AAC9D,SAAO,OAAO,UAAUF,oBAAmB,OAAO,SAAS,iBAAiB;AAC9E;AAEA,SAAS,cAAc,QAA2C;AAChE,SAAO,OAAO,WAAWA,oBAAmB,OAAO,SAAS,kBAAkB;AAChF;AAEO,SAAS,uBAAuB,QAA0D;AAC/F,SAAO;AAAA,IACL,QAAQ,cAAc,MAAM;AAAA,IAC5B,kBAAkB,0BAA0B;AAAA,IAC5C,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,OAAO,OAAO;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,OAAO,OAAO;AAAA,IAC1C;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,WAAW,MAAM,OAAO,CAAC;AAAA,IAC3C,UAAU;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,QAAkD;AACxF,SAAO;AAAA,IACL,QAAQ,cAAc,MAAM;AAAA,IAC5B,kBAAkB,0BAA0B;AAAA,IAC5C,SAAS,CAAC,EAAE,MAAM,WAAW,MAAM,QAAQ,CAAC;AAAA,IAC5C,UAAU;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,QAA+D;AACzG,SAAO;AAAA,IACL,QAAQE,cAAa,MAAM;AAAA,IAC3B,kBAAkB,yBAAyB;AAAA,IAC3C,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAOD,SAAQ,OAAO,QAAQ,EAAE;AAAA,MACnD,EAAE,MAAM,aAAa,OAAO,OAAO,KAAK;AAAA,IAC1C;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,2BAA2B,QAA8D;AACvG,SAAO;AAAA,IACL,QAAQC,cAAa,MAAM;AAAA,IAC3B,kBAAkB,yBAAyB;AAAA,IAC3C,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAOD,SAAQ,OAAO,SAAS,EAAE;AAAA,MACpD,EAAE,MAAM,aAAa,OAAO,OAAO,KAAK;AAAA,IAC1C;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,oCACd,QACoB;AACpB,SAAO;AAAA,IACL,QAAQC,cAAa,MAAM;AAAA,IAC3B,kBAAkB,yBAAyB;AAAA,IAC3C,YAAY;AAAA,MACV,EAAE,MAAM,WAAW,OAAO,OAAO,OAAO;AAAA,MACxC,EAAE,MAAM,WAAW,OAAO,OAAO,OAAO;AAAA,IAC1C;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,QAAoE;AAC3G,SAAO;AAAA,IACL,UAAUD,SAAQ,OAAO,CAAC,CAAc;AAAA,IACxC,UAAUA,SAAQ,OAAO,CAAC,CAAc;AAAA,EAC1C;AACF;AAEO,SAAS,yBAAyB,QAA2B;AAClE,QAAM,SAAS,MAAM,QAAS,QAA2C,OAAO,IAC3E,OAAoD,UACrD,MAAM,QAAQ,MAAM,IAClB,SACA,CAAC;AACP,SAAO,OAAO,IAAI,CAAC,UAAUA,SAAQ,KAAkB,CAAC;AAC1D;;;AC9NA,SAAS,aAAAE,YAAW,+BAA4D;AAChF,OAAOC,gBAAe;AAoBtB,SAAS,MAAM,gBAAqF;AAClG,SAAO,KAAK,eAAe,SAAS,SAAS,EAAE,CAAC;AAClD;AAEA,IAAM,WAAW;AAEV,IAAe,SAAf,MAAsB;AAAA,EACnB,cAAc;AAAA,EAAC;AAAA,EAEvB,OAAc,mBAAmB,OAA6C,SAA8D;AAC1I,UAAM,UAAU,MAAM,YAAY,SAAS;AAC3C,UAAM,WAAW,MAAM,aAAa,SAAS;AAC7C,IAAAA,WAAU,EAAE,WAAW,WAAW,cAAc;AAChD,IAAAA,WAAU,EAAE,SAAS,YAAY,QAAQ,MAAM,GAAG,KAAK;AAEvD,UAAM,KAAK,wBAAwB,QAAQ,SAAS;AACpD,UAAM,WAAW,MAAM,MAAM,gBAAgB,QAAQ,eAAe,CAAC;AACrE,UAAM,YAAY,MAAM,MAAM,iBAAiB,QAAQ,eAAe,CAAC;AACvE,UAAM,OAAO,MAAM,MAAM,KAAK,IAAI,CAAC,UAAU,MAAM,OAAO;AAC1D,UAAM,WAAW,SAAS,UACtB,MAAM,KAAK,OAAM,oBAAI,KAAK,GAAE,QAAQ,IAAI,GAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC,KACzE,KAAK,QAAQ,SAAS,SAAS,EAAE,CAAC;AACtC,UAAM,mBAAmB,QAAQ,QAAQ,aAAa;AAEtD,QAAI,aAAa;AACjB,QAAI,OAA8B,CAAC;AACnC,QAAI,QAAQ;AAEZ,YAAQ,MAAM,WAAW;AAAA,MACvB,KAAKD,WAAU;AACb,YAAI,SAAS;AACX,uBAAa,mBAAmB,uDAAuD;AACvF,iBAAO,CAAC,WAAW,MAAM,IAAI,QAAQ;AACrC,kBAAQ;AAAA,QACV,WAAW,UAAU;AACnB,uBAAa,mBAAmB,uDAAuD;AACvF,iBAAO,CAAC,UAAU,WAAW,MAAM,IAAI,QAAQ;AAC/C,kBAAQ;AAAA,QACV,OAAO;AACL,uBAAa,mBAAmB,0DAA0D;AAC1F,iBAAO,CAAC,UAAU,WAAW,MAAM,IAAI,QAAQ;AAC/C,kBAAQ;AAAA,QACV;AACA;AAAA,MACF,KAAKA,WAAU;AACb,QAAAC,WAAU,CAAC,kBAAkB,eAAe;AAC5C,YAAI,SAAS;AACX,uBAAa;AACb,iBAAO,CAAC,WAAW,MAAM,IAAI,QAAQ;AACrC,kBAAQ;AAAA,QACV,WAAW,UAAU;AACnB,uBAAa;AACb,iBAAO,CAAC,WAAW,UAAU,MAAM,IAAI,QAAQ;AAC/C,kBAAQ;AAAA,QACV,OAAO;AACL,uBAAa;AACb,iBAAO,CAAC,WAAW,UAAU,MAAM,IAAI,QAAQ;AAC/C,kBAAQ;AAAA,QACV;AACA;AAAA,IACJ;AAEA,WAAO,EAAE,YAAY,MAAM,MAAM;AAAA,EACnC;AACF;","names":["getContractAddress","getContractAddress","Percent","keccak256","Percent","JSBI","keccak256","JSBI","Percent","Price","invariant","CurrencyAmount","Price","JSBI","invariant","invariant","CurrencyAmount","Price","JSBI","getContractAddress","valueOf","routerTarget","TradeType","invariant"]}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@sun-protocol/sun-sdk-sunswap-v2",
3
+ "version": "0.1.0-beta.0",
4
+ "description": "SunSwap V2 entities, routing math, contract reads, and transaction action builders.",
5
+ "keywords": [
6
+ "sun",
7
+ "tron",
8
+ "sunswap",
9
+ "amm",
10
+ "defi"
11
+ ],
12
+ "homepage": "https://github.com/sun-protocol/sun-sdk#readme",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/sun-protocol/sun-sdk.git",
16
+ "directory": "packages/sunswap-v2"
17
+ },
18
+ "private": false,
19
+ "type": "module",
20
+ "engines": {
21
+ "node": ">=20"
22
+ },
23
+ "main": "./dist/index.cjs",
24
+ "module": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "sideEffects": false,
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js",
34
+ "require": "./dist/index.cjs"
35
+ }
36
+ },
37
+ "dependencies": {
38
+ "@ethersproject/bignumber": "5.7.0",
39
+ "@ethersproject/keccak256": "5.7.0",
40
+ "@ethersproject/solidity": "5.7.0",
41
+ "@noble/hashes": "1.4.0",
42
+ "jsbi": "^3.1.4",
43
+ "tiny-invariant": "^1.1.0",
44
+ "@sun-protocol/sun-sdk-chains": "0.1.0-beta.0",
45
+ "@sun-protocol/sun-sdk-core": "0.1.0-beta.0"
46
+ },
47
+ "scripts": {
48
+ "build": "tsup src/index.ts --format esm,cjs --dts --sourcemap --clean --tsconfig ../../tsconfig.base.json",
49
+ "typecheck": "tsc -p tsconfig.json --noEmit",
50
+ "test": "vitest run"
51
+ }
52
+ }