@debridge-finance/borderless-validation-sdk 0.0.10 → 0.0.12
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/README.md +11 -4
- package/dist/cjs/graylists/evm/token-permit-metadata.js +39 -6
- package/dist/cjs/graylists/evm/token-permit-metadata.js.map +1 -1
- package/dist/cjs/helpers/quote-mode.js +23 -0
- package/dist/cjs/helpers/quote-mode.js.map +1 -0
- package/dist/cjs/helpers/synthetic-native-wrap.js +13 -13
- package/dist/cjs/helpers/synthetic-native-wrap.js.map +1 -1
- package/dist/cjs/helpers/zod.js +42 -0
- package/dist/cjs/helpers/zod.js.map +1 -1
- package/dist/cjs/types/request.js +42 -36
- package/dist/cjs/types/request.js.map +1 -1
- package/dist/cjs/types/response.js +23 -23
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +24 -2
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/validations/accumulative-token.js +7 -1
- package/dist/cjs/validations/accumulative-token.js.map +1 -1
- package/dist/cjs/validations/evm-op-budget.js +10 -3
- package/dist/cjs/validations/evm-op-budget.js.map +1 -1
- package/dist/cjs/validations/evm-op-wrap.js +8 -3
- package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
- package/dist/cjs/validations/evm-permit.js +4 -3
- package/dist/cjs/validations/evm-permit.js.map +1 -1
- package/dist/cjs/validations/evm-required-actions.js +3 -3
- package/dist/cjs/validations/evm-required-actions.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-metamask.js +4 -3
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/cjs/validations/external-call.js +13 -22
- package/dist/cjs/validations/external-call.js.map +1 -1
- package/dist/cjs/validations/hooks-common.js +82 -26
- package/dist/cjs/validations/hooks-common.js.map +1 -1
- package/dist/cjs/validations/intent-tokens.js +4 -0
- package/dist/cjs/validations/intent-tokens.js.map +1 -1
- package/dist/cjs/validations/refill.js +587 -0
- package/dist/cjs/validations/refill.js.map +1 -0
- package/dist/cjs/validations/required-actions.js +2 -2
- package/dist/cjs/validations/required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-hook.js +35 -14
- package/dist/cjs/validations/solana-hook.js.map +1 -1
- package/dist/cjs/validations/solana-op-budget.js +20 -10
- package/dist/cjs/validations/solana-op-budget.js.map +1 -1
- package/dist/cjs/validations/solana-op-wrap.js +8 -3
- package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
- package/dist/cjs/validations/solana-required-actions.js +3 -3
- package/dist/cjs/validations/solana-required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-transaction.js +81 -45
- package/dist/cjs/validations/solana-transaction.js.map +1 -1
- package/dist/cjs/validations/trade-grouping.js +11 -0
- package/dist/cjs/validations/trade-grouping.js.map +1 -1
- package/dist/cjs/validator.js +43 -20
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/environment-config.js +89 -56
- package/dist/cjs/whitelists/environment-config.js.map +1 -1
- package/dist/cjs/whitelists/evm/index.js +3 -1
- package/dist/cjs/whitelists/evm/index.js.map +1 -1
- package/dist/cjs/whitelists/solana/intent-signature.js +6 -10
- package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/esm/graylists/evm/token-permit-metadata.js +39 -6
- package/dist/esm/graylists/evm/token-permit-metadata.js.map +1 -1
- package/dist/esm/helpers/quote-mode.js +17 -0
- package/dist/esm/helpers/quote-mode.js.map +1 -0
- package/dist/esm/helpers/synthetic-native-wrap.js +13 -13
- package/dist/esm/helpers/synthetic-native-wrap.js.map +1 -1
- package/dist/esm/helpers/zod.js +36 -0
- package/dist/esm/helpers/zod.js.map +1 -1
- package/dist/esm/types/request.js +43 -37
- package/dist/esm/types/request.js.map +1 -1
- package/dist/esm/types/response.js +24 -24
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +24 -2
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/validations/accumulative-token.js +7 -1
- package/dist/esm/validations/accumulative-token.js.map +1 -1
- package/dist/esm/validations/evm-op-budget.js +10 -3
- package/dist/esm/validations/evm-op-budget.js.map +1 -1
- package/dist/esm/validations/evm-op-wrap.js +8 -3
- package/dist/esm/validations/evm-op-wrap.js.map +1 -1
- package/dist/esm/validations/evm-permit.js +4 -3
- package/dist/esm/validations/evm-permit.js.map +1 -1
- package/dist/esm/validations/evm-required-actions.js +3 -3
- package/dist/esm/validations/evm-required-actions.js.map +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/esm/validations/external-call.js +13 -22
- package/dist/esm/validations/external-call.js.map +1 -1
- package/dist/esm/validations/hooks-common.js +83 -27
- package/dist/esm/validations/hooks-common.js.map +1 -1
- package/dist/esm/validations/intent-tokens.js +4 -0
- package/dist/esm/validations/intent-tokens.js.map +1 -1
- package/dist/esm/validations/refill.js +584 -0
- package/dist/esm/validations/refill.js.map +1 -0
- package/dist/esm/validations/required-actions.js +2 -2
- package/dist/esm/validations/required-actions.js.map +1 -1
- package/dist/esm/validations/solana-hook.js +35 -14
- package/dist/esm/validations/solana-hook.js.map +1 -1
- package/dist/esm/validations/solana-op-budget.js +20 -10
- package/dist/esm/validations/solana-op-budget.js.map +1 -1
- package/dist/esm/validations/solana-op-wrap.js +8 -3
- package/dist/esm/validations/solana-op-wrap.js.map +1 -1
- package/dist/esm/validations/solana-required-actions.js +3 -3
- package/dist/esm/validations/solana-required-actions.js.map +1 -1
- package/dist/esm/validations/solana-transaction.js +81 -45
- package/dist/esm/validations/solana-transaction.js.map +1 -1
- package/dist/esm/validations/trade-grouping.js +11 -0
- package/dist/esm/validations/trade-grouping.js.map +1 -1
- package/dist/esm/validator.js +44 -21
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/environment-config.js +84 -52
- package/dist/esm/whitelists/environment-config.js.map +1 -1
- package/dist/esm/whitelists/evm/index.js +1 -0
- package/dist/esm/whitelists/evm/index.js.map +1 -1
- package/dist/esm/whitelists/solana/intent-signature.js +4 -9
- package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/types/graylists/evm/token-permit-metadata.d.ts +2 -2
- package/dist/types/graylists/evm/token-permit-metadata.d.ts.map +1 -1
- package/dist/types/helpers/quote-mode.d.ts +6 -0
- package/dist/types/helpers/quote-mode.d.ts.map +1 -0
- package/dist/types/helpers/synthetic-native-wrap.d.ts.map +1 -1
- package/dist/types/helpers/zod.d.ts +6 -0
- package/dist/types/helpers/zod.d.ts.map +1 -1
- package/dist/types/types/request.d.ts +88 -88
- package/dist/types/types/request.d.ts.map +1 -1
- package/dist/types/types/response.d.ts +71 -71
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +23 -2
- package/dist/types/types/validation.d.ts.map +1 -1
- package/dist/types/validations/accumulative-token.d.ts +1 -1
- package/dist/types/validations/accumulative-token.d.ts.map +1 -1
- package/dist/types/validations/evm-op-budget.d.ts +1 -1
- package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
- package/dist/types/validations/evm-op-wrap.d.ts +1 -1
- package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/evm-required-actions.d.ts +1 -1
- package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts +1 -0
- package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
- package/dist/types/validations/external-call.d.ts +2 -2
- package/dist/types/validations/external-call.d.ts.map +1 -1
- package/dist/types/validations/hooks-common.d.ts.map +1 -1
- package/dist/types/validations/refill.d.ts +4 -0
- package/dist/types/validations/refill.d.ts.map +1 -0
- package/dist/types/validations/required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-op-budget.d.ts +1 -1
- package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
- package/dist/types/validations/solana-op-wrap.d.ts +1 -1
- package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/solana-required-actions.d.ts +1 -1
- package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-transaction.d.ts +2 -2
- package/dist/types/validations/solana-transaction.d.ts.map +1 -1
- package/dist/types/validations/trade-grouping.d.ts +2 -0
- package/dist/types/validations/trade-grouping.d.ts.map +1 -1
- package/dist/types/validator.d.ts.map +1 -1
- package/dist/types/whitelists/environment-config.d.ts +17 -0
- package/dist/types/whitelists/environment-config.d.ts.map +1 -1
- package/dist/types/whitelists/evm/index.d.ts +1 -0
- package/dist/types/whitelists/evm/index.d.ts.map +1 -1
- package/dist/types/whitelists/solana/intent-signature.d.ts +1 -0
- package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
import { zeroAddress } from "viem";
|
|
2
|
+
import { ChainEngine, CostItemType, EvmActionKind, EvmActionOperation, ViolationCode, } from "../types/index.js";
|
|
3
|
+
import { addressEquals, getChainEngine, isNativeToken, TRON_NATIVE_ADDRESS, } from "../helpers/address.js";
|
|
4
|
+
import { getHexByteLength, isHexByteString } from "../helpers/hex.js";
|
|
5
|
+
import { parseIntegerString } from "../helpers/integer.js";
|
|
6
|
+
import { SYSTEM_PROGRAM } from "../whitelists/solana/index.js";
|
|
7
|
+
const EVM_SIGNATURE_BYTE_LENGTH = 65;
|
|
8
|
+
const REFILL_MESSAGE_CHECKED_FIELDS = ["intentId", "intentTimestamp", "trades"];
|
|
9
|
+
var RefillScope;
|
|
10
|
+
(function (RefillScope) {
|
|
11
|
+
RefillScope["Intent"] = "intent";
|
|
12
|
+
RefillScope["Hook"] = "hook";
|
|
13
|
+
})(RefillScope || (RefillScope = {}));
|
|
14
|
+
// Refill actions are API-signed but still executable payload. Validate every
|
|
15
|
+
// deterministic invariant that can be checked from the public request/response.
|
|
16
|
+
export function validateRefill(request, response, contexts, quoteMode) {
|
|
17
|
+
const occurrences = collectRefillOccurrences(response, contexts);
|
|
18
|
+
const intentRefillCount = occurrences.filter(item => isIntentPreSignedMessage(item)).length;
|
|
19
|
+
return [
|
|
20
|
+
...validateUseRefillFlag(response.useRefill, intentRefillCount),
|
|
21
|
+
...validateRefillOccurrences(request, occurrences, quoteMode),
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
function collectRefillOccurrences(response, contexts) {
|
|
25
|
+
return [
|
|
26
|
+
...collectIntentRefillOccurrences(response.intents, contexts),
|
|
27
|
+
...collectHookRefillOccurrences(response),
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
function collectIntentRefillOccurrences(intents, contexts) {
|
|
31
|
+
const occurrences = [];
|
|
32
|
+
const contextByIntentIndex = new Map(contexts.map(context => [context.intentIndex, context]));
|
|
33
|
+
for (let intentIndex = 0; intentIndex < intents.length; intentIndex++) {
|
|
34
|
+
const intentPayload = intents[intentIndex];
|
|
35
|
+
const context = contextByIntentIndex.get(intentIndex);
|
|
36
|
+
const actions = intentPayload.requiredActions;
|
|
37
|
+
for (let i = 0; i < actions.length; i++) {
|
|
38
|
+
if (!isRefillCandidate(actions[i]))
|
|
39
|
+
continue;
|
|
40
|
+
occurrences.push({
|
|
41
|
+
action: actions[i],
|
|
42
|
+
path: `response.intents[${intentIndex}].requiredActions[${i}]`,
|
|
43
|
+
scope: RefillScope.Intent,
|
|
44
|
+
intentPayload,
|
|
45
|
+
context,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return occurrences;
|
|
50
|
+
}
|
|
51
|
+
function collectHookRefillOccurrences(response) {
|
|
52
|
+
return [
|
|
53
|
+
...collectHookListRefillOccurrences(response.preHooks, "preHooks"),
|
|
54
|
+
...collectHookListRefillOccurrences(response.postHooks, "postHooks"),
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
function collectHookListRefillOccurrences(hooks, listName) {
|
|
58
|
+
const occurrences = [];
|
|
59
|
+
for (let i = 0; i < hooks.length; i++) {
|
|
60
|
+
for (let j = 0; j < hooks[i].requiredActions.length; j++) {
|
|
61
|
+
const action = hooks[i].requiredActions[j];
|
|
62
|
+
if (!isRefillCandidate(action))
|
|
63
|
+
continue;
|
|
64
|
+
occurrences.push({
|
|
65
|
+
action,
|
|
66
|
+
path: `response.${listName}[${i}].requiredActions[${j}]`,
|
|
67
|
+
scope: RefillScope.Hook,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return occurrences;
|
|
72
|
+
}
|
|
73
|
+
// HIGH: response.useRefill is a derived activation flag, not a request echo.
|
|
74
|
+
function validateUseRefillFlag(useRefill, intentRefillCount) {
|
|
75
|
+
const expected = intentRefillCount > 0;
|
|
76
|
+
if (useRefill === expected)
|
|
77
|
+
return [];
|
|
78
|
+
return [{
|
|
79
|
+
code: ViolationCode.RefillUseRefillFlagMismatch,
|
|
80
|
+
message: "response.useRefill does not match intent-scope PreSignedMessage presence",
|
|
81
|
+
path: "response.useRefill",
|
|
82
|
+
expected,
|
|
83
|
+
actual: useRefill,
|
|
84
|
+
}];
|
|
85
|
+
}
|
|
86
|
+
function validateRefillOccurrences(request, occurrences, quoteMode) {
|
|
87
|
+
const violations = [];
|
|
88
|
+
for (let i = 0; i < occurrences.length; i++) {
|
|
89
|
+
violations.push(...validateRefillOccurrence(request, occurrences[i], i, occurrences, quoteMode));
|
|
90
|
+
}
|
|
91
|
+
return violations;
|
|
92
|
+
}
|
|
93
|
+
function validateRefillOccurrence(request, occurrence, occurrenceIndex, allOccurrences, quoteMode) {
|
|
94
|
+
const dataResult = validateRefillData(occurrence.action, occurrence.path);
|
|
95
|
+
return [
|
|
96
|
+
...validateRequestGating(request, occurrence),
|
|
97
|
+
...validateBinding(occurrence),
|
|
98
|
+
...validateScope(occurrence),
|
|
99
|
+
...validateDuplicate(occurrence, occurrenceIndex, allOccurrences),
|
|
100
|
+
...validateAaAndPermitCompatibility(request, occurrence),
|
|
101
|
+
...validateApplicability(occurrence),
|
|
102
|
+
...dataResult.violations,
|
|
103
|
+
...validateSignature(dataResult.data, occurrence.path),
|
|
104
|
+
...validateMessage(dataResult.data, occurrence, quoteMode),
|
|
105
|
+
...validateActionCosts(occurrence),
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
function isIntentPreSignedMessage(occurrence) {
|
|
109
|
+
return occurrence.scope === RefillScope.Intent && isPreSignedMessageType(occurrence.action);
|
|
110
|
+
}
|
|
111
|
+
function isRefillCandidate(action) {
|
|
112
|
+
return isPreSignedMessageType(action) || hasSignRefillOperation(action);
|
|
113
|
+
}
|
|
114
|
+
function isPreSignedMessageType(action) {
|
|
115
|
+
return action.type === EvmActionKind.PreSignedMessage;
|
|
116
|
+
}
|
|
117
|
+
function hasSignRefillOperation(action) {
|
|
118
|
+
return action.actions.includes(EvmActionOperation.SignRefill);
|
|
119
|
+
}
|
|
120
|
+
// HIGH: refill may activate only when the original request explicitly enabled it.
|
|
121
|
+
function validateRequestGating(request, occurrence) {
|
|
122
|
+
if (request.useRefill === true)
|
|
123
|
+
return [];
|
|
124
|
+
return [{
|
|
125
|
+
code: ViolationCode.SignRefillForbiddenWithoutRequest,
|
|
126
|
+
message: "SignRefill action is forbidden when request.useRefill is not true",
|
|
127
|
+
path: occurrence.path,
|
|
128
|
+
expected: true,
|
|
129
|
+
actual: request.useRefill ?? false,
|
|
130
|
+
}];
|
|
131
|
+
}
|
|
132
|
+
// HIGH: PreSignedMessage and SignRefill must be bound to each other exactly.
|
|
133
|
+
function validateBinding(occurrence) {
|
|
134
|
+
return [
|
|
135
|
+
...validatePreSignedActions(occurrence),
|
|
136
|
+
...validateSignRefillType(occurrence),
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
function validatePreSignedActions(occurrence) {
|
|
140
|
+
if (!isPreSignedMessageType(occurrence.action))
|
|
141
|
+
return [];
|
|
142
|
+
if (hasOnlySignRefillOperation(occurrence.action))
|
|
143
|
+
return [];
|
|
144
|
+
return [{
|
|
145
|
+
code: ViolationCode.SignRefillActionsInvalid,
|
|
146
|
+
message: "PreSignedMessage action must contain exactly SignRefill operation",
|
|
147
|
+
path: `${occurrence.path}.actions`,
|
|
148
|
+
expected: [EvmActionOperation.SignRefill],
|
|
149
|
+
actual: occurrence.action.actions,
|
|
150
|
+
}];
|
|
151
|
+
}
|
|
152
|
+
function validateSignRefillType(occurrence) {
|
|
153
|
+
if (!hasSignRefillOperation(occurrence.action))
|
|
154
|
+
return [];
|
|
155
|
+
if (isPreSignedMessageType(occurrence.action))
|
|
156
|
+
return [];
|
|
157
|
+
return [{
|
|
158
|
+
code: ViolationCode.SignRefillWrongActionType,
|
|
159
|
+
message: "SignRefill operation must be carried by PreSignedMessage action type",
|
|
160
|
+
path: `${occurrence.path}.type`,
|
|
161
|
+
expected: EvmActionKind.PreSignedMessage,
|
|
162
|
+
actual: occurrence.action.type,
|
|
163
|
+
}];
|
|
164
|
+
}
|
|
165
|
+
function hasOnlySignRefillOperation(action) {
|
|
166
|
+
return action.actions.length === 1 && action.actions[0] === EvmActionOperation.SignRefill;
|
|
167
|
+
}
|
|
168
|
+
// HIGH: SignRefill is intent-scope only; hook-scope occurrences are invalid.
|
|
169
|
+
function validateScope(occurrence) {
|
|
170
|
+
if (occurrence.scope === RefillScope.Intent)
|
|
171
|
+
return [];
|
|
172
|
+
return [{
|
|
173
|
+
code: ViolationCode.SignRefillForbiddenInHooks,
|
|
174
|
+
message: "SignRefill action is forbidden in hook requiredActions",
|
|
175
|
+
path: occurrence.path,
|
|
176
|
+
expected: RefillScope.Intent,
|
|
177
|
+
actual: occurrence.scope,
|
|
178
|
+
}];
|
|
179
|
+
}
|
|
180
|
+
// HIGH: submit accepts at most one refill entry; multiple entries are unsafe.
|
|
181
|
+
function validateDuplicate(occurrence, occurrenceIndex, allOccurrences) {
|
|
182
|
+
if (occurrenceIndex === 0 || allOccurrences.length <= 1)
|
|
183
|
+
return [];
|
|
184
|
+
return [{
|
|
185
|
+
code: ViolationCode.DuplicateSignRefillAction,
|
|
186
|
+
message: "bundle contains more than one SignRefill action",
|
|
187
|
+
path: occurrence.path,
|
|
188
|
+
expected: 1,
|
|
189
|
+
actual: allOccurrences.length,
|
|
190
|
+
}];
|
|
191
|
+
}
|
|
192
|
+
function validateAaAndPermitCompatibility(request, occurrence) {
|
|
193
|
+
return [
|
|
194
|
+
...validateAaCompatibility(request, occurrence),
|
|
195
|
+
...validatePermitCompatibility(occurrence),
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
// HIGH: refill is a non-AA approve-flow action.
|
|
199
|
+
function validateAaCompatibility(request, occurrence) {
|
|
200
|
+
if (!request.enableAccountAbstraction)
|
|
201
|
+
return [];
|
|
202
|
+
return [{
|
|
203
|
+
code: ViolationCode.SignRefillForbiddenWithAA,
|
|
204
|
+
message: "SignRefill action is forbidden when enableAccountAbstraction=true",
|
|
205
|
+
path: occurrence.path,
|
|
206
|
+
expected: false,
|
|
207
|
+
actual: request.enableAccountAbstraction,
|
|
208
|
+
}];
|
|
209
|
+
}
|
|
210
|
+
// HIGH: refill is skipped when Permit or Permit2 is selected for the same intent.
|
|
211
|
+
function validatePermitCompatibility(occurrence) {
|
|
212
|
+
const intentPayload = occurrence.intentPayload;
|
|
213
|
+
// Safe skip: hook-scope refill occurrences are reported by `validateScope`.
|
|
214
|
+
if (intentPayload === undefined)
|
|
215
|
+
return [];
|
|
216
|
+
const permitAction = intentPayload.requiredActions.find(isPermitAction);
|
|
217
|
+
if (permitAction === undefined)
|
|
218
|
+
return [];
|
|
219
|
+
return [{
|
|
220
|
+
code: ViolationCode.SignRefillForbiddenWithPermit,
|
|
221
|
+
message: "SignRefill action is forbidden in an intent with Permit or Permit2",
|
|
222
|
+
path: occurrence.path,
|
|
223
|
+
expected: undefined,
|
|
224
|
+
actual: permitAction.type,
|
|
225
|
+
}];
|
|
226
|
+
}
|
|
227
|
+
function isPermitAction(action) {
|
|
228
|
+
return action.type === EvmActionKind.Permit || action.type === EvmActionKind.Permit2;
|
|
229
|
+
}
|
|
230
|
+
function validateApplicability(occurrence) {
|
|
231
|
+
const context = occurrence.context;
|
|
232
|
+
// Safe skip: missing intent context is reported by trade matching/grouping validators.
|
|
233
|
+
if (context === undefined)
|
|
234
|
+
return [];
|
|
235
|
+
return [
|
|
236
|
+
...validateSourceEngine(context, occurrence.path),
|
|
237
|
+
...validateNonNativeInput(context, occurrence.path),
|
|
238
|
+
];
|
|
239
|
+
}
|
|
240
|
+
// HIGH: refill is emitted only by the EVM intent-action flow.
|
|
241
|
+
function validateSourceEngine(context, path) {
|
|
242
|
+
const actualEngine = getChainEngine(context.tradeGroup.realChainId);
|
|
243
|
+
if (actualEngine === ChainEngine.EVM)
|
|
244
|
+
return [];
|
|
245
|
+
return [{
|
|
246
|
+
code: ViolationCode.SignRefillSourceChainUnsupported,
|
|
247
|
+
message: "SignRefill action is allowed only for EVM source intents",
|
|
248
|
+
path,
|
|
249
|
+
expected: ChainEngine.EVM,
|
|
250
|
+
actual: actualEngine,
|
|
251
|
+
}];
|
|
252
|
+
}
|
|
253
|
+
// HIGH: refill is meaningful only when at least one source input is non-native.
|
|
254
|
+
function validateNonNativeInput(context, path) {
|
|
255
|
+
const responseTrades = context.intentResponseTrades.filter(isResponseTrade);
|
|
256
|
+
// Safe skip: missing response trade mapping is reported by trade matching/count validators.
|
|
257
|
+
if (responseTrades.length === 0)
|
|
258
|
+
return [];
|
|
259
|
+
if (responseTrades.some(trade => !isNativeResponseInput(trade, context.tradeGroup.realChainId))) {
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
return [{
|
|
263
|
+
code: ViolationCode.SignRefillNativeInputOnly,
|
|
264
|
+
message: "SignRefill action is forbidden when all source inputs are native tokens",
|
|
265
|
+
path,
|
|
266
|
+
expected: false,
|
|
267
|
+
actual: true,
|
|
268
|
+
}];
|
|
269
|
+
}
|
|
270
|
+
function isResponseTrade(trade) {
|
|
271
|
+
return trade !== undefined;
|
|
272
|
+
}
|
|
273
|
+
function isNativeResponseInput(trade, realChainId) {
|
|
274
|
+
return isNativeToken(trade.srcChainTokenIn.address, realChainId);
|
|
275
|
+
}
|
|
276
|
+
// MEDIUM: PreSignedMessage data must be the refill data object.
|
|
277
|
+
function validateRefillData(action, actionPath) {
|
|
278
|
+
if (!isEvmAction(action) || !isRefillData(action.data)) {
|
|
279
|
+
return {
|
|
280
|
+
violations: [{
|
|
281
|
+
code: ViolationCode.SignRefillDataInvalid,
|
|
282
|
+
message: "SignRefill action data must contain message and signature strings",
|
|
283
|
+
path: `${actionPath}.data`,
|
|
284
|
+
expected: ["message", "signature"],
|
|
285
|
+
actual: action.data,
|
|
286
|
+
}],
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
return { data: action.data, violations: [] };
|
|
290
|
+
}
|
|
291
|
+
function isEvmAction(action) {
|
|
292
|
+
return Object.values(EvmActionKind).includes(action.type);
|
|
293
|
+
}
|
|
294
|
+
function isRefillData(data) {
|
|
295
|
+
if (typeof data !== "object" || data === null)
|
|
296
|
+
return false;
|
|
297
|
+
const candidate = data;
|
|
298
|
+
return typeof candidate.message === "string" && typeof candidate.signature === "string";
|
|
299
|
+
}
|
|
300
|
+
// MEDIUM: signature must be a standard non-empty EVM personal-sign signature.
|
|
301
|
+
function validateSignature(data, actionPath) {
|
|
302
|
+
// Safe skip: invalid/missing refill data is reported by `validateRefillData`.
|
|
303
|
+
if (data === undefined)
|
|
304
|
+
return [];
|
|
305
|
+
const byteLength = getHexByteLength(data.signature);
|
|
306
|
+
if (isHexByteString(data.signature) && byteLength === EVM_SIGNATURE_BYTE_LENGTH)
|
|
307
|
+
return [];
|
|
308
|
+
return [{
|
|
309
|
+
code: ViolationCode.SignRefillSignatureInvalid,
|
|
310
|
+
message: "SignRefill signature must be a 65-byte hex byte string",
|
|
311
|
+
path: `${actionPath}.data.signature`,
|
|
312
|
+
expected: { byteLength: EVM_SIGNATURE_BYTE_LENGTH },
|
|
313
|
+
actual: { value: data.signature, byteLength },
|
|
314
|
+
}];
|
|
315
|
+
}
|
|
316
|
+
function validateMessage(data, occurrence, quoteMode) {
|
|
317
|
+
// Safe skip: invalid/missing refill data is reported by `validateRefillData`.
|
|
318
|
+
if (data === undefined)
|
|
319
|
+
return [];
|
|
320
|
+
if (data.message.length === 0)
|
|
321
|
+
return [messageDataInvalid(occurrence.path, data.message)];
|
|
322
|
+
const parsed = parseRefillMessage(data.message);
|
|
323
|
+
const fieldResult = validateRequiredMessageFields(parsed, occurrence.path);
|
|
324
|
+
if (quoteMode || occurrence.context === undefined)
|
|
325
|
+
return fieldResult.violations;
|
|
326
|
+
return [
|
|
327
|
+
...fieldResult.violations,
|
|
328
|
+
...validateMessageSemantics(fieldResult.values, occurrence),
|
|
329
|
+
];
|
|
330
|
+
}
|
|
331
|
+
function messageDataInvalid(actionPath, actual) {
|
|
332
|
+
return {
|
|
333
|
+
code: ViolationCode.SignRefillDataInvalid,
|
|
334
|
+
message: "SignRefill message must be a non-empty string",
|
|
335
|
+
path: `${actionPath}.data.message`,
|
|
336
|
+
actual,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
function parseRefillMessage(message) {
|
|
340
|
+
const parsed = { intentId: [], intentTimestamp: [], trades: [] };
|
|
341
|
+
for (const line of message.split("\n")) {
|
|
342
|
+
for (const field of REFILL_MESSAGE_CHECKED_FIELDS) {
|
|
343
|
+
const prefix = `${field}:`;
|
|
344
|
+
if (line.startsWith(prefix)) {
|
|
345
|
+
parsed[field].push(line.slice(prefix.length));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return parsed;
|
|
350
|
+
}
|
|
351
|
+
// MEDIUM: refill message fields must be line-based and unambiguous.
|
|
352
|
+
function validateRequiredMessageFields(parsed, actionPath) {
|
|
353
|
+
const values = {
|
|
354
|
+
intentId: undefined,
|
|
355
|
+
intentTimestamp: undefined,
|
|
356
|
+
trades: undefined,
|
|
357
|
+
};
|
|
358
|
+
const violations = [];
|
|
359
|
+
for (const field of REFILL_MESSAGE_CHECKED_FIELDS) {
|
|
360
|
+
if (parsed[field].length === 1) {
|
|
361
|
+
values[field] = parsed[field][0];
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
violations.push(messageFieldCountViolation(actionPath, field, parsed[field]));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return { values, violations };
|
|
368
|
+
}
|
|
369
|
+
function messageFieldCountViolation(actionPath, field, actualValues) {
|
|
370
|
+
return {
|
|
371
|
+
code: actualValues.length === 0
|
|
372
|
+
? ViolationCode.SignRefillMessageFieldMissing
|
|
373
|
+
: ViolationCode.SignRefillMessageFieldDuplicate,
|
|
374
|
+
message: `SignRefill message must contain exactly one ${field} line`,
|
|
375
|
+
path: `${actionPath}.data.message`,
|
|
376
|
+
expected: 1,
|
|
377
|
+
actual: actualValues.length,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
function validateMessageSemantics(values, occurrence) {
|
|
381
|
+
const context = occurrence.context;
|
|
382
|
+
// Safe skip: absence of context is handled by `validateMessage` with field-only validation.
|
|
383
|
+
if (context === undefined)
|
|
384
|
+
return [];
|
|
385
|
+
return [
|
|
386
|
+
...validateMessageIntentId(values.intentId, occurrence.path, context),
|
|
387
|
+
...validateMessageIntentTimestamp(values.intentTimestamp, occurrence.path, context),
|
|
388
|
+
...validateMessageTrades(values.trades, occurrence.path, context),
|
|
389
|
+
];
|
|
390
|
+
}
|
|
391
|
+
// HIGH: signed refill intentId must bind to the same response intent.
|
|
392
|
+
function validateMessageIntentId(value, actionPath, context) {
|
|
393
|
+
// Safe skip: missing/ambiguous message fields are reported by `validateRequiredMessageFields`.
|
|
394
|
+
if (value === undefined)
|
|
395
|
+
return [];
|
|
396
|
+
if (value === context.intentPayload.intent.intentId)
|
|
397
|
+
return [];
|
|
398
|
+
return [{
|
|
399
|
+
code: ViolationCode.SignRefillMessageIntentIdMismatch,
|
|
400
|
+
message: "SignRefill message intentId does not match response intentId",
|
|
401
|
+
path: `${actionPath}.data.message`,
|
|
402
|
+
expected: context.intentPayload.intent.intentId,
|
|
403
|
+
actual: value,
|
|
404
|
+
}];
|
|
405
|
+
}
|
|
406
|
+
// HIGH: signed refill timestamp must bind to the same response intent timestamp.
|
|
407
|
+
function validateMessageIntentTimestamp(value, actionPath, context) {
|
|
408
|
+
// Safe skip: missing/ambiguous message fields are reported by `validateRequiredMessageFields`.
|
|
409
|
+
if (value === undefined)
|
|
410
|
+
return [];
|
|
411
|
+
try {
|
|
412
|
+
const actual = parseIntegerString(value);
|
|
413
|
+
const expected = BigInt(context.intentPayload.intent.intentTimestamp);
|
|
414
|
+
if (actual === expected)
|
|
415
|
+
return [];
|
|
416
|
+
return [messageTimestampViolation(actionPath, expected.toString(), actual.toString())];
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
return [messageTimestampViolation(actionPath, String(context.intentPayload.intent.intentTimestamp), value, error)];
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
function messageTimestampViolation(actionPath, expected, actual, error) {
|
|
423
|
+
return {
|
|
424
|
+
code: ViolationCode.SignRefillMessageIntentTimestampMismatch,
|
|
425
|
+
message: "SignRefill message intentTimestamp does not match response intentTimestamp",
|
|
426
|
+
path: `${actionPath}.data.message`,
|
|
427
|
+
expected,
|
|
428
|
+
actual,
|
|
429
|
+
details: error,
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
// HIGH: signed refill trades must bind to the same response-side source trades.
|
|
433
|
+
function validateMessageTrades(value, actionPath, context) {
|
|
434
|
+
// Safe skip: missing/ambiguous message fields are reported by `validateRequiredMessageFields`.
|
|
435
|
+
if (value === undefined)
|
|
436
|
+
return [];
|
|
437
|
+
const expected = serializeExpectedRefillTrades(context.intentResponseTrades);
|
|
438
|
+
const realChainId = context.tradeGroup.realChainId;
|
|
439
|
+
if (expected === undefined || !refillTradesEqual(value, context.intentResponseTrades, realChainId)) {
|
|
440
|
+
return [{
|
|
441
|
+
code: ViolationCode.SignRefillMessageTradesMismatch,
|
|
442
|
+
message: "SignRefill message trades do not match response source trades",
|
|
443
|
+
path: `${actionPath}.data.message`,
|
|
444
|
+
expected,
|
|
445
|
+
actual: value,
|
|
446
|
+
}];
|
|
447
|
+
}
|
|
448
|
+
return [];
|
|
449
|
+
}
|
|
450
|
+
function serializeExpectedRefillTrades(responseTrades) {
|
|
451
|
+
if (responseTrades.some(trade => trade === undefined))
|
|
452
|
+
return undefined;
|
|
453
|
+
return responseTrades.map(trade => serializeResponseTrade(trade)).join(";");
|
|
454
|
+
}
|
|
455
|
+
function serializeResponseTrade(trade) {
|
|
456
|
+
return [
|
|
457
|
+
trade.srcChainTokenIn.chainId,
|
|
458
|
+
trade.srcChainTokenIn.address,
|
|
459
|
+
trade.srcChainTokenIn.amount,
|
|
460
|
+
].join(":");
|
|
461
|
+
}
|
|
462
|
+
function refillTradesEqual(value, responseTrades, realChainId) {
|
|
463
|
+
if (responseTrades.some(trade => trade === undefined))
|
|
464
|
+
return false;
|
|
465
|
+
const actualEntries = value.length === 0 ? [] : value.split(";");
|
|
466
|
+
if (actualEntries.length !== responseTrades.length)
|
|
467
|
+
return false;
|
|
468
|
+
return actualEntries.every((entry, i) => refillTradeEntryEquals(entry, responseTrades[i], realChainId));
|
|
469
|
+
}
|
|
470
|
+
function refillTradeEntryEquals(entry, responseTrade, realChainId) {
|
|
471
|
+
const parts = entry.split(":");
|
|
472
|
+
if (parts.length !== 3)
|
|
473
|
+
return false;
|
|
474
|
+
try {
|
|
475
|
+
return refillTradePartsEqual(parts, responseTrade, realChainId);
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
function refillTradePartsEqual(parts, responseTrade, realChainId) {
|
|
482
|
+
const expectedChainId = BigInt(responseTrade.srcChainTokenIn.chainId);
|
|
483
|
+
const actualChainId = parseIntegerString(parts[0]);
|
|
484
|
+
const expectedAmount = parseIntegerString(responseTrade.srcChainTokenIn.amount);
|
|
485
|
+
const actualAmount = parseIntegerString(parts[2]);
|
|
486
|
+
return actualChainId === expectedChainId
|
|
487
|
+
&& actualAmount === expectedAmount
|
|
488
|
+
&& addressEquals(realChainId, parts[1], responseTrade.srcChainTokenIn.address);
|
|
489
|
+
}
|
|
490
|
+
// MEDIUM: refill cost metadata must stay on the source native token/network cost axis.
|
|
491
|
+
function validateActionCosts(occurrence) {
|
|
492
|
+
// Safe skip: non-EVM refill candidates cannot carry EVM `actionCosts` and are reported by type/data checks.
|
|
493
|
+
if (!isEvmAction(occurrence.action))
|
|
494
|
+
return [];
|
|
495
|
+
const action = occurrence.action;
|
|
496
|
+
const realChainId = occurrence.context?.tradeGroup.realChainId;
|
|
497
|
+
const violations = [];
|
|
498
|
+
if (action.actionCosts.length === 0) {
|
|
499
|
+
violations.push(emptyActionCostsViolation(occurrence.path));
|
|
500
|
+
}
|
|
501
|
+
for (let i = 0; i < action.actionCosts.length; i++) {
|
|
502
|
+
const costPath = `${occurrence.path}.actionCosts[${i}]`;
|
|
503
|
+
const cost = action.actionCosts[i];
|
|
504
|
+
violations.push(...validateRefillCostType(cost.type, costPath));
|
|
505
|
+
violations.push(...validateRefillCostAmount(cost.amount, costPath));
|
|
506
|
+
// Safe skip: missing intent context is reported by trade matching/grouping validators.
|
|
507
|
+
if (realChainId === undefined)
|
|
508
|
+
continue;
|
|
509
|
+
violations.push(...validateRefillCostChain(cost.costChainId, realChainId, costPath));
|
|
510
|
+
violations.push(...validateRefillCostToken(cost.costTokenAddress, realChainId, costPath));
|
|
511
|
+
}
|
|
512
|
+
return violations;
|
|
513
|
+
}
|
|
514
|
+
function emptyActionCostsViolation(actionPath) {
|
|
515
|
+
return {
|
|
516
|
+
code: ViolationCode.SignRefillActionCostInvalid,
|
|
517
|
+
message: "SignRefill actionCosts must contain at least one network cost item",
|
|
518
|
+
path: `${actionPath}.actionCosts`,
|
|
519
|
+
expected: { minLength: 1 },
|
|
520
|
+
actual: 0,
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
function validateRefillCostType(type, costPath) {
|
|
524
|
+
if (type === CostItemType.NETWORK_COST)
|
|
525
|
+
return [];
|
|
526
|
+
return [{
|
|
527
|
+
code: ViolationCode.SignRefillActionCostInvalid,
|
|
528
|
+
message: "SignRefill action cost type must be NETWORK_COST",
|
|
529
|
+
path: `${costPath}.type`,
|
|
530
|
+
expected: CostItemType.NETWORK_COST,
|
|
531
|
+
actual: type,
|
|
532
|
+
}];
|
|
533
|
+
}
|
|
534
|
+
function validateRefillCostChain(costChainId, realChainId, costPath) {
|
|
535
|
+
if (costChainId === realChainId)
|
|
536
|
+
return [];
|
|
537
|
+
return [{
|
|
538
|
+
code: ViolationCode.SignRefillActionCostChainMismatch,
|
|
539
|
+
message: "SignRefill action costChainId must match the source chain",
|
|
540
|
+
path: `${costPath}.costChainId`,
|
|
541
|
+
expected: realChainId,
|
|
542
|
+
actual: costChainId,
|
|
543
|
+
}];
|
|
544
|
+
}
|
|
545
|
+
function validateRefillCostToken(costTokenAddress, realChainId, costPath) {
|
|
546
|
+
if (isNativeToken(costTokenAddress, realChainId))
|
|
547
|
+
return [];
|
|
548
|
+
return [{
|
|
549
|
+
code: ViolationCode.SignRefillActionCostTokenMismatch,
|
|
550
|
+
message: "SignRefill action costTokenAddress must be the native token",
|
|
551
|
+
path: `${costPath}.costTokenAddress`,
|
|
552
|
+
expected: getNativeTokenAddress(realChainId),
|
|
553
|
+
actual: costTokenAddress,
|
|
554
|
+
}];
|
|
555
|
+
}
|
|
556
|
+
function getNativeTokenAddress(realChainId) {
|
|
557
|
+
const engine = getChainEngine(realChainId);
|
|
558
|
+
if (engine === ChainEngine.Tron)
|
|
559
|
+
return TRON_NATIVE_ADDRESS;
|
|
560
|
+
if (engine === ChainEngine.Solana)
|
|
561
|
+
return SYSTEM_PROGRAM;
|
|
562
|
+
return zeroAddress;
|
|
563
|
+
}
|
|
564
|
+
function validateRefillCostAmount(amount, costPath) {
|
|
565
|
+
try {
|
|
566
|
+
if (parseIntegerString(amount) >= 0n)
|
|
567
|
+
return [];
|
|
568
|
+
return [invalidRefillCostAmount(costPath, amount)];
|
|
569
|
+
}
|
|
570
|
+
catch (error) {
|
|
571
|
+
return [invalidRefillCostAmount(costPath, amount, error)];
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
function invalidRefillCostAmount(costPath, amount, error) {
|
|
575
|
+
return {
|
|
576
|
+
code: ViolationCode.SignRefillActionCostInvalid,
|
|
577
|
+
message: "SignRefill action cost amount must be a non-negative integer string",
|
|
578
|
+
path: `${costPath}.amount`,
|
|
579
|
+
expected: { minimum: "0" },
|
|
580
|
+
actual: amount,
|
|
581
|
+
details: error,
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
//# sourceMappingURL=refill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refill.js","sourceRoot":"","sources":["../../../src/validations/refill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAGH,WAAW,EAEX,YAAY,EACZ,aAAa,EACb,kBAAkB,EAOlB,aAAa,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACH,aAAa,EACb,cAAc,EACd,aAAa,EACb,mBAAmB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,yBAAyB,GAAG,EAAE,CAAC;AACrC,MAAM,6BAA6B,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,CAAU,CAAC;AAEzF,IAAK,WAGJ;AAHD,WAAK,WAAW;IACZ,gCAAiB,CAAA;IACjB,4BAAa,CAAA;AACjB,CAAC,EAHI,WAAW,KAAX,WAAW,QAGf;AAiBD,6EAA6E;AAC7E,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAC1B,OAA8B,EAC9B,QAAgC,EAChC,QAAyB,EACzB,SAAkB;IAElB,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAE5F,OAAO;QACH,GAAG,qBAAqB,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;QAC/D,GAAG,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC;KAChE,CAAC;AACN,CAAC;AAED,SAAS,wBAAwB,CAC7B,QAAgC,EAChC,QAAyB;IAEzB,OAAO;QACH,GAAG,8BAA8B,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC7D,GAAG,4BAA4B,CAAC,QAAQ,CAAC;KAC5C,CAAC;AACN,CAAC;AAED,SAAS,8BAA8B,CACnC,OAAgC,EAChC,QAAyB;IAEzB,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAE9F,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;QACpE,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,aAAa,CAAC,eAAe,CAAC;QAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS;YAE7C,WAAW,CAAC,IAAI,CAAC;gBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClB,IAAI,EAAE,oBAAoB,WAAW,qBAAqB,CAAC,GAAG;gBAC9D,KAAK,EAAE,WAAW,CAAC,MAAM;gBACzB,aAAa;gBACb,OAAO;aACV,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,SAAS,4BAA4B,CAAC,QAAgC;IAClE,OAAO;QACH,GAAG,gCAAgC,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;QAClE,GAAG,gCAAgC,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;KACvE,CAAC;AACN,CAAC;AAED,SAAS,gCAAgC,CACrC,KAAyC,EACzC,QAAkC;IAElC,MAAM,WAAW,GAAuB,EAAE,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAE3C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;gBAAE,SAAS;YAEzC,WAAW,CAAC,IAAI,CAAC;gBACb,MAAM;gBACN,IAAI,EAAE,YAAY,QAAQ,IAAI,CAAC,qBAAqB,CAAC,GAAG;gBACxD,KAAK,EAAE,WAAW,CAAC,IAAI;aAC1B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,6EAA6E;AAC7E,SAAS,qBAAqB,CAAC,SAAkB,EAAE,iBAAyB;IACxE,MAAM,QAAQ,GAAG,iBAAiB,GAAG,CAAC,CAAC;IACvC,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEtC,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,2BAA2B;YAC/C,OAAO,EAAE,0EAA0E;YACnF,IAAI,EAAE,oBAAoB;YAC1B,QAAQ;YACR,MAAM,EAAE,SAAS;SACpB,CAAC,CAAC;AACP,CAAC;AAED,SAAS,yBAAyB,CAC9B,OAA8B,EAC9B,WAA+B,EAC/B,SAAkB;IAElB,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,UAAU,CAAC,IAAI,CACX,GAAG,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAClF,CAAC;IACN,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAS,wBAAwB,CAC7B,OAA8B,EAC9B,UAA4B,EAC5B,eAAuB,EACvB,cAAkC,EAClC,SAAkB;IAElB,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAE1E,OAAO;QACH,GAAG,qBAAqB,CAAC,OAAO,EAAE,UAAU,CAAC;QAC7C,GAAG,eAAe,CAAC,UAAU,CAAC;QAC9B,GAAG,aAAa,CAAC,UAAU,CAAC;QAC5B,GAAG,iBAAiB,CAAC,UAAU,EAAE,eAAe,EAAE,cAAc,CAAC;QACjE,GAAG,gCAAgC,CAAC,OAAO,EAAE,UAAU,CAAC;QACxD,GAAG,qBAAqB,CAAC,UAAU,CAAC;QACpC,GAAG,UAAU,CAAC,UAAU;QACxB,GAAG,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QACtD,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC;QAC1D,GAAG,mBAAmB,CAAC,UAAU,CAAC;KACrC,CAAC;AACN,CAAC;AAED,SAAS,wBAAwB,CAAC,UAA4B;IAC1D,OAAO,UAAU,CAAC,KAAK,KAAK,WAAW,CAAC,MAAM,IAAI,sBAAsB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,iBAAiB,CAAC,MAA8B;IACrD,OAAO,sBAAsB,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA8B;IAC1D,OAAO,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,gBAAgB,CAAC;AAC1D,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA8B;IAC1D,OAAQ,MAAM,CAAC,OAAoB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAChF,CAAC;AAED,kFAAkF;AAClF,SAAS,qBAAqB,CAC1B,OAA8B,EAC9B,UAA4B;IAE5B,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAE1C,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,iCAAiC;YACrD,OAAO,EAAE,mEAAmE;YAC5E,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;SACrC,CAAC,CAAC;AACP,CAAC;AAED,6EAA6E;AAC7E,SAAS,eAAe,CAAC,UAA4B;IACjD,OAAO;QACH,GAAG,wBAAwB,CAAC,UAAU,CAAC;QACvC,GAAG,sBAAsB,CAAC,UAAU,CAAC;KACxC,CAAC;AACN,CAAC;AAED,SAAS,wBAAwB,CAAC,UAA4B;IAC1D,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1D,IAAI,0BAA0B,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7D,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,wBAAwB;YAC5C,OAAO,EAAE,mEAAmE;YAC5E,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,UAAU;YAClC,QAAQ,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC;YACzC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO;SACpC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,sBAAsB,CAAC,UAA4B;IACxD,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1D,IAAI,sBAAsB,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzD,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,yBAAyB;YAC7C,OAAO,EAAE,sEAAsE;YAC/E,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,OAAO;YAC/B,QAAQ,EAAE,aAAa,CAAC,gBAAgB;YACxC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;SACjC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,0BAA0B,CAAC,MAA8B;IAC9D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,UAAU,CAAC;AAC9F,CAAC;AAED,6EAA6E;AAC7E,SAAS,aAAa,CAAC,UAA4B;IAC/C,IAAI,UAAU,CAAC,KAAK,KAAK,WAAW,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvD,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,0BAA0B;YAC9C,OAAO,EAAE,wDAAwD;YACjE,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,QAAQ,EAAE,WAAW,CAAC,MAAM;YAC5B,MAAM,EAAE,UAAU,CAAC,KAAK;SAC3B,CAAC,CAAC;AACP,CAAC;AAED,8EAA8E;AAC9E,SAAS,iBAAiB,CACtB,UAA4B,EAC5B,eAAuB,EACvB,cAAkC;IAElC,IAAI,eAAe,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnE,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,yBAAyB;YAC7C,OAAO,EAAE,iDAAiD;YAC1D,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,cAAc,CAAC,MAAM;SAChC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,gCAAgC,CACrC,OAA8B,EAC9B,UAA4B;IAE5B,OAAO;QACH,GAAG,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC;QAC/C,GAAG,2BAA2B,CAAC,UAAU,CAAC;KAC7C,CAAC;AACN,CAAC;AAED,gDAAgD;AAChD,SAAS,uBAAuB,CAC5B,OAA8B,EAC9B,UAA4B;IAE5B,IAAI,CAAC,OAAO,CAAC,wBAAwB;QAAE,OAAO,EAAE,CAAC;IAEjD,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,yBAAyB;YAC7C,OAAO,EAAE,mEAAmE;YAC5E,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,OAAO,CAAC,wBAAwB;SAC3C,CAAC,CAAC;AACP,CAAC;AAED,kFAAkF;AAClF,SAAS,2BAA2B,CAAC,UAA4B;IAC7D,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;IAC/C,4EAA4E;IAC5E,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAE3C,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxE,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1C,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,6BAA6B;YACjD,OAAO,EAAE,oEAAoE;YAC7E,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,YAAY,CAAC,IAAI;SAC5B,CAAC,CAAC;AACP,CAAC;AAED,SAAS,cAAc,CAAC,MAA8B;IAClD,OAAO,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,OAAO,CAAC;AACzF,CAAC;AAED,SAAS,qBAAqB,CAAC,UAA4B;IACvD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IAEnC,uFAAuF;IACvF,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO;QACH,GAAG,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;QACjD,GAAG,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;KACtD,CAAC;AACN,CAAC;AAED,8DAA8D;AAC9D,SAAS,oBAAoB,CAAC,OAAsB,EAAE,IAAY;IAC9D,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,YAAY,KAAK,WAAW,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEhD,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,gCAAgC;YACpD,OAAO,EAAE,0DAA0D;YACnE,IAAI;YACJ,QAAQ,EAAE,WAAW,CAAC,GAAG;YACzB,MAAM,EAAE,YAAY;SACvB,CAAC,CAAC;AACP,CAAC;AAED,gFAAgF;AAChF,SAAS,sBAAsB,CAAC,OAAsB,EAAE,IAAY;IAChE,MAAM,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAE5E,4FAA4F;IAC5F,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE3C,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAC9F,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,yBAAyB;YAC7C,OAAO,EAAE,yEAAyE;YAClF,IAAI;YACJ,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,IAAI;SACf,CAAC,CAAC;AACP,CAAC;AAED,SAAS,eAAe,CAAC,KAAgC;IACrD,OAAO,KAAK,KAAK,SAAS,CAAC;AAC/B,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAoB,EAAE,WAAoB;IACrE,OAAO,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACrE,CAAC;AAED,gEAAgE;AAChE,SAAS,kBAAkB,CACvB,MAA8B,EAC9B,UAAkB;IAElB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,OAAO;YACH,UAAU,EAAE,CAAC;oBACT,IAAI,EAAE,aAAa,CAAC,qBAAqB;oBACzC,OAAO,EAAE,mEAAmE;oBAC5E,IAAI,EAAE,GAAG,UAAU,OAAO;oBAC1B,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;oBAClC,MAAM,EAAE,MAAM,CAAC,IAAI;iBACtB,CAAC;SACL,CAAC;IACN,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,MAA8B;IAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAqB,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CAAC,IAAa;IAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAE5D,MAAM,SAAS,GAAG,IAAkD,CAAC;IACrE,OAAO,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC;AAC5F,CAAC;AAED,8EAA8E;AAC9E,SAAS,iBAAiB,CACtB,IAAyC,EACzC,UAAkB;IAElB,8EAA8E;IAC9E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,UAAU,KAAK,yBAAyB;QAAE,OAAO,EAAE,CAAC;IAE3F,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,0BAA0B;YAC9C,OAAO,EAAE,wDAAwD;YACjE,IAAI,EAAE,GAAG,UAAU,iBAAiB;YACpC,QAAQ,EAAE,EAAE,UAAU,EAAE,yBAAyB,EAAE;YACnD,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE;SAChD,CAAC,CAAC;AACP,CAAC;AAED,SAAS,eAAe,CACpB,IAAyC,EACzC,UAA4B,EAC5B,SAAkB;IAElB,8EAA8E;IAC9E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAElC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAE1F,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,6BAA6B,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3E,IAAI,SAAS,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,UAAU,CAAC;IAEjF,OAAO;QACH,GAAG,WAAW,CAAC,UAAU;QACzB,GAAG,wBAAwB,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC;KAC9D,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB,EAAE,MAAc;IAC1D,OAAO;QACH,IAAI,EAAE,aAAa,CAAC,qBAAqB;QACzC,OAAO,EAAE,+CAA+C;QACxD,IAAI,EAAE,GAAG,UAAU,eAAe;QAClC,MAAM;KACT,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACvC,MAAM,MAAM,GAA+B,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAE7F,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,6BAA6B,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC;YAE3B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AASD,oEAAoE;AACpE,SAAS,6BAA6B,CAClC,MAAkC,EAClC,UAAkB;IAElB,MAAM,MAAM,GAA8B;QACtC,QAAQ,EAAE,SAAS;QACnB,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE,SAAS;KACpB,CAAC;IAEF,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,6BAA6B,EAAE,CAAC;QAChD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACJ,UAAU,CAAC,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,0BAA0B,CAC/B,UAAkB,EAClB,KAAa,EACb,YAAsB;IAEtB,OAAO;QACH,IAAI,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC;YAC3B,CAAC,CAAC,aAAa,CAAC,6BAA6B;YAC7C,CAAC,CAAC,aAAa,CAAC,+BAA+B;QACnD,OAAO,EAAE,+CAA+C,KAAK,OAAO;QACpE,IAAI,EAAE,GAAG,UAAU,eAAe;QAClC,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,YAAY,CAAC,MAAM;KAC9B,CAAC;AACN,CAAC;AAED,SAAS,wBAAwB,CAC7B,MAAiC,EACjC,UAA4B;IAE5B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,4FAA4F;IAC5F,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO;QACH,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;QACrE,GAAG,8BAA8B,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;QACnF,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;KACpE,CAAC;AACN,CAAC;AAED,sEAAsE;AACtE,SAAS,uBAAuB,CAC5B,KAAyB,EACzB,UAAkB,EAClB,OAAsB;IAEtB,+FAA+F;IAC/F,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,KAAK,KAAK,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAE/D,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,iCAAiC;YACrD,OAAO,EAAE,8DAA8D;YACvE,IAAI,EAAE,GAAG,UAAU,eAAe;YAClC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ;YAC/C,MAAM,EAAE,KAAK;SAChB,CAAC,CAAC;AACP,CAAC;AAED,iFAAiF;AACjF,SAAS,8BAA8B,CACnC,KAAyB,EACzB,UAAkB,EAClB,OAAsB;IAEtB,+FAA+F;IAC/F,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEnC,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACtE,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEnC,OAAO,CAAC,yBAAyB,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,yBAAyB,CAC7B,UAAU,EACV,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,EACpD,KAAK,EACL,KAAK,CACR,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAC9B,UAAkB,EAClB,QAAgB,EAChB,MAAc,EACd,KAAe;IAEf,OAAO;QACH,IAAI,EAAE,aAAa,CAAC,wCAAwC;QAC5D,OAAO,EAAE,4EAA4E;QACrF,IAAI,EAAE,GAAG,UAAU,eAAe;QAClC,QAAQ;QACR,MAAM;QACN,OAAO,EAAE,KAAK;KACjB,CAAC;AACN,CAAC;AAED,gFAAgF;AAChF,SAAS,qBAAqB,CAC1B,KAAyB,EACzB,UAAkB,EAClB,OAAsB;IAEtB,+FAA+F;IAC/F,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,QAAQ,GAAG,6BAA6B,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;IAEnD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,EAAE,WAAW,CAAC,EAAE,CAAC;QACjG,OAAO,CAAC;gBACJ,IAAI,EAAE,aAAa,CAAC,+BAA+B;gBACnD,OAAO,EAAE,+DAA+D;gBACxE,IAAI,EAAE,GAAG,UAAU,eAAe;gBAClC,QAAQ;gBACR,MAAM,EAAE,KAAK;aAChB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC;AAED,SAAS,6BAA6B,CAClC,cAA6C;IAE7C,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAExE,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAAC,KAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAoB;IAChD,OAAO;QACH,KAAK,CAAC,eAAe,CAAC,OAAO;QAC7B,KAAK,CAAC,eAAe,CAAC,OAAO;QAC7B,KAAK,CAAC,eAAe,CAAC,MAAM;KAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACtB,KAAa,EACb,cAA6C,EAC7C,WAAoB;IAEpB,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpE,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,aAAa,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAEjE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED,SAAS,sBAAsB,CAC3B,KAAa,EACb,aAA4B,EAC5B,WAAoB;IAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAErC,IAAI,CAAC;QACD,OAAO,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC1B,KAAe,EACf,aAA4B,EAC5B,WAAoB;IAEpB,MAAM,eAAe,GAAG,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,kBAAkB,CAAC,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChF,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAElD,OAAO,aAAa,KAAK,eAAe;WACjC,YAAY,KAAK,cAAc;WAC/B,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACvF,CAAC;AAED,uFAAuF;AACvF,SAAS,mBAAmB,CAAC,UAA4B;IACrD,4GAA4G;IAC5G,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAE/C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACjC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC;IAC/D,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChE,UAAU,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QAEpE,uFAAuF;QACvF,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QAExC,UAAU,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;QACrF,UAAU,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAS,yBAAyB,CAAC,UAAkB;IACjD,OAAO;QACH,IAAI,EAAE,aAAa,CAAC,2BAA2B;QAC/C,OAAO,EAAE,oEAAoE;QAC7E,IAAI,EAAE,GAAG,UAAU,cAAc;QACjC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;QAC1B,MAAM,EAAE,CAAC;KACZ,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAkB,EAAE,QAAgB;IAChE,IAAI,IAAI,KAAK,YAAY,CAAC,YAAY;QAAE,OAAO,EAAE,CAAC;IAElD,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,2BAA2B;YAC/C,OAAO,EAAE,kDAAkD;YAC3D,IAAI,EAAE,GAAG,QAAQ,OAAO;YACxB,QAAQ,EAAE,YAAY,CAAC,YAAY;YACnC,MAAM,EAAE,IAAI;SACf,CAAC,CAAC;AACP,CAAC;AAED,SAAS,uBAAuB,CAC5B,WAAmB,EACnB,WAAoB,EACpB,QAAgB;IAEhB,IAAI,WAAW,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAE3C,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,iCAAiC;YACrD,OAAO,EAAE,2DAA2D;YACpE,IAAI,EAAE,GAAG,QAAQ,cAAc;YAC/B,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,WAAW;SACtB,CAAC,CAAC;AACP,CAAC;AAED,SAAS,uBAAuB,CAC5B,gBAAwB,EACxB,WAAoB,EACpB,QAAgB;IAEhB,IAAI,aAAa,CAAC,gBAAgB,EAAE,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5D,OAAO,CAAC;YACJ,IAAI,EAAE,aAAa,CAAC,iCAAiC;YACrD,OAAO,EAAE,6DAA6D;YACtE,IAAI,EAAE,GAAG,QAAQ,mBAAmB;YACpC,QAAQ,EAAE,qBAAqB,CAAC,WAAW,CAAC;YAC5C,MAAM,EAAE,gBAAgB;SAC3B,CAAC,CAAC;AACP,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAoB;IAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,WAAW,CAAC,IAAI;QAAE,OAAO,mBAAmB,CAAC;IAC5D,IAAI,MAAM,KAAK,WAAW,CAAC,MAAM;QAAE,OAAO,cAAc,CAAC;IACzD,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAc,EAAE,QAAgB;IAC9D,IAAI,CAAC;QACD,IAAI,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAEhD,OAAO,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAe;IAC9E,OAAO;QACH,IAAI,EAAE,aAAa,CAAC,2BAA2B;QAC/C,OAAO,EAAE,qEAAqE;QAC9E,IAAI,EAAE,GAAG,QAAQ,SAAS;QAC1B,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QAC1B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,KAAK;KACjB,CAAC;AACN,CAAC"}
|
|
@@ -18,11 +18,11 @@ export function validateRequiredActions(request, response, contexts, quoteMode,
|
|
|
18
18
|
// a group into multiple intents.
|
|
19
19
|
if (getChainEngine(realChainId) === ChainEngine.Solana) {
|
|
20
20
|
const solanaActions = filterSolanaActions(allActions);
|
|
21
|
-
violations.push(...validateSolanaRequiredActions(request, solanaActions, basePath, realChainId, quoteMode, ctx.intentTrades, ctx.intentResponseTrades, ctx.tradeGroup.srcChainAuthorityAddress, ctx.intentPayload.intent, envConfig));
|
|
21
|
+
violations.push(...validateSolanaRequiredActions(request, solanaActions, basePath, realChainId, quoteMode, ctx.intentTrades, ctx.intentResponseTrades, ctx.tradeGroup.srcChainAuthorityAddress, ctx.intentPayload.intent, envConfig, ctx.quoteTradeSubsetUnverifiable));
|
|
22
22
|
}
|
|
23
23
|
else {
|
|
24
24
|
const evmActions = filterEvmActions(allActions);
|
|
25
|
-
violations.push(...validateEvmRequiredActions(request, response, evmActions, basePath, realChainId, quoteMode, ctx.intentPayload.intent, ctx.intentTrades, ctx.intentResponseTrades, ctx.tradeGroup.srcChainAuthorityAddress, envConfig, syntheticNativeWrapMode));
|
|
25
|
+
violations.push(...validateEvmRequiredActions(request, response, evmActions, basePath, realChainId, quoteMode, ctx.intentPayload.intent, ctx.intentTrades, ctx.intentResponseTrades, ctx.tradeGroup.srcChainAuthorityAddress, envConfig, syntheticNativeWrapMode, ctx.quoteTradeSubsetUnverifiable));
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
return violations;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"required-actions.js","sourceRoot":"","sources":["../../../src/validations/required-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,aAAa,EAIb,aAAa,EACb,kBAAkB,EAElB,gBAAgB,EAChB,qBAAqB,GAGxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAG1E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,uBAAuB,CACnC,OAA8B,EAC9B,QAAgC,EAChC,QAAyB,EACzB,SAAkB,EAClB,SAA4B,EAC5B,uBAAgC;IAEhC,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,oBAAoB,GAAG,CAAC,WAAW,GAAG,CAAC;QACxD,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QACvC,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,eAAe,CAAC;QAErD,UAAU,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QAErF,6DAA6D;QAC7D,mEAAmE;QACnE,gDAAgD;QAChD,gEAAgE;QAChE,sEAAsE;QACtE,iCAAiC;QACjC,IAAI,cAAc,CAAC,WAAW,CAAC,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,aAAa,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACtD,UAAU,CAAC,IAAI,CACX,GAAG,6BAA6B,CAC5B,OAAO,EACP,aAAa,EACb,QAAQ,EACR,WAAW,EACX,SAAS,EACT,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,oBAAoB,EACxB,GAAG,CAAC,UAAU,CAAC,wBAAwB,EACvC,GAAG,CAAC,aAAa,CAAC,MAAM,EACxB,SAAS,
|
|
1
|
+
{"version":3,"file":"required-actions.js","sourceRoot":"","sources":["../../../src/validations/required-actions.ts"],"names":[],"mappings":"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"}
|