@nradko/metric-omm-sdk-v1 0.2.0 → 0.3.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 (132) hide show
  1. package/README.md +105 -18
  2. package/dist/abis/DepositAllowlistExtension.d.ts +440 -0
  3. package/dist/abis/DepositAllowlistExtension.d.ts.map +1 -0
  4. package/dist/abis/DepositAllowlistExtension.js +572 -0
  5. package/dist/abis/DepositAllowlistExtension.js.map +1 -0
  6. package/dist/abis/MetricOmmPool.d.ts +136 -30
  7. package/dist/abis/MetricOmmPool.d.ts.map +1 -1
  8. package/dist/abis/MetricOmmPool.js +168 -34
  9. package/dist/abis/MetricOmmPool.js.map +1 -1
  10. package/dist/abis/MetricOmmPoolDataProvider.d.ts +4 -4
  11. package/dist/abis/MetricOmmPoolDataProvider.js +4 -4
  12. package/dist/abis/MetricOmmPoolDataProvider.js.map +1 -1
  13. package/dist/abis/MetricOmmPoolFactory.d.ts +76 -18
  14. package/dist/abis/MetricOmmPoolFactory.d.ts.map +1 -1
  15. package/dist/abis/MetricOmmPoolFactory.js +93 -19
  16. package/dist/abis/MetricOmmPoolFactory.js.map +1 -1
  17. package/dist/abis/MetricOmmPoolLiquidityAdder.d.ts +68 -8
  18. package/dist/abis/MetricOmmPoolLiquidityAdder.d.ts.map +1 -1
  19. package/dist/abis/MetricOmmPoolLiquidityAdder.js +85 -9
  20. package/dist/abis/MetricOmmPoolLiquidityAdder.js.map +1 -1
  21. package/dist/abis/MetricOmmPoolSwapper.d.ts +8 -8
  22. package/dist/abis/MetricOmmPoolSwapper.js +8 -8
  23. package/dist/abis/MetricOmmPoolSwapper.js.map +1 -1
  24. package/dist/abis/OracleValueStopLossExtension.d.ts +936 -0
  25. package/dist/abis/OracleValueStopLossExtension.d.ts.map +1 -0
  26. package/dist/abis/OracleValueStopLossExtension.js +1214 -0
  27. package/dist/abis/OracleValueStopLossExtension.js.map +1 -0
  28. package/dist/abis/PriceProvider.d.ts +1 -113
  29. package/dist/abis/PriceProvider.d.ts.map +1 -1
  30. package/dist/abis/PriceProvider.js +1 -146
  31. package/dist/abis/PriceProvider.js.map +1 -1
  32. package/dist/abis/PriceVelocityGuardExtension.d.ts +454 -0
  33. package/dist/abis/PriceVelocityGuardExtension.d.ts.map +1 -0
  34. package/dist/abis/PriceVelocityGuardExtension.js +590 -0
  35. package/dist/abis/PriceVelocityGuardExtension.js.map +1 -0
  36. package/dist/abis/SwapAllowlistExtension.d.ts +440 -0
  37. package/dist/abis/SwapAllowlistExtension.d.ts.map +1 -0
  38. package/dist/abis/SwapAllowlistExtension.js +572 -0
  39. package/dist/abis/SwapAllowlistExtension.js.map +1 -0
  40. package/dist/abis/index.d.ts +4 -0
  41. package/dist/abis/index.d.ts.map +1 -1
  42. package/dist/abis/index.js +4 -0
  43. package/dist/abis/index.js.map +1 -1
  44. package/dist/addresses.d.ts +13 -6
  45. package/dist/addresses.d.ts.map +1 -1
  46. package/dist/addresses.js +33 -16
  47. package/dist/addresses.js.map +1 -1
  48. package/dist/extensions/admin/depositAllowlist.d.ts +8 -0
  49. package/dist/extensions/admin/depositAllowlist.d.ts.map +1 -0
  50. package/dist/extensions/admin/depositAllowlist.js +10 -0
  51. package/dist/extensions/admin/depositAllowlist.js.map +1 -0
  52. package/dist/extensions/admin/oracleStopLoss.d.ts +56 -0
  53. package/dist/extensions/admin/oracleStopLoss.d.ts.map +1 -0
  54. package/dist/extensions/admin/oracleStopLoss.js +87 -0
  55. package/dist/extensions/admin/oracleStopLoss.js.map +1 -0
  56. package/dist/extensions/admin/priceVelocityGuard.d.ts +12 -0
  57. package/dist/extensions/admin/priceVelocityGuard.d.ts.map +1 -0
  58. package/dist/extensions/admin/priceVelocityGuard.js +17 -0
  59. package/dist/extensions/admin/priceVelocityGuard.js.map +1 -0
  60. package/dist/extensions/admin/swapAllowlist.d.ts +8 -0
  61. package/dist/extensions/admin/swapAllowlist.d.ts.map +1 -0
  62. package/dist/extensions/admin/swapAllowlist.js +10 -0
  63. package/dist/extensions/admin/swapAllowlist.js.map +1 -0
  64. package/dist/extensions/index.d.ts +8 -0
  65. package/dist/extensions/index.d.ts.map +1 -0
  66. package/dist/extensions/index.js +8 -0
  67. package/dist/extensions/index.js.map +1 -0
  68. package/dist/extensions/init/index.d.ts +13 -0
  69. package/dist/extensions/init/index.d.ts.map +1 -0
  70. package/dist/extensions/init/index.js +12 -0
  71. package/dist/extensions/init/index.js.map +1 -0
  72. package/dist/extensions/orders.d.ts +7 -0
  73. package/dist/extensions/orders.d.ts.map +1 -0
  74. package/dist/extensions/orders.js +24 -0
  75. package/dist/extensions/orders.js.map +1 -0
  76. package/dist/extensions/types.d.ts +23 -0
  77. package/dist/extensions/types.d.ts.map +1 -0
  78. package/dist/extensions/types.js +10 -0
  79. package/dist/extensions/types.js.map +1 -0
  80. package/dist/index.d.ts +3 -2
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +3 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/pool/create.d.ts +11 -6
  85. package/dist/pool/create.d.ts.map +1 -1
  86. package/dist/pool/create.js +5 -3
  87. package/dist/pool/create.js.map +1 -1
  88. package/dist/pool/index.d.ts +1 -1
  89. package/dist/pool/index.d.ts.map +1 -1
  90. package/dist/pool/index.js.map +1 -1
  91. package/dist/pool/liquidity.d.ts +13 -5
  92. package/dist/pool/liquidity.d.ts.map +1 -1
  93. package/dist/pool/liquidity.js +25 -10
  94. package/dist/pool/liquidity.js.map +1 -1
  95. package/dist/pool/read.d.ts +0 -6
  96. package/dist/pool/read.d.ts.map +1 -1
  97. package/dist/pool/read.js +21 -14
  98. package/dist/pool/read.js.map +1 -1
  99. package/dist/router/swap.d.ts +1 -1
  100. package/dist/router/swap.d.ts.map +1 -1
  101. package/dist/router/swap.js +14 -14
  102. package/dist/router/swap.js.map +1 -1
  103. package/dist/types.d.ts +3 -4
  104. package/dist/types.d.ts.map +1 -1
  105. package/package.json +4 -5
  106. package/src/abis/DepositAllowlistExtension.ts +571 -0
  107. package/src/abis/MetricOmmPool.ts +168 -34
  108. package/src/abis/MetricOmmPoolDataProvider.ts +4 -4
  109. package/src/abis/MetricOmmPoolFactory.ts +93 -19
  110. package/src/abis/MetricOmmPoolLiquidityAdder.ts +85 -9
  111. package/src/abis/MetricOmmPoolSwapper.ts +8 -8
  112. package/src/abis/OracleValueStopLossExtension.ts +1213 -0
  113. package/src/abis/PriceProvider.ts +1 -146
  114. package/src/abis/PriceVelocityGuardExtension.ts +589 -0
  115. package/src/abis/SwapAllowlistExtension.ts +571 -0
  116. package/src/abis/index.ts +4 -0
  117. package/src/addresses.ts +44 -18
  118. package/src/extensions/admin/depositAllowlist.ts +16 -0
  119. package/src/extensions/admin/oracleStopLoss.ts +141 -0
  120. package/src/extensions/admin/priceVelocityGuard.ts +27 -0
  121. package/src/extensions/admin/swapAllowlist.ts +16 -0
  122. package/src/extensions/index.ts +31 -0
  123. package/src/extensions/init/index.ts +21 -0
  124. package/src/extensions/orders.ts +33 -0
  125. package/src/extensions/types.ts +33 -0
  126. package/src/index.ts +33 -0
  127. package/src/pool/create.ts +12 -8
  128. package/src/pool/index.ts +1 -0
  129. package/src/pool/liquidity.ts +41 -15
  130. package/src/pool/read.ts +34 -16
  131. package/src/router/swap.ts +16 -16
  132. package/src/types.ts +3 -4
@@ -0,0 +1,141 @@
1
+ import type { Address, Hex } from "viem";
2
+ import { encodeFunctionData } from "viem";
3
+ import { OracleValueStopLossExtensionAbi } from "../../abis/OracleValueStopLossExtension.js";
4
+
5
+ export function encodeProposeOracleStopLossTimelockCalldata(params: {
6
+ extension: Address;
7
+ pool: Address;
8
+ newTimelock: number;
9
+ }): Hex {
10
+ return encodeFunctionData({
11
+ abi: OracleValueStopLossExtensionAbi,
12
+ functionName: "proposeOracleStopLossTimelock",
13
+ args: [params.pool, params.newTimelock],
14
+ });
15
+ }
16
+
17
+ export function encodeExecuteOracleStopLossTimelockCalldata(params: {
18
+ extension: Address;
19
+ pool: Address;
20
+ }): Hex {
21
+ return encodeFunctionData({
22
+ abi: OracleValueStopLossExtensionAbi,
23
+ functionName: "executeOracleStopLossTimelock",
24
+ args: [params.pool],
25
+ });
26
+ }
27
+
28
+ export function encodeCancelOracleStopLossTimelockCalldata(params: {
29
+ extension: Address;
30
+ pool: Address;
31
+ }): Hex {
32
+ return encodeFunctionData({
33
+ abi: OracleValueStopLossExtensionAbi,
34
+ functionName: "cancelOracleStopLossTimelock",
35
+ args: [params.pool],
36
+ });
37
+ }
38
+
39
+ export function encodeProposeOracleStopLossDrawdownCalldata(params: {
40
+ extension: Address;
41
+ pool: Address;
42
+ newMaxDrawdownE6: bigint;
43
+ }): Hex {
44
+ return encodeFunctionData({
45
+ abi: OracleValueStopLossExtensionAbi,
46
+ functionName: "proposeOracleStopLossDrawdown",
47
+ args: [params.pool, params.newMaxDrawdownE6],
48
+ });
49
+ }
50
+
51
+ export function encodeExecuteOracleStopLossDrawdownCalldata(params: {
52
+ extension: Address;
53
+ pool: Address;
54
+ }): Hex {
55
+ return encodeFunctionData({
56
+ abi: OracleValueStopLossExtensionAbi,
57
+ functionName: "executeOracleStopLossDrawdown",
58
+ args: [params.pool],
59
+ });
60
+ }
61
+
62
+ export function encodeCancelOracleStopLossDrawdownCalldata(params: {
63
+ extension: Address;
64
+ pool: Address;
65
+ }): Hex {
66
+ return encodeFunctionData({
67
+ abi: OracleValueStopLossExtensionAbi,
68
+ functionName: "cancelOracleStopLossDrawdown",
69
+ args: [params.pool],
70
+ });
71
+ }
72
+
73
+ export function encodeProposeOracleStopLossDecayCalldata(params: {
74
+ extension: Address;
75
+ pool: Address;
76
+ newDecayPerSecondE8: bigint;
77
+ }): Hex {
78
+ return encodeFunctionData({
79
+ abi: OracleValueStopLossExtensionAbi,
80
+ functionName: "proposeOracleStopLossDecay",
81
+ args: [params.pool, params.newDecayPerSecondE8],
82
+ });
83
+ }
84
+
85
+ export function encodeExecuteOracleStopLossDecayCalldata(params: {
86
+ extension: Address;
87
+ pool: Address;
88
+ }): Hex {
89
+ return encodeFunctionData({
90
+ abi: OracleValueStopLossExtensionAbi,
91
+ functionName: "executeOracleStopLossDecay",
92
+ args: [params.pool],
93
+ });
94
+ }
95
+
96
+ export function encodeCancelOracleStopLossDecayCalldata(params: {
97
+ extension: Address;
98
+ pool: Address;
99
+ }): Hex {
100
+ return encodeFunctionData({
101
+ abi: OracleValueStopLossExtensionAbi,
102
+ functionName: "cancelOracleStopLossDecay",
103
+ args: [params.pool],
104
+ });
105
+ }
106
+
107
+ export function encodeProposeOracleStopLossHighWatermarksCalldata(params: {
108
+ extension: Address;
109
+ pool: Address;
110
+ binIdx: number;
111
+ newHwmToken0: bigint;
112
+ newHwmToken1: bigint;
113
+ }): Hex {
114
+ return encodeFunctionData({
115
+ abi: OracleValueStopLossExtensionAbi,
116
+ functionName: "proposeOracleStopLossHighWatermarks",
117
+ args: [params.pool, params.binIdx, params.newHwmToken0, params.newHwmToken1],
118
+ });
119
+ }
120
+
121
+ export function encodeExecuteOracleStopLossHighWatermarksCalldata(params: {
122
+ extension: Address;
123
+ pool: Address;
124
+ }): Hex {
125
+ return encodeFunctionData({
126
+ abi: OracleValueStopLossExtensionAbi,
127
+ functionName: "executeOracleStopLossHighWatermarks",
128
+ args: [params.pool],
129
+ });
130
+ }
131
+
132
+ export function encodeCancelOracleStopLossHighWatermarksCalldata(params: {
133
+ extension: Address;
134
+ pool: Address;
135
+ }): Hex {
136
+ return encodeFunctionData({
137
+ abi: OracleValueStopLossExtensionAbi,
138
+ functionName: "cancelOracleStopLossHighWatermarks",
139
+ args: [params.pool],
140
+ });
141
+ }
@@ -0,0 +1,27 @@
1
+ import type { Address, Hex } from "viem";
2
+ import { encodeFunctionData } from "viem";
3
+ import { PriceVelocityGuardExtensionAbi } from "../../abis/PriceVelocityGuardExtension.js";
4
+
5
+ export function encodeSetMaxChangePerBlockCalldata(params: {
6
+ extension: Address;
7
+ pool: Address;
8
+ maxChangePerBlockE18: bigint;
9
+ }): Hex {
10
+ return encodeFunctionData({
11
+ abi: PriceVelocityGuardExtensionAbi,
12
+ functionName: "setMaxChangePerBlock",
13
+ args: [params.pool, params.maxChangePerBlockE18],
14
+ });
15
+ }
16
+
17
+ export function encodeSetLastMidPriceCalldata(params: {
18
+ extension: Address;
19
+ pool: Address;
20
+ lastMidPriceX64: bigint;
21
+ }): Hex {
22
+ return encodeFunctionData({
23
+ abi: PriceVelocityGuardExtensionAbi,
24
+ functionName: "setLastMidPrice",
25
+ args: [params.pool, params.lastMidPriceX64],
26
+ });
27
+ }
@@ -0,0 +1,16 @@
1
+ import type { Address, Hex } from "viem";
2
+ import { encodeFunctionData } from "viem";
3
+ import { SwapAllowlistExtensionAbi } from "../../abis/SwapAllowlistExtension.js";
4
+
5
+ export function encodeSetAllowedToSwapCalldata(params: {
6
+ extension: Address;
7
+ pool: Address;
8
+ swapper: Address;
9
+ allowed: boolean;
10
+ }): Hex {
11
+ return encodeFunctionData({
12
+ abi: SwapAllowlistExtensionAbi,
13
+ functionName: "setAllowedToSwap",
14
+ args: [params.pool, params.swapper, params.allowed],
15
+ });
16
+ }
@@ -0,0 +1,31 @@
1
+ export {
2
+ EMPTY_EXTENSION_DATA,
3
+ EMPTY_EXTENSION_ORDERS,
4
+ type ExtensionOrders,
5
+ type PoolExtensions,
6
+ } from "./types.js";
7
+
8
+ export { encodeExtensionOrder, buildExtensionOrders, type ExtensionOrderAction } from "./orders.js";
9
+
10
+ export { EMPTY_EXTENSION_INIT_DATA, encodeOracleStopLossInitData } from "./init/index.js";
11
+
12
+ export { encodeSetAllowedToDepositCalldata } from "./admin/depositAllowlist.js";
13
+ export { encodeSetAllowedToSwapCalldata } from "./admin/swapAllowlist.js";
14
+ export {
15
+ encodeSetMaxChangePerBlockCalldata,
16
+ encodeSetLastMidPriceCalldata,
17
+ } from "./admin/priceVelocityGuard.js";
18
+ export {
19
+ encodeProposeOracleStopLossTimelockCalldata,
20
+ encodeExecuteOracleStopLossTimelockCalldata,
21
+ encodeCancelOracleStopLossTimelockCalldata,
22
+ encodeProposeOracleStopLossDrawdownCalldata,
23
+ encodeExecuteOracleStopLossDrawdownCalldata,
24
+ encodeCancelOracleStopLossDrawdownCalldata,
25
+ encodeProposeOracleStopLossDecayCalldata,
26
+ encodeExecuteOracleStopLossDecayCalldata,
27
+ encodeCancelOracleStopLossDecayCalldata,
28
+ encodeProposeOracleStopLossHighWatermarksCalldata,
29
+ encodeExecuteOracleStopLossHighWatermarksCalldata,
30
+ encodeCancelOracleStopLossHighWatermarksCalldata,
31
+ } from "./admin/oracleStopLoss.js";
@@ -0,0 +1,21 @@
1
+ import type { Hex } from "viem";
2
+ import { encodeAbiParameters } from "viem";
3
+ import { EMPTY_EXTENSION_DATA } from "../types.js";
4
+
5
+ /** Default init payload for extensions whose `initialize` is a no-op. */
6
+ export const EMPTY_EXTENSION_INIT_DATA = EMPTY_EXTENSION_DATA;
7
+
8
+ /**
9
+ * Init data for `OracleValueStopLossExtension.initialize`.
10
+ * `abi.encode(uint32 drawdownE6, uint32 decayPerSecondE8, uint32 timelockSeconds)`.
11
+ */
12
+ export function encodeOracleStopLossInitData(params: {
13
+ drawdownE6: number;
14
+ decayPerSecondE8: number;
15
+ timelockSeconds: number;
16
+ }): Hex {
17
+ return encodeAbiParameters(
18
+ [{ type: "uint32" }, { type: "uint32" }, { type: "uint32" }],
19
+ [params.drawdownE6, params.decayPerSecondE8, params.timelockSeconds],
20
+ );
21
+ }
@@ -0,0 +1,33 @@
1
+ import type { ExtensionOrders } from "./types.js";
2
+ import { EMPTY_EXTENSION_ORDERS } from "./types.js";
3
+
4
+ /** Pack up to seven 3-bit extension indices (0 = end of sequence). */
5
+ export function encodeExtensionOrder(slots: readonly number[]): bigint {
6
+ if (slots.length > 7) {
7
+ throw new Error("encodeExtensionOrder accepts at most 7 slots");
8
+ }
9
+
10
+ let order = 0n;
11
+ for (let i = 0; i < slots.length; i++) {
12
+ const slot = slots[i];
13
+ if (!Number.isInteger(slot) || slot < 0 || slot > 7) {
14
+ throw new Error(`encodeExtensionOrder slot ${i} must be an integer in [0, 7]`);
15
+ }
16
+ order |= BigInt(slot) << BigInt(i * 3);
17
+ }
18
+ return order;
19
+ }
20
+
21
+ export type ExtensionOrderAction = keyof ExtensionOrders;
22
+
23
+ /** Build extension orders from per-action slot arrays. Omitted actions default to zero. */
24
+ export function buildExtensionOrders(
25
+ partial: Partial<Record<ExtensionOrderAction, readonly number[]>>,
26
+ ): ExtensionOrders {
27
+ return {
28
+ ...EMPTY_EXTENSION_ORDERS,
29
+ ...Object.fromEntries(
30
+ Object.entries(partial).map(([action, slots]) => [action, encodeExtensionOrder(slots ?? [])]),
31
+ ),
32
+ } as ExtensionOrders;
33
+ }
@@ -0,0 +1,33 @@
1
+ import type { Address, Hex } from "viem";
2
+
3
+ /** Invocation order for a single extension action (packed 3-bit slots). */
4
+ export interface ExtensionOrders {
5
+ beforeAddLiquidity: bigint;
6
+ afterAddLiquidity: bigint;
7
+ beforeRemoveLiquidity: bigint;
8
+ afterRemoveLiquidity: bigint;
9
+ beforeSwap: bigint;
10
+ afterSwap: bigint;
11
+ }
12
+
13
+ /** Up to seven extension addresses configured on a pool (index 1–7). */
14
+ export interface PoolExtensions {
15
+ extension1: Address;
16
+ extension2: Address;
17
+ extension3: Address;
18
+ extension4: Address;
19
+ extension5: Address;
20
+ extension6: Address;
21
+ extension7: Address;
22
+ }
23
+
24
+ export const EMPTY_EXTENSION_DATA = "0x" as Hex;
25
+
26
+ export const EMPTY_EXTENSION_ORDERS: ExtensionOrders = {
27
+ beforeAddLiquidity: 0n,
28
+ afterAddLiquidity: 0n,
29
+ beforeRemoveLiquidity: 0n,
30
+ afterRemoveLiquidity: 0n,
31
+ beforeSwap: 0n,
32
+ afterSwap: 0n,
33
+ };
package/src/index.ts CHANGED
@@ -49,6 +49,10 @@ export {
49
49
  MetricOmmPoolSwapperAbi,
50
50
  MetricOmmPoolLiquidityAdderAbi,
51
51
  MetricOmmPoolFactoryAbi,
52
+ DepositAllowlistExtensionAbi,
53
+ SwapAllowlistExtensionAbi,
54
+ PriceVelocityGuardExtensionAbi,
55
+ OracleValueStopLossExtensionAbi,
52
56
  } from "./abis/index.js";
53
57
 
54
58
  // ============ Utils ============
@@ -71,6 +75,7 @@ export {
71
75
  preparePoolBinData,
72
76
  type CreatePoolFactoryParams,
73
77
  type CreatePoolParams,
78
+ type ExtensionOrders,
74
79
  getPoolImmutables,
75
80
  getPoolFeeConfig,
76
81
  getPoolState,
@@ -157,3 +162,31 @@ export {
157
162
  type CollectedFactoryFeeTx,
158
163
  type CollectFactoryFeesResult,
159
164
  } from "./factory/index.js";
165
+
166
+ // ============ Extension Functions ============
167
+ export {
168
+ EMPTY_EXTENSION_DATA,
169
+ EMPTY_EXTENSION_ORDERS,
170
+ EMPTY_EXTENSION_INIT_DATA,
171
+ encodeExtensionOrder,
172
+ buildExtensionOrders,
173
+ encodeOracleStopLossInitData,
174
+ encodeSetAllowedToDepositCalldata,
175
+ encodeSetAllowedToSwapCalldata,
176
+ encodeSetMaxChangePerBlockCalldata,
177
+ encodeSetLastMidPriceCalldata,
178
+ encodeProposeOracleStopLossTimelockCalldata,
179
+ encodeExecuteOracleStopLossTimelockCalldata,
180
+ encodeCancelOracleStopLossTimelockCalldata,
181
+ encodeProposeOracleStopLossDrawdownCalldata,
182
+ encodeExecuteOracleStopLossDrawdownCalldata,
183
+ encodeCancelOracleStopLossDrawdownCalldata,
184
+ encodeProposeOracleStopLossDecayCalldata,
185
+ encodeExecuteOracleStopLossDecayCalldata,
186
+ encodeCancelOracleStopLossDecayCalldata,
187
+ encodeProposeOracleStopLossHighWatermarksCalldata,
188
+ encodeExecuteOracleStopLossHighWatermarksCalldata,
189
+ encodeCancelOracleStopLossHighWatermarksCalldata,
190
+ type PoolExtensions,
191
+ type ExtensionOrderAction,
192
+ } from "./extensions/index.js";
@@ -3,11 +3,12 @@
3
3
  */
4
4
 
5
5
  import type { Address, PublicClient, WalletClient, Hex } from "viem";
6
- import { encodeFunctionData, zeroAddress } from "viem";
6
+ import { encodeFunctionData } from "viem";
7
7
  import { POOL_FACTORY_ABI } from "../constants.js";
8
8
  import { createUniformBins } from "../utils/binData.js";
9
+ import { EMPTY_EXTENSION_ORDERS, type ExtensionOrders } from "../extensions/types.js";
9
10
 
10
- // ============ Types ============
11
+ export type { ExtensionOrders };
11
12
 
12
13
  /**
13
14
  * Parameters for creating a new pool via the v1 factory.
@@ -17,10 +18,12 @@ export interface CreatePoolFactoryParams {
17
18
  token1: Address;
18
19
  priceProvider: Address;
19
20
  admin: Address;
20
- /** Defaults to zero address (no hooks). */
21
- hooks?: Address;
22
- /** Defaults to 0. */
23
- hooksPermissions?: number;
21
+ /** Defaults to empty (no extensions). */
22
+ extensions?: Address[];
23
+ /** Defaults to all-zero orders (no extension calls). */
24
+ extensionOrders?: ExtensionOrders;
25
+ /** Defaults to empty; length must match `extensions` when extensions are set. */
26
+ extensionInitData?: Hex[];
24
27
  /** Defaults to 0. */
25
28
  priceProviderTimelock?: bigint;
26
29
  nonNegativeBins: bigint[];
@@ -69,8 +72,9 @@ export function prepareFactoryCreatePoolParams(params: CreatePoolFactoryParams)
69
72
  token0: params.token0,
70
73
  token1: params.token1,
71
74
  priceProvider: params.priceProvider,
72
- hooks: params.hooks ?? zeroAddress,
73
- hooksPermissions: params.hooksPermissions ?? 0,
75
+ extensions: params.extensions ?? [],
76
+ extensionOrders: params.extensionOrders ?? EMPTY_EXTENSION_ORDERS,
77
+ extensionInitData: params.extensionInitData ?? [],
74
78
  priceProviderTimelock: params.priceProviderTimelock ?? 0n,
75
79
  admin: params.admin,
76
80
  initialAmount0PerShareE18: params.initialScaledToken0PerShareE18,
package/src/pool/index.ts CHANGED
@@ -10,6 +10,7 @@ export {
10
10
  preparePoolBinData,
11
11
  type CreatePoolFactoryParams,
12
12
  type CreatePoolParams,
13
+ type ExtensionOrders,
13
14
  } from "./create.js";
14
15
 
15
16
  // Pool read functions
@@ -6,6 +6,7 @@
6
6
  import type { Address, PublicClient, Hex } from "viem";
7
7
  import { encodeFunctionData } from "viem";
8
8
  import { MAX_UINT104, MAX_INT104, MAX_INT128, LIQUIDITY_ADDER_ABI } from "../constants.js";
9
+ import { EMPTY_EXTENSION_DATA } from "../extensions/types.js";
9
10
  import { MetricOmmPoolAbi } from "../abis/MetricOmmPool.js";
10
11
  import type { LiquidityDelta, LiquidityBinValueInput, PoolLiquidityDelta } from "../types.js";
11
12
  import { getPoolImmutables } from "./read.js";
@@ -28,7 +29,16 @@ export { convertToken0ToToken1, convertToken1ToToken0 };
28
29
  export const getPositionShares = getPositionBinSharesRange;
29
30
  export const getPositionSharesForBins = getPositionBinSharesForBins;
30
31
 
31
- const EMPTY_HOOK_DATA = "0x" as Hex;
32
+ function getLiquidityAdderFunction(name: string, inputCount: number) {
33
+ const item = (LIQUIDITY_ADDER_ABI as readonly any[]).find(
34
+ (entry) =>
35
+ entry?.type === "function" && entry?.name === name && entry?.inputs?.length === inputCount,
36
+ );
37
+ if (!item) {
38
+ throw new Error(`LiquidityAdder ABI missing ${name} overload (${inputCount} inputs)`);
39
+ }
40
+ return item;
41
+ }
32
42
 
33
43
  export interface RemoveLiquidityParams {
34
44
  percentageToRemove: number;
@@ -711,10 +721,10 @@ export function encodeAddLiquidityExactSharesSelfCalldata(params: {
711
721
  deltas: PoolLiquidityDelta;
712
722
  maxAmountToken0: bigint;
713
723
  maxAmountToken1: bigint;
714
- hookData?: Hex;
724
+ extensionData?: Hex;
715
725
  }): Hex {
716
726
  return encodeFunctionData({
717
- abi: LIQUIDITY_ADDER_ABI,
727
+ abi: [getLiquidityAdderFunction("addLiquidityExactShares", 6)],
718
728
  functionName: "addLiquidityExactShares",
719
729
  args: [
720
730
  params.pool,
@@ -722,7 +732,7 @@ export function encodeAddLiquidityExactSharesSelfCalldata(params: {
722
732
  { binIdxs: [...params.deltas.binIdxs], shares: [...params.deltas.shares] },
723
733
  params.maxAmountToken0,
724
734
  params.maxAmountToken1,
725
- params.hookData ?? EMPTY_HOOK_DATA,
735
+ params.extensionData ?? EMPTY_EXTENSION_DATA,
726
736
  ],
727
737
  });
728
738
  }
@@ -734,10 +744,10 @@ export function encodeAddLiquidityExactSharesWithOwnerCalldata(params: {
734
744
  deltas: PoolLiquidityDelta;
735
745
  maxAmountToken0: bigint;
736
746
  maxAmountToken1: bigint;
737
- hookData?: Hex;
747
+ extensionData?: Hex;
738
748
  }): Hex {
739
749
  return encodeFunctionData({
740
- abi: LIQUIDITY_ADDER_ABI,
750
+ abi: [getLiquidityAdderFunction("addLiquidityExactShares", 7)],
741
751
  functionName: "addLiquidityExactShares",
742
752
  args: [
743
753
  params.pool,
@@ -746,7 +756,7 @@ export function encodeAddLiquidityExactSharesWithOwnerCalldata(params: {
746
756
  { binIdxs: [...params.deltas.binIdxs], shares: [...params.deltas.shares] },
747
757
  params.maxAmountToken0,
748
758
  params.maxAmountToken1,
749
- params.hookData ?? EMPTY_HOOK_DATA,
759
+ params.extensionData ?? EMPTY_EXTENSION_DATA,
750
760
  ],
751
761
  });
752
762
  }
@@ -757,10 +767,14 @@ export function encodeAddLiquidityWeightedSelfCalldata(params: {
757
767
  weightDeltas: PoolLiquidityDelta;
758
768
  maxAmountToken0: bigint;
759
769
  maxAmountToken1: bigint;
760
- hookData?: Hex;
770
+ minimalCurBin?: number;
771
+ minimalPosition?: bigint;
772
+ maximalCurBin?: number;
773
+ maximalPosition?: bigint;
774
+ extensionData?: Hex;
761
775
  }): Hex {
762
776
  return encodeFunctionData({
763
- abi: LIQUIDITY_ADDER_ABI,
777
+ abi: [getLiquidityAdderFunction("addLiquidityWeighted", 10)],
764
778
  functionName: "addLiquidityWeighted",
765
779
  args: [
766
780
  params.pool,
@@ -768,7 +782,11 @@ export function encodeAddLiquidityWeightedSelfCalldata(params: {
768
782
  { binIdxs: [...params.weightDeltas.binIdxs], shares: [...params.weightDeltas.shares] },
769
783
  params.maxAmountToken0,
770
784
  params.maxAmountToken1,
771
- params.hookData ?? EMPTY_HOOK_DATA,
785
+ params.minimalCurBin ?? -128,
786
+ params.minimalPosition ?? 0n,
787
+ params.maximalCurBin ?? 127,
788
+ params.maximalPosition ?? MAX_UINT104,
789
+ params.extensionData ?? EMPTY_EXTENSION_DATA,
772
790
  ],
773
791
  });
774
792
  }
@@ -780,10 +798,14 @@ export function encodeAddLiquidityWeightedWithOwnerCalldata(params: {
780
798
  weightDeltas: PoolLiquidityDelta;
781
799
  maxAmountToken0: bigint;
782
800
  maxAmountToken1: bigint;
783
- hookData?: Hex;
801
+ minimalCurBin?: number;
802
+ minimalPosition?: bigint;
803
+ maximalCurBin?: number;
804
+ maximalPosition?: bigint;
805
+ extensionData?: Hex;
784
806
  }): Hex {
785
807
  return encodeFunctionData({
786
- abi: LIQUIDITY_ADDER_ABI,
808
+ abi: [getLiquidityAdderFunction("addLiquidityWeighted", 11)],
787
809
  functionName: "addLiquidityWeighted",
788
810
  args: [
789
811
  params.pool,
@@ -792,7 +814,11 @@ export function encodeAddLiquidityWeightedWithOwnerCalldata(params: {
792
814
  { binIdxs: [...params.weightDeltas.binIdxs], shares: [...params.weightDeltas.shares] },
793
815
  params.maxAmountToken0,
794
816
  params.maxAmountToken1,
795
- params.hookData ?? EMPTY_HOOK_DATA,
817
+ params.minimalCurBin ?? -128,
818
+ params.minimalPosition ?? 0n,
819
+ params.maximalCurBin ?? 127,
820
+ params.maximalPosition ?? MAX_UINT104,
821
+ params.extensionData ?? EMPTY_EXTENSION_DATA,
796
822
  ],
797
823
  });
798
824
  }
@@ -801,7 +827,7 @@ export function encodeRemoveLiquidityCalldata(params: {
801
827
  owner: Address;
802
828
  salt: bigint;
803
829
  deltas: PoolLiquidityDelta;
804
- hookData?: Hex;
830
+ extensionData?: Hex;
805
831
  }): Hex {
806
832
  return encodeFunctionData({
807
833
  abi: MetricOmmPoolAbi,
@@ -810,7 +836,7 @@ export function encodeRemoveLiquidityCalldata(params: {
810
836
  params.owner,
811
837
  params.salt,
812
838
  { binIdxs: [...params.deltas.binIdxs], shares: [...params.deltas.shares] },
813
- params.hookData ?? EMPTY_HOOK_DATA,
839
+ params.extensionData ?? EMPTY_EXTENSION_DATA,
814
840
  ],
815
841
  });
816
842
  }
package/src/pool/read.ts CHANGED
@@ -28,10 +28,21 @@ export async function getPoolImmutables(
28
28
  initialScaledToken1PerShareE18: bigint;
29
29
  minimalMintableLiquidity: bigint;
30
30
  immutablePriceProvider: Address;
31
- hooks: Address;
32
- hooksPermissions: number;
33
31
  lowestBin: bigint;
34
32
  highestBin: bigint;
33
+ extension1: Address;
34
+ extension2: Address;
35
+ extension3: Address;
36
+ extension4: Address;
37
+ extension5: Address;
38
+ extension6: Address;
39
+ extension7: Address;
40
+ beforeAddLiquidityOrder: bigint;
41
+ afterAddLiquidityOrder: bigint;
42
+ beforeRemoveLiquidityOrder: bigint;
43
+ afterRemoveLiquidityOrder: bigint;
44
+ beforeSwapOrder: bigint;
45
+ afterSwapOrder: bigint;
35
46
  };
36
47
 
37
48
  return {
@@ -44,10 +55,23 @@ export async function getPoolImmutables(
44
55
  initialScaledToken1PerShareE18: imm.initialScaledToken1PerShareE18,
45
56
  minimalMintableLiquidity: imm.minimalMintableLiquidity,
46
57
  immutablePriceProvider: imm.immutablePriceProvider,
47
- hooks: imm.hooks,
48
- hooksPermissions: imm.hooksPermissions,
49
- maxDriftE8: 0n,
50
- maxDriftDecayPerSecondE8: 0n,
58
+ extensions: {
59
+ extension1: imm.extension1,
60
+ extension2: imm.extension2,
61
+ extension3: imm.extension3,
62
+ extension4: imm.extension4,
63
+ extension5: imm.extension5,
64
+ extension6: imm.extension6,
65
+ extension7: imm.extension7,
66
+ },
67
+ extensionOrders: {
68
+ beforeAddLiquidity: imm.beforeAddLiquidityOrder,
69
+ afterAddLiquidity: imm.afterAddLiquidityOrder,
70
+ beforeRemoveLiquidity: imm.beforeRemoveLiquidityOrder,
71
+ afterRemoveLiquidity: imm.afterRemoveLiquidityOrder,
72
+ beforeSwap: imm.beforeSwapOrder,
73
+ afterSwap: imm.afterSwapOrder,
74
+ },
51
75
  lowestBin: Number(imm.lowestBin),
52
76
  highestBin: Number(imm.highestBin),
53
77
  };
@@ -109,9 +133,6 @@ export async function getPoolState(
109
133
  };
110
134
  }
111
135
 
112
- /**
113
- * Read bin state (scaled balances) via MetricOmmPoolDataProvider.
114
- */
115
136
  export async function getBinState(
116
137
  publicClient: PublicClient,
117
138
  dataProviderAddress: Address,
@@ -122,7 +143,7 @@ export async function getBinState(
122
143
  address: dataProviderAddress,
123
144
  abi: DATA_PROVIDER_ABI,
124
145
  functionName: "binState",
125
- args: [poolAddress, binIdx],
146
+ args: [poolAddress, BigInt(binIdx)],
126
147
  })) as readonly [bigint, bigint, number, number, number];
127
148
 
128
149
  return {
@@ -134,9 +155,6 @@ export async function getBinState(
134
155
  };
135
156
  }
136
157
 
137
- /**
138
- * Get user position shares in a specific bin (DataProvider).
139
- */
140
158
  export async function getPositionBinShares(
141
159
  publicClient: PublicClient,
142
160
  dataProviderAddress: Address,
@@ -145,10 +163,10 @@ export async function getPositionBinShares(
145
163
  salt: bigint,
146
164
  binIdx: number,
147
165
  ): Promise<bigint> {
148
- return (await publicClient.readContract({
166
+ return publicClient.readContract({
149
167
  address: dataProviderAddress,
150
168
  abi: DATA_PROVIDER_ABI,
151
169
  functionName: "positionBinShares",
152
- args: [poolAddress, owner, salt, binIdx],
153
- })) as bigint;
170
+ args: [poolAddress, owner, salt, BigInt(binIdx)],
171
+ }) as Promise<bigint>;
154
172
  }