@debridge-finance/borderless-validation-sdk 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -0
- package/dist/cjs/helpers/address.js +53 -18
- package/dist/cjs/helpers/address.js.map +1 -1
- package/dist/cjs/helpers/evm-action.js +3 -3
- package/dist/cjs/helpers/evm-action.js.map +1 -1
- package/dist/cjs/helpers/evm-dln-hook-pack.js +87 -0
- package/dist/cjs/helpers/evm-dln-hook-pack.js.map +1 -0
- package/dist/cjs/helpers/evm-gas-compensation-tx.js +102 -0
- package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -0
- package/dist/cjs/helpers/evm-intent-id.js +27 -13
- package/dist/cjs/helpers/evm-intent-id.js.map +1 -1
- package/dist/cjs/helpers/evm-trade-amounts.js +36 -1
- package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/cjs/helpers/gas-compensation.js +36 -0
- package/dist/cjs/helpers/gas-compensation.js.map +1 -0
- package/dist/cjs/helpers/hex.js +24 -0
- package/dist/cjs/helpers/hex.js.map +1 -0
- package/dist/cjs/helpers/placeholder.js +174 -0
- package/dist/cjs/helpers/placeholder.js.map +1 -0
- package/dist/cjs/helpers/sets.js +13 -0
- package/dist/cjs/helpers/sets.js.map +1 -0
- package/dist/cjs/types/enums.js +32 -2
- package/dist/cjs/types/enums.js.map +1 -1
- package/dist/cjs/types/request.js +36 -3
- package/dist/cjs/types/request.js.map +1 -1
- package/dist/cjs/types/response.js +125 -5
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +81 -10
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/validations/compensation-hook.js +203 -0
- package/dist/cjs/validations/compensation-hook.js.map +1 -0
- package/dist/cjs/validations/evm-caveats.js +4 -14
- package/dist/cjs/validations/evm-caveats.js.map +1 -1
- package/dist/cjs/validations/evm-op-budget.js +13 -10
- package/dist/cjs/validations/evm-op-budget.js.map +1 -1
- package/dist/cjs/validations/evm-op-hook.js +410 -3
- package/dist/cjs/validations/evm-op-hook.js.map +1 -1
- package/dist/cjs/validations/evm-op-wrap.js +10 -7
- package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
- package/dist/cjs/validations/evm-required-actions.js +7 -9
- package/dist/cjs/validations/evm-required-actions.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-metamask.js +17 -94
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-shared.js +116 -0
- package/dist/cjs/validations/evm-sign712-shared.js.map +1 -0
- package/dist/cjs/validations/evm-sign7702.js +34 -22
- package/dist/cjs/validations/evm-sign7702.js.map +1 -1
- package/dist/cjs/validations/hooks-common.js +252 -37
- package/dist/cjs/validations/hooks-common.js.map +1 -1
- package/dist/cjs/validations/intent-destinations.js +197 -0
- package/dist/cjs/validations/intent-destinations.js.map +1 -0
- package/dist/cjs/validations/intent-tokens.js +347 -0
- package/dist/cjs/validations/intent-tokens.js.map +1 -0
- package/dist/cjs/validations/intent.js +288 -0
- package/dist/cjs/validations/intent.js.map +1 -0
- package/dist/cjs/validations/required-actions.js +7 -7
- package/dist/cjs/validations/required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-hook.js +33 -22
- package/dist/cjs/validations/solana-hook.js.map +1 -1
- package/dist/cjs/validations/solana-op-budget.js +56 -18
- package/dist/cjs/validations/solana-op-budget.js.map +1 -1
- package/dist/cjs/validations/solana-op-wrap.js +46 -13
- 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 +5 -5
- package/dist/cjs/validations/solana-transaction.js.map +1 -1
- package/dist/cjs/validations/trade-grouping.js +139 -1
- package/dist/cjs/validations/trade-grouping.js.map +1 -1
- package/dist/cjs/validations/trades.js +168 -40
- package/dist/cjs/validations/trades.js.map +1 -1
- package/dist/cjs/validator.js +11 -16
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/environment-config.js +47 -28
- package/dist/cjs/whitelists/environment-config.js.map +1 -1
- package/dist/cjs/whitelists/evm/caveat-enforcers.js +21 -5
- package/dist/cjs/whitelists/evm/caveat-enforcers.js.map +1 -1
- package/dist/cjs/whitelists/evm/delegation-manager.js +7 -2
- package/dist/cjs/whitelists/evm/delegation-manager.js.map +1 -1
- package/dist/cjs/whitelists/evm/eip7702-delegation.js +7 -2
- package/dist/cjs/whitelists/evm/eip7702-delegation.js.map +1 -1
- package/dist/cjs/whitelists/evm/index.js +14 -1
- package/dist/cjs/whitelists/evm/index.js.map +1 -1
- package/dist/cjs/whitelists/evm/metamask-delegation-chains.js +16 -0
- package/dist/cjs/whitelists/evm/metamask-delegation-chains.js.map +1 -0
- package/dist/cjs/whitelists/evm/permit2.js +16 -12
- package/dist/cjs/whitelists/evm/permit2.js.map +1 -1
- package/dist/cjs/whitelists/evm/weth.js +16 -5
- package/dist/cjs/whitelists/evm/weth.js.map +1 -1
- package/dist/cjs/whitelists/solana/intent-signature.js +0 -1
- package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/cjs/whitelists/subscription-to-chain-id.js +10 -0
- package/dist/cjs/whitelists/subscription-to-chain-id.js.map +1 -1
- package/dist/cjs/whitelists/types.js +13 -3
- package/dist/cjs/whitelists/types.js.map +1 -1
- package/dist/esm/helpers/address.js +48 -17
- package/dist/esm/helpers/address.js.map +1 -1
- package/dist/esm/helpers/evm-action.js +3 -3
- package/dist/esm/helpers/evm-action.js.map +1 -1
- package/dist/esm/helpers/evm-dln-hook-pack.js +82 -0
- package/dist/esm/helpers/evm-dln-hook-pack.js.map +1 -0
- package/dist/esm/helpers/evm-gas-compensation-tx.js +99 -0
- package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -0
- package/dist/esm/helpers/evm-intent-id.js +27 -13
- package/dist/esm/helpers/evm-intent-id.js.map +1 -1
- package/dist/esm/helpers/evm-trade-amounts.js +36 -1
- package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/esm/helpers/gas-compensation.js +33 -0
- package/dist/esm/helpers/gas-compensation.js.map +1 -0
- package/dist/esm/helpers/hex.js +20 -0
- package/dist/esm/helpers/hex.js.map +1 -0
- package/dist/esm/helpers/placeholder.js +168 -0
- package/dist/esm/helpers/placeholder.js.map +1 -0
- package/dist/esm/helpers/sets.js +10 -0
- package/dist/esm/helpers/sets.js.map +1 -0
- package/dist/esm/types/enums.js +31 -1
- package/dist/esm/types/enums.js.map +1 -1
- package/dist/esm/types/request.js +37 -4
- package/dist/esm/types/request.js.map +1 -1
- package/dist/esm/types/response.js +124 -4
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +81 -10
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/validations/compensation-hook.js +200 -0
- package/dist/esm/validations/compensation-hook.js.map +1 -0
- package/dist/esm/validations/evm-caveats.js +4 -14
- package/dist/esm/validations/evm-caveats.js.map +1 -1
- package/dist/esm/validations/evm-op-budget.js +13 -10
- package/dist/esm/validations/evm-op-budget.js.map +1 -1
- package/dist/esm/validations/evm-op-hook.js +409 -2
- package/dist/esm/validations/evm-op-hook.js.map +1 -1
- package/dist/esm/validations/evm-op-wrap.js +10 -7
- package/dist/esm/validations/evm-op-wrap.js.map +1 -1
- package/dist/esm/validations/evm-required-actions.js +7 -9
- package/dist/esm/validations/evm-required-actions.js.map +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js +17 -94
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/esm/validations/evm-sign712-shared.js +110 -0
- package/dist/esm/validations/evm-sign712-shared.js.map +1 -0
- package/dist/esm/validations/evm-sign7702.js +33 -22
- package/dist/esm/validations/evm-sign7702.js.map +1 -1
- package/dist/esm/validations/hooks-common.js +251 -38
- package/dist/esm/validations/hooks-common.js.map +1 -1
- package/dist/esm/validations/intent-destinations.js +194 -0
- package/dist/esm/validations/intent-destinations.js.map +1 -0
- package/dist/esm/validations/intent-tokens.js +344 -0
- package/dist/esm/validations/intent-tokens.js.map +1 -0
- package/dist/esm/validations/intent.js +285 -0
- package/dist/esm/validations/intent.js.map +1 -0
- package/dist/esm/validations/required-actions.js +7 -7
- package/dist/esm/validations/required-actions.js.map +1 -1
- package/dist/esm/validations/solana-hook.js +35 -24
- package/dist/esm/validations/solana-hook.js.map +1 -1
- package/dist/esm/validations/solana-op-budget.js +56 -18
- package/dist/esm/validations/solana-op-budget.js.map +1 -1
- package/dist/esm/validations/solana-op-wrap.js +47 -14
- 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 +7 -7
- package/dist/esm/validations/solana-transaction.js.map +1 -1
- package/dist/esm/validations/trade-grouping.js +139 -1
- package/dist/esm/validations/trade-grouping.js.map +1 -1
- package/dist/esm/validations/trades.js +169 -41
- package/dist/esm/validations/trades.js.map +1 -1
- package/dist/esm/validator.js +11 -16
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/environment-config.js +47 -28
- package/dist/esm/whitelists/environment-config.js.map +1 -1
- package/dist/esm/whitelists/evm/caveat-enforcers.js +20 -4
- package/dist/esm/whitelists/evm/caveat-enforcers.js.map +1 -1
- package/dist/esm/whitelists/evm/delegation-manager.js +6 -1
- package/dist/esm/whitelists/evm/delegation-manager.js.map +1 -1
- package/dist/esm/whitelists/evm/eip7702-delegation.js +6 -1
- package/dist/esm/whitelists/evm/eip7702-delegation.js.map +1 -1
- package/dist/esm/whitelists/evm/index.js +4 -4
- package/dist/esm/whitelists/evm/index.js.map +1 -1
- package/dist/esm/whitelists/evm/metamask-delegation-chains.js +13 -0
- package/dist/esm/whitelists/evm/metamask-delegation-chains.js.map +1 -0
- package/dist/esm/whitelists/evm/permit2.js +9 -5
- package/dist/esm/whitelists/evm/permit2.js.map +1 -1
- package/dist/esm/whitelists/evm/weth.js +16 -5
- package/dist/esm/whitelists/evm/weth.js.map +1 -1
- package/dist/esm/whitelists/solana/intent-signature.js +0 -1
- package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/esm/whitelists/subscription-to-chain-id.js +9 -0
- package/dist/esm/whitelists/subscription-to-chain-id.js.map +1 -1
- package/dist/esm/whitelists/types.js +14 -5
- package/dist/esm/whitelists/types.js.map +1 -1
- package/dist/types/helpers/address.d.ts +7 -7
- package/dist/types/helpers/address.d.ts.map +1 -1
- package/dist/types/helpers/evm-dln-hook-pack.d.ts +19 -0
- package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +1 -0
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts +13 -0
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -0
- package/dist/types/helpers/evm-intent-id.d.ts.map +1 -1
- package/dist/types/helpers/evm-trade-amounts.d.ts +2 -2
- package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
- package/dist/types/helpers/gas-compensation.d.ts +10 -0
- package/dist/types/helpers/gas-compensation.d.ts.map +1 -0
- package/dist/types/helpers/hex.d.ts +3 -0
- package/dist/types/helpers/hex.d.ts.map +1 -0
- package/dist/types/helpers/placeholder.d.ts +41 -0
- package/dist/types/helpers/placeholder.d.ts.map +1 -0
- package/dist/types/helpers/sets.d.ts +2 -0
- package/dist/types/helpers/sets.d.ts.map +1 -0
- package/dist/types/types/enums.d.ts +24 -1
- package/dist/types/types/enums.d.ts.map +1 -1
- package/dist/types/types/request.d.ts +21 -11
- package/dist/types/types/request.d.ts.map +1 -1
- package/dist/types/types/response.d.ts +1015 -17
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +73 -11
- package/dist/types/types/validation.d.ts.map +1 -1
- package/dist/types/validations/compensation-hook.d.ts +3 -0
- package/dist/types/validations/compensation-hook.d.ts.map +1 -0
- package/dist/types/validations/evm-caveats.d.ts.map +1 -1
- package/dist/types/validations/evm-op-budget.d.ts +2 -2
- package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
- package/dist/types/validations/evm-op-hook.d.ts +4 -2
- package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
- package/dist/types/validations/evm-op-wrap.d.ts +2 -2
- package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/evm-required-actions.d.ts +2 -2
- package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-shared.d.ts +7 -0
- package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -0
- package/dist/types/validations/evm-sign7702.d.ts +2 -1
- package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
- package/dist/types/validations/hooks-common.d.ts +1 -0
- package/dist/types/validations/hooks-common.d.ts.map +1 -1
- package/dist/types/validations/intent-destinations.d.ts +4 -0
- package/dist/types/validations/intent-destinations.d.ts.map +1 -0
- package/dist/types/validations/intent-tokens.d.ts +4 -0
- package/dist/types/validations/intent-tokens.d.ts.map +1 -0
- package/dist/types/validations/intent.d.ts +5 -0
- package/dist/types/validations/intent.d.ts.map +1 -0
- package/dist/types/validations/required-actions.d.ts +2 -1
- package/dist/types/validations/required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-hook.d.ts +4 -2
- package/dist/types/validations/solana-hook.d.ts.map +1 -1
- package/dist/types/validations/solana-op-budget.d.ts +2 -2
- package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
- package/dist/types/validations/solana-op-wrap.d.ts +2 -2
- package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/solana-required-actions.d.ts +2 -2
- package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-transaction.d.ts +3 -3
- package/dist/types/validations/solana-transaction.d.ts.map +1 -1
- package/dist/types/validations/trade-grouping.d.ts +6 -2
- package/dist/types/validations/trade-grouping.d.ts.map +1 -1
- package/dist/types/validations/trades.d.ts.map +1 -1
- package/dist/types/validator.d.ts.map +1 -1
- package/dist/types/whitelists/environment-config.d.ts.map +1 -1
- package/dist/types/whitelists/evm/caveat-enforcers.d.ts +8 -0
- package/dist/types/whitelists/evm/caveat-enforcers.d.ts.map +1 -1
- package/dist/types/whitelists/evm/delegation-manager.d.ts +2 -0
- package/dist/types/whitelists/evm/delegation-manager.d.ts.map +1 -1
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts +2 -0
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts.map +1 -1
- package/dist/types/whitelists/evm/index.d.ts +4 -4
- package/dist/types/whitelists/evm/index.d.ts.map +1 -1
- package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts +3 -0
- package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts.map +1 -0
- package/dist/types/whitelists/evm/permit2.d.ts +1 -0
- package/dist/types/whitelists/evm/permit2.d.ts.map +1 -1
- package/dist/types/whitelists/evm/weth.d.ts.map +1 -1
- package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
- package/dist/types/whitelists/subscription-to-chain-id.d.ts +1 -0
- package/dist/types/whitelists/subscription-to-chain-id.d.ts.map +1 -1
- package/dist/types/whitelists/types.d.ts +1 -1
- package/dist/types/whitelists/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/dist/cjs/helpers/constants.js +0 -6
- package/dist/cjs/helpers/constants.js.map +0 -1
- package/dist/cjs/validations/evm-op-gas-compensation.js +0 -152
- package/dist/cjs/validations/evm-op-gas-compensation.js.map +0 -1
- package/dist/esm/helpers/constants.js +0 -3
- package/dist/esm/helpers/constants.js.map +0 -1
- package/dist/esm/validations/evm-op-gas-compensation.js +0 -149
- package/dist/esm/validations/evm-op-gas-compensation.js.map +0 -1
- package/dist/types/helpers/constants.d.ts +0 -2
- package/dist/types/helpers/constants.d.ts.map +0 -1
- package/dist/types/validations/evm-op-gas-compensation.d.ts +0 -3
- package/dist/types/validations/evm-op-gas-compensation.d.ts.map +0 -1
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
import { ViolationCode, } from "../types/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { BundleHookType, ChainEngine, EvmActionOperation, SolanaActionOperation, } from "../types/enums.js";
|
|
3
|
+
import { addressEquals, getChainEngine } from "../helpers/address.js";
|
|
4
|
+
import { extractGasCompensationGroups } from "../helpers/gas-compensation.js";
|
|
5
|
+
import { HookMode, PlaceholderResolutionErrorReason, resolveEagerPlaceholders, } from "../helpers/placeholder.js";
|
|
3
6
|
import { validateSolanaHookActions } from "./solana-hook.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
import { validateEvmHookActions } from "./evm-op-hook.js";
|
|
8
|
+
import { validateCompensationHookStructure } from "./compensation-hook.js";
|
|
9
|
+
import { resolveChainId, resolveChainIdOrSelf, } from "../whitelists/subscription-to-chain-id.js";
|
|
10
|
+
// Re-exported so call sites can pass the mode without importing from helpers.
|
|
11
|
+
export { HookMode } from "../helpers/placeholder.js";
|
|
12
|
+
// Allowed hook-scope operations — each chain checked against its own enum.
|
|
13
|
+
const EVM_HOOK_OPERATIONS = [
|
|
14
|
+
EvmActionOperation.Delegate,
|
|
15
|
+
EvmActionOperation.Hook,
|
|
16
|
+
EvmActionOperation.GasCompensation,
|
|
17
|
+
];
|
|
18
|
+
const EVM_HOOK_OPERATIONS_SET = new Set(EVM_HOOK_OPERATIONS);
|
|
19
|
+
const SOLANA_HOOK_OPERATIONS = [
|
|
20
|
+
SolanaActionOperation.Hook,
|
|
21
|
+
SolanaActionOperation.GasCompensation,
|
|
22
|
+
];
|
|
23
|
+
const SOLANA_HOOK_OPERATIONS_SET = new Set(SOLANA_HOOK_OPERATIONS);
|
|
7
24
|
export function validateHooks(request, response, quoteMode) {
|
|
8
25
|
return [
|
|
9
26
|
...validateHookAAConstraint(request, response),
|
|
@@ -37,26 +54,35 @@ function validateHookAAConstraint(request, response) {
|
|
|
37
54
|
}
|
|
38
55
|
return violations;
|
|
39
56
|
}
|
|
40
|
-
// HIGH:
|
|
57
|
+
// HIGH: preHooks = request.preHooks + one compensation hook per unique
|
|
58
|
+
// gasCompensationInfo group (exact equality — API always adds one per group).
|
|
59
|
+
// postHooks must match exactly — the API never adds extras to postHooks.
|
|
41
60
|
function validateHookCounts(request, response) {
|
|
42
61
|
const violations = [];
|
|
43
62
|
const requestPreCount = request.preHooks?.length ?? 0;
|
|
44
63
|
const requestPostCount = request.postHooks?.length ?? 0;
|
|
45
|
-
|
|
64
|
+
// preHooks: exactly request.preHooks.length + one per unique gas
|
|
65
|
+
// compensation group. If request has no gasCompensationInfo at all, extras
|
|
66
|
+
// are forbidden (this also guards against MITM adding preHook entries when
|
|
67
|
+
// the user never asked for compensation).
|
|
68
|
+
const compensationGroupCount = extractGasCompensationGroups(request).length;
|
|
69
|
+
const expectedPreCount = requestPreCount + compensationGroupCount;
|
|
70
|
+
if (response.preHooks.length !== expectedPreCount) {
|
|
46
71
|
violations.push({
|
|
47
72
|
code: ViolationCode.HookCountMismatch,
|
|
48
|
-
message: "response.preHooks count does not match
|
|
73
|
+
message: "response.preHooks count does not match"
|
|
74
|
+
+ " request.preHooks.length + unique gasCompensationInfo groups",
|
|
49
75
|
path: "response.preHooks",
|
|
50
|
-
expected:
|
|
76
|
+
expected: expectedPreCount,
|
|
51
77
|
actual: response.preHooks.length,
|
|
52
78
|
});
|
|
53
79
|
}
|
|
54
|
-
// postHooks
|
|
55
|
-
|
|
56
|
-
if (response.postHooks.length < requestPostCount) {
|
|
80
|
+
// postHooks: strict 1:1 match, no extras allowed
|
|
81
|
+
if (response.postHooks.length !== requestPostCount) {
|
|
57
82
|
violations.push({
|
|
58
83
|
code: ViolationCode.HookCountMismatch,
|
|
59
|
-
message: "response.postHooks count
|
|
84
|
+
message: "response.postHooks count does not match"
|
|
85
|
+
+ " request.postHooks count",
|
|
60
86
|
path: "response.postHooks",
|
|
61
87
|
expected: requestPostCount,
|
|
62
88
|
actual: response.postHooks.length,
|
|
@@ -71,7 +97,7 @@ function validatePreHooks(request, response, quoteMode) {
|
|
|
71
97
|
const basePath = `response.preHooks[${i}]`;
|
|
72
98
|
const hookPayload = response.preHooks[i];
|
|
73
99
|
const requestHook = requestHooks[i];
|
|
74
|
-
violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode));
|
|
100
|
+
violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, response.trades, HookMode.PreHooks, quoteMode));
|
|
75
101
|
}
|
|
76
102
|
return violations;
|
|
77
103
|
}
|
|
@@ -83,31 +109,153 @@ function validatePostHooks(request, response, quoteMode) {
|
|
|
83
109
|
const hookPayload = response.postHooks[i];
|
|
84
110
|
// User postHooks are matched by index; extra entries are compensation hooks
|
|
85
111
|
const requestHook = i < requestHooks.length ? requestHooks[i] : undefined;
|
|
86
|
-
violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode));
|
|
112
|
+
violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, response.trades, HookMode.PostHooks, quoteMode));
|
|
87
113
|
}
|
|
88
114
|
return violations;
|
|
89
115
|
}
|
|
90
|
-
function validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode) {
|
|
116
|
+
function validateSingleHookPayload(hookPayload, requestHook, basePath, request, responseTrades, mode, quoteMode) {
|
|
117
|
+
const isCompensationPreHook = requestHook === undefined && mode === HookMode.PreHooks;
|
|
91
118
|
return [
|
|
92
|
-
...validateHookEcho(hookPayload, requestHook, basePath),
|
|
119
|
+
...validateHookEcho(hookPayload, requestHook, basePath, responseTrades, mode),
|
|
93
120
|
...validateHookUniqueActionIds(hookPayload, basePath),
|
|
94
121
|
...validateHookActionsList(hookPayload, basePath),
|
|
122
|
+
...validateHookDelegateOp(hookPayload, basePath),
|
|
123
|
+
...validateHookSolanaNotDirect(hookPayload, basePath),
|
|
95
124
|
...validateGasCompensationRequiresInfo(hookPayload, basePath, request),
|
|
96
|
-
...
|
|
125
|
+
...(isCompensationPreHook
|
|
126
|
+
? validateCompensationHookStructure(hookPayload, basePath, request)
|
|
127
|
+
: []),
|
|
128
|
+
...dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request, mode, responseTrades),
|
|
97
129
|
];
|
|
98
130
|
}
|
|
99
|
-
//
|
|
100
|
-
function
|
|
101
|
-
|
|
131
|
+
// MEDIUM: Solana hooks must not be of type 'direct'.
|
|
132
|
+
function validateHookSolanaNotDirect(hookPayload, basePath) {
|
|
133
|
+
const realChainId = resolveChainIdOrSelf(hookPayload.hook.chainId);
|
|
134
|
+
if (getChainEngine(realChainId) !== ChainEngine.Solana)
|
|
102
135
|
return [];
|
|
103
|
-
if (
|
|
104
|
-
return [
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
136
|
+
if (hookPayload.hook.type !== BundleHookType.Direct)
|
|
137
|
+
return [];
|
|
138
|
+
return [{
|
|
139
|
+
code: ViolationCode.HookSolanaCannotBeDirect,
|
|
140
|
+
message: "Solana hooks cannot be of type 'direct'",
|
|
141
|
+
path: `${basePath}.hook.type`,
|
|
142
|
+
expected: BundleHookType.Delegated,
|
|
143
|
+
actual: hookPayload.hook.type,
|
|
144
|
+
}];
|
|
145
|
+
}
|
|
146
|
+
// CRITICAL: response hook must echo back the request hook field-by-field.
|
|
147
|
+
// Notes:
|
|
148
|
+
// - hook.data in the response has eager placeholders resolved (deferred markers kept).
|
|
149
|
+
// We apply the same resolution to request.data and compare.
|
|
150
|
+
// - For Solana hooks the API deletes `to` and `value` in the echo; we skip those.
|
|
151
|
+
// - For EVM hooks `value` is copied from request as-is (eager resolution is not
|
|
152
|
+
// reflected in the echoed value — only in internal txData used by requiredActions).
|
|
153
|
+
function validateHookEcho(hookPayload, requestHook, basePath, responseTrades, mode) {
|
|
154
|
+
// Missing request counterpart — two shapes, both are MITM-safe:
|
|
155
|
+
// (a) preHook with `i >= request.preHooks.length`:
|
|
156
|
+
// legitimate case — compensation hook appended by the API.
|
|
157
|
+
// MITM case — attacker injects an arbitrary preHook.
|
|
158
|
+
// The echo-by-field check can't distinguish them (there's no request
|
|
159
|
+
// to compare against), so we delegate to the structural compensation
|
|
160
|
+
// check.
|
|
161
|
+
// (b) postHook with `i >= request.postHooks.length`:
|
|
162
|
+
// no legitimate case — the API never appends to postHooks. So we
|
|
163
|
+
// produce a violation.
|
|
164
|
+
if (!requestHook) {
|
|
165
|
+
if (mode === HookMode.PostHooks) {
|
|
166
|
+
return [{
|
|
167
|
+
code: ViolationCode.UnexpectedPostHook,
|
|
168
|
+
message: "response.postHooks contains an entry with no matching"
|
|
169
|
+
+ " request postHook",
|
|
170
|
+
path: `${basePath}.hook`,
|
|
171
|
+
actual: hookPayload.hook,
|
|
172
|
+
}];
|
|
173
|
+
}
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
const echoed = hookPayload.hook;
|
|
177
|
+
const chainId = requestHook.chainId;
|
|
178
|
+
const realChainId = resolveChainIdOrSelf(chainId);
|
|
179
|
+
const isSolana = getChainEngine(realChainId) === ChainEngine.Solana;
|
|
180
|
+
const hookPath = `${basePath}.hook`;
|
|
181
|
+
const violations = [];
|
|
182
|
+
// chainId — strict number equality (subscriptionId on both sides)
|
|
183
|
+
if (echoed.chainId !== chainId) {
|
|
184
|
+
violations.push(echoMismatch(`${hookPath}.chainId`, requestHook.chainId, echoed.chainId));
|
|
185
|
+
}
|
|
186
|
+
// from — address equality
|
|
187
|
+
if (!addressEquals(realChainId, echoed.from, requestHook.from)) {
|
|
188
|
+
violations.push(echoMismatch(`${hookPath}.from`, requestHook.from, echoed.from));
|
|
189
|
+
}
|
|
190
|
+
// isAtomic — strict boolean
|
|
191
|
+
if (echoed.isAtomic !== requestHook.isAtomic) {
|
|
192
|
+
violations.push(echoMismatch(`${hookPath}.isAtomic`, requestHook.isAtomic, echoed.isAtomic));
|
|
193
|
+
}
|
|
194
|
+
// to, value — chain-dependent.
|
|
195
|
+
// Solana: API deletes both from the echo; skip entirely.
|
|
196
|
+
// EVM: compare as-is (value is not modified by placeholder resolution).
|
|
197
|
+
if (!isSolana) {
|
|
198
|
+
violations.push(...compareOptionalAddress(realChainId, `${hookPath}.to`, requestHook.to, echoed.to));
|
|
199
|
+
violations.push(...compareOptionalString(`${hookPath}.value`, requestHook.value, echoed.value));
|
|
200
|
+
}
|
|
201
|
+
// data — eager placeholders are resolved by the API before echoing.
|
|
202
|
+
const { resolved: expectedData, errors } = resolveEagerPlaceholders(requestHook.data, realChainId, requestHook.placeHolders, responseTrades, mode);
|
|
203
|
+
for (const error of errors) {
|
|
204
|
+
const reasonText = PlaceholderResolutionErrorReason[error.reason];
|
|
205
|
+
violations.push({
|
|
206
|
+
code: ViolationCode.HookPlaceholderResolutionFailed,
|
|
207
|
+
message: `failed to resolve placeholder "${error.nameVariable}"`
|
|
208
|
+
+ ` (${reasonText})`,
|
|
209
|
+
path: `${hookPath}.data`,
|
|
210
|
+
actual: { nameVariable: error.nameVariable, reason: reasonText },
|
|
211
|
+
details: error.details,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
if (expectedData !== echoed.data) {
|
|
215
|
+
violations.push(echoMismatch(`${hookPath}.data`, expectedData, echoed.data));
|
|
216
|
+
}
|
|
217
|
+
// placeHolders — deep equality via stringify (same source → same serialization).
|
|
218
|
+
if (JSON.stringify(echoed.placeHolders)
|
|
219
|
+
!== JSON.stringify(requestHook.placeHolders)) {
|
|
220
|
+
violations.push(echoMismatch(`${hookPath}.placeHolders`, requestHook.placeHolders, echoed.placeHolders));
|
|
221
|
+
}
|
|
222
|
+
// gasCompensationInfo — deep equality or both undefined.
|
|
223
|
+
if (JSON.stringify(echoed.gasCompensationInfo)
|
|
224
|
+
!== JSON.stringify(requestHook.gasCompensationInfo)) {
|
|
225
|
+
violations.push(echoMismatch(`${hookPath}.gasCompensationInfo`, requestHook.gasCompensationInfo, echoed.gasCompensationInfo));
|
|
226
|
+
}
|
|
227
|
+
// type — strict equality (or both undefined).
|
|
228
|
+
if (echoed.type !== requestHook.type) {
|
|
229
|
+
violations.push(echoMismatch(`${hookPath}.type`, requestHook.type, echoed.type));
|
|
230
|
+
}
|
|
231
|
+
// gasLimit — strict string equality (or both undefined).
|
|
232
|
+
if (echoed.gasLimit !== requestHook.gasLimit) {
|
|
233
|
+
violations.push(echoMismatch(`${hookPath}.gasLimit`, requestHook.gasLimit, echoed.gasLimit));
|
|
234
|
+
}
|
|
235
|
+
return violations;
|
|
236
|
+
}
|
|
237
|
+
function echoMismatch(path, expected, actual) {
|
|
238
|
+
return {
|
|
239
|
+
code: ViolationCode.HookEchoMismatch,
|
|
240
|
+
message: "response hook field does not match request",
|
|
241
|
+
path,
|
|
242
|
+
expected,
|
|
243
|
+
actual,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
function compareOptionalString(path, expected, actual) {
|
|
247
|
+
if (expected === actual)
|
|
248
|
+
return [];
|
|
249
|
+
return [echoMismatch(path, expected, actual)];
|
|
250
|
+
}
|
|
251
|
+
function compareOptionalAddress(chainId, path, expected, actual) {
|
|
252
|
+
if (expected === undefined && actual === undefined)
|
|
253
|
+
return [];
|
|
254
|
+
if (expected === undefined || actual === undefined) {
|
|
255
|
+
return [echoMismatch(path, expected, actual)];
|
|
256
|
+
}
|
|
257
|
+
if (!addressEquals(chainId, expected, actual)) {
|
|
258
|
+
return [echoMismatch(path, expected, actual)];
|
|
111
259
|
}
|
|
112
260
|
return [];
|
|
113
261
|
}
|
|
@@ -135,6 +283,10 @@ function validateHookUniqueActionIds(hookPayload, basePath) {
|
|
|
135
283
|
}
|
|
136
284
|
// HIGH: each hook required action must have exactly one operation: [Hook] or [GasCompensation]
|
|
137
285
|
function validateHookActionsList(hookPayload, basePath) {
|
|
286
|
+
const realChainId = resolveChainIdOrSelf(hookPayload.hook.chainId);
|
|
287
|
+
const isSolana = getChainEngine(realChainId) === ChainEngine.Solana;
|
|
288
|
+
const allowedSet = isSolana ? SOLANA_HOOK_OPERATIONS_SET : EVM_HOOK_OPERATIONS_SET;
|
|
289
|
+
const allowedList = isSolana ? SOLANA_HOOK_OPERATIONS : EVM_HOOK_OPERATIONS;
|
|
138
290
|
const violations = [];
|
|
139
291
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
140
292
|
const action = hookPayload.requiredActions[i];
|
|
@@ -149,26 +301,85 @@ function validateHookActionsList(hookPayload, basePath) {
|
|
|
149
301
|
});
|
|
150
302
|
continue;
|
|
151
303
|
}
|
|
152
|
-
if (!
|
|
304
|
+
if (!allowedSet.has(action.actions[0])) {
|
|
153
305
|
violations.push({
|
|
154
306
|
code: ViolationCode.HookActionsInvalid,
|
|
155
307
|
message: "hook required action operation must be Hook"
|
|
156
308
|
+ " or GasCompensation",
|
|
157
309
|
path: `${actionPath}.actions`,
|
|
158
|
-
expected:
|
|
310
|
+
expected: allowedList,
|
|
159
311
|
actual: action.actions,
|
|
160
312
|
});
|
|
161
313
|
}
|
|
162
314
|
}
|
|
163
315
|
return violations;
|
|
164
316
|
}
|
|
317
|
+
// HIGH: Delegate-op constraints for EVM hook requiredActions.
|
|
318
|
+
// * `Delegate` may appear at most once.
|
|
319
|
+
// * If present, it must be the first required action (the API emits
|
|
320
|
+
// Sign7702Authorization → Sign712MetaMaskCaveats* in this order).
|
|
321
|
+
// * Direct hooks (`hook.type === 'direct'`) must not contain `Delegate`
|
|
322
|
+
// (Direct mode skips EIP-7702 delegation entirely).
|
|
323
|
+
// Solana hooks bypass this check — `Delegate` is rejected upstream by
|
|
324
|
+
// `validateHookActionsList`.
|
|
325
|
+
function validateHookDelegateOp(hookPayload, basePath) {
|
|
326
|
+
const realChainId = resolveChainIdOrSelf(hookPayload.hook.chainId);
|
|
327
|
+
if (getChainEngine(realChainId) === ChainEngine.Solana)
|
|
328
|
+
return [];
|
|
329
|
+
const indices = [];
|
|
330
|
+
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
331
|
+
const action = hookPayload.requiredActions[i];
|
|
332
|
+
const ops = action.actions;
|
|
333
|
+
if (ops.includes(EvmActionOperation.Delegate)) {
|
|
334
|
+
indices.push(i);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (indices.length === 0)
|
|
338
|
+
return [];
|
|
339
|
+
const violations = [];
|
|
340
|
+
if (hookPayload.hook.type === BundleHookType.Direct) {
|
|
341
|
+
violations.push({
|
|
342
|
+
code: ViolationCode.HookDelegateInDirect,
|
|
343
|
+
message: "Direct hook must not contain a Delegate operation"
|
|
344
|
+
+ " (Direct mode skips EIP-7702 delegation)",
|
|
345
|
+
path: `${basePath}.requiredActions`,
|
|
346
|
+
actual: indices,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
if (indices.length > 1) {
|
|
350
|
+
violations.push({
|
|
351
|
+
code: ViolationCode.HookMultipleDelegate,
|
|
352
|
+
message: "hook requiredActions must contain at most one Delegate",
|
|
353
|
+
path: `${basePath}.requiredActions`,
|
|
354
|
+
expected: 1,
|
|
355
|
+
actual: indices,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
if (indices[0] !== 0) {
|
|
359
|
+
violations.push({
|
|
360
|
+
code: ViolationCode.HookDelegateNotFirst,
|
|
361
|
+
message: "if Delegate is present in hook requiredActions, it must be"
|
|
362
|
+
+ " the first action",
|
|
363
|
+
path: `${basePath}.requiredActions[${indices[0]}]`,
|
|
364
|
+
expected: 0,
|
|
365
|
+
actual: indices[0],
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
return violations;
|
|
369
|
+
}
|
|
165
370
|
// CRITICAL: GasCompensation must only appear when gasCompensationInfo exists
|
|
166
371
|
function validateGasCompensationRequiresInfo(hookPayload, basePath, request) {
|
|
167
372
|
const hasGasCompensationInfo = (request.preHooks ?? []).some(h => h.gasCompensationInfo !== undefined);
|
|
373
|
+
const realChainId = resolveChainIdOrSelf(hookPayload.hook.chainId);
|
|
374
|
+
const isSolana = getChainEngine(realChainId) === ChainEngine.Solana;
|
|
375
|
+
const gasCompensationOp = isSolana
|
|
376
|
+
? SolanaActionOperation.GasCompensation
|
|
377
|
+
: EvmActionOperation.GasCompensation;
|
|
168
378
|
const violations = [];
|
|
169
379
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
170
380
|
const action = hookPayload.requiredActions[i];
|
|
171
|
-
const hasGasCompensation = action.actions
|
|
381
|
+
const hasGasCompensation = action.actions
|
|
382
|
+
.includes(gasCompensationOp);
|
|
172
383
|
if (hasGasCompensation && !hasGasCompensationInfo) {
|
|
173
384
|
violations.push({
|
|
174
385
|
code: ViolationCode.HookGasCompensationWithoutInfo,
|
|
@@ -181,18 +392,20 @@ function validateGasCompensationRequiresInfo(hookPayload, basePath, request) {
|
|
|
181
392
|
}
|
|
182
393
|
return violations;
|
|
183
394
|
}
|
|
184
|
-
function dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request) {
|
|
185
|
-
const
|
|
186
|
-
if (
|
|
395
|
+
function dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request, mode, responseTrades) {
|
|
396
|
+
const realChainId = resolveChainIdOrSelf(hookPayload.hook.chainId);
|
|
397
|
+
if (getChainEngine(realChainId) === ChainEngine.Solana) {
|
|
187
398
|
const srcChainAuthorityAddress = findSolanaSrcChainAuthority(request);
|
|
188
|
-
return validateSolanaHookActions(hookPayload, requestHook, basePath, quoteMode, srcChainAuthorityAddress, request);
|
|
399
|
+
return validateSolanaHookActions(hookPayload, requestHook, basePath, quoteMode, srcChainAuthorityAddress, request, realChainId, mode, responseTrades);
|
|
189
400
|
}
|
|
190
|
-
|
|
191
|
-
return [];
|
|
401
|
+
return validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request);
|
|
192
402
|
}
|
|
193
403
|
function findSolanaSrcChainAuthority(request) {
|
|
194
404
|
for (const trade of request.trades) {
|
|
195
|
-
|
|
405
|
+
const realChainId = resolveChainId(trade.srcChainId);
|
|
406
|
+
if (realChainId === undefined)
|
|
407
|
+
continue;
|
|
408
|
+
if (getChainEngine(realChainId) === ChainEngine.Solana) {
|
|
196
409
|
return trade.srcChainAuthorityAddress;
|
|
197
410
|
}
|
|
198
411
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-common.js","sourceRoot":"","sources":["../../../src/validations/hooks-common.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks-common.js","sourceRoot":"","sources":["../../../src/validations/hooks-common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { ViolationCode, SpecialChainId, ChainEngine, } from "../types/index.js";
|
|
2
|
+
import { detectChainEngine, getChainEngine, normalizeAddress, normalizeAddressByValue, } from "../helpers/address.js";
|
|
3
|
+
import { setsEqual } from "../helpers/sets.js";
|
|
4
|
+
import { resolveChainId } from "../whitelists/subscription-to-chain-id.js";
|
|
5
|
+
export function validateIntentDestinations(intent, group, basePath, quoteMode) {
|
|
6
|
+
// Safe skip: in quote mode receiverDetails/dstAuthorityAddress contain
|
|
7
|
+
// placeholder values per the API contract
|
|
8
|
+
if (quoteMode)
|
|
9
|
+
return [];
|
|
10
|
+
return [
|
|
11
|
+
...validateDestinationList(intent.receiverDetails, group, trade => trade.dstChainTokenOutRecipient, `${basePath}.receiverDetails`, {
|
|
12
|
+
addressInvalid: ViolationCode.IntentReceiverDetailsAddressInvalid,
|
|
13
|
+
chainIdsMismatch: ViolationCode.IntentReceiverDetailsChainIdsMismatch,
|
|
14
|
+
missing: ViolationCode.IntentReceiverDetailsMissing,
|
|
15
|
+
duplicate: ViolationCode.IntentReceiverDetailsDuplicate,
|
|
16
|
+
addressChainMismatch: ViolationCode.IntentReceiverDetailsAddressChainMismatch,
|
|
17
|
+
}, "receiverDetails"),
|
|
18
|
+
...validateDestinationList(intent.dstAuthorityAddress, group, trade => trade.dstChainAuthorityAddress, `${basePath}.dstAuthorityAddress`, {
|
|
19
|
+
addressInvalid: ViolationCode.IntentDstAuthorityAddressInvalid,
|
|
20
|
+
chainIdsMismatch: ViolationCode.IntentDstAuthorityChainIdsMismatch,
|
|
21
|
+
missing: ViolationCode.IntentDstAuthorityMissing,
|
|
22
|
+
duplicate: ViolationCode.IntentDstAuthorityDuplicate,
|
|
23
|
+
addressChainMismatch: ViolationCode.IntentDstAuthorityAddressChainMismatch,
|
|
24
|
+
}, "dstAuthorityAddress"),
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
// CRITICAL: the set of unique addresses in intent.<field>[] must exactly match
|
|
28
|
+
// the set of unique addresses in request.trades[].<pick>, with destinationChainIds
|
|
29
|
+
// containing exactly the chainIds where that address was used.
|
|
30
|
+
function validateDestinationList(details, group, pick, basePath, codes, fieldLabel) {
|
|
31
|
+
const violations = [];
|
|
32
|
+
const list = details ?? [];
|
|
33
|
+
const expected = collectExpectedByAddress(group, pick);
|
|
34
|
+
for (let i = 0; i < list.length; i++) {
|
|
35
|
+
violations.push(...validateAddressChainConsistency(list[i], `${basePath}[${i}]`, codes.addressChainMismatch, fieldLabel));
|
|
36
|
+
}
|
|
37
|
+
const firstOccurrence = buildFirstOccurrence(list, basePath, codes.duplicate, fieldLabel, violations);
|
|
38
|
+
violations.push(...reportMissingAddresses(expected, firstOccurrence, basePath, codes.missing, fieldLabel));
|
|
39
|
+
violations.push(...validateEntries(list, firstOccurrence, expected, basePath, codes, fieldLabel));
|
|
40
|
+
return violations;
|
|
41
|
+
}
|
|
42
|
+
// Builds address → chainIds map from request trades, mirroring the API's
|
|
43
|
+
// grouping by address.toHexAddress(). Each address gets the full set of
|
|
44
|
+
// chainIds where it was used.
|
|
45
|
+
function collectExpectedByAddress(group, pick) {
|
|
46
|
+
const byAddress = new Map();
|
|
47
|
+
for (const trade of group.trades) {
|
|
48
|
+
const address = pick(trade);
|
|
49
|
+
if (address === undefined)
|
|
50
|
+
continue;
|
|
51
|
+
const dstRealChainId = resolveChainId(trade.dstChainId);
|
|
52
|
+
// Safe skip: unknown dstChainId is reported by validateTrades
|
|
53
|
+
if (dstRealChainId === undefined)
|
|
54
|
+
continue;
|
|
55
|
+
const normalized = normalizeAddress(dstRealChainId, address);
|
|
56
|
+
const existing = byAddress.get(normalized) ?? new Set();
|
|
57
|
+
existing.add(trade.dstChainId);
|
|
58
|
+
byAddress.set(normalized, existing);
|
|
59
|
+
}
|
|
60
|
+
return byAddress;
|
|
61
|
+
}
|
|
62
|
+
// First pass over the response list: detects duplicates and records the
|
|
63
|
+
// first occurrence index per normalized address. Duplicate violations are
|
|
64
|
+
// appended directly to the caller's violations array.
|
|
65
|
+
function buildFirstOccurrence(list, basePath, duplicateCode, fieldLabel, violations) {
|
|
66
|
+
const firstOccurrence = new Map();
|
|
67
|
+
for (let i = 0; i < list.length; i++) {
|
|
68
|
+
const normalized = normalizeAddressByValue(list[i].address);
|
|
69
|
+
const earlier = firstOccurrence.get(normalized);
|
|
70
|
+
if (earlier === undefined) {
|
|
71
|
+
firstOccurrence.set(normalized, i);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
violations.push({
|
|
75
|
+
code: duplicateCode,
|
|
76
|
+
message: `intent.${fieldLabel}[${i}] duplicates the entry at`
|
|
77
|
+
+ ` index ${earlier} — each address must appear once`,
|
|
78
|
+
path: `${basePath}[${i}].address`,
|
|
79
|
+
actual: normalized,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return firstOccurrence;
|
|
83
|
+
}
|
|
84
|
+
function reportMissingAddresses(expected, firstOccurrence, basePath, missingCode, fieldLabel) {
|
|
85
|
+
const violations = [];
|
|
86
|
+
for (const address of expected.keys()) {
|
|
87
|
+
if (!firstOccurrence.has(address)) {
|
|
88
|
+
violations.push({
|
|
89
|
+
code: missingCode,
|
|
90
|
+
message: `an expected intent.${fieldLabel}[].address is missing`
|
|
91
|
+
+ ` from the response`,
|
|
92
|
+
path: basePath,
|
|
93
|
+
expected: address,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return violations;
|
|
98
|
+
}
|
|
99
|
+
function validateEntries(list, firstOccurrence, expected, basePath, codes, fieldLabel) {
|
|
100
|
+
const violations = [];
|
|
101
|
+
// Validate each unique entry (duplicates are already reported above)
|
|
102
|
+
for (const [address, i] of firstOccurrence) {
|
|
103
|
+
const entry = list[i];
|
|
104
|
+
const expectedChainIds = expected.get(address);
|
|
105
|
+
if (expectedChainIds === undefined) {
|
|
106
|
+
violations.push({
|
|
107
|
+
code: codes.addressInvalid,
|
|
108
|
+
message: `intent.${fieldLabel}[].address is not present in`
|
|
109
|
+
+ ` any request trade for this group`,
|
|
110
|
+
path: `${basePath}[${i}].address`,
|
|
111
|
+
expected: Array.from(expected.keys()),
|
|
112
|
+
actual: address,
|
|
113
|
+
});
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
violations.push(...validateEntryChainIds(entry, expectedChainIds, `${basePath}[${i}].destinationChainIds`, codes.chainIdsMismatch, fieldLabel));
|
|
117
|
+
}
|
|
118
|
+
return violations;
|
|
119
|
+
}
|
|
120
|
+
// CRITICAL: destinationChainIds must be exactly the set of chainIds where
|
|
121
|
+
// this address was used in the request. The protocol reserves SpecialChainId.Any
|
|
122
|
+
// but the API does not emit it today, so we reject it for now — support will
|
|
123
|
+
// be added when the API starts producing it.
|
|
124
|
+
function validateEntryChainIds(entry, expectedChainIds, path, code, fieldLabel) {
|
|
125
|
+
if (entry.destinationChainIds === SpecialChainId.Any) {
|
|
126
|
+
return [{
|
|
127
|
+
code,
|
|
128
|
+
message: `intent.${fieldLabel}[].destinationChainIds must be a concrete`
|
|
129
|
+
+ ` list of chainIds. SpecialChainId.Any is reserved by the`
|
|
130
|
+
+ ` protocol but not yet emitted by the API.`,
|
|
131
|
+
path,
|
|
132
|
+
expected: sortChainIds(expectedChainIds),
|
|
133
|
+
actual: entry.destinationChainIds,
|
|
134
|
+
}];
|
|
135
|
+
}
|
|
136
|
+
const actualChainIds = new Set(entry.destinationChainIds);
|
|
137
|
+
if (setsEqual(actualChainIds, expectedChainIds))
|
|
138
|
+
return [];
|
|
139
|
+
return [{
|
|
140
|
+
code,
|
|
141
|
+
message: `intent.${fieldLabel}[].destinationChainIds must contain exactly`
|
|
142
|
+
+ ` the chainIds where this address was used in request`
|
|
143
|
+
+ ` (no missing, no extras)`,
|
|
144
|
+
path,
|
|
145
|
+
expected: sortChainIds(expectedChainIds),
|
|
146
|
+
actual: entry.destinationChainIds,
|
|
147
|
+
}];
|
|
148
|
+
}
|
|
149
|
+
function sortChainIds(set) {
|
|
150
|
+
return Array.from(set).sort((a, b) => a - b);
|
|
151
|
+
}
|
|
152
|
+
// CRITICAL: all chainIds in destinationChainIds (unless set to "any") must
|
|
153
|
+
// share the same address format (engine), and entry.address must be in that format.
|
|
154
|
+
// MITM could otherwise return, e.g., destinationChainIds=[Ethereum, Solana]
|
|
155
|
+
// with an EVM address, which is impossible because one string can't be valid on both.
|
|
156
|
+
function validateAddressChainConsistency(entry, basePath, code, fieldLabel) {
|
|
157
|
+
if (entry.destinationChainIds === SpecialChainId.Any)
|
|
158
|
+
return [];
|
|
159
|
+
const engines = new Set();
|
|
160
|
+
for (const chainId of entry.destinationChainIds) {
|
|
161
|
+
const realChainId = resolveChainId(chainId);
|
|
162
|
+
// Safe skip: unknown dstChainId is reported by validateTrades
|
|
163
|
+
if (realChainId === undefined)
|
|
164
|
+
continue;
|
|
165
|
+
engines.add(getChainEngine(realChainId));
|
|
166
|
+
}
|
|
167
|
+
if (engines.size === 0)
|
|
168
|
+
return [];
|
|
169
|
+
if (engines.size > 1) {
|
|
170
|
+
return [{
|
|
171
|
+
code,
|
|
172
|
+
message: `intent.${fieldLabel}[].destinationChainIds spans multiple`
|
|
173
|
+
+ ` chain engines — a single address cannot be valid across`
|
|
174
|
+
+ ` different engines (EVM / Solana / Tron / etc.)`,
|
|
175
|
+
path: `${basePath}.destinationChainIds`,
|
|
176
|
+
actual: entry.destinationChainIds,
|
|
177
|
+
}];
|
|
178
|
+
}
|
|
179
|
+
const expectedEngine = engines.values().next().value;
|
|
180
|
+
const actualEngine = detectChainEngine(entry.address);
|
|
181
|
+
if (expectedEngine !== actualEngine) {
|
|
182
|
+
return [{
|
|
183
|
+
code,
|
|
184
|
+
message: `intent.${fieldLabel}[].address format (${ChainEngine[actualEngine]})`
|
|
185
|
+
+ ` does not match the chain engine of destinationChainIds`
|
|
186
|
+
+ ` (${ChainEngine[expectedEngine]})`,
|
|
187
|
+
path: `${basePath}.address`,
|
|
188
|
+
expected: { format: ChainEngine[expectedEngine] },
|
|
189
|
+
actual: { address: entry.address, format: ChainEngine[actualEngine] },
|
|
190
|
+
}];
|
|
191
|
+
}
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=intent-destinations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-destinations.js","sourceRoot":"","sources":["../../../src/validations/intent-destinations.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,aAAa,EAGb,cAAc,EACd,WAAW,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EACH,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,uBAAuB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAUxE,MAAM,UAAU,0BAA0B,CACtC,MAAsB,EACtB,KAAiB,EACjB,QAAgB,EAChB,SAAkB;IAElB,uEAAuE;IACvE,0CAA0C;IAC1C,IAAI,SAAS;QAAE,OAAO,EAAE,CAAC;IAEzB,OAAO;QACH,GAAG,uBAAuB,CACtB,MAAM,CAAC,eAAe,EACtB,KAAK,EACL,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,EACxC,GAAG,QAAQ,kBAAkB,EAC7B;YACI,cAAc,EAAE,aAAa,CAAC,mCAAmC;YACjE,gBAAgB,EAAE,aAAa,CAAC,qCAAqC;YACrE,OAAO,EAAE,aAAa,CAAC,4BAA4B;YACnD,SAAS,EAAE,aAAa,CAAC,8BAA8B;YACvD,oBAAoB,EAAE,aAAa,CAAC,yCAAyC;SAChF,EACD,iBAAiB,CACpB;QACD,GAAG,uBAAuB,CACtB,MAAM,CAAC,mBAAmB,EAC1B,KAAK,EACL,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,EACvC,GAAG,QAAQ,sBAAsB,EACjC;YACI,cAAc,EAAE,aAAa,CAAC,gCAAgC;YAC9D,gBAAgB,EAAE,aAAa,CAAC,kCAAkC;YAClE,OAAO,EAAE,aAAa,CAAC,yBAAyB;YAChD,SAAS,EAAE,aAAa,CAAC,2BAA2B;YACpD,oBAAoB,EAAE,aAAa,CAAC,sCAAsC;SAC7E,EACD,qBAAqB,CACxB;KACJ,CAAC;AACN,CAAC;AAED,+EAA+E;AAC/E,mFAAmF;AACnF,+DAA+D;AAC/D,SAAS,uBAAuB,CAC5B,OAAiD,EACjD,KAAiB,EACjB,IAAiE,EACjE,QAAgB,EAChB,KAAuB,EACvB,UAAkB;IAElB,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,GAAG,+BAA+B,CAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,oBAAoB,EAAE,UAAU,CACvE,CAAC,CAAC;IACP,CAAC;IAED,MAAM,eAAe,GAAG,oBAAoB,CACxC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAC1D,CAAC;IAEF,UAAU,CAAC,IAAI,CAAC,GAAG,sBAAsB,CACrC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,CACjE,CAAC,CAAC;IAEH,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAC9B,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAC/D,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,yEAAyE;AACzE,wEAAwE;AACxE,8BAA8B;AAC9B,SAAS,wBAAwB,CAC7B,KAAiB,EACjB,IAAiE;IAEjE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QAEpC,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxD,8DAA8D;QAC9D,IAAI,cAAc,KAAK,SAAS;YAAE,SAAS;QAE3C,MAAM,UAAU,GAAG,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QAChE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE/B,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,wEAAwE;AACxE,0EAA0E;AAC1E,sDAAsD;AACtD,SAAS,oBAAoB,CACzB,IAAkC,EAClC,QAAgB,EAChB,aAA4B,EAC5B,UAAkB,EAClB,UAAuB;IAEvB,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAE5D,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACnC,SAAS;QACb,CAAC;QAED,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EACH,UAAU,UAAU,IAAI,CAAC,2BAA2B;kBAClD,UAAU,OAAO,kCAAkC;YACzD,IAAI,EAAE,GAAG,QAAQ,IAAI,CAAC,WAAW;YACjC,MAAM,EAAE,UAAU;SACrB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,eAAe,CAAC;AAC3B,CAAC;AAED,SAAS,sBAAsB,CAC3B,QAAkC,EAClC,eAAoC,EACpC,QAAgB,EAChB,WAA0B,EAC1B,UAAkB;IAElB,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,WAAW;gBACjB,OAAO,EACH,sBAAsB,UAAU,uBAAuB;sBACrD,oBAAoB;gBAC1B,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,OAAO;aACpB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAS,eAAe,CACpB,IAAkC,EAClC,eAAoC,EACpC,QAAkC,EAClC,QAAgB,EAChB,KAAuB,EACvB,UAAkB;IAElB,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,qEAAqE;IACrE,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,KAAK,CAAC,cAAc;gBAC1B,OAAO,EACH,UAAU,UAAU,8BAA8B;sBAChD,mCAAmC;gBACzC,IAAI,EAAE,GAAG,QAAQ,IAAI,CAAC,WAAW;gBACjC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACrC,MAAM,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,SAAS;QACb,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,qBAAqB,CACpC,KAAK,EACL,gBAAgB,EAChB,GAAG,QAAQ,IAAI,CAAC,uBAAuB,EACvC,KAAK,CAAC,gBAAgB,EACtB,UAAU,CACb,CAAC,CAAC;IACP,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,0EAA0E;AAC1E,iFAAiF;AACjF,6EAA6E;AAC7E,6CAA6C;AAC7C,SAAS,qBAAqB,CAC1B,KAAiC,EACjC,gBAA6B,EAC7B,IAAY,EACZ,IAAmB,EACnB,UAAkB;IAElB,IAAI,KAAK,CAAC,mBAAmB,KAAK,cAAc,CAAC,GAAG,EAAE,CAAC;QACnD,OAAO,CAAC;gBACJ,IAAI;gBACJ,OAAO,EACH,UAAU,UAAU,2CAA2C;sBAC7D,0DAA0D;sBAC1D,2CAA2C;gBACjD,IAAI;gBACJ,QAAQ,EAAE,YAAY,CAAC,gBAAgB,CAAC;gBACxC,MAAM,EAAE,KAAK,CAAC,mBAAmB;aACpC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE1D,IAAI,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAC;IAE3D,OAAO,CAAC;YACJ,IAAI;YACJ,OAAO,EACH,UAAU,UAAU,6CAA6C;kBAC/D,sDAAsD;kBACtD,0BAA0B;YAChC,IAAI;YACJ,QAAQ,EAAE,YAAY,CAAC,gBAAgB,CAAC;YACxC,MAAM,EAAE,KAAK,CAAC,mBAAmB;SACpC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CAAC,GAAgB;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,2EAA2E;AAC3E,oFAAoF;AACpF,4EAA4E;AAC5E,sFAAsF;AACtF,SAAS,+BAA+B,CACpC,KAAiC,EACjC,QAAgB,EAChB,IAAmB,EACnB,UAAkB;IAElB,IAAI,KAAK,CAAC,mBAAmB,KAAK,cAAc,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEhE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;IACvC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC5C,8DAA8D;QAC9D,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QAExC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC;gBACJ,IAAI;gBACJ,OAAO,EACH,UAAU,UAAU,uCAAuC;sBACzD,0DAA0D;sBAC1D,iDAAiD;gBACvD,IAAI,EAAE,GAAG,QAAQ,sBAAsB;gBACvC,MAAM,EAAE,KAAK,CAAC,mBAAmB;aACpC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;IACtD,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,CAAC;gBACJ,IAAI;gBACJ,OAAO,EACH,UAAU,UAAU,sBAAsB,WAAW,CAAC,YAAY,CAAC,GAAG;sBACpE,yDAAyD;sBACzD,KAAK,WAAW,CAAC,cAAc,CAAC,GAAG;gBACzC,IAAI,EAAE,GAAG,QAAQ,UAAU;gBAC3B,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE;gBACjD,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE;aACxE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC"}
|