@skate-org/amm-evm-v2 2.0.0-alpha.7 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/index.cjs +0 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @skate-org/amm-evm-v2
|
|
2
2
|
|
|
3
|
+
## 2.0.0-beta.0 — 2026-05-07
|
|
4
|
+
|
|
5
|
+
First **beta**. Promoted under the `beta` dist-tag; `latest` stays at
|
|
6
|
+
`1.0.0` (v1 line) per the policy in `CLAUDE.md`. **Loose beta** —
|
|
7
|
+
documented breaking changes are still allowed within `2.0.0-beta.x`;
|
|
8
|
+
`2.0.0` final is the strict surface freeze.
|
|
9
|
+
|
|
10
|
+
**Breaking — internal-leak surface pull.**
|
|
11
|
+
|
|
12
|
+
- `DEFAULT_DEV_API_ENDPOINT` is no longer re-exported from the package
|
|
13
|
+
barrel. It was `createDevConfig`'s private default value and
|
|
14
|
+
duplicated the canonical URL in `@skate-org/amm-api-v2`. Use
|
|
15
|
+
`createDevConfig({...})` (which still accepts a custom
|
|
16
|
+
`apiEndpoint`); the previously-public string was never needed.
|
|
17
|
+
|
|
18
|
+
Surface count: 28 → 27. See `STABILITY.md` (repo root) for the full
|
|
19
|
+
classification.
|
|
20
|
+
|
|
21
|
+
## 2.0.0-alpha.8 — 2026-05-07
|
|
22
|
+
|
|
23
|
+
Lockstep bump — paired with the api `streamSwapQuote` going live as a
|
|
24
|
+
polling stub for the deferred WebSocket. This package's source is
|
|
25
|
+
unchanged versus `2.0.0-alpha.7`.
|
|
26
|
+
|
|
3
27
|
## 2.0.0-alpha.7 — 2026-05-07
|
|
4
28
|
|
|
5
29
|
Lockstep bump — paired with the api action-by-user clients, polling
|
package/dist/index.cjs
CHANGED
|
@@ -20,7 +20,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
-
DEFAULT_DEV_API_ENDPOINT: () => DEFAULT_DEV_API_ENDPOINT,
|
|
24
23
|
EvmReadError: () => EvmReadError,
|
|
25
24
|
EvmWriteError: () => EvmWriteError,
|
|
26
25
|
KERNEL_EVENT_NAMES: () => KERNEL_EVENT_NAMES,
|
|
@@ -695,7 +694,6 @@ function watchPeripheryEvents(client, address, opts) {
|
|
|
695
694
|
}
|
|
696
695
|
// Annotate the CommonJS export names for ESM import in node:
|
|
697
696
|
0 && (module.exports = {
|
|
698
|
-
DEFAULT_DEV_API_ENDPOINT,
|
|
699
697
|
EvmReadError,
|
|
700
698
|
EvmWriteError,
|
|
701
699
|
KERNEL_EVENT_NAMES,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/chain-clients.ts","../src/devConfig.ts","../src/errors.ts","../src/kernel/reader.ts","../src/kernel/_client.ts","../src/kernel/tickBitmap.ts","../src/kernel/lens.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 KernelChain,\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 kernel chain for `mode`.\n *\n * Today every env (`DEV` / `STAGING` / `PRODUCTION`) resolves to MegaETH —\n * see `KERNEL_CHAIN_BY_MODE` in `@skate-org/amm-core-v2`. Pointing a future\n * env at a different kernel chain is a one-line edit there; this factory\n * reads from that mapping so client + address tables stay in sync.\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 const { mode: baseMode } = normalizeMode(mode);\n const kernelChainId = KernelChain(baseMode);\n const chainDef = chainDefFor(kernelChainId);\n if (!chainDef) {\n throw new Error(\n `getKernelPublicClient: no chain definition registered for kernel chain ${kernelChainId} ` +\n `(mode=${baseMode}); update chainDefFor() in chain-clients.ts to support it.`,\n );\n }\n return createPublicClient({\n chain: chainDef,\n transport: transport ?? http(resolveRpcUrl(kernelChainId, 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 { wrapReadError } from \"../errors\";\nimport { resolveKernelClient } from \"./_client\";\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 * 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 = resolveKernelClient(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 = resolveKernelClient(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 = resolveKernelClient(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 = resolveKernelClient(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 = resolveKernelClient(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","import type { PublicClient } from \"viem\";\nimport type { EnvModeWithConfig } from \"@skate-org/amm-core-v2\";\nimport { getKernelPublicClient } from \"../chain-clients\";\n\n/**\n * Return the caller-provided client if present, otherwise build a fresh\n * MegaETH kernel client for the given mode. Shared by readers + lens\n * helpers; intentionally unexported from the package barrel.\n */\nexport function resolveKernelClient(\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): PublicClient {\n return client ?? getKernelPublicClient(mode);\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 { KernelManagerABI } from \"@skate-org/amm-bindings\";\nimport {\n KernelManagerAddress,\n normalizeMode,\n type EnvModeWithConfig,\n} from \"@skate-org/amm-core-v2\";\nimport { wrapReadError } from \"../errors\";\nimport { resolveKernelClient } from \"./_client\";\n\n/**\n * Kernel lens (simulate) helpers — wrap KernelManager's `lens*` functions as\n * static-call simulations. Lens functions are marked nonpayable in the ABI,\n * but viem's `simulateContract` evaluates them with `eth_call`, so they\n * reuse the same client + RPC plumbing as the readers and never produce a\n * transaction.\n *\n * Errors funnel through `wrapReadError`: lens calls share the read-path\n * error model (revert reasons + RPC failures), and tagging them as \"writes\"\n * would be misleading since no state changes.\n */\n\nexport interface SimulateSwapParams {\n /** Kernel-pool address (EVM) */\n pool: `0x${string}`;\n /** Recipient encoded as bytes32 (use `toBytes32Address` for cross-VM) */\n recipient: `0x${string}`;\n zeroForOne: boolean;\n /** Positive = exactInput, negative = exactOutput, per Uniswap v3 convention */\n amountSpecified: bigint;\n sqrtPriceLimitX96: bigint;\n}\n\nexport interface SimulateSwapResult {\n amount0: bigint;\n amount1: bigint;\n sqrtPriceX96After: bigint;\n returnData: `0x${string}`;\n}\n\nexport async function simulateSwap(\n params: SimulateSwapParams,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<SimulateSwapResult> {\n const { mode: baseMode } = normalizeMode(mode);\n const c = resolveKernelClient(mode, client);\n try {\n const out = await c.simulateContract({\n address: KernelManagerAddress(baseMode),\n abi: KernelManagerABI,\n functionName: \"lensSwap\",\n args: [\n params.pool,\n params.recipient,\n params.zeroForOne,\n params.amountSpecified,\n params.sqrtPriceLimitX96,\n ],\n });\n const [amount0, amount1, sqrtPriceX96After, returnData] = out.result as readonly [\n bigint,\n bigint,\n bigint,\n `0x${string}`,\n ];\n return { amount0, amount1, sqrtPriceX96After, returnData };\n } catch (err) {\n throw wrapReadError(err, \"simulateSwap\");\n }\n}\n\nexport interface SimulateMintParams {\n pool: `0x${string}`;\n /** Recipient encoded as bytes32 */\n recipient: `0x${string}`;\n tickLower: number;\n tickUpper: number;\n amount0: bigint;\n amount1: bigint;\n /** Caller-supplied callback data (passed to `IKernelMintCallback`) */\n data: `0x${string}`;\n}\n\nexport interface SimulateMintResult {\n amount0Used: bigint;\n amount1Used: bigint;\n liquidityAmount: bigint;\n returnData: `0x${string}`;\n}\n\nexport async function simulateMint(\n params: SimulateMintParams,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<SimulateMintResult> {\n const { mode: baseMode } = normalizeMode(mode);\n const c = resolveKernelClient(mode, client);\n try {\n const out = await c.simulateContract({\n address: KernelManagerAddress(baseMode),\n abi: KernelManagerABI,\n functionName: \"lensMint\",\n args: [\n params.pool,\n params.recipient,\n params.tickLower,\n params.tickUpper,\n params.amount0,\n params.amount1,\n params.data,\n ],\n });\n const [amount0Used, amount1Used, liquidityAmount, returnData] = out.result as readonly [\n bigint,\n bigint,\n bigint,\n `0x${string}`,\n ];\n return { amount0Used, amount1Used, liquidityAmount, returnData };\n } catch (err) {\n throw wrapReadError(err, \"simulateMint\");\n }\n}\n\nexport interface SimulateBurnParams {\n pool: `0x${string}`;\n /** Recipient encoded as bytes32 */\n recipient: `0x${string}`;\n tickLower: number;\n tickUpper: number;\n /** Liquidity amount to burn (uint128). */\n amount: bigint;\n}\n\nexport interface SimulateBurnResult {\n amount0: bigint;\n amount1: bigint;\n returnData: `0x${string}`;\n}\n\nexport async function simulateBurn(\n params: SimulateBurnParams,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<SimulateBurnResult> {\n const { mode: baseMode } = normalizeMode(mode);\n const c = resolveKernelClient(mode, client);\n try {\n const out = await c.simulateContract({\n address: KernelManagerAddress(baseMode),\n abi: KernelManagerABI,\n functionName: \"lensBurn\",\n args: [\n params.pool,\n params.recipient,\n params.tickLower,\n params.tickUpper,\n params.amount,\n ],\n });\n const [amount0, amount1, returnData] = out.result as readonly [\n bigint,\n bigint,\n `0x${string}`,\n ];\n return { amount0, amount1, returnData };\n } catch (err) {\n throw wrapReadError(err, \"simulateBurn\");\n }\n}\n\nexport interface SimulateDecreaseLiquidityParams {\n /** NFT position id (v2 positions). */\n tokenId: bigint;\n /** Liquidity amount to remove (uint128). */\n liquidity: bigint;\n}\n\nexport interface SimulateDecreaseLiquidityResult {\n amount0: bigint;\n amount1: bigint;\n returnData: `0x${string}`;\n}\n\nexport async function simulateDecreaseLiquidity(\n params: SimulateDecreaseLiquidityParams,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<SimulateDecreaseLiquidityResult> {\n const { mode: baseMode } = normalizeMode(mode);\n const c = resolveKernelClient(mode, client);\n try {\n const out = await c.simulateContract({\n address: KernelManagerAddress(baseMode),\n abi: KernelManagerABI,\n functionName: \"lensDecreaseLiquidity\",\n args: [params.tokenId, params.liquidity],\n });\n const [amount0, amount1, returnData] = out.result as readonly [\n bigint,\n bigint,\n `0x${string}`,\n ];\n return { amount0, amount1, returnData };\n } catch (err) {\n throw wrapReadError(err, \"simulateDecreaseLiquidity\");\n }\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","import_amm_bindings","import_amm_core_v2","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/_client.ts","../src/kernel/tickBitmap.ts","../src/kernel/lens.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\";\n// `DEFAULT_DEV_API_ENDPOINT` is intentionally not re-exported — it's\n// `createDevConfig`'s private default value, duplicates the canonical\n// URL in `api`, and shouldn't be part of the evm public surface.\nexport { createDevConfig } 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 KernelChain,\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 kernel chain for `mode`.\n *\n * Today every env (`DEV` / `STAGING` / `PRODUCTION`) resolves to MegaETH —\n * see `KERNEL_CHAIN_BY_MODE` in `@skate-org/amm-core-v2`. Pointing a future\n * env at a different kernel chain is a one-line edit there; this factory\n * reads from that mapping so client + address tables stay in sync.\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 const { mode: baseMode } = normalizeMode(mode);\n const kernelChainId = KernelChain(baseMode);\n const chainDef = chainDefFor(kernelChainId);\n if (!chainDef) {\n throw new Error(\n `getKernelPublicClient: no chain definition registered for kernel chain ${kernelChainId} ` +\n `(mode=${baseMode}); update chainDefFor() in chain-clients.ts to support it.`,\n );\n }\n return createPublicClient({\n chain: chainDef,\n transport: transport ?? http(resolveRpcUrl(kernelChainId, 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 { wrapReadError } from \"../errors\";\nimport { resolveKernelClient } from \"./_client\";\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 * 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 = resolveKernelClient(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 = resolveKernelClient(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 = resolveKernelClient(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 = resolveKernelClient(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 = resolveKernelClient(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","import type { PublicClient } from \"viem\";\nimport type { EnvModeWithConfig } from \"@skate-org/amm-core-v2\";\nimport { getKernelPublicClient } from \"../chain-clients\";\n\n/**\n * Return the caller-provided client if present, otherwise build a fresh\n * MegaETH kernel client for the given mode. Shared by readers + lens\n * helpers; intentionally unexported from the package barrel.\n */\nexport function resolveKernelClient(\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): PublicClient {\n return client ?? getKernelPublicClient(mode);\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 { KernelManagerABI } from \"@skate-org/amm-bindings\";\nimport {\n KernelManagerAddress,\n normalizeMode,\n type EnvModeWithConfig,\n} from \"@skate-org/amm-core-v2\";\nimport { wrapReadError } from \"../errors\";\nimport { resolveKernelClient } from \"./_client\";\n\n/**\n * Kernel lens (simulate) helpers — wrap KernelManager's `lens*` functions as\n * static-call simulations. Lens functions are marked nonpayable in the ABI,\n * but viem's `simulateContract` evaluates them with `eth_call`, so they\n * reuse the same client + RPC plumbing as the readers and never produce a\n * transaction.\n *\n * Errors funnel through `wrapReadError`: lens calls share the read-path\n * error model (revert reasons + RPC failures), and tagging them as \"writes\"\n * would be misleading since no state changes.\n */\n\nexport interface SimulateSwapParams {\n /** Kernel-pool address (EVM) */\n pool: `0x${string}`;\n /** Recipient encoded as bytes32 (use `toBytes32Address` for cross-VM) */\n recipient: `0x${string}`;\n zeroForOne: boolean;\n /** Positive = exactInput, negative = exactOutput, per Uniswap v3 convention */\n amountSpecified: bigint;\n sqrtPriceLimitX96: bigint;\n}\n\nexport interface SimulateSwapResult {\n amount0: bigint;\n amount1: bigint;\n sqrtPriceX96After: bigint;\n returnData: `0x${string}`;\n}\n\nexport async function simulateSwap(\n params: SimulateSwapParams,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<SimulateSwapResult> {\n const { mode: baseMode } = normalizeMode(mode);\n const c = resolveKernelClient(mode, client);\n try {\n const out = await c.simulateContract({\n address: KernelManagerAddress(baseMode),\n abi: KernelManagerABI,\n functionName: \"lensSwap\",\n args: [\n params.pool,\n params.recipient,\n params.zeroForOne,\n params.amountSpecified,\n params.sqrtPriceLimitX96,\n ],\n });\n const [amount0, amount1, sqrtPriceX96After, returnData] = out.result as readonly [\n bigint,\n bigint,\n bigint,\n `0x${string}`,\n ];\n return { amount0, amount1, sqrtPriceX96After, returnData };\n } catch (err) {\n throw wrapReadError(err, \"simulateSwap\");\n }\n}\n\nexport interface SimulateMintParams {\n pool: `0x${string}`;\n /** Recipient encoded as bytes32 */\n recipient: `0x${string}`;\n tickLower: number;\n tickUpper: number;\n amount0: bigint;\n amount1: bigint;\n /** Caller-supplied callback data (passed to `IKernelMintCallback`) */\n data: `0x${string}`;\n}\n\nexport interface SimulateMintResult {\n amount0Used: bigint;\n amount1Used: bigint;\n liquidityAmount: bigint;\n returnData: `0x${string}`;\n}\n\nexport async function simulateMint(\n params: SimulateMintParams,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<SimulateMintResult> {\n const { mode: baseMode } = normalizeMode(mode);\n const c = resolveKernelClient(mode, client);\n try {\n const out = await c.simulateContract({\n address: KernelManagerAddress(baseMode),\n abi: KernelManagerABI,\n functionName: \"lensMint\",\n args: [\n params.pool,\n params.recipient,\n params.tickLower,\n params.tickUpper,\n params.amount0,\n params.amount1,\n params.data,\n ],\n });\n const [amount0Used, amount1Used, liquidityAmount, returnData] = out.result as readonly [\n bigint,\n bigint,\n bigint,\n `0x${string}`,\n ];\n return { amount0Used, amount1Used, liquidityAmount, returnData };\n } catch (err) {\n throw wrapReadError(err, \"simulateMint\");\n }\n}\n\nexport interface SimulateBurnParams {\n pool: `0x${string}`;\n /** Recipient encoded as bytes32 */\n recipient: `0x${string}`;\n tickLower: number;\n tickUpper: number;\n /** Liquidity amount to burn (uint128). */\n amount: bigint;\n}\n\nexport interface SimulateBurnResult {\n amount0: bigint;\n amount1: bigint;\n returnData: `0x${string}`;\n}\n\nexport async function simulateBurn(\n params: SimulateBurnParams,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<SimulateBurnResult> {\n const { mode: baseMode } = normalizeMode(mode);\n const c = resolveKernelClient(mode, client);\n try {\n const out = await c.simulateContract({\n address: KernelManagerAddress(baseMode),\n abi: KernelManagerABI,\n functionName: \"lensBurn\",\n args: [\n params.pool,\n params.recipient,\n params.tickLower,\n params.tickUpper,\n params.amount,\n ],\n });\n const [amount0, amount1, returnData] = out.result as readonly [\n bigint,\n bigint,\n `0x${string}`,\n ];\n return { amount0, amount1, returnData };\n } catch (err) {\n throw wrapReadError(err, \"simulateBurn\");\n }\n}\n\nexport interface SimulateDecreaseLiquidityParams {\n /** NFT position id (v2 positions). */\n tokenId: bigint;\n /** Liquidity amount to remove (uint128). */\n liquidity: bigint;\n}\n\nexport interface SimulateDecreaseLiquidityResult {\n amount0: bigint;\n amount1: bigint;\n returnData: `0x${string}`;\n}\n\nexport async function simulateDecreaseLiquidity(\n params: SimulateDecreaseLiquidityParams,\n mode: EnvModeWithConfig,\n client?: PublicClient,\n): Promise<SimulateDecreaseLiquidityResult> {\n const { mode: baseMode } = normalizeMode(mode);\n const c = resolveKernelClient(mode, client);\n try {\n const out = await c.simulateContract({\n address: KernelManagerAddress(baseMode),\n abi: KernelManagerABI,\n functionName: \"lensDecreaseLiquidity\",\n args: [params.tokenId, params.liquidity],\n });\n const [amount0, amount1, returnData] = out.result as readonly [\n bigint,\n bigint,\n `0x${string}`,\n ];\n return { amount0, amount1, returnData };\n } catch (err) {\n throw wrapReadError(err, \"simulateDecreaseLiquidity\");\n }\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","import_amm_bindings","import_amm_core_v2","import_viem","import_amm_bindings","import_viem","import_amm_bindings","import_amm_bindings"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAIhC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skate-org/amm-evm-v2",
|
|
3
|
-
"version": "2.0.0-
|
|
3
|
+
"version": "2.0.0-beta.0",
|
|
4
4
|
"description": "Skate AMM v2 SDK — EVM clients, kernel/periphery readers, uniswap-v3 math, submitters",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@skate-org/amm-bindings": "^1.0.0",
|
|
28
28
|
"viem": "^2.21.0",
|
|
29
|
-
"@skate-org/amm-core-v2": "2.0.0-
|
|
29
|
+
"@skate-org/amm-core-v2": "2.0.0-beta.0"
|
|
30
30
|
},
|
|
31
31
|
"publishConfig": {
|
|
32
32
|
"access": "public",
|