@grimoirelabs/venues 0.1.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 (62) hide show
  1. package/README.md +45 -0
  2. package/dist/aave-v3.d.ts +16 -0
  3. package/dist/aave-v3.d.ts.map +1 -0
  4. package/dist/aave-v3.js +272 -0
  5. package/dist/aave-v3.js.map +1 -0
  6. package/dist/across.d.ts +12 -0
  7. package/dist/across.d.ts.map +1 -0
  8. package/dist/across.js +154 -0
  9. package/dist/across.js.map +1 -0
  10. package/dist/cli/aave.d.ts +3 -0
  11. package/dist/cli/aave.d.ts.map +1 -0
  12. package/dist/cli/aave.js +81 -0
  13. package/dist/cli/aave.js.map +1 -0
  14. package/dist/cli/hyperliquid.d.ts +3 -0
  15. package/dist/cli/hyperliquid.d.ts.map +1 -0
  16. package/dist/cli/hyperliquid.js +72 -0
  17. package/dist/cli/hyperliquid.js.map +1 -0
  18. package/dist/cli/morpho-blue.d.ts +3 -0
  19. package/dist/cli/morpho-blue.d.ts.map +1 -0
  20. package/dist/cli/morpho-blue.js +34 -0
  21. package/dist/cli/morpho-blue.js.map +1 -0
  22. package/dist/cli/uniswap.d.ts +3 -0
  23. package/dist/cli/uniswap.d.ts.map +1 -0
  24. package/dist/cli/uniswap.js +37 -0
  25. package/dist/cli/uniswap.js.map +1 -0
  26. package/dist/cli/utils.d.ts +10 -0
  27. package/dist/cli/utils.d.ts.map +1 -0
  28. package/dist/cli/utils.js +85 -0
  29. package/dist/cli/utils.js.map +1 -0
  30. package/dist/compound-v3.d.ts +3 -0
  31. package/dist/compound-v3.d.ts.map +1 -0
  32. package/dist/compound-v3.js +12 -0
  33. package/dist/compound-v3.js.map +1 -0
  34. package/dist/erc20.d.ts +12 -0
  35. package/dist/erc20.d.ts.map +1 -0
  36. package/dist/erc20.js +49 -0
  37. package/dist/erc20.js.map +1 -0
  38. package/dist/hyperliquid.d.ts +11 -0
  39. package/dist/hyperliquid.d.ts.map +1 -0
  40. package/dist/hyperliquid.js +118 -0
  41. package/dist/hyperliquid.js.map +1 -0
  42. package/dist/index.d.ts +10 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +16 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/morpho-blue.d.ts +15 -0
  47. package/dist/morpho-blue.d.ts.map +1 -0
  48. package/dist/morpho-blue.js +176 -0
  49. package/dist/morpho-blue.js.map +1 -0
  50. package/dist/types.d.ts +2 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/uniswap-v3.d.ts +16 -0
  55. package/dist/uniswap-v3.d.ts.map +1 -0
  56. package/dist/uniswap-v3.js +287 -0
  57. package/dist/uniswap-v3.js.map +1 -0
  58. package/dist/uniswap-v4.d.ts +15 -0
  59. package/dist/uniswap-v4.d.ts.map +1 -0
  60. package/dist/uniswap-v4.js +535 -0
  61. package/dist/uniswap-v4.js.map +1 -0
  62. package/package.json +34 -0
@@ -0,0 +1,176 @@
1
+ import { getChainAddresses } from "@morpho-org/blue-sdk";
2
+ import { blueAbi } from "@morpho-org/blue-sdk-viem";
3
+ import { encodeFunctionData } from "viem";
4
+ import { buildApprovalIfNeeded } from "./erc20.js";
5
+ export function createMorphoBlueAdapter(config) {
6
+ return {
7
+ meta: {
8
+ name: "morpho_blue",
9
+ supportedChains: [1, 8453],
10
+ actions: ["lend", "withdraw", "borrow", "repay"],
11
+ description: "Morpho Blue adapter",
12
+ },
13
+ async buildAction(action, ctx) {
14
+ if (!isMorphoAction(action)) {
15
+ throw new Error(`Unsupported Morpho Blue action: ${action.type}`);
16
+ }
17
+ const addresses = getChainAddresses(ctx.chainId);
18
+ const market = resolveMarket(config.markets, action, ctx.chainId);
19
+ const amount = toBigInt(action.amount);
20
+ const marketParams = {
21
+ loanToken: market.loanToken,
22
+ collateralToken: market.collateralToken,
23
+ oracle: market.oracle,
24
+ irm: market.irm,
25
+ lltv: market.lltv,
26
+ };
27
+ let data;
28
+ switch (action.type) {
29
+ case "lend":
30
+ data = encodeFunctionData({
31
+ abi: blueAbi,
32
+ functionName: "supply",
33
+ args: [marketParams, amount, 0n, ctx.walletAddress, "0x"],
34
+ });
35
+ break;
36
+ case "withdraw":
37
+ data = encodeFunctionData({
38
+ abi: blueAbi,
39
+ functionName: "withdraw",
40
+ args: [marketParams, amount, 0n, ctx.walletAddress, ctx.walletAddress],
41
+ });
42
+ break;
43
+ case "borrow":
44
+ data = encodeFunctionData({
45
+ abi: blueAbi,
46
+ functionName: "borrow",
47
+ args: [marketParams, amount, 0n, ctx.walletAddress, ctx.walletAddress],
48
+ });
49
+ break;
50
+ case "repay":
51
+ data = encodeFunctionData({
52
+ abi: blueAbi,
53
+ functionName: "repay",
54
+ args: [marketParams, amount, 0n, ctx.walletAddress, "0x"],
55
+ });
56
+ break;
57
+ default:
58
+ throw new Error("Unsupported Morpho Blue action");
59
+ }
60
+ const needsApproval = action.type === "lend" || action.type === "repay";
61
+ const approvalTxs = needsApproval
62
+ ? await buildApprovalIfNeeded({
63
+ ctx,
64
+ token: market.loanToken,
65
+ spender: addresses.morpho,
66
+ amount,
67
+ action,
68
+ description: `Approve ${action.asset} for Morpho Blue`,
69
+ })
70
+ : [];
71
+ return [
72
+ ...approvalTxs,
73
+ {
74
+ tx: {
75
+ to: addresses.morpho,
76
+ data,
77
+ value: 0n,
78
+ },
79
+ description: `Morpho Blue ${action.type} ${action.asset}`,
80
+ action,
81
+ },
82
+ ];
83
+ },
84
+ };
85
+ }
86
+ // Well-known Morpho Blue markets on Base (chain 8453).
87
+ // Fetched from the Morpho Blue API: https://blue-api.morpho.org/graphql
88
+ const DEFAULT_BASE_MARKETS = [
89
+ {
90
+ // cbBTC/USDC — largest USDC market on Base (~$1.26B supply)
91
+ id: "cbbtc-usdc-86",
92
+ loanToken: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
93
+ collateralToken: "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf",
94
+ oracle: "0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9",
95
+ irm: "0x46415998764C29aB2a25CbeA6254146D50D22687",
96
+ lltv: 860000000000000000n,
97
+ },
98
+ {
99
+ // WETH/USDC — second largest (~$48.7M supply)
100
+ id: "weth-usdc-86",
101
+ loanToken: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
102
+ collateralToken: "0x4200000000000000000000000000000000000006",
103
+ oracle: "0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4",
104
+ irm: "0x46415998764C29aB2a25CbeA6254146D50D22687",
105
+ lltv: 860000000000000000n,
106
+ },
107
+ ];
108
+ export const morphoBlueAdapter = createMorphoBlueAdapter({ markets: DEFAULT_BASE_MARKETS });
109
+ function isMorphoAction(action) {
110
+ return ["lend", "withdraw", "borrow", "repay"].includes(action.type);
111
+ }
112
+ function resolveMarket(markets, action, chainId) {
113
+ const loanToken = resolveAssetAddress("asset" in action ? action.asset : undefined, chainId);
114
+ const collateral = "collateral" in action && action.collateral
115
+ ? resolveAssetAddress(action.collateral, chainId)
116
+ : undefined;
117
+ const matches = markets.filter((market) => market.loanToken === loanToken);
118
+ if (collateral) {
119
+ const match = matches.find((market) => market.collateralToken === collateral);
120
+ if (match)
121
+ return match;
122
+ }
123
+ if (matches.length > 0) {
124
+ const first = matches[0];
125
+ if (first)
126
+ return first;
127
+ }
128
+ throw new Error(`Morpho Blue market not configured for asset ${"asset" in action ? action.asset : "unknown"} on chain ${chainId}`);
129
+ }
130
+ function resolveAssetAddress(asset, chainId) {
131
+ if (!asset) {
132
+ throw new Error("Asset is required for Morpho Blue action");
133
+ }
134
+ if (asset.startsWith("0x") && asset.length === 42) {
135
+ return asset;
136
+ }
137
+ const KNOWN_TOKENS = {
138
+ 1: {
139
+ USDC: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
140
+ WETH: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
141
+ },
142
+ 8453: {
143
+ USDC: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
144
+ WETH: "0x4200000000000000000000000000000000000006",
145
+ },
146
+ };
147
+ const chainTokens = KNOWN_TOKENS[chainId ?? 1] ?? KNOWN_TOKENS[1];
148
+ const address = chainTokens?.[asset.toUpperCase()];
149
+ if (!address) {
150
+ throw new Error(`Unknown asset: ${asset} on chain ${chainId ?? 1}. Provide address directly.`);
151
+ }
152
+ return address;
153
+ }
154
+ function toBigInt(amount) {
155
+ if (amount === "max") {
156
+ throw new Error("Morpho adapter requires explicit amount");
157
+ }
158
+ if (typeof amount === "bigint")
159
+ return amount;
160
+ if (typeof amount === "number")
161
+ return BigInt(Math.floor(amount));
162
+ if (typeof amount === "string")
163
+ return BigInt(amount);
164
+ if (isLiteralAmount(amount)) {
165
+ return BigInt(amount.value);
166
+ }
167
+ throw new Error("Unsupported amount type for Morpho action");
168
+ }
169
+ function isLiteralAmount(value) {
170
+ return (typeof value === "object" &&
171
+ value !== null &&
172
+ "kind" in value &&
173
+ value.kind === "literal" &&
174
+ "value" in value);
175
+ }
176
+ //# sourceMappingURL=morpho-blue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morpho-blue.js","sourceRoot":"","sources":["../src/morpho-blue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type { VenueAdapter, VenueAdapterMeta, OffchainExecutionResult, VenueBuildResult, } from "@grimoirelabs/core";
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { Address } from "@grimoirelabs/core";
2
+ import type { VenueAdapter } from "@grimoirelabs/core";
3
+ export interface UniswapV3AdapterConfig {
4
+ routers: Record<number, Address>;
5
+ factories?: Record<number, Address>;
6
+ defaultFee?: number;
7
+ deadlineSeconds?: number;
8
+ slippageBps?: number;
9
+ }
10
+ /** Original V3 SwapRouter — matches the SDK's SwapRouter.swapCallParameters() encoding */
11
+ export declare const DEFAULT_SWAP_ROUTER: Address;
12
+ export declare const DEFAULT_ROUTERS: Record<number, Address>;
13
+ export declare const defaultUniswapV3Routers: Record<number, `0x${string}`>;
14
+ export declare function createUniswapV3Adapter(config?: UniswapV3AdapterConfig): VenueAdapter;
15
+ export declare const uniswapV3Adapter: VenueAdapter;
16
+ //# sourceMappingURL=uniswap-v3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswap-v3.d.ts","sourceRoot":"","sources":["../src/uniswap-v3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAavD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,EAAmD,OAAO,CAAC;AAE3F,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAMnD,CAAC;AAEF,eAAO,MAAM,uBAAuB,+BAAkB,CAAC;AAwBvD,wBAAgB,sBAAsB,CACpC,MAAM,GAAE,sBAAqD,GAC5D,YAAY,CA2Md;AAED,eAAO,MAAM,gBAAgB,cAA2B,CAAC"}
@@ -0,0 +1,287 @@
1
+ import { createRequire } from "node:module";
2
+ import { CurrencyAmount, Percent, Token, TradeType } from "@uniswap/sdk-core";
3
+ import { Pool, Route, SwapRouter, Trade, computePoolAddress, } from "@uniswap/v3-sdk";
4
+ import { encodeFunctionData, parseAbi } from "viem";
5
+ import { buildApprovalIfNeeded } from "./erc20.js";
6
+ /** Original V3 SwapRouter — matches the SDK's SwapRouter.swapCallParameters() encoding */
7
+ export const DEFAULT_SWAP_ROUTER = "0xE592427A0AEce92De3Edee1F18E0157C05861564";
8
+ export const DEFAULT_ROUTERS = {
9
+ 1: DEFAULT_SWAP_ROUTER,
10
+ 10: DEFAULT_SWAP_ROUTER,
11
+ 137: DEFAULT_SWAP_ROUTER,
12
+ 42161: DEFAULT_SWAP_ROUTER,
13
+ 8453: DEFAULT_SWAP_ROUTER,
14
+ };
15
+ export const defaultUniswapV3Routers = DEFAULT_ROUTERS;
16
+ const DEFAULT_FACTORY = "0x1F98431c8aD98523631AE4a59f267346ea31F984";
17
+ const DEFAULT_FACTORIES = {
18
+ 1: DEFAULT_FACTORY,
19
+ 10: DEFAULT_FACTORY,
20
+ 137: DEFAULT_FACTORY,
21
+ 42161: DEFAULT_FACTORY,
22
+ 8453: "0x33128a8fC17869897dcE68Ed026d694621f6FDfD",
23
+ };
24
+ const POOL_ABI = parseAbi([
25
+ "function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)",
26
+ "function liquidity() view returns (uint128)",
27
+ ]);
28
+ const WETH_ABI = parseAbi(["function deposit() payable"]);
29
+ const require = createRequire(import.meta.url);
30
+ const tokenList = require("@uniswap/default-token-list");
31
+ export function createUniswapV3Adapter(config = { routers: DEFAULT_ROUTERS }) {
32
+ const factories = config.factories ?? DEFAULT_FACTORIES;
33
+ return {
34
+ meta: {
35
+ name: "uniswap_v3",
36
+ supportedChains: Object.keys(config.routers).map((id) => Number.parseInt(id, 10)),
37
+ actions: ["swap"],
38
+ description: "Uniswap V3 swap adapter",
39
+ },
40
+ async buildAction(action, ctx) {
41
+ if (action.type !== "swap") {
42
+ throw new Error(`Uniswap adapter only supports swap actions (got ${action.type})`);
43
+ }
44
+ const router = config.routers[ctx.chainId];
45
+ if (!router) {
46
+ throw new Error(`No Uniswap router configured for chain ${ctx.chainId}`);
47
+ }
48
+ const factory = factories[ctx.chainId] ?? DEFAULT_FACTORY;
49
+ const isNativeEth = action.assetIn?.toUpperCase() === "ETH";
50
+ const tokenIn = resolveToken(action.assetIn, ctx.chainId);
51
+ const tokenOut = resolveToken(action.assetOut, ctx.chainId);
52
+ const fee = (config.defaultFee ?? 3000);
53
+ const amount = toBigInt(action.amount);
54
+ const recipient = (ctx.vault ?? ctx.walletAddress);
55
+ // Compute pool address using the SDK
56
+ const poolAddress = computePoolAddress({
57
+ factoryAddress: factory,
58
+ tokenA: tokenIn,
59
+ tokenB: tokenOut,
60
+ fee,
61
+ });
62
+ // Fetch on-chain pool state (slot0 + liquidity) for quoting
63
+ let sqrtPriceX96;
64
+ let tick;
65
+ let liquidity;
66
+ try {
67
+ const [slot0Result, liquidityResult] = await Promise.all([
68
+ ctx.provider.readContract({
69
+ address: poolAddress,
70
+ abi: POOL_ABI,
71
+ functionName: "slot0",
72
+ }),
73
+ ctx.provider.readContract({
74
+ address: poolAddress,
75
+ abi: POOL_ABI,
76
+ functionName: "liquidity",
77
+ }),
78
+ ]);
79
+ sqrtPriceX96 = slot0Result[0];
80
+ tick = Number(slot0Result[1]);
81
+ liquidity = liquidityResult;
82
+ }
83
+ catch (err) {
84
+ const msg = err instanceof Error ? err.message : String(err);
85
+ throw new Error(`Failed to fetch pool state for ${action.assetIn}/${action.assetOut} (pool ${poolAddress}): ${msg}`);
86
+ }
87
+ // Construct Pool from on-chain state
88
+ const pool = new Pool(tokenIn, tokenOut, fee, sqrtPriceX96.toString(), liquidity.toString(), tick);
89
+ // Build trade using SDK (same pattern as docs.uniswap.org/sdk/v3/guides/swaps/trading)
90
+ const isExactOut = action.mode === "exact_out";
91
+ const swapRoute = new Route([pool], tokenIn, tokenOut);
92
+ let trade;
93
+ if (isExactOut) {
94
+ const outputAmount = CurrencyAmount.fromRawAmount(tokenOut, amount.toString());
95
+ const price = pool.priceOf(tokenOut);
96
+ const estimatedInput = price.quote(outputAmount);
97
+ trade = Trade.createUncheckedTrade({
98
+ route: swapRoute,
99
+ inputAmount: CurrencyAmount.fromRawAmount(tokenIn, estimatedInput.quotient.toString()),
100
+ outputAmount,
101
+ tradeType: TradeType.EXACT_OUTPUT,
102
+ });
103
+ }
104
+ else {
105
+ const inputAmount = CurrencyAmount.fromRawAmount(tokenIn, amount.toString());
106
+ const price = pool.priceOf(tokenIn);
107
+ const estimatedOutput = price.quote(inputAmount);
108
+ trade = Trade.createUncheckedTrade({
109
+ route: swapRoute,
110
+ inputAmount,
111
+ outputAmount: CurrencyAmount.fromRawAmount(tokenOut, estimatedOutput.quotient.toString()),
112
+ tradeType: TradeType.EXACT_INPUT,
113
+ });
114
+ }
115
+ // Generate calldata using SDK's SwapRouter (targets original V3 SwapRouter)
116
+ const defaultSlippageBps = action.constraints?.maxSlippageBps ?? config.slippageBps ?? 50;
117
+ const expectedOut = BigInt(trade.outputAmount.quotient.toString());
118
+ const expectedIn = BigInt(trade.inputAmount.quotient.toString());
119
+ const explicitMinOut = action.constraints?.minOutput;
120
+ const explicitMaxIn = action.constraints?.maxInput;
121
+ let slippageBps = defaultSlippageBps;
122
+ if (!isExactOut && explicitMinOut !== undefined) {
123
+ slippageBps = computeSlippageBpsFromMinOut(expectedOut, explicitMinOut);
124
+ }
125
+ else if (isExactOut && explicitMaxIn !== undefined) {
126
+ slippageBps = computeSlippageBpsFromMaxIn(expectedIn, explicitMaxIn);
127
+ }
128
+ const slippageTolerance = new Percent(slippageBps, 10_000);
129
+ const deadline = Math.floor(Date.now() / 1000) + (config.deadlineSeconds ?? 1200);
130
+ const { calldata, value: txValue } = SwapRouter.swapCallParameters([trade], {
131
+ slippageTolerance,
132
+ recipient,
133
+ deadline,
134
+ });
135
+ // Build pre-swap transactions
136
+ const preTxs = [];
137
+ const maxInputAmount = isExactOut && explicitMaxIn === undefined
138
+ ? BigInt(trade.maximumAmountIn(slippageTolerance).quotient.toString())
139
+ : undefined;
140
+ const approvalAmount = isExactOut ? (explicitMaxIn ?? maxInputAmount ?? amount) : amount;
141
+ if (isNativeEth) {
142
+ // Step 1: Wrap ETH → WETH (call WETH.deposit() with value)
143
+ const wethAddress = tokenIn.address;
144
+ const wrapData = encodeFunctionData({
145
+ abi: WETH_ABI,
146
+ functionName: "deposit",
147
+ });
148
+ preTxs.push({
149
+ tx: { to: wethAddress, data: wrapData, value: approvalAmount },
150
+ description: `Wrap ${approvalAmount.toString()} wei ETH → WETH`,
151
+ action,
152
+ });
153
+ // Step 2: Approve WETH to router
154
+ const wethApprovalTxs = await buildApprovalIfNeeded({
155
+ ctx,
156
+ token: wethAddress,
157
+ spender: router,
158
+ amount: approvalAmount,
159
+ action,
160
+ description: "Approve WETH for Uniswap V3",
161
+ });
162
+ preTxs.push(...wethApprovalTxs);
163
+ }
164
+ else {
165
+ // ERC20: just approve
166
+ const approvalTxs = await buildApprovalIfNeeded({
167
+ ctx,
168
+ token: tokenIn.address,
169
+ spender: router,
170
+ amount: approvalAmount,
171
+ action,
172
+ description: `Approve ${action.assetIn} for Uniswap V3`,
173
+ });
174
+ preTxs.push(...approvalTxs);
175
+ }
176
+ const shortAddr = (a) => `${a.slice(0, 6)}...${a.slice(-4)}`;
177
+ const expectedOutput = trade.outputAmount.toSignificant(6);
178
+ const minOutAmount = explicitMinOut !== undefined
179
+ ? CurrencyAmount.fromRawAmount(tokenOut, explicitMinOut.toString())
180
+ : trade.minimumAmountOut(slippageTolerance);
181
+ const minOut = minOutAmount.toSignificant(6);
182
+ const descLines = [
183
+ `Uniswap V3 swap ${action.assetIn} → ${action.assetOut}`,
184
+ ` tokenIn: ${action.assetIn} (${shortAddr(tokenIn.address)})`,
185
+ ` tokenOut: ${action.assetOut} (${shortAddr(tokenOut.address)})`,
186
+ ` amount: ${amount.toString()} wei`,
187
+ ` expected: ~${expectedOutput} ${action.assetOut}`,
188
+ ` min output: ${minOut} ${action.assetOut} (${slippageBps / 100}% slippage)`,
189
+ ` fee tier: ${fee / 10_000}%`,
190
+ ` pool: ${shortAddr(poolAddress)}`,
191
+ ` router: ${shortAddr(router)}`,
192
+ ` recipient: ${shortAddr(recipient)}`,
193
+ ].join("\n");
194
+ return [
195
+ ...preTxs,
196
+ {
197
+ tx: {
198
+ to: router,
199
+ data: calldata,
200
+ value: BigInt(txValue),
201
+ },
202
+ description: descLines,
203
+ action,
204
+ },
205
+ ];
206
+ },
207
+ };
208
+ }
209
+ export const uniswapV3Adapter = createUniswapV3Adapter();
210
+ /** WETH addresses per chain (native ETH wrapping — not in the Uniswap token list) */
211
+ const WETH_BY_CHAIN = {
212
+ 1: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
213
+ 10: "0x4200000000000000000000000000000000000006",
214
+ 137: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
215
+ 8453: "0x4200000000000000000000000000000000000006",
216
+ 42161: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
217
+ };
218
+ /** Build a symbol+chain index from the Uniswap default token list */
219
+ const tokenIndex = new Map();
220
+ for (const t of tokenList.tokens) {
221
+ tokenIndex.set(`${t.symbol.toUpperCase()}:${t.chainId}`, {
222
+ address: t.address,
223
+ decimals: t.decimals,
224
+ });
225
+ }
226
+ function resolveToken(asset, chainId) {
227
+ if (asset.startsWith("0x") && asset.length === 42) {
228
+ return new Token(chainId, asset, 18);
229
+ }
230
+ const symbol = asset.toUpperCase();
231
+ // ETH / WETH → use the chain-specific wrapped address
232
+ if (symbol === "ETH" || symbol === "WETH") {
233
+ const weth = WETH_BY_CHAIN[chainId];
234
+ if (!weth) {
235
+ throw new Error(`No WETH address for chain ${chainId}`);
236
+ }
237
+ return new Token(chainId, weth, 18, "WETH", "Wrapped Ether");
238
+ }
239
+ // Look up from Uniswap default token list
240
+ const entry = tokenIndex.get(`${symbol}:${chainId}`);
241
+ if (entry) {
242
+ return new Token(chainId, entry.address, entry.decimals, symbol);
243
+ }
244
+ throw new Error(`Unknown asset: ${asset} on chain ${chainId}. Provide address directly.`);
245
+ }
246
+ function toBigInt(amount) {
247
+ if (typeof amount === "bigint")
248
+ return amount;
249
+ if (typeof amount === "number")
250
+ return BigInt(Math.floor(amount));
251
+ if (typeof amount === "string")
252
+ return BigInt(amount);
253
+ if (isLiteralAmount(amount)) {
254
+ return BigInt(amount.value);
255
+ }
256
+ throw new Error("Unsupported amount type for swap");
257
+ }
258
+ function computeSlippageBpsFromMinOut(expectedOut, minOut) {
259
+ if (expectedOut <= 0n) {
260
+ throw new Error("Cannot compute slippage from zero expected output");
261
+ }
262
+ if (minOut > expectedOut) {
263
+ throw new Error("min_output exceeds expected output");
264
+ }
265
+ const diff = expectedOut - minOut;
266
+ const bps = (diff * 10000n) / expectedOut;
267
+ return Number(bps);
268
+ }
269
+ function computeSlippageBpsFromMaxIn(expectedIn, maxIn) {
270
+ if (expectedIn <= 0n) {
271
+ throw new Error("Cannot compute slippage from zero expected input");
272
+ }
273
+ if (maxIn < expectedIn) {
274
+ throw new Error("max_input is below expected input");
275
+ }
276
+ const diff = maxIn - expectedIn;
277
+ const bps = (diff * 10000n) / expectedIn;
278
+ return Number(bps);
279
+ }
280
+ function isLiteralAmount(value) {
281
+ return (typeof value === "object" &&
282
+ value !== null &&
283
+ "kind" in value &&
284
+ value.kind === "literal" &&
285
+ "value" in value);
286
+ }
287
+ //# sourceMappingURL=uniswap-v3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswap-v3.js","sourceRoot":"","sources":["../src/uniswap-v3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Address } from "@grimoirelabs/core";
2
+ import type { VenueAdapter } from "@grimoirelabs/core";
3
+ /** Universal Router v2 addresses (V4-capable) */
4
+ export declare const DEFAULT_ROUTERS: Record<number, Address>;
5
+ export interface UniswapV4AdapterConfig {
6
+ routers?: Record<number, Address>;
7
+ quoters?: Record<number, Address>;
8
+ defaultFee?: number;
9
+ defaultTickSpacing?: number;
10
+ deadlineSeconds?: number;
11
+ slippageBps?: number;
12
+ }
13
+ export declare function createUniswapV4Adapter(config?: UniswapV4AdapterConfig): VenueAdapter;
14
+ export declare const uniswapV4Adapter: VenueAdapter;
15
+ //# sourceMappingURL=uniswap-v4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswap-v4.d.ts","sourceRoot":"","sources":["../src/uniswap-v4.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,OAAO,EAAyC,MAAM,oBAAoB,CAAC;AACjG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAYvD,iDAAiD;AACjD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAMnD,CAAC;AAuJF,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAUD,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,sBAA2B,GAAG,YAAY,CAsNxF;AAED,eAAO,MAAM,gBAAgB,cAA2B,CAAC"}