@debridge-finance/borderless-validation-sdk 0.0.0-dev-4a73f49 → 0.0.1
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/dist/cjs/helpers/address.js +18 -53
- package/dist/cjs/helpers/address.js.map +1 -1
- package/dist/cjs/helpers/constants.js +6 -0
- package/dist/cjs/helpers/constants.js.map +1 -0
- package/dist/cjs/helpers/evm-action.js +3 -3
- package/dist/cjs/helpers/evm-action.js.map +1 -1
- package/dist/cjs/helpers/evm-intent-id.js +13 -27
- package/dist/cjs/helpers/evm-intent-id.js.map +1 -1
- package/dist/cjs/helpers/evm-trade-amounts.js +1 -36
- package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/cjs/types/enums.js +2 -32
- package/dist/cjs/types/enums.js.map +1 -1
- package/dist/cjs/types/request.js +2 -25
- package/dist/cjs/types/request.js.map +1 -1
- package/dist/cjs/types/response.js +5 -125
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +10 -81
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/validations/evm-caveats.js +14 -4
- package/dist/cjs/validations/evm-caveats.js.map +1 -1
- package/dist/cjs/validations/evm-op-budget.js +10 -13
- package/dist/cjs/validations/evm-op-budget.js.map +1 -1
- package/dist/cjs/validations/evm-op-gas-compensation.js +152 -0
- package/dist/cjs/validations/evm-op-gas-compensation.js.map +1 -0
- package/dist/cjs/validations/evm-op-hook.js +3 -410
- package/dist/cjs/validations/evm-op-hook.js.map +1 -1
- package/dist/cjs/validations/evm-op-wrap.js +7 -10
- package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
- package/dist/cjs/validations/evm-required-actions.js +9 -7
- package/dist/cjs/validations/evm-required-actions.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-metamask.js +94 -17
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/cjs/validations/evm-sign7702.js +22 -34
- package/dist/cjs/validations/evm-sign7702.js.map +1 -1
- package/dist/cjs/validations/hooks-common.js +37 -252
- package/dist/cjs/validations/hooks-common.js.map +1 -1
- 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 +22 -33
- package/dist/cjs/validations/solana-hook.js.map +1 -1
- package/dist/cjs/validations/solana-op-budget.js +18 -56
- package/dist/cjs/validations/solana-op-budget.js.map +1 -1
- package/dist/cjs/validations/solana-op-wrap.js +13 -46
- 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 +1 -139
- package/dist/cjs/validations/trade-grouping.js.map +1 -1
- package/dist/cjs/validations/trades.js +40 -162
- package/dist/cjs/validations/trades.js.map +1 -1
- package/dist/cjs/validator.js +16 -11
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/environment-config.js +28 -47
- package/dist/cjs/whitelists/environment-config.js.map +1 -1
- package/dist/cjs/whitelists/evm/caveat-enforcers.js +5 -21
- package/dist/cjs/whitelists/evm/caveat-enforcers.js.map +1 -1
- package/dist/cjs/whitelists/evm/delegation-manager.js +2 -7
- package/dist/cjs/whitelists/evm/delegation-manager.js.map +1 -1
- package/dist/cjs/whitelists/evm/eip7702-delegation.js +2 -7
- package/dist/cjs/whitelists/evm/eip7702-delegation.js.map +1 -1
- package/dist/cjs/whitelists/evm/index.js +1 -14
- package/dist/cjs/whitelists/evm/index.js.map +1 -1
- package/dist/cjs/whitelists/evm/permit2.js +12 -16
- package/dist/cjs/whitelists/evm/permit2.js.map +1 -1
- package/dist/cjs/whitelists/evm/weth.js +5 -16
- package/dist/cjs/whitelists/evm/weth.js.map +1 -1
- package/dist/cjs/whitelists/solana/intent-signature.js +1 -0
- package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/cjs/whitelists/subscription-to-chain-id.js +0 -10
- package/dist/cjs/whitelists/subscription-to-chain-id.js.map +1 -1
- package/dist/cjs/whitelists/types.js +3 -13
- package/dist/cjs/whitelists/types.js.map +1 -1
- package/dist/esm/helpers/address.js +17 -48
- package/dist/esm/helpers/address.js.map +1 -1
- package/dist/esm/helpers/constants.js +3 -0
- package/dist/esm/helpers/constants.js.map +1 -0
- package/dist/esm/helpers/evm-action.js +3 -3
- package/dist/esm/helpers/evm-action.js.map +1 -1
- package/dist/esm/helpers/evm-intent-id.js +13 -27
- package/dist/esm/helpers/evm-intent-id.js.map +1 -1
- package/dist/esm/helpers/evm-trade-amounts.js +1 -36
- package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/esm/types/enums.js +1 -31
- package/dist/esm/types/enums.js.map +1 -1
- package/dist/esm/types/request.js +3 -26
- package/dist/esm/types/request.js.map +1 -1
- package/dist/esm/types/response.js +4 -124
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +10 -81
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/validations/evm-caveats.js +14 -4
- package/dist/esm/validations/evm-caveats.js.map +1 -1
- package/dist/esm/validations/evm-op-budget.js +10 -13
- package/dist/esm/validations/evm-op-budget.js.map +1 -1
- package/dist/esm/validations/evm-op-gas-compensation.js +149 -0
- package/dist/esm/validations/evm-op-gas-compensation.js.map +1 -0
- package/dist/esm/validations/evm-op-hook.js +2 -409
- package/dist/esm/validations/evm-op-hook.js.map +1 -1
- package/dist/esm/validations/evm-op-wrap.js +7 -10
- package/dist/esm/validations/evm-op-wrap.js.map +1 -1
- package/dist/esm/validations/evm-required-actions.js +9 -7
- package/dist/esm/validations/evm-required-actions.js.map +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js +94 -17
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/esm/validations/evm-sign7702.js +22 -33
- package/dist/esm/validations/evm-sign7702.js.map +1 -1
- package/dist/esm/validations/hooks-common.js +38 -251
- package/dist/esm/validations/hooks-common.js.map +1 -1
- 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 +24 -35
- package/dist/esm/validations/solana-hook.js.map +1 -1
- package/dist/esm/validations/solana-op-budget.js +18 -56
- package/dist/esm/validations/solana-op-budget.js.map +1 -1
- package/dist/esm/validations/solana-op-wrap.js +14 -47
- 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 +1 -139
- package/dist/esm/validations/trade-grouping.js.map +1 -1
- package/dist/esm/validations/trades.js +41 -163
- package/dist/esm/validations/trades.js.map +1 -1
- package/dist/esm/validator.js +16 -11
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/environment-config.js +28 -47
- package/dist/esm/whitelists/environment-config.js.map +1 -1
- package/dist/esm/whitelists/evm/caveat-enforcers.js +4 -20
- package/dist/esm/whitelists/evm/caveat-enforcers.js.map +1 -1
- package/dist/esm/whitelists/evm/delegation-manager.js +1 -6
- package/dist/esm/whitelists/evm/delegation-manager.js.map +1 -1
- package/dist/esm/whitelists/evm/eip7702-delegation.js +1 -6
- 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/permit2.js +5 -9
- package/dist/esm/whitelists/evm/permit2.js.map +1 -1
- package/dist/esm/whitelists/evm/weth.js +5 -16
- package/dist/esm/whitelists/evm/weth.js.map +1 -1
- package/dist/esm/whitelists/solana/intent-signature.js +1 -0
- package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/esm/whitelists/subscription-to-chain-id.js +0 -9
- package/dist/esm/whitelists/subscription-to-chain-id.js.map +1 -1
- package/dist/esm/whitelists/types.js +5 -14
- 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/constants.d.ts +2 -0
- package/dist/types/helpers/constants.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/types/enums.d.ts +1 -24
- package/dist/types/types/enums.d.ts.map +1 -1
- package/dist/types/types/request.d.ts +9 -19
- package/dist/types/types/request.d.ts.map +1 -1
- package/dist/types/types/response.d.ts +17 -1015
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +11 -73
- package/dist/types/types/validation.d.ts.map +1 -1
- 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-gas-compensation.d.ts +3 -0
- package/dist/types/validations/evm-op-gas-compensation.d.ts.map +1 -0
- package/dist/types/validations/evm-op-hook.d.ts +2 -4
- 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-sign7702.d.ts +1 -2
- package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
- package/dist/types/validations/hooks-common.d.ts +0 -1
- package/dist/types/validations/hooks-common.d.ts.map +1 -1
- package/dist/types/validations/required-actions.d.ts +1 -2
- package/dist/types/validations/required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-hook.d.ts +2 -4
- 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 +2 -6
- 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 +0 -8
- package/dist/types/whitelists/evm/caveat-enforcers.d.ts.map +1 -1
- package/dist/types/whitelists/evm/delegation-manager.d.ts +0 -2
- package/dist/types/whitelists/evm/delegation-manager.d.ts.map +1 -1
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts +0 -2
- 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/permit2.d.ts +0 -1
- 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 +0 -1
- 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 +3 -4
- package/README.md +0 -164
- package/dist/cjs/helpers/evm-dln-hook-pack.js +0 -87
- package/dist/cjs/helpers/evm-dln-hook-pack.js.map +0 -1
- package/dist/cjs/helpers/evm-gas-compensation-tx.js +0 -102
- package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +0 -1
- package/dist/cjs/helpers/gas-compensation.js +0 -36
- package/dist/cjs/helpers/gas-compensation.js.map +0 -1
- package/dist/cjs/helpers/hex.js +0 -24
- package/dist/cjs/helpers/hex.js.map +0 -1
- package/dist/cjs/helpers/placeholder.js +0 -174
- package/dist/cjs/helpers/placeholder.js.map +0 -1
- package/dist/cjs/helpers/sets.js +0 -13
- package/dist/cjs/helpers/sets.js.map +0 -1
- package/dist/cjs/validations/compensation-hook.js +0 -203
- package/dist/cjs/validations/compensation-hook.js.map +0 -1
- package/dist/cjs/validations/evm-sign712-shared.js +0 -116
- package/dist/cjs/validations/evm-sign712-shared.js.map +0 -1
- package/dist/cjs/validations/intent-destinations.js +0 -197
- package/dist/cjs/validations/intent-destinations.js.map +0 -1
- package/dist/cjs/validations/intent-tokens.js +0 -347
- package/dist/cjs/validations/intent-tokens.js.map +0 -1
- package/dist/cjs/validations/intent.js +0 -288
- package/dist/cjs/validations/intent.js.map +0 -1
- package/dist/cjs/whitelists/evm/metamask-delegation-chains.js +0 -16
- package/dist/cjs/whitelists/evm/metamask-delegation-chains.js.map +0 -1
- package/dist/esm/helpers/evm-dln-hook-pack.js +0 -82
- package/dist/esm/helpers/evm-dln-hook-pack.js.map +0 -1
- package/dist/esm/helpers/evm-gas-compensation-tx.js +0 -99
- package/dist/esm/helpers/evm-gas-compensation-tx.js.map +0 -1
- package/dist/esm/helpers/gas-compensation.js +0 -33
- package/dist/esm/helpers/gas-compensation.js.map +0 -1
- package/dist/esm/helpers/hex.js +0 -20
- package/dist/esm/helpers/hex.js.map +0 -1
- package/dist/esm/helpers/placeholder.js +0 -168
- package/dist/esm/helpers/placeholder.js.map +0 -1
- package/dist/esm/helpers/sets.js +0 -10
- package/dist/esm/helpers/sets.js.map +0 -1
- package/dist/esm/validations/compensation-hook.js +0 -200
- package/dist/esm/validations/compensation-hook.js.map +0 -1
- package/dist/esm/validations/evm-sign712-shared.js +0 -110
- package/dist/esm/validations/evm-sign712-shared.js.map +0 -1
- package/dist/esm/validations/intent-destinations.js +0 -194
- package/dist/esm/validations/intent-destinations.js.map +0 -1
- package/dist/esm/validations/intent-tokens.js +0 -344
- package/dist/esm/validations/intent-tokens.js.map +0 -1
- package/dist/esm/validations/intent.js +0 -285
- package/dist/esm/validations/intent.js.map +0 -1
- package/dist/esm/whitelists/evm/metamask-delegation-chains.js +0 -13
- package/dist/esm/whitelists/evm/metamask-delegation-chains.js.map +0 -1
- package/dist/types/helpers/evm-dln-hook-pack.d.ts +0 -19
- package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +0 -1
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts +0 -13
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +0 -1
- package/dist/types/helpers/gas-compensation.d.ts +0 -10
- package/dist/types/helpers/gas-compensation.d.ts.map +0 -1
- package/dist/types/helpers/hex.d.ts +0 -3
- package/dist/types/helpers/hex.d.ts.map +0 -1
- package/dist/types/helpers/placeholder.d.ts +0 -41
- package/dist/types/helpers/placeholder.d.ts.map +0 -1
- package/dist/types/helpers/sets.d.ts +0 -2
- package/dist/types/helpers/sets.d.ts.map +0 -1
- package/dist/types/validations/compensation-hook.d.ts +0 -3
- package/dist/types/validations/compensation-hook.d.ts.map +0 -1
- package/dist/types/validations/evm-sign712-shared.d.ts +0 -7
- package/dist/types/validations/evm-sign712-shared.d.ts.map +0 -1
- package/dist/types/validations/intent-destinations.d.ts +0 -4
- package/dist/types/validations/intent-destinations.d.ts.map +0 -1
- package/dist/types/validations/intent-tokens.d.ts +0 -4
- package/dist/types/validations/intent-tokens.d.ts.map +0 -1
- package/dist/types/validations/intent.d.ts +0 -5
- package/dist/types/validations/intent.d.ts.map +0 -1
- package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts +0 -3
- package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts.map +0 -1
|
@@ -1,31 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HookMode = void 0;
|
|
4
3
|
exports.validateHooks = validateHooks;
|
|
5
4
|
const types_1 = require("../types");
|
|
6
5
|
const enums_1 = require("../types/enums");
|
|
7
|
-
const address_1 = require("../helpers/address");
|
|
8
|
-
const gas_compensation_1 = require("../helpers/gas-compensation");
|
|
9
|
-
const placeholder_1 = require("../helpers/placeholder");
|
|
10
6
|
const solana_hook_1 = require("./solana-hook");
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
// Re-exported so call sites can pass the mode without importing from helpers.
|
|
15
|
-
var placeholder_2 = require("../helpers/placeholder");
|
|
16
|
-
Object.defineProperty(exports, "HookMode", { enumerable: true, get: function () { return placeholder_2.HookMode; } });
|
|
17
|
-
// Allowed hook-scope operations — each chain checked against its own enum.
|
|
18
|
-
const EVM_HOOK_OPERATIONS = [
|
|
19
|
-
enums_1.EvmActionOperation.Delegate,
|
|
20
|
-
enums_1.EvmActionOperation.Hook,
|
|
21
|
-
enums_1.EvmActionOperation.GasCompensation,
|
|
22
|
-
];
|
|
23
|
-
const EVM_HOOK_OPERATIONS_SET = new Set(EVM_HOOK_OPERATIONS);
|
|
24
|
-
const SOLANA_HOOK_OPERATIONS = [
|
|
25
|
-
enums_1.SolanaActionOperation.Hook,
|
|
26
|
-
enums_1.SolanaActionOperation.GasCompensation,
|
|
27
|
-
];
|
|
28
|
-
const SOLANA_HOOK_OPERATIONS_SET = new Set(SOLANA_HOOK_OPERATIONS);
|
|
7
|
+
// Both EVM and Solana use identical string values for hook operations
|
|
8
|
+
const HOOK_OPERATIONS = ["Hook", "GasCompensation"];
|
|
9
|
+
const HOOK_OPERATIONS_SET = new Set(HOOK_OPERATIONS);
|
|
29
10
|
function validateHooks(request, response, quoteMode) {
|
|
30
11
|
return [
|
|
31
12
|
...validateHookAAConstraint(request, response),
|
|
@@ -59,35 +40,26 @@ function validateHookAAConstraint(request, response) {
|
|
|
59
40
|
}
|
|
60
41
|
return violations;
|
|
61
42
|
}
|
|
62
|
-
// HIGH: preHooks
|
|
63
|
-
// gasCompensationInfo group (exact equality — API always adds one per group).
|
|
64
|
-
// postHooks must match exactly — the API never adds extras to postHooks.
|
|
43
|
+
// HIGH: response.preHooks.length must equal request.preHooks.length
|
|
65
44
|
function validateHookCounts(request, response) {
|
|
66
45
|
const violations = [];
|
|
67
46
|
const requestPreCount = request.preHooks?.length ?? 0;
|
|
68
47
|
const requestPostCount = request.postHooks?.length ?? 0;
|
|
69
|
-
|
|
70
|
-
// compensation group. If request has no gasCompensationInfo at all, extras
|
|
71
|
-
// are forbidden (this also guards against MITM adding preHook entries when
|
|
72
|
-
// the user never asked for compensation).
|
|
73
|
-
const compensationGroupCount = (0, gas_compensation_1.extractGasCompensationGroups)(request).length;
|
|
74
|
-
const expectedPreCount = requestPreCount + compensationGroupCount;
|
|
75
|
-
if (response.preHooks.length !== expectedPreCount) {
|
|
48
|
+
if (response.preHooks.length !== requestPreCount) {
|
|
76
49
|
violations.push({
|
|
77
50
|
code: types_1.ViolationCode.HookCountMismatch,
|
|
78
|
-
message: "response.preHooks count does not match"
|
|
79
|
-
+ " request.preHooks.length + unique gasCompensationInfo groups",
|
|
51
|
+
message: "response.preHooks count does not match request.preHooks count",
|
|
80
52
|
path: "response.preHooks",
|
|
81
|
-
expected:
|
|
53
|
+
expected: requestPreCount,
|
|
82
54
|
actual: response.preHooks.length,
|
|
83
55
|
});
|
|
84
56
|
}
|
|
85
|
-
// postHooks
|
|
86
|
-
|
|
57
|
+
// postHooks may contain additional compensation hooks beyond what was in the request,
|
|
58
|
+
// so response count must be >= request count
|
|
59
|
+
if (response.postHooks.length < requestPostCount) {
|
|
87
60
|
violations.push({
|
|
88
61
|
code: types_1.ViolationCode.HookCountMismatch,
|
|
89
|
-
message: "response.postHooks count
|
|
90
|
-
+ " request.postHooks count",
|
|
62
|
+
message: "response.postHooks count is less than request.postHooks count",
|
|
91
63
|
path: "response.postHooks",
|
|
92
64
|
expected: requestPostCount,
|
|
93
65
|
actual: response.postHooks.length,
|
|
@@ -102,7 +74,7 @@ function validatePreHooks(request, response, quoteMode) {
|
|
|
102
74
|
const basePath = `response.preHooks[${i}]`;
|
|
103
75
|
const hookPayload = response.preHooks[i];
|
|
104
76
|
const requestHook = requestHooks[i];
|
|
105
|
-
violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request,
|
|
77
|
+
violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode));
|
|
106
78
|
}
|
|
107
79
|
return violations;
|
|
108
80
|
}
|
|
@@ -114,153 +86,31 @@ function validatePostHooks(request, response, quoteMode) {
|
|
|
114
86
|
const hookPayload = response.postHooks[i];
|
|
115
87
|
// User postHooks are matched by index; extra entries are compensation hooks
|
|
116
88
|
const requestHook = i < requestHooks.length ? requestHooks[i] : undefined;
|
|
117
|
-
violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request,
|
|
89
|
+
violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode));
|
|
118
90
|
}
|
|
119
91
|
return violations;
|
|
120
92
|
}
|
|
121
|
-
function validateSingleHookPayload(hookPayload, requestHook, basePath, request,
|
|
122
|
-
const isCompensationPreHook = requestHook === undefined && mode === placeholder_1.HookMode.PreHooks;
|
|
93
|
+
function validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode) {
|
|
123
94
|
return [
|
|
124
|
-
...validateHookEcho(hookPayload, requestHook, basePath
|
|
95
|
+
...validateHookEcho(hookPayload, requestHook, basePath),
|
|
125
96
|
...validateHookUniqueActionIds(hookPayload, basePath),
|
|
126
97
|
...validateHookActionsList(hookPayload, basePath),
|
|
127
|
-
...validateHookDelegateOp(hookPayload, basePath),
|
|
128
|
-
...validateHookSolanaNotDirect(hookPayload, basePath),
|
|
129
98
|
...validateGasCompensationRequiresInfo(hookPayload, basePath, request),
|
|
130
|
-
...(
|
|
131
|
-
? (0, compensation_hook_1.validateCompensationHookStructure)(hookPayload, basePath, request)
|
|
132
|
-
: []),
|
|
133
|
-
...dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request, mode, responseTrades),
|
|
99
|
+
...dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request),
|
|
134
100
|
];
|
|
135
101
|
}
|
|
136
|
-
//
|
|
137
|
-
function
|
|
138
|
-
|
|
139
|
-
if ((0, address_1.getChainEngine)(realChainId) !== enums_1.ChainEngine.Solana)
|
|
102
|
+
// CRITICAL: response hook must echo back the request hook exactly
|
|
103
|
+
function validateHookEcho(hookPayload, requestHook, basePath) {
|
|
104
|
+
if (!requestHook)
|
|
140
105
|
return [];
|
|
141
|
-
if (hookPayload.hook
|
|
142
|
-
return [
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}];
|
|
150
|
-
}
|
|
151
|
-
// CRITICAL: response hook must echo back the request hook field-by-field.
|
|
152
|
-
// Notes:
|
|
153
|
-
// - hook.data in the response has eager placeholders resolved (deferred markers kept).
|
|
154
|
-
// We apply the same resolution to request.data and compare.
|
|
155
|
-
// - For Solana hooks the API deletes `to` and `value` in the echo; we skip those.
|
|
156
|
-
// - For EVM hooks `value` is copied from request as-is (eager resolution is not
|
|
157
|
-
// reflected in the echoed value — only in internal txData used by requiredActions).
|
|
158
|
-
function validateHookEcho(hookPayload, requestHook, basePath, responseTrades, mode) {
|
|
159
|
-
// Missing request counterpart — two shapes, both are MITM-safe:
|
|
160
|
-
// (a) preHook with `i >= request.preHooks.length`:
|
|
161
|
-
// legitimate case — compensation hook appended by the API.
|
|
162
|
-
// MITM case — attacker injects an arbitrary preHook.
|
|
163
|
-
// The echo-by-field check can't distinguish them (there's no request
|
|
164
|
-
// to compare against), so we delegate to the structural compensation
|
|
165
|
-
// check.
|
|
166
|
-
// (b) postHook with `i >= request.postHooks.length`:
|
|
167
|
-
// no legitimate case — the API never appends to postHooks. So we
|
|
168
|
-
// produce a violation.
|
|
169
|
-
if (!requestHook) {
|
|
170
|
-
if (mode === placeholder_1.HookMode.PostHooks) {
|
|
171
|
-
return [{
|
|
172
|
-
code: types_1.ViolationCode.UnexpectedPostHook,
|
|
173
|
-
message: "response.postHooks contains an entry with no matching"
|
|
174
|
-
+ " request postHook",
|
|
175
|
-
path: `${basePath}.hook`,
|
|
176
|
-
actual: hookPayload.hook,
|
|
177
|
-
}];
|
|
178
|
-
}
|
|
179
|
-
return [];
|
|
180
|
-
}
|
|
181
|
-
const echoed = hookPayload.hook;
|
|
182
|
-
const chainId = requestHook.chainId;
|
|
183
|
-
const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(chainId);
|
|
184
|
-
const isSolana = (0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana;
|
|
185
|
-
const hookPath = `${basePath}.hook`;
|
|
186
|
-
const violations = [];
|
|
187
|
-
// chainId — strict number equality (subscriptionId on both sides)
|
|
188
|
-
if (echoed.chainId !== chainId) {
|
|
189
|
-
violations.push(echoMismatch(`${hookPath}.chainId`, requestHook.chainId, echoed.chainId));
|
|
190
|
-
}
|
|
191
|
-
// from — address equality
|
|
192
|
-
if (!(0, address_1.addressEquals)(realChainId, echoed.from, requestHook.from)) {
|
|
193
|
-
violations.push(echoMismatch(`${hookPath}.from`, requestHook.from, echoed.from));
|
|
194
|
-
}
|
|
195
|
-
// isAtomic — strict boolean
|
|
196
|
-
if (echoed.isAtomic !== requestHook.isAtomic) {
|
|
197
|
-
violations.push(echoMismatch(`${hookPath}.isAtomic`, requestHook.isAtomic, echoed.isAtomic));
|
|
198
|
-
}
|
|
199
|
-
// to, value — chain-dependent.
|
|
200
|
-
// Solana: API deletes both from the echo; skip entirely.
|
|
201
|
-
// EVM: compare as-is (value is not modified by placeholder resolution).
|
|
202
|
-
if (!isSolana) {
|
|
203
|
-
violations.push(...compareOptionalAddress(realChainId, `${hookPath}.to`, requestHook.to, echoed.to));
|
|
204
|
-
violations.push(...compareOptionalString(`${hookPath}.value`, requestHook.value, echoed.value));
|
|
205
|
-
}
|
|
206
|
-
// data — eager placeholders are resolved by the API before echoing.
|
|
207
|
-
const { resolved: expectedData, errors } = (0, placeholder_1.resolveEagerPlaceholders)(requestHook.data, realChainId, requestHook.placeHolders, responseTrades, mode);
|
|
208
|
-
for (const error of errors) {
|
|
209
|
-
const reasonText = placeholder_1.PlaceholderResolutionErrorReason[error.reason];
|
|
210
|
-
violations.push({
|
|
211
|
-
code: types_1.ViolationCode.HookPlaceholderResolutionFailed,
|
|
212
|
-
message: `failed to resolve placeholder "${error.nameVariable}"`
|
|
213
|
-
+ ` (${reasonText})`,
|
|
214
|
-
path: `${hookPath}.data`,
|
|
215
|
-
actual: { nameVariable: error.nameVariable, reason: reasonText },
|
|
216
|
-
details: error.details,
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
if (expectedData !== echoed.data) {
|
|
220
|
-
violations.push(echoMismatch(`${hookPath}.data`, expectedData, echoed.data));
|
|
221
|
-
}
|
|
222
|
-
// placeHolders — deep equality via stringify (same source → same serialization).
|
|
223
|
-
if (JSON.stringify(echoed.placeHolders)
|
|
224
|
-
!== JSON.stringify(requestHook.placeHolders)) {
|
|
225
|
-
violations.push(echoMismatch(`${hookPath}.placeHolders`, requestHook.placeHolders, echoed.placeHolders));
|
|
226
|
-
}
|
|
227
|
-
// gasCompensationInfo — deep equality or both undefined.
|
|
228
|
-
if (JSON.stringify(echoed.gasCompensationInfo)
|
|
229
|
-
!== JSON.stringify(requestHook.gasCompensationInfo)) {
|
|
230
|
-
violations.push(echoMismatch(`${hookPath}.gasCompensationInfo`, requestHook.gasCompensationInfo, echoed.gasCompensationInfo));
|
|
231
|
-
}
|
|
232
|
-
// type — strict equality (or both undefined).
|
|
233
|
-
if (echoed.type !== requestHook.type) {
|
|
234
|
-
violations.push(echoMismatch(`${hookPath}.type`, requestHook.type, echoed.type));
|
|
235
|
-
}
|
|
236
|
-
// gasLimit — strict string equality (or both undefined).
|
|
237
|
-
if (echoed.gasLimit !== requestHook.gasLimit) {
|
|
238
|
-
violations.push(echoMismatch(`${hookPath}.gasLimit`, requestHook.gasLimit, echoed.gasLimit));
|
|
239
|
-
}
|
|
240
|
-
return violations;
|
|
241
|
-
}
|
|
242
|
-
function echoMismatch(path, expected, actual) {
|
|
243
|
-
return {
|
|
244
|
-
code: types_1.ViolationCode.HookEchoMismatch,
|
|
245
|
-
message: "response hook field does not match request",
|
|
246
|
-
path,
|
|
247
|
-
expected,
|
|
248
|
-
actual,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
function compareOptionalString(path, expected, actual) {
|
|
252
|
-
if (expected === actual)
|
|
253
|
-
return [];
|
|
254
|
-
return [echoMismatch(path, expected, actual)];
|
|
255
|
-
}
|
|
256
|
-
function compareOptionalAddress(chainId, path, expected, actual) {
|
|
257
|
-
if (expected === undefined && actual === undefined)
|
|
258
|
-
return [];
|
|
259
|
-
if (expected === undefined || actual === undefined) {
|
|
260
|
-
return [echoMismatch(path, expected, actual)];
|
|
261
|
-
}
|
|
262
|
-
if (!(0, address_1.addressEquals)(chainId, expected, actual)) {
|
|
263
|
-
return [echoMismatch(path, expected, actual)];
|
|
106
|
+
if (JSON.stringify(hookPayload.hook) !== JSON.stringify(requestHook)) {
|
|
107
|
+
return [{
|
|
108
|
+
code: types_1.ViolationCode.HookEchoMismatch,
|
|
109
|
+
message: "response hook does not match request hook",
|
|
110
|
+
path: `${basePath}.hook`,
|
|
111
|
+
expected: requestHook,
|
|
112
|
+
actual: hookPayload.hook,
|
|
113
|
+
}];
|
|
264
114
|
}
|
|
265
115
|
return [];
|
|
266
116
|
}
|
|
@@ -288,10 +138,6 @@ function validateHookUniqueActionIds(hookPayload, basePath) {
|
|
|
288
138
|
}
|
|
289
139
|
// HIGH: each hook required action must have exactly one operation: [Hook] or [GasCompensation]
|
|
290
140
|
function validateHookActionsList(hookPayload, basePath) {
|
|
291
|
-
const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(hookPayload.hook.chainId);
|
|
292
|
-
const isSolana = (0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana;
|
|
293
|
-
const allowedSet = isSolana ? SOLANA_HOOK_OPERATIONS_SET : EVM_HOOK_OPERATIONS_SET;
|
|
294
|
-
const allowedList = isSolana ? SOLANA_HOOK_OPERATIONS : EVM_HOOK_OPERATIONS;
|
|
295
141
|
const violations = [];
|
|
296
142
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
297
143
|
const action = hookPayload.requiredActions[i];
|
|
@@ -306,85 +152,26 @@ function validateHookActionsList(hookPayload, basePath) {
|
|
|
306
152
|
});
|
|
307
153
|
continue;
|
|
308
154
|
}
|
|
309
|
-
if (!
|
|
155
|
+
if (!HOOK_OPERATIONS_SET.has(action.actions[0])) {
|
|
310
156
|
violations.push({
|
|
311
157
|
code: types_1.ViolationCode.HookActionsInvalid,
|
|
312
158
|
message: "hook required action operation must be Hook"
|
|
313
159
|
+ " or GasCompensation",
|
|
314
160
|
path: `${actionPath}.actions`,
|
|
315
|
-
expected:
|
|
161
|
+
expected: HOOK_OPERATIONS,
|
|
316
162
|
actual: action.actions,
|
|
317
163
|
});
|
|
318
164
|
}
|
|
319
165
|
}
|
|
320
166
|
return violations;
|
|
321
167
|
}
|
|
322
|
-
// HIGH: Delegate-op constraints for EVM hook requiredActions.
|
|
323
|
-
// * `Delegate` may appear at most once.
|
|
324
|
-
// * If present, it must be the first required action (the API emits
|
|
325
|
-
// Sign7702Authorization → Sign712MetaMaskCaveats* in this order).
|
|
326
|
-
// * Direct hooks (`hook.type === 'direct'`) must not contain `Delegate`
|
|
327
|
-
// (Direct mode skips EIP-7702 delegation entirely).
|
|
328
|
-
// Solana hooks bypass this check — `Delegate` is rejected upstream by
|
|
329
|
-
// `validateHookActionsList`.
|
|
330
|
-
function validateHookDelegateOp(hookPayload, basePath) {
|
|
331
|
-
const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(hookPayload.hook.chainId);
|
|
332
|
-
if ((0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana)
|
|
333
|
-
return [];
|
|
334
|
-
const indices = [];
|
|
335
|
-
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
336
|
-
const action = hookPayload.requiredActions[i];
|
|
337
|
-
const ops = action.actions;
|
|
338
|
-
if (ops.includes(enums_1.EvmActionOperation.Delegate)) {
|
|
339
|
-
indices.push(i);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
if (indices.length === 0)
|
|
343
|
-
return [];
|
|
344
|
-
const violations = [];
|
|
345
|
-
if (hookPayload.hook.type === enums_1.BundleHookType.Direct) {
|
|
346
|
-
violations.push({
|
|
347
|
-
code: types_1.ViolationCode.HookDelegateInDirect,
|
|
348
|
-
message: "Direct hook must not contain a Delegate operation"
|
|
349
|
-
+ " (Direct mode skips EIP-7702 delegation)",
|
|
350
|
-
path: `${basePath}.requiredActions`,
|
|
351
|
-
actual: indices,
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
if (indices.length > 1) {
|
|
355
|
-
violations.push({
|
|
356
|
-
code: types_1.ViolationCode.HookMultipleDelegate,
|
|
357
|
-
message: "hook requiredActions must contain at most one Delegate",
|
|
358
|
-
path: `${basePath}.requiredActions`,
|
|
359
|
-
expected: 1,
|
|
360
|
-
actual: indices,
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
if (indices[0] !== 0) {
|
|
364
|
-
violations.push({
|
|
365
|
-
code: types_1.ViolationCode.HookDelegateNotFirst,
|
|
366
|
-
message: "if Delegate is present in hook requiredActions, it must be"
|
|
367
|
-
+ " the first action",
|
|
368
|
-
path: `${basePath}.requiredActions[${indices[0]}]`,
|
|
369
|
-
expected: 0,
|
|
370
|
-
actual: indices[0],
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
return violations;
|
|
374
|
-
}
|
|
375
168
|
// CRITICAL: GasCompensation must only appear when gasCompensationInfo exists
|
|
376
169
|
function validateGasCompensationRequiresInfo(hookPayload, basePath, request) {
|
|
377
170
|
const hasGasCompensationInfo = (request.preHooks ?? []).some(h => h.gasCompensationInfo !== undefined);
|
|
378
|
-
const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(hookPayload.hook.chainId);
|
|
379
|
-
const isSolana = (0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana;
|
|
380
|
-
const gasCompensationOp = isSolana
|
|
381
|
-
? enums_1.SolanaActionOperation.GasCompensation
|
|
382
|
-
: enums_1.EvmActionOperation.GasCompensation;
|
|
383
171
|
const violations = [];
|
|
384
172
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
385
173
|
const action = hookPayload.requiredActions[i];
|
|
386
|
-
const hasGasCompensation = action.actions
|
|
387
|
-
.includes(gasCompensationOp);
|
|
174
|
+
const hasGasCompensation = action.actions.includes("GasCompensation");
|
|
388
175
|
if (hasGasCompensation && !hasGasCompensationInfo) {
|
|
389
176
|
violations.push({
|
|
390
177
|
code: types_1.ViolationCode.HookGasCompensationWithoutInfo,
|
|
@@ -397,20 +184,18 @@ function validateGasCompensationRequiresInfo(hookPayload, basePath, request) {
|
|
|
397
184
|
}
|
|
398
185
|
return violations;
|
|
399
186
|
}
|
|
400
|
-
function dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request
|
|
401
|
-
const
|
|
402
|
-
if (
|
|
187
|
+
function dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request) {
|
|
188
|
+
const chainId = hookPayload.hook.chainId;
|
|
189
|
+
if (chainId === enums_1.ChainId.Solana) {
|
|
403
190
|
const srcChainAuthorityAddress = findSolanaSrcChainAuthority(request);
|
|
404
|
-
return (0, solana_hook_1.validateSolanaHookActions)(hookPayload, requestHook, basePath, quoteMode, srcChainAuthorityAddress, request
|
|
191
|
+
return (0, solana_hook_1.validateSolanaHookActions)(hookPayload, requestHook, basePath, quoteMode, srcChainAuthorityAddress, request);
|
|
405
192
|
}
|
|
406
|
-
|
|
193
|
+
// AI: EVM hook validation dispatch will go here when implemented
|
|
194
|
+
return [];
|
|
407
195
|
}
|
|
408
196
|
function findSolanaSrcChainAuthority(request) {
|
|
409
197
|
for (const trade of request.trades) {
|
|
410
|
-
|
|
411
|
-
if (realChainId === undefined)
|
|
412
|
-
continue;
|
|
413
|
-
if ((0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana) {
|
|
198
|
+
if (trade.srcChainId === enums_1.ChainId.Solana) {
|
|
414
199
|
return trade.srcChainAuthorityAddress;
|
|
415
200
|
}
|
|
416
201
|
}
|
|
@@ -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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"}
|
|
@@ -4,8 +4,11 @@ exports.validateRequiredActions = validateRequiredActions;
|
|
|
4
4
|
const types_1 = require("../types");
|
|
5
5
|
const evm_required_actions_1 = require("./evm-required-actions");
|
|
6
6
|
const solana_required_actions_1 = require("./solana-required-actions");
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const trade_grouping_1 = require("./trade-grouping");
|
|
8
|
+
function validateRequiredActions(request, response, quoteMode, envConfig) {
|
|
9
|
+
const { groups, violations: groupViolations } = (0, trade_grouping_1.groupTrades)(request.trades, quoteMode);
|
|
10
|
+
const { contexts, violations } = (0, trade_grouping_1.matchIntentsToGroups)(response.intents, groups, quoteMode);
|
|
11
|
+
violations.push(...groupViolations);
|
|
9
12
|
for (const ctx of contexts) {
|
|
10
13
|
const basePath = `response.intents[${ctx.intentIndex}]`;
|
|
11
14
|
const { realChainId } = ctx.tradeGroup;
|
|
@@ -14,16 +17,13 @@ function validateRequiredActions(request, response, contexts, quoteMode, envConf
|
|
|
14
17
|
// Dispatch to chain-specific validator based on realChainId.
|
|
15
18
|
// "Transaction" exists in both EvmActionKind and SolanaActionKind,
|
|
16
19
|
// so we must use chain context to disambiguate.
|
|
17
|
-
// Per-intent validators (Budget/Wrap amount summation) take the
|
|
18
|
-
// intent's trade subset, not the whole group, since the API may split
|
|
19
|
-
// a group into multiple intents.
|
|
20
20
|
if (realChainId === types_1.ChainId.Solana) {
|
|
21
21
|
const solanaActions = filterSolanaActions(allActions);
|
|
22
|
-
violations.push(...(0, solana_required_actions_1.validateSolanaRequiredActions)(request, solanaActions, basePath, realChainId, quoteMode, ctx.
|
|
22
|
+
violations.push(...(0, solana_required_actions_1.validateSolanaRequiredActions)(request, solanaActions, basePath, realChainId, quoteMode, ctx.tradeGroup.trades, ctx.tradeGroup.srcChainAuthorityAddress, ctx.intentPayload.intent, envConfig));
|
|
23
23
|
}
|
|
24
24
|
else {
|
|
25
25
|
const evmActions = filterEvmActions(allActions);
|
|
26
|
-
violations.push(...(0, evm_required_actions_1.validateEvmRequiredActions)(request, response, evmActions, basePath, realChainId, quoteMode, ctx.intentPayload.intent, ctx.
|
|
26
|
+
violations.push(...(0, evm_required_actions_1.validateEvmRequiredActions)(request, response, evmActions, basePath, realChainId, quoteMode, ctx.intentPayload.intent, ctx.tradeGroup.trades, ctx.tradeGroup.srcChainAuthorityAddress, envConfig));
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
return violations;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"required-actions.js","sourceRoot":"","sources":["../../../src/validations/required-actions.ts"],"names":[],"mappings":";;AAmBA,
|
|
1
|
+
{"version":3,"file":"required-actions.js","sourceRoot":"","sources":["../../../src/validations/required-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,25 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateSolanaHookActions = validateSolanaHookActions;
|
|
4
4
|
const types_1 = require("../types");
|
|
5
|
-
const hex_1 = require("../helpers/hex");
|
|
6
5
|
const solana_instruction_1 = require("../helpers/solana-instruction");
|
|
7
6
|
const programs_1 = require("../whitelists/solana/programs");
|
|
8
7
|
const address_1 = require("../helpers/address");
|
|
9
8
|
const enums_1 = require("../types/enums");
|
|
10
|
-
const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
|
|
11
9
|
const solana_transaction_decode_1 = require("../helpers/solana-transaction-decode");
|
|
12
|
-
|
|
13
|
-
function validateSolanaHookActions(hookPayload, requestHook, basePath, quoteMode, srcChainAuthorityAddress, request, realChainId, mode, responseTrades) {
|
|
10
|
+
function validateSolanaHookActions(hookPayload, requestHook, basePath, quoteMode, srcChainAuthorityAddress, request) {
|
|
14
11
|
const violations = [];
|
|
15
12
|
const gasCompensationTokenAddresses = (request.preHooks ?? [])
|
|
16
|
-
.filter(h =>
|
|
17
|
-
const info = h.gasCompensationInfo;
|
|
18
|
-
if (info === undefined)
|
|
19
|
-
return false;
|
|
20
|
-
const real = (0, subscription_to_chain_id_1.resolveChainId)(info.chainId);
|
|
21
|
-
return real !== undefined
|
|
22
|
-
&& (0, address_1.getChainEngine)(real) === enums_1.ChainEngine.Solana;
|
|
23
|
-
})
|
|
13
|
+
.filter(h => h.gasCompensationInfo?.chainId === enums_1.ChainId.Solana)
|
|
24
14
|
.map(h => h.gasCompensationInfo.tokenAddress);
|
|
25
15
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
26
16
|
const action = hookPayload.requiredActions[i];
|
|
@@ -28,10 +18,10 @@ function validateSolanaHookActions(hookPayload, requestHook, basePath, quoteMode
|
|
|
28
18
|
const ops = action.actions;
|
|
29
19
|
// Only single "Hook" or "GasCompensation" is allowed - validated earlier.
|
|
30
20
|
if (ops.includes(types_1.SolanaActionOperation.Hook)) {
|
|
31
|
-
violations.push(...validateSolanaHookAction(action, requestHook, actionPath
|
|
21
|
+
violations.push(...validateSolanaHookAction(action, requestHook, actionPath));
|
|
32
22
|
}
|
|
33
23
|
if (ops.includes(types_1.SolanaActionOperation.GasCompensation)) {
|
|
34
|
-
violations.push(...validateSolanaGasCompensationAction(action, actionPath, quoteMode, srcChainAuthorityAddress, gasCompensationTokenAddresses
|
|
24
|
+
violations.push(...validateSolanaGasCompensationAction(action, actionPath, quoteMode, srcChainAuthorityAddress, gasCompensationTokenAddresses));
|
|
35
25
|
}
|
|
36
26
|
}
|
|
37
27
|
return violations;
|
|
@@ -39,7 +29,7 @@ function validateSolanaHookActions(hookPayload, requestHook, basePath, quoteMode
|
|
|
39
29
|
// =============================================
|
|
40
30
|
// Hook action: user's transaction passed through as-is
|
|
41
31
|
// =============================================
|
|
42
|
-
function validateSolanaHookAction(action, requestHook, actionPath
|
|
32
|
+
function validateSolanaHookAction(action, requestHook, actionPath) {
|
|
43
33
|
const violations = [];
|
|
44
34
|
// CRITICAL: Hook action must have a corresponding request hook.
|
|
45
35
|
// If missing, the API is asking the user to sign a transaction they never sent.
|
|
@@ -54,20 +44,15 @@ function validateSolanaHookAction(action, requestHook, actionPath, realChainId,
|
|
|
54
44
|
const decodeResult = decodeSolanaTransaction(action, actionPath, types_1.ViolationCode.SolanaHookDecodeError);
|
|
55
45
|
if (!decodeResult.ok)
|
|
56
46
|
return decodeResult.violations;
|
|
57
|
-
// CRITICAL: transaction data must match request hook data
|
|
58
|
-
// placeholder substitution. The request may carry a hex-template with
|
|
59
|
-
// literal `{name}` / `{name.N}` markers; the API substitutes them with
|
|
60
|
-
// little-endian-encoded amounts (Solana convention) and echoes the
|
|
61
|
-
// resolved hex in the action data. Resolution errors themselves are
|
|
62
|
-
// emitted by `validateHookEcho`; here we only compare bytes.
|
|
63
|
-
const { resolved: expectedData } = (0, placeholder_1.resolveEagerPlaceholders)(requestHook.data, realChainId, requestHook.placeHolders, responseTrades, mode);
|
|
47
|
+
// CRITICAL: transaction data must match request hook data
|
|
64
48
|
const responseData = action.data.data;
|
|
65
|
-
|
|
49
|
+
const requestData = requestHook.data;
|
|
50
|
+
if (!hexEquals(responseData, requestData)) {
|
|
66
51
|
violations.push({
|
|
67
52
|
code: types_1.ViolationCode.SolanaHookDataMismatch,
|
|
68
53
|
message: "Hook transaction data does not match request hook data",
|
|
69
54
|
path: `${actionPath}.data.data`,
|
|
70
|
-
expected: truncateHex(
|
|
55
|
+
expected: truncateHex(requestData),
|
|
71
56
|
actual: truncateHex(responseData),
|
|
72
57
|
});
|
|
73
58
|
}
|
|
@@ -76,7 +61,7 @@ function validateSolanaHookAction(action, requestHook, actionPath, realChainId,
|
|
|
76
61
|
// =============================================
|
|
77
62
|
// GasCompensation action: API-built compensation transaction
|
|
78
63
|
// =============================================
|
|
79
|
-
function validateSolanaGasCompensationAction(action, actionPath, quoteMode, srcChainAuthorityAddress, gasCompensationTokenAddresses
|
|
64
|
+
function validateSolanaGasCompensationAction(action, actionPath, quoteMode, srcChainAuthorityAddress, gasCompensationTokenAddresses) {
|
|
80
65
|
// CRITICAL: decode as VersionedTransaction(MessageV0)
|
|
81
66
|
const decodeResult = decodeSolanaTransaction(action, actionPath, types_1.ViolationCode.SolanaGasCompensationDecodeError);
|
|
82
67
|
if (!decodeResult.ok)
|
|
@@ -89,9 +74,9 @@ function validateSolanaGasCompensationAction(action, actionPath, quoteMode, srcC
|
|
|
89
74
|
violations.push(...validateGasCompensationAllowedPrograms(compiledIxs, staticAccountKeys, actionPath));
|
|
90
75
|
const resolved = (0, solana_instruction_1.resolveInstructions)(compiledIxs, staticAccountKeys);
|
|
91
76
|
// CRITICAL: must have exactly one transfer, rest must be memos
|
|
92
|
-
violations.push(...validateGasCompensationInstructions(resolved, actionPath, gasCompensationTokenAddresses
|
|
77
|
+
violations.push(...validateGasCompensationInstructions(resolved, actionPath, gasCompensationTokenAddresses));
|
|
93
78
|
// HIGH (execution): fee payer must not be the user
|
|
94
|
-
violations.push(...validateGasCompensationFeePayer(transaction, actionPath, quoteMode, srcChainAuthorityAddress
|
|
79
|
+
violations.push(...validateGasCompensationFeePayer(transaction, actionPath, quoteMode, srcChainAuthorityAddress));
|
|
95
80
|
return violations;
|
|
96
81
|
}
|
|
97
82
|
// CRITICAL: only allowed programs
|
|
@@ -124,7 +109,7 @@ function validateGasCompensationAllowedPrograms(compiledInstructions, staticAcco
|
|
|
124
109
|
return violations;
|
|
125
110
|
}
|
|
126
111
|
// CRITICAL: exactly one transfer, rest = memo
|
|
127
|
-
function validateGasCompensationInstructions(resolved, actionPath, gasCompensationTokenAddresses
|
|
112
|
+
function validateGasCompensationInstructions(resolved, actionPath, gasCompensationTokenAddresses) {
|
|
128
113
|
const violations = [];
|
|
129
114
|
const transfers = [];
|
|
130
115
|
const splTransfers = [];
|
|
@@ -165,12 +150,12 @@ function validateGasCompensationInstructions(resolved, actionPath, gasCompensati
|
|
|
165
150
|
}
|
|
166
151
|
// CRITICAL: for SPL transfers, validate token mint matches gasCompensationInfo
|
|
167
152
|
if (splTransfers.length === 1) {
|
|
168
|
-
violations.push(...validateGasCompensationTokenMint(splTransfers[0], actionPath, gasCompensationTokenAddresses
|
|
153
|
+
violations.push(...validateGasCompensationTokenMint(splTransfers[0], actionPath, gasCompensationTokenAddresses));
|
|
169
154
|
}
|
|
170
155
|
return violations;
|
|
171
156
|
}
|
|
172
157
|
// CRITICAL: SPL transfer token must match gasCompensationInfo.tokenAddress
|
|
173
|
-
function validateGasCompensationTokenMint(ix, actionPath, gasCompensationTokenAddresses
|
|
158
|
+
function validateGasCompensationTokenMint(ix, actionPath, gasCompensationTokenAddresses) {
|
|
174
159
|
// transferChecked accounts: [0]=source, [1]=mint, [2]=destination, [3]=owner
|
|
175
160
|
if (ix.accountKeys.length < 4) {
|
|
176
161
|
return [{
|
|
@@ -182,7 +167,7 @@ function validateGasCompensationTokenMint(ix, actionPath, gasCompensationTokenAd
|
|
|
182
167
|
}];
|
|
183
168
|
}
|
|
184
169
|
const mint = ix.accountKeys[1];
|
|
185
|
-
const matchesAny = gasCompensationTokenAddresses.some(addr => (0, address_1.addressEquals)(
|
|
170
|
+
const matchesAny = gasCompensationTokenAddresses.some(addr => (0, address_1.addressEquals)(enums_1.ChainId.Solana, mint, addr));
|
|
186
171
|
if (!matchesAny) {
|
|
187
172
|
return [{
|
|
188
173
|
code: types_1.ViolationCode.SolanaGasCompensationTokenMismatch,
|
|
@@ -196,14 +181,14 @@ function validateGasCompensationTokenMint(ix, actionPath, gasCompensationTokenAd
|
|
|
196
181
|
return [];
|
|
197
182
|
}
|
|
198
183
|
// HIGH (execution): fee payer must not be the user
|
|
199
|
-
function validateGasCompensationFeePayer(transaction, actionPath, quoteMode, srcChainAuthorityAddress
|
|
184
|
+
function validateGasCompensationFeePayer(transaction, actionPath, quoteMode, srcChainAuthorityAddress) {
|
|
200
185
|
if (quoteMode || !srcChainAuthorityAddress)
|
|
201
186
|
return [];
|
|
202
187
|
const keys = transaction.message.staticAccountKeys;
|
|
203
188
|
if (keys.length === 0)
|
|
204
189
|
return [];
|
|
205
190
|
const feePayer = keys[0].toBase58();
|
|
206
|
-
if ((0, address_1.addressEquals)(
|
|
191
|
+
if ((0, address_1.addressEquals)(enums_1.ChainId.Solana, feePayer, srcChainAuthorityAddress)) {
|
|
207
192
|
return [{
|
|
208
193
|
code: types_1.ViolationCode.SolanaGasCompensationFeePayerIsUser,
|
|
209
194
|
message: "GasCompensation fee payer must not be the user",
|
|
@@ -228,6 +213,10 @@ function isSplTransferChecked(ix) {
|
|
|
228
213
|
}
|
|
229
214
|
return ix.data.length >= 10 && ix.data[0] === 12;
|
|
230
215
|
}
|
|
216
|
+
function hexEquals(a, b) {
|
|
217
|
+
const normalize = (s) => s.toLowerCase().replace(/^0x/, "");
|
|
218
|
+
return normalize(a) === normalize(b);
|
|
219
|
+
}
|
|
231
220
|
function truncateHex(hex) {
|
|
232
221
|
if (hex.length <= 20)
|
|
233
222
|
return hex;
|