viem 2.56.9 → 2.57.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.
- package/CHANGELOG.md +40 -0
- package/_cjs/actions/public/waitForTransactionReceipt.js +12 -1
- package/_cjs/actions/public/waitForTransactionReceipt.js.map +1 -1
- package/_cjs/chains/definitions/blockdag.js +23 -0
- package/_cjs/chains/definitions/blockdag.js.map +1 -0
- package/_cjs/chains/definitions/candyChain.js +29 -0
- package/_cjs/chains/definitions/candyChain.js.map +1 -0
- package/_cjs/chains/definitions/creditCoin3Devnet.js +6 -0
- package/_cjs/chains/definitions/creditCoin3Devnet.js.map +1 -1
- package/_cjs/chains/definitions/creditCoin3Mainnet.js +6 -0
- package/_cjs/chains/definitions/creditCoin3Mainnet.js.map +1 -1
- package/_cjs/chains/definitions/creditCoin3Testnet.js +6 -0
- package/_cjs/chains/definitions/creditCoin3Testnet.js.map +1 -1
- package/_cjs/chains/definitions/kortana.js +23 -0
- package/_cjs/chains/definitions/kortana.js.map +1 -0
- package/_cjs/chains/index.js +20 -14
- package/_cjs/chains/index.js.map +1 -1
- package/_cjs/clients/createClientResolver.js +45 -0
- package/_cjs/clients/createClientResolver.js.map +1 -0
- package/_cjs/errors/version.js +1 -1
- package/_cjs/index.js +13 -9
- package/_cjs/index.js.map +1 -1
- package/_cjs/op-stack/actions/getGame.js +1 -1
- package/_cjs/op-stack/actions/getGame.js.map +1 -1
- package/_cjs/op-stack/actions/getGames.js +1 -1
- package/_cjs/op-stack/actions/getGames.js.map +1 -1
- package/_cjs/op-stack/actions/getTimeToNextGame.js +1 -1
- package/_cjs/op-stack/actions/getTimeToNextGame.js.map +1 -1
- package/_cjs/op-stack/actions/getTimeToNextL2Output.js +1 -1
- package/_cjs/op-stack/actions/getTimeToNextL2Output.js.map +1 -1
- package/_cjs/tempo/Client.js +2 -10
- package/_cjs/tempo/Client.js.map +1 -1
- package/_cjs/tempo/ExecutionError.js +290 -0
- package/_cjs/tempo/ExecutionError.js.map +1 -0
- package/_cjs/tempo/Relay.js +88 -0
- package/_cjs/tempo/Relay.js.map +1 -0
- package/_cjs/tempo/Transaction.js.map +1 -1
- package/_cjs/tempo/Transport.js +21 -12
- package/_cjs/tempo/Transport.js.map +1 -1
- package/_cjs/tempo/chainConfig.js +3 -0
- package/_cjs/tempo/chainConfig.js.map +1 -1
- package/_cjs/tempo/index.js +3 -3
- package/_cjs/tempo/index.js.map +1 -1
- package/_cjs/tempo/internal/relay/cache.js +74 -0
- package/_cjs/tempo/internal/relay/cache.js.map +1 -0
- package/_cjs/tempo/internal/relay/deadline.js +35 -0
- package/_cjs/tempo/internal/relay/deadline.js.map +1 -0
- package/_cjs/tempo/internal/relay/error.js +102 -0
- package/_cjs/tempo/internal/relay/error.js.map +1 -0
- package/_cjs/tempo/internal/relay/feePayer.js +426 -0
- package/_cjs/tempo/internal/relay/feePayer.js.map +1 -0
- package/_cjs/tempo/internal/relay/feeToken.js +143 -0
- package/_cjs/tempo/internal/relay/feeToken.js.map +1 -0
- package/_cjs/tempo/{Multisig.js → internal/relay/multisig.js} +132 -122
- package/_cjs/tempo/internal/relay/multisig.js.map +1 -0
- package/_cjs/tempo/internal/relay/plugin.js +13 -0
- package/_cjs/tempo/internal/relay/plugin.js.map +1 -0
- package/_cjs/tempo/internal/relay/preflight.js +58 -0
- package/_cjs/tempo/internal/relay/preflight.js.map +1 -0
- package/_cjs/tempo/internal/relay/request.js +319 -0
- package/_cjs/tempo/internal/relay/request.js.map +1 -0
- package/_cjs/tempo/internal/relay/simulate.js +267 -0
- package/_cjs/tempo/internal/relay/simulate.js.map +1 -0
- package/_cjs/tempo/internal/relay/utils.js +174 -0
- package/_cjs/tempo/internal/relay/utils.js.map +1 -0
- package/_cjs/tempo/internal/relay/virtualAddress.js +78 -0
- package/_cjs/tempo/internal/relay/virtualAddress.js.map +1 -0
- package/_cjs/tempo/internal/relay.js +139 -0
- package/_cjs/tempo/internal/relay.js.map +1 -0
- package/_cjs/tempo/multisig/Config.js +0 -2
- package/_cjs/tempo/multisig/Config.js.map +1 -1
- package/_cjs/tempo/multisig/Operation.js +1 -2
- package/_cjs/tempo/multisig/Operation.js.map +1 -1
- package/_cjs/utils/siwe/parseSiweMessage.js +3 -3
- package/_cjs/utils/siwe/parseSiweMessage.js.map +1 -1
- package/_esm/actions/public/waitForTransactionReceipt.js +15 -1
- package/_esm/actions/public/waitForTransactionReceipt.js.map +1 -1
- package/_esm/chains/definitions/blockdag.js +20 -0
- package/_esm/chains/definitions/blockdag.js.map +1 -0
- package/_esm/chains/definitions/candyChain.js +26 -0
- package/_esm/chains/definitions/candyChain.js.map +1 -0
- package/_esm/chains/definitions/creditCoin3Devnet.js +6 -0
- package/_esm/chains/definitions/creditCoin3Devnet.js.map +1 -1
- package/_esm/chains/definitions/creditCoin3Mainnet.js +6 -0
- package/_esm/chains/definitions/creditCoin3Mainnet.js.map +1 -1
- package/_esm/chains/definitions/creditCoin3Testnet.js +6 -0
- package/_esm/chains/definitions/creditCoin3Testnet.js.map +1 -1
- package/_esm/chains/definitions/kortana.js +20 -0
- package/_esm/chains/definitions/kortana.js.map +1 -0
- package/_esm/chains/index.js +3 -0
- package/_esm/chains/index.js.map +1 -1
- package/_esm/clients/createClientResolver.js +64 -0
- package/_esm/clients/createClientResolver.js.map +1 -0
- package/_esm/errors/version.js +1 -1
- package/_esm/index.js +2 -0
- package/_esm/index.js.map +1 -1
- package/_esm/op-stack/actions/getGame.js +1 -1
- package/_esm/op-stack/actions/getGame.js.map +1 -1
- package/_esm/op-stack/actions/getGames.js +1 -1
- package/_esm/op-stack/actions/getGames.js.map +1 -1
- package/_esm/op-stack/actions/getTimeToNextGame.js +2 -2
- package/_esm/op-stack/actions/getTimeToNextGame.js.map +1 -1
- package/_esm/op-stack/actions/getTimeToNextL2Output.js +2 -2
- package/_esm/op-stack/actions/getTimeToNextL2Output.js.map +1 -1
- package/_esm/tempo/Client.js +8 -14
- package/_esm/tempo/Client.js.map +1 -1
- package/_esm/tempo/ExecutionError.js +306 -0
- package/_esm/tempo/ExecutionError.js.map +1 -0
- package/_esm/tempo/Relay.js +170 -0
- package/_esm/tempo/Relay.js.map +1 -0
- package/_esm/tempo/Transaction.js.map +1 -1
- package/_esm/tempo/Transport.js +21 -46
- package/_esm/tempo/Transport.js.map +1 -1
- package/_esm/tempo/chainConfig.js +4 -0
- package/_esm/tempo/chainConfig.js.map +1 -1
- package/_esm/tempo/index.js +8 -3
- package/_esm/tempo/index.js.map +1 -1
- package/_esm/tempo/internal/relay/cache.js +72 -0
- package/_esm/tempo/internal/relay/cache.js.map +1 -0
- package/_esm/tempo/internal/relay/deadline.js +34 -0
- package/_esm/tempo/internal/relay/deadline.js.map +1 -0
- package/_esm/tempo/internal/relay/error.js +101 -0
- package/_esm/tempo/internal/relay/error.js.map +1 -0
- package/_esm/tempo/internal/relay/feePayer.js +442 -0
- package/_esm/tempo/internal/relay/feePayer.js.map +1 -0
- package/_esm/tempo/internal/relay/feeToken.js +143 -0
- package/_esm/tempo/internal/relay/feeToken.js.map +1 -0
- package/_esm/tempo/{Multisig.js → internal/relay/multisig.js} +133 -129
- package/_esm/tempo/internal/relay/multisig.js.map +1 -0
- package/_esm/tempo/internal/relay/plugin.js +10 -0
- package/_esm/tempo/internal/relay/plugin.js.map +1 -0
- package/_esm/tempo/internal/relay/preflight.js +57 -0
- package/_esm/tempo/internal/relay/preflight.js.map +1 -0
- package/_esm/tempo/internal/relay/request.js +321 -0
- package/_esm/tempo/internal/relay/request.js.map +1 -0
- package/_esm/tempo/internal/relay/simulate.js +277 -0
- package/_esm/tempo/internal/relay/simulate.js.map +1 -0
- package/_esm/tempo/internal/relay/utils.js +174 -0
- package/_esm/tempo/internal/relay/utils.js.map +1 -0
- package/_esm/tempo/internal/relay/virtualAddress.js +73 -0
- package/_esm/tempo/internal/relay/virtualAddress.js.map +1 -0
- package/_esm/tempo/internal/relay.js +138 -0
- package/_esm/tempo/internal/relay.js.map +1 -0
- package/_esm/tempo/multisig/Config.js +2 -1
- package/_esm/tempo/multisig/Config.js.map +1 -1
- package/_esm/tempo/multisig/Operation.js +1 -1
- package/_esm/tempo/multisig/Operation.js.map +1 -1
- package/_esm/utils/siwe/parseSiweMessage.js +3 -3
- package/_esm/utils/siwe/parseSiweMessage.js.map +1 -1
- package/_types/actions/public/waitForTransactionReceipt.d.ts.map +1 -1
- package/_types/chains/definitions/blockdag.d.ts +51 -0
- package/_types/chains/definitions/blockdag.d.ts.map +1 -0
- package/_types/chains/definitions/candyChain.d.ts +48 -0
- package/_types/chains/definitions/candyChain.d.ts.map +1 -0
- package/_types/chains/definitions/creditCoin3Devnet.d.ts +6 -9
- package/_types/chains/definitions/creditCoin3Devnet.d.ts.map +1 -1
- package/_types/chains/definitions/creditCoin3Mainnet.d.ts +6 -9
- package/_types/chains/definitions/creditCoin3Mainnet.d.ts.map +1 -1
- package/_types/chains/definitions/creditCoin3Testnet.d.ts +6 -9
- package/_types/chains/definitions/creditCoin3Testnet.d.ts.map +1 -1
- package/_types/chains/definitions/kortana.d.ts +51 -0
- package/_types/chains/definitions/kortana.d.ts.map +1 -0
- package/_types/chains/index.d.ts +3 -0
- package/_types/chains/index.d.ts.map +1 -1
- package/_types/clients/createClientResolver.d.ts +76 -0
- package/_types/clients/createClientResolver.d.ts.map +1 -0
- package/_types/errors/version.d.ts +1 -1
- package/_types/index.d.ts +2 -0
- package/_types/index.d.ts.map +1 -1
- package/_types/op-stack/actions/getGame.d.ts.map +1 -1
- package/_types/tempo/Capabilities.d.ts +7 -28
- package/_types/tempo/Capabilities.d.ts.map +1 -1
- package/_types/tempo/Client.d.ts +6 -15
- package/_types/tempo/Client.d.ts.map +1 -1
- package/_types/tempo/ExecutionError.d.ts +79 -0
- package/_types/tempo/ExecutionError.d.ts.map +1 -0
- package/_types/tempo/Relay.d.ts +302 -0
- package/_types/tempo/Relay.d.ts.map +1 -0
- package/_types/tempo/Transaction.d.ts +2 -1
- package/_types/tempo/Transaction.d.ts.map +1 -1
- package/_types/tempo/Transport.d.ts +15 -29
- package/_types/tempo/Transport.d.ts.map +1 -1
- package/_types/tempo/chainConfig.d.ts.map +1 -1
- package/_types/tempo/index.d.ts +8 -3
- package/_types/tempo/index.d.ts.map +1 -1
- package/_types/tempo/internal/relay/cache.d.ts +9 -0
- package/_types/tempo/internal/relay/cache.d.ts.map +1 -0
- package/_types/tempo/internal/relay/deadline.d.ts +4 -0
- package/_types/tempo/internal/relay/deadline.d.ts.map +1 -0
- package/_types/tempo/internal/relay/error.d.ts +47 -0
- package/_types/tempo/internal/relay/error.d.ts.map +1 -0
- package/_types/tempo/internal/relay/feePayer.d.ts +70 -0
- package/_types/tempo/internal/relay/feePayer.d.ts.map +1 -0
- package/_types/tempo/internal/relay/feeToken.d.ts +38 -0
- package/_types/tempo/internal/relay/feeToken.d.ts.map +1 -0
- package/_types/tempo/internal/relay/multisig.d.ts +4 -0
- package/_types/tempo/internal/relay/multisig.d.ts.map +1 -0
- package/_types/tempo/internal/relay/plugin.d.ts +5 -0
- package/_types/tempo/internal/relay/plugin.d.ts.map +1 -0
- package/_types/tempo/internal/relay/preflight.d.ts +17 -0
- package/_types/tempo/internal/relay/preflight.d.ts.map +1 -0
- package/_types/tempo/internal/relay/request.d.ts +16 -0
- package/_types/tempo/internal/relay/request.d.ts.map +1 -0
- package/_types/tempo/internal/relay/simulate.d.ts +59 -0
- package/_types/tempo/internal/relay/simulate.d.ts.map +1 -0
- package/_types/tempo/internal/relay/utils.d.ts +294 -0
- package/_types/tempo/internal/relay/utils.d.ts.map +1 -0
- package/_types/tempo/internal/relay/virtualAddress.d.ts +9 -0
- package/_types/tempo/internal/relay/virtualAddress.d.ts.map +1 -0
- package/_types/tempo/internal/relay.d.ts +4 -0
- package/_types/tempo/internal/relay.d.ts.map +1 -0
- package/_types/tempo/multisig/Config.d.ts +0 -13
- package/_types/tempo/multisig/Config.d.ts.map +1 -1
- package/_types/tempo/multisig/Operation.d.ts +0 -5
- package/_types/tempo/multisig/Operation.d.ts.map +1 -1
- package/_types/utils/siwe/parseSiweMessage.d.ts.map +1 -1
- package/actions/public/waitForTransactionReceipt.ts +16 -2
- package/chains/definitions/blockdag.ts +20 -0
- package/chains/definitions/candyChain.ts +26 -0
- package/chains/definitions/creditCoin3Devnet.ts +6 -0
- package/chains/definitions/creditCoin3Mainnet.ts +6 -0
- package/chains/definitions/creditCoin3Testnet.ts +6 -0
- package/chains/definitions/kortana.ts +20 -0
- package/chains/index.ts +3 -0
- package/clients/createClientResolver.ts +191 -0
- package/errors/version.ts +1 -1
- package/index.ts +6 -0
- package/op-stack/actions/getGame.ts +3 -1
- package/op-stack/actions/getGames.ts +1 -1
- package/op-stack/actions/getTimeToNextGame.ts +2 -2
- package/op-stack/actions/getTimeToNextL2Output.ts +2 -2
- package/package.json +1 -1
- package/tempo/Capabilities.ts +7 -29
- package/tempo/Client.ts +8 -38
- package/tempo/ExecutionError.ts +418 -0
- package/tempo/Relay.ts +428 -0
- package/tempo/Transaction.ts +2 -1
- package/tempo/Transport.ts +69 -60
- package/tempo/chainConfig.ts +4 -0
- package/tempo/index.ts +7 -3
- package/tempo/internal/relay/cache.ts +82 -0
- package/tempo/internal/relay/deadline.ts +45 -0
- package/tempo/internal/relay/error.ts +128 -0
- package/tempo/internal/relay/feePayer.ts +692 -0
- package/tempo/internal/relay/feeToken.ts +190 -0
- package/tempo/{Multisig.ts → internal/relay/multisig.ts} +162 -193
- package/tempo/internal/relay/plugin.ts +13 -0
- package/tempo/internal/relay/preflight.ts +81 -0
- package/tempo/internal/relay/request.ts +391 -0
- package/tempo/internal/relay/simulate.ts +367 -0
- package/tempo/internal/relay/utils.ts +202 -0
- package/tempo/internal/relay/virtualAddress.ts +95 -0
- package/tempo/internal/relay.ts +158 -0
- package/tempo/multisig/Config.ts +3 -2
- package/tempo/multisig/Operation.ts +1 -1
- package/utils/siwe/parseSiweMessage.ts +21 -13
- package/_cjs/tempo/Multisig.js.map +0 -1
- package/_esm/tempo/Multisig.js.map +0 -1
- package/_types/tempo/Multisig.d.ts +0 -37
- package/_types/tempo/Multisig.d.ts.map +0 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { Hash, RpcResponse, Signature } from 'ox';
|
|
2
|
+
import { TxEnvelopeTempo } from 'ox/tempo';
|
|
3
|
+
import { createClient } from '../../../clients/createClient.js';
|
|
4
|
+
import { http } from '../../../clients/transports/http.js';
|
|
5
|
+
import * as Transaction from '../../Transaction.js';
|
|
6
|
+
import * as Request from './request.js';
|
|
7
|
+
import * as Utils from './utils.js';
|
|
8
|
+
export function create(options) {
|
|
9
|
+
// Bind signing permission to the middleware invocation and its validated payload.
|
|
10
|
+
const authorized = new WeakMap();
|
|
11
|
+
const allowedFeePayers = new Set(options.allowedFeePayers?.map((url) => ExternalFeePayerUrl.normalize(url, {
|
|
12
|
+
allowUnsafe: options.internal_allowUnsafeUrls,
|
|
13
|
+
})));
|
|
14
|
+
return {
|
|
15
|
+
async handleRequest(context, next) {
|
|
16
|
+
const { request } = context;
|
|
17
|
+
if (![
|
|
18
|
+
'eth_fillTransaction',
|
|
19
|
+
'eth_signRawTransaction',
|
|
20
|
+
'eth_sendRawTransaction',
|
|
21
|
+
'eth_sendRawTransactionSync',
|
|
22
|
+
].includes(request.method))
|
|
23
|
+
return next();
|
|
24
|
+
const { client, getClient, options: requestOptions } = context;
|
|
25
|
+
const chainId = requestOptions.chainId;
|
|
26
|
+
const getTokens = (id) => context.resolveTokens(id);
|
|
27
|
+
const record = (details) => {
|
|
28
|
+
if (details && requestOptions.response)
|
|
29
|
+
requestOptions.response.sponsorship_details = details;
|
|
30
|
+
};
|
|
31
|
+
if (request.method !== 'eth_fillTransaction') {
|
|
32
|
+
if (!options.account) {
|
|
33
|
+
if (request.method === 'eth_signRawTransaction')
|
|
34
|
+
throw new RpcResponse.MethodNotFoundError({
|
|
35
|
+
message: 'eth_signRawTransaction requires a fee payer to be configured on the relay. Add `Relay.feePayer({ account })` to enable transaction sponsorship.',
|
|
36
|
+
});
|
|
37
|
+
return next();
|
|
38
|
+
}
|
|
39
|
+
const serialized = request.params?.[0];
|
|
40
|
+
if (typeof serialized !== 'string' ||
|
|
41
|
+
!requestsRawSponsorship(serialized))
|
|
42
|
+
return next();
|
|
43
|
+
const result = await handleRawTransaction({
|
|
44
|
+
...options,
|
|
45
|
+
account: options.account,
|
|
46
|
+
getClient,
|
|
47
|
+
getFeeToken: async (id) => (await getTokens(id))[0],
|
|
48
|
+
method: request.method,
|
|
49
|
+
request,
|
|
50
|
+
});
|
|
51
|
+
record(result.sponsorshipDetails);
|
|
52
|
+
return result.result;
|
|
53
|
+
}
|
|
54
|
+
const parameters = request.params[0];
|
|
55
|
+
const { feePayer: _, ...normalized } = Utils.normalizeFillTransactionRequest(parameters);
|
|
56
|
+
const external = typeof parameters.feePayer === 'string'
|
|
57
|
+
? ExternalFeePayerUrl.normalize(parameters.feePayer, {
|
|
58
|
+
allowUnsafe: options.internal_allowUnsafeUrls ?? false,
|
|
59
|
+
})
|
|
60
|
+
: undefined;
|
|
61
|
+
if (external && !allowedFeePayers.has(external))
|
|
62
|
+
throw new RpcResponse.InvalidParamsError({
|
|
63
|
+
message: 'External fee payer URL is not allowed.',
|
|
64
|
+
});
|
|
65
|
+
const wantsSponsorship = (!!options.account || !!external) && parameters.feePayer !== false;
|
|
66
|
+
if (options.account && !external)
|
|
67
|
+
delete normalized.feePayerSignature;
|
|
68
|
+
const base = { ...normalized, chainId };
|
|
69
|
+
if (!wantsSponsorship)
|
|
70
|
+
return Request.fill(client, base);
|
|
71
|
+
const token = options.feeToken ??
|
|
72
|
+
parameters.feeToken ??
|
|
73
|
+
(!options.validate || external
|
|
74
|
+
? (await getTokens(chainId))[0]
|
|
75
|
+
: undefined);
|
|
76
|
+
const transaction = {
|
|
77
|
+
...base,
|
|
78
|
+
feePayer: true,
|
|
79
|
+
...(token ? { feeToken: token } : {}),
|
|
80
|
+
};
|
|
81
|
+
const prepared = isPreparedTransaction(transaction);
|
|
82
|
+
const fillClient = external
|
|
83
|
+
? createClient({
|
|
84
|
+
chain: client.chain,
|
|
85
|
+
transport: http(external, {
|
|
86
|
+
fetchOptions: { redirect: 'error' },
|
|
87
|
+
retryCount: 0,
|
|
88
|
+
}),
|
|
89
|
+
})
|
|
90
|
+
: client;
|
|
91
|
+
const result = prepared && !external
|
|
92
|
+
? { tx: transaction }
|
|
93
|
+
: await Request.fill(fillClient, transaction, external ? { ...requestOptions, retryCount: 0 } : requestOptions);
|
|
94
|
+
const filled = Utils.normalizeTempoTransaction(result.tx);
|
|
95
|
+
// Reserve intrinsic gas for larger signatures before validating and signing the candidate.
|
|
96
|
+
if ((!prepared || parameters.feePayer !== true) &&
|
|
97
|
+
filled.gas &&
|
|
98
|
+
!filled.feePayerSignature)
|
|
99
|
+
filled.gas += 20000n;
|
|
100
|
+
if (token && (!external || filled.feeToken == null))
|
|
101
|
+
Object.assign(filled, { feeToken: token });
|
|
102
|
+
const sponsored = external ||
|
|
103
|
+
!options.validate ||
|
|
104
|
+
(await shouldSponsor({
|
|
105
|
+
sender: parameters.from,
|
|
106
|
+
transaction: filled,
|
|
107
|
+
validate: options.validate,
|
|
108
|
+
}));
|
|
109
|
+
if (!sponsored)
|
|
110
|
+
return Request.fill(client, { ...base, feePayer: false });
|
|
111
|
+
const defer = typeof normalized.multisigSimulation === 'object' &&
|
|
112
|
+
normalized.multisigSimulation !== null;
|
|
113
|
+
const sponsor = sponsored
|
|
114
|
+
? external
|
|
115
|
+
? (result.capabilities?.sponsor ?? result.sponsor)
|
|
116
|
+
: options.account
|
|
117
|
+
? getSponsor({ ...options, account: options.account })
|
|
118
|
+
: undefined
|
|
119
|
+
: undefined;
|
|
120
|
+
if (options.account && !external && !defer) {
|
|
121
|
+
delete filled.signature;
|
|
122
|
+
if (!filled.from)
|
|
123
|
+
filled.from = parameters.from;
|
|
124
|
+
authorized.set(context, TxEnvelopeTempo.getFeePayerSignPayload(TxEnvelopeTempo.from(filled), { sender: filled.from }));
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
...result,
|
|
128
|
+
...(sponsor ? { sponsor } : {}),
|
|
129
|
+
tx: Utils.formatTempoTransaction(filled),
|
|
130
|
+
capabilities: {
|
|
131
|
+
...result.capabilities,
|
|
132
|
+
sponsored: external
|
|
133
|
+
? (result.capabilities?.sponsored ?? !!sponsor)
|
|
134
|
+
: !!sponsor,
|
|
135
|
+
...(sponsor ? { sponsor } : {}),
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
},
|
|
139
|
+
async signTransaction(result, context) {
|
|
140
|
+
const approved = authorized.get(context);
|
|
141
|
+
authorized.delete(context);
|
|
142
|
+
const parameters = context.request.params[0];
|
|
143
|
+
if (!approved ||
|
|
144
|
+
!options.account ||
|
|
145
|
+
typeof parameters.feePayer === 'string' ||
|
|
146
|
+
parameters.feePayer === false ||
|
|
147
|
+
!result.capabilities?.sponsored ||
|
|
148
|
+
(typeof parameters.multisigSimulation === 'object' &&
|
|
149
|
+
parameters.multisigSimulation !== null))
|
|
150
|
+
return undefined;
|
|
151
|
+
const transaction = Utils.normalizeTempoTransaction(result.tx);
|
|
152
|
+
const payload = TxEnvelopeTempo.getFeePayerSignPayload(TxEnvelopeTempo.from(transaction), { sender: (transaction.from ?? parameters.from) });
|
|
153
|
+
if (payload !== approved)
|
|
154
|
+
throw new RpcResponse.InvalidParamsError({
|
|
155
|
+
message: 'Sponsored transaction changed after validation.',
|
|
156
|
+
});
|
|
157
|
+
const signed = await sign({
|
|
158
|
+
account: options.account,
|
|
159
|
+
onSponsored: options.onSponsored,
|
|
160
|
+
sender: parameters.from,
|
|
161
|
+
transaction,
|
|
162
|
+
signal: context.options.signal,
|
|
163
|
+
});
|
|
164
|
+
if (signed.sponsorshipDetails && context.options.response)
|
|
165
|
+
context.options.response.sponsorship_details = signed.sponsorshipDetails;
|
|
166
|
+
const tx = Utils.formatTempoTransaction(signed.transaction);
|
|
167
|
+
return tx.feePayerSignature;
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/** Refusal messages keyed by named validation reason. */
|
|
172
|
+
const refusalMessages = {
|
|
173
|
+
billing_past_due: 'Billing past due.',
|
|
174
|
+
billing_required: 'Billing required.',
|
|
175
|
+
fee_token_unsupported: 'Fee token unsupported.',
|
|
176
|
+
spend_limit_exceeded: 'Spend limit exceeded.',
|
|
177
|
+
tx_fee_limit_exceeded: 'Transaction fee limit exceeded.',
|
|
178
|
+
};
|
|
179
|
+
/** Returns sponsor metadata for `eth_fillTransaction` responses. */
|
|
180
|
+
// biome-ignore lint/correctness/noUnusedVariables: declaration merge
|
|
181
|
+
function getSponsor(options) {
|
|
182
|
+
const { account, name, url } = options;
|
|
183
|
+
return {
|
|
184
|
+
address: account.address,
|
|
185
|
+
...(name ? { name } : {}),
|
|
186
|
+
...(url ? { url } : {}),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/** Returns whether the fee payer approves a filled transaction. */
|
|
190
|
+
// biome-ignore lint/correctness/noUnusedVariables: declaration merge
|
|
191
|
+
async function shouldSponsor(options) {
|
|
192
|
+
const { sender, transaction, validate } = options;
|
|
193
|
+
if (!validate)
|
|
194
|
+
return true;
|
|
195
|
+
// Named refusal reasons collapse to false: fills fall back to an
|
|
196
|
+
// unsponsored fill instead of surfacing the reason.
|
|
197
|
+
const verdict = await validate({
|
|
198
|
+
...transaction,
|
|
199
|
+
from: sender,
|
|
200
|
+
});
|
|
201
|
+
return verdict === true;
|
|
202
|
+
}
|
|
203
|
+
/** Returns whether a raw Tempo transaction is explicitly requesting sponsorship. */
|
|
204
|
+
function requestsRawSponsorship(serialized) {
|
|
205
|
+
if (!Utils.isSerializedTempoTransaction(serialized))
|
|
206
|
+
return false;
|
|
207
|
+
const transaction = Transaction.deserialize(serialized);
|
|
208
|
+
return ('feePayerSignature' in transaction && transaction.feePayerSignature === null);
|
|
209
|
+
}
|
|
210
|
+
/** Returns `true` when a fill request already has the fields needed for sponsorship signing. */
|
|
211
|
+
function isPreparedTransaction(value) {
|
|
212
|
+
return (typeof value.from === 'string' &&
|
|
213
|
+
typeof Utils.resolveChainId(value.chainId) === 'number' &&
|
|
214
|
+
typeof value.gas !== 'undefined' &&
|
|
215
|
+
typeof value.nonce !== 'undefined' &&
|
|
216
|
+
(typeof value.maxFeePerGas !== 'undefined' ||
|
|
217
|
+
typeof value.gasPrice !== 'undefined'));
|
|
218
|
+
}
|
|
219
|
+
/** Signs a filled transaction as the fee payer. */
|
|
220
|
+
export async function sign(options) {
|
|
221
|
+
const { account, transaction, sender } = options;
|
|
222
|
+
const from = transaction.from ?? sender;
|
|
223
|
+
const { signature: _, ...withoutSenderSig } = transaction;
|
|
224
|
+
const prepared = { ...withoutSenderSig, from };
|
|
225
|
+
if (!prepared.from)
|
|
226
|
+
throw new RpcResponse.InvalidParamsError({
|
|
227
|
+
message: 'Transaction sender must be provided before fee payer signing.',
|
|
228
|
+
});
|
|
229
|
+
if (!account.sign)
|
|
230
|
+
throw new Error('Fee payer account cannot sign transactions.');
|
|
231
|
+
const chainId = Utils.resolveChainId(transaction.chainId);
|
|
232
|
+
if (chainId === undefined)
|
|
233
|
+
throw new RpcResponse.InvalidParamsError({
|
|
234
|
+
message: 'Transaction chainId must be provided before fee payer signing.',
|
|
235
|
+
});
|
|
236
|
+
const envelope = TxEnvelopeTempo.from(prepared);
|
|
237
|
+
const signPayload = TxEnvelopeTempo.getFeePayerSignPayload(envelope, {
|
|
238
|
+
sender: prepared.from,
|
|
239
|
+
});
|
|
240
|
+
options.signal?.throwIfAborted();
|
|
241
|
+
const feePayerSignature = Signature.from(await account.sign({ hash: signPayload }));
|
|
242
|
+
options.signal?.throwIfAborted();
|
|
243
|
+
// Record the commitment before releasing the signature, since the signed fill can be broadcast through another endpoint.
|
|
244
|
+
const feeToken = transaction.feeToken;
|
|
245
|
+
const sponsorshipDetails = await options.onSponsored?.({
|
|
246
|
+
chainId,
|
|
247
|
+
...(feeToken ? { feeToken } : {}),
|
|
248
|
+
method: 'eth_fillTransaction',
|
|
249
|
+
sender: prepared.from,
|
|
250
|
+
signPayload,
|
|
251
|
+
transaction: TxEnvelopeTempo.serialize(envelope, { feePayerSignature }),
|
|
252
|
+
});
|
|
253
|
+
return {
|
|
254
|
+
...(sponsorshipDetails ? { sponsorshipDetails } : {}),
|
|
255
|
+
transaction: { ...prepared, feePayerSignature },
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/** Handles `eth_signRawTransaction` and broadcast methods for sponsored Tempo transactions. */
|
|
259
|
+
// biome-ignore lint/correctness/noUnusedVariables: declaration merge
|
|
260
|
+
async function handleRawTransaction(options) {
|
|
261
|
+
const { account, feeToken: sponsorFeeToken, getClient, method, request, validate, } = options;
|
|
262
|
+
const serialized = request.params?.[0];
|
|
263
|
+
if (!Utils.isSerializedTempoTransaction(serialized))
|
|
264
|
+
throw new RpcResponse.InvalidParamsError({
|
|
265
|
+
message: 'Only Tempo (0x76/0x78) transactions are supported.',
|
|
266
|
+
});
|
|
267
|
+
const transaction = Transaction.deserialize(serialized);
|
|
268
|
+
// Prefer sender recovered from raw envelope; multisig finalize path supplies fallback sender.
|
|
269
|
+
const sender = transaction.from ?? options.sender;
|
|
270
|
+
// Sponsorship only applies after sender has signed original transaction.
|
|
271
|
+
if (!transaction.signature || !sender)
|
|
272
|
+
throw new RpcResponse.InvalidParamsError({
|
|
273
|
+
message: 'Transaction must be signed by the sender before fee payer signing.',
|
|
274
|
+
});
|
|
275
|
+
if (!account.sign)
|
|
276
|
+
throw new Error('Fee payer account cannot sign transactions.');
|
|
277
|
+
const client = getClient(transaction.chainId);
|
|
278
|
+
const feeToken_chain = client.chain?.feeToken;
|
|
279
|
+
const feeToken = transaction.feeToken ??
|
|
280
|
+
sponsorFeeToken ??
|
|
281
|
+
(await options.getFeeToken?.(transaction.chainId)) ??
|
|
282
|
+
feeToken_chain;
|
|
283
|
+
const transaction_sponsored = feeToken
|
|
284
|
+
? { ...transaction, feeToken }
|
|
285
|
+
: transaction;
|
|
286
|
+
if (validate) {
|
|
287
|
+
const verdict = await validate(transaction_sponsored);
|
|
288
|
+
if (verdict !== true)
|
|
289
|
+
throw new RpcResponse.InvalidParamsError(verdict === false
|
|
290
|
+
? { message: 'Sponsorship rejected.' }
|
|
291
|
+
: { data: { code: verdict }, message: refusalMessages[verdict] });
|
|
292
|
+
}
|
|
293
|
+
const envelope = TxEnvelopeTempo.from(transaction_sponsored);
|
|
294
|
+
const signPayload = TxEnvelopeTempo.getFeePayerSignPayload(envelope, {
|
|
295
|
+
sender,
|
|
296
|
+
});
|
|
297
|
+
const feePayerSignature = Signature.from(await account.sign({ hash: signPayload }));
|
|
298
|
+
const serializedTransaction = TxEnvelopeTempo.serialize(envelope, {
|
|
299
|
+
feePayerSignature,
|
|
300
|
+
signature: transaction.signature,
|
|
301
|
+
});
|
|
302
|
+
// Awaited before any broadcast so a recording failure refuses sponsorship;
|
|
303
|
+
// no sponsored transaction ever reaches the chain unrecorded.
|
|
304
|
+
const sponsorshipDetails = await options.onSponsored?.({
|
|
305
|
+
chainId: transaction.chainId,
|
|
306
|
+
...(feeToken ? { feeToken } : {}),
|
|
307
|
+
method,
|
|
308
|
+
sender,
|
|
309
|
+
signPayload,
|
|
310
|
+
transaction: serializedTransaction,
|
|
311
|
+
transactionHash: Hash.keccak256(serializedTransaction),
|
|
312
|
+
});
|
|
313
|
+
// Raw-sign requests stop after fee-payer signature is added; send methods broadcast it.
|
|
314
|
+
const result = method === 'eth_signRawTransaction'
|
|
315
|
+
? serializedTransaction
|
|
316
|
+
: await client.request({
|
|
317
|
+
method: method,
|
|
318
|
+
params: [
|
|
319
|
+
serializedTransaction,
|
|
320
|
+
...(request.params?.slice(1) ?? []),
|
|
321
|
+
],
|
|
322
|
+
});
|
|
323
|
+
return { result, ...(sponsorshipDetails ? { sponsorshipDetails } : {}) };
|
|
324
|
+
}
|
|
325
|
+
export var ExternalFeePayerUrl;
|
|
326
|
+
(function (ExternalFeePayerUrl) {
|
|
327
|
+
/** Normalizes external fee-payer relay URLs before forwarding fill payloads. */
|
|
328
|
+
function normalize(value, options = {}) {
|
|
329
|
+
let url;
|
|
330
|
+
try {
|
|
331
|
+
url = new URL(value);
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
throw new RpcResponse.InvalidParamsError({
|
|
335
|
+
message: 'Invalid fee payer URL.',
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
const allowUnsafe = options.allowUnsafe === true;
|
|
339
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
340
|
+
throw new RpcResponse.InvalidParamsError({
|
|
341
|
+
message: 'Invalid fee payer URL protocol.',
|
|
342
|
+
});
|
|
343
|
+
if (!allowUnsafe && url.protocol !== 'https:')
|
|
344
|
+
throw new RpcResponse.InvalidParamsError({
|
|
345
|
+
message: 'Invalid fee payer URL protocol.',
|
|
346
|
+
});
|
|
347
|
+
if (!allowUnsafe && isUnsafeHostname(url.hostname))
|
|
348
|
+
throw new RpcResponse.InvalidParamsError({
|
|
349
|
+
message: 'Invalid fee payer URL host.',
|
|
350
|
+
});
|
|
351
|
+
url.username = '';
|
|
352
|
+
url.password = '';
|
|
353
|
+
url.hash = '';
|
|
354
|
+
return url.href;
|
|
355
|
+
}
|
|
356
|
+
ExternalFeePayerUrl.normalize = normalize;
|
|
357
|
+
function isUnsafeHostname(hostname) {
|
|
358
|
+
const host = normalizeHostname(hostname);
|
|
359
|
+
if (host === 'localhost' || host.endsWith('.localhost'))
|
|
360
|
+
return true;
|
|
361
|
+
const ipv4 = parseIpv4(host);
|
|
362
|
+
if (ipv4)
|
|
363
|
+
return isUnsafeIpv4(ipv4);
|
|
364
|
+
if (!host.includes(':'))
|
|
365
|
+
return false;
|
|
366
|
+
const ipv6 = parseIpv6(host);
|
|
367
|
+
if (!ipv6)
|
|
368
|
+
return true;
|
|
369
|
+
return isUnsafeIpv6(ipv6);
|
|
370
|
+
}
|
|
371
|
+
function normalizeHostname(hostname) {
|
|
372
|
+
return hostname
|
|
373
|
+
.toLowerCase()
|
|
374
|
+
.replace(/^\[|\]$/g, '')
|
|
375
|
+
.split('%')[0];
|
|
376
|
+
}
|
|
377
|
+
function parseIpv4(value) {
|
|
378
|
+
const parts = value.split('.');
|
|
379
|
+
if (parts.length !== 4 || parts.some((part) => !/^\d+$/.test(part)))
|
|
380
|
+
return undefined;
|
|
381
|
+
const numbers = parts.map((part) => Number(part));
|
|
382
|
+
if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 255))
|
|
383
|
+
return undefined;
|
|
384
|
+
return numbers;
|
|
385
|
+
}
|
|
386
|
+
function isUnsafeIpv4(parts) {
|
|
387
|
+
const [a, b] = parts;
|
|
388
|
+
if (a === 0 || a === 10 || a === 127)
|
|
389
|
+
return true;
|
|
390
|
+
if (a === 100 && b >= 64 && b <= 127)
|
|
391
|
+
return true;
|
|
392
|
+
if (a === 169 && b === 254)
|
|
393
|
+
return true;
|
|
394
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
395
|
+
return true;
|
|
396
|
+
if (a === 192 && b === 168)
|
|
397
|
+
return true;
|
|
398
|
+
return a >= 224;
|
|
399
|
+
}
|
|
400
|
+
function parseIpv6(value) {
|
|
401
|
+
const halves = value.split('::');
|
|
402
|
+
if (halves.length > 2)
|
|
403
|
+
return undefined;
|
|
404
|
+
const left = halves[0] ? halves[0].split(':') : [];
|
|
405
|
+
const right = halves[1] ? halves[1].split(':') : [];
|
|
406
|
+
const missing = halves.length === 2 ? 8 - left.length - right.length : 0;
|
|
407
|
+
if (missing < 0)
|
|
408
|
+
return undefined;
|
|
409
|
+
const parts = [...left, ...Array(missing).fill('0'), ...right];
|
|
410
|
+
if (parts.length !== 8)
|
|
411
|
+
return undefined;
|
|
412
|
+
const numbers = parts.map((part) => /^[\da-f]{1,4}$/i.test(part) ? Number.parseInt(part, 16) : NaN);
|
|
413
|
+
if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 0xffff))
|
|
414
|
+
return undefined;
|
|
415
|
+
return numbers;
|
|
416
|
+
}
|
|
417
|
+
function isUnsafeIpv6(parts) {
|
|
418
|
+
const [a] = parts;
|
|
419
|
+
if (parts.every((part) => part === 0))
|
|
420
|
+
return true;
|
|
421
|
+
if (parts.slice(0, 7).every((part) => part === 0) && parts[7] === 1)
|
|
422
|
+
return true;
|
|
423
|
+
if ((a & 0xfe00) === 0xfc00)
|
|
424
|
+
return true;
|
|
425
|
+
if ((a & 0xffc0) === 0xfe80)
|
|
426
|
+
return true;
|
|
427
|
+
if ((a & 0xffc0) === 0xfec0)
|
|
428
|
+
return true;
|
|
429
|
+
if ((a & 0xff00) === 0xff00)
|
|
430
|
+
return true;
|
|
431
|
+
const ipv4 = ipv4FromIpv6(parts);
|
|
432
|
+
return ipv4 ? isUnsafeIpv4(ipv4) : false;
|
|
433
|
+
}
|
|
434
|
+
function ipv4FromIpv6(parts) {
|
|
435
|
+
const mapped = parts.slice(0, 5).every((part) => part === 0) && parts[5] === 0xffff;
|
|
436
|
+
const compatible = parts.slice(0, 6).every((part) => part === 0);
|
|
437
|
+
if (!mapped && !compatible)
|
|
438
|
+
return undefined;
|
|
439
|
+
return [parts[6] >> 8, parts[6] & 0xff, parts[7] >> 8, parts[7] & 0xff];
|
|
440
|
+
}
|
|
441
|
+
})(ExternalFeePayerUrl || (ExternalFeePayerUrl = {}));
|
|
442
|
+
//# sourceMappingURL=feePayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feePayer.js","sourceRoot":"","sources":["../../../../tempo/internal/relay/feePayer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAY,WAAW,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC3D,OAAO,EAAwC,eAAe,EAAE,MAAM,UAAU,CAAA;AAEhF,OAAO,EAAe,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,qCAAqC,CAAA;AAE1D,OAAO,KAAK,WAAW,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAEnC,MAAM,UAAU,MAAM,CAAC,OAA+B;IACpD,kFAAkF;IAClF,MAAM,UAAU,GAAG,IAAI,OAAO,EAAiC,CAAA;IAC/D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACpC,mBAAmB,CAAC,SAAS,CAAC,GAAG,EAAE;QACjC,WAAW,EAAE,OAAO,CAAC,wBAAwB;KAC9C,CAAC,CACH,CACF,CAAA;IACD,OAAO;QACL,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI;YAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;YAC3B,IACE,CAAC;gBACC,qBAAqB;gBACrB,wBAAwB;gBACxB,wBAAwB;gBACxB,4BAA4B;aAC7B,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;gBAE1B,OAAO,IAAI,EAAE,CAAA;YACf,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAA;YAC9D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAA;YAEtC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YAE3D,MAAM,MAAM,GAAG,CAAC,OAAuC,EAAE,EAAE;gBACzD,IAAI,OAAO,IAAI,cAAc,CAAC,QAAQ;oBACpC,cAAc,CAAC,QAAQ,CAAC,mBAAmB,GAAG,OAAO,CAAA;YACzD,CAAC,CAAA;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,EAAE,CAAC;gBAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBACrB,IAAI,OAAO,CAAC,MAAM,KAAK,wBAAwB;wBAC7C,MAAM,IAAI,WAAW,CAAC,mBAAmB,CAAC;4BACxC,OAAO,EACL,iJAAiJ;yBACpJ,CAAC,CAAA;oBAEJ,OAAO,IAAI,EAAE,CAAA;gBACf,CAAC;gBAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;gBACtC,IACE,OAAO,UAAU,KAAK,QAAQ;oBAC9B,CAAC,sBAAsB,CAAC,UAAqB,CAAC;oBAE9C,OAAO,IAAI,EAAE,CAAA;gBAEf,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;oBACxC,GAAG,OAAO;oBACV,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,SAAS;oBACT,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnD,MAAM,EAAE,OAAO,CAAC,MAGgB;oBAChC,OAAO;iBACR,CAAC,CAAA;gBAEF,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;gBACjC,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC;YAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAO,CAAC,CAAC,CAA4B,CAAA;YAChE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,UAAU,EAAE,GAClC,KAAK,CAAC,+BAA+B,CAAC,UAAU,CAAC,CAAA;YAEnD,MAAM,QAAQ,GACZ,OAAO,UAAU,CAAC,QAAQ,KAAK,QAAQ;gBACrC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE;oBACjD,WAAW,EAAE,OAAO,CAAC,wBAAwB,IAAI,KAAK;iBACvD,CAAC;gBACJ,CAAC,CAAC,SAAS,CAAA;YACf,IAAI,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC7C,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;oBACvC,OAAO,EAAE,wCAAwC;iBAClD,CAAC,CAAA;YAEJ,MAAM,gBAAgB,GACpB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,KAAK,KAAK,CAAA;YACpE,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ;gBAAE,OAAO,UAAU,CAAC,iBAAiB,CAAA;YACrE,MAAM,IAAI,GAAG,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,CAAA;YACvC,IAAI,CAAC,gBAAgB;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAExD,MAAM,KAAK,GACT,OAAO,CAAC,QAAQ;gBACf,UAAU,CAAC,QAAgC;gBAC5C,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ;oBAC5B,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChC,CAAC,CAAC,SAAS,CAAC,CAAA;YAChB,MAAM,WAAW,GAAG;gBAClB,GAAG,IAAI;gBACP,QAAQ,EAAE,IAAI;gBACd,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtC,CAAA;YAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAA;YACnD,MAAM,UAAU,GAAG,QAAQ;gBACzB,CAAC,CAAC,YAAY,CAAC;oBACX,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;wBACxB,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;wBACnC,UAAU,EAAE,CAAC;qBACd,CAAC;iBACH,CAAC;gBACJ,CAAC,CAAC,MAAM,CAAA;YACV,MAAM,MAAM,GACV,QAAQ,IAAI,CAAC,QAAQ;gBACnB,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE;gBACrB,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAChB,UAAU,EACV,WAAW,EACX,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CACjE,CAAA;YACP,MAAM,MAAM,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAEzD,2FAA2F;YAC3F,IACE,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC;gBAC3C,MAAM,CAAC,GAAG;gBACV,CAAC,MAAM,CAAC,iBAAiB;gBAEzB,MAAM,CAAC,GAAG,IAAI,MAAO,CAAA;YACvB,IAAI,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;gBACjD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YAE5C,MAAM,SAAS,GACb,QAAQ;gBACR,CAAC,OAAO,CAAC,QAAQ;gBACjB,CAAC,MAAM,aAAa,CAAC;oBACnB,MAAM,EAAE,UAAU,CAAC,IAA2B;oBAC9C,WAAW,EAAE,MAAM;oBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,CAAC,CAAC,CAAA;YACL,IAAI,CAAC,SAAS;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YAEzE,MAAM,KAAK,GACT,OAAO,UAAU,CAAC,kBAAkB,KAAK,QAAQ;gBACjD,UAAU,CAAC,kBAAkB,KAAK,IAAI,CAAA;YAExC,MAAM,OAAO,GAAG,SAAS;gBACvB,CAAC,CAAC,QAAQ;oBACR,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;oBAClD,CAAC,CAAC,OAAO,CAAC,OAAO;wBACf,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;wBACtD,CAAC,CAAC,SAAS;gBACf,CAAC,CAAC,SAAS,CAAA;YAEb,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC3C,OAAO,MAAM,CAAC,SAAS,CAAA;gBACvB,IAAI,CAAC,MAAM,CAAC,IAAI;oBAAE,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,IAAe,CAAA;gBAC1D,UAAU,CAAC,GAAG,CACZ,OAAO,EACP,eAAe,CAAC,sBAAsB,CACpC,eAAe,CAAC,IAAI,CAAC,MAAe,CAAC,EACrC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CACxB,CACF,CAAA;YACH,CAAC;YACD,OAAO;gBACL,GAAG,MAAM;gBACT,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/B,EAAE,EAAE,KAAK,CAAC,sBAAsB,CAC9B,MAAsC,CACvC;gBACD,YAAY,EAAE;oBACZ,GAAG,MAAM,CAAC,YAAY;oBACtB,SAAS,EAAE,QAAQ;wBACjB,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC;wBAC/C,CAAC,CAAC,CAAC,CAAC,OAAO;oBACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChC;aACF,CAAA;QACH,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO;YACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACxC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAO,CAAC,CAAC,CAA4B,CAAA;YACxE,IACE,CAAC,QAAQ;gBACT,CAAC,OAAO,CAAC,OAAO;gBAChB,OAAO,UAAU,CAAC,QAAQ,KAAK,QAAQ;gBACvC,UAAU,CAAC,QAAQ,KAAK,KAAK;gBAC7B,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS;gBAC/B,CAAC,OAAO,UAAU,CAAC,kBAAkB,KAAK,QAAQ;oBAChD,UAAU,CAAC,kBAAkB,KAAK,IAAI,CAAC;gBAEzC,OAAO,SAAS,CAAA;YAClB,MAAM,WAAW,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAC9D,MAAM,OAAO,GAAG,eAAe,CAAC,sBAAsB,CACpD,eAAe,CAAC,IAAI,CAAC,WAAoB,CAAC,EAC1C,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAY,EAAE,CAC7D,CAAA;YACD,IAAI,OAAO,KAAK,QAAQ;gBACtB,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;oBACvC,OAAO,EAAE,iDAAiD;iBAC3D,CAAC,CAAA;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,MAAM,EAAE,UAAU,CAAC,IAA2B;gBAC9C,WAAW;gBACX,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;aAC/B,CAAC,CAAA;YACF,IAAI,MAAM,CAAC,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ;gBACvD,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,GAAG,MAAM,CAAC,kBAAkB,CAAA;YAC1E,MAAM,EAAE,GAAG,KAAK,CAAC,sBAAsB,CACrC,MAAM,CAAC,WAA2C,CACnD,CAAA;YACD,OAAO,EAAE,CAAC,iBAA2C,CAAA;QACvD,CAAC;KACF,CAAA;AACH,CAAC;AAwBD,yDAAyD;AACzD,MAAM,eAAe,GAAG;IACtB,gBAAgB,EAAE,mBAAmB;IACrC,gBAAgB,EAAE,mBAAmB;IACrC,qBAAqB,EAAE,wBAAwB;IAC/C,oBAAoB,EAAE,uBAAuB;IAC7C,qBAAqB,EAAE,iCAAiC;CACO,CAAA;AAEjE,oEAAoE;AACpE,qEAAqE;AACrE,SAAS,UAAU,CAAC,OAA2B;IAC7C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IACtC,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxB,CAAA;AACH,CAAC;AAsBD,mEAAmE;AACnE,qEAAqE;AACrE,KAAK,UAAU,aAAa,CAAC,OAA8B;IACzD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC1B,iEAAiE;IACjE,oDAAoD;IACpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;QAC7B,GAAG,WAAW;QACd,IAAI,EAAE,MAAM;KACqB,CAAC,CAAA;IACpC,OAAO,OAAO,KAAK,IAAI,CAAA;AACzB,CAAC;AAaD,oFAAoF;AACpF,SAAS,sBAAsB,CAAC,UAAyB;IACvD,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAA;IACjE,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IACvD,OAAO,CACL,mBAAmB,IAAI,WAAW,IAAI,WAAW,CAAC,iBAAiB,KAAK,IAAI,CAC7E,CAAA;AACH,CAAC;AAED,gGAAgG;AAChG,SAAS,qBAAqB,CAAC,KAA8B;IAC3D,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ;QACvD,OAAO,KAAK,CAAC,GAAG,KAAK,WAAW;QAChC,OAAO,KAAK,CAAC,KAAK,KAAK,WAAW;QAClC,CAAC,OAAO,KAAK,CAAC,YAAY,KAAK,WAAW;YACxC,OAAO,KAAK,CAAC,QAAQ,KAAK,WAAW,CAAC,CACzC,CAAA;AACH,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAqB;IAC9C,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,IAAI,GAAI,WAAW,CAAC,IAA4B,IAAI,MAAM,CAAA;IAChE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,gBAAgB,EAAE,GAAG,WAAW,CAAA;IACzD,MAAM,QAAQ,GAAG,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAA;IAE9C,IAAI,CAAC,QAAQ,CAAC,IAAI;QAChB,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;YACvC,OAAO,EAAE,+DAA+D;SACzE,CAAC,CAAA;IACJ,IAAI,CAAC,OAAO,CAAC,IAAI;QACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAEhE,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACzD,IAAI,OAAO,KAAK,SAAS;QACvB,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;YACvC,OAAO,EAAE,gEAAgE;SAC1E,CAAC,CAAA;IAEJ,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,QAAiB,CAAC,CAAA;IACxD,MAAM,WAAW,GAAG,eAAe,CAAC,sBAAsB,CAAC,QAAQ,EAAE;QACnE,MAAM,EAAE,QAAQ,CAAC,IAAI;KACtB,CAAC,CAAA;IACF,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;IAChC,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,CACtC,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAC1C,CAAA;IACD,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;IAEhC,yHAAyH;IACzH,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAsC,CAAA;IACnE,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;QACrD,OAAO;QACP,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,QAAQ,CAAC,IAAI;QACrB,WAAW;QACX,WAAW,EAAE,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,CAAC;KACxE,CAAC,CAAA;IAEF,OAAO;QACL,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,WAAW,EAAE,EAAE,GAAG,QAAQ,EAAE,iBAAiB,EAAE;KAChD,CAAA;AACH,CAAC;AAqBD,+FAA+F;AAC/F,qEAAqE;AACrE,KAAK,UAAU,oBAAoB,CAAC,OAAqC;IACvE,MAAM,EACJ,OAAO,EACP,QAAQ,EAAE,eAAe,EACzB,SAAS,EACT,MAAM,EACN,OAAO,EACP,QAAQ,GACT,GAAG,OAAO,CAAA;IACX,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAgC,CAAA;IAErE,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,UAAU,CAAC;QACjD,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;YACvC,OAAO,EAAE,oDAAoD;SAC9D,CAAC,CAAA;IAEJ,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IACvD,8FAA8F;IAC9F,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAA;IAEjD,yEAAyE;IACzE,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,MAAM;QACnC,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;YACvC,OAAO,EACL,oEAAoE;SACvE,CAAC,CAAA;IACJ,IAAI,CAAC,OAAO,CAAC,IAAI;QACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAEhE,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,cAAc,GAClB,MAAM,CAAC,KACR,EAAE,QAAQ,CAAA;IACX,MAAM,QAAQ,GACX,WAAW,CAAC,QAAuC;QACpD,eAAe;QACf,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClD,cAAc,CAAA;IAChB,MAAM,qBAAqB,GAAG,QAAQ;QACpC,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE;QAC9B,CAAC,CAAC,WAAW,CAAA;IAEf,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,qBAAuD,CACxD,CAAA;QACD,IAAI,OAAO,KAAK,IAAI;YAClB,MAAM,IAAI,WAAW,CAAC,kBAAkB,CACtC,OAAO,KAAK,KAAK;gBACf,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE;gBACtC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CACnE,CAAA;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,qBAA8B,CAAC,CAAA;IACrE,MAAM,WAAW,GAAG,eAAe,CAAC,sBAAsB,CAAC,QAAQ,EAAE;QACnE,MAAM;KACP,CAAC,CAAA;IACF,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,CACtC,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAC1C,CAAA;IACD,MAAM,qBAAqB,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE;QAChE,iBAAiB;QACjB,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC,CAAA;IAEF,2EAA2E;IAC3E,8DAA8D;IAC9D,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;QACrD,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM;QACN,MAAM;QACN,WAAW;QACX,WAAW,EAAE,qBAAqB;QAClC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;KACvD,CAAC,CAAA;IAEF,wFAAwF;IACxF,MAAM,MAAM,GACV,MAAM,KAAK,wBAAwB;QACjC,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,MAAM,EAAE,MAAe;YACvB,MAAM,EAAE;gBACN,qBAAqB;gBACrB,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAC3B;SACX,CAAC,CAAA;IACR,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AAC1E,CAAC;AAwDD,MAAM,KAAW,mBAAmB,CA6InC;AA7ID,WAAiB,mBAAmB;IAMlC,gFAAgF;IAChF,SAAgB,SAAS,CAAC,KAAa,EAAE,UAAmB,EAAE;QAC5D,IAAI,GAAQ,CAAA;QACZ,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;gBACvC,OAAO,EAAE,wBAAwB;aAClC,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,IAAI,CAAA;QAChD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YACvD,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;gBACvC,OAAO,EAAE,iCAAiC;aAC3C,CAAC,CAAA;QACJ,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAC3C,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;gBACvC,OAAO,EAAE,iCAAiC;aAC3C,CAAC,CAAA;QACJ,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChD,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC;gBACvC,OAAO,EAAE,6BAA6B;aACvC,CAAC,CAAA;QAEJ,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAA;QACjB,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAA;QACjB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAA;QACb,OAAO,GAAG,CAAC,IAAI,CAAA;IACjB,CAAC;IA5Be,6BAAS,YA4BxB,CAAA;IAED,SAAS,gBAAgB,CAAC,QAAgB;QACxC,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAA;QACpE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,IAAI;YAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QACrC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QACtB,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAED,SAAS,iBAAiB,CAAC,QAAgB;QACzC,OAAO,QAAQ;aACZ,WAAW,EAAE;aACb,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;aACvB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IACnB,CAAC;IAED,SAAS,SAAS,CAChB,KAAa;QAEb,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,OAAO,SAAS,CAAA;QAClB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QACjD,IACE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC;YAEzE,OAAO,SAAS,CAAA;QAClB,OAAO,OAA2C,CAAA;IACpD,CAAC;IAED,SAAS,YAAY,CAAC,KAAuC;QAC3D,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG;YAAE,OAAO,IAAI,CAAA;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAA;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QACvC,OAAO,CAAC,IAAI,GAAG,CAAA;IACjB,CAAC;IAED,SAAS,SAAS,CAChB,KAAa;QAIb,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAEvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACxE,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAEjC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;QAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;QAExC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAC/D,CAAA;QACD,IACE,OAAO,CAAC,IAAI,CACV,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,CAC/D;YAED,OAAO,SAAS,CAAA;QAClB,OAAO,OASN,CAAA;IACH,CAAC;IAED,SAAS,YAAY,CACnB,KAAuE;QAEvE,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;QACjB,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAClD,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YACjE,OAAO,IAAI,CAAA;QACb,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;QACxC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;QACxC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;QACxC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;QAExC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QAChC,OAAO,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC1C,CAAC;IAED,SAAS,YAAY,CACnB,KAAuE;QAEvE,MAAM,MAAM,GACV,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAA;QACtE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAA;QAChE,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAA;QAC5C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC,EA7IgB,mBAAmB,KAAnB,mBAAmB,QA6InC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { RpcResponse } from 'ox';
|
|
2
|
+
import { tokens as tokenSets } from '../../../tokens/sets.js';
|
|
3
|
+
import * as Actions from '../../actions/index.js';
|
|
4
|
+
import * as Store from './cache.js';
|
|
5
|
+
import * as Preflight from './preflight.js';
|
|
6
|
+
import * as Utils from './utils.js';
|
|
7
|
+
import { extractCalls, getVirtualAddressTargets } from './virtualAddress.js';
|
|
8
|
+
export function create() {
|
|
9
|
+
return {
|
|
10
|
+
async handleRequest(context, next) {
|
|
11
|
+
const { request } = context;
|
|
12
|
+
if (request.method !== 'eth_fillTransaction')
|
|
13
|
+
return next();
|
|
14
|
+
const parameters = request.params[0];
|
|
15
|
+
const transaction = Utils.normalizeFillTransactionRequest(parameters);
|
|
16
|
+
if (transaction.feeToken) {
|
|
17
|
+
context.request = {
|
|
18
|
+
...request,
|
|
19
|
+
params: [
|
|
20
|
+
Utils.formatFillTransactionRequest(context.client, transaction),
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
return next();
|
|
24
|
+
}
|
|
25
|
+
const tokens = await context.resolveTokens();
|
|
26
|
+
const candidates = [
|
|
27
|
+
...tokens,
|
|
28
|
+
...callTargetTokens(transaction).filter((token) => !tokens.some((candidate) => candidate.toLowerCase() === token.toLowerCase())),
|
|
29
|
+
];
|
|
30
|
+
const resolved = transaction.feePayer
|
|
31
|
+
? { feeToken: tokens[0], virtualAddresses: undefined }
|
|
32
|
+
: await resolveFeeToken(context.client, {
|
|
33
|
+
account: transaction.from,
|
|
34
|
+
feeToken: transaction.feeToken,
|
|
35
|
+
targets: getVirtualAddressTargets(extractCalls(transaction)),
|
|
36
|
+
tokens: candidates,
|
|
37
|
+
});
|
|
38
|
+
const { feeToken, virtualAddresses } = resolved;
|
|
39
|
+
const selected = { ...transaction, ...(feeToken ? { feeToken } : {}) };
|
|
40
|
+
context.request = {
|
|
41
|
+
...request,
|
|
42
|
+
params: [Utils.formatFillTransactionRequest(context.client, selected)],
|
|
43
|
+
};
|
|
44
|
+
await next();
|
|
45
|
+
const result = context.result;
|
|
46
|
+
context.result = {
|
|
47
|
+
...result,
|
|
48
|
+
// Unsigned sponsored estimates can omit the fee token selected by this plugin.
|
|
49
|
+
tx: {
|
|
50
|
+
...result.tx,
|
|
51
|
+
...(!result.tx.feeToken && feeToken ? { feeToken } : {}),
|
|
52
|
+
},
|
|
53
|
+
...(virtualAddresses
|
|
54
|
+
? { capabilities: { ...result.capabilities, virtualAddresses } }
|
|
55
|
+
: {}),
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export async function getDefaultTokens(chainId) {
|
|
61
|
+
return tokenSets.tempo.flatMap((token) => {
|
|
62
|
+
const address = token.addresses[chainId];
|
|
63
|
+
return address ? [address] : [];
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** Resolves a funded fee-token candidate. @internal */
|
|
67
|
+
export async function resolveFeeToken(client, options) {
|
|
68
|
+
const { feeToken, account, exclude, tokens } = options;
|
|
69
|
+
if (feeToken || !account)
|
|
70
|
+
return { feeToken, virtualAddresses: undefined };
|
|
71
|
+
const candidates = [
|
|
72
|
+
...new Set(tokens?.map((token) => token.toLowerCase())),
|
|
73
|
+
];
|
|
74
|
+
if (candidates.length > 100)
|
|
75
|
+
throw new RpcResponse.InvalidParamsError({
|
|
76
|
+
message: 'Fee-token candidates exceed the limit of 100 tokens.',
|
|
77
|
+
});
|
|
78
|
+
const { preferredToken, preferredBalance, balances, virtualAddresses } = await Preflight.read(client, {
|
|
79
|
+
account,
|
|
80
|
+
tokens: candidates,
|
|
81
|
+
targets: options.targets,
|
|
82
|
+
});
|
|
83
|
+
const minimumBalance = options.minimumBalance ?? 1n;
|
|
84
|
+
if (preferredToken.toLowerCase() !== exclude?.toLowerCase() &&
|
|
85
|
+
preferredBalance >= minimumBalance)
|
|
86
|
+
return { feeToken: preferredToken, virtualAddresses };
|
|
87
|
+
let best;
|
|
88
|
+
for (const asset of balances) {
|
|
89
|
+
if (asset.balance < minimumBalance ||
|
|
90
|
+
asset.address.toLowerCase() === exclude?.toLowerCase())
|
|
91
|
+
continue;
|
|
92
|
+
if (!best || asset.balance > best.balance)
|
|
93
|
+
best = asset;
|
|
94
|
+
}
|
|
95
|
+
return { feeToken: best?.address, virtualAddresses };
|
|
96
|
+
}
|
|
97
|
+
/** Includes call-target TIP20 tokens as fee candidates, allowing transfers to pay fees with the transferred token. */
|
|
98
|
+
function callTargetTokens(transaction) {
|
|
99
|
+
const calls = transaction.calls;
|
|
100
|
+
if (!calls)
|
|
101
|
+
return [];
|
|
102
|
+
const out = [];
|
|
103
|
+
const seen = new Set();
|
|
104
|
+
for (const c of calls) {
|
|
105
|
+
if (!c.to)
|
|
106
|
+
continue;
|
|
107
|
+
const lower = c.to.toLowerCase();
|
|
108
|
+
if (!lower.startsWith('0x20c0'))
|
|
109
|
+
continue;
|
|
110
|
+
if (seen.has(lower))
|
|
111
|
+
continue;
|
|
112
|
+
seen.add(lower);
|
|
113
|
+
out.push(c.to);
|
|
114
|
+
if (out.length > 100)
|
|
115
|
+
throw new RpcResponse.InvalidParamsError({
|
|
116
|
+
message: 'Fee-token candidates exceed the limit of 100 tokens.',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
export async function resolveTokenMetadata(client, options) {
|
|
122
|
+
const { token, tokenMetadata, store } = options;
|
|
123
|
+
const meta = tokenMetadata?.[token] ?? tokenMetadata?.[token.toLowerCase()];
|
|
124
|
+
// Tempo simulation metadata covers TIP-20 tokens, whose decimals are always six.
|
|
125
|
+
if (token.toLowerCase().startsWith('0x20c0') && meta)
|
|
126
|
+
return { decimals: 6, symbol: meta.symbol, name: meta.name };
|
|
127
|
+
// TIP-20 metadata (decimals/symbol/name) is immutable per token, so cache
|
|
128
|
+
// long-term. Skips the multicall RPC on cache hits.
|
|
129
|
+
const fetcher = () => Actions.token.getMetadata(client, { token });
|
|
130
|
+
const fallback = store
|
|
131
|
+
? await Store.memoize(fetcher, {
|
|
132
|
+
key: `tokenMetadata:${client.chain?.id ?? 0}:${token.toLowerCase()}`,
|
|
133
|
+
store,
|
|
134
|
+
ttl: 24 * 60 * 60 * 1000,
|
|
135
|
+
})
|
|
136
|
+
: await fetcher();
|
|
137
|
+
return {
|
|
138
|
+
decimals: fallback.decimals ?? 6,
|
|
139
|
+
symbol: meta?.symbol || fallback.symbol,
|
|
140
|
+
name: meta?.name || fallback.name,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=feeToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feeToken.js","sourceRoot":"","sources":["../../../../tempo/internal/relay/feeToken.ts"],"names":[],"mappings":"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"}
|