@bananapus/nana-sdk-core 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/cjs/utils/hook.d.ts +15 -0
  2. package/dist/cjs/utils/hook.d.ts.map +1 -1
  3. package/dist/cjs/utils/hook.js +20 -0
  4. package/dist/cjs/utils/hook.js.map +1 -1
  5. package/dist/cjs/utils/index.d.ts +1 -0
  6. package/dist/cjs/utils/index.d.ts.map +1 -1
  7. package/dist/cjs/utils/index.js +1 -0
  8. package/dist/cjs/utils/index.js.map +1 -1
  9. package/dist/cjs/utils/ipfs.d.ts +33 -1
  10. package/dist/cjs/utils/ipfs.d.ts.map +1 -1
  11. package/dist/cjs/utils/ipfs.js +212 -8
  12. package/dist/cjs/utils/ipfs.js.map +1 -1
  13. package/dist/cjs/utils/ipfs.test.js +34 -0
  14. package/dist/cjs/utils/ipfs.test.js.map +1 -1
  15. package/dist/cjs/v6/cashOut.d.ts +23 -0
  16. package/dist/cjs/v6/cashOut.d.ts.map +1 -1
  17. package/dist/cjs/v6/cashOut.js +35 -0
  18. package/dist/cjs/v6/cashOut.js.map +1 -1
  19. package/dist/cjs/v6/cashOut.test.js +20 -0
  20. package/dist/cjs/v6/cashOut.test.js.map +1 -1
  21. package/dist/cjs/v6/index.d.ts +3 -0
  22. package/dist/cjs/v6/index.d.ts.map +1 -1
  23. package/dist/cjs/v6/index.js +3 -0
  24. package/dist/cjs/v6/index.js.map +1 -1
  25. package/dist/cjs/v6/launch.d.ts +23 -2
  26. package/dist/cjs/v6/launch.d.ts.map +1 -1
  27. package/dist/cjs/v6/launch.js +40 -1
  28. package/dist/cjs/v6/launch.js.map +1 -1
  29. package/dist/cjs/v6/launch.test.js +25 -0
  30. package/dist/cjs/v6/launch.test.js.map +1 -1
  31. package/dist/cjs/v6/nft.d.ts +165 -0
  32. package/dist/cjs/v6/nft.d.ts.map +1 -0
  33. package/dist/cjs/v6/nft.js +356 -0
  34. package/dist/cjs/v6/nft.js.map +1 -0
  35. package/dist/cjs/v6/nft.test.d.ts +2 -0
  36. package/dist/cjs/v6/nft.test.d.ts.map +1 -0
  37. package/dist/cjs/v6/nft.test.js +279 -0
  38. package/dist/cjs/v6/nft.test.js.map +1 -0
  39. package/dist/cjs/v6/pay.d.ts +13 -5
  40. package/dist/cjs/v6/pay.d.ts.map +1 -1
  41. package/dist/cjs/v6/pay.js +15 -18
  42. package/dist/cjs/v6/pay.js.map +1 -1
  43. package/dist/cjs/v6/pay.test.js +7 -0
  44. package/dist/cjs/v6/pay.test.js.map +1 -1
  45. package/dist/cjs/v6/permissions.d.ts +21 -0
  46. package/dist/cjs/v6/permissions.d.ts.map +1 -1
  47. package/dist/cjs/v6/permissions.js +44 -1
  48. package/dist/cjs/v6/permissions.js.map +1 -1
  49. package/dist/cjs/v6/permissions.test.js +25 -0
  50. package/dist/cjs/v6/permissions.test.js.map +1 -1
  51. package/dist/cjs/v6/projectPayers.d.ts +178 -0
  52. package/dist/cjs/v6/projectPayers.d.ts.map +1 -0
  53. package/dist/cjs/v6/projectPayers.js +108 -0
  54. package/dist/cjs/v6/projectPayers.js.map +1 -0
  55. package/dist/cjs/v6/projectPayers.test.d.ts +2 -0
  56. package/dist/cjs/v6/projectPayers.test.d.ts.map +1 -0
  57. package/dist/cjs/v6/projectPayers.test.js +85 -0
  58. package/dist/cjs/v6/projectPayers.test.js.map +1 -0
  59. package/dist/cjs/v6/revnets.d.ts +3 -2
  60. package/dist/cjs/v6/revnets.d.ts.map +1 -1
  61. package/dist/cjs/v6/revnets.js +3 -2
  62. package/dist/cjs/v6/revnets.js.map +1 -1
  63. package/dist/cjs/v6/rulesets.d.ts +42 -0
  64. package/dist/cjs/v6/rulesets.d.ts.map +1 -1
  65. package/dist/cjs/v6/rulesets.js +87 -0
  66. package/dist/cjs/v6/rulesets.js.map +1 -1
  67. package/dist/cjs/v6/rulesets.test.js +54 -0
  68. package/dist/cjs/v6/rulesets.test.js.map +1 -1
  69. package/dist/cjs/v6/suckers.d.ts +740 -2
  70. package/dist/cjs/v6/suckers.d.ts.map +1 -1
  71. package/dist/cjs/v6/suckers.js +647 -8
  72. package/dist/cjs/v6/suckers.js.map +1 -1
  73. package/dist/cjs/v6/suckers.test.js +228 -0
  74. package/dist/cjs/v6/suckers.test.js.map +1 -1
  75. package/dist/cjs/v6/uniswapV4.d.ts +82 -0
  76. package/dist/cjs/v6/uniswapV4.d.ts.map +1 -0
  77. package/dist/cjs/v6/uniswapV4.js +336 -0
  78. package/dist/cjs/v6/uniswapV4.js.map +1 -0
  79. package/dist/cjs/v6/uniswapV4.test.d.ts +2 -0
  80. package/dist/cjs/v6/uniswapV4.test.d.ts.map +1 -0
  81. package/dist/cjs/v6/uniswapV4.test.js +128 -0
  82. package/dist/cjs/v6/uniswapV4.test.js.map +1 -0
  83. package/dist/esm/utils/hook.d.ts +15 -0
  84. package/dist/esm/utils/hook.d.ts.map +1 -1
  85. package/dist/esm/utils/hook.js +20 -1
  86. package/dist/esm/utils/hook.js.map +1 -1
  87. package/dist/esm/utils/index.d.ts +1 -0
  88. package/dist/esm/utils/index.d.ts.map +1 -1
  89. package/dist/esm/utils/index.js +1 -0
  90. package/dist/esm/utils/index.js.map +1 -1
  91. package/dist/esm/utils/ipfs.d.ts +33 -1
  92. package/dist/esm/utils/ipfs.d.ts.map +1 -1
  93. package/dist/esm/utils/ipfs.js +204 -8
  94. package/dist/esm/utils/ipfs.js.map +1 -1
  95. package/dist/esm/utils/ipfs.test.js +35 -1
  96. package/dist/esm/utils/ipfs.test.js.map +1 -1
  97. package/dist/esm/v6/cashOut.d.ts +23 -0
  98. package/dist/esm/v6/cashOut.d.ts.map +1 -1
  99. package/dist/esm/v6/cashOut.js +34 -0
  100. package/dist/esm/v6/cashOut.js.map +1 -1
  101. package/dist/esm/v6/cashOut.test.js +22 -2
  102. package/dist/esm/v6/cashOut.test.js.map +1 -1
  103. package/dist/esm/v6/index.d.ts +3 -0
  104. package/dist/esm/v6/index.d.ts.map +1 -1
  105. package/dist/esm/v6/index.js +3 -0
  106. package/dist/esm/v6/index.js.map +1 -1
  107. package/dist/esm/v6/launch.d.ts +23 -2
  108. package/dist/esm/v6/launch.d.ts.map +1 -1
  109. package/dist/esm/v6/launch.js +39 -2
  110. package/dist/esm/v6/launch.js.map +1 -1
  111. package/dist/esm/v6/launch.test.js +27 -2
  112. package/dist/esm/v6/launch.test.js.map +1 -1
  113. package/dist/esm/v6/nft.d.ts +165 -0
  114. package/dist/esm/v6/nft.d.ts.map +1 -0
  115. package/dist/esm/v6/nft.js +342 -0
  116. package/dist/esm/v6/nft.js.map +1 -0
  117. package/dist/esm/v6/nft.test.d.ts +2 -0
  118. package/dist/esm/v6/nft.test.d.ts.map +1 -0
  119. package/dist/esm/v6/nft.test.js +277 -0
  120. package/dist/esm/v6/nft.test.js.map +1 -0
  121. package/dist/esm/v6/pay.d.ts +13 -5
  122. package/dist/esm/v6/pay.d.ts.map +1 -1
  123. package/dist/esm/v6/pay.js +17 -20
  124. package/dist/esm/v6/pay.js.map +1 -1
  125. package/dist/esm/v6/pay.test.js +7 -0
  126. package/dist/esm/v6/pay.test.js.map +1 -1
  127. package/dist/esm/v6/permissions.d.ts +21 -0
  128. package/dist/esm/v6/permissions.d.ts.map +1 -1
  129. package/dist/esm/v6/permissions.js +40 -0
  130. package/dist/esm/v6/permissions.js.map +1 -1
  131. package/dist/esm/v6/permissions.test.js +26 -1
  132. package/dist/esm/v6/permissions.test.js.map +1 -1
  133. package/dist/esm/v6/projectPayers.d.ts +178 -0
  134. package/dist/esm/v6/projectPayers.d.ts.map +1 -0
  135. package/dist/esm/v6/projectPayers.js +101 -0
  136. package/dist/esm/v6/projectPayers.js.map +1 -0
  137. package/dist/esm/v6/projectPayers.test.d.ts +2 -0
  138. package/dist/esm/v6/projectPayers.test.d.ts.map +1 -0
  139. package/dist/esm/v6/projectPayers.test.js +83 -0
  140. package/dist/esm/v6/projectPayers.test.js.map +1 -0
  141. package/dist/esm/v6/revnets.d.ts +3 -2
  142. package/dist/esm/v6/revnets.d.ts.map +1 -1
  143. package/dist/esm/v6/revnets.js +3 -2
  144. package/dist/esm/v6/revnets.js.map +1 -1
  145. package/dist/esm/v6/rulesets.d.ts +42 -0
  146. package/dist/esm/v6/rulesets.d.ts.map +1 -1
  147. package/dist/esm/v6/rulesets.js +83 -0
  148. package/dist/esm/v6/rulesets.js.map +1 -1
  149. package/dist/esm/v6/rulesets.test.js +55 -1
  150. package/dist/esm/v6/rulesets.test.js.map +1 -1
  151. package/dist/esm/v6/suckers.d.ts +740 -2
  152. package/dist/esm/v6/suckers.d.ts.map +1 -1
  153. package/dist/esm/v6/suckers.js +630 -8
  154. package/dist/esm/v6/suckers.js.map +1 -1
  155. package/dist/esm/v6/suckers.test.js +230 -2
  156. package/dist/esm/v6/suckers.test.js.map +1 -1
  157. package/dist/esm/v6/uniswapV4.d.ts +82 -0
  158. package/dist/esm/v6/uniswapV4.d.ts.map +1 -0
  159. package/dist/esm/v6/uniswapV4.js +318 -0
  160. package/dist/esm/v6/uniswapV4.js.map +1 -0
  161. package/dist/esm/v6/uniswapV4.test.d.ts +2 -0
  162. package/dist/esm/v6/uniswapV4.test.d.ts.map +1 -0
  163. package/dist/esm/v6/uniswapV4.test.js +126 -0
  164. package/dist/esm/v6/uniswapV4.test.js.map +1 -0
  165. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  166. package/dist/tsconfig.tsbuildinfo +1 -1
  167. package/package.json +1 -1
@@ -0,0 +1,318 @@
1
+ import { encodeAbiParameters, keccak256, toEventSelector } from "viem";
2
+ /**
3
+ * Canonical Uniswap V4 PoolManager deployments used by Juicebox v6.
4
+ * Optimism Sepolia is intentionally absent: deploy-all skips the Uniswap stack
5
+ * there because Uniswap has not published supported V4 periphery deployments.
6
+ */
7
+ export const UNISWAP_V4_POOL_MANAGER_ADDRESSES = {
8
+ 1: "0x000000000004444c5dc75cb358380d2e3de08a90",
9
+ 10: "0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",
10
+ 8453: "0x498581ff718922c3f8e6a244956af099b2652b2b",
11
+ 42161: "0x360e68faccca8ca495c1b759fd9eee466db9fb32",
12
+ 84532: "0x05e73354cfdd6745c338b50bcfdfa3aa6fa03408",
13
+ 421614: "0xfb3e0c6f74eb1a21cc1da29aec80d2dfe6c9a317",
14
+ 11155111: "0xe03a1074c86cfedd5c142c4f04f1a1536e203543",
15
+ };
16
+ /** Canonical Uniswap V4 PositionManager deployments used by Juicebox v6. */
17
+ export const UNISWAP_V4_POSITION_MANAGER_ADDRESSES = {
18
+ 1: "0xbd216513d74c8cf14cf4747e6aaa6420ff64ee9e",
19
+ 10: "0x3c3ea4b57a46241e54610e5f022e5c45859a1017",
20
+ 8453: "0x7c5f5a4bbd8fd63184577525326123b519429bdc",
21
+ 42161: "0xd88f38f930b7952f2db2432cb002e7abbf3dd869",
22
+ 84532: "0x4b2c77d209d3405f41a037ec6c77f7f5b8e2ca80",
23
+ 421614: "0xac631556d3d4019c95769033b5e719dd77124bac",
24
+ 11155111: "0x429ba70129df741b2ca2a85bc3a2a3328e5c09b4",
25
+ };
26
+ /** Canonical V4Quoter deployments; missing chains must fail closed. */
27
+ export const UNISWAP_V4_QUOTER_ADDRESSES = {
28
+ 1: "0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",
29
+ 10: "0x1f3131a13296fb91c90870043742c3cdbff1a8d7",
30
+ 8453: "0x0d5e0f971ed27fbff6c2837bf31316121532048d",
31
+ 42161: "0x3972c00f7ed4885e145823eb7c655375d275a1c5",
32
+ 84532: "0x4a6513c898fe1b2d0e78d3b0e0a4a151589b1cba",
33
+ 421614: "0x7de51022d70a725b508085468052e25e22b5c4c9",
34
+ 11155111: "0x61b3f2011a92d183c7dbadbda940a7555ccf9227",
35
+ };
36
+ /** Permit2 is deployed at the same address on supported EVM chains. */
37
+ export const UNISWAP_PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
38
+ /** Resolve the supported V4 surface for a chain without guessing addresses. */
39
+ export function uniswapV4Deployment(chainId) {
40
+ const poolManager = UNISWAP_V4_POOL_MANAGER_ADDRESSES[chainId];
41
+ if (!poolManager)
42
+ return null;
43
+ return {
44
+ poolManager,
45
+ positionManager: UNISWAP_V4_POSITION_MANAGER_ADDRESSES[chainId] ?? null,
46
+ quoter: UNISWAP_V4_QUOTER_ADDRESSES[chainId] ?? null,
47
+ permit2: UNISWAP_PERMIT2_ADDRESS,
48
+ };
49
+ }
50
+ export const UNISWAP_V4_Q96 = 1n << 96n;
51
+ export const UNISWAP_V4_MAX_TICK = 887_272;
52
+ const POOL_KEY_TUPLE = [
53
+ {
54
+ type: "tuple",
55
+ components: [
56
+ { type: "address" },
57
+ { type: "address" },
58
+ { type: "uint24" },
59
+ { type: "int24" },
60
+ { type: "address" },
61
+ ],
62
+ },
63
+ ];
64
+ /** `PoolId.unwrap(PoolIdLibrary.toId(key))`. */
65
+ export function uniswapV4PoolId(key) {
66
+ return keccak256(encodeAbiParameters(POOL_KEY_TUPLE, [
67
+ [key.currency0, key.currency1, key.fee, key.tickSpacing, key.hooks],
68
+ ]));
69
+ }
70
+ /** Storage slot containing the pool's packed slot0 in PoolManager. */
71
+ export function uniswapV4PoolStateSlot(poolId) {
72
+ return keccak256(encodeAbiParameters([{ type: "bytes32" }, { type: "uint256" }], [poolId, 6n]));
73
+ }
74
+ /** Extract slot0's low-160-bit sqrtPriceX96 value. */
75
+ export function uniswapV4SqrtPriceX96FromSlot0(slot0) {
76
+ return BigInt(slot0) & ((1n << 160n) - 1n);
77
+ }
78
+ /**
79
+ * Convert a pool sqrt price into human pair-token units per project token.
80
+ * Juicebox project tokens use 18 decimals.
81
+ */
82
+ export function uniswapV4PriceFromSqrtPriceX96(sqrtPriceX96, pairIsCurrency0, pairTokenDecimals) {
83
+ if (sqrtPriceX96 <= 0n)
84
+ return null;
85
+ const sqrtPrice = Number(sqrtPriceX96) / 2 ** 96;
86
+ const rawPrice = sqrtPrice * sqrtPrice;
87
+ const rawRatio = pairIsCurrency0
88
+ ? rawPrice > 0
89
+ ? 1 / rawPrice
90
+ : null
91
+ : rawPrice;
92
+ if (rawRatio === null)
93
+ return null;
94
+ const price = rawRatio * 10 ** (18 - pairTokenDecimals);
95
+ return Number.isFinite(price) && price > 0 ? price : null;
96
+ }
97
+ /** Exact integer port of Uniswap V4 TickMath.getSqrtPriceAtTick. */
98
+ export function uniswapV4SqrtPriceX96AtTick(tick) {
99
+ tick = Math.trunc(tick);
100
+ const absoluteTick = tick < 0 ? -tick : tick;
101
+ if (absoluteTick > UNISWAP_V4_MAX_TICK) {
102
+ throw new Error("Uniswap V4 tick is outside the supported range.");
103
+ }
104
+ let price = absoluteTick & 0x1 ? 0xfffcb933bd6fad37aa2d162d1a594001n : 1n << 128n;
105
+ if (absoluteTick & 0x2)
106
+ price = (price * 0xfff97272373d413259a46990580e213an) >> 128n;
107
+ if (absoluteTick & 0x4)
108
+ price = (price * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;
109
+ if (absoluteTick & 0x8)
110
+ price = (price * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;
111
+ if (absoluteTick & 0x10)
112
+ price = (price * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;
113
+ if (absoluteTick & 0x20)
114
+ price = (price * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;
115
+ if (absoluteTick & 0x40)
116
+ price = (price * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;
117
+ if (absoluteTick & 0x80)
118
+ price = (price * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;
119
+ if (absoluteTick & 0x100)
120
+ price = (price * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;
121
+ if (absoluteTick & 0x200)
122
+ price = (price * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;
123
+ if (absoluteTick & 0x400)
124
+ price = (price * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;
125
+ if (absoluteTick & 0x800)
126
+ price = (price * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;
127
+ if (absoluteTick & 0x1000)
128
+ price = (price * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;
129
+ if (absoluteTick & 0x2000)
130
+ price = (price * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;
131
+ if (absoluteTick & 0x4000)
132
+ price = (price * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;
133
+ if (absoluteTick & 0x8000)
134
+ price = (price * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;
135
+ if (absoluteTick & 0x10000)
136
+ price = (price * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;
137
+ if (absoluteTick & 0x20000)
138
+ price = (price * 0x5d6af8dedb81196699c329225ee604n) >> 128n;
139
+ if (absoluteTick & 0x40000)
140
+ price = (price * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;
141
+ if (absoluteTick & 0x80000)
142
+ price = (price * 0x48a170391f7dc42444e8fa2n) >> 128n;
143
+ if (tick > 0)
144
+ price = ((1n << 256n) - 1n) / price;
145
+ return (price + 0xffffffffn) >> 32n;
146
+ }
147
+ function sortSqrtPrices(a, b) {
148
+ return a > b ? [b, a] : [a, b];
149
+ }
150
+ function requireSqrtRange(a, b) {
151
+ if (a <= 0n || b <= 0n || a === b) {
152
+ throw new Error("A Uniswap V4 sqrt-price range must be positive and non-zero.");
153
+ }
154
+ }
155
+ function amount0ForLiquidity(sqrtA, sqrtB, liquidity) {
156
+ const [lower, upper] = sortSqrtPrices(sqrtA, sqrtB);
157
+ return ((liquidity << 96n) * (upper - lower)) / upper / lower;
158
+ }
159
+ function amount1ForLiquidity(sqrtA, sqrtB, liquidity) {
160
+ const [lower, upper] = sortSqrtPrices(sqrtA, sqrtB);
161
+ return (liquidity * (upper - lower)) / UNISWAP_V4_Q96;
162
+ }
163
+ /** Currency amounts represented by liquidity at a current sqrt price. */
164
+ export function uniswapV4AmountsForLiquidity(currentSqrtPrice, sqrtPriceA, sqrtPriceB, liquidity) {
165
+ requireSqrtRange(sqrtPriceA, sqrtPriceB);
166
+ if (currentSqrtPrice <= 0n || liquidity < 0n) {
167
+ throw new Error("Uniswap V4 prices must be positive and liquidity cannot be negative.");
168
+ }
169
+ const [lower, upper] = sortSqrtPrices(sqrtPriceA, sqrtPriceB);
170
+ if (currentSqrtPrice <= lower) {
171
+ return {
172
+ amount0: amount0ForLiquidity(lower, upper, liquidity),
173
+ amount1: 0n,
174
+ };
175
+ }
176
+ if (currentSqrtPrice < upper) {
177
+ return {
178
+ amount0: amount0ForLiquidity(currentSqrtPrice, upper, liquidity),
179
+ amount1: amount1ForLiquidity(lower, currentSqrtPrice, liquidity),
180
+ };
181
+ }
182
+ return {
183
+ amount0: 0n,
184
+ amount1: amount1ForLiquidity(lower, upper, liquidity),
185
+ };
186
+ }
187
+ function liquidityForAmount0(sqrtA, sqrtB, amount0) {
188
+ const [lower, upper] = sortSqrtPrices(sqrtA, sqrtB);
189
+ return (amount0 * ((lower * upper) / UNISWAP_V4_Q96)) / (upper - lower);
190
+ }
191
+ function liquidityForAmount1(sqrtA, sqrtB, amount1) {
192
+ const [lower, upper] = sortSqrtPrices(sqrtA, sqrtB);
193
+ return (amount1 * UNISWAP_V4_Q96) / (upper - lower);
194
+ }
195
+ /** Maximum liquidity supported by two token amounts over a range. */
196
+ export function uniswapV4LiquidityForAmounts(currentSqrtPrice, sqrtPriceA, sqrtPriceB, amount0, amount1) {
197
+ requireSqrtRange(sqrtPriceA, sqrtPriceB);
198
+ if (currentSqrtPrice <= 0n || amount0 < 0n || amount1 < 0n) {
199
+ throw new Error("Uniswap V4 prices must be positive and amounts cannot be negative.");
200
+ }
201
+ const [lower, upper] = sortSqrtPrices(sqrtPriceA, sqrtPriceB);
202
+ if (currentSqrtPrice <= lower) {
203
+ return liquidityForAmount0(lower, upper, amount0);
204
+ }
205
+ if (currentSqrtPrice < upper) {
206
+ const liquidity0 = liquidityForAmount0(currentSqrtPrice, upper, amount0);
207
+ const liquidity1 = liquidityForAmount1(lower, currentSqrtPrice, amount1);
208
+ return liquidity0 < liquidity1 ? liquidity0 : liquidity1;
209
+ }
210
+ return liquidityForAmount1(lower, upper, amount1);
211
+ }
212
+ function requireTickSpacing(spacing) {
213
+ if (!Number.isInteger(spacing) || spacing <= 0) {
214
+ throw new Error("Uniswap V4 tick spacing must be a positive integer.");
215
+ }
216
+ }
217
+ function requireIntegerTick(tick) {
218
+ if (!Number.isInteger(tick)) {
219
+ throw new Error("A Uniswap V4 tick must be an integer.");
220
+ }
221
+ }
222
+ /** Align a tick down to its nearest usable tick. */
223
+ export function uniswapV4AlignTickDown(tick, spacing) {
224
+ requireTickSpacing(spacing);
225
+ requireIntegerTick(tick);
226
+ let remainder = tick % spacing;
227
+ if (remainder !== 0 && tick < 0)
228
+ remainder += spacing;
229
+ return tick - remainder;
230
+ }
231
+ /** Align a tick up to its nearest usable tick. */
232
+ export function uniswapV4AlignTickUp(tick, spacing) {
233
+ requireTickSpacing(spacing);
234
+ requireIntegerTick(tick);
235
+ return uniswapV4AlignTickDown(tick + spacing - 1, spacing);
236
+ }
237
+ function signExtend24(value) {
238
+ return Number(value & 0x800000n ? value - 0x1000000n : value);
239
+ }
240
+ /** Decode PositionManager's packed lower and upper ticks. */
241
+ export function uniswapV4PositionTicks(positionInfo) {
242
+ return {
243
+ lower: signExtend24((positionInfo >> 8n) & 0xffffffn),
244
+ upper: signExtend24((positionInfo >> 32n) & 0xffffffn),
245
+ };
246
+ }
247
+ /**
248
+ * Human-price counterpart amount for a concentrated-liquidity deposit.
249
+ * This float helper is for form auto-fill; transaction amounts should use the
250
+ * exact bigint liquidity helpers above.
251
+ */
252
+ export function uniswapV4CounterpartAmount(amount, inputIsPairToken, currentPrice, minPrice, maxPrice) {
253
+ if (!(amount > 0) ||
254
+ !(currentPrice > 0) ||
255
+ !(minPrice > 0) ||
256
+ !(maxPrice > minPrice)) {
257
+ return null;
258
+ }
259
+ const currentSqrt = Math.sqrt(currentPrice);
260
+ const minSqrt = Math.sqrt(minPrice);
261
+ const maxSqrt = Math.sqrt(maxPrice);
262
+ if (currentPrice <= minPrice)
263
+ return inputIsPairToken ? null : 0;
264
+ if (currentPrice >= maxPrice)
265
+ return inputIsPairToken ? 0 : null;
266
+ if (inputIsPairToken) {
267
+ const liquidity = amount / (currentSqrt - minSqrt);
268
+ return liquidity * (1 / currentSqrt - 1 / maxSqrt);
269
+ }
270
+ const liquidity = amount / (1 / currentSqrt - 1 / maxSqrt);
271
+ return liquidity * (currentSqrt - minSqrt);
272
+ }
273
+ /** Choose the economic floor/ceiling range when it brackets spot. */
274
+ export function uniswapV4DefaultPriceRange(poolPrice, cashOutFloor, issuanceCeiling) {
275
+ const spot = Number.isFinite(poolPrice) && poolPrice > 0 ? poolPrice : 0;
276
+ const floor = Number.isFinite(cashOutFloor) && cashOutFloor > 0 ? cashOutFloor : 0;
277
+ const ceiling = Number.isFinite(issuanceCeiling) && issuanceCeiling > 0
278
+ ? issuanceCeiling
279
+ : 0;
280
+ const economic = spot > 0 && floor > 0 && ceiling > floor && floor < spot && spot < ceiling;
281
+ let min = economic ? floor : spot > 0 ? spot / 2 : ceiling / 10;
282
+ let max = economic ? ceiling : spot > 0 ? spot * 2 : ceiling;
283
+ if (spot > 0 && (!(min > 0) || min >= spot))
284
+ min = spot / 2;
285
+ if (spot > 0 && !(max > spot))
286
+ max = spot * 2;
287
+ if (!(min > 0) && max > 0)
288
+ min = max / 10;
289
+ if (!(max > min))
290
+ max = min > 0 ? min * 10 : 0;
291
+ return { min, max, economic };
292
+ }
293
+ export const UNISWAP_V4_INITIALIZE_TOPIC = toEventSelector("Initialize(bytes32,address,address,uint24,int24,address,uint160,int24)").toLowerCase();
294
+ export const UNISWAP_V4_MODIFY_LIQUIDITY_TOPIC = toEventSelector("ModifyLiquidity(bytes32,address,int24,int24,int256,bytes32)").toLowerCase();
295
+ /** Extract the PositionManager token id (the position salt) from a pool log. */
296
+ export function uniswapV4PositionTokenIdFromLog(log, positionManager) {
297
+ if (String(log.topics?.[0] ?? "").toLowerCase() !==
298
+ UNISWAP_V4_MODIFY_LIQUIDITY_TOPIC) {
299
+ return null;
300
+ }
301
+ const sender = String(log.topics?.[2] ?? "")
302
+ .slice(-40)
303
+ .toLowerCase();
304
+ if (sender !== positionManager.slice(2).toLowerCase())
305
+ return null;
306
+ const data = String(log.data ?? "");
307
+ if (!/^0x[0-9a-fA-F]{256}$/.test(data)) {
308
+ throw new Error("Malformed Uniswap V4 ModifyLiquidity log.");
309
+ }
310
+ const tokenId = BigInt(`0x${data.slice(194, 258)}`);
311
+ return tokenId > 0n ? tokenId : null;
312
+ }
313
+ /** Whether an address is one of the canonical PoolManager deployments. */
314
+ export function isUniswapV4PoolManager(address) {
315
+ const normalized = address.toLowerCase();
316
+ return Object.values(UNISWAP_V4_POOL_MANAGER_ADDRESSES).some((candidate) => candidate.toLowerCase() === normalized);
317
+ }
318
+ //# sourceMappingURL=uniswapV4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswapV4.js","sourceRoot":"","sources":["../../../src/v6/uniswapV4.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=uniswapV4.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswapV4.test.d.ts","sourceRoot":"","sources":["../../../src/v6/uniswapV4.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ import { encodeAbiParameters, pad, zeroAddress, zeroHash } from "viem";
2
+ import { describe, expect, test } from "vitest";
3
+ import { UNISWAP_V4_MAX_TICK, UNISWAP_V4_MODIFY_LIQUIDITY_TOPIC, UNISWAP_V4_POOL_MANAGER_ADDRESSES, UNISWAP_V4_POSITION_MANAGER_ADDRESSES, UNISWAP_V4_Q96, UNISWAP_V4_QUOTER_ADDRESSES, isUniswapV4PoolManager, uniswapV4AlignTickDown, uniswapV4AlignTickUp, uniswapV4AmountsForLiquidity, uniswapV4CounterpartAmount, uniswapV4DefaultPriceRange, uniswapV4Deployment, uniswapV4LiquidityForAmounts, uniswapV4PoolId, uniswapV4PoolStateSlot, uniswapV4PositionTicks, uniswapV4PositionTokenIdFromLog, uniswapV4PriceFromSqrtPriceX96, uniswapV4SqrtPriceX96AtTick, uniswapV4SqrtPriceX96FromSlot0, } from "./uniswapV4.js";
4
+ const TOKEN = "0x00000000000000000000000000000000000000aa";
5
+ const HOOK = "0x00000000000000000000000000000000000000cc";
6
+ describe("Uniswap V4 pool primitives", () => {
7
+ test("derives stable pool ids and storage slots", () => {
8
+ const poolId = uniswapV4PoolId({
9
+ currency0: zeroAddress,
10
+ currency1: TOKEN,
11
+ fee: 10_000,
12
+ tickSpacing: 200,
13
+ hooks: HOOK,
14
+ });
15
+ expect(poolId).toMatch(/^0x[0-9a-f]{64}$/);
16
+ expect(uniswapV4PoolStateSlot(poolId)).toMatch(/^0x[0-9a-f]{64}$/);
17
+ expect(uniswapV4PoolId({
18
+ currency0: zeroAddress,
19
+ currency1: TOKEN,
20
+ fee: 10_000,
21
+ tickSpacing: 200,
22
+ hooks: HOOK,
23
+ })).toBe(poolId);
24
+ });
25
+ test("extracts slot0's low 160-bit sqrt price", () => {
26
+ const highBits = 123n << 160n;
27
+ const slot = `0x${(highBits | UNISWAP_V4_Q96).toString(16).padStart(64, "0")}`;
28
+ expect(uniswapV4SqrtPriceX96FromSlot0(slot)).toBe(UNISWAP_V4_Q96);
29
+ expect(uniswapV4PriceFromSqrtPriceX96(UNISWAP_V4_Q96, false, 18)).toBe(1);
30
+ expect(uniswapV4PriceFromSqrtPriceX96(0n, false, 18)).toBeNull();
31
+ });
32
+ test("fails closed on Optimism Sepolia's unsupported V4 stack", () => {
33
+ expect(Object.keys(UNISWAP_V4_POOL_MANAGER_ADDRESSES)).toHaveLength(7);
34
+ expect(UNISWAP_V4_POOL_MANAGER_ADDRESSES[11155420]).toBeUndefined();
35
+ expect(UNISWAP_V4_POSITION_MANAGER_ADDRESSES[11155420]).toBeUndefined();
36
+ expect(UNISWAP_V4_QUOTER_ADDRESSES[11155420]).toBeUndefined();
37
+ expect(uniswapV4Deployment(11155420)).toBeNull();
38
+ expect(uniswapV4Deployment(1)).toMatchObject({
39
+ poolManager: UNISWAP_V4_POOL_MANAGER_ADDRESSES[1],
40
+ positionManager: UNISWAP_V4_POSITION_MANAGER_ADDRESSES[1],
41
+ quoter: UNISWAP_V4_QUOTER_ADDRESSES[1],
42
+ });
43
+ expect(isUniswapV4PoolManager(UNISWAP_V4_POOL_MANAGER_ADDRESSES[1])).toBe(true);
44
+ expect(isUniswapV4PoolManager(TOKEN)).toBe(false);
45
+ });
46
+ });
47
+ describe("Uniswap V4 tick and liquidity math", () => {
48
+ test("matches TickMath boundaries and is monotonic", () => {
49
+ expect(uniswapV4SqrtPriceX96AtTick(0)).toBe(UNISWAP_V4_Q96);
50
+ expect(uniswapV4SqrtPriceX96AtTick(-UNISWAP_V4_MAX_TICK)).toBe(4295128739n);
51
+ expect(uniswapV4SqrtPriceX96AtTick(UNISWAP_V4_MAX_TICK)).toBe(1461446703485210103287273052203988822378723970342n);
52
+ expect(uniswapV4SqrtPriceX96AtTick(-200)).toBeLessThan(uniswapV4SqrtPriceX96AtTick(200));
53
+ expect(() => uniswapV4SqrtPriceX96AtTick(UNISWAP_V4_MAX_TICK + 1)).toThrow(/outside/);
54
+ });
55
+ test("derived liquidity never consumes more than the supplied amounts", () => {
56
+ const current = uniswapV4SqrtPriceX96AtTick(0);
57
+ const lower = uniswapV4SqrtPriceX96AtTick(-6_000);
58
+ const upper = uniswapV4SqrtPriceX96AtTick(6_000);
59
+ const amount0 = 10n ** 18n;
60
+ const amount1 = 10n ** 18n;
61
+ const liquidity = uniswapV4LiquidityForAmounts(current, lower, upper, amount0, amount1);
62
+ const needed = uniswapV4AmountsForLiquidity(current, lower, upper, liquidity);
63
+ expect(liquidity).toBeGreaterThan(0n);
64
+ expect(needed.amount0).toBeLessThanOrEqual(amount0);
65
+ expect(needed.amount1).toBeLessThanOrEqual(amount1);
66
+ expect(uniswapV4AmountsForLiquidity(current, upper, lower, liquidity)).toEqual(needed);
67
+ expect(() => uniswapV4AmountsForLiquidity(current, lower, lower, liquidity)).toThrow(/range/);
68
+ });
69
+ test("aligns positive and negative ticks in the correct direction", () => {
70
+ expect(uniswapV4AlignTickDown(250, 200)).toBe(200);
71
+ expect(uniswapV4AlignTickDown(-250, 200)).toBe(-400);
72
+ expect(uniswapV4AlignTickUp(250, 200)).toBe(400);
73
+ expect(uniswapV4AlignTickUp(-250, 200)).toBe(-200);
74
+ expect(() => uniswapV4AlignTickDown(1.5, 200)).toThrow(/integer/);
75
+ });
76
+ test("unpacks signed lower and upper position ticks", () => {
77
+ const lower = -600n & 0xffffffn;
78
+ const upper = 1200n;
79
+ expect(uniswapV4PositionTicks((upper << 32n) | (lower << 8n))).toEqual({
80
+ lower: -600,
81
+ upper: 1_200,
82
+ });
83
+ });
84
+ });
85
+ describe("Uniswap V4 form projections and logs", () => {
86
+ test("counterpart amounts round-trip inside a range", () => {
87
+ const counterpart = uniswapV4CounterpartAmount(3, true, 1, 0.5, 2);
88
+ expect(counterpart).not.toBeNull();
89
+ expect(uniswapV4CounterpartAmount(counterpart, false, 1, 0.5, 2)).toBeCloseTo(3);
90
+ expect(uniswapV4CounterpartAmount(3, true, 2, 0.5, 2)).toBe(0);
91
+ expect(uniswapV4CounterpartAmount(3, false, 2, 0.5, 2)).toBeNull();
92
+ });
93
+ test("prefers an economic corridor only when it brackets spot", () => {
94
+ expect(uniswapV4DefaultPriceRange(1, 0.5, 2)).toEqual({
95
+ min: 0.5,
96
+ max: 2,
97
+ economic: true,
98
+ });
99
+ expect(uniswapV4DefaultPriceRange(3, 0.5, 2)).toEqual({
100
+ min: 1.5,
101
+ max: 6,
102
+ economic: false,
103
+ });
104
+ });
105
+ test("extracts only PositionManager-issued position salts", () => {
106
+ const positionManager = UNISWAP_V4_POSITION_MANAGER_ADDRESSES[1];
107
+ const data = encodeAbiParameters([
108
+ { type: "int24" },
109
+ { type: "int24" },
110
+ { type: "int256" },
111
+ { type: "bytes32" },
112
+ ], [-200, 200, 1n, pad("0x2a", { size: 32 })]);
113
+ const log = {
114
+ topics: [
115
+ UNISWAP_V4_MODIFY_LIQUIDITY_TOPIC,
116
+ zeroHash,
117
+ pad(positionManager, { size: 32 }),
118
+ ],
119
+ data,
120
+ };
121
+ expect(uniswapV4PositionTokenIdFromLog(log, positionManager)).toBe(42n);
122
+ expect(uniswapV4PositionTokenIdFromLog(log, TOKEN)).toBeNull();
123
+ expect(uniswapV4PositionTokenIdFromLog({ ...log, topics: [zeroHash, ...log.topics.slice(1)] }, positionManager)).toBeNull();
124
+ });
125
+ });
126
+ //# sourceMappingURL=uniswapV4.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswapV4.test.js","sourceRoot":"","sources":["../../../src/v6/uniswapV4.test.ts"],"names":[],"mappings":"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"}