@yummybait/uniswap-tx-builder-mcp 0.3.1

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.
@@ -0,0 +1,335 @@
1
+ import { createPublicClient, encodeAbiParameters, encodeFunctionData, encodePacked, http, parseUnits, serializeTransaction, } from "viem";
2
+ import { erc20Abi, factoryAbi, nfpmAbi, poolAbi, universalRouterAbi, } from "./abi.js";
3
+ import { getChain } from "./config.js";
4
+ import { computeMintAmounts, priceRangeToTicks, sqrtPriceX96ToPrice, suggestRangeTicks, } from "./ticks.js";
5
+ const MAX_UINT128 = (1n << 128n) - 1n;
6
+ const DEADLINE_SECS = 1800; // 30 minutes
7
+ const UR_DEADLINE_SECS = 1200; // 20 minutes — Universal Router wrap/swap
8
+ const DEFAULT_SLIPPAGE_BPS = 50n; // 0.5%
9
+ /**
10
+ * Unsigned EIP-1559 (type-2) serialization of a built tx:
11
+ * `0x02 || rlp([chainId, 0, 0, 0, 0, to, value, data, []])`. Nonce, both fee
12
+ * fields and gasLimit are zeroed by design — signing services (e.g. the CDP
13
+ * API) populate them at signing time. Callers that manage their own nonces
14
+ * should serialize `tx` themselves instead.
15
+ */
16
+ export function toUnsignedRlp(tx) {
17
+ return serializeTransaction({
18
+ type: "eip1559",
19
+ chainId: tx.chainId,
20
+ nonce: 0,
21
+ maxPriorityFeePerGas: 0n,
22
+ maxFeePerGas: 0n,
23
+ gas: 0n,
24
+ to: tx.to,
25
+ value: BigInt(tx.value),
26
+ data: tx.data,
27
+ accessList: [],
28
+ });
29
+ }
30
+ // ─── helpers ────────────────────────────────────────────────────────
31
+ function deadline() {
32
+ return BigInt(Math.floor(Date.now() / 1000) + DEADLINE_SECS);
33
+ }
34
+ /** Lower bound after applying `slippageBps` (default 0.5%) to a desired amount. */
35
+ function minWithSlippage(desired, slippageBps) {
36
+ const bps = slippageBps === undefined ? DEFAULT_SLIPPAGE_BPS : BigInt(slippageBps);
37
+ return desired - (desired * bps) / 10000n;
38
+ }
39
+ async function readPosition(chainId, positionId) {
40
+ const cfg = getChain(chainId);
41
+ const client = createPublicClient({ transport: http(cfg.rpcUrl) });
42
+ const result = await client.readContract({
43
+ address: cfg.nfpm,
44
+ abi: nfpmAbi,
45
+ functionName: "positions",
46
+ args: [positionId],
47
+ });
48
+ // positions() returns a 12-element tuple
49
+ return {
50
+ token0: result[2],
51
+ token1: result[3],
52
+ fee: result[4],
53
+ tickLower: result[5],
54
+ tickUpper: result[6],
55
+ liquidity: result[7],
56
+ };
57
+ }
58
+ // ─── collect ────────────────────────────────────────────────────────
59
+ export async function buildCollectTx(chainId, positionId, recipient) {
60
+ const cfg = getChain(chainId);
61
+ const data = encodeFunctionData({
62
+ abi: nfpmAbi,
63
+ functionName: "collect",
64
+ args: [
65
+ {
66
+ tokenId: positionId,
67
+ recipient,
68
+ amount0Max: MAX_UINT128,
69
+ amount1Max: MAX_UINT128,
70
+ },
71
+ ],
72
+ });
73
+ return { to: cfg.nfpm, data, value: "0", chainId };
74
+ }
75
+ // ─── close (decreaseLiquidity + collect) ────────────────────────────
76
+ export async function buildCloseTx(chainId, positionId, recipient, burn = false) {
77
+ const cfg = getChain(chainId);
78
+ const position = await readPosition(chainId, positionId);
79
+ const calls = [];
80
+ // 1. Remove all liquidity (if any)
81
+ if (position.liquidity > 0n) {
82
+ calls.push(encodeFunctionData({
83
+ abi: nfpmAbi,
84
+ functionName: "decreaseLiquidity",
85
+ args: [
86
+ {
87
+ tokenId: positionId,
88
+ liquidity: position.liquidity,
89
+ amount0Min: 0n,
90
+ amount1Min: 0n,
91
+ deadline: deadline(),
92
+ },
93
+ ],
94
+ }));
95
+ }
96
+ // 2. Collect all tokens + fees
97
+ calls.push(encodeFunctionData({
98
+ abi: nfpmAbi,
99
+ functionName: "collect",
100
+ args: [
101
+ {
102
+ tokenId: positionId,
103
+ recipient,
104
+ amount0Max: MAX_UINT128,
105
+ amount1Max: MAX_UINT128,
106
+ },
107
+ ],
108
+ }));
109
+ // 3. Optionally burn the now-empty NFT (requires liquidity + owed both zero,
110
+ // which the calls above guarantee).
111
+ if (burn) {
112
+ calls.push(encodeFunctionData({
113
+ abi: nfpmAbi,
114
+ functionName: "burn",
115
+ args: [positionId],
116
+ }));
117
+ }
118
+ // Wrap in multicall if > 1 call, otherwise send directly
119
+ const data = calls.length === 1
120
+ ? calls[0]
121
+ : encodeFunctionData({
122
+ abi: nfpmAbi,
123
+ functionName: "multicall",
124
+ args: [calls],
125
+ });
126
+ return {
127
+ tx: { to: cfg.nfpm, data, value: "0", chainId },
128
+ position,
129
+ };
130
+ }
131
+ // ─── simulate (dry-run via eth_call) ─────────────────────────────────
132
+ export async function simulateTx(chainId, tx, from) {
133
+ const cfg = getChain(chainId);
134
+ const client = createPublicClient({ transport: http(cfg.rpcUrl) });
135
+ await client.call({
136
+ account: from,
137
+ to: tx.to,
138
+ data: tx.data,
139
+ value: BigInt(tx.value),
140
+ });
141
+ }
142
+ export function buildMintTx(params) {
143
+ const cfg = getChain(params.chainId);
144
+ const amount0Min = minWithSlippage(params.amount0Desired, params.slippageBps);
145
+ const amount1Min = minWithSlippage(params.amount1Desired, params.slippageBps);
146
+ const data = encodeFunctionData({
147
+ abi: nfpmAbi,
148
+ functionName: "mint",
149
+ args: [
150
+ {
151
+ token0: params.token0,
152
+ token1: params.token1,
153
+ fee: params.fee,
154
+ tickLower: params.tickLower,
155
+ tickUpper: params.tickUpper,
156
+ amount0Desired: params.amount0Desired,
157
+ amount1Desired: params.amount1Desired,
158
+ amount0Min,
159
+ amount1Min,
160
+ recipient: params.recipient,
161
+ deadline: deadline(),
162
+ },
163
+ ],
164
+ });
165
+ return { to: cfg.nfpm, data, value: "0", chainId: params.chainId };
166
+ }
167
+ export function buildIncreaseLiquidityTx(params) {
168
+ const cfg = getChain(params.chainId);
169
+ const data = encodeFunctionData({
170
+ abi: nfpmAbi,
171
+ functionName: "increaseLiquidity",
172
+ args: [
173
+ {
174
+ tokenId: params.positionId,
175
+ amount0Desired: params.amount0Desired,
176
+ amount1Desired: params.amount1Desired,
177
+ amount0Min: minWithSlippage(params.amount0Desired, params.slippageBps),
178
+ amount1Min: minWithSlippage(params.amount1Desired, params.slippageBps),
179
+ deadline: deadline(),
180
+ },
181
+ ],
182
+ });
183
+ return { to: cfg.nfpm, data, value: "0", chainId: params.chainId };
184
+ }
185
+ /**
186
+ * Resolve a human-readable position spec into the raw values `build_mint`
187
+ * needs: reads each token's decimals over RPC, converts the price range to
188
+ * aligned ticks, and parses human amounts to wei. Does not compute the optimal
189
+ * amount ratio for the range — pass the amounts you intend to deposit.
190
+ */
191
+ export async function planPosition(params) {
192
+ // Uniswap requires token0 < token1 (sorted by address). Reject otherwise so
193
+ // the caller swaps the pair and inverts the price rather than minting garbage.
194
+ if (BigInt(params.token0) >= BigInt(params.token1)) {
195
+ throw new Error("token0 must be < token1 (sort by address); swap the pair and invert the price range.");
196
+ }
197
+ const cfg = getChain(params.chainId);
198
+ const client = createPublicClient({ transport: http(cfg.rpcUrl) });
199
+ const [decimals0, decimals1] = await Promise.all([
200
+ client.readContract({ address: params.token0, abi: erc20Abi, functionName: "decimals" }),
201
+ client.readContract({ address: params.token1, abi: erc20Abi, functionName: "decimals" }),
202
+ ]);
203
+ const { tickLower, tickUpper, tickSpacing } = priceRangeToTicks(params.priceLower, params.priceUpper, params.fee, decimals0, decimals1);
204
+ return {
205
+ token0: params.token0,
206
+ token1: params.token1,
207
+ fee: params.fee,
208
+ tickLower,
209
+ tickUpper,
210
+ tickSpacing,
211
+ decimals0,
212
+ decimals1,
213
+ amount0Desired: parseUnits(params.amount0 ?? "0", decimals0).toString(),
214
+ amount1Desired: parseUnits(params.amount1 ?? "0", decimals1).toString(),
215
+ };
216
+ }
217
+ /**
218
+ * Read a pool's LIVE state and derive the values a mint needs from it in the
219
+ * same breath: optional ±pct tick range (rounded inward to spacing) and
220
+ * optional `amount0Desired`/`amount1Desired` computed from the current
221
+ * sqrtPrice ratio — amounts computed from stale prices revert the mint with
222
+ * "Price slippage check".
223
+ */
224
+ export async function getPoolState(params) {
225
+ if (BigInt(params.token0) >= BigInt(params.token1)) {
226
+ throw new Error("token0 must be < token1 (sort by address); swap the pair.");
227
+ }
228
+ const wantAmounts = params.balance0 !== undefined || params.balance1 !== undefined;
229
+ if (wantAmounts &&
230
+ (params.balance0 === undefined ||
231
+ params.balance1 === undefined ||
232
+ params.tickLower === undefined ||
233
+ params.tickUpper === undefined)) {
234
+ throw new Error("Mint amounts need all of balance0, balance1, tickLower, tickUpper " +
235
+ "(get a range from rangePct first).");
236
+ }
237
+ const cfg = getChain(params.chainId);
238
+ const client = createPublicClient({ transport: http(cfg.rpcUrl) });
239
+ const pool = await client.readContract({
240
+ address: cfg.factory,
241
+ abi: factoryAbi,
242
+ functionName: "getPool",
243
+ args: [params.token0, params.token1, params.fee],
244
+ });
245
+ if (BigInt(pool) === 0n) {
246
+ throw new Error(`No pool for ${params.token0}/${params.token1} fee=${params.fee} on chain ${params.chainId}`);
247
+ }
248
+ const [slot0, tickSpacing, decimals0, decimals1] = await Promise.all([
249
+ client.readContract({ address: pool, abi: poolAbi, functionName: "slot0" }),
250
+ client.readContract({ address: pool, abi: poolAbi, functionName: "tickSpacing" }),
251
+ client.readContract({ address: params.token0, abi: erc20Abi, functionName: "decimals" }),
252
+ client.readContract({ address: params.token1, abi: erc20Abi, functionName: "decimals" }),
253
+ ]);
254
+ const [sqrtPriceX96, tick] = slot0;
255
+ const result = {
256
+ pool,
257
+ tick,
258
+ tickSpacing,
259
+ sqrtPriceX96: sqrtPriceX96.toString(),
260
+ price: sqrtPriceX96ToPrice(sqrtPriceX96, decimals0, decimals1),
261
+ decimals0,
262
+ decimals1,
263
+ };
264
+ if (params.rangePct !== undefined) {
265
+ result.suggested = suggestRangeTicks(tick, tickSpacing, params.rangePct);
266
+ }
267
+ if (wantAmounts) {
268
+ const amounts = computeMintAmounts(sqrtPriceX96, params.tickLower, params.tickUpper, params.balance0, params.balance1);
269
+ result.mintAmounts = {
270
+ amount0Desired: amounts.amount0Desired.toString(),
271
+ amount1Desired: amounts.amount1Desired.toString(),
272
+ limitingSide: amounts.limitingSide,
273
+ };
274
+ }
275
+ return result;
276
+ }
277
+ // ─── Universal Router wrap / swap ────────────────────────────────────
278
+ // UR command bytes (Commands.sol).
279
+ const CMD_V3_SWAP_EXACT_IN = "00";
280
+ const CMD_SWEEP = "04";
281
+ const CMD_WRAP_ETH = "0b";
282
+ // UR recipient placeholder the router resolves to msg.sender at execution —
283
+ // safer than a literal address when the output goes back to the signer.
284
+ const MSG_SENDER = "0x0000000000000000000000000000000000000001";
285
+ // Placeholder for the router itself (intermediate custody within one execute).
286
+ const ADDRESS_THIS = "0x0000000000000000000000000000000000000002";
287
+ function urDeadline(deadline) {
288
+ return BigInt(deadline ?? Math.floor(Date.now() / 1000) + UR_DEADLINE_SECS);
289
+ }
290
+ function urExecute(chainId, commands, inputs, value, deadline) {
291
+ const cfg = getChain(chainId);
292
+ const data = encodeFunctionData({
293
+ abi: universalRouterAbi,
294
+ functionName: "execute",
295
+ args: [commands, inputs, urDeadline(deadline)],
296
+ });
297
+ return { to: cfg.universalRouter, data, value: value.toString(), chainId };
298
+ }
299
+ /**
300
+ * Native ETH → wrapped native (WETH9) via Universal Router `WRAP_ETH` — a
301
+ * direct `WETH.deposit()` is unusable under NFPM/UR-scoped wallet policies.
302
+ * The tx is payable: `value` carries the ETH being wrapped.
303
+ */
304
+ export function buildWrapTx(params) {
305
+ const input = encodeAbiParameters([{ type: "address" }, { type: "uint256" }], [params.recipient ?? MSG_SENDER, params.amountWei]);
306
+ return urExecute(params.chainId, `0x${CMD_WRAP_ETH}`, [input], params.amountWei, params.deadline);
307
+ }
308
+ /**
309
+ * Exact-in single-hop v3 swap WETH9 → `tokenOut` via Universal Router.
310
+ * With `wrapWei`: `WRAP_ETH(ADDRESS_THIS)` + `V3_SWAP_EXACT_IN(payerIsUser=
311
+ * false)` + `SWEEP(WETH9, recipient, remainder)` in one payable tx — the
312
+ * "wallet holds native ETH but the position needs WETH/ERC-20" path.
313
+ */
314
+ export function buildSwapTx(params) {
315
+ const cfg = getChain(params.chainId);
316
+ const recipient = params.recipient ?? MSG_SENDER;
317
+ const path = encodePacked(["address", "uint24", "address"], [cfg.weth9, params.fee, params.tokenOut]);
318
+ const swapInput = (payerIsUser) => encodeAbiParameters([
319
+ { type: "address" },
320
+ { type: "uint256" },
321
+ { type: "uint256" },
322
+ { type: "bytes" },
323
+ { type: "bool" },
324
+ ], [recipient, params.amountInWei, params.amountOutMin, path, payerIsUser]);
325
+ if (params.wrapWei === undefined) {
326
+ return urExecute(params.chainId, `0x${CMD_V3_SWAP_EXACT_IN}`, [swapInput(true)], 0n, params.deadline);
327
+ }
328
+ if (params.wrapWei < params.amountInWei) {
329
+ throw new Error(`wrapWei (${params.wrapWei}) must cover amountInWei (${params.amountInWei})`);
330
+ }
331
+ const wrapInput = encodeAbiParameters([{ type: "address" }, { type: "uint256" }], [ADDRESS_THIS, params.wrapWei]);
332
+ const sweepInput = encodeAbiParameters([{ type: "address" }, { type: "address" }, { type: "uint256" }], [cfg.weth9, recipient, params.wrapWei - params.amountInWei]);
333
+ return urExecute(params.chainId, `0x${CMD_WRAP_ETH}${CMD_V3_SWAP_EXACT_IN}${CMD_SWEEP}`, [wrapInput, swapInput(false), sweepInput], params.wrapWei, params.deadline);
334
+ }
335
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Address } from "viem";
2
+ export interface ChainConfig {
3
+ rpcUrl: string;
4
+ nfpm: Address;
5
+ factory: Address;
6
+ /** Universal Router v1.2 — the deployment wallet policies allowlist. */
7
+ universalRouter: Address;
8
+ /** Canonical wrapped-native token (WETH9; WMATIC on Polygon). */
9
+ weth9: Address;
10
+ }
11
+ export declare function getChain(chainId: number): ChainConfig;
package/dist/config.js ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Uniswap v3 core + periphery addresses per chain.
3
+ *
4
+ * Most chains use the canonical deployments; Base differs for NFPM/factory.
5
+ * The Universal Router v1.2 lives at the same CREATE2 address on every chain
6
+ * here (verified via eth_getCode). RPC URLs fall back to public endpoints —
7
+ * override via RPC_<CHAIN> env vars.
8
+ */
9
+ const CANONICAL_NFPM = "0xC36442b4a4522E871399CD717aBDD847Ab11FE88";
10
+ const CANONICAL_FACTORY = "0x1F98431c8aD98523631AE4a59f267346ea31F984";
11
+ const UNIVERSAL_ROUTER_V1_2 = "0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD";
12
+ const chains = {
13
+ 1: {
14
+ rpcUrl: process.env.RPC_ETH ?? "https://eth.llamarpc.com",
15
+ nfpm: CANONICAL_NFPM,
16
+ factory: CANONICAL_FACTORY,
17
+ universalRouter: UNIVERSAL_ROUTER_V1_2,
18
+ weth9: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
19
+ },
20
+ 10: {
21
+ rpcUrl: process.env.RPC_OP ?? "https://mainnet.optimism.io",
22
+ nfpm: CANONICAL_NFPM,
23
+ factory: CANONICAL_FACTORY,
24
+ universalRouter: UNIVERSAL_ROUTER_V1_2,
25
+ weth9: "0x4200000000000000000000000000000000000006",
26
+ },
27
+ 137: {
28
+ rpcUrl: process.env.RPC_POLYGON ?? "https://polygon-rpc.com",
29
+ nfpm: CANONICAL_NFPM,
30
+ factory: CANONICAL_FACTORY,
31
+ universalRouter: UNIVERSAL_ROUTER_V1_2,
32
+ weth9: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", // WMATIC
33
+ },
34
+ 8453: {
35
+ rpcUrl: process.env.RPC_BASE ?? "https://mainnet.base.org",
36
+ nfpm: "0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",
37
+ factory: "0x33128a8fC17869897dcE68Ed026d694621f6FDfD",
38
+ universalRouter: UNIVERSAL_ROUTER_V1_2,
39
+ weth9: "0x4200000000000000000000000000000000000006",
40
+ },
41
+ 42161: {
42
+ rpcUrl: process.env.RPC_ARB ?? "https://arb1.arbitrum.io/rpc",
43
+ nfpm: CANONICAL_NFPM,
44
+ factory: CANONICAL_FACTORY,
45
+ universalRouter: UNIVERSAL_ROUTER_V1_2,
46
+ weth9: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
47
+ },
48
+ };
49
+ export function getChain(chainId) {
50
+ const cfg = chains[chainId];
51
+ if (!cfg) {
52
+ throw new Error(`Unsupported chain: ${chainId}`);
53
+ }
54
+ return cfg;
55
+ }
56
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAYA;;;;;;;GAOG;AACH,MAAM,cAAc,GAClB,4CAA4C,CAAC;AAC/C,MAAM,iBAAiB,GACrB,4CAA4C,CAAC;AAC/C,MAAM,qBAAqB,GACzB,4CAA4C,CAAC;AAE/C,MAAM,MAAM,GAAgC;IAC1C,CAAC,EAAE;QACD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,0BAA0B;QACzD,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,iBAAiB;QAC1B,eAAe,EAAE,qBAAqB;QACtC,KAAK,EAAE,4CAA4C;KACpD;IACD,EAAE,EAAE;QACF,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,6BAA6B;QAC3D,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,iBAAiB;QAC1B,eAAe,EAAE,qBAAqB;QACtC,KAAK,EAAE,4CAA4C;KACpD;IACD,GAAG,EAAE;QACH,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,yBAAyB;QAC5D,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,iBAAiB;QAC1B,eAAe,EAAE,qBAAqB;QACtC,KAAK,EAAE,4CAA4C,EAAE,SAAS;KAC/D;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,0BAA0B;QAC1D,IAAI,EAAE,4CAA4C;QAClD,OAAO,EAAE,4CAA4C;QACrD,eAAe,EAAE,qBAAqB;QACtC,KAAK,EAAE,4CAA4C;KACpD;IACD,KAAK,EAAE;QACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,8BAA8B;QAC7D,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,iBAAiB;QAC1B,eAAe,EAAE,qBAAqB;QACtC,KAAK,EAAE,4CAA4C;KACpD;CACF,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};