@debridge-finance/borderless-validation-sdk 0.0.0-dev-3dc1a82 → 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 -31
- 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 +1 -1
- 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 -26
- 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 +4 -120
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +10 -74
- 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 -4
- package/dist/cjs/validations/required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-hook.js +18 -32
- 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 -68
- package/dist/cjs/validations/trade-grouping.js.map +1 -1
- package/dist/cjs/validations/trades.js +37 -59
- 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 -28
- 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 +1 -1
- 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 -25
- 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 +3 -119
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +10 -74
- 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 -4
- package/dist/esm/validations/required-actions.js.map +1 -1
- package/dist/esm/validations/solana-hook.js +20 -34
- 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 -68
- package/dist/esm/validations/trade-grouping.js.map +1 -1
- package/dist/esm/validations/trades.js +37 -59
- 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 -5
- 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-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 -19
- 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 +11 -367
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +11 -67
- 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 -3
- package/dist/types/validations/trade-grouping.d.ts.map +1 -1
- package/dist/types/validator.d.ts.map +1 -1
- package/dist/types/whitelists/environment-config.d.ts.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 +2 -2
- package/README.md +0 -164
- 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/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 -341
- 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-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/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 -338
- 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-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/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
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateSign712MetaMaskActions = validateSign712MetaMaskActions;
|
|
4
4
|
const types_1 = require("../types");
|
|
5
|
-
const
|
|
5
|
+
const types_2 = require("../whitelists/types");
|
|
6
|
+
const evm_1 = require("../whitelists/evm");
|
|
7
|
+
const address_1 = require("../helpers/address");
|
|
8
|
+
const evm_caveats_1 = require("./evm-caveats");
|
|
6
9
|
const SIGN712_METAMASK_ALLOWED_ACTIONS = [
|
|
7
10
|
types_1.EvmActionOperation.Budget,
|
|
8
11
|
types_1.EvmActionOperation.Wrap,
|
|
@@ -13,28 +16,23 @@ function validateSign712MetaMaskActions(actions, basePath, realChainId, quoteMod
|
|
|
13
16
|
const violations = [];
|
|
14
17
|
for (let i = 0; i < actions.length; i++) {
|
|
15
18
|
const action = actions[i];
|
|
16
|
-
if (action.type !== types_1.EvmActionKind.
|
|
19
|
+
if (action.type !== types_1.EvmActionKind.Sign712MetaMask)
|
|
17
20
|
continue;
|
|
18
21
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
19
22
|
const data = action.data;
|
|
20
|
-
// CRITICAL: data
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
// CRITICAL: `data` must be present and contain `domain` and `message`
|
|
24
|
+
if (!data || !data.domain || !data.message) {
|
|
25
|
+
violations.push({
|
|
26
|
+
code: types_1.ViolationCode.Sign712MetaMaskDomainNameNotDelegationManager,
|
|
27
|
+
message: `Sign712MetaMask data is missing domain or message`,
|
|
28
|
+
path: `${actionPath}.data`,
|
|
29
|
+
actual: data,
|
|
30
|
+
});
|
|
25
31
|
continue;
|
|
26
32
|
}
|
|
27
|
-
violations.push(...validateSign712TransactionCalls(action, actionPath), ...validateSign712AllowedActions(action, actionPath), ...(
|
|
28
|
-
// Delegator: in quote mode we cannot determine the trust source —
|
|
29
|
-
// skip the check entirely. In execution mode the helper compares
|
|
30
|
-
// against `srcChainAuthorityAddress` (which may itself be
|
|
31
|
-
// `undefined` as a defensive check — preserved by passing through).
|
|
32
|
-
...(quoteMode
|
|
33
|
-
? []
|
|
34
|
-
: (0, evm_sign712_shared_1.validateSign712Delegator)(data, actionPath, realChainId, srcChainAuthorityAddress, "srcChainAuthorityAddress")));
|
|
33
|
+
violations.push(...validateSign712TransactionCalls(action, actionPath), ...validateSign712AllowedActions(action, actionPath), ...validateSign712Domain(data, actionPath, realChainId), ...validateSign712Delegator(data, actionPath, realChainId, quoteMode, srcChainAuthorityAddress));
|
|
35
34
|
const caveats = (data.message.caveats ?? []);
|
|
36
|
-
|
|
37
|
-
violations.push(...(0, evm_sign712_shared_1.validateSign712Caveats)(caveats, action.actionId, txCalls, actionPath, realChainId, expirationTimestamp));
|
|
35
|
+
violations.push(...validateSign712MetaMaskCaveats(caveats, action, actionPath, realChainId, expirationTimestamp));
|
|
38
36
|
}
|
|
39
37
|
return violations;
|
|
40
38
|
}
|
|
@@ -67,4 +65,83 @@ function validateSign712AllowedActions(action, actionPath) {
|
|
|
67
65
|
}
|
|
68
66
|
return violations;
|
|
69
67
|
}
|
|
68
|
+
// CRITICAL: domain.name must be "DelegationManager"
|
|
69
|
+
// CRITICAL: domain.chainId must equal the real chainId
|
|
70
|
+
// CRITICAL: domain.verifyingContract must be in the DelegationManager whitelist
|
|
71
|
+
function validateSign712Domain(data, actionPath, realChainId) {
|
|
72
|
+
const violations = [];
|
|
73
|
+
if (data.domain.name !== "DelegationManager") {
|
|
74
|
+
violations.push({
|
|
75
|
+
code: types_1.ViolationCode.Sign712MetaMaskDomainNameNotDelegationManager,
|
|
76
|
+
message: `Sign712MetaMask domain.name must be "DelegationManager"`,
|
|
77
|
+
path: `${actionPath}.data.domain.name`,
|
|
78
|
+
expected: "DelegationManager",
|
|
79
|
+
actual: data.domain.name,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (data.domain.chainId !== realChainId) {
|
|
83
|
+
violations.push({
|
|
84
|
+
code: types_1.ViolationCode.Sign712MetaMaskChainIdMismatch,
|
|
85
|
+
message: `Sign712MetaMask domain.chainId does not match the real chainId`,
|
|
86
|
+
path: `${actionPath}.data.domain.chainId`,
|
|
87
|
+
expected: realChainId,
|
|
88
|
+
actual: data.domain.chainId,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (data.domain.verifyingContract === undefined ||
|
|
92
|
+
!(0, types_2.isWhitelisted)(evm_1.DELEGATION_MANAGER_CONTRACTS, realChainId, data.domain.verifyingContract)) {
|
|
93
|
+
violations.push({
|
|
94
|
+
code: types_1.ViolationCode.Sign712MetaMaskVerifyingContractNotWhitelisted,
|
|
95
|
+
message: `Sign712MetaMask domain.verifyingContract is not whitelisted`,
|
|
96
|
+
path: `${actionPath}.data.domain.verifyingContract`,
|
|
97
|
+
actual: data.domain.verifyingContract,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return violations;
|
|
101
|
+
}
|
|
102
|
+
// LOW: in execution mode, message.delegator must match srcChainAuthorityAddress
|
|
103
|
+
function validateSign712Delegator(data, actionPath, realChainId, quoteMode, srcChainAuthorityAddress) {
|
|
104
|
+
if (quoteMode)
|
|
105
|
+
return [];
|
|
106
|
+
const delegator = data.message.delegator;
|
|
107
|
+
if (srcChainAuthorityAddress === undefined ||
|
|
108
|
+
delegator === undefined ||
|
|
109
|
+
!(0, address_1.addressEquals)(realChainId, delegator, srcChainAuthorityAddress)) {
|
|
110
|
+
return [{
|
|
111
|
+
code: types_1.ViolationCode.Sign712MetaMaskDelegatorMismatch,
|
|
112
|
+
message: `Sign712MetaMask message.delegator must match srcChainAuthorityAddress`,
|
|
113
|
+
path: `${actionPath}.data.message.delegator`,
|
|
114
|
+
expected: srcChainAuthorityAddress,
|
|
115
|
+
actual: delegator,
|
|
116
|
+
}];
|
|
117
|
+
}
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
function validateSign712MetaMaskCaveats(caveats, action, actionPath, realChainId, expirationTimestamp) {
|
|
121
|
+
const violations = [];
|
|
122
|
+
const classified = (0, evm_caveats_1.classifyCaveats)(caveats, action.actionId, actionPath, realChainId, violations);
|
|
123
|
+
const txCalls = action.details?.transactionCalls ?? [];
|
|
124
|
+
violations.push(...(0, evm_caveats_1.validateExactExecutionPresence)(classified, txCalls, actionPath));
|
|
125
|
+
(0, evm_caveats_1.validateExactExecutionContent)(classified, txCalls, actionPath, violations);
|
|
126
|
+
// CRITICAL: must have at least one IdEnforcer caveat (replay protection)
|
|
127
|
+
if (!classified.hasIdEnforcer) {
|
|
128
|
+
violations.push({
|
|
129
|
+
code: types_1.ViolationCode.Sign712MetaMaskMissingIdEnforcerCaveat,
|
|
130
|
+
message: `Sign712MetaMask must have an IdEnforcer caveat`,
|
|
131
|
+
path: `${actionPath}.data.message.caveats`,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// CRITICAL: must have exactly one TimestampEnforcer caveat
|
|
135
|
+
if (classified.timestampCount === 0) {
|
|
136
|
+
violations.push({
|
|
137
|
+
code: types_1.ViolationCode.Sign712MetaMaskMissingTimestampEnforcerCaveat,
|
|
138
|
+
message: `Sign712MetaMask must have a TimestampEnforcer caveat`,
|
|
139
|
+
path: `${actionPath}.data.message.caveats`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (classified.firstTimestamp) {
|
|
143
|
+
(0, evm_caveats_1.validateTimestampEnforcerValue)(classified.firstTimestamp.caveat, expirationTimestamp, classified.firstTimestamp.index, actionPath, violations);
|
|
144
|
+
}
|
|
145
|
+
return violations;
|
|
146
|
+
}
|
|
70
147
|
//# sourceMappingURL=evm-sign712-metamask.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-sign712-metamask.js","sourceRoot":"","sources":["../../../src/validations/evm-sign712-metamask.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"evm-sign712-metamask.js","sourceRoot":"","sources":["../../../src/validations/evm-sign712-metamask.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateSign7702Action = validateSign7702Action;
|
|
4
3
|
exports.validateSign7702Actions = validateSign7702Actions;
|
|
5
4
|
const types_1 = require("../types");
|
|
6
5
|
const types_2 = require("../whitelists/types");
|
|
@@ -8,38 +7,6 @@ const evm_1 = require("../whitelists/evm");
|
|
|
8
7
|
// =============================================
|
|
9
8
|
// Sign7702Authorization constraints
|
|
10
9
|
// =============================================
|
|
11
|
-
// CRITICAL: per-action checks for a `Sign7702Authorization` action.
|
|
12
|
-
// Shared between intent-scope (`validateSign7702Actions`) and hook-scope
|
|
13
|
-
// (`validateHookSign7702Binding`); both wrap this with their scope-specific
|
|
14
|
-
// constraints (intent: position+duplicate; hook: type↔actions binding +
|
|
15
|
-
// `validateHookDelegateOp` for position/count).
|
|
16
|
-
function validateSign7702Action(action, actionPath, realChainId) {
|
|
17
|
-
const violations = [];
|
|
18
|
-
// HIGH: actions[] must contain exactly one element — Delegate
|
|
19
|
-
const ops = action.actions;
|
|
20
|
-
if (ops.length !== 1 || ops[0] !== types_1.EvmActionOperation.Delegate) {
|
|
21
|
-
violations.push({
|
|
22
|
-
code: types_1.ViolationCode.Sign7702ActionsNotSingleDelegate,
|
|
23
|
-
message: `Sign7702Authorization actions must contain exactly [Delegate]`,
|
|
24
|
-
path: `${actionPath}.actions`,
|
|
25
|
-
expected: [types_1.EvmActionOperation.Delegate],
|
|
26
|
-
actual: action.actions,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
// CRITICAL: data.contractAddress must be in the whitelist
|
|
30
|
-
const data = action.data;
|
|
31
|
-
const contractAddress = data?.contractAddress;
|
|
32
|
-
if (!contractAddress
|
|
33
|
-
|| !(0, types_2.isWhitelisted)(evm_1.EIP7702_DELEGATION_CONTRACTS, realChainId, contractAddress)) {
|
|
34
|
-
violations.push({
|
|
35
|
-
code: types_1.ViolationCode.Sign7702ContractAddressNotWhitelisted,
|
|
36
|
-
message: `Sign7702Authorization contractAddress is not in the whitelist`,
|
|
37
|
-
path: `${actionPath}.data.contractAddress`,
|
|
38
|
-
actual: contractAddress,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
return violations;
|
|
42
|
-
}
|
|
43
10
|
function validateSign7702Actions(actions, basePath, realChainId) {
|
|
44
11
|
const violations = [];
|
|
45
12
|
let sign7702Count = 0;
|
|
@@ -49,7 +16,28 @@ function validateSign7702Actions(actions, basePath, realChainId) {
|
|
|
49
16
|
if (action.type !== types_1.EvmActionKind.Sign7702Authorization)
|
|
50
17
|
continue;
|
|
51
18
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
52
|
-
|
|
19
|
+
// HIGH: actions[] must contain exactly one element — Delegate
|
|
20
|
+
if (action.actions.length !== 1 ||
|
|
21
|
+
action.actions[0] !== types_1.EvmActionOperation.Delegate) {
|
|
22
|
+
violations.push({
|
|
23
|
+
code: types_1.ViolationCode.Sign7702ActionsNotSingleDelegate,
|
|
24
|
+
message: `Sign7702Authorization actions must contain exactly [Delegate]`,
|
|
25
|
+
path: `${actionPath}.actions`,
|
|
26
|
+
expected: [types_1.EvmActionOperation.Delegate],
|
|
27
|
+
actual: action.actions,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// CRITICAL: data.contractAddress must be in the whitelist
|
|
31
|
+
const data = action.data;
|
|
32
|
+
const contractAddress = data?.contractAddress;
|
|
33
|
+
if (!contractAddress || !(0, types_2.isWhitelisted)(evm_1.EIP7702_DELEGATION_CONTRACTS, realChainId, contractAddress)) {
|
|
34
|
+
violations.push({
|
|
35
|
+
code: types_1.ViolationCode.Sign7702ContractAddressNotWhitelisted,
|
|
36
|
+
message: `Sign7702Authorization contractAddress is not in the whitelist`,
|
|
37
|
+
path: `${actionPath}.data.contractAddress`,
|
|
38
|
+
actual: contractAddress,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
53
41
|
// HIGH: at most one Sign7702Authorization per intent
|
|
54
42
|
// Note: only the first duplicate will be reported, subsequent ones will be ignored
|
|
55
43
|
sign7702Count++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-sign7702.js","sourceRoot":"","sources":["../../../src/validations/evm-sign7702.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"evm-sign7702.js","sourceRoot":"","sources":["../../../src/validations/evm-sign7702.ts"],"names":[],"mappings":";;AAgBA,0DA0DC;AA1ED,oCAQkB;AAClB,+CAAoD;AACpD,2CAAiE;AAEjE,gDAAgD;AAChD,oCAAoC;AACpC,gDAAgD;AAEhD,SAAgB,uBAAuB,CACnC,OAA4B,EAC5B,QAAgB,EAChB,WAAoB;IAEpB,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,qBAAqB;YAAE,SAAS;QAElE,MAAM,UAAU,GAAG,GAAG,QAAQ,oBAAoB,CAAC,GAAG,CAAC;QAEvD,8DAA8D;QAC9D,IACI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,0BAAkB,CAAC,QAAQ,EACnD,CAAC;YACC,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,gCAAgC;gBACpD,OAAO,EAAE,+DAA+D;gBACxE,IAAI,EAAE,GAAG,UAAU,UAAU;gBAC7B,QAAQ,EAAE,CAAC,0BAAkB,CAAC,QAAQ,CAAC;gBACvC,MAAM,EAAE,MAAM,CAAC,OAAO;aACzB,CAAC,CAAC;QACP,CAAC;QAED,0DAA0D;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAgD,CAAC;QACrE,MAAM,eAAe,GAAG,IAAI,EAAE,eAAe,CAAC;QAC9C,IAAI,CAAC,eAAe,IAAI,CAAC,IAAA,qBAAa,EAAC,kCAA4B,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC;YACjG,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,qCAAqC;gBACzD,OAAO,EAAE,+DAA+D;gBACxE,IAAI,EAAE,GAAG,UAAU,uBAAuB;gBAC1C,MAAM,EAAE,eAAe;aAC1B,CAAC,CAAC;QACP,CAAC;QAED,qDAAqD;QACrD,mFAAmF;QACnF,aAAa,EAAE,CAAC;QAChB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACtB,kBAAkB,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,8BAA8B;gBAClD,OAAO,EAAE,kEAAkE,kBAAkB,QAAQ,CAAC,EAAE;gBACxG,IAAI,EAAE,GAAG,UAAU,OAAO;gBAC1B,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,aAAa;aACxB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC"}
|
|
@@ -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
|
}
|