timelock-sdk 0.0.194 → 0.0.196
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/dist/{client-PzQKkikV.d.ts → client-3oF5mDiF.d.ts} +604 -604
- package/dist/{client-COGIhgfu.d.cts → client-BLs46E49.d.cts} +159 -159
- package/dist/client.cjs +2 -2
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +2 -2
- package/dist/client.js.map +1 -1
- package/dist/{optionUtils-BdSKsVVS.js → optionUtils-CR8qGvTh.js} +15 -10
- package/dist/optionUtils-CR8qGvTh.js.map +1 -0
- package/dist/{optionUtils-DfDohN6H.cjs → optionUtils-DerSn_Ua.cjs} +15 -10
- package/dist/optionUtils-DerSn_Ua.cjs.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.d.cts +1 -1
- package/dist/package.d.ts +1 -1
- package/dist/package.js +1 -1
- package/package.json +1 -1
- package/dist/optionUtils-BdSKsVVS.js.map +0 -1
- package/dist/optionUtils-DfDohN6H.cjs.map +0 -1
|
@@ -154,6 +154,8 @@ const getCurrentPrice = async (poolAddr, tokenAddr) => {
|
|
|
154
154
|
|
|
155
155
|
//#endregion
|
|
156
156
|
//#region src/lib/liquidityUtils.ts
|
|
157
|
+
Big.DP = 155;
|
|
158
|
+
Big.RM = Big.roundDown;
|
|
157
159
|
const PRICE_PRECISION = BigInt(2) ** BigInt(128);
|
|
158
160
|
const getPriceAtSqrtPriceX96 = (sqrtPriceX96) => {
|
|
159
161
|
return sqrtPriceX96 * sqrtPriceX96 * PRICE_PRECISION / BigInt(2 ** 192);
|
|
@@ -273,47 +275,50 @@ const liquiditiesToAmounts = (liquidities, startTick, price, tickSpacing) => {
|
|
|
273
275
|
const zero = {
|
|
274
276
|
scaled: 0n,
|
|
275
277
|
unscaled: Big(0),
|
|
276
|
-
|
|
278
|
+
scalingFactor: BigInt(0xde0b6b3a7640000),
|
|
277
279
|
formatted: "0"
|
|
278
280
|
};
|
|
279
281
|
const wrapAmount = (scaled, decimals) => {
|
|
282
|
+
const scalingFactor = BigInt(Big(10).pow(decimals).toFixed(0));
|
|
280
283
|
const unscaled = unscaleAmount(scaled, decimals);
|
|
281
284
|
return {
|
|
282
285
|
scaled,
|
|
283
286
|
unscaled,
|
|
284
|
-
|
|
287
|
+
scalingFactor,
|
|
285
288
|
formatted: formatAmount(unscaled)
|
|
286
289
|
};
|
|
287
290
|
};
|
|
288
291
|
const wrapAmountUnscaled = (unscaled, decimals) => {
|
|
289
292
|
unscaled = Big(unscaled);
|
|
293
|
+
const scalingFactor = BigInt(Big(10).pow(decimals).toFixed(0));
|
|
290
294
|
const scaled = scaleAmount(unscaled, decimals);
|
|
291
295
|
const formatted = formatAmount(unscaled);
|
|
292
296
|
return {
|
|
293
297
|
scaled,
|
|
294
298
|
unscaled,
|
|
295
|
-
|
|
299
|
+
scalingFactor,
|
|
296
300
|
formatted
|
|
297
301
|
};
|
|
298
302
|
};
|
|
299
303
|
const wrapPrice = (scaled, decimals0, decimals1) => {
|
|
304
|
+
const scalingFactor = BigInt(Big(PRICE_PRECISION.toString()).pow(2).mul(Big(10).pow(decimals1)).div(Big(10).pow(decimals0)).toFixed(0));
|
|
300
305
|
const unscaled = unscalePrice(scaled, decimals0, decimals1);
|
|
301
|
-
const formatted = formatAmount(unscaled);
|
|
302
306
|
return {
|
|
303
307
|
scaled,
|
|
304
308
|
unscaled,
|
|
305
|
-
|
|
306
|
-
formatted
|
|
309
|
+
scalingFactor,
|
|
310
|
+
formatted: formatAmount(unscaled)
|
|
307
311
|
};
|
|
308
312
|
};
|
|
309
313
|
const wrapPriceUnscaled = (unscaled, decimals0, decimals1) => {
|
|
310
314
|
unscaled = Big(unscaled);
|
|
315
|
+
const scalingFactor = BigInt(Big(PRICE_PRECISION.toString()).pow(2).mul(Big(10).pow(decimals1)).div(Big(10).pow(decimals0)).toFixed(0));
|
|
311
316
|
const scaled = scalePrice(unscaled, decimals0, decimals1);
|
|
312
317
|
const formatted = formatAmount(unscaled);
|
|
313
318
|
return {
|
|
314
319
|
scaled,
|
|
315
320
|
unscaled,
|
|
316
|
-
|
|
321
|
+
scalingFactor,
|
|
317
322
|
formatted
|
|
318
323
|
};
|
|
319
324
|
};
|
|
@@ -323,8 +328,8 @@ const unscaleAmount = (scaled, decimals) => {
|
|
|
323
328
|
const scaleAmount = (unscaled, decimals) => {
|
|
324
329
|
return BigInt(Big(unscaled).mul(new Big(10).pow(decimals)).round().toFixed(0));
|
|
325
330
|
};
|
|
326
|
-
const unscalePrice = (scaled, decimals0, decimals1
|
|
327
|
-
return new Big(scaled.toString()).mul(new Big(10).pow(decimals0)).div(new Big(10).pow(decimals1)).div(
|
|
331
|
+
const unscalePrice = (scaled, decimals0, decimals1) => {
|
|
332
|
+
return new Big(scaled.toString()).mul(new Big(10).pow(decimals0)).div(new Big(10).pow(decimals1)).div(PRICE_PRECISION.toString());
|
|
328
333
|
};
|
|
329
334
|
const scalePrice = (unscaled, decimals0, decimals1, precision = 18) => {
|
|
330
335
|
return BigInt(Big(unscaled).mul(new Big(10).pow(precision)).mul(new Big(10).pow(decimals1)).div(new Big(10).pow(decimals0)).round().toFixed(0));
|
|
@@ -376,4 +381,4 @@ const getPayoutAtPrice = (option, liquidities, price, tickSpacing, optionAssetIs
|
|
|
376
381
|
|
|
377
382
|
//#endregion
|
|
378
383
|
export { token1ToToken0AtTick as A, timelockFactories as B, liquiditiesToAmount0 as C, token0ToToken1 as D, roundTick as E, getTimelockLens as F, getTimelockMarket as I, stateViews as L, getPriceHistory as M, getErc20 as N, token0ToToken1AtTick as O, getStateView as P, swapRouters as R, getTickAtPrice as S, liquiditiesToAmounts as T, timelockLenses as V, getAmountsFromLiquidity as _, formatUSD as a, getPriceAtTick as b, scalePrice as c, wrapAmount as d, wrapAmountUnscaled as f, PRICE_PRECISION as g, zero as h, formatCondensed as i, getCurrentPrice as j, token1ToToken0 as k, unscaleAmount as l, wrapPriceUnscaled as m, getPayoutAtTick as n, formatVagueAmount as o, wrapPrice as p, formatAmount as r, scaleAmount as s, getPayoutAtPrice as t, unscalePrice as u, getNearestValidStrikeTick as v, liquiditiesToAmount1 as w, getSqrtPriceX96AtPrice as x, getPriceAtSqrtPriceX96 as y, swappers as z };
|
|
379
|
-
//# sourceMappingURL=optionUtils-
|
|
384
|
+
//# sourceMappingURL=optionUtils-CR8qGvTh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optionUtils-CR8qGvTh.js","names":["erc20Abi","swappers: Record<number, Address>","timelockLenses: Record<number, Address>","timelockFactories: Record<number, Address>","swapRouters: Record<number, Address>","stateViews: Record<number, Address>","filled: PriceDataPoint[]","lastKnownPrice: PriceDataPoint | null","zero: Amount"],"sources":["../src/lib/contracts.ts","../src/lib/price.ts","../src/lib/liquidityUtils.ts","../src/lib/numberUtils.ts","../src/lib/optionUtils.ts"],"sourcesContent":["import type {Address, Client, PublicClient, GetContractReturnType} from 'viem';\nimport {getContract} from 'viem';\nimport {baseSepolia} from 'viem/chains';\n\nimport {erc20Abi} from '~/abis/erc20';\nimport {lensAbi} from '~/abis/lens';\nimport {optionsMarketAbi} from '~/abis/optionsMarket';\nimport {statelessStateViewAbi} from '~/abis/statelessStateView';\n\nexport type TimelockMarket = GetContractReturnType<\n typeof optionsMarketAbi,\n Client,\n Address\n>;\nexport type TimelockLens = GetContractReturnType<\n typeof lensAbi,\n Client,\n Address\n>;\n\nexport type TimelockMarketData = Awaited<\n ReturnType<TimelockLens['read']['getMarketData']>\n> & {address: Address};\n\nexport const getErc20 = (address: Address, client: Client) =>\n getContract({abi: erc20Abi, address, client});\n\nexport const getTimelockMarket = (\n address: Address,\n client: Client,\n): TimelockMarket => {\n return getContract({abi: optionsMarketAbi, address, client});\n};\n\nexport const getStateView = async (client: PublicClient, address?: Address) => {\n if (!address) {\n const chainId = await client.getChainId();\n address = stateViews[chainId];\n if (!address) throw new Error(`No state view found for ${chainId}`);\n }\n return getContract({abi: statelessStateViewAbi, address, client});\n};\n\nexport const getTimelockLens = async (\n client: PublicClient,\n address?: Address,\n) => {\n if (!address) {\n const chainId = await client.getChainId();\n address = timelockLenses[chainId];\n if (!address) throw new Error(`No timelock lens found for ${chainId}`);\n }\n return getContract({abi: lensAbi, address, client});\n};\n\nexport const swappers: Record<number, Address> = {\n [baseSepolia.id]: '0xA16412db5c1Fc7e81574077913f5760d6c368Bd9',\n};\nexport const timelockLenses: Record<number, Address> = {\n [baseSepolia.id]: '0x3B8edE9d261505134A5D8D8C853e158066D13e6d',\n};\nexport const timelockFactories: Record<number, Address> = {\n [baseSepolia.id]: '0xea78d1869f78e301A18ab064b4287563974ab977',\n};\nexport const swapRouters: Record<number, Address> = {\n [baseSepolia.id]: '0x1a005FE3C05F076983F0d66a5F80CB9C61561a5b',\n};\nexport const stateViews: Record<number, Address> = {\n [baseSepolia.id]: '0x06AF24d39b8cb2100958EAAF279707Bec11160C8',\n};\n","import type {Address} from 'viem';\n\nexport interface PriceData {\n currentPrice: number;\n percentChange: number;\n poolAddr: string;\n timestamp: number;\n}\n\nexport interface PriceDataPoint {\n timestamp: Date;\n price: number;\n}\n\nexport type PriceResolution = '1m' | '5m' | '15m' | '1h' | '4h' | '1d';\n\nconst getResolutionConfig = (resolution: PriceResolution) => {\n const resolutionMap = {\n '1m': {timeframe: 'minute', aggregate: '1', seconds: 60},\n '5m': {timeframe: 'minute', aggregate: '5', seconds: 300},\n '15m': {timeframe: 'minute', aggregate: '15', seconds: 900},\n '1h': {timeframe: 'hour', aggregate: '1', seconds: 3600},\n '4h': {timeframe: 'hour', aggregate: '4', seconds: 14400},\n '1d': {timeframe: 'day', aggregate: '1', seconds: 86400},\n };\n return resolutionMap[resolution];\n};\n\nconst fillGaps = (\n prices: PriceDataPoint[],\n start: Date,\n end: Date,\n intervalMs: number,\n): PriceDataPoint[] => {\n if (prices.length === 0) return [];\n\n const priceMap = new Map<number, PriceDataPoint>();\n\n for (const point of prices) {\n const alignedTime =\n Math.floor(point.timestamp.getTime() / intervalMs) * intervalMs;\n priceMap.set(alignedTime, point);\n }\n const filled: PriceDataPoint[] = [];\n\n const actualStart =\n Math.floor(prices[0].timestamp.getTime() / intervalMs) * intervalMs;\n\n let currentTime = actualStart;\n let lastKnownPrice: PriceDataPoint | null = null;\n\n while (currentTime <= end.getTime()) {\n const existing = priceMap.get(currentTime);\n\n if (existing) {\n filled.push(existing);\n lastKnownPrice = existing;\n } else if (lastKnownPrice) {\n filled.push({\n timestamp: new Date(currentTime),\n price: lastKnownPrice.price,\n });\n }\n currentTime += intervalMs;\n }\n return filled;\n};\n\nexport const getPriceHistory = async (\n pool: Address,\n token: 0 | 1,\n resolution: PriceResolution,\n start: Date,\n end: Date,\n): Promise<PriceDataPoint[]> => {\n const network = 'monad-testnet';\n const {timeframe, aggregate, seconds} = getResolutionConfig(resolution);\n\n if (end.getTime() > Date.now()) {\n end = new Date(Date.now());\n }\n const startSecs = Math.floor(start.getTime() / 1000);\n const endSecs = Math.floor(end.getTime() / 1000);\n const diffSeconds = endSecs - startSecs;\n\n const limit = Math.min(Math.ceil(diffSeconds / seconds), 1000);\n\n const url =\n `https://api.geckoterminal.com/api/v2/networks/${network}/pools/${pool}/ohlcv/${timeframe}` +\n `?aggregate=${aggregate}` +\n `&limit=${limit}` +\n `&token=${token === 0 ? 'base' : 'quote'}` +\n '¤cy=usd' +\n `&before_timestamp=${endSecs}`;\n\n const res = await fetch(url, {headers: {Accept: 'application/json'}});\n\n if (!res.ok) {\n throw new Error(`Failed to fetch price history: ${res.statusText}`);\n }\n const data = (await res.json()) as {\n data: {\n attributes: {\n ohlcv_list: [number, number, number, number, number, number][];\n };\n };\n };\n const prices: PriceDataPoint[] = data.data.attributes.ohlcv_list\n .map(([timestamp, , , , close]) => ({\n timestamp: new Date(timestamp * 1000),\n price: close,\n }))\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n return fillGaps(prices, start, end, seconds * 1000).filter(\n point =>\n point.timestamp.getTime() / 1000 >= startSecs &&\n point.timestamp.getTime() / 1000 <= endSecs,\n );\n};\n\nexport const getCurrentPrice = async (\n poolAddr: Address,\n tokenAddr: Address,\n): Promise<PriceData> => {\n const network = 'monad-testnet';\n const geckoUrl = `https://api.geckoterminal.com/api/v2/networks/${network}/pools/${poolAddr.toLowerCase()}`;\n\n const response = await fetch(geckoUrl, {\n method: 'GET',\n headers: {Accept: 'application/json', 'User-Agent': 'TimelockTrade/1.0'},\n cache: 'no-store', // Keep no-store for real-time data\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch price data for pool ${poolAddr}`);\n }\n const data = (await response.json()) as {\n data: {\n attributes: {\n base_token_price_quote_token: string;\n quote_token_price_base_token: string;\n price_change_percentage: {h24: string};\n };\n relationships: {\n base_token: {data: {id: string; type: string}};\n quote_token: {data: {id: string; type: string}};\n };\n };\n };\n const pool = data.data.attributes;\n const relationships = data.data.relationships;\n\n const baseTokenAddr = relationships.base_token.data.id\n .split('_')[1]\n .toLowerCase();\n const quoteTokenAddr = relationships.quote_token.data.id\n .split('_')[1]\n .toLowerCase();\n\n const isBaseToken = tokenAddr.toLowerCase() === baseTokenAddr.toLowerCase();\n const isQuoteToken = tokenAddr.toLowerCase() === quoteTokenAddr.toLowerCase();\n\n if (!isBaseToken && !isQuoteToken) {\n throw new Error(`Token ${tokenAddr} is not part of pool ${poolAddr}`);\n }\n const price = isBaseToken\n ? pool.base_token_price_quote_token\n : pool.quote_token_price_base_token;\n const priceChange = pool.price_change_percentage?.h24;\n\n return {\n currentPrice: parseFloat(price || '0'),\n percentChange: parseFloat(priceChange || '0'),\n poolAddr: poolAddr,\n timestamp: Date.now(),\n };\n};\n","import {SqrtPriceMath, TickMath} from '@uniswap/v3-sdk';\nimport Big from 'big.js';\nimport JSBI from 'jsbi';\nimport type {Amount} from './numberUtils';\n\n// Set Big.js precision to handle 512-bit arithmetic\n// 155 decimal places provides ~515 bits of precision (log2(10^155) ≈ 515)\nBig.DP = 155; // Decimal places for division and sqrt operations\nBig.RM = Big.roundDown; // Round down to match Solidity's integer division behavior\n\nexport const PRICE_PRECISION = BigInt(2) ** BigInt(128);\n\nexport const getPriceAtSqrtPriceX96 = (sqrtPriceX96: bigint) => {\n const priceX192 = sqrtPriceX96 * sqrtPriceX96;\n const price = (priceX192 * PRICE_PRECISION) / BigInt(2 ** 192);\n\n return price;\n};\n\nexport const getSqrtPriceX96AtPrice = (price: bigint) => {\n const sqrtPriceX96 = JSBI.BigInt(\n new Big(price.toString())\n .mul(2 ** 192)\n .div(PRICE_PRECISION.toString())\n .sqrt()\n .toFixed(0),\n );\n return sqrtPriceX96;\n};\n\nexport const getPriceAtTick = (tick: number) => {\n const sqrtRatioX96 = BigInt(TickMath.getSqrtRatioAtTick(tick).toString());\n\n const priceX192 = sqrtRatioX96 * sqrtRatioX96;\n const price = (priceX192 * PRICE_PRECISION) / BigInt(2 ** 192);\n\n return price;\n};\n\nexport const getTickAtPrice = (price: bigint) => {\n const priceX192 = (price * BigInt(2 ** 192)) / PRICE_PRECISION;\n const sqrtPriceX96 = JSBI.BigInt(\n new Big(priceX192.toString()).sqrt().toFixed(0),\n );\n return TickMath.getTickAtSqrtRatio(sqrtPriceX96);\n};\n\nexport const getNearestValidStrikeTick = (\n optionType: 'CALL' | 'PUT',\n optionAssetIsToken0: boolean,\n tickSpacing: number,\n currentTick: number,\n strikeTick?: number,\n) => {\n strikeTick = roundTick(strikeTick ?? currentTick, tickSpacing);\n\n if (\n (optionType === 'CALL' && optionAssetIsToken0) ||\n (optionType === 'PUT' && !optionAssetIsToken0)\n ) {\n strikeTick += tickSpacing;\n }\n return strikeTick;\n};\n\nexport const roundTick = (tick: number, spacing: number) => {\n const rem = tick % spacing;\n if (rem >= 0) return tick - rem;\n return tick - rem - spacing;\n};\n\nexport const token0ToToken1 = (amount0: bigint, price: bigint | Amount) => {\n price = typeof price === 'bigint' ? price : price.scaled;\n return (amount0 * price) / PRICE_PRECISION;\n};\nexport const token1ToToken0 = (amount1: bigint, price: bigint | Amount) => {\n price = typeof price === 'bigint' ? price : price.scaled;\n return (amount1 * PRICE_PRECISION) / price;\n};\n\nexport const token0ToToken1AtTick = (amount0: bigint, tick: number) => {\n const price = getPriceAtTick(tick);\n return (amount0 * price) / PRICE_PRECISION;\n};\nexport const token1ToToken0AtTick = (amount1: bigint, tick: number) => {\n const price = getPriceAtTick(tick);\n return (amount1 * PRICE_PRECISION) / price;\n};\n\nexport const getAmountsFromLiquidity = (\n tickLower: number,\n tickUpper: number,\n liquidity: bigint,\n currentTick: number,\n): [bigint, bigint] => {\n const sqrtRatioX96 = TickMath.getSqrtRatioAtTick(currentTick);\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n let delta0 = JSBI.BigInt(0);\n let delta1 = JSBI.BigInt(0);\n\n if (currentTick < tickLower) {\n delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n } else if (currentTick >= tickUpper) {\n delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n } else {\n delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioX96,\n liquidityJSBI,\n false,\n );\n }\n return [BigInt(delta0.toString()), BigInt(delta1.toString())];\n};\n\nexport const liquiditiesToAmount0 = (\n liquidities: bigint[],\n startTick: number,\n tickSpacing: number,\n) => {\n let amount0 = BigInt(0);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n const amount0Delta = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(amount0Delta.toString());\n }\n return amount0;\n};\n\nexport const liquiditiesToAmount1 = (\n liquidities: bigint[],\n startTick: number,\n tickSpacing: number,\n) => {\n let amount1 = BigInt(0);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n const amount1Delta = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount1 += BigInt(amount1Delta.toString());\n }\n return amount1;\n};\n\nexport const liquiditiesToAmounts = (\n liquidities: bigint[],\n startTick: number,\n price: bigint,\n tickSpacing: number,\n) => {\n let amount0 = 0n;\n let amount1 = 0n;\n\n const sqrtRatioX96 = getSqrtPriceX96AtPrice(price);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n if (JSBI.lessThanOrEqual(sqrtRatioX96, sqrtRatioAX96)) {\n const delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(delta0.toString());\n } else if (JSBI.lessThan(sqrtRatioX96, sqrtRatioBX96)) {\n const delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n const delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(delta0.toString());\n amount1 += BigInt(delta1.toString());\n } else {\n const delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount1 += BigInt(delta1.toString());\n }\n }\n return [amount0, amount1];\n};\n","import Big from 'big.js';\nimport {PRICE_PRECISION} from './liquidityUtils';\n\nexport type Amount = {\n scaled: bigint;\n unscaled: Big;\n scalingFactor: bigint;\n formatted: string;\n};\n\nexport const zero: Amount = {\n scaled: 0n,\n unscaled: Big(0),\n scalingFactor: BigInt(1e18),\n formatted: '0',\n};\n\nexport const wrapAmount = (scaled: bigint, decimals: number): Amount => {\n const scalingFactor = BigInt(Big(10).pow(decimals).toFixed(0));\n const unscaled = unscaleAmount(scaled, decimals);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, scalingFactor, formatted};\n};\n\nexport const wrapAmountUnscaled = (\n unscaled: Big | number | string,\n decimals: number,\n): Amount => {\n unscaled = Big(unscaled);\n const scalingFactor = BigInt(Big(10).pow(decimals).toFixed(0));\n const scaled = scaleAmount(unscaled, decimals);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, scalingFactor, formatted};\n};\n\nexport const wrapPrice = (\n scaled: bigint,\n decimals0: number,\n decimals1: number,\n): Amount => {\n const scalingFactor = BigInt(\n Big(PRICE_PRECISION.toString())\n .pow(2)\n .mul(Big(10).pow(decimals1))\n .div(Big(10).pow(decimals0))\n .toFixed(0),\n );\n const unscaled = unscalePrice(scaled, decimals0, decimals1);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, scalingFactor, formatted};\n};\n\nexport const wrapPriceUnscaled = (\n unscaled: Big | number | string,\n decimals0: number,\n decimals1: number,\n): Amount => {\n unscaled = Big(unscaled);\n const scalingFactor = BigInt(\n Big(PRICE_PRECISION.toString())\n .pow(2)\n .mul(Big(10).pow(decimals1))\n .div(Big(10).pow(decimals0))\n .toFixed(0),\n );\n const scaled = scalePrice(unscaled, decimals0, decimals1);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, scalingFactor, formatted};\n};\n\nexport const unscaleAmount = (scaled: bigint, decimals: number) => {\n return new Big(scaled.toString()).div(new Big(10).pow(decimals));\n};\n\nexport const scaleAmount = (\n unscaled: Big | number | string,\n decimals: number,\n) => {\n return BigInt(\n Big(unscaled).mul(new Big(10).pow(decimals)).round().toFixed(0),\n );\n};\n\nexport const unscalePrice = (\n scaled: bigint,\n decimals0: number,\n decimals1: number,\n) => {\n return new Big(scaled.toString())\n .mul(new Big(10).pow(decimals0))\n .div(new Big(10).pow(decimals1))\n .div(PRICE_PRECISION.toString());\n};\n\nexport const scalePrice = (\n unscaled: Big | number | string,\n decimals0: number,\n decimals1: number,\n precision = 18,\n) => {\n return BigInt(\n Big(unscaled)\n .mul(new Big(10).pow(precision))\n .mul(new Big(10).pow(decimals1))\n .div(new Big(10).pow(decimals0))\n .round()\n .toFixed(0),\n );\n};\n\nexport const formatAmount = (value?: Big | number | string) => {\n if (!value) return '-';\n value = new Big(value);\n\n if (value.gte(1e8)) return formatVagueAmount(value, 2);\n return formatCondensed(Big(value).toFixed(100));\n};\n\nexport const formatVagueAmount = (\n value: Big | number | bigint | string,\n fractionDigits = 2,\n) => {\n value = Number(value);\n if (value === 0) return '0';\n\n const formatted = value.toExponential(fractionDigits);\n return formatted.replace(/\\.?0+e/, 'e').replace(/e\\+/, 'e');\n};\n\nexport const formatCondensed = (\n input: string | number,\n decimals = 2,\n): string => {\n const str = (typeof input === 'number' ? input.toFixed(20) : input)\n .replace(/(\\.\\d*?)0+$/, '$1')\n .replace(/\\.$/, '');\n\n const [whole, decimal] = str.split('.');\n\n const formattedWhole = whole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n if (!decimal) return formattedWhole;\n\n const leadingZeroMatch = decimal.match(/^(0{3,})/);\n\n if (leadingZeroMatch) {\n const zeroCount = leadingZeroMatch[1].length;\n const subscript = toSubscript(zeroCount.toString());\n const remaining = decimal.slice(zeroCount);\n\n const twoDigits = remaining.slice(0, decimals);\n return `${formattedWhole}.0${subscript}${twoDigits}`;\n } else {\n // No subscript needed, find first 2 significant digits\n const nonZeroStart = decimal.search(/[1-9]/); // Find first non-zero digit\n\n if (nonZeroStart === -1) {\n return formattedWhole; // All zeros\n }\n const significantPart = decimal.slice(nonZeroStart);\n const twoDigits = significantPart.slice(0, decimals);\n const leadingZeros = decimal.slice(0, nonZeroStart);\n\n return `${formattedWhole}.${leadingZeros}${twoDigits}`;\n }\n};\n\nconst toSubscript = (input: string) => {\n return input.replace(/[0-9]/g, m => '₀₁₂₃₄₅₆₇₈₉'[+m]);\n};\n\nexport const formatUSD = (value: Big | string | number): string => {\n return '$' + formatAmount(value);\n};\n","import type {OptionData} from '~/package/client';\nimport {\n getPriceAtTick,\n liquiditiesToAmounts,\n token0ToToken1,\n token1ToToken0,\n} from './liquidityUtils';\n\nexport const getPayoutAtTick = (\n option: OptionData,\n liquidities: bigint[],\n tick: number,\n tickSpacing: number,\n optionAssetIsToken0: boolean,\n) => {\n return getPayoutAtPrice(\n option,\n liquidities,\n getPriceAtTick(tick),\n tickSpacing,\n optionAssetIsToken0,\n );\n};\n\nexport const getPayoutAtPrice = (\n option: OptionData,\n liquidities: bigint[],\n price: bigint,\n tickSpacing: number,\n optionAssetIsToken0: boolean,\n) => {\n const [borrowedAmount0, borrowedAmount1] = liquiditiesToAmounts(\n liquidities,\n option.startTick,\n option.entryPrice,\n tickSpacing,\n );\n const [repayAmount0, repayAmount1] = liquiditiesToAmounts(\n liquidities,\n option.startTick,\n price,\n tickSpacing,\n );\n const totalAmount = optionAssetIsToken0\n ? borrowedAmount1 + token0ToToken1(borrowedAmount0, price)\n : borrowedAmount0 + token1ToToken0(borrowedAmount1, price);\n\n const repayAmount = optionAssetIsToken0\n ? repayAmount1 + token0ToToken1(repayAmount0, price)\n : repayAmount0 + token1ToToken0(repayAmount1, price);\n\n const delta = totalAmount - repayAmount;\n const payout = delta < 0n ? 0n : delta;\n\n return payout;\n};\n"],"mappings":";;;;;;;;AAwBA,MAAa,YAAY,SAAkB,WACzC,YAAY;CAAC,KAAKA;CAAU;CAAS;CAAO,CAAC;AAE/C,MAAa,qBACX,SACA,WACmB;AACnB,QAAO,YAAY;EAAC,KAAK;EAAkB;EAAS;EAAO,CAAC;;AAG9D,MAAa,eAAe,OAAO,QAAsB,YAAsB;AAC7E,KAAI,CAAC,SAAS;EACZ,MAAM,UAAU,MAAM,OAAO,YAAY;AACzC,YAAU,WAAW;AACrB,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,2BAA2B,UAAU;;AAErE,QAAO,YAAY;EAAC,KAAK;EAAuB;EAAS;EAAO,CAAC;;AAGnE,MAAa,kBAAkB,OAC7B,QACA,YACG;AACH,KAAI,CAAC,SAAS;EACZ,MAAM,UAAU,MAAM,OAAO,YAAY;AACzC,YAAU,eAAe;AACzB,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8BAA8B,UAAU;;AAExE,QAAO,YAAY;EAAC,KAAK;EAAS;EAAS;EAAO,CAAC;;AAGrD,MAAaC,WAAoC,GAC9C,YAAY,KAAK,8CACnB;AACD,MAAaC,iBAA0C,GACpD,YAAY,KAAK,8CACnB;AACD,MAAaC,oBAA6C,GACvD,YAAY,KAAK,8CACnB;AACD,MAAaC,cAAuC,GACjD,YAAY,KAAK,8CACnB;AACD,MAAaC,aAAsC,GAChD,YAAY,KAAK,8CACnB;;;;ACrDD,MAAM,uBAAuB,eAAgC;AAS3D,QARsB;EACpB,MAAM;GAAC,WAAW;GAAU,WAAW;GAAK,SAAS;GAAG;EACxD,MAAM;GAAC,WAAW;GAAU,WAAW;GAAK,SAAS;GAAI;EACzD,OAAO;GAAC,WAAW;GAAU,WAAW;GAAM,SAAS;GAAI;EAC3D,MAAM;GAAC,WAAW;GAAQ,WAAW;GAAK,SAAS;GAAK;EACxD,MAAM;GAAC,WAAW;GAAQ,WAAW;GAAK,SAAS;GAAM;EACzD,MAAM;GAAC,WAAW;GAAO,WAAW;GAAK,SAAS;GAAM;EACzD,CACoB;;AAGvB,MAAM,YACJ,QACA,OACA,KACA,eACqB;AACrB,KAAI,OAAO,WAAW,EAAG,QAAO,EAAE;CAElC,MAAM,2BAAW,IAAI,KAA6B;AAElD,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,cACJ,KAAK,MAAM,MAAM,UAAU,SAAS,GAAG,WAAW,GAAG;AACvD,WAAS,IAAI,aAAa,MAAM;;CAElC,MAAMC,SAA2B,EAAE;CAKnC,IAAI,cAFF,KAAK,MAAM,OAAO,GAAG,UAAU,SAAS,GAAG,WAAW,GAAG;CAG3D,IAAIC,iBAAwC;AAE5C,QAAO,eAAe,IAAI,SAAS,EAAE;EACnC,MAAM,WAAW,SAAS,IAAI,YAAY;AAE1C,MAAI,UAAU;AACZ,UAAO,KAAK,SAAS;AACrB,oBAAiB;aACR,eACT,QAAO,KAAK;GACV,WAAW,IAAI,KAAK,YAAY;GAChC,OAAO,eAAe;GACvB,CAAC;AAEJ,iBAAe;;AAEjB,QAAO;;AAGT,MAAa,kBAAkB,OAC7B,MACA,OACA,YACA,OACA,QAC8B;CAC9B,MAAM,UAAU;CAChB,MAAM,EAAC,WAAW,WAAW,YAAW,oBAAoB,WAAW;AAEvE,KAAI,IAAI,SAAS,GAAG,KAAK,KAAK,CAC5B,OAAM,IAAI,KAAK,KAAK,KAAK,CAAC;CAE5B,MAAM,YAAY,KAAK,MAAM,MAAM,SAAS,GAAG,IAAK;CACpD,MAAM,UAAU,KAAK,MAAM,IAAI,SAAS,GAAG,IAAK;CAChD,MAAM,cAAc,UAAU;CAI9B,MAAM,MACJ,iDAAiD,QAAQ,SAAS,KAAK,SAAS,uBAClE,mBAJF,KAAK,IAAI,KAAK,KAAK,cAAc,QAAQ,EAAE,IAAK,UAMlD,UAAU,IAAI,SAAS,yCAEZ;CAEvB,MAAM,MAAM,MAAM,MAAM,KAAK,EAAC,SAAS,EAAC,QAAQ,oBAAmB,EAAC,CAAC;AAErE,KAAI,CAAC,IAAI,GACP,OAAM,IAAI,MAAM,kCAAkC,IAAI,aAAa;AAgBrE,QAAO,UAdO,MAAM,IAAI,MAAM,EAOQ,KAAK,WAAW,WACnD,KAAK,CAAC,iBAAiB,YAAY;EAClC,2BAAW,IAAI,KAAK,YAAY,IAAK;EACrC,OAAO;EACR,EAAE,CACF,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CAAC,EAExC,OAAO,KAAK,UAAU,IAAK,CAAC,QAClD,UACE,MAAM,UAAU,SAAS,GAAG,OAAQ,aACpC,MAAM,UAAU,SAAS,GAAG,OAAQ,QACvC;;AAGH,MAAa,kBAAkB,OAC7B,UACA,cACuB;;CAEvB,MAAM,WAAW,qEAAkE,SAAS,aAAa;CAEzG,MAAM,WAAW,MAAM,MAAM,UAAU;EACrC,QAAQ;EACR,SAAS;GAAC,QAAQ;GAAoB,cAAc;GAAoB;EACxE,OAAO;EACR,CAAC;AACF,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,uCAAuC,WAAW;CAEpE,MAAM,OAAQ,MAAM,SAAS,MAAM;CAanC,MAAM,OAAO,KAAK,KAAK;CACvB,MAAM,gBAAgB,KAAK,KAAK;CAEhC,MAAM,gBAAgB,cAAc,WAAW,KAAK,GACjD,MAAM,IAAI,CAAC,GACX,aAAa;CAChB,MAAM,iBAAiB,cAAc,YAAY,KAAK,GACnD,MAAM,IAAI,CAAC,GACX,aAAa;CAEhB,MAAM,cAAc,UAAU,aAAa,KAAK,cAAc,aAAa;CAC3E,MAAM,eAAe,UAAU,aAAa,KAAK,eAAe,aAAa;AAE7E,KAAI,CAAC,eAAe,CAAC,aACnB,OAAM,IAAI,MAAM,SAAS,UAAU,uBAAuB,WAAW;CAEvE,MAAM,QAAQ,cACV,KAAK,+BACL,KAAK;CACT,MAAM,uCAAc,KAAK,uGAAyB;AAElD,QAAO;EACL,cAAc,WAAW,SAAS,IAAI;EACtC,eAAe,WAAW,eAAe,IAAI;EACnC;EACV,WAAW,KAAK,KAAK;EACtB;;;;;ACxKH,IAAI,KAAK;AACT,IAAI,KAAK,IAAI;AAEb,MAAa,kBAAkB,OAAO,EAAE,IAAI,OAAO,IAAI;AAEvD,MAAa,0BAA0B,iBAAyB;AAI9D,QAHkB,eAAe,eACN,kBAAmB,OAAO,KAAK,IAAI;;AAKhE,MAAa,0BAA0B,UAAkB;AAQvD,QAPqB,KAAK,OACxB,IAAI,IAAI,MAAM,UAAU,CAAC,CACtB,IAAI,KAAK,IAAI,CACb,IAAI,gBAAgB,UAAU,CAAC,CAC/B,MAAM,CACN,QAAQ,EAAE,CACd;;AAIH,MAAa,kBAAkB,SAAiB;CAC9C,MAAM,eAAe,OAAO,SAAS,mBAAmB,KAAK,CAAC,UAAU,CAAC;AAKzE,QAHkB,eAAe,eACN,kBAAmB,OAAO,KAAK,IAAI;;AAKhE,MAAa,kBAAkB,UAAkB;CAC/C,MAAM,YAAa,QAAQ,OAAO,KAAK,IAAI,GAAI;CAC/C,MAAM,eAAe,KAAK,OACxB,IAAI,IAAI,UAAU,UAAU,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAChD;AACD,QAAO,SAAS,mBAAmB,aAAa;;AAGlD,MAAa,6BACX,YACA,qBACA,aACA,aACA,eACG;AACH,cAAa,UAAU,cAAc,aAAa,YAAY;AAE9D,KACG,eAAe,UAAU,uBACzB,eAAe,SAAS,CAAC,oBAE1B,eAAc;AAEhB,QAAO;;AAGT,MAAa,aAAa,MAAc,YAAoB;CAC1D,MAAM,MAAM,OAAO;AACnB,KAAI,OAAO,EAAG,QAAO,OAAO;AAC5B,QAAO,OAAO,MAAM;;AAGtB,MAAa,kBAAkB,SAAiB,UAA2B;AACzE,SAAQ,OAAO,UAAU,WAAW,QAAQ,MAAM;AAClD,QAAQ,UAAU,QAAS;;AAE7B,MAAa,kBAAkB,SAAiB,UAA2B;AACzE,SAAQ,OAAO,UAAU,WAAW,QAAQ,MAAM;AAClD,QAAQ,UAAU,kBAAmB;;AAGvC,MAAa,wBAAwB,SAAiB,SAAiB;AAErE,QAAQ,UADM,eAAe,KAAK,GACP;;AAE7B,MAAa,wBAAwB,SAAiB,SAAiB;CACrE,MAAM,QAAQ,eAAe,KAAK;AAClC,QAAQ,UAAU,kBAAmB;;AAGvC,MAAa,2BACX,WACA,WACA,WACA,gBACqB;CACrB,MAAM,eAAe,SAAS,mBAAmB,YAAY;CAC7D,MAAM,gBAAgB,SAAS,mBAAmB,UAAU;CAC5D,MAAM,gBAAgB,SAAS,mBAAmB,UAAU;CAC5D,MAAM,gBAAgB,KAAK,OAAO,UAAU,UAAU,CAAC;CAEvD,IAAI,SAAS,KAAK,OAAO,EAAE;CAC3B,IAAI,SAAS,KAAK,OAAO,EAAE;AAE3B,KAAI,cAAc,UAChB,UAAS,cAAc,gBACrB,eACA,eACA,eACA,MACD;UACQ,eAAe,UACxB,UAAS,cAAc,gBACrB,eACA,eACA,eACA,MACD;MACI;AACL,WAAS,cAAc,gBACrB,cACA,eACA,eACA,MACD;AACD,WAAS,cAAc,gBACrB,eACA,cACA,eACA,MACD;;AAEH,QAAO,CAAC,OAAO,OAAO,UAAU,CAAC,EAAE,OAAO,OAAO,UAAU,CAAC,CAAC;;AAG/D,MAAa,wBACX,aACA,WACA,gBACG;CACH,IAAI,UAAU,OAAO,EAAE;AAEvB,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,YAAY,YAAY;AAC9B,MAAI,cAAc,OAAO,EAAE,CAAE;EAE7B,MAAM,YAAY,YAAY,cAAc;EAC5C,MAAM,YAAY,YAAY;EAE9B,MAAM,gBAAgB,SAAS,mBAAmB,UAAU;EAC5D,MAAM,gBAAgB,SAAS,mBAAmB,UAAU;EAC5D,MAAM,gBAAgB,KAAK,OAAO,UAAU,UAAU,CAAC;EAEvD,MAAM,eAAe,cAAc,gBACjC,eACA,eACA,eACA,MACD;AACD,aAAW,OAAO,aAAa,UAAU,CAAC;;AAE5C,QAAO;;AAGT,MAAa,wBACX,aACA,WACA,gBACG;CACH,IAAI,UAAU,OAAO,EAAE;AAEvB,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,YAAY,YAAY;AAC9B,MAAI,cAAc,OAAO,EAAE,CAAE;EAE7B,MAAM,YAAY,YAAY,cAAc;EAC5C,MAAM,YAAY,YAAY;EAE9B,MAAM,gBAAgB,SAAS,mBAAmB,UAAU;EAC5D,MAAM,gBAAgB,SAAS,mBAAmB,UAAU;EAC5D,MAAM,gBAAgB,KAAK,OAAO,UAAU,UAAU,CAAC;EAEvD,MAAM,eAAe,cAAc,gBACjC,eACA,eACA,eACA,MACD;AACD,aAAW,OAAO,aAAa,UAAU,CAAC;;AAE5C,QAAO;;AAGT,MAAa,wBACX,aACA,WACA,OACA,gBACG;CACH,IAAI,UAAU;CACd,IAAI,UAAU;CAEd,MAAM,eAAe,uBAAuB,MAAM;AAElD,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,YAAY,YAAY;AAC9B,MAAI,cAAc,OAAO,EAAE,CAAE;EAE7B,MAAM,YAAY,YAAY,cAAc;EAC5C,MAAM,YAAY,YAAY;EAE9B,MAAM,gBAAgB,SAAS,mBAAmB,UAAU;EAC5D,MAAM,gBAAgB,SAAS,mBAAmB,UAAU;EAC5D,MAAM,gBAAgB,KAAK,OAAO,UAAU,UAAU,CAAC;AAEvD,MAAI,KAAK,gBAAgB,cAAc,cAAc,EAAE;GACrD,MAAM,SAAS,cAAc,gBAC3B,eACA,eACA,eACA,MACD;AACD,cAAW,OAAO,OAAO,UAAU,CAAC;aAC3B,KAAK,SAAS,cAAc,cAAc,EAAE;GACrD,MAAM,SAAS,cAAc,gBAC3B,cACA,eACA,eACA,MACD;GACD,MAAM,SAAS,cAAc,gBAC3B,eACA,cACA,eACA,MACD;AACD,cAAW,OAAO,OAAO,UAAU,CAAC;AACpC,cAAW,OAAO,OAAO,UAAU,CAAC;SAC/B;GACL,MAAM,SAAS,cAAc,gBAC3B,eACA,eACA,eACA,MACD;AACD,cAAW,OAAO,OAAO,UAAU,CAAC;;;AAGxC,QAAO,CAAC,SAAS,QAAQ;;;;;AC7O3B,MAAaC,OAAe;CAC1B,QAAQ;CACR,UAAU,IAAI,EAAE;CAChB,eAAe,OAAO,kBAAK;CAC3B,WAAW;CACZ;AAED,MAAa,cAAc,QAAgB,aAA6B;CACtE,MAAM,gBAAgB,OAAO,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;CAC9D,MAAM,WAAW,cAAc,QAAQ,SAAS;AAEhD,QAAO;EAAC;EAAQ;EAAU;EAAe,WADvB,aAAa,SAAS;EACW;;AAGrD,MAAa,sBACX,UACA,aACW;AACX,YAAW,IAAI,SAAS;CACxB,MAAM,gBAAgB,OAAO,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;CAC9D,MAAM,SAAS,YAAY,UAAU,SAAS;CAC9C,MAAM,YAAY,aAAa,SAAS;AACxC,QAAO;EAAC;EAAQ;EAAU;EAAe;EAAU;;AAGrD,MAAa,aACX,QACA,WACA,cACW;CACX,MAAM,gBAAgB,OACpB,IAAI,gBAAgB,UAAU,CAAC,CAC5B,IAAI,EAAE,CACN,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC3B,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC3B,QAAQ,EAAE,CACd;CACD,MAAM,WAAW,aAAa,QAAQ,WAAW,UAAU;AAE3D,QAAO;EAAC;EAAQ;EAAU;EAAe,WADvB,aAAa,SAAS;EACW;;AAGrD,MAAa,qBACX,UACA,WACA,cACW;AACX,YAAW,IAAI,SAAS;CACxB,MAAM,gBAAgB,OACpB,IAAI,gBAAgB,UAAU,CAAC,CAC5B,IAAI,EAAE,CACN,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC3B,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC3B,QAAQ,EAAE,CACd;CACD,MAAM,SAAS,WAAW,UAAU,WAAW,UAAU;CACzD,MAAM,YAAY,aAAa,SAAS;AACxC,QAAO;EAAC;EAAQ;EAAU;EAAe;EAAU;;AAGrD,MAAa,iBAAiB,QAAgB,aAAqB;AACjE,QAAO,IAAI,IAAI,OAAO,UAAU,CAAC,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC;;AAGlE,MAAa,eACX,UACA,aACG;AACH,QAAO,OACL,IAAI,SAAS,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAChE;;AAGH,MAAa,gBACX,QACA,WACA,cACG;AACH,QAAO,IAAI,IAAI,OAAO,UAAU,CAAC,CAC9B,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC/B,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC/B,IAAI,gBAAgB,UAAU,CAAC;;AAGpC,MAAa,cACX,UACA,WACA,WACA,YAAY,OACT;AACH,QAAO,OACL,IAAI,SAAS,CACV,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC/B,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC/B,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAC/B,OAAO,CACP,QAAQ,EAAE,CACd;;AAGH,MAAa,gBAAgB,UAAkC;AAC7D,KAAI,CAAC,MAAO,QAAO;AACnB,SAAQ,IAAI,IAAI,MAAM;AAEtB,KAAI,MAAM,IAAI,IAAI,CAAE,QAAO,kBAAkB,OAAO,EAAE;AACtD,QAAO,gBAAgB,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC;;AAGjD,MAAa,qBACX,OACA,iBAAiB,MACd;AACH,SAAQ,OAAO,MAAM;AACrB,KAAI,UAAU,EAAG,QAAO;AAGxB,QADkB,MAAM,cAAc,eAAe,CACpC,QAAQ,UAAU,IAAI,CAAC,QAAQ,OAAO,IAAI;;AAG7D,MAAa,mBACX,OACA,WAAW,MACA;CAKX,MAAM,CAAC,OAAO,YAJD,OAAO,UAAU,WAAW,MAAM,QAAQ,GAAG,GAAG,OAC1D,QAAQ,eAAe,KAAK,CAC5B,QAAQ,OAAO,GAAG,CAEQ,MAAM,IAAI;CAEvC,MAAM,iBAAiB,MAAM,QAAQ,yBAAyB,IAAI;AAClE,KAAI,CAAC,QAAS,QAAO;CAErB,MAAM,mBAAmB,QAAQ,MAAM,WAAW;AAElD,KAAI,kBAAkB;EACpB,MAAM,YAAY,iBAAiB,GAAG;AAKtC,SAAO,GAAG,eAAe,IAJP,YAAY,UAAU,UAAU,CAAC,GACjC,QAAQ,MAAM,UAAU,CAEd,MAAM,GAAG,SAAS;QAEzC;EAEL,MAAM,eAAe,QAAQ,OAAO,QAAQ;AAE5C,MAAI,iBAAiB,GACnB,QAAO;EAGT,MAAM,YADkB,QAAQ,MAAM,aAAa,CACjB,MAAM,GAAG,SAAS;AAGpD,SAAO,GAAG,eAAe,GAFJ,QAAQ,MAAM,GAAG,aAAa,GAER;;;AAI/C,MAAM,eAAe,UAAkB;AACrC,QAAO,MAAM,QAAQ,WAAU,MAAK,aAAa,CAAC,GAAG;;AAGvD,MAAa,aAAa,UAAyC;AACjE,QAAO,MAAM,aAAa,MAAM;;;;;ACnKlC,MAAa,mBACX,QACA,aACA,MACA,aACA,wBACG;AACH,QAAO,iBACL,QACA,aACA,eAAe,KAAK,EACpB,aACA,oBACD;;AAGH,MAAa,oBACX,QACA,aACA,OACA,aACA,wBACG;CACH,MAAM,CAAC,iBAAiB,mBAAmB,qBACzC,aACA,OAAO,WACP,OAAO,YACP,YACD;CACD,MAAM,CAAC,cAAc,gBAAgB,qBACnC,aACA,OAAO,WACP,OACA,YACD;CASD,MAAM,SARc,sBAChB,kBAAkB,eAAe,iBAAiB,MAAM,GACxD,kBAAkB,eAAe,iBAAiB,MAAM,KAExC,sBAChB,eAAe,eAAe,cAAc,MAAM,GAClD,eAAe,eAAe,cAAc,MAAM;AAKtD,QAFe,QAAQ,KAAK,KAAK"}
|
|
@@ -183,6 +183,8 @@ const getCurrentPrice = async (poolAddr, tokenAddr) => {
|
|
|
183
183
|
|
|
184
184
|
//#endregion
|
|
185
185
|
//#region src/lib/liquidityUtils.ts
|
|
186
|
+
big_js.default.DP = 155;
|
|
187
|
+
big_js.default.RM = big_js.default.roundDown;
|
|
186
188
|
const PRICE_PRECISION = BigInt(2) ** BigInt(128);
|
|
187
189
|
const getPriceAtSqrtPriceX96 = (sqrtPriceX96) => {
|
|
188
190
|
return sqrtPriceX96 * sqrtPriceX96 * PRICE_PRECISION / BigInt(2 ** 192);
|
|
@@ -302,47 +304,50 @@ const liquiditiesToAmounts = (liquidities, startTick, price, tickSpacing) => {
|
|
|
302
304
|
const zero = {
|
|
303
305
|
scaled: 0n,
|
|
304
306
|
unscaled: (0, big_js.default)(0),
|
|
305
|
-
|
|
307
|
+
scalingFactor: BigInt(0xde0b6b3a7640000),
|
|
306
308
|
formatted: "0"
|
|
307
309
|
};
|
|
308
310
|
const wrapAmount = (scaled, decimals) => {
|
|
311
|
+
const scalingFactor = BigInt((0, big_js.default)(10).pow(decimals).toFixed(0));
|
|
309
312
|
const unscaled = unscaleAmount(scaled, decimals);
|
|
310
313
|
return {
|
|
311
314
|
scaled,
|
|
312
315
|
unscaled,
|
|
313
|
-
|
|
316
|
+
scalingFactor,
|
|
314
317
|
formatted: formatAmount(unscaled)
|
|
315
318
|
};
|
|
316
319
|
};
|
|
317
320
|
const wrapAmountUnscaled = (unscaled, decimals) => {
|
|
318
321
|
unscaled = (0, big_js.default)(unscaled);
|
|
322
|
+
const scalingFactor = BigInt((0, big_js.default)(10).pow(decimals).toFixed(0));
|
|
319
323
|
const scaled = scaleAmount(unscaled, decimals);
|
|
320
324
|
const formatted = formatAmount(unscaled);
|
|
321
325
|
return {
|
|
322
326
|
scaled,
|
|
323
327
|
unscaled,
|
|
324
|
-
|
|
328
|
+
scalingFactor,
|
|
325
329
|
formatted
|
|
326
330
|
};
|
|
327
331
|
};
|
|
328
332
|
const wrapPrice = (scaled, decimals0, decimals1) => {
|
|
333
|
+
const scalingFactor = BigInt((0, big_js.default)(PRICE_PRECISION.toString()).pow(2).mul((0, big_js.default)(10).pow(decimals1)).div((0, big_js.default)(10).pow(decimals0)).toFixed(0));
|
|
329
334
|
const unscaled = unscalePrice(scaled, decimals0, decimals1);
|
|
330
|
-
const formatted = formatAmount(unscaled);
|
|
331
335
|
return {
|
|
332
336
|
scaled,
|
|
333
337
|
unscaled,
|
|
334
|
-
|
|
335
|
-
formatted
|
|
338
|
+
scalingFactor,
|
|
339
|
+
formatted: formatAmount(unscaled)
|
|
336
340
|
};
|
|
337
341
|
};
|
|
338
342
|
const wrapPriceUnscaled = (unscaled, decimals0, decimals1) => {
|
|
339
343
|
unscaled = (0, big_js.default)(unscaled);
|
|
344
|
+
const scalingFactor = BigInt((0, big_js.default)(PRICE_PRECISION.toString()).pow(2).mul((0, big_js.default)(10).pow(decimals1)).div((0, big_js.default)(10).pow(decimals0)).toFixed(0));
|
|
340
345
|
const scaled = scalePrice(unscaled, decimals0, decimals1);
|
|
341
346
|
const formatted = formatAmount(unscaled);
|
|
342
347
|
return {
|
|
343
348
|
scaled,
|
|
344
349
|
unscaled,
|
|
345
|
-
|
|
350
|
+
scalingFactor,
|
|
346
351
|
formatted
|
|
347
352
|
};
|
|
348
353
|
};
|
|
@@ -352,8 +357,8 @@ const unscaleAmount = (scaled, decimals) => {
|
|
|
352
357
|
const scaleAmount = (unscaled, decimals) => {
|
|
353
358
|
return BigInt((0, big_js.default)(unscaled).mul(new big_js.default(10).pow(decimals)).round().toFixed(0));
|
|
354
359
|
};
|
|
355
|
-
const unscalePrice = (scaled, decimals0, decimals1
|
|
356
|
-
return new big_js.default(scaled.toString()).mul(new big_js.default(10).pow(decimals0)).div(new big_js.default(10).pow(decimals1)).div(
|
|
360
|
+
const unscalePrice = (scaled, decimals0, decimals1) => {
|
|
361
|
+
return new big_js.default(scaled.toString()).mul(new big_js.default(10).pow(decimals0)).div(new big_js.default(10).pow(decimals1)).div(PRICE_PRECISION.toString());
|
|
357
362
|
};
|
|
358
363
|
const scalePrice = (unscaled, decimals0, decimals1, precision = 18) => {
|
|
359
364
|
return BigInt((0, big_js.default)(unscaled).mul(new big_js.default(10).pow(precision)).mul(new big_js.default(10).pow(decimals1)).div(new big_js.default(10).pow(decimals0)).round().toFixed(0));
|
|
@@ -656,4 +661,4 @@ Object.defineProperty(exports, 'zero', {
|
|
|
656
661
|
return zero;
|
|
657
662
|
}
|
|
658
663
|
});
|
|
659
|
-
//# sourceMappingURL=optionUtils-
|
|
664
|
+
//# sourceMappingURL=optionUtils-DerSn_Ua.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optionUtils-DerSn_Ua.cjs","names":["erc20Abi","optionsMarketAbi","statelessStateViewAbi","lensAbi","swappers: Record<number, Address>","baseSepolia","timelockLenses: Record<number, Address>","timelockFactories: Record<number, Address>","swapRouters: Record<number, Address>","stateViews: Record<number, Address>","filled: PriceDataPoint[]","lastKnownPrice: PriceDataPoint | null","Big","JSBI","TickMath","SqrtPriceMath","zero: Amount","Big"],"sources":["../src/lib/contracts.ts","../src/lib/price.ts","../src/lib/liquidityUtils.ts","../src/lib/numberUtils.ts","../src/lib/optionUtils.ts"],"sourcesContent":["import type {Address, Client, PublicClient, GetContractReturnType} from 'viem';\nimport {getContract} from 'viem';\nimport {baseSepolia} from 'viem/chains';\n\nimport {erc20Abi} from '~/abis/erc20';\nimport {lensAbi} from '~/abis/lens';\nimport {optionsMarketAbi} from '~/abis/optionsMarket';\nimport {statelessStateViewAbi} from '~/abis/statelessStateView';\n\nexport type TimelockMarket = GetContractReturnType<\n typeof optionsMarketAbi,\n Client,\n Address\n>;\nexport type TimelockLens = GetContractReturnType<\n typeof lensAbi,\n Client,\n Address\n>;\n\nexport type TimelockMarketData = Awaited<\n ReturnType<TimelockLens['read']['getMarketData']>\n> & {address: Address};\n\nexport const getErc20 = (address: Address, client: Client) =>\n getContract({abi: erc20Abi, address, client});\n\nexport const getTimelockMarket = (\n address: Address,\n client: Client,\n): TimelockMarket => {\n return getContract({abi: optionsMarketAbi, address, client});\n};\n\nexport const getStateView = async (client: PublicClient, address?: Address) => {\n if (!address) {\n const chainId = await client.getChainId();\n address = stateViews[chainId];\n if (!address) throw new Error(`No state view found for ${chainId}`);\n }\n return getContract({abi: statelessStateViewAbi, address, client});\n};\n\nexport const getTimelockLens = async (\n client: PublicClient,\n address?: Address,\n) => {\n if (!address) {\n const chainId = await client.getChainId();\n address = timelockLenses[chainId];\n if (!address) throw new Error(`No timelock lens found for ${chainId}`);\n }\n return getContract({abi: lensAbi, address, client});\n};\n\nexport const swappers: Record<number, Address> = {\n [baseSepolia.id]: '0xA16412db5c1Fc7e81574077913f5760d6c368Bd9',\n};\nexport const timelockLenses: Record<number, Address> = {\n [baseSepolia.id]: '0x3B8edE9d261505134A5D8D8C853e158066D13e6d',\n};\nexport const timelockFactories: Record<number, Address> = {\n [baseSepolia.id]: '0xea78d1869f78e301A18ab064b4287563974ab977',\n};\nexport const swapRouters: Record<number, Address> = {\n [baseSepolia.id]: '0x1a005FE3C05F076983F0d66a5F80CB9C61561a5b',\n};\nexport const stateViews: Record<number, Address> = {\n [baseSepolia.id]: '0x06AF24d39b8cb2100958EAAF279707Bec11160C8',\n};\n","import type {Address} from 'viem';\n\nexport interface PriceData {\n currentPrice: number;\n percentChange: number;\n poolAddr: string;\n timestamp: number;\n}\n\nexport interface PriceDataPoint {\n timestamp: Date;\n price: number;\n}\n\nexport type PriceResolution = '1m' | '5m' | '15m' | '1h' | '4h' | '1d';\n\nconst getResolutionConfig = (resolution: PriceResolution) => {\n const resolutionMap = {\n '1m': {timeframe: 'minute', aggregate: '1', seconds: 60},\n '5m': {timeframe: 'minute', aggregate: '5', seconds: 300},\n '15m': {timeframe: 'minute', aggregate: '15', seconds: 900},\n '1h': {timeframe: 'hour', aggregate: '1', seconds: 3600},\n '4h': {timeframe: 'hour', aggregate: '4', seconds: 14400},\n '1d': {timeframe: 'day', aggregate: '1', seconds: 86400},\n };\n return resolutionMap[resolution];\n};\n\nconst fillGaps = (\n prices: PriceDataPoint[],\n start: Date,\n end: Date,\n intervalMs: number,\n): PriceDataPoint[] => {\n if (prices.length === 0) return [];\n\n const priceMap = new Map<number, PriceDataPoint>();\n\n for (const point of prices) {\n const alignedTime =\n Math.floor(point.timestamp.getTime() / intervalMs) * intervalMs;\n priceMap.set(alignedTime, point);\n }\n const filled: PriceDataPoint[] = [];\n\n const actualStart =\n Math.floor(prices[0].timestamp.getTime() / intervalMs) * intervalMs;\n\n let currentTime = actualStart;\n let lastKnownPrice: PriceDataPoint | null = null;\n\n while (currentTime <= end.getTime()) {\n const existing = priceMap.get(currentTime);\n\n if (existing) {\n filled.push(existing);\n lastKnownPrice = existing;\n } else if (lastKnownPrice) {\n filled.push({\n timestamp: new Date(currentTime),\n price: lastKnownPrice.price,\n });\n }\n currentTime += intervalMs;\n }\n return filled;\n};\n\nexport const getPriceHistory = async (\n pool: Address,\n token: 0 | 1,\n resolution: PriceResolution,\n start: Date,\n end: Date,\n): Promise<PriceDataPoint[]> => {\n const network = 'monad-testnet';\n const {timeframe, aggregate, seconds} = getResolutionConfig(resolution);\n\n if (end.getTime() > Date.now()) {\n end = new Date(Date.now());\n }\n const startSecs = Math.floor(start.getTime() / 1000);\n const endSecs = Math.floor(end.getTime() / 1000);\n const diffSeconds = endSecs - startSecs;\n\n const limit = Math.min(Math.ceil(diffSeconds / seconds), 1000);\n\n const url =\n `https://api.geckoterminal.com/api/v2/networks/${network}/pools/${pool}/ohlcv/${timeframe}` +\n `?aggregate=${aggregate}` +\n `&limit=${limit}` +\n `&token=${token === 0 ? 'base' : 'quote'}` +\n '¤cy=usd' +\n `&before_timestamp=${endSecs}`;\n\n const res = await fetch(url, {headers: {Accept: 'application/json'}});\n\n if (!res.ok) {\n throw new Error(`Failed to fetch price history: ${res.statusText}`);\n }\n const data = (await res.json()) as {\n data: {\n attributes: {\n ohlcv_list: [number, number, number, number, number, number][];\n };\n };\n };\n const prices: PriceDataPoint[] = data.data.attributes.ohlcv_list\n .map(([timestamp, , , , close]) => ({\n timestamp: new Date(timestamp * 1000),\n price: close,\n }))\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n return fillGaps(prices, start, end, seconds * 1000).filter(\n point =>\n point.timestamp.getTime() / 1000 >= startSecs &&\n point.timestamp.getTime() / 1000 <= endSecs,\n );\n};\n\nexport const getCurrentPrice = async (\n poolAddr: Address,\n tokenAddr: Address,\n): Promise<PriceData> => {\n const network = 'monad-testnet';\n const geckoUrl = `https://api.geckoterminal.com/api/v2/networks/${network}/pools/${poolAddr.toLowerCase()}`;\n\n const response = await fetch(geckoUrl, {\n method: 'GET',\n headers: {Accept: 'application/json', 'User-Agent': 'TimelockTrade/1.0'},\n cache: 'no-store', // Keep no-store for real-time data\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch price data for pool ${poolAddr}`);\n }\n const data = (await response.json()) as {\n data: {\n attributes: {\n base_token_price_quote_token: string;\n quote_token_price_base_token: string;\n price_change_percentage: {h24: string};\n };\n relationships: {\n base_token: {data: {id: string; type: string}};\n quote_token: {data: {id: string; type: string}};\n };\n };\n };\n const pool = data.data.attributes;\n const relationships = data.data.relationships;\n\n const baseTokenAddr = relationships.base_token.data.id\n .split('_')[1]\n .toLowerCase();\n const quoteTokenAddr = relationships.quote_token.data.id\n .split('_')[1]\n .toLowerCase();\n\n const isBaseToken = tokenAddr.toLowerCase() === baseTokenAddr.toLowerCase();\n const isQuoteToken = tokenAddr.toLowerCase() === quoteTokenAddr.toLowerCase();\n\n if (!isBaseToken && !isQuoteToken) {\n throw new Error(`Token ${tokenAddr} is not part of pool ${poolAddr}`);\n }\n const price = isBaseToken\n ? pool.base_token_price_quote_token\n : pool.quote_token_price_base_token;\n const priceChange = pool.price_change_percentage?.h24;\n\n return {\n currentPrice: parseFloat(price || '0'),\n percentChange: parseFloat(priceChange || '0'),\n poolAddr: poolAddr,\n timestamp: Date.now(),\n };\n};\n","import {SqrtPriceMath, TickMath} from '@uniswap/v3-sdk';\nimport Big from 'big.js';\nimport JSBI from 'jsbi';\nimport type {Amount} from './numberUtils';\n\n// Set Big.js precision to handle 512-bit arithmetic\n// 155 decimal places provides ~515 bits of precision (log2(10^155) ≈ 515)\nBig.DP = 155; // Decimal places for division and sqrt operations\nBig.RM = Big.roundDown; // Round down to match Solidity's integer division behavior\n\nexport const PRICE_PRECISION = BigInt(2) ** BigInt(128);\n\nexport const getPriceAtSqrtPriceX96 = (sqrtPriceX96: bigint) => {\n const priceX192 = sqrtPriceX96 * sqrtPriceX96;\n const price = (priceX192 * PRICE_PRECISION) / BigInt(2 ** 192);\n\n return price;\n};\n\nexport const getSqrtPriceX96AtPrice = (price: bigint) => {\n const sqrtPriceX96 = JSBI.BigInt(\n new Big(price.toString())\n .mul(2 ** 192)\n .div(PRICE_PRECISION.toString())\n .sqrt()\n .toFixed(0),\n );\n return sqrtPriceX96;\n};\n\nexport const getPriceAtTick = (tick: number) => {\n const sqrtRatioX96 = BigInt(TickMath.getSqrtRatioAtTick(tick).toString());\n\n const priceX192 = sqrtRatioX96 * sqrtRatioX96;\n const price = (priceX192 * PRICE_PRECISION) / BigInt(2 ** 192);\n\n return price;\n};\n\nexport const getTickAtPrice = (price: bigint) => {\n const priceX192 = (price * BigInt(2 ** 192)) / PRICE_PRECISION;\n const sqrtPriceX96 = JSBI.BigInt(\n new Big(priceX192.toString()).sqrt().toFixed(0),\n );\n return TickMath.getTickAtSqrtRatio(sqrtPriceX96);\n};\n\nexport const getNearestValidStrikeTick = (\n optionType: 'CALL' | 'PUT',\n optionAssetIsToken0: boolean,\n tickSpacing: number,\n currentTick: number,\n strikeTick?: number,\n) => {\n strikeTick = roundTick(strikeTick ?? currentTick, tickSpacing);\n\n if (\n (optionType === 'CALL' && optionAssetIsToken0) ||\n (optionType === 'PUT' && !optionAssetIsToken0)\n ) {\n strikeTick += tickSpacing;\n }\n return strikeTick;\n};\n\nexport const roundTick = (tick: number, spacing: number) => {\n const rem = tick % spacing;\n if (rem >= 0) return tick - rem;\n return tick - rem - spacing;\n};\n\nexport const token0ToToken1 = (amount0: bigint, price: bigint | Amount) => {\n price = typeof price === 'bigint' ? price : price.scaled;\n return (amount0 * price) / PRICE_PRECISION;\n};\nexport const token1ToToken0 = (amount1: bigint, price: bigint | Amount) => {\n price = typeof price === 'bigint' ? price : price.scaled;\n return (amount1 * PRICE_PRECISION) / price;\n};\n\nexport const token0ToToken1AtTick = (amount0: bigint, tick: number) => {\n const price = getPriceAtTick(tick);\n return (amount0 * price) / PRICE_PRECISION;\n};\nexport const token1ToToken0AtTick = (amount1: bigint, tick: number) => {\n const price = getPriceAtTick(tick);\n return (amount1 * PRICE_PRECISION) / price;\n};\n\nexport const getAmountsFromLiquidity = (\n tickLower: number,\n tickUpper: number,\n liquidity: bigint,\n currentTick: number,\n): [bigint, bigint] => {\n const sqrtRatioX96 = TickMath.getSqrtRatioAtTick(currentTick);\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n let delta0 = JSBI.BigInt(0);\n let delta1 = JSBI.BigInt(0);\n\n if (currentTick < tickLower) {\n delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n } else if (currentTick >= tickUpper) {\n delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n } else {\n delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioX96,\n liquidityJSBI,\n false,\n );\n }\n return [BigInt(delta0.toString()), BigInt(delta1.toString())];\n};\n\nexport const liquiditiesToAmount0 = (\n liquidities: bigint[],\n startTick: number,\n tickSpacing: number,\n) => {\n let amount0 = BigInt(0);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n const amount0Delta = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(amount0Delta.toString());\n }\n return amount0;\n};\n\nexport const liquiditiesToAmount1 = (\n liquidities: bigint[],\n startTick: number,\n tickSpacing: number,\n) => {\n let amount1 = BigInt(0);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n const amount1Delta = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount1 += BigInt(amount1Delta.toString());\n }\n return amount1;\n};\n\nexport const liquiditiesToAmounts = (\n liquidities: bigint[],\n startTick: number,\n price: bigint,\n tickSpacing: number,\n) => {\n let amount0 = 0n;\n let amount1 = 0n;\n\n const sqrtRatioX96 = getSqrtPriceX96AtPrice(price);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n if (JSBI.lessThanOrEqual(sqrtRatioX96, sqrtRatioAX96)) {\n const delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(delta0.toString());\n } else if (JSBI.lessThan(sqrtRatioX96, sqrtRatioBX96)) {\n const delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n const delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(delta0.toString());\n amount1 += BigInt(delta1.toString());\n } else {\n const delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount1 += BigInt(delta1.toString());\n }\n }\n return [amount0, amount1];\n};\n","import Big from 'big.js';\nimport {PRICE_PRECISION} from './liquidityUtils';\n\nexport type Amount = {\n scaled: bigint;\n unscaled: Big;\n scalingFactor: bigint;\n formatted: string;\n};\n\nexport const zero: Amount = {\n scaled: 0n,\n unscaled: Big(0),\n scalingFactor: BigInt(1e18),\n formatted: '0',\n};\n\nexport const wrapAmount = (scaled: bigint, decimals: number): Amount => {\n const scalingFactor = BigInt(Big(10).pow(decimals).toFixed(0));\n const unscaled = unscaleAmount(scaled, decimals);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, scalingFactor, formatted};\n};\n\nexport const wrapAmountUnscaled = (\n unscaled: Big | number | string,\n decimals: number,\n): Amount => {\n unscaled = Big(unscaled);\n const scalingFactor = BigInt(Big(10).pow(decimals).toFixed(0));\n const scaled = scaleAmount(unscaled, decimals);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, scalingFactor, formatted};\n};\n\nexport const wrapPrice = (\n scaled: bigint,\n decimals0: number,\n decimals1: number,\n): Amount => {\n const scalingFactor = BigInt(\n Big(PRICE_PRECISION.toString())\n .pow(2)\n .mul(Big(10).pow(decimals1))\n .div(Big(10).pow(decimals0))\n .toFixed(0),\n );\n const unscaled = unscalePrice(scaled, decimals0, decimals1);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, scalingFactor, formatted};\n};\n\nexport const wrapPriceUnscaled = (\n unscaled: Big | number | string,\n decimals0: number,\n decimals1: number,\n): Amount => {\n unscaled = Big(unscaled);\n const scalingFactor = BigInt(\n Big(PRICE_PRECISION.toString())\n .pow(2)\n .mul(Big(10).pow(decimals1))\n .div(Big(10).pow(decimals0))\n .toFixed(0),\n );\n const scaled = scalePrice(unscaled, decimals0, decimals1);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, scalingFactor, formatted};\n};\n\nexport const unscaleAmount = (scaled: bigint, decimals: number) => {\n return new Big(scaled.toString()).div(new Big(10).pow(decimals));\n};\n\nexport const scaleAmount = (\n unscaled: Big | number | string,\n decimals: number,\n) => {\n return BigInt(\n Big(unscaled).mul(new Big(10).pow(decimals)).round().toFixed(0),\n );\n};\n\nexport const unscalePrice = (\n scaled: bigint,\n decimals0: number,\n decimals1: number,\n) => {\n return new Big(scaled.toString())\n .mul(new Big(10).pow(decimals0))\n .div(new Big(10).pow(decimals1))\n .div(PRICE_PRECISION.toString());\n};\n\nexport const scalePrice = (\n unscaled: Big | number | string,\n decimals0: number,\n decimals1: number,\n precision = 18,\n) => {\n return BigInt(\n Big(unscaled)\n .mul(new Big(10).pow(precision))\n .mul(new Big(10).pow(decimals1))\n .div(new Big(10).pow(decimals0))\n .round()\n .toFixed(0),\n );\n};\n\nexport const formatAmount = (value?: Big | number | string) => {\n if (!value) return '-';\n value = new Big(value);\n\n if (value.gte(1e8)) return formatVagueAmount(value, 2);\n return formatCondensed(Big(value).toFixed(100));\n};\n\nexport const formatVagueAmount = (\n value: Big | number | bigint | string,\n fractionDigits = 2,\n) => {\n value = Number(value);\n if (value === 0) return '0';\n\n const formatted = value.toExponential(fractionDigits);\n return formatted.replace(/\\.?0+e/, 'e').replace(/e\\+/, 'e');\n};\n\nexport const formatCondensed = (\n input: string | number,\n decimals = 2,\n): string => {\n const str = (typeof input === 'number' ? input.toFixed(20) : input)\n .replace(/(\\.\\d*?)0+$/, '$1')\n .replace(/\\.$/, '');\n\n const [whole, decimal] = str.split('.');\n\n const formattedWhole = whole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n if (!decimal) return formattedWhole;\n\n const leadingZeroMatch = decimal.match(/^(0{3,})/);\n\n if (leadingZeroMatch) {\n const zeroCount = leadingZeroMatch[1].length;\n const subscript = toSubscript(zeroCount.toString());\n const remaining = decimal.slice(zeroCount);\n\n const twoDigits = remaining.slice(0, decimals);\n return `${formattedWhole}.0${subscript}${twoDigits}`;\n } else {\n // No subscript needed, find first 2 significant digits\n const nonZeroStart = decimal.search(/[1-9]/); // Find first non-zero digit\n\n if (nonZeroStart === -1) {\n return formattedWhole; // All zeros\n }\n const significantPart = decimal.slice(nonZeroStart);\n const twoDigits = significantPart.slice(0, decimals);\n const leadingZeros = decimal.slice(0, nonZeroStart);\n\n return `${formattedWhole}.${leadingZeros}${twoDigits}`;\n }\n};\n\nconst toSubscript = (input: string) => {\n return input.replace(/[0-9]/g, m => '₀₁₂₃₄₅₆₇₈₉'[+m]);\n};\n\nexport const formatUSD = (value: Big | string | number): string => {\n return '$' + formatAmount(value);\n};\n","import type {OptionData} from '~/package/client';\nimport {\n getPriceAtTick,\n liquiditiesToAmounts,\n token0ToToken1,\n token1ToToken0,\n} from './liquidityUtils';\n\nexport const getPayoutAtTick = (\n option: OptionData,\n liquidities: bigint[],\n tick: number,\n tickSpacing: number,\n optionAssetIsToken0: boolean,\n) => {\n return getPayoutAtPrice(\n option,\n liquidities,\n getPriceAtTick(tick),\n tickSpacing,\n optionAssetIsToken0,\n );\n};\n\nexport const getPayoutAtPrice = (\n option: OptionData,\n liquidities: bigint[],\n price: bigint,\n tickSpacing: number,\n optionAssetIsToken0: boolean,\n) => {\n const [borrowedAmount0, borrowedAmount1] = liquiditiesToAmounts(\n liquidities,\n option.startTick,\n option.entryPrice,\n tickSpacing,\n );\n const [repayAmount0, repayAmount1] = liquiditiesToAmounts(\n liquidities,\n option.startTick,\n price,\n tickSpacing,\n );\n const totalAmount = optionAssetIsToken0\n ? borrowedAmount1 + token0ToToken1(borrowedAmount0, price)\n : borrowedAmount0 + token1ToToken0(borrowedAmount1, price);\n\n const repayAmount = optionAssetIsToken0\n ? repayAmount1 + token0ToToken1(repayAmount0, price)\n : repayAmount0 + token1ToToken0(repayAmount1, price);\n\n const delta = totalAmount - repayAmount;\n const payout = delta < 0n ? 0n : delta;\n\n return payout;\n};\n"],"mappings":"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"}
|
package/dist/package.cjs
CHANGED
package/dist/package.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as PriceResolution, $t as swapRouters, At as scaleAmount, B as getPriceAtTick, Dt as formatCondensed, Et as formatAmount, F as getPayoutAtTick, Ft as wrapAmountUnscaled, G as liquiditiesToAmounts, Gt as TimelockLens, H as getTickAtPrice, I as PRICE_PRECISION, It as wrapPrice, J as token0ToToken1AtTick, Jt as getErc20, K as roundTick, Kt as TimelockMarket, L as getAmountsFromLiquidity, Lt as wrapPriceUnscaled, Mt as unscaleAmount, Nt as unscalePrice, Ot as formatUSD, P as getPayoutAtPrice, Pt as wrapAmount, Q as PriceDataPoint, Qt as stateViews, R as getNearestValidStrikeTick, Rt as zero, Tt as Amount, U as liquiditiesToAmount0, V as getSqrtPriceX96AtPrice, W as liquiditiesToAmount1, X as token1ToToken0AtTick, Xt as getTimelockLens, Y as token1ToToken0, Yt as getStateView, Z as PriceData, Zt as getTimelockMarket, en as swappers, et as getCurrentPrice, jt as scalePrice, kt as formatVagueAmount, nn as timelockLenses, q as token0ToToken1, qt as TimelockMarketData, tn as timelockFactories, tt as getPriceHistory, z as getPriceAtSqrtPriceX96 } from "./client-
|
|
1
|
+
import { $ as PriceResolution, $t as swapRouters, At as scaleAmount, B as getPriceAtTick, Dt as formatCondensed, Et as formatAmount, F as getPayoutAtTick, Ft as wrapAmountUnscaled, G as liquiditiesToAmounts, Gt as TimelockLens, H as getTickAtPrice, I as PRICE_PRECISION, It as wrapPrice, J as token0ToToken1AtTick, Jt as getErc20, K as roundTick, Kt as TimelockMarket, L as getAmountsFromLiquidity, Lt as wrapPriceUnscaled, Mt as unscaleAmount, Nt as unscalePrice, Ot as formatUSD, P as getPayoutAtPrice, Pt as wrapAmount, Q as PriceDataPoint, Qt as stateViews, R as getNearestValidStrikeTick, Rt as zero, Tt as Amount, U as liquiditiesToAmount0, V as getSqrtPriceX96AtPrice, W as liquiditiesToAmount1, X as token1ToToken0AtTick, Xt as getTimelockLens, Y as token1ToToken0, Yt as getStateView, Z as PriceData, Zt as getTimelockMarket, en as swappers, et as getCurrentPrice, jt as scalePrice, kt as formatVagueAmount, nn as timelockLenses, q as token0ToToken1, qt as TimelockMarketData, tn as timelockFactories, tt as getPriceHistory, z as getPriceAtSqrtPriceX96 } from "./client-BLs46E49.cjs";
|
|
2
2
|
export { Amount, PRICE_PRECISION, PriceData, PriceDataPoint, PriceResolution, TimelockLens, TimelockMarket, TimelockMarketData, formatAmount, formatCondensed, formatUSD, formatVagueAmount, getAmountsFromLiquidity, getCurrentPrice, getErc20, getNearestValidStrikeTick, getPayoutAtPrice, getPayoutAtTick, getPriceAtSqrtPriceX96, getPriceAtTick, getPriceHistory, getSqrtPriceX96AtPrice, getStateView, getTickAtPrice, getTimelockLens, getTimelockMarket, liquiditiesToAmount0, liquiditiesToAmount1, liquiditiesToAmounts, roundTick, scaleAmount, scalePrice, stateViews, swapRouters, swappers, timelockFactories, timelockLenses, token0ToToken1, token0ToToken1AtTick, token1ToToken0, token1ToToken0AtTick, unscaleAmount, unscalePrice, wrapAmount, wrapAmountUnscaled, wrapPrice, wrapPriceUnscaled, zero };
|
package/dist/package.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as PriceResolution, $t as swapRouters, At as scaleAmount, B as getPriceAtTick, Dt as formatCondensed, Et as formatAmount, F as getPayoutAtTick, Ft as wrapAmountUnscaled, G as liquiditiesToAmounts, Gt as TimelockLens, H as getTickAtPrice, I as PRICE_PRECISION, It as wrapPrice, J as token0ToToken1AtTick, Jt as getErc20, K as roundTick, Kt as TimelockMarket, L as getAmountsFromLiquidity, Lt as wrapPriceUnscaled, Mt as unscaleAmount, Nt as unscalePrice, Ot as formatUSD, P as getPayoutAtPrice, Pt as wrapAmount, Q as PriceDataPoint, Qt as stateViews, R as getNearestValidStrikeTick, Rt as zero, Tt as Amount, U as liquiditiesToAmount0, V as getSqrtPriceX96AtPrice, W as liquiditiesToAmount1, X as token1ToToken0AtTick, Xt as getTimelockLens, Y as token1ToToken0, Yt as getStateView, Z as PriceData, Zt as getTimelockMarket, en as swappers, et as getCurrentPrice, jt as scalePrice, kt as formatVagueAmount, nn as timelockLenses, q as token0ToToken1, qt as TimelockMarketData, tn as timelockFactories, tt as getPriceHistory, z as getPriceAtSqrtPriceX96 } from "./client-
|
|
1
|
+
import { $ as PriceResolution, $t as swapRouters, At as scaleAmount, B as getPriceAtTick, Dt as formatCondensed, Et as formatAmount, F as getPayoutAtTick, Ft as wrapAmountUnscaled, G as liquiditiesToAmounts, Gt as TimelockLens, H as getTickAtPrice, I as PRICE_PRECISION, It as wrapPrice, J as token0ToToken1AtTick, Jt as getErc20, K as roundTick, Kt as TimelockMarket, L as getAmountsFromLiquidity, Lt as wrapPriceUnscaled, Mt as unscaleAmount, Nt as unscalePrice, Ot as formatUSD, P as getPayoutAtPrice, Pt as wrapAmount, Q as PriceDataPoint, Qt as stateViews, R as getNearestValidStrikeTick, Rt as zero, Tt as Amount, U as liquiditiesToAmount0, V as getSqrtPriceX96AtPrice, W as liquiditiesToAmount1, X as token1ToToken0AtTick, Xt as getTimelockLens, Y as token1ToToken0, Yt as getStateView, Z as PriceData, Zt as getTimelockMarket, en as swappers, et as getCurrentPrice, jt as scalePrice, kt as formatVagueAmount, nn as timelockLenses, q as token0ToToken1, qt as TimelockMarketData, tn as timelockFactories, tt as getPriceHistory, z as getPriceAtSqrtPriceX96 } from "./client-3oF5mDiF.js";
|
|
2
2
|
export { Amount, PRICE_PRECISION, PriceData, PriceDataPoint, PriceResolution, TimelockLens, TimelockMarket, TimelockMarketData, formatAmount, formatCondensed, formatUSD, formatVagueAmount, getAmountsFromLiquidity, getCurrentPrice, getErc20, getNearestValidStrikeTick, getPayoutAtPrice, getPayoutAtTick, getPriceAtSqrtPriceX96, getPriceAtTick, getPriceHistory, getSqrtPriceX96AtPrice, getStateView, getTickAtPrice, getTimelockLens, getTimelockMarket, liquiditiesToAmount0, liquiditiesToAmount1, liquiditiesToAmounts, roundTick, scaleAmount, scalePrice, stateViews, swapRouters, swappers, timelockFactories, timelockLenses, token0ToToken1, token0ToToken1AtTick, token1ToToken0, token1ToToken0AtTick, unscaleAmount, unscalePrice, wrapAmount, wrapAmountUnscaled, wrapPrice, wrapPriceUnscaled, zero };
|
package/dist/package.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { A as token1ToToken0AtTick, B as timelockFactories, C as liquiditiesToAmount0, D as token0ToToken1, E as roundTick, F as getTimelockLens, I as getTimelockMarket, L as stateViews, M as getPriceHistory, N as getErc20, O as token0ToToken1AtTick, P as getStateView, R as swapRouters, S as getTickAtPrice, T as liquiditiesToAmounts, V as timelockLenses, _ as getAmountsFromLiquidity, a as formatUSD, b as getPriceAtTick, c as scalePrice, d as wrapAmount, f as wrapAmountUnscaled, g as PRICE_PRECISION, h as zero, i as formatCondensed, j as getCurrentPrice, k as token1ToToken0, l as unscaleAmount, m as wrapPriceUnscaled, n as getPayoutAtTick, o as formatVagueAmount, p as wrapPrice, r as formatAmount, s as scaleAmount, t as getPayoutAtPrice, u as unscalePrice, v as getNearestValidStrikeTick, w as liquiditiesToAmount1, x as getSqrtPriceX96AtPrice, y as getPriceAtSqrtPriceX96, z as swappers } from "./optionUtils-
|
|
1
|
+
import { A as token1ToToken0AtTick, B as timelockFactories, C as liquiditiesToAmount0, D as token0ToToken1, E as roundTick, F as getTimelockLens, I as getTimelockMarket, L as stateViews, M as getPriceHistory, N as getErc20, O as token0ToToken1AtTick, P as getStateView, R as swapRouters, S as getTickAtPrice, T as liquiditiesToAmounts, V as timelockLenses, _ as getAmountsFromLiquidity, a as formatUSD, b as getPriceAtTick, c as scalePrice, d as wrapAmount, f as wrapAmountUnscaled, g as PRICE_PRECISION, h as zero, i as formatCondensed, j as getCurrentPrice, k as token1ToToken0, l as unscaleAmount, m as wrapPriceUnscaled, n as getPayoutAtTick, o as formatVagueAmount, p as wrapPrice, r as formatAmount, s as scaleAmount, t as getPayoutAtPrice, u as unscalePrice, v as getNearestValidStrikeTick, w as liquiditiesToAmount1, x as getSqrtPriceX96AtPrice, y as getPriceAtSqrtPriceX96, z as swappers } from "./optionUtils-CR8qGvTh.js";
|
|
2
2
|
|
|
3
3
|
export { PRICE_PRECISION, formatAmount, formatCondensed, formatUSD, formatVagueAmount, getAmountsFromLiquidity, getCurrentPrice, getErc20, getNearestValidStrikeTick, getPayoutAtPrice, getPayoutAtTick, getPriceAtSqrtPriceX96, getPriceAtTick, getPriceHistory, getSqrtPriceX96AtPrice, getStateView, getTickAtPrice, getTimelockLens, getTimelockMarket, liquiditiesToAmount0, liquiditiesToAmount1, liquiditiesToAmounts, roundTick, scaleAmount, scalePrice, stateViews, swapRouters, swappers, timelockFactories, timelockLenses, token0ToToken1, token0ToToken1AtTick, token1ToToken0, token1ToToken0AtTick, unscaleAmount, unscalePrice, wrapAmount, wrapAmountUnscaled, wrapPrice, wrapPriceUnscaled, zero };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"optionUtils-BdSKsVVS.js","names":["erc20Abi","swappers: Record<number, Address>","timelockLenses: Record<number, Address>","timelockFactories: Record<number, Address>","swapRouters: Record<number, Address>","stateViews: Record<number, Address>","filled: PriceDataPoint[]","lastKnownPrice: PriceDataPoint | null","zero: Amount"],"sources":["../src/lib/contracts.ts","../src/lib/price.ts","../src/lib/liquidityUtils.ts","../src/lib/numberUtils.ts","../src/lib/optionUtils.ts"],"sourcesContent":["import type {Address, Client, PublicClient, GetContractReturnType} from 'viem';\nimport {getContract} from 'viem';\nimport {baseSepolia} from 'viem/chains';\n\nimport {erc20Abi} from '~/abis/erc20';\nimport {lensAbi} from '~/abis/lens';\nimport {optionsMarketAbi} from '~/abis/optionsMarket';\nimport {statelessStateViewAbi} from '~/abis/statelessStateView';\n\nexport type TimelockMarket = GetContractReturnType<\n typeof optionsMarketAbi,\n Client,\n Address\n>;\nexport type TimelockLens = GetContractReturnType<\n typeof lensAbi,\n Client,\n Address\n>;\n\nexport type TimelockMarketData = Awaited<\n ReturnType<TimelockLens['read']['getMarketData']>\n> & {address: Address};\n\nexport const getErc20 = (address: Address, client: Client) =>\n getContract({abi: erc20Abi, address, client});\n\nexport const getTimelockMarket = (\n address: Address,\n client: Client,\n): TimelockMarket => {\n return getContract({abi: optionsMarketAbi, address, client});\n};\n\nexport const getStateView = async (client: PublicClient, address?: Address) => {\n if (!address) {\n const chainId = await client.getChainId();\n address = stateViews[chainId];\n if (!address) throw new Error(`No state view found for ${chainId}`);\n }\n return getContract({abi: statelessStateViewAbi, address, client});\n};\n\nexport const getTimelockLens = async (\n client: PublicClient,\n address?: Address,\n) => {\n if (!address) {\n const chainId = await client.getChainId();\n address = timelockLenses[chainId];\n if (!address) throw new Error(`No timelock lens found for ${chainId}`);\n }\n return getContract({abi: lensAbi, address, client});\n};\n\nexport const swappers: Record<number, Address> = {\n [baseSepolia.id]: '0xA16412db5c1Fc7e81574077913f5760d6c368Bd9',\n};\nexport const timelockLenses: Record<number, Address> = {\n [baseSepolia.id]: '0x3B8edE9d261505134A5D8D8C853e158066D13e6d',\n};\nexport const timelockFactories: Record<number, Address> = {\n [baseSepolia.id]: '0xea78d1869f78e301A18ab064b4287563974ab977',\n};\nexport const swapRouters: Record<number, Address> = {\n [baseSepolia.id]: '0x1a005FE3C05F076983F0d66a5F80CB9C61561a5b',\n};\nexport const stateViews: Record<number, Address> = {\n [baseSepolia.id]: '0x06AF24d39b8cb2100958EAAF279707Bec11160C8',\n};\n","import type {Address} from 'viem';\n\nexport interface PriceData {\n currentPrice: number;\n percentChange: number;\n poolAddr: string;\n timestamp: number;\n}\n\nexport interface PriceDataPoint {\n timestamp: Date;\n price: number;\n}\n\nexport type PriceResolution = '1m' | '5m' | '15m' | '1h' | '4h' | '1d';\n\nconst getResolutionConfig = (resolution: PriceResolution) => {\n const resolutionMap = {\n '1m': {timeframe: 'minute', aggregate: '1', seconds: 60},\n '5m': {timeframe: 'minute', aggregate: '5', seconds: 300},\n '15m': {timeframe: 'minute', aggregate: '15', seconds: 900},\n '1h': {timeframe: 'hour', aggregate: '1', seconds: 3600},\n '4h': {timeframe: 'hour', aggregate: '4', seconds: 14400},\n '1d': {timeframe: 'day', aggregate: '1', seconds: 86400},\n };\n return resolutionMap[resolution];\n};\n\nconst fillGaps = (\n prices: PriceDataPoint[],\n start: Date,\n end: Date,\n intervalMs: number,\n): PriceDataPoint[] => {\n if (prices.length === 0) return [];\n\n const priceMap = new Map<number, PriceDataPoint>();\n\n for (const point of prices) {\n const alignedTime =\n Math.floor(point.timestamp.getTime() / intervalMs) * intervalMs;\n priceMap.set(alignedTime, point);\n }\n const filled: PriceDataPoint[] = [];\n\n const actualStart =\n Math.floor(prices[0].timestamp.getTime() / intervalMs) * intervalMs;\n\n let currentTime = actualStart;\n let lastKnownPrice: PriceDataPoint | null = null;\n\n while (currentTime <= end.getTime()) {\n const existing = priceMap.get(currentTime);\n\n if (existing) {\n filled.push(existing);\n lastKnownPrice = existing;\n } else if (lastKnownPrice) {\n filled.push({\n timestamp: new Date(currentTime),\n price: lastKnownPrice.price,\n });\n }\n currentTime += intervalMs;\n }\n return filled;\n};\n\nexport const getPriceHistory = async (\n pool: Address,\n token: 0 | 1,\n resolution: PriceResolution,\n start: Date,\n end: Date,\n): Promise<PriceDataPoint[]> => {\n const network = 'monad-testnet';\n const {timeframe, aggregate, seconds} = getResolutionConfig(resolution);\n\n if (end.getTime() > Date.now()) {\n end = new Date(Date.now());\n }\n const startSecs = Math.floor(start.getTime() / 1000);\n const endSecs = Math.floor(end.getTime() / 1000);\n const diffSeconds = endSecs - startSecs;\n\n const limit = Math.min(Math.ceil(diffSeconds / seconds), 1000);\n\n const url =\n `https://api.geckoterminal.com/api/v2/networks/${network}/pools/${pool}/ohlcv/${timeframe}` +\n `?aggregate=${aggregate}` +\n `&limit=${limit}` +\n `&token=${token === 0 ? 'base' : 'quote'}` +\n '¤cy=usd' +\n `&before_timestamp=${endSecs}`;\n\n const res = await fetch(url, {headers: {Accept: 'application/json'}});\n\n if (!res.ok) {\n throw new Error(`Failed to fetch price history: ${res.statusText}`);\n }\n const data = (await res.json()) as {\n data: {\n attributes: {\n ohlcv_list: [number, number, number, number, number, number][];\n };\n };\n };\n const prices: PriceDataPoint[] = data.data.attributes.ohlcv_list\n .map(([timestamp, , , , close]) => ({\n timestamp: new Date(timestamp * 1000),\n price: close,\n }))\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n return fillGaps(prices, start, end, seconds * 1000).filter(\n point =>\n point.timestamp.getTime() / 1000 >= startSecs &&\n point.timestamp.getTime() / 1000 <= endSecs,\n );\n};\n\nexport const getCurrentPrice = async (\n poolAddr: Address,\n tokenAddr: Address,\n): Promise<PriceData> => {\n const network = 'monad-testnet';\n const geckoUrl = `https://api.geckoterminal.com/api/v2/networks/${network}/pools/${poolAddr.toLowerCase()}`;\n\n const response = await fetch(geckoUrl, {\n method: 'GET',\n headers: {Accept: 'application/json', 'User-Agent': 'TimelockTrade/1.0'},\n cache: 'no-store', // Keep no-store for real-time data\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch price data for pool ${poolAddr}`);\n }\n const data = (await response.json()) as {\n data: {\n attributes: {\n base_token_price_quote_token: string;\n quote_token_price_base_token: string;\n price_change_percentage: {h24: string};\n };\n relationships: {\n base_token: {data: {id: string; type: string}};\n quote_token: {data: {id: string; type: string}};\n };\n };\n };\n const pool = data.data.attributes;\n const relationships = data.data.relationships;\n\n const baseTokenAddr = relationships.base_token.data.id\n .split('_')[1]\n .toLowerCase();\n const quoteTokenAddr = relationships.quote_token.data.id\n .split('_')[1]\n .toLowerCase();\n\n const isBaseToken = tokenAddr.toLowerCase() === baseTokenAddr.toLowerCase();\n const isQuoteToken = tokenAddr.toLowerCase() === quoteTokenAddr.toLowerCase();\n\n if (!isBaseToken && !isQuoteToken) {\n throw new Error(`Token ${tokenAddr} is not part of pool ${poolAddr}`);\n }\n const price = isBaseToken\n ? pool.base_token_price_quote_token\n : pool.quote_token_price_base_token;\n const priceChange = pool.price_change_percentage?.h24;\n\n return {\n currentPrice: parseFloat(price || '0'),\n percentChange: parseFloat(priceChange || '0'),\n poolAddr: poolAddr,\n timestamp: Date.now(),\n };\n};\n","import {SqrtPriceMath, TickMath} from '@uniswap/v3-sdk';\nimport Big from 'big.js';\nimport JSBI from 'jsbi';\nimport type {Amount} from './numberUtils';\n\nexport const PRICE_PRECISION = BigInt(2) ** BigInt(128);\n\nexport const getPriceAtSqrtPriceX96 = (sqrtPriceX96: bigint) => {\n const priceX192 = sqrtPriceX96 * sqrtPriceX96;\n const price = (priceX192 * PRICE_PRECISION) / BigInt(2 ** 192);\n\n return price;\n};\n\nexport const getSqrtPriceX96AtPrice = (price: bigint) => {\n const sqrtPriceX96 = JSBI.BigInt(\n new Big(price.toString())\n .mul(2 ** 192)\n .div(PRICE_PRECISION.toString())\n .sqrt()\n .toFixed(0),\n );\n return sqrtPriceX96;\n};\n\nexport const getPriceAtTick = (tick: number) => {\n const sqrtRatioX96 = BigInt(TickMath.getSqrtRatioAtTick(tick).toString());\n\n const priceX192 = sqrtRatioX96 * sqrtRatioX96;\n const price = (priceX192 * PRICE_PRECISION) / BigInt(2 ** 192);\n\n return price;\n};\n\nexport const getTickAtPrice = (price: bigint) => {\n const priceX192 = (price * BigInt(2 ** 192)) / PRICE_PRECISION;\n const sqrtPriceX96 = JSBI.BigInt(\n new Big(priceX192.toString()).sqrt().toFixed(0),\n );\n return TickMath.getTickAtSqrtRatio(sqrtPriceX96);\n};\n\nexport const getNearestValidStrikeTick = (\n optionType: 'CALL' | 'PUT',\n optionAssetIsToken0: boolean,\n tickSpacing: number,\n currentTick: number,\n strikeTick?: number,\n) => {\n strikeTick = roundTick(strikeTick ?? currentTick, tickSpacing);\n\n if (\n (optionType === 'CALL' && optionAssetIsToken0) ||\n (optionType === 'PUT' && !optionAssetIsToken0)\n ) {\n strikeTick += tickSpacing;\n }\n return strikeTick;\n};\n\nexport const roundTick = (tick: number, spacing: number) => {\n const rem = tick % spacing;\n if (rem >= 0) return tick - rem;\n return tick - rem - spacing;\n};\n\nexport const token0ToToken1 = (amount0: bigint, price: bigint | Amount) => {\n price = typeof price === 'bigint' ? price : price.scaled;\n return (amount0 * price) / PRICE_PRECISION;\n};\nexport const token1ToToken0 = (amount1: bigint, price: bigint | Amount) => {\n price = typeof price === 'bigint' ? price : price.scaled;\n return (amount1 * PRICE_PRECISION) / price;\n};\n\nexport const token0ToToken1AtTick = (amount0: bigint, tick: number) => {\n const price = getPriceAtTick(tick);\n return (amount0 * price) / PRICE_PRECISION;\n};\nexport const token1ToToken0AtTick = (amount1: bigint, tick: number) => {\n const price = getPriceAtTick(tick);\n return (amount1 * PRICE_PRECISION) / price;\n};\n\nexport const getAmountsFromLiquidity = (\n tickLower: number,\n tickUpper: number,\n liquidity: bigint,\n currentTick: number,\n): [bigint, bigint] => {\n const sqrtRatioX96 = TickMath.getSqrtRatioAtTick(currentTick);\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n let delta0 = JSBI.BigInt(0);\n let delta1 = JSBI.BigInt(0);\n\n if (currentTick < tickLower) {\n delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n } else if (currentTick >= tickUpper) {\n delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n } else {\n delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioX96,\n liquidityJSBI,\n false,\n );\n }\n return [BigInt(delta0.toString()), BigInt(delta1.toString())];\n};\n\nexport const liquiditiesToAmount0 = (\n liquidities: bigint[],\n startTick: number,\n tickSpacing: number,\n) => {\n let amount0 = BigInt(0);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n const amount0Delta = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(amount0Delta.toString());\n }\n return amount0;\n};\n\nexport const liquiditiesToAmount1 = (\n liquidities: bigint[],\n startTick: number,\n tickSpacing: number,\n) => {\n let amount1 = BigInt(0);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n const amount1Delta = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount1 += BigInt(amount1Delta.toString());\n }\n return amount1;\n};\n\nexport const liquiditiesToAmounts = (\n liquidities: bigint[],\n startTick: number,\n price: bigint,\n tickSpacing: number,\n) => {\n let amount0 = 0n;\n let amount1 = 0n;\n\n const sqrtRatioX96 = getSqrtPriceX96AtPrice(price);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n if (JSBI.lessThanOrEqual(sqrtRatioX96, sqrtRatioAX96)) {\n const delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(delta0.toString());\n } else if (JSBI.lessThan(sqrtRatioX96, sqrtRatioBX96)) {\n const delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n const delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(delta0.toString());\n amount1 += BigInt(delta1.toString());\n } else {\n const delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount1 += BigInt(delta1.toString());\n }\n }\n return [amount0, amount1];\n};\n","import Big from 'big.js';\n\nexport type Amount = {\n scaled: bigint;\n unscaled: Big;\n decimals: number;\n formatted: string;\n};\n\nexport const zero: Amount = {\n scaled: 0n,\n unscaled: Big(0),\n decimals: 18,\n formatted: '0',\n};\n\nexport const wrapAmount = (scaled: bigint, decimals: number): Amount => {\n const unscaled = unscaleAmount(scaled, decimals);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, decimals, formatted};\n};\n\nexport const wrapAmountUnscaled = (\n unscaled: Big | number | string,\n decimals: number,\n): Amount => {\n unscaled = Big(unscaled);\n const scaled = scaleAmount(unscaled, decimals);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, decimals, formatted};\n};\n\nexport const wrapPrice = (\n scaled: bigint,\n decimals0: number,\n decimals1: number,\n): Amount => {\n const unscaled = unscalePrice(scaled, decimals0, decimals1);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, decimals: 36 + decimals1 - decimals0, formatted};\n};\n\nexport const wrapPriceUnscaled = (\n unscaled: Big | number | string,\n decimals0: number,\n decimals1: number,\n): Amount => {\n unscaled = Big(unscaled);\n const scaled = scalePrice(unscaled, decimals0, decimals1);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, decimals: 36 + decimals1 - decimals0, formatted};\n};\n\nexport const unscaleAmount = (scaled: bigint, decimals: number) => {\n return new Big(scaled.toString()).div(new Big(10).pow(decimals));\n};\n\nexport const scaleAmount = (\n unscaled: Big | number | string,\n decimals: number,\n) => {\n return BigInt(\n Big(unscaled).mul(new Big(10).pow(decimals)).round().toFixed(0),\n );\n};\n\nexport const unscalePrice = (\n scaled: bigint,\n decimals0: number,\n decimals1: number,\n precision = 18,\n) => {\n return new Big(scaled.toString())\n .mul(new Big(10).pow(decimals0))\n .div(new Big(10).pow(decimals1))\n .div(new Big(10).pow(precision));\n};\n\nexport const scalePrice = (\n unscaled: Big | number | string,\n decimals0: number,\n decimals1: number,\n precision = 18,\n) => {\n return BigInt(\n Big(unscaled)\n .mul(new Big(10).pow(precision))\n .mul(new Big(10).pow(decimals1))\n .div(new Big(10).pow(decimals0))\n .round()\n .toFixed(0),\n );\n};\n\nexport const formatAmount = (value?: Big | number | string) => {\n if (!value) return '-';\n value = new Big(value);\n\n if (value.gte(1e8)) return formatVagueAmount(value, 2);\n return formatCondensed(Big(value).toFixed(100));\n};\n\nexport const formatVagueAmount = (\n value: Big | number | bigint | string,\n fractionDigits = 2,\n) => {\n value = Number(value);\n if (value === 0) return '0';\n\n const formatted = value.toExponential(fractionDigits);\n return formatted.replace(/\\.?0+e/, 'e').replace(/e\\+/, 'e');\n};\n\nexport const formatCondensed = (\n input: string | number,\n decimals = 2,\n): string => {\n const str = (typeof input === 'number' ? input.toFixed(20) : input)\n .replace(/(\\.\\d*?)0+$/, '$1')\n .replace(/\\.$/, '');\n\n const [whole, decimal] = str.split('.');\n\n const formattedWhole = whole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n if (!decimal) return formattedWhole;\n\n const leadingZeroMatch = decimal.match(/^(0{3,})/);\n\n if (leadingZeroMatch) {\n const zeroCount = leadingZeroMatch[1].length;\n const subscript = toSubscript(zeroCount.toString());\n const remaining = decimal.slice(zeroCount);\n\n const twoDigits = remaining.slice(0, decimals);\n return `${formattedWhole}.0${subscript}${twoDigits}`;\n } else {\n // No subscript needed, find first 2 significant digits\n const nonZeroStart = decimal.search(/[1-9]/); // Find first non-zero digit\n\n if (nonZeroStart === -1) {\n return formattedWhole; // All zeros\n }\n const significantPart = decimal.slice(nonZeroStart);\n const twoDigits = significantPart.slice(0, decimals);\n const leadingZeros = decimal.slice(0, nonZeroStart);\n\n return `${formattedWhole}.${leadingZeros}${twoDigits}`;\n }\n};\n\nconst toSubscript = (input: string) => {\n return input.replace(/[0-9]/g, m => '₀₁₂₃₄₅₆₇₈₉'[+m]);\n};\n\nexport const formatUSD = (value: Big | string | number): string => {\n return '$' + formatAmount(value);\n};\n","import type {OptionData} from '~/package/client';\nimport {\n getPriceAtTick,\n liquiditiesToAmounts,\n token0ToToken1,\n token1ToToken0,\n} from './liquidityUtils';\n\nexport const getPayoutAtTick = (\n option: OptionData,\n liquidities: bigint[],\n tick: number,\n tickSpacing: number,\n optionAssetIsToken0: boolean,\n) => {\n return getPayoutAtPrice(\n option,\n liquidities,\n getPriceAtTick(tick),\n tickSpacing,\n optionAssetIsToken0,\n );\n};\n\nexport const getPayoutAtPrice = (\n option: OptionData,\n liquidities: bigint[],\n price: bigint,\n tickSpacing: number,\n optionAssetIsToken0: boolean,\n) => {\n const [borrowedAmount0, borrowedAmount1] = liquiditiesToAmounts(\n liquidities,\n option.startTick,\n option.entryPrice,\n tickSpacing,\n );\n const [repayAmount0, repayAmount1] = liquiditiesToAmounts(\n liquidities,\n option.startTick,\n price,\n tickSpacing,\n );\n const totalAmount = optionAssetIsToken0\n ? borrowedAmount1 + token0ToToken1(borrowedAmount0, price)\n : borrowedAmount0 + token1ToToken0(borrowedAmount1, price);\n\n const repayAmount = optionAssetIsToken0\n ? repayAmount1 + token0ToToken1(repayAmount0, price)\n : repayAmount0 + token1ToToken0(repayAmount1, price);\n\n const delta = totalAmount - repayAmount;\n const payout = delta < 0n ? 0n : delta;\n\n return payout;\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"optionUtils-DfDohN6H.cjs","names":["erc20Abi","optionsMarketAbi","statelessStateViewAbi","lensAbi","swappers: Record<number, Address>","baseSepolia","timelockLenses: Record<number, Address>","timelockFactories: Record<number, Address>","swapRouters: Record<number, Address>","stateViews: Record<number, Address>","filled: PriceDataPoint[]","lastKnownPrice: PriceDataPoint | null","JSBI","Big","TickMath","SqrtPriceMath","zero: Amount","Big"],"sources":["../src/lib/contracts.ts","../src/lib/price.ts","../src/lib/liquidityUtils.ts","../src/lib/numberUtils.ts","../src/lib/optionUtils.ts"],"sourcesContent":["import type {Address, Client, PublicClient, GetContractReturnType} from 'viem';\nimport {getContract} from 'viem';\nimport {baseSepolia} from 'viem/chains';\n\nimport {erc20Abi} from '~/abis/erc20';\nimport {lensAbi} from '~/abis/lens';\nimport {optionsMarketAbi} from '~/abis/optionsMarket';\nimport {statelessStateViewAbi} from '~/abis/statelessStateView';\n\nexport type TimelockMarket = GetContractReturnType<\n typeof optionsMarketAbi,\n Client,\n Address\n>;\nexport type TimelockLens = GetContractReturnType<\n typeof lensAbi,\n Client,\n Address\n>;\n\nexport type TimelockMarketData = Awaited<\n ReturnType<TimelockLens['read']['getMarketData']>\n> & {address: Address};\n\nexport const getErc20 = (address: Address, client: Client) =>\n getContract({abi: erc20Abi, address, client});\n\nexport const getTimelockMarket = (\n address: Address,\n client: Client,\n): TimelockMarket => {\n return getContract({abi: optionsMarketAbi, address, client});\n};\n\nexport const getStateView = async (client: PublicClient, address?: Address) => {\n if (!address) {\n const chainId = await client.getChainId();\n address = stateViews[chainId];\n if (!address) throw new Error(`No state view found for ${chainId}`);\n }\n return getContract({abi: statelessStateViewAbi, address, client});\n};\n\nexport const getTimelockLens = async (\n client: PublicClient,\n address?: Address,\n) => {\n if (!address) {\n const chainId = await client.getChainId();\n address = timelockLenses[chainId];\n if (!address) throw new Error(`No timelock lens found for ${chainId}`);\n }\n return getContract({abi: lensAbi, address, client});\n};\n\nexport const swappers: Record<number, Address> = {\n [baseSepolia.id]: '0xA16412db5c1Fc7e81574077913f5760d6c368Bd9',\n};\nexport const timelockLenses: Record<number, Address> = {\n [baseSepolia.id]: '0x3B8edE9d261505134A5D8D8C853e158066D13e6d',\n};\nexport const timelockFactories: Record<number, Address> = {\n [baseSepolia.id]: '0xea78d1869f78e301A18ab064b4287563974ab977',\n};\nexport const swapRouters: Record<number, Address> = {\n [baseSepolia.id]: '0x1a005FE3C05F076983F0d66a5F80CB9C61561a5b',\n};\nexport const stateViews: Record<number, Address> = {\n [baseSepolia.id]: '0x06AF24d39b8cb2100958EAAF279707Bec11160C8',\n};\n","import type {Address} from 'viem';\n\nexport interface PriceData {\n currentPrice: number;\n percentChange: number;\n poolAddr: string;\n timestamp: number;\n}\n\nexport interface PriceDataPoint {\n timestamp: Date;\n price: number;\n}\n\nexport type PriceResolution = '1m' | '5m' | '15m' | '1h' | '4h' | '1d';\n\nconst getResolutionConfig = (resolution: PriceResolution) => {\n const resolutionMap = {\n '1m': {timeframe: 'minute', aggregate: '1', seconds: 60},\n '5m': {timeframe: 'minute', aggregate: '5', seconds: 300},\n '15m': {timeframe: 'minute', aggregate: '15', seconds: 900},\n '1h': {timeframe: 'hour', aggregate: '1', seconds: 3600},\n '4h': {timeframe: 'hour', aggregate: '4', seconds: 14400},\n '1d': {timeframe: 'day', aggregate: '1', seconds: 86400},\n };\n return resolutionMap[resolution];\n};\n\nconst fillGaps = (\n prices: PriceDataPoint[],\n start: Date,\n end: Date,\n intervalMs: number,\n): PriceDataPoint[] => {\n if (prices.length === 0) return [];\n\n const priceMap = new Map<number, PriceDataPoint>();\n\n for (const point of prices) {\n const alignedTime =\n Math.floor(point.timestamp.getTime() / intervalMs) * intervalMs;\n priceMap.set(alignedTime, point);\n }\n const filled: PriceDataPoint[] = [];\n\n const actualStart =\n Math.floor(prices[0].timestamp.getTime() / intervalMs) * intervalMs;\n\n let currentTime = actualStart;\n let lastKnownPrice: PriceDataPoint | null = null;\n\n while (currentTime <= end.getTime()) {\n const existing = priceMap.get(currentTime);\n\n if (existing) {\n filled.push(existing);\n lastKnownPrice = existing;\n } else if (lastKnownPrice) {\n filled.push({\n timestamp: new Date(currentTime),\n price: lastKnownPrice.price,\n });\n }\n currentTime += intervalMs;\n }\n return filled;\n};\n\nexport const getPriceHistory = async (\n pool: Address,\n token: 0 | 1,\n resolution: PriceResolution,\n start: Date,\n end: Date,\n): Promise<PriceDataPoint[]> => {\n const network = 'monad-testnet';\n const {timeframe, aggregate, seconds} = getResolutionConfig(resolution);\n\n if (end.getTime() > Date.now()) {\n end = new Date(Date.now());\n }\n const startSecs = Math.floor(start.getTime() / 1000);\n const endSecs = Math.floor(end.getTime() / 1000);\n const diffSeconds = endSecs - startSecs;\n\n const limit = Math.min(Math.ceil(diffSeconds / seconds), 1000);\n\n const url =\n `https://api.geckoterminal.com/api/v2/networks/${network}/pools/${pool}/ohlcv/${timeframe}` +\n `?aggregate=${aggregate}` +\n `&limit=${limit}` +\n `&token=${token === 0 ? 'base' : 'quote'}` +\n '¤cy=usd' +\n `&before_timestamp=${endSecs}`;\n\n const res = await fetch(url, {headers: {Accept: 'application/json'}});\n\n if (!res.ok) {\n throw new Error(`Failed to fetch price history: ${res.statusText}`);\n }\n const data = (await res.json()) as {\n data: {\n attributes: {\n ohlcv_list: [number, number, number, number, number, number][];\n };\n };\n };\n const prices: PriceDataPoint[] = data.data.attributes.ohlcv_list\n .map(([timestamp, , , , close]) => ({\n timestamp: new Date(timestamp * 1000),\n price: close,\n }))\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n return fillGaps(prices, start, end, seconds * 1000).filter(\n point =>\n point.timestamp.getTime() / 1000 >= startSecs &&\n point.timestamp.getTime() / 1000 <= endSecs,\n );\n};\n\nexport const getCurrentPrice = async (\n poolAddr: Address,\n tokenAddr: Address,\n): Promise<PriceData> => {\n const network = 'monad-testnet';\n const geckoUrl = `https://api.geckoterminal.com/api/v2/networks/${network}/pools/${poolAddr.toLowerCase()}`;\n\n const response = await fetch(geckoUrl, {\n method: 'GET',\n headers: {Accept: 'application/json', 'User-Agent': 'TimelockTrade/1.0'},\n cache: 'no-store', // Keep no-store for real-time data\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch price data for pool ${poolAddr}`);\n }\n const data = (await response.json()) as {\n data: {\n attributes: {\n base_token_price_quote_token: string;\n quote_token_price_base_token: string;\n price_change_percentage: {h24: string};\n };\n relationships: {\n base_token: {data: {id: string; type: string}};\n quote_token: {data: {id: string; type: string}};\n };\n };\n };\n const pool = data.data.attributes;\n const relationships = data.data.relationships;\n\n const baseTokenAddr = relationships.base_token.data.id\n .split('_')[1]\n .toLowerCase();\n const quoteTokenAddr = relationships.quote_token.data.id\n .split('_')[1]\n .toLowerCase();\n\n const isBaseToken = tokenAddr.toLowerCase() === baseTokenAddr.toLowerCase();\n const isQuoteToken = tokenAddr.toLowerCase() === quoteTokenAddr.toLowerCase();\n\n if (!isBaseToken && !isQuoteToken) {\n throw new Error(`Token ${tokenAddr} is not part of pool ${poolAddr}`);\n }\n const price = isBaseToken\n ? pool.base_token_price_quote_token\n : pool.quote_token_price_base_token;\n const priceChange = pool.price_change_percentage?.h24;\n\n return {\n currentPrice: parseFloat(price || '0'),\n percentChange: parseFloat(priceChange || '0'),\n poolAddr: poolAddr,\n timestamp: Date.now(),\n };\n};\n","import {SqrtPriceMath, TickMath} from '@uniswap/v3-sdk';\nimport Big from 'big.js';\nimport JSBI from 'jsbi';\nimport type {Amount} from './numberUtils';\n\nexport const PRICE_PRECISION = BigInt(2) ** BigInt(128);\n\nexport const getPriceAtSqrtPriceX96 = (sqrtPriceX96: bigint) => {\n const priceX192 = sqrtPriceX96 * sqrtPriceX96;\n const price = (priceX192 * PRICE_PRECISION) / BigInt(2 ** 192);\n\n return price;\n};\n\nexport const getSqrtPriceX96AtPrice = (price: bigint) => {\n const sqrtPriceX96 = JSBI.BigInt(\n new Big(price.toString())\n .mul(2 ** 192)\n .div(PRICE_PRECISION.toString())\n .sqrt()\n .toFixed(0),\n );\n return sqrtPriceX96;\n};\n\nexport const getPriceAtTick = (tick: number) => {\n const sqrtRatioX96 = BigInt(TickMath.getSqrtRatioAtTick(tick).toString());\n\n const priceX192 = sqrtRatioX96 * sqrtRatioX96;\n const price = (priceX192 * PRICE_PRECISION) / BigInt(2 ** 192);\n\n return price;\n};\n\nexport const getTickAtPrice = (price: bigint) => {\n const priceX192 = (price * BigInt(2 ** 192)) / PRICE_PRECISION;\n const sqrtPriceX96 = JSBI.BigInt(\n new Big(priceX192.toString()).sqrt().toFixed(0),\n );\n return TickMath.getTickAtSqrtRatio(sqrtPriceX96);\n};\n\nexport const getNearestValidStrikeTick = (\n optionType: 'CALL' | 'PUT',\n optionAssetIsToken0: boolean,\n tickSpacing: number,\n currentTick: number,\n strikeTick?: number,\n) => {\n strikeTick = roundTick(strikeTick ?? currentTick, tickSpacing);\n\n if (\n (optionType === 'CALL' && optionAssetIsToken0) ||\n (optionType === 'PUT' && !optionAssetIsToken0)\n ) {\n strikeTick += tickSpacing;\n }\n return strikeTick;\n};\n\nexport const roundTick = (tick: number, spacing: number) => {\n const rem = tick % spacing;\n if (rem >= 0) return tick - rem;\n return tick - rem - spacing;\n};\n\nexport const token0ToToken1 = (amount0: bigint, price: bigint | Amount) => {\n price = typeof price === 'bigint' ? price : price.scaled;\n return (amount0 * price) / PRICE_PRECISION;\n};\nexport const token1ToToken0 = (amount1: bigint, price: bigint | Amount) => {\n price = typeof price === 'bigint' ? price : price.scaled;\n return (amount1 * PRICE_PRECISION) / price;\n};\n\nexport const token0ToToken1AtTick = (amount0: bigint, tick: number) => {\n const price = getPriceAtTick(tick);\n return (amount0 * price) / PRICE_PRECISION;\n};\nexport const token1ToToken0AtTick = (amount1: bigint, tick: number) => {\n const price = getPriceAtTick(tick);\n return (amount1 * PRICE_PRECISION) / price;\n};\n\nexport const getAmountsFromLiquidity = (\n tickLower: number,\n tickUpper: number,\n liquidity: bigint,\n currentTick: number,\n): [bigint, bigint] => {\n const sqrtRatioX96 = TickMath.getSqrtRatioAtTick(currentTick);\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n let delta0 = JSBI.BigInt(0);\n let delta1 = JSBI.BigInt(0);\n\n if (currentTick < tickLower) {\n delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n } else if (currentTick >= tickUpper) {\n delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n } else {\n delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioX96,\n liquidityJSBI,\n false,\n );\n }\n return [BigInt(delta0.toString()), BigInt(delta1.toString())];\n};\n\nexport const liquiditiesToAmount0 = (\n liquidities: bigint[],\n startTick: number,\n tickSpacing: number,\n) => {\n let amount0 = BigInt(0);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n const amount0Delta = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(amount0Delta.toString());\n }\n return amount0;\n};\n\nexport const liquiditiesToAmount1 = (\n liquidities: bigint[],\n startTick: number,\n tickSpacing: number,\n) => {\n let amount1 = BigInt(0);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n const amount1Delta = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount1 += BigInt(amount1Delta.toString());\n }\n return amount1;\n};\n\nexport const liquiditiesToAmounts = (\n liquidities: bigint[],\n startTick: number,\n price: bigint,\n tickSpacing: number,\n) => {\n let amount0 = 0n;\n let amount1 = 0n;\n\n const sqrtRatioX96 = getSqrtPriceX96AtPrice(price);\n\n for (let i = 0; i < liquidities.length; i++) {\n const liquidity = liquidities[i];\n if (liquidity === BigInt(0)) continue;\n\n const tickLower = startTick + tickSpacing * i;\n const tickUpper = tickLower + tickSpacing;\n\n const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);\n const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);\n const liquidityJSBI = JSBI.BigInt(liquidity.toString());\n\n if (JSBI.lessThanOrEqual(sqrtRatioX96, sqrtRatioAX96)) {\n const delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(delta0.toString());\n } else if (JSBI.lessThan(sqrtRatioX96, sqrtRatioBX96)) {\n const delta0 = SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n const delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioX96,\n liquidityJSBI,\n false,\n );\n amount0 += BigInt(delta0.toString());\n amount1 += BigInt(delta1.toString());\n } else {\n const delta1 = SqrtPriceMath.getAmount1Delta(\n sqrtRatioAX96,\n sqrtRatioBX96,\n liquidityJSBI,\n false,\n );\n amount1 += BigInt(delta1.toString());\n }\n }\n return [amount0, amount1];\n};\n","import Big from 'big.js';\n\nexport type Amount = {\n scaled: bigint;\n unscaled: Big;\n decimals: number;\n formatted: string;\n};\n\nexport const zero: Amount = {\n scaled: 0n,\n unscaled: Big(0),\n decimals: 18,\n formatted: '0',\n};\n\nexport const wrapAmount = (scaled: bigint, decimals: number): Amount => {\n const unscaled = unscaleAmount(scaled, decimals);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, decimals, formatted};\n};\n\nexport const wrapAmountUnscaled = (\n unscaled: Big | number | string,\n decimals: number,\n): Amount => {\n unscaled = Big(unscaled);\n const scaled = scaleAmount(unscaled, decimals);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, decimals, formatted};\n};\n\nexport const wrapPrice = (\n scaled: bigint,\n decimals0: number,\n decimals1: number,\n): Amount => {\n const unscaled = unscalePrice(scaled, decimals0, decimals1);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, decimals: 36 + decimals1 - decimals0, formatted};\n};\n\nexport const wrapPriceUnscaled = (\n unscaled: Big | number | string,\n decimals0: number,\n decimals1: number,\n): Amount => {\n unscaled = Big(unscaled);\n const scaled = scalePrice(unscaled, decimals0, decimals1);\n const formatted = formatAmount(unscaled);\n return {scaled, unscaled, decimals: 36 + decimals1 - decimals0, formatted};\n};\n\nexport const unscaleAmount = (scaled: bigint, decimals: number) => {\n return new Big(scaled.toString()).div(new Big(10).pow(decimals));\n};\n\nexport const scaleAmount = (\n unscaled: Big | number | string,\n decimals: number,\n) => {\n return BigInt(\n Big(unscaled).mul(new Big(10).pow(decimals)).round().toFixed(0),\n );\n};\n\nexport const unscalePrice = (\n scaled: bigint,\n decimals0: number,\n decimals1: number,\n precision = 18,\n) => {\n return new Big(scaled.toString())\n .mul(new Big(10).pow(decimals0))\n .div(new Big(10).pow(decimals1))\n .div(new Big(10).pow(precision));\n};\n\nexport const scalePrice = (\n unscaled: Big | number | string,\n decimals0: number,\n decimals1: number,\n precision = 18,\n) => {\n return BigInt(\n Big(unscaled)\n .mul(new Big(10).pow(precision))\n .mul(new Big(10).pow(decimals1))\n .div(new Big(10).pow(decimals0))\n .round()\n .toFixed(0),\n );\n};\n\nexport const formatAmount = (value?: Big | number | string) => {\n if (!value) return '-';\n value = new Big(value);\n\n if (value.gte(1e8)) return formatVagueAmount(value, 2);\n return formatCondensed(Big(value).toFixed(100));\n};\n\nexport const formatVagueAmount = (\n value: Big | number | bigint | string,\n fractionDigits = 2,\n) => {\n value = Number(value);\n if (value === 0) return '0';\n\n const formatted = value.toExponential(fractionDigits);\n return formatted.replace(/\\.?0+e/, 'e').replace(/e\\+/, 'e');\n};\n\nexport const formatCondensed = (\n input: string | number,\n decimals = 2,\n): string => {\n const str = (typeof input === 'number' ? input.toFixed(20) : input)\n .replace(/(\\.\\d*?)0+$/, '$1')\n .replace(/\\.$/, '');\n\n const [whole, decimal] = str.split('.');\n\n const formattedWhole = whole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n if (!decimal) return formattedWhole;\n\n const leadingZeroMatch = decimal.match(/^(0{3,})/);\n\n if (leadingZeroMatch) {\n const zeroCount = leadingZeroMatch[1].length;\n const subscript = toSubscript(zeroCount.toString());\n const remaining = decimal.slice(zeroCount);\n\n const twoDigits = remaining.slice(0, decimals);\n return `${formattedWhole}.0${subscript}${twoDigits}`;\n } else {\n // No subscript needed, find first 2 significant digits\n const nonZeroStart = decimal.search(/[1-9]/); // Find first non-zero digit\n\n if (nonZeroStart === -1) {\n return formattedWhole; // All zeros\n }\n const significantPart = decimal.slice(nonZeroStart);\n const twoDigits = significantPart.slice(0, decimals);\n const leadingZeros = decimal.slice(0, nonZeroStart);\n\n return `${formattedWhole}.${leadingZeros}${twoDigits}`;\n }\n};\n\nconst toSubscript = (input: string) => {\n return input.replace(/[0-9]/g, m => '₀₁₂₃₄₅₆₇₈₉'[+m]);\n};\n\nexport const formatUSD = (value: Big | string | number): string => {\n return '$' + formatAmount(value);\n};\n","import type {OptionData} from '~/package/client';\nimport {\n getPriceAtTick,\n liquiditiesToAmounts,\n token0ToToken1,\n token1ToToken0,\n} from './liquidityUtils';\n\nexport const getPayoutAtTick = (\n option: OptionData,\n liquidities: bigint[],\n tick: number,\n tickSpacing: number,\n optionAssetIsToken0: boolean,\n) => {\n return getPayoutAtPrice(\n option,\n liquidities,\n getPriceAtTick(tick),\n tickSpacing,\n optionAssetIsToken0,\n );\n};\n\nexport const getPayoutAtPrice = (\n option: OptionData,\n liquidities: bigint[],\n price: bigint,\n tickSpacing: number,\n optionAssetIsToken0: boolean,\n) => {\n const [borrowedAmount0, borrowedAmount1] = liquiditiesToAmounts(\n liquidities,\n option.startTick,\n option.entryPrice,\n tickSpacing,\n );\n const [repayAmount0, repayAmount1] = liquiditiesToAmounts(\n liquidities,\n option.startTick,\n price,\n tickSpacing,\n );\n const totalAmount = optionAssetIsToken0\n ? borrowedAmount1 + token0ToToken1(borrowedAmount0, price)\n : borrowedAmount0 + token1ToToken0(borrowedAmount1, price);\n\n const repayAmount = optionAssetIsToken0\n ? repayAmount1 + token0ToToken1(repayAmount0, price)\n : repayAmount0 + token1ToToken0(repayAmount1, price);\n\n const delta = totalAmount - repayAmount;\n const payout = delta < 0n ? 0n : delta;\n\n return payout;\n};\n"],"mappings":"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"}
|