accounts 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/core/Adapter.d.ts +2 -2
  3. package/dist/core/Adapter.d.ts.map +1 -1
  4. package/dist/core/Client.d.ts +2 -2
  5. package/dist/core/Client.d.ts.map +1 -1
  6. package/dist/core/Client.js +13 -4
  7. package/dist/core/Client.js.map +1 -1
  8. package/dist/core/Provider.d.ts.map +1 -1
  9. package/dist/core/Provider.js +9 -2
  10. package/dist/core/Provider.js.map +1 -1
  11. package/dist/core/Schema.d.ts +22 -12
  12. package/dist/core/Schema.d.ts.map +1 -1
  13. package/dist/core/adapters/dialog.d.ts.map +1 -1
  14. package/dist/core/adapters/dialog.js +24 -4
  15. package/dist/core/adapters/dialog.js.map +1 -1
  16. package/dist/core/adapters/local.d.ts.map +1 -1
  17. package/dist/core/adapters/local.js +21 -3
  18. package/dist/core/adapters/local.js.map +1 -1
  19. package/dist/core/zod/rpc.d.ts +14 -9
  20. package/dist/core/zod/rpc.d.ts.map +1 -1
  21. package/dist/core/zod/rpc.js +8 -2
  22. package/dist/core/zod/rpc.js.map +1 -1
  23. package/dist/server/CliAuth.d.ts +11 -11
  24. package/dist/server/CliAuth.js +1 -1
  25. package/dist/server/CliAuth.js.map +1 -1
  26. package/dist/server/Handler.d.ts +4 -252
  27. package/dist/server/Handler.d.ts.map +1 -1
  28. package/dist/server/Handler.js +4 -573
  29. package/dist/server/Handler.js.map +1 -1
  30. package/dist/server/internal/handlers/codeAuth.d.ts +41 -0
  31. package/dist/server/internal/handlers/codeAuth.d.ts.map +1 -0
  32. package/dist/server/internal/handlers/codeAuth.js +104 -0
  33. package/dist/server/internal/handlers/codeAuth.js.map +1 -0
  34. package/dist/server/internal/handlers/feePayer.d.ts +73 -0
  35. package/dist/server/internal/handlers/feePayer.d.ts.map +1 -0
  36. package/dist/server/internal/handlers/feePayer.js +184 -0
  37. package/dist/server/internal/handlers/feePayer.js.map +1 -0
  38. package/dist/server/internal/handlers/relay.d.ts +148 -0
  39. package/dist/server/internal/handlers/relay.d.ts.map +1 -0
  40. package/dist/server/internal/handlers/relay.js +600 -0
  41. package/dist/server/internal/handlers/relay.js.map +1 -0
  42. package/dist/server/internal/handlers/utils.d.ts +12 -0
  43. package/dist/server/internal/handlers/utils.d.ts.map +1 -0
  44. package/dist/server/internal/handlers/utils.js +80 -0
  45. package/dist/server/internal/handlers/utils.js.map +1 -0
  46. package/dist/server/internal/handlers/webAuthn.d.ts +57 -0
  47. package/dist/server/internal/handlers/webAuthn.d.ts.map +1 -0
  48. package/dist/server/internal/handlers/webAuthn.js +143 -0
  49. package/dist/server/internal/handlers/webAuthn.js.map +1 -0
  50. package/package.json +2 -2
  51. package/src/core/Adapter.ts +2 -2
  52. package/src/core/Client.ts +13 -6
  53. package/src/core/Provider.connect.browser.test.ts +23 -2
  54. package/src/core/Provider.test.ts +292 -0
  55. package/src/core/Provider.ts +11 -3
  56. package/src/core/adapters/dialog.ts +21 -4
  57. package/src/core/adapters/local.ts +15 -3
  58. package/src/core/zod/rpc.ts +12 -2
  59. package/src/server/CliAuth.ts +1 -1
  60. package/src/server/Handler.test.ts +3 -418
  61. package/src/server/Handler.ts +5 -766
  62. package/src/server/internal/handlers/codeAuth.ts +148 -0
  63. package/src/server/internal/handlers/feePayer.test.ts +335 -0
  64. package/src/server/internal/handlers/feePayer.ts +271 -0
  65. package/src/server/internal/handlers/relay.test.ts +767 -0
  66. package/src/server/internal/handlers/relay.ts +817 -0
  67. package/src/server/internal/handlers/utils.ts +96 -0
  68. package/src/server/internal/handlers/webAuthn.test.ts +170 -0
  69. package/src/server/internal/handlers/webAuthn.ts +213 -0
@@ -0,0 +1,600 @@
1
+ import { AbiEvent, Hex, RpcRequest } from 'ox';
2
+ import { Transaction as core_Transaction } from 'ox/tempo';
3
+ import { createClient, decodeErrorResult, formatUnits, http, parseAbi, parseEventLogs, } from 'viem';
4
+ import { simulateCalls } from 'viem/actions';
5
+ import { tempo, tempoLocalnet, tempoMainnet, tempoModerato } from 'viem/chains';
6
+ import { Abis, Actions, Addresses, Transaction } from 'viem/tempo';
7
+ import { from } from '../../Handler.js';
8
+ import * as FeePayer from './feePayer.js';
9
+ import * as Utils from './utils.js';
10
+ /**
11
+ * Instantiates a relay handler that proxies `eth_fillTransaction`
12
+ * with wallet-aware enrichment (fee token resolution, simulation,
13
+ * sponsorship, AMM resolution).
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { Handler } from 'accounts/server'
18
+ *
19
+ * const handler = Handler.relay()
20
+ *
21
+ * // Plug handler into your server framework of choice:
22
+ * createServer(handler.listener) // Node.js
23
+ * Bun.serve(handler) // Bun
24
+ * Deno.serve(handler) // Deno
25
+ * app.use(handler.listener) // Express
26
+ * app.all('*', c => handler.fetch(c.req.raw)) // Hono
27
+ * export const GET = handler.fetch // Next.js
28
+ * export const POST = handler.fetch // Next.js
29
+ * ```
30
+ *
31
+ * @example
32
+ * With sponsorship
33
+ *
34
+ * ```ts
35
+ * import { privateKeyToAccount } from 'viem/accounts'
36
+ * import { Handler } from 'accounts/server'
37
+ *
38
+ * // With sponsorship — signs as fee payer when `validate` approves.
39
+ * const handler = Handler.relay({
40
+ * feePayer: {
41
+ * account: privateKeyToAccount('0x...'),
42
+ * // Optional: validate sponsorship approval.
43
+ * // validate: (request) => request.from !== BLOCKED_ADDRESS,
44
+ * },
45
+ * })
46
+ * ```
47
+ *
48
+ * @param options - Options.
49
+ * @returns Request handler.
50
+ */
51
+ export function relay(options = {}) {
52
+ const { chains = [tempo, tempoModerato], feePayer: feePayerOptions, feeSwap: feeSwapOptions, onRequest, path = '/', resolveTokens = (chainId) => relay.defaultTokens[chainId] ?? [], transports = {}, ...rest } = options;
53
+ const slippage = feeSwapOptions?.slippage ?? 0.05;
54
+ const clients = new Map();
55
+ for (const chain of chains) {
56
+ const transport = transports[chain.id] ?? http();
57
+ clients.set(chain.id, createClient({ chain, batch: { multicall: { deployless: true } }, transport }));
58
+ }
59
+ function getClient(chainId) {
60
+ if (chainId) {
61
+ const client = clients.get(chainId);
62
+ if (!client)
63
+ throw new Error(`Chain ${chainId} not configured`);
64
+ return client;
65
+ }
66
+ return clients.get(chains[0].id);
67
+ }
68
+ const router = from(rest);
69
+ router.post(path, async (c) => {
70
+ const request = RpcRequest.from((await c.req.raw.json()));
71
+ try {
72
+ await onRequest?.(request);
73
+ const method = request.method;
74
+ // Resolve chainId + client from the first param object (if present).
75
+ const params = Array.isArray(request.params) ? request.params : [];
76
+ const firstParam = typeof params[0] === 'object' && params[0]
77
+ ? params[0]
78
+ : undefined;
79
+ const chainId = Utils.resolveChainId(firstParam?.chainId) ?? chains[0].id;
80
+ const client = getClient(chainId);
81
+ // Proxy non-fill methods directly to the RPC node.
82
+ if (method !== 'eth_fillTransaction') {
83
+ const result = await client.request({
84
+ method: method,
85
+ params: params,
86
+ });
87
+ return Utils.rpcResult(request, result);
88
+ }
89
+ const [parameters] = Utils.parseParams.parse(request.params);
90
+ const sender = typeof parameters.from === 'string' ? parameters.from : undefined;
91
+ // 1. Resolve fee token.
92
+ const feeToken = await resolveFeeToken(client, {
93
+ feeToken: parameters.feeToken,
94
+ account: sender,
95
+ tokens: resolveTokens(chainId),
96
+ });
97
+ // 2. Fill transaction via RPC node (with AMM resolution on InsufficientBalance).
98
+ const normalized = Utils.normalizeFillTransactionRequest(parameters);
99
+ const withOverrides = {
100
+ ...normalized,
101
+ ...(typeof chainId !== 'undefined' ? { chainId } : {}),
102
+ ...(feePayerOptions ? { feePayer: true } : {}),
103
+ ...(feeToken ? { feeToken } : {}),
104
+ };
105
+ let filled = await fill(client, withOverrides, { feeToken, slippage });
106
+ // 3. Check if the fee payer approves this transaction.
107
+ const sponsored = feePayerOptions &&
108
+ (!feePayerOptions.validate ||
109
+ // @ts-expect-error - TODO: Convert to `TransactionRequest` properly.
110
+ (await feePayerOptions.validate({
111
+ ...filled.transaction,
112
+ from: sender,
113
+ })));
114
+ // Re-fill without feePayer when sponsorship is rejected so the
115
+ // gas estimate and nonce are correct for a self-paid transaction.
116
+ if (feePayerOptions && !sponsored) {
117
+ const { feePayer: _, ...withoutFeePayer } = withOverrides;
118
+ filled = await fill(client, withoutFeePayer, { feeToken, slippage });
119
+ }
120
+ const { transaction, swap: feeSwap } = filled;
121
+ // 4. Simulate and compute balance diffs + fee.
122
+ const calls = extractCalls(transaction);
123
+ const { balanceDiffs, fee } = await simulateAndParseDiffs(client, {
124
+ account: sender,
125
+ calls,
126
+ swap: feeSwap,
127
+ feeToken: transaction.feeToken,
128
+ gas: transaction.gas,
129
+ maxFeePerGas: transaction.maxFeePerGas,
130
+ });
131
+ // 5. Sign as fee payer (when approved).
132
+ const tx = sponsored
133
+ ? await FeePayer.sign({
134
+ account: feePayerOptions.account,
135
+ transaction,
136
+ sender,
137
+ })
138
+ : transaction;
139
+ const sponsor = sponsored
140
+ ? {
141
+ address: feePayerOptions.account.address,
142
+ ...(feePayerOptions.name ? { name: feePayerOptions.name } : {}),
143
+ ...(feePayerOptions.url ? { url: feePayerOptions.url } : {}),
144
+ }
145
+ : undefined;
146
+ // 6. Resolve feeSwap metadata (when AMM path was taken).
147
+ const feeSwapMeta = await (async () => {
148
+ if (!feeSwap)
149
+ return undefined;
150
+ const [inMeta, outMeta] = await Promise.all([
151
+ resolveTokenMetadata(client, feeSwap.tokenIn).catch(() => undefined),
152
+ resolveTokenMetadata(client, feeSwap.tokenOut).catch(() => undefined),
153
+ ]);
154
+ if (!inMeta || !outMeta)
155
+ return undefined;
156
+ return {
157
+ slippage,
158
+ maxIn: {
159
+ token: feeSwap.tokenIn,
160
+ value: Hex.fromNumber(feeSwap.maxAmountIn),
161
+ formatted: formatUnits(feeSwap.maxAmountIn, inMeta.decimals),
162
+ decimals: inMeta.decimals,
163
+ symbol: inMeta.symbol,
164
+ name: inMeta.name,
165
+ },
166
+ minOut: {
167
+ token: feeSwap.tokenOut,
168
+ value: Hex.fromNumber(feeSwap.amountOut),
169
+ formatted: formatUnits(feeSwap.amountOut, outMeta.decimals),
170
+ decimals: outMeta.decimals,
171
+ symbol: outMeta.symbol,
172
+ name: outMeta.name,
173
+ },
174
+ };
175
+ })();
176
+ return Utils.rpcResult(request, {
177
+ tx: core_Transaction.toRpc(tx),
178
+ meta: {
179
+ balanceDiffs,
180
+ fee,
181
+ sponsored: !!sponsor,
182
+ ...(sponsor ? { sponsor } : {}),
183
+ ...(feeSwapMeta ? { feeSwap: feeSwapMeta } : {}),
184
+ },
185
+ });
186
+ }
187
+ catch (error) {
188
+ return Utils.rpcError(request, error);
189
+ }
190
+ });
191
+ return router;
192
+ }
193
+ async function fill(client, request, options = {}) {
194
+ const { feeToken, slippage = 0.05 } = options;
195
+ // Skip re-formatting if already in RPC format (e.g. from viem's fillTransaction).
196
+ const format = (value) => value.type === '0x76' ? value : Utils.formatFillTransactionRequest(client, value);
197
+ try {
198
+ const result = await client.request({
199
+ method: 'eth_fillTransaction',
200
+ params: [format(request)],
201
+ });
202
+ return { transaction: Utils.normalizeTempoTransaction(result.tx) };
203
+ }
204
+ catch (error) {
205
+ if (!(error instanceof Error))
206
+ throw error;
207
+ const parsed = parseInsufficientBalance(error);
208
+ if (!parsed || !feeToken)
209
+ throw error;
210
+ if (parsed.token.toLowerCase() === feeToken.toLowerCase())
211
+ throw error;
212
+ const deficit = parsed.required - parsed.available;
213
+ const maxAmountIn = deficit + (deficit * BigInt(Math.round(slippage * 1000))) / 1000n;
214
+ const swapCalls = buildSwapCalls(feeToken, parsed.token, deficit, maxAmountIn);
215
+ const existingCalls = request.calls;
216
+ // If the request was normalized to top-level to/data/value (single call),
217
+ // convert back to a calls array so we can prepend swap calls.
218
+ const originalCalls = existingCalls
219
+ ? [...existingCalls]
220
+ : request.to
221
+ ? [
222
+ {
223
+ to: request.to,
224
+ data: request.data,
225
+ value: request.value ?? 0n,
226
+ },
227
+ ]
228
+ : [];
229
+ const { to: _, data: __, value: ___, calls: ____, ...rest } = request;
230
+ const result = await client.request({
231
+ method: 'eth_fillTransaction',
232
+ params: [
233
+ format({
234
+ ...rest,
235
+ calls: [...swapCalls, ...originalCalls],
236
+ }),
237
+ ],
238
+ });
239
+ return {
240
+ transaction: Utils.normalizeTempoTransaction(result.tx),
241
+ swap: {
242
+ tokenIn: feeToken,
243
+ tokenOut: parsed.token,
244
+ amountOut: deficit,
245
+ maxAmountIn,
246
+ },
247
+ };
248
+ }
249
+ }
250
+ (function (relay) {
251
+ /** Default token lists per chain ID for fee token resolution. */
252
+ // TODO: extract from tokenlist workspace.
253
+ relay.defaultTokens = {
254
+ [tempoMainnet.id]: [
255
+ '0x20c0000000000000000000000000000000000000', // pathUSD
256
+ '0x20c000000000000000000000b9537d11c60e8b50', // USDC.e
257
+ '0x20c0000000000000000000001621e21f71cf12fb', // EURC.e
258
+ '0x20c00000000000000000000014f22ca97301eb73', // USDT0
259
+ '0x20c0000000000000000000003554d28269e0f3c2', // frxUSD
260
+ '0x20c0000000000000000000000520792dcccccccc', // cUSD
261
+ '0x20c0000000000000000000008ee4fcff88888888', // stcUSD
262
+ '0x20c0000000000000000000005c0bac7cef389a11', // GUSD
263
+ '0x20c0000000000000000000007f7ba549dd0251b9', // rUSD
264
+ '0x20c000000000000000000000aeed2ec36a54d0e5', // wsrUSD
265
+ '0x20c0000000000000000000009a4a4b17e0dc6651', // EURAU
266
+ '0x20c000000000000000000000383a23bacb546ab9', // reUSD
267
+ ],
268
+ [tempoModerato.id]: [
269
+ '0x20c0000000000000000000000000000000000000', // pathUSD
270
+ '0x20c0000000000000000000000000000000000001', // alphaUSD
271
+ '0x20c0000000000000000000000000000000000002', // betaUSD
272
+ '0x20c0000000000000000000000000000000000003', // thetaUSD
273
+ '0x20c0000000000000000000009e8d7eb59b783726', // USDC.e
274
+ '0x20c000000000000000000000d72572838bbee59c', // EURC.e
275
+ ],
276
+ [tempoLocalnet.id]: [
277
+ '0x20c0000000000000000000000000000000000000', // pathUSD
278
+ '0x20c0000000000000000000000000000000000001', // alphaUSD
279
+ '0x20c0000000000000000000000000000000000002', // betaUSD
280
+ '0x20c0000000000000000000000000000000000003', // thetaUSD
281
+ ],
282
+ };
283
+ })(relay || (relay = {}));
284
+ async function resolveFeeToken(client, options) {
285
+ const { feeToken, account, tokens } = options;
286
+ if (feeToken)
287
+ return feeToken;
288
+ if (!account)
289
+ return undefined;
290
+ const [userToken, balances] = await Promise.all([
291
+ Actions.fee.getUserToken(client, { account }).catch(() => null),
292
+ tokens
293
+ ? Promise.all(tokens.map(async (token) => ({
294
+ address: token,
295
+ balance: await Actions.token.getBalance(client, { account, token }).catch(() => 0n),
296
+ })))
297
+ : [],
298
+ ]);
299
+ // If on-chain preference is set and user has balance, use it.
300
+ if (userToken) {
301
+ const match = balances.find((b) => b.address.toLowerCase() === userToken.address.toLowerCase() && b.balance > 0n);
302
+ if (match)
303
+ return userToken.address;
304
+ // Token list may not include the preference — check on-chain directly.
305
+ if (!match) {
306
+ try {
307
+ const balance = await Actions.token.getBalance(client, {
308
+ account,
309
+ token: userToken.address,
310
+ });
311
+ if (balance > 0n)
312
+ return userToken.address;
313
+ }
314
+ catch { }
315
+ }
316
+ }
317
+ // Pick the token with the highest balance.
318
+ let best;
319
+ for (const asset of balances) {
320
+ if (asset.balance <= 0n)
321
+ continue;
322
+ if (!best || asset.balance > best.balance)
323
+ best = asset;
324
+ }
325
+ if (best)
326
+ return best.address;
327
+ return Addresses.pathUsd;
328
+ }
329
+ function extractCalls(transaction) {
330
+ const calls = transaction.calls;
331
+ if (calls && calls.length > 0)
332
+ return calls.map((c) => ({
333
+ ...(c.to ? { to: c.to } : {}),
334
+ ...(c.data ? { data: c.data } : {}),
335
+ ...(c.value ? { value: c.value } : {}),
336
+ }));
337
+ return [
338
+ {
339
+ ...(transaction.to ? { to: transaction.to } : {}),
340
+ ...(transaction.data ? { data: transaction.data } : {}),
341
+ ...(transaction.value ? { value: transaction.value } : {}),
342
+ },
343
+ ];
344
+ }
345
+ async function simulate(client, options) {
346
+ const { account, calls } = options;
347
+ try {
348
+ return await Actions.simulate.simulateCalls(client, {
349
+ ...(account ? { account } : {}),
350
+ calls: calls,
351
+ traceTransfers: true,
352
+ });
353
+ }
354
+ catch (error) {
355
+ // TODO: Remove fallback once all nodes support tempo_simulateV1.
356
+ // Fall back to viem's simulateCalls (eth_simulateV1) if the Tempo
357
+ // method (tempo_simulateV1) is not supported.
358
+ const code = error.code ??
359
+ error.cause?.code;
360
+ if (code !== -32601)
361
+ throw error;
362
+ const { results } = await simulateCalls(client, {
363
+ ...(account ? { account } : {}),
364
+ calls: calls,
365
+ });
366
+ return { results, tokenMetadata: undefined };
367
+ }
368
+ }
369
+ async function simulateAndParseDiffs(client, options) {
370
+ const { account, calls, swap, feeToken, gas, maxFeePerGas } = options;
371
+ try {
372
+ const { results, tokenMetadata } = await simulate(client, { account, calls });
373
+ // Collect all logs across all call results.
374
+ const logs = [];
375
+ for (const result of results)
376
+ if (result.logs)
377
+ logs.push(...result.logs);
378
+ // Build per-token balance diffs relative to the sender.
379
+ const balanceDiffs = account
380
+ ? await buildBalanceDiffs(client, {
381
+ account,
382
+ logs,
383
+ swap,
384
+ tokenMetadata: tokenMetadata,
385
+ })
386
+ : {};
387
+ // Compute fee breakdown.
388
+ const fee = await computeFee(client, {
389
+ feeToken,
390
+ gas,
391
+ maxFeePerGas,
392
+ tokenMetadata: tokenMetadata,
393
+ });
394
+ return { balanceDiffs, fee };
395
+ }
396
+ catch {
397
+ // Simulation failures should not block the fill response —
398
+ // return empty diffs with fee computed from transaction fields.
399
+ const fee = await computeFee(client, { feeToken, gas, maxFeePerGas });
400
+ return { balanceDiffs: undefined, fee };
401
+ }
402
+ }
403
+ async function buildBalanceDiffs(client, options) {
404
+ const { account, logs, swap, tokenMetadata } = options;
405
+ const accountLower = account.toLowerCase();
406
+ const dexLower = Addresses.stablecoinDex.toLowerCase();
407
+ const swapTokenIn = swap?.tokenIn.toLowerCase();
408
+ const swapTokenOut = swap?.tokenOut.toLowerCase();
409
+ const transferLogs = parseEventLogs({
410
+ abi: [AbiEvent.fromAbi(Abis.tip20, 'Transfer')],
411
+ eventName: 'Transfer',
412
+ logs,
413
+ });
414
+ const approvalLogs = parseEventLogs({
415
+ abi: [AbiEvent.fromAbi(Abis.tip20, 'Approval')],
416
+ eventName: 'Approval',
417
+ logs,
418
+ });
419
+ // Track net movement per token: incoming vs outgoing.
420
+ const tokenMap = new Map();
421
+ // Track total transferred per (token, spender) so we can suppress covered approvals.
422
+ const transferredBySpender = new Map();
423
+ for (const log of transferLogs) {
424
+ const token = log.address.toLowerCase();
425
+ const fromLower = log.args.from.toLowerCase();
426
+ const toLower = log.args.to.toLowerCase();
427
+ // Skip swap-related transfers (reported in meta.feeSwap instead).
428
+ if (swap) {
429
+ if (token === swapTokenIn && fromLower === accountLower && toLower === dexLower)
430
+ continue;
431
+ if (token === swapTokenOut && fromLower === dexLower && toLower === accountLower)
432
+ continue;
433
+ }
434
+ const entry = tokenMap.get(token) ?? {
435
+ incoming: 0n,
436
+ outgoing: 0n,
437
+ recipients: new Set(),
438
+ token: log.address,
439
+ };
440
+ if (fromLower === accountLower) {
441
+ entry.outgoing += log.args.amount;
442
+ entry.recipients.add(log.args.to);
443
+ const key = `${token}:${toLower}`;
444
+ transferredBySpender.set(key, (transferredBySpender.get(key) ?? 0n) + log.args.amount);
445
+ }
446
+ if (toLower === accountLower)
447
+ entry.incoming += log.args.amount;
448
+ tokenMap.set(token, entry);
449
+ }
450
+ // Treat approvals as outgoing unless the spender already transferred >= approval amount.
451
+ for (const log of approvalLogs) {
452
+ if (log.args.owner.toLowerCase() !== accountLower)
453
+ continue;
454
+ const token = log.address.toLowerCase();
455
+ // Skip swap-related approvals (reported in meta.feeSwap instead).
456
+ if (swap && token === swapTokenIn && log.args.spender.toLowerCase() === dexLower)
457
+ continue;
458
+ const spenderKey = `${token}:${log.args.spender.toLowerCase()}`;
459
+ const transferred = transferredBySpender.get(spenderKey) ?? 0n;
460
+ if (log.args.amount <= transferred)
461
+ continue;
462
+ const entry = tokenMap.get(token) ?? {
463
+ incoming: 0n,
464
+ outgoing: 0n,
465
+ recipients: new Set(),
466
+ token: log.address,
467
+ };
468
+ entry.outgoing += log.args.amount - transferred;
469
+ entry.recipients.add(log.args.spender);
470
+ tokenMap.set(token, entry);
471
+ }
472
+ // Collect unique tokens that need decimals.
473
+ const entries = [...tokenMap.values()].filter((e) => {
474
+ const net = e.outgoing > e.incoming ? e.outgoing - e.incoming : e.incoming - e.outgoing;
475
+ return net > 0n;
476
+ });
477
+ if (entries.length === 0)
478
+ return {};
479
+ // Resolve metadata for all tokens in parallel (simulation metadata first, RPC fallback).
480
+ const metadataMap = new Map();
481
+ await Promise.all(entries.map(async (entry) => {
482
+ try {
483
+ const metadata = await resolveTokenMetadata(client, entry.token, tokenMetadata);
484
+ metadataMap.set(entry.token.toLowerCase(), metadata);
485
+ }
486
+ catch { }
487
+ }));
488
+ // Build the diff array for this account.
489
+ const diffs = [];
490
+ for (const entry of entries) {
491
+ const net = entry.outgoing > entry.incoming
492
+ ? entry.outgoing - entry.incoming
493
+ : entry.incoming - entry.outgoing;
494
+ const direction = entry.outgoing > entry.incoming ? 'outgoing' : 'incoming';
495
+ const meta = metadataMap.get(entry.token.toLowerCase());
496
+ const decimals = meta?.decimals ?? 0;
497
+ diffs.push({
498
+ address: entry.token,
499
+ decimals,
500
+ direction,
501
+ formatted: formatUnits(net, decimals),
502
+ name: meta?.name ?? '',
503
+ symbol: meta?.symbol ?? '',
504
+ recipients: [...entry.recipients],
505
+ value: Hex.fromNumber(net),
506
+ });
507
+ }
508
+ return { [account]: diffs };
509
+ }
510
+ async function resolveTokenMetadata(client, token, tokenMetadata) {
511
+ const meta = tokenMetadata?.[token] ?? tokenMetadata?.[token.toLowerCase()];
512
+ const fallback = await Actions.token.getMetadata(client, { token });
513
+ return {
514
+ decimals: fallback.decimals ?? 6,
515
+ symbol: meta?.symbol || fallback.symbol,
516
+ name: meta?.name || fallback.name,
517
+ };
518
+ }
519
+ async function computeFee(client, options) {
520
+ const { feeToken, gas, maxFeePerGas, tokenMetadata } = options;
521
+ if (!feeToken || !gas || !maxFeePerGas)
522
+ return null;
523
+ try {
524
+ const metadata = await resolveTokenMetadata(client, feeToken, tokenMetadata);
525
+ const raw = gas * maxFeePerGas;
526
+ const amount = raw / 10n ** BigInt(18 - metadata.decimals);
527
+ return {
528
+ amount: Hex.fromNumber(amount),
529
+ decimals: metadata.decimals,
530
+ formatted: formatUnits(amount, metadata.decimals),
531
+ symbol: metadata.symbol,
532
+ };
533
+ }
534
+ catch {
535
+ return null;
536
+ }
537
+ }
538
+ const insufficientBalanceAbi = parseAbi([
539
+ 'error InsufficientBalance(uint256 available, uint256 required, address token)',
540
+ ]);
541
+ const insufficientBalancePattern = /InsufficientBalance\(\s*InsufficientBalance\s*\{\s*available:\s*(\d+),\s*required:\s*(\d+),\s*token:\s*(0x[0-9a-fA-F]+)\s*\}\s*\)/;
542
+ function parseInsufficientBalance(error) {
543
+ const message = error.shortMessage ?? error.message;
544
+ const match = insufficientBalancePattern.exec(message);
545
+ if (match)
546
+ return {
547
+ available: BigInt(match[1]),
548
+ required: BigInt(match[2]),
549
+ token: match[3],
550
+ };
551
+ const data = extractRevertData(error);
552
+ if (!data)
553
+ return null;
554
+ try {
555
+ const decoded = decodeErrorResult({ abi: insufficientBalanceAbi, data });
556
+ return {
557
+ available: decoded.args[0],
558
+ required: decoded.args[1],
559
+ token: decoded.args[2],
560
+ };
561
+ }
562
+ catch {
563
+ return null;
564
+ }
565
+ }
566
+ function extractRevertData(error) {
567
+ if (!error || typeof error !== 'object')
568
+ return null;
569
+ const e = error;
570
+ if (typeof e.data === 'string' && e.data.startsWith('0x'))
571
+ return e.data;
572
+ if (e.cause)
573
+ return extractRevertData(e.cause);
574
+ if (e.error)
575
+ return extractRevertData(e.error);
576
+ if (typeof e.walk === 'function') {
577
+ const inner = e.walk((e) => typeof e.data === 'string');
578
+ if (inner)
579
+ return extractRevertData(inner);
580
+ }
581
+ return null;
582
+ }
583
+ function buildSwapCalls(sourceToken, targetToken, deficit, maxAmountIn) {
584
+ const approve = Actions.token.approve.call({
585
+ token: sourceToken,
586
+ spender: Addresses.stablecoinDex,
587
+ amount: maxAmountIn,
588
+ });
589
+ const buy = Actions.dex.buy.call({
590
+ tokenIn: sourceToken,
591
+ tokenOut: targetToken,
592
+ amountOut: deficit,
593
+ maxAmountIn,
594
+ });
595
+ return [
596
+ { to: approve.to, data: approve.data, value: 0n },
597
+ { to: buy.to, data: buy.data, value: 0n },
598
+ ];
599
+ }
600
+ //# sourceMappingURL=relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../../../src/server/internal/handlers/relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { RpcRequest } from 'ox';
2
+ import { Transaction as core_Transaction } from 'ox/tempo';
3
+ import type { Client } from 'viem';
4
+ import * as z from 'zod/mini';
5
+ export declare function resolveChainId(value: unknown): number | undefined;
6
+ export declare function formatFillTransactionRequest(client: Client, value: Record<string, unknown>): Record<string, unknown>;
7
+ export declare function normalizeFillTransactionRequest(value: Record<string, unknown>): Record<string, unknown>;
8
+ export declare function normalizeTempoTransaction(value: Record<string, unknown> | undefined): core_Transaction.Transaction<false, bigint, number>;
9
+ export declare function rpcError(request: RpcRequest.RpcRequest, error: unknown): Response;
10
+ export declare function rpcResult(request: RpcRequest.RpcRequest, result: unknown): Response;
11
+ export declare const parseParams: z.ZodMiniReadonly<z.ZodMiniTuple<readonly [z.ZodMiniRecord<z.ZodMiniString<string>, z.ZodMiniUnknown>], null>>;
12
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/server/internal/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,UAAU,EAAe,MAAM,IAAI,CAAA;AACjD,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,sBAK5C;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,2BAI1F;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,2BAW7E;AAOD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,uDAGnF;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,YA+BtE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,YAExE;AAED,eAAO,MAAM,WAAW,gHAA2D,CAAA"}