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.
- package/CHANGELOG.md +15 -0
- package/dist/core/Adapter.d.ts +2 -2
- package/dist/core/Adapter.d.ts.map +1 -1
- package/dist/core/Client.d.ts +2 -2
- package/dist/core/Client.d.ts.map +1 -1
- package/dist/core/Client.js +13 -4
- package/dist/core/Client.js.map +1 -1
- package/dist/core/Provider.d.ts.map +1 -1
- package/dist/core/Provider.js +9 -2
- package/dist/core/Provider.js.map +1 -1
- package/dist/core/Schema.d.ts +22 -12
- package/dist/core/Schema.d.ts.map +1 -1
- package/dist/core/adapters/dialog.d.ts.map +1 -1
- package/dist/core/adapters/dialog.js +24 -4
- package/dist/core/adapters/dialog.js.map +1 -1
- package/dist/core/adapters/local.d.ts.map +1 -1
- package/dist/core/adapters/local.js +21 -3
- package/dist/core/adapters/local.js.map +1 -1
- package/dist/core/zod/rpc.d.ts +14 -9
- package/dist/core/zod/rpc.d.ts.map +1 -1
- package/dist/core/zod/rpc.js +8 -2
- package/dist/core/zod/rpc.js.map +1 -1
- package/dist/server/CliAuth.d.ts +11 -11
- package/dist/server/CliAuth.js +1 -1
- package/dist/server/CliAuth.js.map +1 -1
- package/dist/server/Handler.d.ts +4 -252
- package/dist/server/Handler.d.ts.map +1 -1
- package/dist/server/Handler.js +4 -573
- package/dist/server/Handler.js.map +1 -1
- package/dist/server/internal/handlers/codeAuth.d.ts +41 -0
- package/dist/server/internal/handlers/codeAuth.d.ts.map +1 -0
- package/dist/server/internal/handlers/codeAuth.js +104 -0
- package/dist/server/internal/handlers/codeAuth.js.map +1 -0
- package/dist/server/internal/handlers/feePayer.d.ts +73 -0
- package/dist/server/internal/handlers/feePayer.d.ts.map +1 -0
- package/dist/server/internal/handlers/feePayer.js +184 -0
- package/dist/server/internal/handlers/feePayer.js.map +1 -0
- package/dist/server/internal/handlers/relay.d.ts +148 -0
- package/dist/server/internal/handlers/relay.d.ts.map +1 -0
- package/dist/server/internal/handlers/relay.js +600 -0
- package/dist/server/internal/handlers/relay.js.map +1 -0
- package/dist/server/internal/handlers/utils.d.ts +12 -0
- package/dist/server/internal/handlers/utils.d.ts.map +1 -0
- package/dist/server/internal/handlers/utils.js +80 -0
- package/dist/server/internal/handlers/utils.js.map +1 -0
- package/dist/server/internal/handlers/webAuthn.d.ts +57 -0
- package/dist/server/internal/handlers/webAuthn.d.ts.map +1 -0
- package/dist/server/internal/handlers/webAuthn.js +143 -0
- package/dist/server/internal/handlers/webAuthn.js.map +1 -0
- package/package.json +2 -2
- package/src/core/Adapter.ts +2 -2
- package/src/core/Client.ts +13 -6
- package/src/core/Provider.connect.browser.test.ts +23 -2
- package/src/core/Provider.test.ts +292 -0
- package/src/core/Provider.ts +11 -3
- package/src/core/adapters/dialog.ts +21 -4
- package/src/core/adapters/local.ts +15 -3
- package/src/core/zod/rpc.ts +12 -2
- package/src/server/CliAuth.ts +1 -1
- package/src/server/Handler.test.ts +3 -418
- package/src/server/Handler.ts +5 -766
- package/src/server/internal/handlers/codeAuth.ts +148 -0
- package/src/server/internal/handlers/feePayer.test.ts +335 -0
- package/src/server/internal/handlers/feePayer.ts +271 -0
- package/src/server/internal/handlers/relay.test.ts +767 -0
- package/src/server/internal/handlers/relay.ts +817 -0
- package/src/server/internal/handlers/utils.ts +96 -0
- package/src/server/internal/handlers/webAuthn.test.ts +170 -0
- 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"}
|