@nradko/metric-omm-sdk-v1 0.3.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +98 -111
  2. package/dist/abis/MetricOmmPool.d.ts +14 -0
  3. package/dist/abis/MetricOmmPool.d.ts.map +1 -1
  4. package/dist/abis/MetricOmmPool.js +18 -0
  5. package/dist/abis/MetricOmmPool.js.map +1 -1
  6. package/dist/abis/MetricOmmPoolDataProvider.d.ts +0 -136
  7. package/dist/abis/MetricOmmPoolDataProvider.d.ts.map +1 -1
  8. package/dist/abis/MetricOmmPoolDataProvider.js +0 -177
  9. package/dist/abis/MetricOmmPoolDataProvider.js.map +1 -1
  10. package/dist/abis/MetricOmmPoolStateView.d.ts +238 -0
  11. package/dist/abis/MetricOmmPoolStateView.d.ts.map +1 -0
  12. package/dist/abis/MetricOmmPoolStateView.js +315 -0
  13. package/dist/abis/MetricOmmPoolStateView.js.map +1 -0
  14. package/dist/abis/MetricOmmSimpleRouter.d.ts +619 -0
  15. package/dist/abis/{MetricOmmPoolSwapper.d.ts.map → MetricOmmSimpleRouter.d.ts.map} +1 -1
  16. package/dist/abis/MetricOmmSimpleRouter.js +805 -0
  17. package/dist/abis/MetricOmmSimpleRouter.js.map +1 -0
  18. package/dist/abis/MetricOmmSwapQuoter.d.ts +576 -0
  19. package/dist/abis/{PriceProviderUi.d.ts.map → MetricOmmSwapQuoter.d.ts.map} +1 -1
  20. package/dist/abis/MetricOmmSwapQuoter.js +748 -0
  21. package/dist/abis/MetricOmmSwapQuoter.js.map +1 -0
  22. package/dist/abis/OracleProvider.d.ts +106 -0
  23. package/dist/abis/OracleProvider.d.ts.map +1 -0
  24. package/dist/abis/OracleProvider.js +62 -0
  25. package/dist/abis/OracleProvider.js.map +1 -0
  26. package/dist/abis/PriceProvider.d.ts +8 -2
  27. package/dist/abis/PriceProvider.d.ts.map +1 -1
  28. package/dist/abis/PriceProvider.js +9 -1
  29. package/dist/abis/PriceProvider.js.map +1 -1
  30. package/dist/abis/index.d.ts +4 -2
  31. package/dist/abis/index.d.ts.map +1 -1
  32. package/dist/abis/index.js +4 -2
  33. package/dist/abis/index.js.map +1 -1
  34. package/dist/addresses.d.ts +3 -3
  35. package/dist/addresses.d.ts.map +1 -1
  36. package/dist/addresses.js +10 -10
  37. package/dist/addresses.js.map +1 -1
  38. package/dist/constants.d.ts +4 -1
  39. package/dist/constants.d.ts.map +1 -1
  40. package/dist/constants.js +7 -2
  41. package/dist/constants.js.map +1 -1
  42. package/dist/index.d.ts +5 -3
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +8 -4
  45. package/dist/index.js.map +1 -1
  46. package/dist/oracle/index.d.ts +5 -0
  47. package/dist/oracle/index.d.ts.map +1 -0
  48. package/dist/oracle/index.js +5 -0
  49. package/dist/oracle/index.js.map +1 -0
  50. package/dist/oracle/registry.d.ts +53 -0
  51. package/dist/oracle/registry.d.ts.map +1 -0
  52. package/dist/oracle/registry.js +70 -0
  53. package/dist/oracle/registry.js.map +1 -0
  54. package/dist/quoter/index.d.ts +6 -0
  55. package/dist/quoter/index.d.ts.map +1 -0
  56. package/dist/quoter/index.js +6 -0
  57. package/dist/quoter/index.js.map +1 -0
  58. package/dist/quoter/quote.d.ts +58 -0
  59. package/dist/quoter/quote.d.ts.map +1 -0
  60. package/dist/quoter/quote.js +74 -0
  61. package/dist/quoter/quote.js.map +1 -0
  62. package/dist/quoter/quotePath.d.ts +65 -0
  63. package/dist/quoter/quotePath.d.ts.map +1 -0
  64. package/dist/quoter/quotePath.js +108 -0
  65. package/dist/quoter/quotePath.js.map +1 -0
  66. package/dist/router/index.d.ts +2 -1
  67. package/dist/router/index.d.ts.map +1 -1
  68. package/dist/router/index.js +2 -1
  69. package/dist/router/index.js.map +1 -1
  70. package/dist/router/swap.d.ts +37 -92
  71. package/dist/router/swap.d.ts.map +1 -1
  72. package/dist/router/swap.js +96 -298
  73. package/dist/router/swap.js.map +1 -1
  74. package/dist/router/swapPath.d.ts +56 -0
  75. package/dist/router/swapPath.d.ts.map +1 -0
  76. package/dist/router/swapPath.js +98 -0
  77. package/dist/router/swapPath.js.map +1 -0
  78. package/dist/swap/path.d.ts +13 -0
  79. package/dist/swap/path.d.ts.map +1 -0
  80. package/dist/swap/path.js +74 -0
  81. package/dist/swap/path.js.map +1 -0
  82. package/package.json +4 -5
  83. package/src/abis/MetricOmmPool.ts +18 -0
  84. package/src/abis/MetricOmmPoolDataProvider.ts +0 -177
  85. package/src/abis/MetricOmmPoolStateView.ts +314 -0
  86. package/src/abis/MetricOmmSimpleRouter.ts +804 -0
  87. package/src/abis/MetricOmmSwapQuoter.ts +747 -0
  88. package/src/abis/OracleProvider.ts +61 -0
  89. package/src/abis/PriceProvider.ts +9 -1
  90. package/src/abis/index.ts +4 -2
  91. package/src/addresses.ts +13 -13
  92. package/src/constants.ts +7 -2
  93. package/src/index.ts +62 -23
  94. package/src/oracle/index.ts +14 -0
  95. package/src/oracle/registry.ts +146 -0
  96. package/src/quoter/index.ts +28 -0
  97. package/src/quoter/quote.ts +193 -0
  98. package/src/quoter/quotePath.ts +240 -0
  99. package/src/router/index.ts +24 -25
  100. package/src/router/swap.ts +142 -480
  101. package/src/router/swapPath.ts +181 -0
  102. package/src/swap/path.ts +107 -0
  103. package/dist/abis/MetricOmmPoolSwapper.d.ts +0 -917
  104. package/dist/abis/MetricOmmPoolSwapper.js +0 -1185
  105. package/dist/abis/MetricOmmPoolSwapper.js.map +0 -1
  106. package/dist/abis/PriceProviderUi.d.ts +0 -433
  107. package/dist/abis/PriceProviderUi.js +0 -318
  108. package/dist/abis/PriceProviderUi.js.map +0 -1
  109. package/src/abis/MetricOmmPoolSwapper.ts +0 -1184
  110. package/src/abis/PriceProviderUi.ts +0 -317
@@ -0,0 +1,56 @@
1
+ /**
2
+ * MetricAMM SDK - SimpleRouter multihop swap helpers.
3
+ */
4
+ import type { Address, Hex, PublicClient } from "viem";
5
+ export type ExactInputParams = {
6
+ tokens: Address[];
7
+ pools: Address[];
8
+ extensionDatas: Hex[];
9
+ zeroForOneBitMap: bigint;
10
+ amountIn: bigint;
11
+ amountOutMinimum: bigint;
12
+ recipient: Address;
13
+ deadline: bigint;
14
+ };
15
+ export type ExactOutputParams = {
16
+ tokens: Address[];
17
+ pools: Address[];
18
+ extensionDatas: Hex[];
19
+ zeroForOneBitMap: bigint;
20
+ amountOut: bigint;
21
+ amountInMaximum: bigint;
22
+ recipient: Address;
23
+ deadline: bigint;
24
+ };
25
+ export interface BuildExactInputParams {
26
+ publicClient: PublicClient;
27
+ tokenIn: Address;
28
+ tokenOut: Address;
29
+ pools: readonly Address[];
30
+ extensionDatas?: readonly Hex[];
31
+ recipient: Address;
32
+ amountIn: bigint;
33
+ slippagePercent: number;
34
+ deadline: bigint;
35
+ quoterAddress?: Address;
36
+ }
37
+ export interface BuildExactOutputParams {
38
+ publicClient: PublicClient;
39
+ tokenIn: Address;
40
+ tokenOut: Address;
41
+ pools: readonly Address[];
42
+ extensionDatas?: readonly Hex[];
43
+ recipient: Address;
44
+ amountOut: bigint;
45
+ slippagePercent: number;
46
+ deadline: bigint;
47
+ quoterAddress?: Address;
48
+ }
49
+ export declare function buildExactInputParams(params: BuildExactInputParams): Promise<ExactInputParams>;
50
+ export declare function buildExactOutputParams(params: BuildExactOutputParams): Promise<ExactOutputParams>;
51
+ export declare function encodeExactInputCalldata(params: ExactInputParams): Hex;
52
+ export declare const prepareExactInputCalldata: typeof encodeExactInputCalldata;
53
+ export declare function encodeExactOutputCalldata(params: ExactOutputParams): Hex;
54
+ export declare const prepareExactOutputCalldata: typeof encodeExactOutputCalldata;
55
+ export { encodeZeroForOneBitMap } from "../swap/path.js";
56
+ //# sourceMappingURL=swapPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swapPath.d.ts","sourceRoot":"","sources":["../../src/router/swapPath.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AASvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,cAAc,EAAE,GAAG,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,cAAc,EAAE,GAAG,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA4BD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAiC3B;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAiC5B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,GAAG,GAAG,CAMtE;AAED,eAAO,MAAM,yBAAyB,iCAA2B,CAAC;AAElE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,GAAG,CAMxE;AAED,eAAO,MAAM,0BAA0B,kCAA4B,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { encodeFunctionData } from "viem";
2
+ import { quoteLiveExactIn, quoteLiveExactOut } from "../quoter/quotePath.js";
3
+ import { resolveSwapPath } from "../swap/path.js";
4
+ import { SIMPLE_ROUTER_ABI } from "../constants.js";
5
+ import { ceilDiv, toSlippageBps } from "./swap.js";
6
+ const BPS_BASE = 10000n;
7
+ function toExactInputStruct(params) {
8
+ return {
9
+ tokens: params.tokens,
10
+ pools: params.pools,
11
+ extensionDatas: params.extensionDatas,
12
+ zeroForOneBitMap: params.zeroForOneBitMap,
13
+ amountIn: params.amountIn,
14
+ amountOutMinimum: params.amountOutMinimum,
15
+ recipient: params.recipient,
16
+ deadline: params.deadline,
17
+ };
18
+ }
19
+ function toExactOutputStruct(params) {
20
+ return {
21
+ tokens: params.tokens,
22
+ pools: params.pools,
23
+ extensionDatas: params.extensionDatas,
24
+ zeroForOneBitMap: params.zeroForOneBitMap,
25
+ amountOut: params.amountOut,
26
+ amountInMaximum: params.amountInMaximum,
27
+ recipient: params.recipient,
28
+ deadline: params.deadline,
29
+ };
30
+ }
31
+ export async function buildExactInputParams(params) {
32
+ const slippageBps = toSlippageBps(params.slippagePercent);
33
+ const { tokens, extensionDatas, zeroForOneBitMap } = await resolveSwapPath(params.publicClient, params.tokenIn, params.tokenOut, params.pools, params.extensionDatas);
34
+ const { amountOut } = await quoteLiveExactIn({
35
+ publicClient: params.publicClient,
36
+ tokenIn: params.tokenIn,
37
+ tokenOut: params.tokenOut,
38
+ pools: params.pools,
39
+ extensionDatas: params.extensionDatas,
40
+ recipient: params.recipient,
41
+ amountIn: params.amountIn,
42
+ quoterAddress: params.quoterAddress,
43
+ });
44
+ const amountOutMinimum = (amountOut * (BPS_BASE - slippageBps)) / BPS_BASE;
45
+ return {
46
+ tokens,
47
+ pools: [...params.pools],
48
+ extensionDatas,
49
+ zeroForOneBitMap,
50
+ amountIn: params.amountIn,
51
+ amountOutMinimum,
52
+ recipient: params.recipient,
53
+ deadline: params.deadline,
54
+ };
55
+ }
56
+ export async function buildExactOutputParams(params) {
57
+ const slippageBps = toSlippageBps(params.slippagePercent);
58
+ const { tokens, extensionDatas, zeroForOneBitMap } = await resolveSwapPath(params.publicClient, params.tokenIn, params.tokenOut, params.pools, params.extensionDatas);
59
+ const { amountIn } = await quoteLiveExactOut({
60
+ publicClient: params.publicClient,
61
+ tokenIn: params.tokenIn,
62
+ tokenOut: params.tokenOut,
63
+ pools: params.pools,
64
+ extensionDatas: params.extensionDatas,
65
+ recipient: params.recipient,
66
+ amountOut: params.amountOut,
67
+ quoterAddress: params.quoterAddress,
68
+ });
69
+ const amountInMaximum = ceilDiv(amountIn * (BPS_BASE + slippageBps), BPS_BASE);
70
+ return {
71
+ tokens,
72
+ pools: [...params.pools],
73
+ extensionDatas,
74
+ zeroForOneBitMap,
75
+ amountOut: params.amountOut,
76
+ amountInMaximum,
77
+ recipient: params.recipient,
78
+ deadline: params.deadline,
79
+ };
80
+ }
81
+ export function encodeExactInputCalldata(params) {
82
+ return encodeFunctionData({
83
+ abi: SIMPLE_ROUTER_ABI,
84
+ functionName: "exactInput",
85
+ args: [toExactInputStruct(params)],
86
+ });
87
+ }
88
+ export const prepareExactInputCalldata = encodeExactInputCalldata;
89
+ export function encodeExactOutputCalldata(params) {
90
+ return encodeFunctionData({
91
+ abi: SIMPLE_ROUTER_ABI,
92
+ functionName: "exactOutput",
93
+ args: [toExactOutputStruct(params)],
94
+ });
95
+ }
96
+ export const prepareExactOutputCalldata = encodeExactOutputCalldata;
97
+ export { encodeZeroForOneBitMap } from "../swap/path.js";
98
+ //# sourceMappingURL=swapPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swapPath.js","sourceRoot":"","sources":["../../src/router/swapPath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * MetricAMM SDK - swap path helpers shared by router and quoter.
3
+ */
4
+ import type { Address, Hex, PublicClient } from "viem";
5
+ export declare function encodeZeroForOneBitMap(zeroForOneDirections: readonly boolean[]): bigint;
6
+ export declare function resolveSwapPath(publicClient: PublicClient, tokenIn: Address, tokenOut: Address, pools: readonly Address[], extensionDatas?: readonly Hex[]): Promise<{
7
+ tokens: Address[];
8
+ zeroForOnes: boolean[];
9
+ extensionDatas: Hex[];
10
+ zeroForOneBitMap: bigint;
11
+ }>;
12
+ export declare function resolveZeroForOne(publicClient: PublicClient, pool: Address, tokenIn: Address, tokenOut: Address): Promise<boolean>;
13
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/swap/path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AASvD,wBAAgB,sBAAsB,CAAC,oBAAoB,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAQvF;AAmCD,wBAAsB,eAAe,CACnC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,cAAc,CAAC,EAAE,SAAS,GAAG,EAAE,GAC9B,OAAO,CAAC;IACT,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,cAAc,EAAE,GAAG,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC,CA6BD;AAED,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,OAAO,CAAC,CAGlB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * MetricAMM SDK - swap path helpers shared by router and quoter.
3
+ */
4
+ import { getAddress } from "viem";
5
+ import { POOL_ABI } from "../constants.js";
6
+ import { EMPTY_EXTENSION_DATA } from "../extensions/types.js";
7
+ function withExtensionData(extensionData) {
8
+ return extensionData ?? EMPTY_EXTENSION_DATA;
9
+ }
10
+ export function encodeZeroForOneBitMap(zeroForOneDirections) {
11
+ let bitmap = 0n;
12
+ for (let i = 0; i < zeroForOneDirections.length; i++) {
13
+ if (zeroForOneDirections[i]) {
14
+ bitmap |= 1n << BigInt(i);
15
+ }
16
+ }
17
+ return bitmap;
18
+ }
19
+ async function readPoolTokens(publicClient, pool) {
20
+ const imm = (await publicClient.readContract({
21
+ address: pool,
22
+ abi: POOL_ABI,
23
+ functionName: "getImmutables",
24
+ }));
25
+ return { token0: imm.token0, token1: imm.token1 };
26
+ }
27
+ function zeroForOneFromTokenIn(tokenIn, token0, token1) {
28
+ const normalized = getAddress(tokenIn);
29
+ if (normalized === getAddress(token0))
30
+ return true;
31
+ if (normalized === getAddress(token1))
32
+ return false;
33
+ throw new Error(`tokenIn ${tokenIn} is not a token in pool (${token0}, ${token1})`);
34
+ }
35
+ function normalizeExtensionDatas(pools, extensionDatas) {
36
+ if (!extensionDatas) {
37
+ return pools.map(() => EMPTY_EXTENSION_DATA);
38
+ }
39
+ if (extensionDatas.length !== pools.length) {
40
+ throw new Error("extensionDatas length must match pools length");
41
+ }
42
+ return extensionDatas.map((extensionData) => withExtensionData(extensionData));
43
+ }
44
+ export async function resolveSwapPath(publicClient, tokenIn, tokenOut, pools, extensionDatas) {
45
+ if (pools.length === 0) {
46
+ throw new Error("pools must not be empty");
47
+ }
48
+ const normalizedExtensionDatas = normalizeExtensionDatas(pools, extensionDatas);
49
+ const tokens = [getAddress(tokenIn)];
50
+ const zeroForOnes = [];
51
+ let currentToken = getAddress(tokenIn);
52
+ for (const pool of pools) {
53
+ const { token0, token1 } = await readPoolTokens(publicClient, pool);
54
+ const zeroForOne = zeroForOneFromTokenIn(currentToken, token0, token1);
55
+ const nextToken = getAddress(zeroForOne ? token1 : token0);
56
+ zeroForOnes.push(zeroForOne);
57
+ tokens.push(nextToken);
58
+ currentToken = nextToken;
59
+ }
60
+ if (currentToken !== getAddress(tokenOut)) {
61
+ throw new Error(`path ends at ${currentToken}, expected ${getAddress(tokenOut)}`);
62
+ }
63
+ return {
64
+ tokens,
65
+ zeroForOnes,
66
+ extensionDatas: normalizedExtensionDatas,
67
+ zeroForOneBitMap: encodeZeroForOneBitMap(zeroForOnes),
68
+ };
69
+ }
70
+ export async function resolveZeroForOne(publicClient, pool, tokenIn, tokenOut) {
71
+ const { zeroForOnes } = await resolveSwapPath(publicClient, tokenIn, tokenOut, [pool]);
72
+ return zeroForOnes[0];
73
+ }
74
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/swap/path.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nradko/metric-omm-sdk-v1",
3
- "version": "0.3.0",
4
- "description": "Metric AMM SDK — v1 contracts (Swapper, LiquidityAdder, extensions, add/removeLiquidity)",
3
+ "version": "0.4.2",
4
+ "description": "Metric AMM SDK — v1 contracts (SimpleRouter, SwapQuoter, LiquidityAdder, extensions, add/removeLiquidity)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -28,7 +28,6 @@
28
28
  "sync:contracts": "npx hardhat build --force",
29
29
  "sync:abis": "npm run sync:contracts && node ./scripts/sync-abis.mjs",
30
30
  "setup:contracts": "npm run init:submodules && npm run sync:abis",
31
- "prepare": "npm run build",
32
31
  "pretest": "npm run init:submodules",
33
32
  "test": "hardhat test",
34
33
  "typecheck": "tsc --noEmit",
@@ -55,6 +54,7 @@
55
54
  "type": "git",
56
55
  "url": "https://github.com/Metric-OMM/metric-sdk.git"
57
56
  },
57
+ "metricPeripheryRef": "dccbda7970da36d55a86108e3dbcce1e794c9634",
58
58
  "dependencies": {
59
59
  "viem": "^2.x"
60
60
  },
@@ -63,7 +63,6 @@
63
63
  },
64
64
  "devDependencies": {
65
65
  "@eslint/js": "^10.0.1",
66
- "@metric/periphery": "github:Metric-OMM/metric-periphery#cc8fef9781fba405cfd1945fe6bf49a00da132bb",
67
66
  "@nomicfoundation/hardhat-network-helpers": "^3.0.3",
68
67
  "@nomicfoundation/hardhat-node-test-runner": "^3.0.7",
69
68
  "@nomicfoundation/hardhat-viem": "^3.0.1",
@@ -74,4 +73,4 @@
74
73
  "typescript": "~5.8.0",
75
74
  "typescript-eslint": "^8.58.0"
76
75
  }
77
- }
76
+ }
@@ -1027,6 +1027,24 @@ export const MetricOmmPoolAbi = [
1027
1027
  stateMutability: "view",
1028
1028
  type: "function",
1029
1029
  },
1030
+ {
1031
+ inputs: [],
1032
+ name: "getSellAndBuyPrices",
1033
+ outputs: [
1034
+ {
1035
+ internalType: "uint128",
1036
+ name: "sellPriceX64",
1037
+ type: "uint128",
1038
+ },
1039
+ {
1040
+ internalType: "uint128",
1041
+ name: "buyPriceX64",
1042
+ type: "uint128",
1043
+ },
1044
+ ],
1045
+ stateMutability: "nonpayable",
1046
+ type: "function",
1047
+ },
1030
1048
  {
1031
1049
  inputs: [],
1032
1050
  name: "inSwap",
@@ -61,32 +61,6 @@ export const MetricOmmPoolDataProviderAbi = [
61
61
  name: "SafeCastOverflowedUintDowncast",
62
62
  type: "error",
63
63
  },
64
- {
65
- inputs: [
66
- {
67
- internalType: "address",
68
- name: "target",
69
- type: "address",
70
- },
71
- {
72
- internalType: "bytes4",
73
- name: "selector",
74
- type: "bytes4",
75
- },
76
- {
77
- internalType: "bytes",
78
- name: "reason",
79
- type: "bytes",
80
- },
81
- {
82
- internalType: "bytes",
83
- name: "additionalInfo",
84
- type: "bytes",
85
- },
86
- ],
87
- name: "WrappedError",
88
- type: "error",
89
- },
90
64
  {
91
65
  inputs: [
92
66
  {
@@ -203,25 +177,6 @@ export const MetricOmmPoolDataProviderAbi = [
203
177
  stateMutability: "view",
204
178
  type: "function",
205
179
  },
206
- {
207
- inputs: [
208
- {
209
- internalType: "address",
210
- name: "pool",
211
- type: "address",
212
- },
213
- ],
214
- name: "currentPriceX64",
215
- outputs: [
216
- {
217
- internalType: "uint256",
218
- name: "currentPriceX64Value",
219
- type: "uint256",
220
- },
221
- ],
222
- stateMutability: "nonpayable",
223
- type: "function",
224
- },
225
180
  {
226
181
  inputs: [
227
182
  {
@@ -241,30 +196,6 @@ export const MetricOmmPoolDataProviderAbi = [
241
196
  stateMutability: "view",
242
197
  type: "function",
243
198
  },
244
- {
245
- inputs: [
246
- {
247
- internalType: "address",
248
- name: "pool",
249
- type: "address",
250
- },
251
- ],
252
- name: "getBestBidAndAsk",
253
- outputs: [
254
- {
255
- internalType: "uint128",
256
- name: "bestBidX64",
257
- type: "uint128",
258
- },
259
- {
260
- internalType: "uint128",
261
- name: "bestAskX64",
262
- type: "uint128",
263
- },
264
- ],
265
- stateMutability: "nonpayable",
266
- type: "function",
267
- },
268
199
  {
269
200
  inputs: [
270
201
  {
@@ -452,114 +383,6 @@ export const MetricOmmPoolDataProviderAbi = [
452
383
  stateMutability: "view",
453
384
  type: "function",
454
385
  },
455
- {
456
- inputs: [
457
- {
458
- internalType: "address",
459
- name: "pool",
460
- type: "address",
461
- },
462
- {
463
- internalType: "bool",
464
- name: "zeroForOne",
465
- type: "bool",
466
- },
467
- {
468
- internalType: "int128",
469
- name: "amountSpecified",
470
- type: "int128",
471
- },
472
- {
473
- internalType: "uint128",
474
- name: "priceLimitX64",
475
- type: "uint128",
476
- },
477
- {
478
- internalType: "uint128",
479
- name: "bidPriceX64",
480
- type: "uint128",
481
- },
482
- {
483
- internalType: "uint128",
484
- name: "askPriceX64",
485
- type: "uint128",
486
- },
487
- ],
488
- name: "quoteSwap",
489
- outputs: [
490
- {
491
- internalType: "int128",
492
- name: "amount0Delta",
493
- type: "int128",
494
- },
495
- {
496
- internalType: "int128",
497
- name: "amount1Delta",
498
- type: "int128",
499
- },
500
- ],
501
- stateMutability: "nonpayable",
502
- type: "function",
503
- },
504
- {
505
- inputs: [
506
- {
507
- internalType: "address",
508
- name: "pool",
509
- type: "address",
510
- },
511
- {
512
- internalType: "address",
513
- name: "recipient",
514
- type: "address",
515
- },
516
- {
517
- internalType: "bool",
518
- name: "zeroForOne",
519
- type: "bool",
520
- },
521
- {
522
- internalType: "int128",
523
- name: "amountSpecified",
524
- type: "int128",
525
- },
526
- {
527
- internalType: "uint128",
528
- name: "priceLimitX64",
529
- type: "uint128",
530
- },
531
- {
532
- internalType: "uint128",
533
- name: "bidPriceX64",
534
- type: "uint128",
535
- },
536
- {
537
- internalType: "uint128",
538
- name: "askPriceX64",
539
- type: "uint128",
540
- },
541
- {
542
- internalType: "bytes",
543
- name: "extensionData",
544
- type: "bytes",
545
- },
546
- ],
547
- name: "quoteSwap",
548
- outputs: [
549
- {
550
- internalType: "int128",
551
- name: "amount0Delta",
552
- type: "int128",
553
- },
554
- {
555
- internalType: "int128",
556
- name: "amount1Delta",
557
- type: "int128",
558
- },
559
- ],
560
- stateMutability: "nonpayable",
561
- type: "function",
562
- },
563
386
  {
564
387
  inputs: [
565
388
  {