@skate-org/amm-evm-v2 1.0.0 → 2.0.0-alpha.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/chain-clients.ts","../src/devConfig.ts","../src/errors.ts","../src/math/tickMath.ts","../src/math/fullMath.ts","../src/math/sqrtPriceMath.ts","../src/math/liquidityMath.ts","../src/kernel/reader.ts","../src/kernel/tickBitmap.ts","../src/periphery/reader.ts","../src/periphery/submit.ts","../src/events/kernel.ts","../src/events/periphery.ts","../src/events/watch.ts"],"sourcesContent":["export * from \"./chain-clients\";\nexport * from \"./devConfig\";\n// Public error classes only; wrap* helpers are internal implementation\n// detail shared between readers/submitters and are not re-exported.\nexport { EvmReadError, EvmWriteError } from \"./errors\";\nexport * from \"./math\";\nexport * from \"./kernel\";\nexport * from \"./periphery\";\nexport * from \"./events\";\n","import {\n createPublicClient,\n defineChain,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n} from \"viem\";\nimport { arbitrum } from \"viem/chains\";\nimport {\n BLOCK_EXPLORER,\n CHAIN,\n VM,\n vmTypeFromChain,\n normalizeMode,\n type EnvModeWithConfig,\n} from \"@skate-org/amm-core-v2\";\n\n/**\n * MegaETH chain definition — `@public`.\n *\n * Exported for callers who need to build their own viem `WalletClient` or\n * `PublicClient` against the same chain the SDK uses internally (e.g. wallet\n * integrations that construct a `WalletClient` ahead of calling\n * `submitAction`). Prefer {@link getKernelPublicClient} when you just need a\n * read client.\n *\n * viem ships a `megaeth` chain at id 4326, but with a different default RPC\n * than the one Skate uses for kernel reads. Define locally so we control the\n * RPC URL + block-explorer metadata and don't inherit unrelated op-stack\n * contract addresses.\n */\nexport const megaethChain: Chain = defineChain({\n id: 4326,\n name: \"MegaETH\",\n network: \"megaeth\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: [\"https://mainnet.megaeth.com/rpc\"] },\n public: { http: [\"https://mainnet.megaeth.com/rpc\"] },\n },\n blockExplorers: {\n default: { name: \"Blockscout\", url: BLOCK_EXPLORER.MEGAETH },\n },\n});\n\n/**\n * Default public RPC URLs by chain id.\n *\n * Callers can override per-chain via `DevModeConfig.rpcEndpoints` or by\n * passing an explicit `transport` to the factory functions below.\n */\nconst DEFAULT_RPC: Partial<Record<CHAIN, string>> = {\n [CHAIN.MEGAETH]: \"https://mainnet.megaeth.com/rpc\",\n [CHAIN.ARBITRUM]: \"https://arb1.arbitrum.io/rpc\",\n};\n\n/**\n * Map a supported EVM `CHAIN` to a viem `Chain` definition.\n *\n * Only chains we actively support in Phase 2 are listed; unknown chains\n * return `undefined` and the caller throws.\n */\nfunction chainDefFor(chain: CHAIN): Chain | undefined {\n switch (chain) {\n case CHAIN.MEGAETH:\n return megaethChain;\n case CHAIN.ARBITRUM:\n return arbitrum;\n default:\n return undefined;\n }\n}\n\n/**\n * Resolve the RPC URL for a given chain under the precedence:\n * transport override (caller arg) > mode.config.rpcEndpoints[chain] > DEFAULT_RPC[chain]\n * Returns `undefined` if none is set — callers must have already decided whether\n * to use a caller-supplied transport.\n */\nfunction resolveRpcUrl(\n chain: CHAIN,\n mode: EnvModeWithConfig,\n): string | undefined {\n const { config } = normalizeMode(mode);\n return config?.rpcEndpoints?.[chain] ?? DEFAULT_RPC[chain];\n}\n\n/**\n * Return a fresh `PublicClient` bound to the MegaETH kernel chain.\n *\n * MegaETH is the kernel chain for all environment modes (DEV/STAGING/\n * PRODUCTION) in SDK v2. The `mode` parameter is accepted for API\n * symmetry with the rest of the SDK and as a forward-compatible extension\n * point (e.g. a future testnet kernel).\n *\n * Pure — no singletons, no caching. Pass a custom `transport` to override\n * the default RPC (useful for tests and custom RPC providers).\n */\nexport function getKernelPublicClient(\n mode: EnvModeWithConfig,\n transport?: Transport,\n): PublicClient {\n return createPublicClient({\n chain: megaethChain,\n transport: transport ?? http(resolveRpcUrl(CHAIN.MEGAETH, mode)),\n });\n}\n\n/**\n * Return a fresh `PublicClient` for a source EVM chain (e.g. Arbitrum).\n *\n * Throws a descriptive `Error` when:\n * - `chain` is not an EVM chain (per `vmTypeFromChain`); or\n * - no viem chain definition is registered for `chain`; or\n * - no default RPC URL is configured for `chain` and no `transport` override\n * was provided.\n *\n * Pure — no singletons, no caching.\n */\nexport function getSourcePublicClient(\n chain: CHAIN,\n mode: EnvModeWithConfig,\n transport?: Transport,\n): PublicClient {\n if (vmTypeFromChain(chain) !== VM.EVM) {\n throw new Error(\n `getSourcePublicClient: chain ${chain} is not an EVM chain`,\n );\n }\n const chainDef = chainDefFor(chain);\n if (!chainDef) {\n throw new Error(\n `getSourcePublicClient: no chain definition registered for chain ${chain}`,\n );\n }\n const rpc = resolveRpcUrl(chain, mode);\n if (!rpc && !transport) {\n throw new Error(\n `getSourcePublicClient: no default or override RPC configured for chain ${chain}; pass a transport override or set DevModeConfig.rpcEndpoints[${chain}]`,\n );\n }\n return createPublicClient({\n chain: chainDef,\n transport: transport ?? http(rpc),\n });\n}\n","import type { DevModeConfig } from \"@skate-org/amm-core-v2\";\n\n/** Default DEV api endpoint — matches Phase 1's api client default. */\nexport const DEFAULT_DEV_API_ENDPOINT =\n \"https://dev.api.skatechain.org/amm-action-v2\";\n\n/**\n * Convenience factory for the `{ mode: \"DEV\"; config: DevModeConfig }` tuple.\n *\n * Reduces ceremony at call sites that want to override a single field (e.g.,\n * `rpcEndpoints`) without reconstructing the full object:\n *\n * ```ts\n * const mode = createDevConfig({\n * rpcEndpoints: { [CHAIN.MEGAETH]: \"https://my-private-megaeth/rpc\" },\n * });\n * submitAction(wallet, params, mode);\n * ```\n *\n * Pass nothing to use all defaults.\n */\nexport function createDevConfig(\n overrides: Partial<DevModeConfig> = {},\n): { mode: \"DEV\"; config: DevModeConfig } {\n return {\n mode: \"DEV\",\n config: {\n apiEndpoint: overrides.apiEndpoint ?? DEFAULT_DEV_API_ENDPOINT,\n ...(overrides.rpcEndpoints\n ? { rpcEndpoints: overrides.rpcEndpoints }\n : {}),\n },\n };\n}\n","/**\n * Shared error types for the `@skate-org/amm-evm-v2` package.\n *\n * `EvmReadError` / `EvmWriteError` extend `SdkError` (from core) so callers\n * can `instanceof SdkError` to catch any SDK-origin error without needing\n * to know the specific subclass.\n */\n\nimport { SdkError } from \"@skate-org/amm-core-v2\";\n\n/** SDK-level error thrown when an EVM read reverts or decodes badly. */\nexport class EvmReadError extends SdkError {\n override readonly name: string = \"EvmReadError\";\n readonly functionName: string;\n\n constructor(functionName: string, message: string, options?: ErrorOptions) {\n super(`${functionName}: ${message}`, options);\n this.functionName = functionName;\n }\n}\n\n/**\n * SDK-level error thrown when an EVM write (broadcast) fails.\n *\n * Symmetric with {@link EvmReadError}, but covers the write path: viem's\n * `TransactionExecutionError`, `UserRejectedRequestError`,\n * `ChainMismatchError`, `ChainDisconnectedError`, as well as submitter\n * pre-flight guards (e.g. wrong-chain, missing account).\n */\nexport class EvmWriteError extends SdkError {\n override readonly name: string = \"EvmWriteError\";\n readonly functionName: string;\n\n constructor(functionName: string, message: string, options?: ErrorOptions) {\n super(`${functionName}: ${message}`, options);\n this.functionName = functionName;\n }\n}\n\n/**\n * Wrap any error from an EVM read into `EvmReadError`. Viem always wraps\n * revert-path errors in `ContractFunctionExecutionError` (see\n * `viem/utils/errors/getContractError`), so we check both the outer name and\n * the `.cause` chain for `ContractFunctionRevertedError` /\n * `ContractFunctionZeroDataError`.\n *\n * Shared by `kernel/reader.ts` and `periphery/reader.ts` — depends only on\n * `EvmReadError` and generic Error inspection (no reader-module imports), so\n * it is safe from circular-import concerns.\n */\nexport function wrapReadError(\n err: unknown,\n functionName: string,\n): EvmReadError {\n const outerName = (err as { name?: string } | null)?.name;\n const causeName = (err as { cause?: { name?: string } } | null)?.cause?.name;\n const message =\n (err as { shortMessage?: string } | null)?.shortMessage ??\n (err as { message?: string } | null)?.message ??\n String(err);\n const isViemContractError =\n outerName === \"ContractFunctionExecutionError\" ||\n outerName === \"ContractFunctionRevertedError\" ||\n outerName === \"ContractFunctionZeroDataError\" ||\n causeName === \"ContractFunctionRevertedError\" ||\n causeName === \"ContractFunctionZeroDataError\";\n if (isViemContractError) {\n return new EvmReadError(functionName, `reverted: ${message}`, {\n cause: err as Error,\n });\n }\n return new EvmReadError(functionName, message, { cause: err as Error });\n}\n\n/**\n * Wrap any error from an EVM write-path call (typically\n * `WalletClient.sendTransaction`) into `EvmWriteError`.\n *\n * Any thrown error reaching a submitter is treated as a write failure. If\n * we later want to differentiate known viem write errors\n * (`TransactionExecutionError`, `UserRejectedRequestError`,\n * `ChainMismatchError`, `ChainDisconnectedError`) from unknown errors —\n * e.g. to prefix the message or re-throw unknowns raw — that dispatch goes\n * here. Keeping the single-return shape until a concrete caller need\n * surfaces.\n */\nexport function wrapWriteError(\n err: unknown,\n functionName: string,\n): EvmWriteError {\n const message =\n (err as { shortMessage?: string } | null)?.shortMessage ??\n (err as { message?: string } | null)?.message ??\n String(err);\n return new EvmWriteError(functionName, message, { cause: err as Error });\n}\n","/**\n * Pure-BigInt port of Uniswap v3-core `TickMath.sol`.\n *\n * Canonical source:\n * https://github.com/Uniswap/v3-core/blob/6562c52e8f75f0c10f9deaf44861847585fc8129/contracts/libraries/TickMath.sol\n *\n * Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as\n * fixed point Q64.96 numbers, and the inverse.\n *\n * Solidity uses `uint256` / `uint160` / `int24` with wrap-on-overflow inside\n * `unchecked` blocks. We emulate that by doing arithmetic as BigInt and then\n * ANDing with `MAX_UINT256` / `MAX_UINT128` as needed. All multipliers and\n * hex constants are copied verbatim from the canonical source — do not\n * simplify.\n */\n\nconst MAX_UINT256 = (1n << 256n) - 1n;\nconst Q160_MASK = (1n << 160n) - 1n;\nconst Q256_MOD = 1n << 256n;\n\n/** Minimum tick passable to `getSqrtRatioAtTick`, `log_{1.0001}(2^-128)`. */\nexport const MIN_TICK = -887272;\n\n/** Maximum tick passable to `getSqrtRatioAtTick`, `log_{1.0001}(2^128)`. */\nexport const MAX_TICK = 887272;\n\n/** Minimum value returnable from `getSqrtRatioAtTick`. Equals `getSqrtRatioAtTick(MIN_TICK)`. */\nexport const MIN_SQRT_RATIO = 4295128739n;\n\n/** Maximum value returnable from `getSqrtRatioAtTick`. Equals `getSqrtRatioAtTick(MAX_TICK)`. */\nexport const MAX_SQRT_RATIO =\n 1461446703485210103287273052203988822378723970342n;\n\n/**\n * Calculates `sqrt(1.0001^tick) * 2^96` as a Q64.96 `uint160`.\n *\n * @throws if `|tick| > MAX_TICK`.\n */\nexport function getSqrtRatioAtTick(tick: number): bigint {\n if (!Number.isInteger(tick)) {\n throw new Error(\"TickMath: tick must be an integer\");\n }\n const absTick = BigInt(tick < 0 ? -tick : tick);\n if (absTick > BigInt(MAX_TICK)) {\n throw new Error(\"T\"); // mirror Solidity `revert T()`\n }\n\n // Seed: odd bit → first constant; even → 2^128.\n let ratio =\n (absTick & 0x1n) !== 0n\n ? 0xfffcb933bd6fad37aa2d162d1a594001n\n : 0x100000000000000000000000000000000n;\n\n // Each `if` below: if the corresponding bit of absTick is set, multiply\n // ratio by the next magic constant and shift-right by 128. Emulate\n // Solidity's uint256 wrap with a mask after multiplication.\n if ((absTick & 0x2n) !== 0n)\n ratio = ((ratio * 0xfff97272373d413259a46990580e213an) & MAX_UINT256) >> 128n;\n if ((absTick & 0x4n) !== 0n)\n ratio = ((ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) & MAX_UINT256) >> 128n;\n if ((absTick & 0x8n) !== 0n)\n ratio = ((ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x10n) !== 0n)\n ratio = ((ratio * 0xffcb9843d60f6159c9db58835c926644n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x20n) !== 0n)\n ratio = ((ratio * 0xff973b41fa98c081472e6896dfb254c0n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x40n) !== 0n)\n ratio = ((ratio * 0xff2ea16466c96a3843ec78b326b52861n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x80n) !== 0n)\n ratio = ((ratio * 0xfe5dee046a99a2a811c461f1969c3053n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x100n) !== 0n)\n ratio = ((ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x200n) !== 0n)\n ratio = ((ratio * 0xf987a7253ac413176f2b074cf7815e54n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x400n) !== 0n)\n ratio = ((ratio * 0xf3392b0822b70005940c7a398e4b70f3n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x800n) !== 0n)\n ratio = ((ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x1000n) !== 0n)\n ratio = ((ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x2000n) !== 0n)\n ratio = ((ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x4000n) !== 0n)\n ratio = ((ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x8000n) !== 0n)\n ratio = ((ratio * 0x31be135f97d08fd981231505542fcfa6n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x10000n) !== 0n)\n ratio = ((ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x20000n) !== 0n)\n ratio = ((ratio * 0x5d6af8dedb81196699c329225ee604n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x40000n) !== 0n)\n ratio = ((ratio * 0x2216e584f5fa1ea926041bedfe98n) & MAX_UINT256) >> 128n;\n if ((absTick & 0x80000n) !== 0n)\n ratio = ((ratio * 0x48a170391f7dc42444e8fa2n) & MAX_UINT256) >> 128n;\n\n if (tick > 0) ratio = MAX_UINT256 / ratio;\n\n // Divides by 1<<32 rounding up to go from Q128.128 to Q128.96. Downcast to\n // uint160 is safe by construction of the tick-range constraint.\n const shifted = ratio >> 32n;\n const remainder = ratio & ((1n << 32n) - 1n);\n const sqrtPriceX96 = remainder === 0n ? shifted : shifted + 1n;\n return sqrtPriceX96 & Q160_MASK;\n}\n\n/**\n * Calculates the greatest tick value such that `getSqrtRatioAtTick(tick) <= sqrtPriceX96`.\n *\n * @throws if `sqrtPriceX96 < MIN_SQRT_RATIO` or `sqrtPriceX96 >= MAX_SQRT_RATIO`.\n */\nexport function getTickAtSqrtRatio(sqrtPriceX96: bigint): number {\n if (sqrtPriceX96 < MIN_SQRT_RATIO || sqrtPriceX96 >= MAX_SQRT_RATIO) {\n throw new Error(\"R\"); // mirror Solidity `revert R()`\n }\n\n const ratio = sqrtPriceX96 << 32n;\n\n // Compute msb of `ratio` via descending binary search, matching the\n // hand-rolled assembly in the canonical source.\n let r = ratio;\n let msb = 0n;\n\n // Each block: if r > threshold, add bit to msb and right-shift r by that amount.\n {\n const f = r > 0xffffffffffffffffffffffffffffffffn ? 128n : 0n;\n msb |= f;\n r >>= f;\n }\n {\n const f = r > 0xffffffffffffffffn ? 64n : 0n;\n msb |= f;\n r >>= f;\n }\n {\n const f = r > 0xffffffffn ? 32n : 0n;\n msb |= f;\n r >>= f;\n }\n {\n const f = r > 0xffffn ? 16n : 0n;\n msb |= f;\n r >>= f;\n }\n {\n const f = r > 0xffn ? 8n : 0n;\n msb |= f;\n r >>= f;\n }\n {\n const f = r > 0xfn ? 4n : 0n;\n msb |= f;\n r >>= f;\n }\n {\n const f = r > 0x3n ? 2n : 0n;\n msb |= f;\n r >>= f;\n }\n {\n const f = r > 0x1n ? 1n : 0n;\n msb |= f;\n // no shift in canonical source's final block\n }\n\n if (msb >= 128n) r = ratio >> (msb - 127n);\n else r = (ratio << (127n - msb)) & MAX_UINT256;\n\n // Signed 256-bit log_2 in Q128.128. BigInt left-shift on a negative value\n // preserves the signed bit-pattern; ANDing with MAX_UINT256 truncates to\n // 256 bits, yielding the exact two's-complement representation Solidity's\n // int256 bit ops expect (verified equal to the explicit modular form for\n // msb in [0, 255]).\n const offset = msb - 128n;\n let log_2 = (offset << 64n) & MAX_UINT256;\n\n // 14 iterations of the log_2 refinement loop.\n for (let i = 0; i < 14; i++) {\n r = (r * r) >> 127n;\n const f = r >> 128n;\n log_2 |= f << BigInt(63 - i);\n r >>= f;\n }\n\n // Multiply by a constant. In Solidity: `log_2 * 255738958999603826347141`.\n // log_2 is int256; we emulate signed-256-mul by interpreting log_2 as signed.\n const log_2_signed = toInt256(log_2);\n const log_sqrt10001 = log_2_signed * 255738958999603826347141n;\n\n const tickLowBig =\n (log_sqrt10001 - 3402992956809132418596140100660247210n) >> 128n;\n const tickHiBig =\n (log_sqrt10001 + 291339464771989622907027621153398088495n) >> 128n;\n\n const tickLow = toInt24(tickLowBig);\n const tickHi = toInt24(tickHiBig);\n\n if (tickLow === tickHi) return tickLow;\n return getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;\n}\n\n/** Reinterpret a 256-bit unsigned BigInt as a two's-complement signed int256. */\nfunction toInt256(x: bigint): bigint {\n const masked = x & MAX_UINT256;\n return masked >= 1n << 255n ? masked - Q256_MOD : masked;\n}\n\n/**\n * Truncate a (possibly signed) BigInt to int24 range, matching Solidity's\n * downcast (which just takes the low 24 bits and reinterprets as signed).\n */\nfunction toInt24(x: bigint): number {\n const mask = (1n << 24n) - 1n;\n const truncated = x & mask;\n const signed =\n truncated >= 1n << 23n ? truncated - (1n << 24n) : truncated;\n return Number(signed);\n}\n\n","/**\n * Pure-BigInt port of Uniswap v3-core `FullMath.sol`.\n *\n * Canonical source:\n * https://github.com/Uniswap/v3-core/blob/6562c52e8f75f0c10f9deaf44861847585fc8129/contracts/libraries/FullMath.sol\n *\n * Solidity's FullMath.sol computes `floor(a*b/denom)` and `ceil(a*b/denom)`\n * for 256-bit unsigned values with full 512-bit intermediate precision, and\n * reverts if the 256-bit result overflows or if `denom == 0`.\n *\n * In JS BigInt we have arbitrary precision, so the implementation is far\n * simpler: compute the full product, divide, and explicitly check that the\n * final result fits in 256 bits.\n */\n\nconst MAX_UINT256 = (1n << 256n) - 1n;\n\n/**\n * Returns `floor(a * b / denom)` under Solidity uint256 semantics.\n *\n * Throws if `denom == 0` or if the quotient would not fit in 256 bits.\n */\nexport function mulDiv(a: bigint, b: bigint, denom: bigint): bigint {\n if (denom === 0n) {\n throw new Error(\"FullMath: division by zero\");\n }\n // In Solidity the inputs and result are uint256; negatives are not valid here.\n if (a < 0n || b < 0n || denom < 0n) {\n throw new Error(\"FullMath: negative input\");\n }\n const product = a * b;\n const result = product / denom;\n if (result > MAX_UINT256) {\n throw new Error(\"FullMath: result overflows uint256\");\n }\n return result;\n}\n\n/**\n * Returns `ceil(a * b / denom)` under Solidity uint256 semantics.\n *\n * Throws if `denom == 0`, if the intermediate `mulDiv` would overflow, or if\n * rounding up pushes the result past `uint256` range.\n */\nexport function mulDivRoundingUp(\n a: bigint,\n b: bigint,\n denom: bigint,\n): bigint {\n if (denom === 0n) {\n throw new Error(\"FullMath: division by zero\");\n }\n if (a < 0n || b < 0n || denom < 0n) {\n throw new Error(\"FullMath: negative input\");\n }\n const product = a * b;\n const quotient = product / denom;\n if (quotient > MAX_UINT256) {\n throw new Error(\"FullMath: result overflows uint256\");\n }\n if (product % denom !== 0n) {\n if (quotient === MAX_UINT256) {\n throw new Error(\"FullMath: rounding up overflows uint256\");\n }\n return quotient + 1n;\n }\n return quotient;\n}\n","/**\n * Pure-BigInt port of Uniswap v3-core `SqrtPriceMath.sol`.\n *\n * Canonical source:\n * https://github.com/Uniswap/v3-core/blob/6562c52e8f75f0c10f9deaf44861847585fc8129/contracts/libraries/SqrtPriceMath.sol\n *\n * Functions based on Q64.96 sqrt price and liquidity. Contains the math\n * that uses square root of price as a Q64.96 and liquidity to compute\n * deltas. Rounding modes match the canonical source exactly — change only\n * if the canonical Solidity changes.\n */\n\nimport { mulDiv, mulDivRoundingUp } from \"./fullMath\";\n\nconst MAX_UINT128 = (1n << 128n) - 1n;\nconst MAX_UINT160 = (1n << 160n) - 1n;\nconst MAX_UINT256 = (1n << 256n) - 1n;\nconst Q96_RESOLUTION = 96n;\nconst Q96 = 1n << 96n;\n\nfunction assertUint160(x: bigint, name: string): void {\n if (x < 0n || x > MAX_UINT160) {\n throw new Error(`SqrtPriceMath: ${name} out of uint160 range`);\n }\n}\n\nfunction assertUint128(x: bigint, name: string): void {\n if (x < 0n || x > MAX_UINT128) {\n throw new Error(`SqrtPriceMath: ${name} out of uint128 range`);\n }\n}\n\nfunction assertUint256(x: bigint, name: string): void {\n if (x < 0n || x > MAX_UINT256) {\n throw new Error(`SqrtPriceMath: ${name} out of uint256 range`);\n }\n}\n\n/** Solidity's `UnsafeMath.divRoundingUp(x, y)` = `(x + y - 1) / y` with unchecked math. */\nfunction divRoundingUp(x: bigint, y: bigint): bigint {\n if (y === 0n) throw new Error(\"SqrtPriceMath: div by zero\");\n return x / y + (x % y === 0n ? 0n : 1n);\n}\n\n/** Cast a uint256 value to uint160, revert on overflow. Mirrors SafeCast.toUint160. */\nfunction toUint160(x: bigint): bigint {\n if (x > MAX_UINT160) throw new Error(\"SqrtPriceMath: toUint160 overflow\");\n return x;\n}\n\n/**\n * Gets the next sqrt price given a delta of token0.\n *\n * Always rounds up. See canonical source for the two-branch formula and\n * overflow-fallback rationale.\n */\nexport function getNextSqrtPriceFromAmount0RoundingUp(\n sqrtPX96: bigint,\n liquidity: bigint,\n amount: bigint,\n add: boolean,\n): bigint {\n assertUint160(sqrtPX96, \"sqrtPX96\");\n assertUint128(liquidity, \"liquidity\");\n assertUint256(amount, \"amount\");\n\n if (amount === 0n) return sqrtPX96;\n const numerator1 = liquidity << Q96_RESOLUTION;\n\n if (add) {\n // First branch: full-precision formula if `amount * sqrtPX96` fits in\n // uint256. Solidity detects overflow by checking `product/amount == sqrtPX96`.\n const product = (amount * sqrtPX96) & MAX_UINT256;\n const noOverflow = amount === 0n || product / amount === sqrtPX96;\n if (noOverflow) {\n const denominator = numerator1 + product;\n if (denominator >= numerator1) {\n // always fits in 160 bits\n return toUint160(mulDivRoundingUp(numerator1, sqrtPX96, denominator));\n }\n }\n // Fallback: `liquidity / ((liquidity / sqrtPX96) + amount)`, rounded up.\n // Solidity uses UnsafeMath.divRoundingUp here; wrap-semantics on the\n // denominator are acceptable because overflow = revert in our port\n // (BigInt never wraps), so we simply let the division proceed.\n if (sqrtPX96 === 0n) throw new Error(\"SqrtPriceMath: sqrtPX96 == 0\");\n const denom = numerator1 / sqrtPX96 + amount;\n return toUint160(divRoundingUp(numerator1, denom));\n } else {\n // Remove token0: must not under/overflow denominator.\n const product = (amount * sqrtPX96) & MAX_UINT256;\n const noOverflow = amount === 0n || product / amount === sqrtPX96;\n if (!noOverflow || numerator1 <= product) {\n throw new Error(\"SqrtPriceMath: getNextSqrtPriceFromAmount0 denom <= 0\");\n }\n const denominator = numerator1 - product;\n return toUint160(mulDivRoundingUp(numerator1, sqrtPX96, denominator));\n }\n}\n\n/**\n * Gets the next sqrt price given a delta of token1.\n *\n * Always rounds down. See canonical source for the branch selection based\n * on `amount <= type(uint160).max`.\n */\nexport function getNextSqrtPriceFromAmount1RoundingDown(\n sqrtPX96: bigint,\n liquidity: bigint,\n amount: bigint,\n add: boolean,\n): bigint {\n assertUint160(sqrtPX96, \"sqrtPX96\");\n assertUint128(liquidity, \"liquidity\");\n assertUint256(amount, \"amount\");\n\n if (add) {\n const quotient =\n amount <= MAX_UINT160\n ? (amount << Q96_RESOLUTION) / liquidity\n : mulDiv(amount, Q96, liquidity);\n return toUint160(sqrtPX96 + quotient);\n } else {\n const quotient =\n amount <= MAX_UINT160\n ? divRoundingUp(amount << Q96_RESOLUTION, liquidity)\n : mulDivRoundingUp(amount, Q96, liquidity);\n if (sqrtPX96 <= quotient) {\n throw new Error(\"SqrtPriceMath: sqrtPX96 <= quotient\");\n }\n // always fits 160 bits\n return sqrtPX96 - quotient;\n }\n}\n\n/**\n * Gets the next sqrt price given an input amount of token0 or token1.\n *\n * @throws if `sqrtPX96 <= 0`, `liquidity <= 0`, or the next price is out of bounds.\n */\nexport function getNextSqrtPriceFromInput(\n sqrtPX96: bigint,\n liquidity: bigint,\n amountIn: bigint,\n zeroForOne: boolean,\n): bigint {\n if (sqrtPX96 <= 0n) throw new Error(\"SqrtPriceMath: sqrtPX96 must be > 0\");\n if (liquidity <= 0n)\n throw new Error(\"SqrtPriceMath: liquidity must be > 0\");\n\n return zeroForOne\n ? getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountIn, true)\n : getNextSqrtPriceFromAmount1RoundingDown(\n sqrtPX96,\n liquidity,\n amountIn,\n true,\n );\n}\n\n/**\n * Gets the next sqrt price given an output amount of token0 or token1.\n *\n * @throws if `sqrtPX96 <= 0`, `liquidity <= 0`, or the next price is out of bounds.\n */\nexport function getNextSqrtPriceFromOutput(\n sqrtPX96: bigint,\n liquidity: bigint,\n amountOut: bigint,\n zeroForOne: boolean,\n): bigint {\n if (sqrtPX96 <= 0n) throw new Error(\"SqrtPriceMath: sqrtPX96 must be > 0\");\n if (liquidity <= 0n)\n throw new Error(\"SqrtPriceMath: liquidity must be > 0\");\n\n return zeroForOne\n ? getNextSqrtPriceFromAmount1RoundingDown(\n sqrtPX96,\n liquidity,\n amountOut,\n false,\n )\n : getNextSqrtPriceFromAmount0RoundingUp(\n sqrtPX96,\n liquidity,\n amountOut,\n false,\n );\n}\n\n/**\n * Amount0 delta between two sqrt prices for a given liquidity.\n *\n * `liquidity * (sqrt(upper) - sqrt(lower)) / (sqrt(upper) * sqrt(lower))`.\n */\nexport function getAmount0Delta(\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n liquidity: bigint,\n roundUp: boolean,\n): bigint {\n assertUint160(sqrtRatioAX96, \"sqrtRatioAX96\");\n assertUint160(sqrtRatioBX96, \"sqrtRatioBX96\");\n assertUint128(liquidity, \"liquidity\");\n\n let a = sqrtRatioAX96;\n let b = sqrtRatioBX96;\n if (a > b) {\n [a, b] = [b, a];\n }\n\n if (a === 0n) throw new Error(\"SqrtPriceMath: sqrtRatio must be > 0\");\n\n const numerator1 = liquidity << Q96_RESOLUTION;\n const numerator2 = b - a;\n\n if (roundUp) {\n return divRoundingUp(mulDivRoundingUp(numerator1, numerator2, b), a);\n }\n return mulDiv(numerator1, numerator2, b) / a;\n}\n\n/**\n * Amount1 delta between two sqrt prices for a given liquidity.\n *\n * `liquidity * (sqrt(upper) - sqrt(lower))`.\n */\nexport function getAmount1Delta(\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n liquidity: bigint,\n roundUp: boolean,\n): bigint {\n assertUint160(sqrtRatioAX96, \"sqrtRatioAX96\");\n assertUint160(sqrtRatioBX96, \"sqrtRatioBX96\");\n assertUint128(liquidity, \"liquidity\");\n\n let a = sqrtRatioAX96;\n let b = sqrtRatioBX96;\n if (a > b) {\n [a, b] = [b, a];\n }\n\n return roundUp\n ? mulDivRoundingUp(liquidity, b - a, Q96)\n : mulDiv(liquidity, b - a, Q96);\n}\n\n/**\n * Signed amount0 delta: positive liquidity -> rounds up, negative -> rounds\n * down and negates. Matches the `int128 liquidity` overload of the\n * canonical library.\n */\nexport function getAmount0DeltaSigned(\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n liquidity: bigint,\n): bigint {\n // int128 range: [-2^127, 2^127 - 1]\n const INT128_MIN = -(1n << 127n);\n const INT128_MAX = (1n << 127n) - 1n;\n if (liquidity < INT128_MIN || liquidity > INT128_MAX) {\n throw new Error(\"SqrtPriceMath: liquidity out of int128 range\");\n }\n if (liquidity < 0n) {\n return -getAmount0Delta(sqrtRatioAX96, sqrtRatioBX96, -liquidity, false);\n }\n return getAmount0Delta(sqrtRatioAX96, sqrtRatioBX96, liquidity, true);\n}\n\n/**\n * Signed amount1 delta: positive liquidity -> rounds up, negative -> rounds\n * down and negates. Matches the `int128 liquidity` overload of the\n * canonical library.\n */\nexport function getAmount1DeltaSigned(\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n liquidity: bigint,\n): bigint {\n const INT128_MIN = -(1n << 127n);\n const INT128_MAX = (1n << 127n) - 1n;\n if (liquidity < INT128_MIN || liquidity > INT128_MAX) {\n throw new Error(\"SqrtPriceMath: liquidity out of int128 range\");\n }\n if (liquidity < 0n) {\n return -getAmount1Delta(sqrtRatioAX96, sqrtRatioBX96, -liquidity, false);\n }\n return getAmount1Delta(sqrtRatioAX96, sqrtRatioBX96, liquidity, true);\n}\n","/**\n * Pure-BigInt port of Uniswap v3-core `LiquidityMath.sol`.\n *\n * Canonical source:\n * https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/LiquidityMath.sol\n *\n * Exposes `addDelta(x, y)` with Solidity's revert semantics: subtracting\n * past zero reverts with `LS`, adding past `uint128.max` reverts with `LA`.\n */\n\nconst MAX_UINT128 = (1n << 128n) - 1n;\nconst INT128_MAX = (1n << 127n) - 1n;\nconst INT128_MIN = -(1n << 127n);\n\n/**\n * Add a signed `int128` liquidity delta to a `uint128` liquidity value,\n * reverting on overflow / underflow.\n *\n * @throws `LA` if `x + y > uint128.max`\n * @throws `LS` if `x + y < 0`\n */\nexport function addDelta(x: bigint, y: bigint): bigint {\n if (x < 0n || x > MAX_UINT128) {\n throw new Error(\"LiquidityMath: x out of uint128 range\");\n }\n if (y < INT128_MIN || y > INT128_MAX) {\n throw new Error(\"LiquidityMath: y out of int128 range\");\n }\n\n const z = x + y;\n // Solidity semantics: after the signed add, z MUST remain in uint128 range.\n // Underflow (z < 0) => 'LS', overflow (z > uint128.max) => 'LA'.\n if (y < 0n) {\n if (z < 0n) throw new Error(\"LS\");\n } else {\n if (z > MAX_UINT128) throw new Error(\"LA\");\n }\n return z;\n}\n","import type { PublicClient } from \"viem\";\nimport {\n KernelManagerABI,\n KernelPoolABI,\n} from \"@skate-org/amm-bindings\";\nimport {\n KernelManagerAddress,\n normalizeMode,\n type EnvModeWithConfig,\n} from \"@skate-org/amm-core-v2\";\nimport { getKernelPublicClient } from \"../chain-clients\";\nimport { wrapReadError } from \"../errors\";\nimport {\n getAmount0Delta,\n getAmount1Delta,\n getSqrtRatioAtTick,\n} from \"../math\";\n\n/** Decoded kernel-pool `slot0` state (named fields, per the ABI tuple). */\nexport interface KernelSlot0 {\n sqrtPriceX96: bigint;\n tick: number;\n observationIndex: number;\n observationCardinality: number;\n observationCardinalityNext: number;\n feeProtocol: number;\n unlocked: boolean;\n}\n\n/** Decoded pool state returned by `readPool`. */\nexport interface KernelPoolState {\n slot0: KernelSlot0;\n liquidity: bigint;\n}\n\n/** Decoded NFT position returned by `readPosition`. */\nexport interface KernelNftPosition {\n pool: `0x${string}`;\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n feeGrowthInside0LastX128: bigint;\n feeGrowthInside1LastX128: bigint;\n tokensOwed0: bigint;\n tokensOwed1: bigint;\n}\n\n/** Decoded kernel-pool `ticks(tick)` struct. */\nexport interface KernelTick {\n liquidityGross: bigint;\n liquidityNet: bigint;\n feeGrowthOutside0X128: bigint;\n feeGrowthOutside1X128: bigint;\n tickCumulativeOutside: bigint;\n secondsPerLiquidityOutsideX128: bigint;\n secondsOutside: number;\n initialized: boolean;\n}\n\n/**\n * Return the caller-provided client if present, otherwise build a fresh\n * MegaETH kernel client for the given mode.\n */\nfunction resolveClient(\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): PublicClient {\n return client ?? getKernelPublicClient(mode);\n}\n\n/**\n * Read `slot0` and `liquidity` from a kernel pool. Returns both in a single\n * object; the reads are fired in parallel.\n *\n * The `client` optional parameter is the standard test-injection point.\n */\nexport async function readPool(\n kernelPool: `0x${string}`,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<KernelPoolState> {\n const c = resolveClient(mode, client);\n try {\n const [slot0, liquidity] = await Promise.all([\n c.readContract({\n address: kernelPool,\n abi: KernelPoolABI,\n functionName: \"slot0\",\n }),\n c.readContract({\n address: kernelPool,\n abi: KernelPoolABI,\n functionName: \"liquidity\",\n }),\n ]);\n // Viem returns named outputs as a positional tuple (array) when every\n // output has a name — normalize to a named-field object here so callers\n // don't depend on viem's tuple/object split.\n const s0 = slot0 as readonly [\n bigint,\n number,\n number,\n number,\n number,\n number,\n boolean,\n ];\n return {\n slot0: {\n sqrtPriceX96: s0[0],\n tick: s0[1],\n observationIndex: s0[2],\n observationCardinality: s0[3],\n observationCardinalityNext: s0[4],\n feeProtocol: s0[5],\n unlocked: s0[6],\n },\n liquidity: liquidity as bigint,\n };\n } catch (err) {\n throw wrapReadError(err, \"readPool\");\n }\n}\n\n/**\n * Read an NFT position by token id from the kernel manager.\n *\n * Calls `KernelManager.nftPositions(tokenId)` — per the ABI this returns a\n * `DataTypes.NFTPosition` tuple including `pool`, `tickLower`, `tickUpper`,\n * `liquidity`, fee growth, and tokens owed.\n */\nexport async function readPosition(\n tokenId: bigint,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<KernelNftPosition> {\n const { mode: baseMode } = normalizeMode(mode);\n const manager = KernelManagerAddress(baseMode);\n const c = resolveClient(mode, client);\n try {\n const raw = (await c.readContract({\n address: manager,\n abi: KernelManagerABI,\n functionName: \"nftPositions\",\n args: [tokenId],\n })) as unknown;\n // Accept either a positional tuple or an already-named object from\n // viem — normalize to a named-field object, mirroring readPool's\n // defensive remap. Viem's decoding of named-components tuples is\n // stable today (object form), but this guards against future\n // restructuring.\n const asTuple = Array.isArray(raw)\n ? (raw as unknown as readonly [\n `0x${string}`,\n number,\n number,\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n ])\n : null;\n if (asTuple) {\n return {\n pool: asTuple[0],\n tickLower: asTuple[1],\n tickUpper: asTuple[2],\n liquidity: asTuple[3],\n feeGrowthInside0LastX128: asTuple[4],\n feeGrowthInside1LastX128: asTuple[5],\n tokensOwed0: asTuple[6],\n tokensOwed1: asTuple[7],\n };\n }\n return raw as KernelNftPosition;\n } catch (err) {\n throw wrapReadError(err, \"readPosition\");\n }\n}\n\n/**\n * Read a kernel-pool tick-bitmap word (`tickBitmap(int16 wordPos)`).\n *\n * Returns the raw `uint256` word as a bigint. A bit-decoder that expands a\n * word into populated tick indexes is intentionally not shipped in 0.2.0 —\n * flag as an open question for Phase 3 if a caller wants it.\n */\nexport async function readTickBitmap(\n kernelPool: `0x${string}`,\n wordPos: number,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<bigint> {\n const c = resolveClient(mode, client);\n try {\n const word = await c.readContract({\n address: kernelPool,\n abi: KernelPoolABI,\n functionName: \"tickBitmap\",\n args: [wordPos],\n });\n return word as bigint;\n } catch (err) {\n throw wrapReadError(err, \"readTickBitmap\");\n }\n}\n\n/** Read the `ticks(tick)` struct from a kernel pool. */\nexport async function readTick(\n kernelPool: `0x${string}`,\n tick: number,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<KernelTick> {\n const c = resolveClient(mode, client);\n try {\n const raw = (await c.readContract({\n address: kernelPool,\n abi: KernelPoolABI,\n functionName: \"ticks\",\n args: [tick],\n })) as readonly [\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n number,\n boolean,\n ];\n return {\n liquidityGross: raw[0],\n liquidityNet: raw[1],\n feeGrowthOutside0X128: raw[2],\n feeGrowthOutside1X128: raw[3],\n tickCumulativeOutside: raw[4],\n secondsPerLiquidityOutsideX128: raw[5],\n secondsOutside: raw[6],\n initialized: raw[7],\n };\n } catch (err) {\n throw wrapReadError(err, \"readTick\");\n }\n}\n\n/**\n * Compute `{amount0, amount1}` for an NFT position using the Group 3 math.\n *\n * Reads the position (to learn `pool`, `tickLower`, `tickUpper`,\n * `liquidity`) and the pool's `slot0`, then splits based on whether the\n * current tick is below, inside, or above the position range — mirroring\n * `PositionValue.principal` from Uniswap v3 periphery.\n */\nexport async function computePositionAmounts(\n tokenId: bigint,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<{ amount0: bigint; amount1: bigint }> {\n const c = resolveClient(mode, client);\n const position = await readPosition(tokenId, mode, c);\n const { slot0 } = await readPool(position.pool, mode, c);\n\n const sqrtLower = getSqrtRatioAtTick(position.tickLower);\n const sqrtUpper = getSqrtRatioAtTick(position.tickUpper);\n\n if (slot0.tick < position.tickLower) {\n return {\n amount0: getAmount0Delta(sqrtLower, sqrtUpper, position.liquidity, false),\n amount1: 0n,\n };\n }\n if (slot0.tick >= position.tickUpper) {\n return {\n amount0: 0n,\n amount1: getAmount1Delta(sqrtLower, sqrtUpper, position.liquidity, false),\n };\n }\n return {\n amount0: getAmount0Delta(\n slot0.sqrtPriceX96,\n sqrtUpper,\n position.liquidity,\n false,\n ),\n amount1: getAmount1Delta(\n sqrtLower,\n slot0.sqrtPriceX96,\n position.liquidity,\n false,\n ),\n };\n}\n","/**\n * Decode a single Uniswap-v3 tick-bitmap `uint256` word into the list of\n * real (non-compressed) ticks it marks as initialized.\n *\n * A tick bitmap word covers 256 compressed ticks. For a given `wordPos`\n * (int16) the word spans compressed ticks `wordPos * 256` through\n * `(wordPos + 1) * 256 - 1`, and bit `k` (0..255) corresponds to the\n * compressed tick `wordPos * 256 + k`. The real tick at bit `k` is\n * `(wordPos * 256 + k) * tickSpacing`.\n *\n * Intended composition with the reader:\n *\n * ```ts\n * const word = await readTickBitmap(pool, wordPos, mode);\n * const ticks = decodeTickBitmapWord(word, wordPos, tickSpacing);\n * ```\n *\n * Pure function: no network, no viem, no external deps.\n *\n * @param word The 256-bit bitmap word returned by PoolAbi.tickBitmap(int16).\n * @param wordPos The int16 word position (-128 .. 127 per Uniswap, but\n * we accept any safe-integer int16-shaped value).\n * @param tickSpacing The pool's tickSpacing (positive integer, typically 1,\n * 10, 60, 200, etc.).\n * @returns Real ticks whose bits are set in the word, ascending.\n *\n * @throws {RangeError} if `tickSpacing <= 0` or if `wordPos` is not a safe integer.\n */\nexport function decodeTickBitmapWord(\n word: bigint,\n wordPos: number,\n tickSpacing: number,\n): number[] {\n if (!Number.isSafeInteger(wordPos)) {\n throw new RangeError(\n `decodeTickBitmapWord: wordPos must be a safe integer, got ${wordPos}`,\n );\n }\n if (!Number.isSafeInteger(tickSpacing) || tickSpacing <= 0) {\n throw new RangeError(\n `decodeTickBitmapWord: tickSpacing must be a positive integer, got ${tickSpacing}`,\n );\n }\n const result: number[] = [];\n // wordPos * 256 gives the base compressed-tick of this word. Each set bit k\n // contributes compressed-tick (wordPos * 256 + k), which becomes real tick\n // (wordPos * 256 + k) * tickSpacing.\n const base = wordPos * 256;\n for (let k = 0; k < 256; k++) {\n if (((word >> BigInt(k)) & 1n) === 1n) {\n result.push((base + k) * tickSpacing);\n }\n }\n return result;\n}\n","import type { PublicClient } from \"viem\";\nimport { PeripheryPoolABI } from \"@skate-org/amm-bindings\";\nimport {\n CHAIN,\n getPeripheryDetailsByKernelPoolAndChainId,\n normalizeMode,\n type EnvModeWithConfig,\n} from \"@skate-org/amm-core-v2\";\nimport { getSourcePublicClient } from \"../chain-clients\";\nimport { EvmReadError, wrapReadError } from \"../errors\";\n\n/**\n * Decoded `balancesAvailable()` tuple on a periphery pool — per the\n * `PeripheryPoolABI` this returns `(uint256 amount0Available, uint256 amount1Available)`.\n */\nexport interface PeripheryBalancesAvailable {\n amount0Available: bigint;\n amount1Available: bigint;\n}\n\n/**\n * Decoded periphery-pool state assembled by {@link readPeripheryPool}.\n *\n * The periphery pool does **not** expose a `slot0`-style view — pricing\n * state lives on the kernel pool on MegaETH (see `readPool`). What the\n * periphery pool does expose is: the configured pair\n * (`token0`, `token1`, `fee`, `kernelPool` reference), the escrowed\n * in-pool settlement balances (`balancesAvailable`), and the two\n * `dustAmount{0,1}` accumulators. Together these are enough for a\n * source-chain caller to reason about pending settlement and dust.\n */\nexport interface PeripheryPoolState {\n /** Periphery pool contract address on the source chain. */\n address: `0x${string}`;\n /** Source-chain ERC-20 address for token0. */\n token0: `0x${string}`;\n /** Source-chain ERC-20 address for token1. */\n token1: `0x${string}`;\n /** Fee tier (uint24) the periphery pool was deployed with. */\n fee: number;\n /** Address of the paired kernel pool on MegaETH. */\n kernelPool: `0x${string}`;\n /** Aggregate in-pool balances available for settlement. */\n balancesAvailable: PeripheryBalancesAvailable;\n /** token0 dust accumulator. */\n dustAmount0: bigint;\n /** token1 dust accumulator. */\n dustAmount1: bigint;\n}\n\n/**\n * Return the caller-provided client, or build a fresh source-chain\n * client for `chain` under the given `mode`. Mirrors the kernel reader\n * injection pattern.\n */\nfunction resolveClient(\n chain: CHAIN,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): PublicClient {\n return client ?? getSourcePublicClient(chain, mode);\n}\n\n/**\n * Read the assembled periphery-pool state on a source chain.\n *\n * Resolves the periphery pool address via\n * `getPeripheryDetailsByKernelPoolAndChainId` (from\n * `@skate-org/amm-core-v2`) — **no addresses are hardcoded here**. If the\n * `(kernelPool, chain, mode)` triple has no entry in the aggregated pool\n * catalog, throws with the triple in the message for debuggability.\n *\n * All sub-reads are fired in parallel and normalized to named fields.\n */\nexport async function readPeripheryPool(\n chain: CHAIN,\n kernelPool: `0x${string}`,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<PeripheryPoolState> {\n const { mode: baseMode } = normalizeMode(mode);\n const details = getPeripheryDetailsByKernelPoolAndChainId(\n kernelPool,\n chain,\n baseMode,\n );\n if (!details) {\n throw new EvmReadError(\n \"readPeripheryPool\",\n `no periphery entry for kernelPool=${kernelPool} chain=${chain} mode=${baseMode}`,\n );\n }\n const address = details.address as `0x${string}`;\n const c = resolveClient(chain, mode, client);\n try {\n const [\n balancesAvailableRaw,\n dust0,\n dust1,\n token0,\n token1,\n fee,\n kPool,\n ] = await Promise.all([\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"balancesAvailable\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"dustAmount0\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"dustAmount1\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"token0\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"token1\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"fee\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"kernelPool\",\n }),\n ]);\n // Viem decodes multi-output tuples with all-named outputs as a\n // positional tuple — normalize to a named-field object.\n const bAvail = balancesAvailableRaw as readonly [bigint, bigint];\n return {\n address,\n token0: token0 as `0x${string}`,\n token1: token1 as `0x${string}`,\n fee: fee as number,\n kernelPool: kPool as `0x${string}`,\n balancesAvailable: {\n amount0Available: bAvail[0],\n amount1Available: bAvail[1],\n },\n dustAmount0: dust0 as bigint,\n dustAmount1: dust1 as bigint,\n };\n } catch (err) {\n throw wrapReadError(err, \"readPeripheryPool\");\n }\n}\n\n/**\n * Decoded `usersData(address)` tuple on a periphery pool — per the\n * `PeripheryPoolABI` this returns `(uint256 amount0, uint256 amount1)`\n * representing the user's per-pool in-flight token balances on the\n * source chain.\n */\nexport interface UserPoolBalances {\n amount0: bigint;\n amount1: bigint;\n}\n\n/**\n * Read a user's per-pool in-flight balances on a source chain.\n *\n * Resolves the periphery pool address via\n * `getPeripheryDetailsByKernelPoolAndChainId` (no hardcoded addresses)\n * and calls `PeripheryPool.usersData(user)` which returns\n * `(uint256 amount0, uint256 amount1)`.\n *\n * Replaces the previous `readEscrowBalance(chain, user, token)` stub,\n * whose `(user, token)` keying did not match any available ABI view —\n * escrow state is keyed per-(pool, user), not per-(user, token).\n */\nexport async function readUserPoolBalances(\n chain: CHAIN,\n kernelPool: `0x${string}`,\n user: `0x${string}`,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<UserPoolBalances> {\n const { mode: baseMode } = normalizeMode(mode);\n const details = getPeripheryDetailsByKernelPoolAndChainId(\n kernelPool,\n chain,\n baseMode,\n );\n if (!details) {\n throw new EvmReadError(\n \"readUserPoolBalances\",\n `no periphery entry for kernelPool=${kernelPool} chain=${chain} mode=${baseMode}`,\n );\n }\n const c = resolveClient(chain, mode, client);\n try {\n const raw = (await c.readContract({\n address: details.address as `0x${string}`,\n abi: PeripheryPoolABI,\n functionName: \"usersData\",\n args: [user],\n })) as unknown;\n // `usersData` returns `(uint256 amount0, uint256 amount1)`.\n // Viem decodes tuples with all-named outputs as a positional tuple;\n // handle both the positional and (older) object shapes defensively.\n if (Array.isArray(raw)) {\n const tuple = raw as unknown as readonly [bigint, bigint];\n return { amount0: tuple[0], amount1: tuple[1] };\n }\n const asObject = raw as { amount0: bigint; amount1: bigint };\n return { amount0: asObject.amount0, amount1: asObject.amount1 };\n } catch (err) {\n throw wrapReadError(err, \"readUserPoolBalances\");\n }\n}\n","import type { Address, Hex, WalletClient } from \"viem\";\nimport type { CHAIN, EnvModeWithConfig } from \"@skate-org/amm-core-v2\";\nimport { EvmWriteError, wrapWriteError } from \"../errors\";\n\n/**\n * Pre-built source-chain transaction payload accepted by\n * {@link submitAction}.\n *\n * The SDK does **not** fabricate calldata in Group 6 — callers build the\n * payload (e.g. from a quote's `serializedCall`) and this submitter only\n * broadcasts it. This keeps the SDK decoupled from any off-chain\n * routing/quote surface.\n */\nexport type SubmitActionParams = {\n /** Source-chain id the wallet must be connected to. */\n chain: CHAIN;\n /** Destination address of the broadcast tx. */\n to: Address;\n /** Pre-encoded calldata. */\n data: Hex;\n /** Native-value payable amount; defaults to `0n`. */\n value?: bigint;\n};\n\n/**\n * Broadcast a pre-built periphery action tx from the caller's\n * `WalletClient`.\n *\n * Guarantees:\n * - Throws {@link EvmWriteError} immediately if\n * `wallet.chain?.id !== params.chain` — no RPC call is made.\n * - Throws {@link EvmWriteError} if `wallet.account` is not set.\n * - Forwards the payload to `wallet.sendTransaction` and returns the\n * resulting tx hash.\n * - Wraps any thrown viem write-path error\n * (`TransactionExecutionError`, `UserRejectedRequestError`,\n * `ChainMismatchError`, …) into an {@link EvmWriteError} via\n * {@link wrapWriteError}.\n *\n * The `mode` parameter is currently unused at runtime; it is accepted for\n * API symmetry with the readers and as a forward-compat hook for a future\n * mode-specific submission policy (e.g. DEV-only simulation, staging\n * retries). The `_` prefix marks it unused for the TypeScript checker.\n *\n * Non-goals (per plan guardrails):\n * - Does NOT sign — the caller brings a `WalletClient` wired to their\n * signer.\n * - Does NOT switch chains — callers are responsible for\n * `wallet.switchChain(...)`.\n * - Does NOT retry or manage nonces — delegated to the caller's wallet.\n */\nexport async function submitAction(\n wallet: WalletClient,\n params: SubmitActionParams,\n _mode: EnvModeWithConfig,\n): Promise<Hex> {\n if (wallet.chain?.id !== params.chain) {\n throw new EvmWriteError(\n \"submitAction\",\n `wallet chain ${wallet.chain?.id ?? \"undefined\"} != params.chain ${params.chain}`,\n );\n }\n\n try {\n const account = wallet.account;\n if (!account) {\n throw new EvmWriteError(\n \"submitAction\",\n \"wallet has no account; callers must provide a wallet with wallet.account set\",\n );\n }\n return await wallet.sendTransaction({\n to: params.to,\n data: params.data,\n value: params.value ?? 0n,\n chain: wallet.chain,\n account,\n });\n } catch (err) {\n // Preserve our own pre-flight guards verbatim — they are already\n // EvmWriteError instances and don't need re-wrapping.\n if (err instanceof EvmWriteError) throw err;\n throw wrapWriteError(err, \"submitAction\");\n }\n}\n\n/**\n * Broadcast a periphery *swap* action — thin wrapper around\n * {@link submitAction} that re-labels any unknown error as `submitSwap` to\n * aid log-line triage. Behaviourally identical to `submitAction`; shares\n * its pre-flight guards.\n */\nexport async function submitSwap(\n wallet: WalletClient,\n params: SubmitActionParams,\n mode: EnvModeWithConfig,\n): Promise<Hex> {\n try {\n return await submitAction(wallet, params, mode);\n } catch (err) {\n if (err instanceof EvmWriteError) throw err;\n throw wrapWriteError(err, \"submitSwap\");\n }\n}\n\n/**\n * Broadcast a periphery *approval* action (ERC-20 approve to the source\n * chain's periphery contract) — thin wrapper around {@link submitAction}.\n * See {@link submitSwap} for labeling rationale.\n */\nexport async function submitApproval(\n wallet: WalletClient,\n params: SubmitActionParams,\n mode: EnvModeWithConfig,\n): Promise<Hex> {\n try {\n return await submitAction(wallet, params, mode);\n } catch (err) {\n if (err instanceof EvmWriteError) throw err;\n throw wrapWriteError(err, \"submitApproval\");\n }\n}\n","import { decodeEventLog, type Log } from \"viem\";\nimport { KernelEventEmitterABI } from \"@skate-org/amm-bindings\";\nimport { EvmReadError } from \"../errors\";\n\n/**\n * Event names emitted by the Skate kernel's `KernelEventEmitter`, sourced\n * directly from `@skate-org/amm-bindings`.\n */\nexport type KernelEventName =\n | \"Burn\"\n | \"Collect\"\n | \"CollectProtocol\"\n | \"IncreaseObservationCardinalityNext\"\n | \"Initialize\"\n | \"Mint\"\n | \"PeripheryPoolAdded\"\n | \"PeripheryPoolChanged\"\n | \"PoolCreated\"\n | \"PoolDescriptionUpdated\"\n | \"SetFeeProtocol\"\n | \"Swap\";\n\n/** Exhaustive list of known kernel event names — same values as {@link KernelEventName}. */\nexport const KERNEL_EVENT_NAMES: readonly KernelEventName[] = [\n \"Burn\",\n \"Collect\",\n \"CollectProtocol\",\n \"IncreaseObservationCardinalityNext\",\n \"Initialize\",\n \"Mint\",\n \"PeripheryPoolAdded\",\n \"PeripheryPoolChanged\",\n \"PoolCreated\",\n \"PoolDescriptionUpdated\",\n \"SetFeeProtocol\",\n \"Swap\",\n];\n\n/**\n * A decoded kernel event — the event name, its named args, and the original\n * viem `Log` for context (tx hash, block number, etc.).\n */\nexport interface KernelParsedEvent {\n eventName: KernelEventName;\n args: Record<string, unknown>;\n log: Log;\n}\n\n/**\n * Decode a viem `Log` emitted by the Skate kernel's `KernelEventEmitter`.\n *\n * Throws {@link EvmReadError} if the log's topic0 is not a known kernel event\n * or if ABI decoding fails.\n */\nexport function parseKernelEventLog(log: Log): KernelParsedEvent {\n try {\n const decoded = decodeEventLog({\n abi: KernelEventEmitterABI,\n data: log.data,\n topics: log.topics,\n });\n return {\n eventName: decoded.eventName as KernelEventName,\n args: (decoded.args ?? {}) as Record<string, unknown>,\n log,\n };\n } catch (err) {\n const message = (err as { shortMessage?: string; message?: string })\n .shortMessage ??\n (err as { message?: string }).message ??\n String(err);\n throw new EvmReadError(\n \"parseKernelEventLog\",\n `failed to decode log: ${message}`,\n { cause: err as Error },\n );\n }\n}\n","import { decodeEventLog, type Log } from \"viem\";\nimport { PeripheryEventEmitterABI } from \"@skate-org/amm-bindings\";\nimport { EvmReadError } from \"../errors\";\n\n/**\n * Event names emitted by `PeripheryEventEmitter` on the source chain.\n */\nexport type PeripheryEventName =\n | \"AmountSettled\"\n | \"Burned\"\n | \"LiquidityDecreased\"\n | \"LiquidityIncreased\"\n | \"MintSettled\"\n | \"Minted\"\n | \"PoolCreated\"\n | \"PoolDeployed\"\n | \"Swapped\"\n | \"TransferredTo\";\n\n/** Exhaustive list of known periphery event names. */\nexport const PERIPHERY_EVENT_NAMES: readonly PeripheryEventName[] = [\n \"AmountSettled\",\n \"Burned\",\n \"LiquidityDecreased\",\n \"LiquidityIncreased\",\n \"MintSettled\",\n \"Minted\",\n \"PoolCreated\",\n \"PoolDeployed\",\n \"Swapped\",\n \"TransferredTo\",\n];\n\n/** A decoded periphery event — name, named args, and the original viem `Log`. */\nexport interface PeripheryParsedEvent {\n eventName: PeripheryEventName;\n args: Record<string, unknown>;\n log: Log;\n}\n\n/**\n * Decode a viem `Log` emitted by `PeripheryEventEmitter` on a source chain.\n *\n * Throws {@link EvmReadError} if the log's topic0 is not a known periphery\n * event or if ABI decoding fails.\n */\nexport function parsePeripheryEventLog(log: Log): PeripheryParsedEvent {\n try {\n const decoded = decodeEventLog({\n abi: PeripheryEventEmitterABI,\n data: log.data,\n topics: log.topics,\n });\n return {\n eventName: decoded.eventName as PeripheryEventName,\n args: (decoded.args ?? {}) as Record<string, unknown>,\n log,\n };\n } catch (err) {\n const message = (err as { shortMessage?: string; message?: string })\n .shortMessage ??\n (err as { message?: string }).message ??\n String(err);\n throw new EvmReadError(\n \"parsePeripheryEventLog\",\n `failed to decode log: ${message}`,\n { cause: err as Error },\n );\n }\n}\n","import type { Address, Log, PublicClient } from \"viem\";\nimport {\n KernelEventEmitterABI,\n PeripheryEventEmitterABI,\n} from \"@skate-org/amm-bindings\";\nimport {\n parseKernelEventLog,\n type KernelParsedEvent,\n} from \"./kernel\";\nimport {\n parsePeripheryEventLog,\n type PeripheryParsedEvent,\n} from \"./periphery\";\n\nexport interface EventSubscriptionOptions<E> {\n /** Called for each decoded event. */\n onEvent: (event: E) => void;\n /** Called when a log fails to decode (subscription stays alive). */\n onError?: (err: unknown) => void;\n}\n\n/**\n * Subscribe to kernel events emitted by the `KernelEventEmitter` contract\n * at `address`. Returns an unsubscribe function.\n *\n * Decode failures are surfaced via `opts.onError` (if provided) rather than\n * throwing — the subscription continues.\n */\nexport function watchKernelEvents(\n client: PublicClient,\n address: Address,\n opts: EventSubscriptionOptions<KernelParsedEvent>,\n): () => void {\n return client.watchContractEvent({\n abi: KernelEventEmitterABI,\n address,\n onLogs: (logs: Log[]) => {\n for (const log of logs) {\n try {\n opts.onEvent(parseKernelEventLog(log));\n } catch (err) {\n opts.onError?.(err);\n }\n }\n },\n });\n}\n\n/**\n * Subscribe to periphery events emitted by `PeripheryEventEmitter` at\n * `address` on the source chain the `client` is connected to.\n */\nexport function watchPeripheryEvents(\n client: PublicClient,\n address: Address,\n opts: EventSubscriptionOptions<PeripheryParsedEvent>,\n): () => void {\n return client.watchContractEvent({\n abi: PeripheryEventEmitterABI,\n address,\n onLogs: (logs: Log[]) => {\n for (const log of logs) {\n try {\n opts.onEvent(parsePeripheryEventLog(log));\n } catch (err) {\n opts.onError?.(err);\n }\n }\n },\n });\n}\n"],"mappings":"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","names":["import_amm_core_v2","MAX_UINT256","MAX_UINT256","INT128_MIN","INT128_MAX","MAX_UINT128","import_amm_core_v2","import_amm_bindings","import_amm_core_v2","resolveClient","import_viem","import_amm_bindings","import_viem","import_amm_bindings","import_amm_bindings"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/chain-clients.ts","../src/devConfig.ts","../src/errors.ts","../src/kernel/reader.ts","../src/kernel/tickBitmap.ts","../src/periphery/reader.ts","../src/periphery/submit.ts","../src/events/kernel.ts","../src/events/periphery.ts","../src/events/watch.ts"],"sourcesContent":["export * from \"./chain-clients\";\nexport * from \"./devConfig\";\n// Public error classes only; wrap* helpers are internal implementation\n// detail shared between readers/submitters and are not re-exported.\nexport { EvmReadError, EvmWriteError } from \"./errors\";\nexport * from \"./kernel\";\nexport * from \"./periphery\";\nexport * from \"./events\";\n","import {\n createPublicClient,\n defineChain,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n} from \"viem\";\nimport { arbitrum } from \"viem/chains\";\nimport {\n BLOCK_EXPLORER,\n CHAIN,\n VM,\n vmTypeFromChain,\n normalizeMode,\n type EnvModeWithConfig,\n} from \"@skate-org/amm-core-v2\";\n\n/**\n * MegaETH chain definition — `@public`.\n *\n * Exported for callers who need to build their own viem `WalletClient` or\n * `PublicClient` against the same chain the SDK uses internally (e.g. wallet\n * integrations that construct a `WalletClient` ahead of calling\n * `submitAction`). Prefer {@link getKernelPublicClient} when you just need a\n * read client.\n *\n * viem ships a `megaeth` chain at id 4326, but with a different default RPC\n * than the one Skate uses for kernel reads. Define locally so we control the\n * RPC URL + block-explorer metadata and don't inherit unrelated op-stack\n * contract addresses.\n */\nexport const megaethChain: Chain = defineChain({\n id: 4326,\n name: \"MegaETH\",\n network: \"megaeth\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: [\"https://mainnet.megaeth.com/rpc\"] },\n public: { http: [\"https://mainnet.megaeth.com/rpc\"] },\n },\n blockExplorers: {\n default: { name: \"Blockscout\", url: BLOCK_EXPLORER.MEGAETH },\n },\n});\n\n/**\n * Default public RPC URLs by chain id.\n *\n * Callers can override per-chain via `DevModeConfig.rpcEndpoints` or by\n * passing an explicit `transport` to the factory functions below.\n */\nconst DEFAULT_RPC: Partial<Record<CHAIN, string>> = {\n [CHAIN.MEGAETH]: \"https://mainnet.megaeth.com/rpc\",\n [CHAIN.ARBITRUM]: \"https://arb1.arbitrum.io/rpc\",\n};\n\n/**\n * Map a supported EVM `CHAIN` to a viem `Chain` definition.\n *\n * Only chains we actively support in Phase 2 are listed; unknown chains\n * return `undefined` and the caller throws.\n */\nfunction chainDefFor(chain: CHAIN): Chain | undefined {\n switch (chain) {\n case CHAIN.MEGAETH:\n return megaethChain;\n case CHAIN.ARBITRUM:\n return arbitrum;\n default:\n return undefined;\n }\n}\n\n/**\n * Resolve the RPC URL for a given chain under the precedence:\n * transport override (caller arg) > mode.config.rpcEndpoints[chain] > DEFAULT_RPC[chain]\n * Returns `undefined` if none is set — callers must have already decided whether\n * to use a caller-supplied transport.\n */\nfunction resolveRpcUrl(\n chain: CHAIN,\n mode: EnvModeWithConfig,\n): string | undefined {\n const { config } = normalizeMode(mode);\n return config?.rpcEndpoints?.[chain] ?? DEFAULT_RPC[chain];\n}\n\n/**\n * Return a fresh `PublicClient` bound to the MegaETH kernel chain.\n *\n * MegaETH is the kernel chain for all environment modes (DEV/STAGING/\n * PRODUCTION) in SDK v2. The `mode` parameter is accepted for API\n * symmetry with the rest of the SDK and as a forward-compatible extension\n * point (e.g. a future testnet kernel).\n *\n * Pure — no singletons, no caching. Pass a custom `transport` to override\n * the default RPC (useful for tests and custom RPC providers).\n */\nexport function getKernelPublicClient(\n mode: EnvModeWithConfig,\n transport?: Transport,\n): PublicClient {\n return createPublicClient({\n chain: megaethChain,\n transport: transport ?? http(resolveRpcUrl(CHAIN.MEGAETH, mode)),\n });\n}\n\n/**\n * Return a fresh `PublicClient` for a source EVM chain (e.g. Arbitrum).\n *\n * Throws a descriptive `Error` when:\n * - `chain` is not an EVM chain (per `vmTypeFromChain`); or\n * - no viem chain definition is registered for `chain`; or\n * - no default RPC URL is configured for `chain` and no `transport` override\n * was provided.\n *\n * Pure — no singletons, no caching.\n */\nexport function getSourcePublicClient(\n chain: CHAIN,\n mode: EnvModeWithConfig,\n transport?: Transport,\n): PublicClient {\n if (vmTypeFromChain(chain) !== VM.EVM) {\n throw new Error(\n `getSourcePublicClient: chain ${chain} is not an EVM chain`,\n );\n }\n const chainDef = chainDefFor(chain);\n if (!chainDef) {\n throw new Error(\n `getSourcePublicClient: no chain definition registered for chain ${chain}`,\n );\n }\n const rpc = resolveRpcUrl(chain, mode);\n if (!rpc && !transport) {\n throw new Error(\n `getSourcePublicClient: no default or override RPC configured for chain ${chain}; pass a transport override or set DevModeConfig.rpcEndpoints[${chain}]`,\n );\n }\n return createPublicClient({\n chain: chainDef,\n transport: transport ?? http(rpc),\n });\n}\n","import type { DevModeConfig } from \"@skate-org/amm-core-v2\";\n\n/** Default DEV api endpoint — matches Phase 1's api client default. */\nexport const DEFAULT_DEV_API_ENDPOINT =\n \"https://dev.api.skatechain.org/amm-action-v2\";\n\n/**\n * Convenience factory for the `{ mode: \"DEV\"; config: DevModeConfig }` tuple.\n *\n * Reduces ceremony at call sites that want to override a single field (e.g.,\n * `rpcEndpoints`) without reconstructing the full object:\n *\n * ```ts\n * const mode = createDevConfig({\n * rpcEndpoints: { [CHAIN.MEGAETH]: \"https://my-private-megaeth/rpc\" },\n * });\n * submitAction(wallet, params, mode);\n * ```\n *\n * Pass nothing to use all defaults.\n */\nexport function createDevConfig(\n overrides: Partial<DevModeConfig> = {},\n): { mode: \"DEV\"; config: DevModeConfig } {\n return {\n mode: \"DEV\",\n config: {\n apiEndpoint: overrides.apiEndpoint ?? DEFAULT_DEV_API_ENDPOINT,\n ...(overrides.rpcEndpoints\n ? { rpcEndpoints: overrides.rpcEndpoints }\n : {}),\n },\n };\n}\n","/**\n * Shared error types for the `@skate-org/amm-evm-v2` package.\n *\n * `EvmReadError` / `EvmWriteError` extend `SdkError` (from core) so callers\n * can `instanceof SdkError` to catch any SDK-origin error without needing\n * to know the specific subclass.\n */\n\nimport { SdkError } from \"@skate-org/amm-core-v2\";\n\n/** SDK-level error thrown when an EVM read reverts or decodes badly. */\nexport class EvmReadError extends SdkError {\n override readonly name: string = \"EvmReadError\";\n readonly functionName: string;\n\n constructor(functionName: string, message: string, options?: ErrorOptions) {\n super(`${functionName}: ${message}`, options);\n this.functionName = functionName;\n }\n}\n\n/**\n * SDK-level error thrown when an EVM write (broadcast) fails.\n *\n * Symmetric with {@link EvmReadError}, but covers the write path: viem's\n * `TransactionExecutionError`, `UserRejectedRequestError`,\n * `ChainMismatchError`, `ChainDisconnectedError`, as well as submitter\n * pre-flight guards (e.g. wrong-chain, missing account).\n */\nexport class EvmWriteError extends SdkError {\n override readonly name: string = \"EvmWriteError\";\n readonly functionName: string;\n\n constructor(functionName: string, message: string, options?: ErrorOptions) {\n super(`${functionName}: ${message}`, options);\n this.functionName = functionName;\n }\n}\n\n/**\n * Wrap any error from an EVM read into `EvmReadError`. Viem always wraps\n * revert-path errors in `ContractFunctionExecutionError` (see\n * `viem/utils/errors/getContractError`), so we check both the outer name and\n * the `.cause` chain for `ContractFunctionRevertedError` /\n * `ContractFunctionZeroDataError`.\n *\n * Shared by `kernel/reader.ts` and `periphery/reader.ts` — depends only on\n * `EvmReadError` and generic Error inspection (no reader-module imports), so\n * it is safe from circular-import concerns.\n */\nexport function wrapReadError(\n err: unknown,\n functionName: string,\n): EvmReadError {\n const outerName = (err as { name?: string } | null)?.name;\n const causeName = (err as { cause?: { name?: string } } | null)?.cause?.name;\n const message =\n (err as { shortMessage?: string } | null)?.shortMessage ??\n (err as { message?: string } | null)?.message ??\n String(err);\n const isViemContractError =\n outerName === \"ContractFunctionExecutionError\" ||\n outerName === \"ContractFunctionRevertedError\" ||\n outerName === \"ContractFunctionZeroDataError\" ||\n causeName === \"ContractFunctionRevertedError\" ||\n causeName === \"ContractFunctionZeroDataError\";\n if (isViemContractError) {\n return new EvmReadError(functionName, `reverted: ${message}`, {\n cause: err as Error,\n });\n }\n return new EvmReadError(functionName, message, { cause: err as Error });\n}\n\n/**\n * Wrap any error from an EVM write-path call (typically\n * `WalletClient.sendTransaction`) into `EvmWriteError`.\n *\n * Any thrown error reaching a submitter is treated as a write failure. If\n * we later want to differentiate known viem write errors\n * (`TransactionExecutionError`, `UserRejectedRequestError`,\n * `ChainMismatchError`, `ChainDisconnectedError`) from unknown errors —\n * e.g. to prefix the message or re-throw unknowns raw — that dispatch goes\n * here. Keeping the single-return shape until a concrete caller need\n * surfaces.\n */\nexport function wrapWriteError(\n err: unknown,\n functionName: string,\n): EvmWriteError {\n const message =\n (err as { shortMessage?: string } | null)?.shortMessage ??\n (err as { message?: string } | null)?.message ??\n String(err);\n return new EvmWriteError(functionName, message, { cause: err as Error });\n}\n","import type { PublicClient } from \"viem\";\nimport {\n KernelManagerABI,\n KernelPoolABI,\n} from \"@skate-org/amm-bindings\";\nimport {\n KernelManagerAddress,\n normalizeMode,\n type EnvModeWithConfig,\n getAmount0Delta,\n getAmount1Delta,\n getSqrtRatioAtTick,\n} from \"@skate-org/amm-core-v2\";\nimport { getKernelPublicClient } from \"../chain-clients\";\nimport { wrapReadError } from \"../errors\";\n\n/** Decoded kernel-pool `slot0` state (named fields, per the ABI tuple). */\nexport interface KernelSlot0 {\n sqrtPriceX96: bigint;\n tick: number;\n observationIndex: number;\n observationCardinality: number;\n observationCardinalityNext: number;\n feeProtocol: number;\n unlocked: boolean;\n}\n\n/** Decoded pool state returned by `readPool`. */\nexport interface KernelPoolState {\n slot0: KernelSlot0;\n liquidity: bigint;\n}\n\n/** Decoded NFT position returned by `readPosition`. */\nexport interface KernelNftPosition {\n pool: `0x${string}`;\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n feeGrowthInside0LastX128: bigint;\n feeGrowthInside1LastX128: bigint;\n tokensOwed0: bigint;\n tokensOwed1: bigint;\n}\n\n/** Decoded kernel-pool `ticks(tick)` struct. */\nexport interface KernelTick {\n liquidityGross: bigint;\n liquidityNet: bigint;\n feeGrowthOutside0X128: bigint;\n feeGrowthOutside1X128: bigint;\n tickCumulativeOutside: bigint;\n secondsPerLiquidityOutsideX128: bigint;\n secondsOutside: number;\n initialized: boolean;\n}\n\n/**\n * Return the caller-provided client if present, otherwise build a fresh\n * MegaETH kernel client for the given mode.\n */\nfunction resolveClient(\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): PublicClient {\n return client ?? getKernelPublicClient(mode);\n}\n\n/**\n * Read `slot0` and `liquidity` from a kernel pool. Returns both in a single\n * object; the reads are fired in parallel.\n *\n * The `client` optional parameter is the standard test-injection point.\n */\nexport async function readPool(\n kernelPool: `0x${string}`,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<KernelPoolState> {\n const c = resolveClient(mode, client);\n try {\n const [slot0, liquidity] = await Promise.all([\n c.readContract({\n address: kernelPool,\n abi: KernelPoolABI,\n functionName: \"slot0\",\n }),\n c.readContract({\n address: kernelPool,\n abi: KernelPoolABI,\n functionName: \"liquidity\",\n }),\n ]);\n // Viem returns named outputs as a positional tuple (array) when every\n // output has a name — normalize to a named-field object here so callers\n // don't depend on viem's tuple/object split.\n const s0 = slot0 as readonly [\n bigint,\n number,\n number,\n number,\n number,\n number,\n boolean,\n ];\n return {\n slot0: {\n sqrtPriceX96: s0[0],\n tick: s0[1],\n observationIndex: s0[2],\n observationCardinality: s0[3],\n observationCardinalityNext: s0[4],\n feeProtocol: s0[5],\n unlocked: s0[6],\n },\n liquidity: liquidity as bigint,\n };\n } catch (err) {\n throw wrapReadError(err, \"readPool\");\n }\n}\n\n/**\n * Read an NFT position by token id from the kernel manager.\n *\n * Calls `KernelManager.nftPositions(tokenId)` — per the ABI this returns a\n * `DataTypes.NFTPosition` tuple including `pool`, `tickLower`, `tickUpper`,\n * `liquidity`, fee growth, and tokens owed.\n */\nexport async function readPosition(\n tokenId: bigint,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<KernelNftPosition> {\n const { mode: baseMode } = normalizeMode(mode);\n const manager = KernelManagerAddress(baseMode);\n const c = resolveClient(mode, client);\n try {\n const raw = (await c.readContract({\n address: manager,\n abi: KernelManagerABI,\n functionName: \"nftPositions\",\n args: [tokenId],\n })) as unknown;\n // Accept either a positional tuple or an already-named object from\n // viem — normalize to a named-field object, mirroring readPool's\n // defensive remap. Viem's decoding of named-components tuples is\n // stable today (object form), but this guards against future\n // restructuring.\n const asTuple = Array.isArray(raw)\n ? (raw as unknown as readonly [\n `0x${string}`,\n number,\n number,\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n ])\n : null;\n if (asTuple) {\n return {\n pool: asTuple[0],\n tickLower: asTuple[1],\n tickUpper: asTuple[2],\n liquidity: asTuple[3],\n feeGrowthInside0LastX128: asTuple[4],\n feeGrowthInside1LastX128: asTuple[5],\n tokensOwed0: asTuple[6],\n tokensOwed1: asTuple[7],\n };\n }\n return raw as KernelNftPosition;\n } catch (err) {\n throw wrapReadError(err, \"readPosition\");\n }\n}\n\n/**\n * Read a kernel-pool tick-bitmap word (`tickBitmap(int16 wordPos)`).\n *\n * Returns the raw `uint256` word as a bigint. A bit-decoder that expands a\n * word into populated tick indexes is intentionally not shipped in 0.2.0 —\n * flag as an open question for Phase 3 if a caller wants it.\n */\nexport async function readTickBitmap(\n kernelPool: `0x${string}`,\n wordPos: number,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<bigint> {\n const c = resolveClient(mode, client);\n try {\n const word = await c.readContract({\n address: kernelPool,\n abi: KernelPoolABI,\n functionName: \"tickBitmap\",\n args: [wordPos],\n });\n return word as bigint;\n } catch (err) {\n throw wrapReadError(err, \"readTickBitmap\");\n }\n}\n\n/** Read the `ticks(tick)` struct from a kernel pool. */\nexport async function readTick(\n kernelPool: `0x${string}`,\n tick: number,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<KernelTick> {\n const c = resolveClient(mode, client);\n try {\n const raw = (await c.readContract({\n address: kernelPool,\n abi: KernelPoolABI,\n functionName: \"ticks\",\n args: [tick],\n })) as readonly [\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n number,\n boolean,\n ];\n return {\n liquidityGross: raw[0],\n liquidityNet: raw[1],\n feeGrowthOutside0X128: raw[2],\n feeGrowthOutside1X128: raw[3],\n tickCumulativeOutside: raw[4],\n secondsPerLiquidityOutsideX128: raw[5],\n secondsOutside: raw[6],\n initialized: raw[7],\n };\n } catch (err) {\n throw wrapReadError(err, \"readTick\");\n }\n}\n\n/**\n * Compute `{amount0, amount1}` for an NFT position using the Group 3 math.\n *\n * Reads the position (to learn `pool`, `tickLower`, `tickUpper`,\n * `liquidity`) and the pool's `slot0`, then splits based on whether the\n * current tick is below, inside, or above the position range — mirroring\n * `PositionValue.principal` from Uniswap v3 periphery.\n */\nexport async function computePositionAmounts(\n tokenId: bigint,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<{ amount0: bigint; amount1: bigint }> {\n const c = resolveClient(mode, client);\n const position = await readPosition(tokenId, mode, c);\n const { slot0 } = await readPool(position.pool, mode, c);\n\n const sqrtLower = getSqrtRatioAtTick(position.tickLower);\n const sqrtUpper = getSqrtRatioAtTick(position.tickUpper);\n\n if (slot0.tick < position.tickLower) {\n return {\n amount0: getAmount0Delta(sqrtLower, sqrtUpper, position.liquidity, false),\n amount1: 0n,\n };\n }\n if (slot0.tick >= position.tickUpper) {\n return {\n amount0: 0n,\n amount1: getAmount1Delta(sqrtLower, sqrtUpper, position.liquidity, false),\n };\n }\n return {\n amount0: getAmount0Delta(\n slot0.sqrtPriceX96,\n sqrtUpper,\n position.liquidity,\n false,\n ),\n amount1: getAmount1Delta(\n sqrtLower,\n slot0.sqrtPriceX96,\n position.liquidity,\n false,\n ),\n };\n}\n","/**\n * Decode a single Uniswap-v3 tick-bitmap `uint256` word into the list of\n * real (non-compressed) ticks it marks as initialized.\n *\n * A tick bitmap word covers 256 compressed ticks. For a given `wordPos`\n * (int16) the word spans compressed ticks `wordPos * 256` through\n * `(wordPos + 1) * 256 - 1`, and bit `k` (0..255) corresponds to the\n * compressed tick `wordPos * 256 + k`. The real tick at bit `k` is\n * `(wordPos * 256 + k) * tickSpacing`.\n *\n * Intended composition with the reader:\n *\n * ```ts\n * const word = await readTickBitmap(pool, wordPos, mode);\n * const ticks = decodeTickBitmapWord(word, wordPos, tickSpacing);\n * ```\n *\n * Pure function: no network, no viem, no external deps.\n *\n * @param word The 256-bit bitmap word returned by PoolAbi.tickBitmap(int16).\n * @param wordPos The int16 word position (-128 .. 127 per Uniswap, but\n * we accept any safe-integer int16-shaped value).\n * @param tickSpacing The pool's tickSpacing (positive integer, typically 1,\n * 10, 60, 200, etc.).\n * @returns Real ticks whose bits are set in the word, ascending.\n *\n * @throws {RangeError} if `tickSpacing <= 0` or if `wordPos` is not a safe integer.\n */\nexport function decodeTickBitmapWord(\n word: bigint,\n wordPos: number,\n tickSpacing: number,\n): number[] {\n if (!Number.isSafeInteger(wordPos)) {\n throw new RangeError(\n `decodeTickBitmapWord: wordPos must be a safe integer, got ${wordPos}`,\n );\n }\n if (!Number.isSafeInteger(tickSpacing) || tickSpacing <= 0) {\n throw new RangeError(\n `decodeTickBitmapWord: tickSpacing must be a positive integer, got ${tickSpacing}`,\n );\n }\n const result: number[] = [];\n // wordPos * 256 gives the base compressed-tick of this word. Each set bit k\n // contributes compressed-tick (wordPos * 256 + k), which becomes real tick\n // (wordPos * 256 + k) * tickSpacing.\n const base = wordPos * 256;\n for (let k = 0; k < 256; k++) {\n if (((word >> BigInt(k)) & 1n) === 1n) {\n result.push((base + k) * tickSpacing);\n }\n }\n return result;\n}\n","import type { PublicClient } from \"viem\";\nimport { PeripheryPoolABI } from \"@skate-org/amm-bindings\";\nimport {\n CHAIN,\n getPeripheryDetailsByKernelPoolAndChainId,\n normalizeMode,\n type EnvModeWithConfig,\n type EvmChain,\n} from \"@skate-org/amm-core-v2\";\nimport { getSourcePublicClient } from \"../chain-clients\";\nimport { EvmReadError, wrapReadError } from \"../errors\";\n\n/**\n * Decoded `balancesAvailable()` tuple on a periphery pool — per the\n * `PeripheryPoolABI` this returns `(uint256 amount0Available, uint256 amount1Available)`.\n */\nexport interface PeripheryBalancesAvailable {\n amount0Available: bigint;\n amount1Available: bigint;\n}\n\n/**\n * Decoded periphery-pool state assembled by {@link readPeripheryPool}.\n *\n * The periphery pool does **not** expose a `slot0`-style view — pricing\n * state lives on the kernel pool on MegaETH (see `readPool`). What the\n * periphery pool does expose is: the configured pair\n * (`token0`, `token1`, `fee`, `kernelPool` reference), the escrowed\n * in-pool settlement balances (`balancesAvailable`), and the two\n * `dustAmount{0,1}` accumulators. Together these are enough for a\n * source-chain caller to reason about pending settlement and dust.\n */\nexport interface PeripheryPoolState {\n /** Periphery pool contract address on the source chain. */\n address: `0x${string}`;\n /** Source-chain ERC-20 address for token0. */\n token0: `0x${string}`;\n /** Source-chain ERC-20 address for token1. */\n token1: `0x${string}`;\n /** Fee tier (uint24) the periphery pool was deployed with. */\n fee: number;\n /** Address of the paired kernel pool on MegaETH. */\n kernelPool: `0x${string}`;\n /** Aggregate in-pool balances available for settlement. */\n balancesAvailable: PeripheryBalancesAvailable;\n /** token0 dust accumulator. */\n dustAmount0: bigint;\n /** token1 dust accumulator. */\n dustAmount1: bigint;\n}\n\n/**\n * Return the caller-provided client, or build a fresh source-chain\n * client for `chain` under the given `mode`. Mirrors the kernel reader\n * injection pattern.\n */\nfunction resolveClient(\n chain: CHAIN,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): PublicClient {\n return client ?? getSourcePublicClient(chain, mode);\n}\n\n/**\n * Read the assembled periphery-pool state on a source chain.\n *\n * Resolves the periphery pool address via\n * `getPeripheryDetailsByKernelPoolAndChainId` (from\n * `@skate-org/amm-core-v2`) — **no addresses are hardcoded here**. If the\n * `(kernelPool, chain, mode)` triple has no entry in the aggregated pool\n * catalog, throws with the triple in the message for debuggability.\n *\n * All sub-reads are fired in parallel and normalized to named fields.\n */\nexport async function readPeripheryPool(\n chain: CHAIN,\n kernelPool: `0x${string}`,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<PeripheryPoolState> {\n const { mode: baseMode } = normalizeMode(mode);\n const details = getPeripheryDetailsByKernelPoolAndChainId(\n kernelPool,\n chain as EvmChain,\n baseMode,\n );\n if (!details) {\n throw new EvmReadError(\n \"readPeripheryPool\",\n `no periphery entry for kernelPool=${kernelPool} chain=${chain} mode=${baseMode}`,\n );\n }\n const address = details.address;\n const c = resolveClient(chain, mode, client);\n try {\n const [\n balancesAvailableRaw,\n dust0,\n dust1,\n token0,\n token1,\n fee,\n kPool,\n ] = await Promise.all([\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"balancesAvailable\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"dustAmount0\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"dustAmount1\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"token0\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"token1\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"fee\",\n }),\n c.readContract({\n address,\n abi: PeripheryPoolABI,\n functionName: \"kernelPool\",\n }),\n ]);\n // Viem decodes multi-output tuples with all-named outputs as a\n // positional tuple — normalize to a named-field object.\n const bAvail = balancesAvailableRaw as readonly [bigint, bigint];\n return {\n address,\n token0: token0 as `0x${string}`,\n token1: token1 as `0x${string}`,\n fee: fee as number,\n kernelPool: kPool as `0x${string}`,\n balancesAvailable: {\n amount0Available: bAvail[0],\n amount1Available: bAvail[1],\n },\n dustAmount0: dust0 as bigint,\n dustAmount1: dust1 as bigint,\n };\n } catch (err) {\n throw wrapReadError(err, \"readPeripheryPool\");\n }\n}\n\n/**\n * Decoded `usersData(address)` tuple on a periphery pool — per the\n * `PeripheryPoolABI` this returns `(uint256 amount0, uint256 amount1)`\n * representing the user's per-pool in-flight token balances on the\n * source chain.\n */\nexport interface UserPoolBalances {\n amount0: bigint;\n amount1: bigint;\n}\n\n/**\n * Read a user's per-pool in-flight balances on a source chain.\n *\n * Resolves the periphery pool address via\n * `getPeripheryDetailsByKernelPoolAndChainId` (no hardcoded addresses)\n * and calls `PeripheryPool.usersData(user)` which returns\n * `(uint256 amount0, uint256 amount1)`.\n *\n * Replaces the previous `readEscrowBalance(chain, user, token)` stub,\n * whose `(user, token)` keying did not match any available ABI view —\n * escrow state is keyed per-(pool, user), not per-(user, token).\n */\nexport async function readUserPoolBalances(\n chain: CHAIN,\n kernelPool: `0x${string}`,\n user: `0x${string}`,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<UserPoolBalances> {\n const { mode: baseMode } = normalizeMode(mode);\n const details = getPeripheryDetailsByKernelPoolAndChainId(\n kernelPool,\n chain as EvmChain,\n baseMode,\n );\n if (!details) {\n throw new EvmReadError(\n \"readUserPoolBalances\",\n `no periphery entry for kernelPool=${kernelPool} chain=${chain} mode=${baseMode}`,\n );\n }\n const c = resolveClient(chain, mode, client);\n try {\n const raw = (await c.readContract({\n address: details.address,\n abi: PeripheryPoolABI,\n functionName: \"usersData\",\n args: [user],\n })) as unknown;\n // `usersData` returns `(uint256 amount0, uint256 amount1)`.\n // Viem decodes tuples with all-named outputs as a positional tuple;\n // handle both the positional and (older) object shapes defensively.\n if (Array.isArray(raw)) {\n const tuple = raw as unknown as readonly [bigint, bigint];\n return { amount0: tuple[0], amount1: tuple[1] };\n }\n const asObject = raw as { amount0: bigint; amount1: bigint };\n return { amount0: asObject.amount0, amount1: asObject.amount1 };\n } catch (err) {\n throw wrapReadError(err, \"readUserPoolBalances\");\n }\n}\n","import type { Address, Hex, WalletClient } from \"viem\";\nimport type { CHAIN, EnvModeWithConfig } from \"@skate-org/amm-core-v2\";\nimport { EvmWriteError, wrapWriteError } from \"../errors\";\n\n/**\n * Pre-built source-chain transaction payload accepted by\n * {@link submitAction}.\n *\n * The SDK does **not** fabricate calldata in Group 6 — callers build the\n * payload (e.g. from a quote's `serializedCall`) and this submitter only\n * broadcasts it. This keeps the SDK decoupled from any off-chain\n * routing/quote surface.\n */\nexport type SubmitActionParams = {\n /** Source-chain id the wallet must be connected to. */\n chain: CHAIN;\n /** Destination address of the broadcast tx. */\n to: Address;\n /** Pre-encoded calldata. */\n data: Hex;\n /** Native-value payable amount; defaults to `0n`. */\n value?: bigint;\n};\n\n/**\n * Broadcast a pre-built periphery action tx from the caller's\n * `WalletClient`.\n *\n * Guarantees:\n * - Throws {@link EvmWriteError} immediately if\n * `wallet.chain?.id !== params.chain` — no RPC call is made.\n * - Throws {@link EvmWriteError} if `wallet.account` is not set.\n * - Forwards the payload to `wallet.sendTransaction` and returns the\n * resulting tx hash.\n * - Wraps any thrown viem write-path error\n * (`TransactionExecutionError`, `UserRejectedRequestError`,\n * `ChainMismatchError`, …) into an {@link EvmWriteError} via\n * {@link wrapWriteError}.\n *\n * The `mode` parameter is currently unused at runtime; it is accepted for\n * API symmetry with the readers and as a forward-compat hook for a future\n * mode-specific submission policy (e.g. DEV-only simulation, staging\n * retries). The `_` prefix marks it unused for the TypeScript checker.\n *\n * Non-goals (per plan guardrails):\n * - Does NOT sign — the caller brings a `WalletClient` wired to their\n * signer.\n * - Does NOT switch chains — callers are responsible for\n * `wallet.switchChain(...)`.\n * - Does NOT retry or manage nonces — delegated to the caller's wallet.\n */\nexport async function submitAction(\n wallet: WalletClient,\n params: SubmitActionParams,\n _mode: EnvModeWithConfig,\n): Promise<Hex> {\n if (wallet.chain?.id !== params.chain) {\n throw new EvmWriteError(\n \"submitAction\",\n `wallet chain ${wallet.chain?.id ?? \"undefined\"} != params.chain ${params.chain}`,\n );\n }\n\n try {\n const account = wallet.account;\n if (!account) {\n throw new EvmWriteError(\n \"submitAction\",\n \"wallet has no account; callers must provide a wallet with wallet.account set\",\n );\n }\n return await wallet.sendTransaction({\n to: params.to,\n data: params.data,\n value: params.value ?? 0n,\n chain: wallet.chain,\n account,\n });\n } catch (err) {\n // Preserve our own pre-flight guards verbatim — they are already\n // EvmWriteError instances and don't need re-wrapping.\n if (err instanceof EvmWriteError) throw err;\n throw wrapWriteError(err, \"submitAction\");\n }\n}\n\n/**\n * Broadcast a periphery *swap* action — thin wrapper around\n * {@link submitAction} that re-labels any unknown error as `submitSwap` to\n * aid log-line triage. Behaviourally identical to `submitAction`; shares\n * its pre-flight guards.\n */\nexport async function submitSwap(\n wallet: WalletClient,\n params: SubmitActionParams,\n mode: EnvModeWithConfig,\n): Promise<Hex> {\n try {\n return await submitAction(wallet, params, mode);\n } catch (err) {\n if (err instanceof EvmWriteError) throw err;\n throw wrapWriteError(err, \"submitSwap\");\n }\n}\n\n/**\n * Broadcast a periphery *approval* action (ERC-20 approve to the source\n * chain's periphery contract) — thin wrapper around {@link submitAction}.\n * See {@link submitSwap} for labeling rationale.\n */\nexport async function submitApproval(\n wallet: WalletClient,\n params: SubmitActionParams,\n mode: EnvModeWithConfig,\n): Promise<Hex> {\n try {\n return await submitAction(wallet, params, mode);\n } catch (err) {\n if (err instanceof EvmWriteError) throw err;\n throw wrapWriteError(err, \"submitApproval\");\n }\n}\n","import { decodeEventLog, type Log } from \"viem\";\nimport { KernelEventEmitterABI } from \"@skate-org/amm-bindings\";\nimport { EvmReadError } from \"../errors\";\n\n/**\n * Event names emitted by the Skate kernel's `KernelEventEmitter`, sourced\n * directly from `@skate-org/amm-bindings`.\n */\nexport type KernelEventName =\n | \"Burn\"\n | \"Collect\"\n | \"CollectProtocol\"\n | \"IncreaseObservationCardinalityNext\"\n | \"Initialize\"\n | \"Mint\"\n | \"PeripheryPoolAdded\"\n | \"PeripheryPoolChanged\"\n | \"PoolCreated\"\n | \"PoolDescriptionUpdated\"\n | \"SetFeeProtocol\"\n | \"Swap\";\n\n/** Exhaustive list of known kernel event names — same values as {@link KernelEventName}. */\nexport const KERNEL_EVENT_NAMES: readonly KernelEventName[] = [\n \"Burn\",\n \"Collect\",\n \"CollectProtocol\",\n \"IncreaseObservationCardinalityNext\",\n \"Initialize\",\n \"Mint\",\n \"PeripheryPoolAdded\",\n \"PeripheryPoolChanged\",\n \"PoolCreated\",\n \"PoolDescriptionUpdated\",\n \"SetFeeProtocol\",\n \"Swap\",\n];\n\n/**\n * A decoded kernel event — the event name, its named args, and the original\n * viem `Log` for context (tx hash, block number, etc.).\n */\nexport interface KernelParsedEvent {\n eventName: KernelEventName;\n args: Record<string, unknown>;\n log: Log;\n}\n\n/**\n * Decode a viem `Log` emitted by the Skate kernel's `KernelEventEmitter`.\n *\n * Throws {@link EvmReadError} if the log's topic0 is not a known kernel event\n * or if ABI decoding fails.\n */\nexport function parseKernelEventLog(log: Log): KernelParsedEvent {\n try {\n const decoded = decodeEventLog({\n abi: KernelEventEmitterABI,\n data: log.data,\n topics: log.topics,\n });\n return {\n eventName: decoded.eventName as KernelEventName,\n args: (decoded.args ?? {}) as Record<string, unknown>,\n log,\n };\n } catch (err) {\n const message = (err as { shortMessage?: string; message?: string })\n .shortMessage ??\n (err as { message?: string }).message ??\n String(err);\n throw new EvmReadError(\n \"parseKernelEventLog\",\n `failed to decode log: ${message}`,\n { cause: err as Error },\n );\n }\n}\n","import { decodeEventLog, type Log } from \"viem\";\nimport { PeripheryEventEmitterABI } from \"@skate-org/amm-bindings\";\nimport { EvmReadError } from \"../errors\";\n\n/**\n * Event names emitted by `PeripheryEventEmitter` on the source chain.\n */\nexport type PeripheryEventName =\n | \"AmountSettled\"\n | \"Burned\"\n | \"LiquidityDecreased\"\n | \"LiquidityIncreased\"\n | \"MintSettled\"\n | \"Minted\"\n | \"PoolCreated\"\n | \"PoolDeployed\"\n | \"Swapped\"\n | \"TransferredTo\";\n\n/** Exhaustive list of known periphery event names. */\nexport const PERIPHERY_EVENT_NAMES: readonly PeripheryEventName[] = [\n \"AmountSettled\",\n \"Burned\",\n \"LiquidityDecreased\",\n \"LiquidityIncreased\",\n \"MintSettled\",\n \"Minted\",\n \"PoolCreated\",\n \"PoolDeployed\",\n \"Swapped\",\n \"TransferredTo\",\n];\n\n/** A decoded periphery event — name, named args, and the original viem `Log`. */\nexport interface PeripheryParsedEvent {\n eventName: PeripheryEventName;\n args: Record<string, unknown>;\n log: Log;\n}\n\n/**\n * Decode a viem `Log` emitted by `PeripheryEventEmitter` on a source chain.\n *\n * Throws {@link EvmReadError} if the log's topic0 is not a known periphery\n * event or if ABI decoding fails.\n */\nexport function parsePeripheryEventLog(log: Log): PeripheryParsedEvent {\n try {\n const decoded = decodeEventLog({\n abi: PeripheryEventEmitterABI,\n data: log.data,\n topics: log.topics,\n });\n return {\n eventName: decoded.eventName as PeripheryEventName,\n args: (decoded.args ?? {}) as Record<string, unknown>,\n log,\n };\n } catch (err) {\n const message = (err as { shortMessage?: string; message?: string })\n .shortMessage ??\n (err as { message?: string }).message ??\n String(err);\n throw new EvmReadError(\n \"parsePeripheryEventLog\",\n `failed to decode log: ${message}`,\n { cause: err as Error },\n );\n }\n}\n","import type { Address, Log, PublicClient } from \"viem\";\nimport {\n KernelEventEmitterABI,\n PeripheryEventEmitterABI,\n} from \"@skate-org/amm-bindings\";\nimport {\n parseKernelEventLog,\n type KernelParsedEvent,\n} from \"./kernel\";\nimport {\n parsePeripheryEventLog,\n type PeripheryParsedEvent,\n} from \"./periphery\";\n\nexport interface EventSubscriptionOptions<E> {\n /** Called for each decoded event. */\n onEvent: (event: E) => void;\n /** Called when a log fails to decode (subscription stays alive). */\n onError?: (err: unknown) => void;\n}\n\n/**\n * Subscribe to kernel events emitted by the `KernelEventEmitter` contract\n * at `address`. Returns an unsubscribe function.\n *\n * Decode failures are surfaced via `opts.onError` (if provided) rather than\n * throwing — the subscription continues.\n */\nexport function watchKernelEvents(\n client: PublicClient,\n address: Address,\n opts: EventSubscriptionOptions<KernelParsedEvent>,\n): () => void {\n return client.watchContractEvent({\n abi: KernelEventEmitterABI,\n address,\n onLogs: (logs: Log[]) => {\n for (const log of logs) {\n try {\n opts.onEvent(parseKernelEventLog(log));\n } catch (err) {\n opts.onError?.(err);\n }\n }\n },\n });\n}\n\n/**\n * Subscribe to periphery events emitted by `PeripheryEventEmitter` at\n * `address` on the source chain the `client` is connected to.\n */\nexport function watchPeripheryEvents(\n client: PublicClient,\n address: Address,\n opts: EventSubscriptionOptions<PeripheryParsedEvent>,\n): () => void {\n return client.watchContractEvent({\n abi: PeripheryEventEmitterABI,\n address,\n onLogs: (logs: Log[]) => {\n for (const log of logs) {\n try {\n opts.onEvent(parsePeripheryEventLog(log));\n } catch (err) {\n opts.onError?.(err);\n }\n }\n },\n });\n}\n"],"mappings":"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","names":["import_amm_core_v2","import_amm_core_v2","import_amm_bindings","import_amm_core_v2","resolveClient","import_viem","import_amm_bindings","import_viem","import_amm_bindings","import_amm_bindings"]}
package/dist/index.d.cts CHANGED
@@ -1,7 +1,6 @@
1
1
  export * from "./chain-clients";
2
2
  export * from "./devConfig";
3
3
  export { EvmReadError, EvmWriteError } from "./errors";
4
- export * from "./math";
5
4
  export * from "./kernel";
6
5
  export * from "./periphery";
7
6
  export * from "./events";
package/dist/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  export * from "./chain-clients";
2
2
  export * from "./devConfig";
3
3
  export { EvmReadError, EvmWriteError } from "./errors";
4
- export * from "./math";
5
4
  export * from "./kernel";
6
5
  export * from "./periphery";
7
6
  export * from "./events";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}