agentwallet-sdk 2.3.0 → 2.4.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/dist/bridge/__tests__/bridge.test.d.ts +2 -0
- package/dist/bridge/__tests__/bridge.test.d.ts.map +1 -0
- package/dist/bridge/__tests__/bridge.test.js +508 -0
- package/dist/bridge/__tests__/bridge.test.js.map +1 -0
- package/dist/bridge/abis.d.ts +187 -0
- package/dist/bridge/abis.d.ts.map +1 -0
- package/dist/bridge/abis.js +129 -0
- package/dist/bridge/abis.js.map +1 -0
- package/dist/bridge/client.d.ts +106 -0
- package/dist/bridge/client.d.ts.map +1 -0
- package/dist/bridge/client.js +393 -0
- package/dist/bridge/client.js.map +1 -0
- package/dist/bridge/index.d.ts +4 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +4 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/types.d.ts +107 -0
- package/dist/bridge/types.d.ts.map +1 -0
- package/dist/bridge/types.js +58 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/index.d.ts +504 -213
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/swap/SwapModule.d.ts +75 -0
- package/dist/swap/SwapModule.d.ts.map +1 -0
- package/dist/swap/SwapModule.js +267 -0
- package/dist/swap/SwapModule.js.map +1 -0
- package/dist/swap/__tests__/swap.test.d.ts +2 -0
- package/dist/swap/__tests__/swap.test.d.ts.map +1 -0
- package/dist/swap/__tests__/swap.test.js +272 -0
- package/dist/swap/__tests__/swap.test.js.map +1 -0
- package/dist/swap/abi.d.ts +169 -0
- package/dist/swap/abi.d.ts.map +1 -0
- package/dist/swap/abi.js +118 -0
- package/dist/swap/abi.js.map +1 -0
- package/dist/swap/index.d.ts +5 -0
- package/dist/swap/index.d.ts.map +1 -0
- package/dist/swap/index.js +5 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/swap/types.d.ts +79 -0
- package/dist/swap/types.d.ts.map +1 -0
- package/dist/swap/types.js +18 -0
- package/dist/swap/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwapModule.js","sourceRoot":"","sources":["../../src/swap/SwapModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.test.d.ts","sourceRoot":"","sources":["../../../src/swap/__tests__/swap.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
// [MAX-ADDED] SwapModule tests — 14 tests covering all critical paths
|
|
2
|
+
// All on-chain calls are mocked. No real swaps are executed.
|
|
3
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
4
|
+
import { SwapModule, attachSwap, calcProtocolFee, applySlippage } from '../SwapModule.js';
|
|
5
|
+
import { BASE_TOKENS, PROTOCOL_FEE_BPS, DEFAULT_SLIPPAGE_BPS } from '../types.js';
|
|
6
|
+
// ─── Mock Factories ──────────────────────────────────────────────────────────
|
|
7
|
+
// Valid checksummed Ethereum addresses for testing
|
|
8
|
+
const WALLET_ADDR = '0x0000000000000000000000000000000000000001';
|
|
9
|
+
const FEE_WALLET = '0x0000000000000000000000000000000000000002';
|
|
10
|
+
const MOCK_TX_HASH = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
|
|
11
|
+
const MOCK_FEE_TX = '0xcafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe';
|
|
12
|
+
const MOCK_APPROVAL_TX = '0xaaaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbbb';
|
|
13
|
+
/** Build a mock publicClient with configurable readContract behavior */
|
|
14
|
+
function makePublicClient(overrides = {}) {
|
|
15
|
+
return {
|
|
16
|
+
readContract: vi.fn(async ({ functionName, args }) => {
|
|
17
|
+
if (functionName === 'quoteExactInputSingle') {
|
|
18
|
+
// Return a mock quote: 95 WETH for 100K USDC at fee tier 500
|
|
19
|
+
return [95000000000000000000n, 0n, 1, 120000n];
|
|
20
|
+
}
|
|
21
|
+
if (functionName === 'allowance') {
|
|
22
|
+
return overrides.allowance ?? 0n;
|
|
23
|
+
}
|
|
24
|
+
return overrides[functionName] ?? 0n;
|
|
25
|
+
}),
|
|
26
|
+
...overrides,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Build a mock walletClient */
|
|
30
|
+
function makeWalletClient(overrides = {}) {
|
|
31
|
+
return {
|
|
32
|
+
account: { address: WALLET_ADDR },
|
|
33
|
+
chain: { id: 8453 },
|
|
34
|
+
sendTransaction: vi.fn(async () => MOCK_TX_HASH),
|
|
35
|
+
...overrides,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// ─── Unit: Pure Helper Functions ─────────────────────────────────────────────
|
|
39
|
+
describe('calcProtocolFee', () => {
|
|
40
|
+
it('calculates 0.875% fee correctly', () => {
|
|
41
|
+
// 100_000 USDC (6 decimals) = 100_000_000_000 raw
|
|
42
|
+
const amount = 100000000000n;
|
|
43
|
+
const fee = calcProtocolFee(amount, PROTOCOL_FEE_BPS);
|
|
44
|
+
// 0.875% of 100_000_000_000 = 875_000_000
|
|
45
|
+
expect(fee).toBe(875000000n);
|
|
46
|
+
});
|
|
47
|
+
it('floors partial bps (no dust rounding up)', () => {
|
|
48
|
+
const amount = 1n; // 1 wei
|
|
49
|
+
const fee = calcProtocolFee(amount, PROTOCOL_FEE_BPS);
|
|
50
|
+
// 1 * 875 / 100_000 = 0 (floor)
|
|
51
|
+
expect(fee).toBe(0n);
|
|
52
|
+
});
|
|
53
|
+
it('handles large amounts correctly', () => {
|
|
54
|
+
// 1 ETH = 1e18 wei
|
|
55
|
+
const one_eth = 1000000000000000000n;
|
|
56
|
+
const fee = calcProtocolFee(one_eth, PROTOCOL_FEE_BPS);
|
|
57
|
+
// 0.875% of 1e18 = 8_750_000_000_000_000
|
|
58
|
+
expect(fee).toBe(8750000000000000n);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('applySlippage', () => {
|
|
62
|
+
it('applies 50 bps (0.5%) slippage correctly', () => {
|
|
63
|
+
const amount = 1000000n;
|
|
64
|
+
const minimum = applySlippage(amount, DEFAULT_SLIPPAGE_BPS);
|
|
65
|
+
// 1_000_000 * (10_000 - 50) / 10_000 = 1_000_000 * 9950 / 10_000 = 995_000
|
|
66
|
+
expect(minimum).toBe(995000n);
|
|
67
|
+
});
|
|
68
|
+
it('applies 100 bps (1%) slippage correctly', () => {
|
|
69
|
+
const amount = 1000000n;
|
|
70
|
+
const minimum = applySlippage(amount, 100);
|
|
71
|
+
expect(minimum).toBe(990000n);
|
|
72
|
+
});
|
|
73
|
+
it('returns same amount for 0 bps slippage', () => {
|
|
74
|
+
const amount = 500000n;
|
|
75
|
+
expect(applySlippage(amount, 0)).toBe(500000n);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// ─── SwapModule: Quote Fetching ───────────────────────────────────────────────
|
|
79
|
+
describe('SwapModule.getQuote', () => {
|
|
80
|
+
let swapModule;
|
|
81
|
+
let mockPublicClient;
|
|
82
|
+
let mockWalletClient;
|
|
83
|
+
beforeEach(() => {
|
|
84
|
+
mockPublicClient = makePublicClient();
|
|
85
|
+
mockWalletClient = makeWalletClient();
|
|
86
|
+
swapModule = new SwapModule(mockPublicClient, mockWalletClient, WALLET_ADDR, { feeWallet: FEE_WALLET });
|
|
87
|
+
});
|
|
88
|
+
it('fetches quote and deducts protocol fee from amountIn', async () => {
|
|
89
|
+
const amountIn = 100000000n; // 100 USDC (6 decimals)
|
|
90
|
+
const quote = await swapModule.getQuote(BASE_TOKENS.USDC, BASE_TOKENS.WETH, amountIn);
|
|
91
|
+
// Protocol fee should be 0.875% of 100_000_000 = 875_000
|
|
92
|
+
expect(quote.feeAmount).toBe(875000n);
|
|
93
|
+
expect(quote.amountInNet).toBe(99125000n);
|
|
94
|
+
expect(quote.amountInRaw).toBe(amountIn);
|
|
95
|
+
});
|
|
96
|
+
it('selects the fee tier with best (highest) amountOut', async () => {
|
|
97
|
+
// Make 500-tier return better price than others
|
|
98
|
+
mockPublicClient.readContract = vi.fn(async ({ args }) => {
|
|
99
|
+
const fee = args[0].fee;
|
|
100
|
+
if (fee === 500)
|
|
101
|
+
return [200000n, 0n, 1, 100000n]; // best
|
|
102
|
+
if (fee === 3000)
|
|
103
|
+
return [180000n, 0n, 1, 110000n]; // worse
|
|
104
|
+
throw new Error('Pool not found'); // 100 and 10000 don't exist
|
|
105
|
+
});
|
|
106
|
+
const quote = await swapModule.getQuote(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 1000000n);
|
|
107
|
+
expect(quote.poolFeeTier).toBe(500);
|
|
108
|
+
expect(quote.amountOut).toBe(200000n);
|
|
109
|
+
});
|
|
110
|
+
it('throws if no pool found for any fee tier', async () => {
|
|
111
|
+
mockPublicClient.readContract = vi.fn(async () => {
|
|
112
|
+
throw new Error('execution reverted');
|
|
113
|
+
});
|
|
114
|
+
await expect(swapModule.getQuote(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 1000000n)).rejects.toThrow('No Uniswap V3 pool found');
|
|
115
|
+
});
|
|
116
|
+
it('throws if amountIn is too small to cover protocol fee', async () => {
|
|
117
|
+
// With PROTOCOL_FEE_BPS=875, amountIn must be > 875/100_000 per unit
|
|
118
|
+
// For amountIn=1n: fee=0n, net=1n — this actually works due to flooring
|
|
119
|
+
// For a crafted case: if fee somehow = amountIn... hard to trigger naturally.
|
|
120
|
+
// Instead test: amountIn=0
|
|
121
|
+
await expect(swapModule.getQuote(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 0n)).rejects.toThrow('too small');
|
|
122
|
+
});
|
|
123
|
+
it('calculates amountOutMinimum with default 50 bps slippage', async () => {
|
|
124
|
+
// Mock returns amountOut = 1_000_000n
|
|
125
|
+
mockPublicClient.readContract = vi.fn(async () => [1000000n, 0n, 1, 50000n]);
|
|
126
|
+
const quote = await swapModule.getQuote(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 1000000n);
|
|
127
|
+
// amountOutMinimum = 1_000_000 * (10_000 - 50) / 10_000 = 995_000
|
|
128
|
+
expect(quote.amountOutMinimum).toBe(995000n);
|
|
129
|
+
});
|
|
130
|
+
it('respects custom slippage override', async () => {
|
|
131
|
+
mockPublicClient.readContract = vi.fn(async () => [1000000n, 0n, 1, 50000n]);
|
|
132
|
+
const quote = await swapModule.getQuote(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 1000000n, { slippageBps: 200 });
|
|
133
|
+
// 1_000_000 * 9800 / 10_000 = 980_000
|
|
134
|
+
expect(quote.amountOutMinimum).toBe(980000n);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// ─── SwapModule: Approval Handling ───────────────────────────────────────────
|
|
138
|
+
describe('SwapModule.ensureApproval', () => {
|
|
139
|
+
it('skips approval if allowance is already sufficient', async () => {
|
|
140
|
+
const publicClient = makePublicClient({ allowance: 10000000000n }); // huge allowance
|
|
141
|
+
const walletClient = makeWalletClient();
|
|
142
|
+
const swapModule = new SwapModule(publicClient, walletClient, WALLET_ADDR);
|
|
143
|
+
const result = await swapModule.ensureApproval(BASE_TOKENS.USDC, '0x2626664c2603336E57B271c5C0b26F421741e481', 1000000n);
|
|
144
|
+
expect(result).toBeUndefined();
|
|
145
|
+
expect(walletClient.sendTransaction).not.toHaveBeenCalled();
|
|
146
|
+
});
|
|
147
|
+
it('submits approval tx when allowance is insufficient', async () => {
|
|
148
|
+
const publicClient = makePublicClient({ allowance: 0n });
|
|
149
|
+
const walletClient = makeWalletClient({
|
|
150
|
+
sendTransaction: vi.fn(async () => MOCK_APPROVAL_TX),
|
|
151
|
+
});
|
|
152
|
+
const swapModule = new SwapModule(publicClient, walletClient, WALLET_ADDR);
|
|
153
|
+
const result = await swapModule.ensureApproval(BASE_TOKENS.USDC, '0x2626664c2603336E57B271c5C0b26F421741e481', 1000000n);
|
|
154
|
+
expect(result).toBe(MOCK_APPROVAL_TX);
|
|
155
|
+
expect(walletClient.sendTransaction).toHaveBeenCalledOnce();
|
|
156
|
+
});
|
|
157
|
+
it('throws if walletClient has no account', async () => {
|
|
158
|
+
const publicClient = makePublicClient({ allowance: 0n });
|
|
159
|
+
const walletClient = makeWalletClient({ account: null });
|
|
160
|
+
const swapModule = new SwapModule(publicClient, walletClient, WALLET_ADDR);
|
|
161
|
+
await expect(swapModule.ensureApproval(BASE_TOKENS.USDC, '0x2626664c2603336E57B271c5C0b26F421741e481', 1000000n)).rejects.toThrow('no account');
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
// ─── SwapModule: Swap Execution ───────────────────────────────────────────────
|
|
165
|
+
describe('SwapModule.swap', () => {
|
|
166
|
+
let mockPublicClient;
|
|
167
|
+
let mockWalletClient;
|
|
168
|
+
let swapModule;
|
|
169
|
+
beforeEach(() => {
|
|
170
|
+
mockPublicClient = makePublicClient({ allowance: 0n });
|
|
171
|
+
let txCallCount = 0;
|
|
172
|
+
mockWalletClient = makeWalletClient({
|
|
173
|
+
sendTransaction: vi.fn(async () => {
|
|
174
|
+
// Call order: 1=approval, 2=fee transfer, 3=swap
|
|
175
|
+
txCallCount++;
|
|
176
|
+
if (txCallCount === 1)
|
|
177
|
+
return MOCK_APPROVAL_TX;
|
|
178
|
+
if (txCallCount === 2)
|
|
179
|
+
return MOCK_FEE_TX;
|
|
180
|
+
return MOCK_TX_HASH;
|
|
181
|
+
}),
|
|
182
|
+
});
|
|
183
|
+
swapModule = new SwapModule(mockPublicClient, mockWalletClient, WALLET_ADDR, { feeWallet: FEE_WALLET });
|
|
184
|
+
});
|
|
185
|
+
it('executes full swap with approval + fee transfer', async () => {
|
|
186
|
+
mockPublicClient.readContract = vi.fn(async ({ functionName, args }) => {
|
|
187
|
+
if (functionName === 'quoteExactInputSingle')
|
|
188
|
+
return [1000000n, 0n, 1, 80000n];
|
|
189
|
+
if (functionName === 'allowance')
|
|
190
|
+
return 0n;
|
|
191
|
+
return 0n;
|
|
192
|
+
});
|
|
193
|
+
const result = await swapModule.swap(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 100000000n);
|
|
194
|
+
expect(result.txHash).toBeDefined();
|
|
195
|
+
expect(result.approvalRequired).toBe(true);
|
|
196
|
+
expect(result.approvalTxHash).toBe(MOCK_APPROVAL_TX);
|
|
197
|
+
expect(result.feeTxHash).toBe(MOCK_FEE_TX);
|
|
198
|
+
expect(result.quote.feeAmount).toBe(875000n); // 0.875% of 100_000_000
|
|
199
|
+
});
|
|
200
|
+
it('skips fee transfer when feeWallet == self (accountAddress)', async () => {
|
|
201
|
+
mockPublicClient.readContract = vi.fn(async ({ functionName }) => {
|
|
202
|
+
if (functionName === 'quoteExactInputSingle')
|
|
203
|
+
return [1000000n, 0n, 1, 80000n];
|
|
204
|
+
if (functionName === 'allowance')
|
|
205
|
+
return 999999999999n; // already approved
|
|
206
|
+
return 0n;
|
|
207
|
+
});
|
|
208
|
+
// Create module with feeWallet = wallet address (default self)
|
|
209
|
+
const selfSwapModule = new SwapModule(mockPublicClient, mockWalletClient, WALLET_ADDR, { feeWallet: WALLET_ADDR });
|
|
210
|
+
const result = await selfSwapModule.swap(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 100000000n);
|
|
211
|
+
expect(result.feeTxHash).toBeUndefined();
|
|
212
|
+
expect(result.approvalRequired).toBe(false);
|
|
213
|
+
expect(result.txHash).toBeDefined();
|
|
214
|
+
});
|
|
215
|
+
it('applies slippage protection — amountOutMinimum encoded in calldata', async () => {
|
|
216
|
+
mockPublicClient.readContract = vi.fn(async ({ functionName }) => {
|
|
217
|
+
if (functionName === 'quoteExactInputSingle')
|
|
218
|
+
return [2000000n, 0n, 1, 80000n];
|
|
219
|
+
if (functionName === 'allowance')
|
|
220
|
+
return 999999999999n;
|
|
221
|
+
return 0n;
|
|
222
|
+
});
|
|
223
|
+
const selfSwapModule = new SwapModule(mockPublicClient, mockWalletClient, WALLET_ADDR, { feeWallet: WALLET_ADDR });
|
|
224
|
+
const result = await selfSwapModule.swap(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 10000000n, { slippageBps: 100 });
|
|
225
|
+
// amountOutMinimum = 2_000_000 * 9900 / 10_000 = 1_980_000
|
|
226
|
+
expect(result.quote.amountOutMinimum).toBe(1980000n);
|
|
227
|
+
expect(result.txHash).toBeDefined();
|
|
228
|
+
});
|
|
229
|
+
it('returns gas estimate from quoter in result quote', async () => {
|
|
230
|
+
mockPublicClient.readContract = vi.fn(async ({ functionName }) => {
|
|
231
|
+
if (functionName === 'quoteExactInputSingle')
|
|
232
|
+
return [500000n, 0n, 1, 150000n];
|
|
233
|
+
if (functionName === 'allowance')
|
|
234
|
+
return 999999999999n;
|
|
235
|
+
return 0n;
|
|
236
|
+
});
|
|
237
|
+
const selfSwapModule = new SwapModule(mockPublicClient, mockWalletClient, WALLET_ADDR, { feeWallet: WALLET_ADDR });
|
|
238
|
+
const result = await selfSwapModule.swap(BASE_TOKENS.cbETH, BASE_TOKENS.WETH, 1000000000000000000n);
|
|
239
|
+
expect(result.quote.gasEstimate).toBe(150000n);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
// ─── SwapModule: Config & attachSwap ─────────────────────────────────────────
|
|
243
|
+
describe('SwapModule config and attachSwap', () => {
|
|
244
|
+
it('getConfig returns correct fee settings', () => {
|
|
245
|
+
const swapModule = new SwapModule(makePublicClient(), makeWalletClient(), WALLET_ADDR, { feeWallet: FEE_WALLET, feeBps: PROTOCOL_FEE_BPS });
|
|
246
|
+
const config = swapModule.getConfig();
|
|
247
|
+
expect(config.feeBps).toBe(875);
|
|
248
|
+
expect(config.feeWallet).toBe(FEE_WALLET);
|
|
249
|
+
expect(config.routerAddress).toBe('0x2626664c2603336E57B271c5C0b26F421741e481');
|
|
250
|
+
expect(config.quoterAddress).toBe('0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a');
|
|
251
|
+
});
|
|
252
|
+
it('attachSwap enriches wallet with .swap() and .getQuote() methods', async () => {
|
|
253
|
+
const publicClient = makePublicClient();
|
|
254
|
+
publicClient.readContract = vi.fn(async ({ functionName }) => {
|
|
255
|
+
if (functionName === 'quoteExactInputSingle')
|
|
256
|
+
return [1000n, 0n, 1, 50000n];
|
|
257
|
+
return 0n;
|
|
258
|
+
});
|
|
259
|
+
const wallet = {
|
|
260
|
+
address: WALLET_ADDR,
|
|
261
|
+
publicClient: publicClient,
|
|
262
|
+
walletClient: makeWalletClient(),
|
|
263
|
+
};
|
|
264
|
+
const swapWallet = attachSwap(wallet, { feeWallet: FEE_WALLET });
|
|
265
|
+
expect(typeof swapWallet.swap).toBe('function');
|
|
266
|
+
expect(typeof swapWallet.getQuote).toBe('function');
|
|
267
|
+
expect(swapWallet.swapModule).toBeInstanceOf(SwapModule);
|
|
268
|
+
const quote = await swapWallet.getQuote(BASE_TOKENS.USDC, BASE_TOKENS.WETH, 1000000n);
|
|
269
|
+
expect(quote.feeAmount).toBe(8750n); // 0.875% of 1_000_000
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
//# sourceMappingURL=swap.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.test.js","sourceRoot":"","sources":["../../../src/swap/__tests__/swap.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/** Uniswap V3 SwapRouter02 ABI — exactInputSingle */
|
|
2
|
+
export declare const UniswapV3RouterAbi: readonly [{
|
|
3
|
+
readonly name: "exactInputSingle";
|
|
4
|
+
readonly type: "function";
|
|
5
|
+
readonly stateMutability: "payable";
|
|
6
|
+
readonly inputs: readonly [{
|
|
7
|
+
readonly name: "params";
|
|
8
|
+
readonly type: "tuple";
|
|
9
|
+
readonly components: readonly [{
|
|
10
|
+
readonly name: "tokenIn";
|
|
11
|
+
readonly type: "address";
|
|
12
|
+
}, {
|
|
13
|
+
readonly name: "tokenOut";
|
|
14
|
+
readonly type: "address";
|
|
15
|
+
}, {
|
|
16
|
+
readonly name: "fee";
|
|
17
|
+
readonly type: "uint24";
|
|
18
|
+
}, {
|
|
19
|
+
readonly name: "recipient";
|
|
20
|
+
readonly type: "address";
|
|
21
|
+
}, {
|
|
22
|
+
readonly name: "amountIn";
|
|
23
|
+
readonly type: "uint256";
|
|
24
|
+
}, {
|
|
25
|
+
readonly name: "amountOutMinimum";
|
|
26
|
+
readonly type: "uint256";
|
|
27
|
+
}, {
|
|
28
|
+
readonly name: "sqrtPriceLimitX96";
|
|
29
|
+
readonly type: "uint160";
|
|
30
|
+
}];
|
|
31
|
+
}];
|
|
32
|
+
readonly outputs: readonly [{
|
|
33
|
+
readonly name: "amountOut";
|
|
34
|
+
readonly type: "uint256";
|
|
35
|
+
}];
|
|
36
|
+
}, {
|
|
37
|
+
readonly name: "exactInput";
|
|
38
|
+
readonly type: "function";
|
|
39
|
+
readonly stateMutability: "payable";
|
|
40
|
+
readonly inputs: readonly [{
|
|
41
|
+
readonly name: "params";
|
|
42
|
+
readonly type: "tuple";
|
|
43
|
+
readonly components: readonly [{
|
|
44
|
+
readonly name: "path";
|
|
45
|
+
readonly type: "bytes";
|
|
46
|
+
}, {
|
|
47
|
+
readonly name: "recipient";
|
|
48
|
+
readonly type: "address";
|
|
49
|
+
}, {
|
|
50
|
+
readonly name: "amountIn";
|
|
51
|
+
readonly type: "uint256";
|
|
52
|
+
}, {
|
|
53
|
+
readonly name: "amountOutMinimum";
|
|
54
|
+
readonly type: "uint256";
|
|
55
|
+
}];
|
|
56
|
+
}];
|
|
57
|
+
readonly outputs: readonly [{
|
|
58
|
+
readonly name: "amountOut";
|
|
59
|
+
readonly type: "uint256";
|
|
60
|
+
}];
|
|
61
|
+
}];
|
|
62
|
+
/** Uniswap V3 QuoterV2 ABI — quoteExactInputSingle */
|
|
63
|
+
export declare const UniswapV3QuoterV2Abi: readonly [{
|
|
64
|
+
readonly name: "quoteExactInputSingle";
|
|
65
|
+
readonly type: "function";
|
|
66
|
+
readonly stateMutability: "nonpayable";
|
|
67
|
+
readonly inputs: readonly [{
|
|
68
|
+
readonly name: "params";
|
|
69
|
+
readonly type: "tuple";
|
|
70
|
+
readonly components: readonly [{
|
|
71
|
+
readonly name: "tokenIn";
|
|
72
|
+
readonly type: "address";
|
|
73
|
+
}, {
|
|
74
|
+
readonly name: "tokenOut";
|
|
75
|
+
readonly type: "address";
|
|
76
|
+
}, {
|
|
77
|
+
readonly name: "amount";
|
|
78
|
+
readonly type: "uint256";
|
|
79
|
+
}, {
|
|
80
|
+
readonly name: "fee";
|
|
81
|
+
readonly type: "uint24";
|
|
82
|
+
}, {
|
|
83
|
+
readonly name: "sqrtPriceLimitX96";
|
|
84
|
+
readonly type: "uint160";
|
|
85
|
+
}];
|
|
86
|
+
}];
|
|
87
|
+
readonly outputs: readonly [{
|
|
88
|
+
readonly name: "amountOut";
|
|
89
|
+
readonly type: "uint256";
|
|
90
|
+
}, {
|
|
91
|
+
readonly name: "sqrtPriceX96After";
|
|
92
|
+
readonly type: "uint160";
|
|
93
|
+
}, {
|
|
94
|
+
readonly name: "initializedTicksCrossed";
|
|
95
|
+
readonly type: "uint32";
|
|
96
|
+
}, {
|
|
97
|
+
readonly name: "gasEstimate";
|
|
98
|
+
readonly type: "uint256";
|
|
99
|
+
}];
|
|
100
|
+
}];
|
|
101
|
+
/** Minimal ERC-20 ABI for allowance, approve, transferFrom */
|
|
102
|
+
export declare const ERC20Abi: readonly [{
|
|
103
|
+
readonly name: "allowance";
|
|
104
|
+
readonly type: "function";
|
|
105
|
+
readonly stateMutability: "view";
|
|
106
|
+
readonly inputs: readonly [{
|
|
107
|
+
readonly name: "owner";
|
|
108
|
+
readonly type: "address";
|
|
109
|
+
}, {
|
|
110
|
+
readonly name: "spender";
|
|
111
|
+
readonly type: "address";
|
|
112
|
+
}];
|
|
113
|
+
readonly outputs: readonly [{
|
|
114
|
+
readonly name: "";
|
|
115
|
+
readonly type: "uint256";
|
|
116
|
+
}];
|
|
117
|
+
}, {
|
|
118
|
+
readonly name: "approve";
|
|
119
|
+
readonly type: "function";
|
|
120
|
+
readonly stateMutability: "nonpayable";
|
|
121
|
+
readonly inputs: readonly [{
|
|
122
|
+
readonly name: "spender";
|
|
123
|
+
readonly type: "address";
|
|
124
|
+
}, {
|
|
125
|
+
readonly name: "amount";
|
|
126
|
+
readonly type: "uint256";
|
|
127
|
+
}];
|
|
128
|
+
readonly outputs: readonly [{
|
|
129
|
+
readonly name: "";
|
|
130
|
+
readonly type: "bool";
|
|
131
|
+
}];
|
|
132
|
+
}, {
|
|
133
|
+
readonly name: "transfer";
|
|
134
|
+
readonly type: "function";
|
|
135
|
+
readonly stateMutability: "nonpayable";
|
|
136
|
+
readonly inputs: readonly [{
|
|
137
|
+
readonly name: "to";
|
|
138
|
+
readonly type: "address";
|
|
139
|
+
}, {
|
|
140
|
+
readonly name: "amount";
|
|
141
|
+
readonly type: "uint256";
|
|
142
|
+
}];
|
|
143
|
+
readonly outputs: readonly [{
|
|
144
|
+
readonly name: "";
|
|
145
|
+
readonly type: "bool";
|
|
146
|
+
}];
|
|
147
|
+
}, {
|
|
148
|
+
readonly name: "balanceOf";
|
|
149
|
+
readonly type: "function";
|
|
150
|
+
readonly stateMutability: "view";
|
|
151
|
+
readonly inputs: readonly [{
|
|
152
|
+
readonly name: "account";
|
|
153
|
+
readonly type: "address";
|
|
154
|
+
}];
|
|
155
|
+
readonly outputs: readonly [{
|
|
156
|
+
readonly name: "";
|
|
157
|
+
readonly type: "uint256";
|
|
158
|
+
}];
|
|
159
|
+
}, {
|
|
160
|
+
readonly name: "decimals";
|
|
161
|
+
readonly type: "function";
|
|
162
|
+
readonly stateMutability: "view";
|
|
163
|
+
readonly inputs: readonly [];
|
|
164
|
+
readonly outputs: readonly [{
|
|
165
|
+
readonly name: "";
|
|
166
|
+
readonly type: "uint8";
|
|
167
|
+
}];
|
|
168
|
+
}];
|
|
169
|
+
//# sourceMappingURL=abi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abi.d.ts","sourceRoot":"","sources":["../../src/swap/abi.ts"],"names":[],"mappings":"AAEA,qDAAqD;AACrD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCrB,CAAC;AAEX,sDAAsD;AACtD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBvB,CAAC;AAEX,8DAA8D;AAC9D,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CX,CAAC"}
|
package/dist/swap/abi.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// [MAX-ADDED] ABIs for Uniswap V3 SwapRouter02 and QuoterV2 on Base Mainnet
|
|
2
|
+
/** Uniswap V3 SwapRouter02 ABI — exactInputSingle */
|
|
3
|
+
export const UniswapV3RouterAbi = [
|
|
4
|
+
{
|
|
5
|
+
name: 'exactInputSingle',
|
|
6
|
+
type: 'function',
|
|
7
|
+
stateMutability: 'payable',
|
|
8
|
+
inputs: [
|
|
9
|
+
{
|
|
10
|
+
name: 'params',
|
|
11
|
+
type: 'tuple',
|
|
12
|
+
components: [
|
|
13
|
+
{ name: 'tokenIn', type: 'address' },
|
|
14
|
+
{ name: 'tokenOut', type: 'address' },
|
|
15
|
+
{ name: 'fee', type: 'uint24' },
|
|
16
|
+
{ name: 'recipient', type: 'address' },
|
|
17
|
+
{ name: 'amountIn', type: 'uint256' },
|
|
18
|
+
{ name: 'amountOutMinimum', type: 'uint256' },
|
|
19
|
+
{ name: 'sqrtPriceLimitX96', type: 'uint160' },
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
outputs: [{ name: 'amountOut', type: 'uint256' }],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'exactInput',
|
|
27
|
+
type: 'function',
|
|
28
|
+
stateMutability: 'payable',
|
|
29
|
+
inputs: [
|
|
30
|
+
{
|
|
31
|
+
name: 'params',
|
|
32
|
+
type: 'tuple',
|
|
33
|
+
components: [
|
|
34
|
+
{ name: 'path', type: 'bytes' },
|
|
35
|
+
{ name: 'recipient', type: 'address' },
|
|
36
|
+
{ name: 'amountIn', type: 'uint256' },
|
|
37
|
+
{ name: 'amountOutMinimum', type: 'uint256' },
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
outputs: [{ name: 'amountOut', type: 'uint256' }],
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
/** Uniswap V3 QuoterV2 ABI — quoteExactInputSingle */
|
|
45
|
+
export const UniswapV3QuoterV2Abi = [
|
|
46
|
+
{
|
|
47
|
+
name: 'quoteExactInputSingle',
|
|
48
|
+
type: 'function',
|
|
49
|
+
stateMutability: 'nonpayable',
|
|
50
|
+
inputs: [
|
|
51
|
+
{
|
|
52
|
+
name: 'params',
|
|
53
|
+
type: 'tuple',
|
|
54
|
+
components: [
|
|
55
|
+
{ name: 'tokenIn', type: 'address' },
|
|
56
|
+
{ name: 'tokenOut', type: 'address' },
|
|
57
|
+
{ name: 'amount', type: 'uint256' },
|
|
58
|
+
{ name: 'fee', type: 'uint24' },
|
|
59
|
+
{ name: 'sqrtPriceLimitX96', type: 'uint160' },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
outputs: [
|
|
64
|
+
{ name: 'amountOut', type: 'uint256' },
|
|
65
|
+
{ name: 'sqrtPriceX96After', type: 'uint160' },
|
|
66
|
+
{ name: 'initializedTicksCrossed', type: 'uint32' },
|
|
67
|
+
{ name: 'gasEstimate', type: 'uint256' },
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
/** Minimal ERC-20 ABI for allowance, approve, transferFrom */
|
|
72
|
+
export const ERC20Abi = [
|
|
73
|
+
{
|
|
74
|
+
name: 'allowance',
|
|
75
|
+
type: 'function',
|
|
76
|
+
stateMutability: 'view',
|
|
77
|
+
inputs: [
|
|
78
|
+
{ name: 'owner', type: 'address' },
|
|
79
|
+
{ name: 'spender', type: 'address' },
|
|
80
|
+
],
|
|
81
|
+
outputs: [{ name: '', type: 'uint256' }],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'approve',
|
|
85
|
+
type: 'function',
|
|
86
|
+
stateMutability: 'nonpayable',
|
|
87
|
+
inputs: [
|
|
88
|
+
{ name: 'spender', type: 'address' },
|
|
89
|
+
{ name: 'amount', type: 'uint256' },
|
|
90
|
+
],
|
|
91
|
+
outputs: [{ name: '', type: 'bool' }],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'transfer',
|
|
95
|
+
type: 'function',
|
|
96
|
+
stateMutability: 'nonpayable',
|
|
97
|
+
inputs: [
|
|
98
|
+
{ name: 'to', type: 'address' },
|
|
99
|
+
{ name: 'amount', type: 'uint256' },
|
|
100
|
+
],
|
|
101
|
+
outputs: [{ name: '', type: 'bool' }],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'balanceOf',
|
|
105
|
+
type: 'function',
|
|
106
|
+
stateMutability: 'view',
|
|
107
|
+
inputs: [{ name: 'account', type: 'address' }],
|
|
108
|
+
outputs: [{ name: '', type: 'uint256' }],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'decimals',
|
|
112
|
+
type: 'function',
|
|
113
|
+
stateMutability: 'view',
|
|
114
|
+
inputs: [],
|
|
115
|
+
outputs: [{ name: '', type: 'uint8' }],
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
//# sourceMappingURL=abi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abi.js","sourceRoot":"","sources":["../../src/swap/abi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { SwapModule, attachSwap, calcProtocolFee, applySlippage, calcDeadline } from './SwapModule.js';
|
|
2
|
+
export { UniswapV3RouterAbi, UniswapV3QuoterV2Abi, ERC20Abi } from './abi.js';
|
|
3
|
+
export { BASE_TOKENS, UNISWAP_V3_BASE, PROTOCOL_FEE_BPS, DEFAULT_SLIPPAGE_BPS, } from './types.js';
|
|
4
|
+
export type { UniswapFeeTier, SwapQuote, SwapOptions, SwapResult, SwapModuleConfig, } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// [MAX-ADDED] SwapModule public API — Uniswap V3 aggregator with 0.875% protocol fee
|
|
2
|
+
export { SwapModule, attachSwap, calcProtocolFee, applySlippage, calcDeadline } from './SwapModule.js';
|
|
3
|
+
export { UniswapV3RouterAbi, UniswapV3QuoterV2Abi, ERC20Abi } from './abi.js';
|
|
4
|
+
export { BASE_TOKENS, UNISWAP_V3_BASE, PROTOCOL_FEE_BPS, DEFAULT_SLIPPAGE_BPS, } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swap/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|