@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.
- package/.claude-plugin/marketplace.json +11 -0
- package/.claude-plugin/plugin.json +16 -0
- package/LICENSE +201 -0
- package/README.md +195 -0
- package/bin/install-skill.mjs +34 -0
- package/dist/abi.d.ts +310 -0
- package/dist/abi.js +205 -0
- package/dist/abi.js.map +1 -0
- package/dist/builder.d.ts +149 -0
- package/dist/builder.js +335 -0
- package/dist/builder.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js +56 -0
- package/dist/config.js.map +1 -0
- package/dist/mcp.d.ts +2 -0
- package/dist/mcp.js +363 -0
- package/dist/mcp.js.map +1 -0
- package/dist/operations.d.ts +82 -0
- package/dist/operations.js +114 -0
- package/dist/operations.js.map +1 -0
- package/dist/ticks.d.ts +69 -0
- package/dist/ticks.js +174 -0
- package/dist/ticks.js.map +1 -0
- package/package.json +64 -0
- package/skills/uniswap-tx-builder/SKILL.md +100 -0
package/dist/builder.js
ADDED
|
@@ -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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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