@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
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateGasCompensationOperations = validateGasCompensationOperations;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const evm_calldata_1 = require("../helpers/evm-calldata");
|
|
6
|
+
const evm_token_1 = require("../helpers/evm-token");
|
|
7
|
+
const address_1 = require("../helpers/address");
|
|
8
|
+
const evm_action_1 = require("../helpers/evm-action");
|
|
9
|
+
function validateGasCompensationOperations(actions, basePath, request, realChainId) {
|
|
10
|
+
const violations = [];
|
|
11
|
+
const gasCompensationGroups = groupGasCompensationInfo(request);
|
|
12
|
+
for (let i = 0; i < actions.length; i++) {
|
|
13
|
+
const action = actions[i];
|
|
14
|
+
if (!action.actions.includes(types_1.EvmActionOperation.GasCompensation)) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
18
|
+
const txCalls = (0, evm_action_1.getTransactionCalls)(action);
|
|
19
|
+
// CRITICAL: transactionCalls must be present
|
|
20
|
+
if (txCalls.length === 0) {
|
|
21
|
+
violations.push({
|
|
22
|
+
code: types_1.ViolationCode.GasCompensationTransactionCallsMissing,
|
|
23
|
+
message: `GasCompensation must have at least one transactionCall`,
|
|
24
|
+
path: `${actionPath}.details.transactionCalls`,
|
|
25
|
+
actual: [],
|
|
26
|
+
});
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
// CRITICAL: GasCompensation must have exactly one transactionCall
|
|
30
|
+
if (txCalls.length > 1) {
|
|
31
|
+
violations.push({
|
|
32
|
+
code: types_1.ViolationCode.GasCompensationTooManyTransactionCalls,
|
|
33
|
+
message: `GasCompensation must have exactly 1 transactionCall`,
|
|
34
|
+
path: `${actionPath}.details.transactionCalls`,
|
|
35
|
+
expected: 1,
|
|
36
|
+
actual: txCalls.length,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
violations.push(...validateGasCompensationPreHook(action, actionPath, gasCompensationGroups, realChainId), ...validateGasCompensationCalldata(txCalls[0], actionPath, gasCompensationGroups, realChainId));
|
|
40
|
+
}
|
|
41
|
+
return violations;
|
|
42
|
+
}
|
|
43
|
+
// CRITICAL: must have a corresponding preHook with gasCompensationInfo
|
|
44
|
+
function validateGasCompensationPreHook(_action, actionPath, groups, _realChainId) {
|
|
45
|
+
if (groups.length === 0) {
|
|
46
|
+
return [{
|
|
47
|
+
code: types_1.ViolationCode.GasCompensationNoMatchingPreHook,
|
|
48
|
+
message: `GasCompensation has no corresponding preHook with gasCompensationInfo`,
|
|
49
|
+
path: `${actionPath}.actions`,
|
|
50
|
+
}];
|
|
51
|
+
}
|
|
52
|
+
// AI: for now we check that at least one gasCompensationInfo group exists.
|
|
53
|
+
// A more precise matching (action <-> specific group) can be added later.
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
// CRITICAL: validate calldata based on token type (ERC20 vs native)
|
|
57
|
+
// Token type is determined by gasCompensationInfo.tokenAddress
|
|
58
|
+
// CRITICAL: txCall.to must match a gasCompensationInfo group
|
|
59
|
+
//
|
|
60
|
+
// Note: `gasCompensationInfo` also has `sender` and `chainId`, but they cannot
|
|
61
|
+
// be verified from the `transactionCall` data:
|
|
62
|
+
// - `sender` maps to the hook's `from` field, not present in `requiredAction`
|
|
63
|
+
// - `chainId` is implicitly matched by the trade group's `realChainId`
|
|
64
|
+
function validateGasCompensationCalldata(txCall, actionPath, groups, realChainId) {
|
|
65
|
+
// Check for native token group
|
|
66
|
+
if (groups.some(g => (0, evm_token_1.isNativeToken)(g.tokenAddress))) {
|
|
67
|
+
return validateGasCompensationNative(txCall, actionPath);
|
|
68
|
+
}
|
|
69
|
+
// Check for ERC20: txCall.to must match a group's tokenAddress
|
|
70
|
+
const erc20Match = groups.some(g => (0, address_1.normalizeAddress)(realChainId, g.tokenAddress) === (0, address_1.normalizeAddress)(realChainId, txCall.to));
|
|
71
|
+
if (erc20Match) {
|
|
72
|
+
return validateGasCompensationErc20(txCall, actionPath);
|
|
73
|
+
}
|
|
74
|
+
// txCall.to doesn't match any gasCompensationInfo group
|
|
75
|
+
return [{
|
|
76
|
+
code: types_1.ViolationCode.GasCompensationToMismatch,
|
|
77
|
+
message: `GasCompensation transactionCalls[0].to does not match any gasCompensationInfo.tokenAddress`,
|
|
78
|
+
path: `${actionPath}.details.transactionCalls[0].to`,
|
|
79
|
+
expected: groups.map(g => g.tokenAddress),
|
|
80
|
+
actual: txCall.to,
|
|
81
|
+
}];
|
|
82
|
+
}
|
|
83
|
+
// CRITICAL: for native: data === "0x", value > 0
|
|
84
|
+
function validateGasCompensationNative(txCall, actionPath) {
|
|
85
|
+
const violations = [];
|
|
86
|
+
// CRITICAL: data must be empty for native token transfer
|
|
87
|
+
if (txCall.data !== "0x") {
|
|
88
|
+
violations.push({
|
|
89
|
+
code: types_1.ViolationCode.GasCompensationCalldataInvalid,
|
|
90
|
+
message: `GasCompensation native transfer must have data="0x"`,
|
|
91
|
+
path: `${actionPath}.details.transactionCalls[0].data`,
|
|
92
|
+
expected: "0x",
|
|
93
|
+
actual: txCall.data,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
if (BigInt(txCall.value) <= 0n) {
|
|
98
|
+
violations.push({
|
|
99
|
+
code: types_1.ViolationCode.GasCompensationNativeValueZero,
|
|
100
|
+
message: `GasCompensation native value must be > 0`,
|
|
101
|
+
path: `${actionPath}.details.transactionCalls[0].value`,
|
|
102
|
+
actual: txCall.value,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
violations.push({
|
|
108
|
+
code: types_1.ViolationCode.GasCompensationNativeValueZero,
|
|
109
|
+
message: `GasCompensation native value is not a valid number`,
|
|
110
|
+
path: `${actionPath}.details.transactionCalls[0].value`,
|
|
111
|
+
actual: txCall.value,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return violations;
|
|
115
|
+
}
|
|
116
|
+
// CRITICAL: for ERC20: data must be valid transfer(address,uint256)
|
|
117
|
+
function validateGasCompensationErc20(txCall, actionPath) {
|
|
118
|
+
try {
|
|
119
|
+
(0, evm_calldata_1.decodeTransferCalldata)(txCall.data);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
return [{
|
|
123
|
+
code: types_1.ViolationCode.GasCompensationCalldataInvalid,
|
|
124
|
+
message: `GasCompensation calldata is not valid ERC20 transfer`,
|
|
125
|
+
path: `${actionPath}.details.transactionCalls[0].data`,
|
|
126
|
+
actual: txCall.data,
|
|
127
|
+
details: e,
|
|
128
|
+
}];
|
|
129
|
+
}
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
// Groups gasCompensationInfo from preHooks by (chainId, tokenAddress, sender)
|
|
133
|
+
function groupGasCompensationInfo(request) {
|
|
134
|
+
const seen = new Set();
|
|
135
|
+
const groups = [];
|
|
136
|
+
for (const hook of request.preHooks ?? []) {
|
|
137
|
+
const info = hook.gasCompensationInfo;
|
|
138
|
+
if (!info)
|
|
139
|
+
continue;
|
|
140
|
+
const key = `${info.chainId}:${(0, address_1.normalizeAddress)(info.chainId, info.tokenAddress)}:${(0, address_1.normalizeAddress)(info.chainId, info.sender)}`;
|
|
141
|
+
if (!seen.has(key)) {
|
|
142
|
+
seen.add(key);
|
|
143
|
+
groups.push({
|
|
144
|
+
chainId: info.chainId,
|
|
145
|
+
tokenAddress: info.tokenAddress,
|
|
146
|
+
sender: info.sender,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return groups;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=evm-op-gas-compensation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm-op-gas-compensation.js","sourceRoot":"","sources":["../../../src/validations/evm-op-gas-compensation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,415 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const gas_compensation_1 = require("../helpers/gas-compensation");
|
|
7
|
-
const evm_gas_compensation_tx_1 = require("../helpers/evm-gas-compensation-tx");
|
|
8
|
-
const address_1 = require("../helpers/address");
|
|
9
|
-
const evm_sign7702_1 = require("./evm-sign7702");
|
|
10
|
-
const evm_sign712_shared_1 = require("./evm-sign712-shared");
|
|
11
|
-
const SIGN712_HOOK_TYPES = [
|
|
12
|
-
types_1.EvmActionKind.Sign712MetaMaskCaveats,
|
|
13
|
-
types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders,
|
|
14
|
-
];
|
|
15
|
-
function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request) {
|
|
16
|
-
const violations = [];
|
|
17
|
-
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
18
|
-
const action = hookPayload.requiredActions[i];
|
|
19
|
-
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
20
|
-
violations.push(...validateHookSign7702Binding(action, actionPath, realChainId));
|
|
21
|
-
}
|
|
22
|
-
if (hookPayload.hook.type === types_1.BundleHookType.Direct) {
|
|
23
|
-
violations.push(...validateDirectEvmHookActions(hookPayload, requestHook, basePath));
|
|
24
|
-
}
|
|
25
|
-
else { // BundleHookType.Delegated (default)
|
|
26
|
-
violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp));
|
|
27
|
-
}
|
|
28
|
-
violations.push(...validateHookActionCalldata(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
|
|
29
|
-
violations.push(...validateHookActionTransactionCallsMatch(hookPayload, basePath));
|
|
30
|
-
if (requestHook === undefined && mode === placeholder_1.HookMode.PreHooks) {
|
|
31
|
-
violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId));
|
|
32
|
-
}
|
|
33
|
-
return violations;
|
|
34
|
-
}
|
|
35
|
-
// CRITICAL: every action that carries the `Delegate` operation must have
|
|
36
|
-
// type `Sign7702Authorization`, and every `Sign7702Authorization` action must
|
|
37
|
-
// carry exactly `[Delegate]` and a whitelisted contractAddress. Without this
|
|
38
|
-
// binding, an action with `actions:[Delegate]` and an arbitrary `type` (e.g.
|
|
39
|
-
// `Transaction`) would slip through the operation/position checks elsewhere.
|
|
40
|
-
// The per-action [Delegate] + contractAddress checks are shared with intent-scope
|
|
41
|
-
// via `validateSign7702Action`; the type <-> [Delegate] binding is hook-specific.
|
|
42
|
-
function validateHookSign7702Binding(action, actionPath, realChainId) {
|
|
43
|
-
const violations = [];
|
|
44
|
-
const ops = action.actions;
|
|
45
|
-
const hasDelegate = ops.includes(types_1.EvmActionOperation.Delegate);
|
|
46
|
-
const isSign7702 = action.type === types_1.EvmActionKind.Sign7702Authorization;
|
|
47
|
-
if (hasDelegate && !isSign7702) {
|
|
48
|
-
violations.push({
|
|
49
|
-
code: types_1.ViolationCode.HookDelegateOpWrongType,
|
|
50
|
-
message: "action with operation [Delegate] must have type"
|
|
51
|
-
+ " Sign7702Authorization",
|
|
52
|
-
path: `${actionPath}.type`,
|
|
53
|
-
expected: types_1.EvmActionKind.Sign7702Authorization,
|
|
54
|
-
actual: action.type,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
if (isSign7702) {
|
|
58
|
-
violations.push(...(0, evm_sign7702_1.validateSign7702Action)(action, actionPath, realChainId));
|
|
59
|
-
}
|
|
60
|
-
return violations;
|
|
61
|
-
}
|
|
62
|
-
// HIGH: a Direct EVM hook's hook-action must be `Transaction` (when no deferred
|
|
63
|
-
// placeholders are declared) or `ProvidePlaceholders` (when at least one
|
|
64
|
-
// deferred placeholder is declared). chainId and placeholder list are checked
|
|
65
|
-
// per-action below.
|
|
66
|
-
function validateDirectEvmHookActions(hookPayload, requestHook, basePath) {
|
|
67
|
-
const violations = [];
|
|
68
|
-
const expectedDeferred = collectDeferredPlaceholders(requestHook);
|
|
69
|
-
const expectsTransaction = expectedDeferred.length === 0;
|
|
70
|
-
const hookChainId = hookPayload.hook.chainId;
|
|
71
|
-
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
72
|
-
const action = hookPayload.requiredActions[i];
|
|
73
|
-
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
74
|
-
// Safe skip: Delegate-bearing actions in Direct hooks are reported
|
|
75
|
-
// as `HookDelegateInDirect` by `validateHookDelegateOp`.
|
|
76
|
-
if (action.actions.includes(types_1.EvmActionOperation.Delegate))
|
|
77
|
-
continue;
|
|
78
|
-
violations.push(...validateDirectAction(action, expectsTransaction, hookChainId, expectedDeferred, actionPath));
|
|
79
|
-
}
|
|
80
|
-
return violations;
|
|
81
|
-
}
|
|
82
|
-
function validateDirectAction(action, expectsTransaction, hookChainId, expectedDeferred, actionPath) {
|
|
83
|
-
const expectedType = expectsTransaction
|
|
84
|
-
? types_1.EvmActionKind.Transaction
|
|
85
|
-
: types_1.EvmActionKind.ProvidePlaceholders;
|
|
86
|
-
if (action.type !== expectedType) {
|
|
87
|
-
return [{
|
|
88
|
-
code: types_1.ViolationCode.HookDirectActionTypeInvalid,
|
|
89
|
-
message: `Direct hook action must be of type ${expectedType}`,
|
|
90
|
-
path: `${actionPath}.type`,
|
|
91
|
-
expected: expectedType,
|
|
92
|
-
actual: action.type,
|
|
93
|
-
}];
|
|
94
|
-
}
|
|
95
|
-
if (expectsTransaction) {
|
|
96
|
-
return validateDirectTransactionAction(action.data, hookChainId, actionPath);
|
|
97
|
-
}
|
|
98
|
-
return validateProvidePlaceholdersAction(action.data, hookChainId, expectedDeferred, actionPath);
|
|
99
|
-
}
|
|
100
|
-
// HIGH: a Delegated EVM hook's hook-action must be `Sign712MetaMaskCaveats`
|
|
101
|
-
// (when no deferred placeholders are declared) or
|
|
102
|
-
// `Sign712MetaMaskCaveatsWithPlaceholders` (when at least one deferred
|
|
103
|
-
// placeholder is declared). transactionCalls form, placeholders match, and
|
|
104
|
-
// EIP-712 content checks (domain, delegator, caveats) are checked per-action below.
|
|
105
|
-
function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp) {
|
|
106
|
-
const violations = [];
|
|
107
|
-
const expectedDeferred = collectDeferredPlaceholders(requestHook);
|
|
108
|
-
const hasDeferred = expectedDeferred.length > 0;
|
|
109
|
-
const ctx = {
|
|
110
|
-
expectedType: hasDeferred
|
|
111
|
-
? types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders
|
|
112
|
-
: types_1.EvmActionKind.Sign712MetaMaskCaveats,
|
|
113
|
-
expectedDeferred,
|
|
114
|
-
hookFrom: hookPayload.hook.from,
|
|
115
|
-
realChainId,
|
|
116
|
-
expirationTimestamp,
|
|
117
|
-
};
|
|
118
|
-
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
119
|
-
const action = hookPayload.requiredActions[i];
|
|
120
|
-
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
121
|
-
// Safe skip: Delegate-bearing actions are validated by
|
|
122
|
-
// `validateHookSign7702Binding`.
|
|
123
|
-
if (action.actions.includes(types_1.EvmActionOperation.Delegate))
|
|
124
|
-
continue;
|
|
125
|
-
violations.push(...validateDelegatedAction(action, actionPath, ctx));
|
|
126
|
-
}
|
|
127
|
-
return violations;
|
|
128
|
-
}
|
|
129
|
-
function validateDelegatedAction(action, actionPath, ctx) {
|
|
130
|
-
if (action.type !== ctx.expectedType) {
|
|
131
|
-
return [{
|
|
132
|
-
code: types_1.ViolationCode.HookDelegatedActionTypeInvalid,
|
|
133
|
-
message: `Delegated hook action must be of type ${ctx.expectedType}`,
|
|
134
|
-
path: `${actionPath}.type`,
|
|
135
|
-
expected: ctx.expectedType,
|
|
136
|
-
actual: action.type,
|
|
137
|
-
}];
|
|
138
|
-
}
|
|
139
|
-
const violations = [
|
|
140
|
-
...validateSign712TransactionCalls(action, actionPath),
|
|
141
|
-
];
|
|
142
|
-
// CRITICAL: data structural presence — downstream content checks assume
|
|
143
|
-
// `data.domain` and `data.message` exist.
|
|
144
|
-
const data = action.data;
|
|
145
|
-
const presenceErrors = (0, evm_sign712_shared_1.validateSign712DataPresent)(data, actionPath);
|
|
146
|
-
if (presenceErrors.length > 0) {
|
|
147
|
-
violations.push(...presenceErrors);
|
|
148
|
-
return violations;
|
|
149
|
-
}
|
|
150
|
-
violations.push(...(0, evm_sign712_shared_1.validateSign712Domain)(data, actionPath, ctx.realChainId), ...(0, evm_sign712_shared_1.validateSign712Delegator)(data, actionPath, ctx.realChainId, ctx.hookFrom, "hook.from"));
|
|
151
|
-
const caveats = (data.message.caveats ?? []);
|
|
152
|
-
const txCalls = action.details?.transactionCalls ?? [];
|
|
153
|
-
violations.push(...(0, evm_sign712_shared_1.validateSign712Caveats)(caveats, action.actionId, txCalls, actionPath, ctx.realChainId, ctx.expirationTimestamp));
|
|
154
|
-
if (ctx.expectedType === types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
|
|
155
|
-
const withPlaceholdersData = data;
|
|
156
|
-
const actualPlaceholders = withPlaceholdersData.placeholders ?? [];
|
|
157
|
-
if (!placeholderArraysEqual(actualPlaceholders, ctx.expectedDeferred)) {
|
|
158
|
-
violations.push({
|
|
159
|
-
code: types_1.ViolationCode.HookDelegatedPlaceholdersMismatch,
|
|
160
|
-
message: "Sign712MetaMaskCaveatsWithPlaceholders data.placeholders"
|
|
161
|
-
+ " must match the deferred placeholders declared in the request hook",
|
|
162
|
-
path: `${actionPath}.data.placeholders`,
|
|
163
|
-
expected: ctx.expectedDeferred,
|
|
164
|
-
actual: actualPlaceholders,
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return violations;
|
|
169
|
-
}
|
|
170
|
-
// CRITICAL: hook-scope `Sign712MetaMaskCaveats(WithPlaceholders)` actions
|
|
171
|
-
// must carry exactly one transactionCall (the wrapped hook tx itself). The API
|
|
172
|
-
// hard-codes `calls = [tx]` for hook scope; an empty or longer array signals
|
|
173
|
-
// that something tampered with the wrapped payload.
|
|
174
|
-
function validateSign712TransactionCalls(action, actionPath) {
|
|
175
|
-
const txCalls = action.details?.transactionCalls ?? [];
|
|
176
|
-
if (txCalls.length === 0) {
|
|
177
|
-
return [{
|
|
178
|
-
code: types_1.ViolationCode.HookSign712TransactionCallsEmpty,
|
|
179
|
-
message: "Sign712MetaMaskCaveats hook action must have exactly one"
|
|
180
|
-
+ " transactionCall (got none)",
|
|
181
|
-
path: `${actionPath}.details.transactionCalls`,
|
|
182
|
-
expected: 1,
|
|
183
|
-
actual: 0,
|
|
184
|
-
}];
|
|
185
|
-
}
|
|
186
|
-
if (txCalls.length > 1) {
|
|
187
|
-
return [{
|
|
188
|
-
code: types_1.ViolationCode.HookSign712TransactionCallsTooMany,
|
|
189
|
-
message: "Sign712MetaMaskCaveats hook action must have exactly one"
|
|
190
|
-
+ " transactionCall",
|
|
191
|
-
path: `${actionPath}.details.transactionCalls`,
|
|
192
|
-
expected: 1,
|
|
193
|
-
actual: txCalls.length,
|
|
194
|
-
}];
|
|
195
|
-
}
|
|
3
|
+
exports.validateHookOperations = validateHookOperations;
|
|
4
|
+
// TODO: Hook operation validation rules
|
|
5
|
+
function validateHookOperations(_actions, _basePath) {
|
|
196
6
|
return [];
|
|
197
7
|
}
|
|
198
|
-
function collectDeferredPlaceholders(requestHook) {
|
|
199
|
-
return (requestHook?.placeHolders ?? [])
|
|
200
|
-
.filter(p => p.type === types_1.PlaceholderType.Deferred)
|
|
201
|
-
.map(p => ({ nameVariable: p.nameVariable }));
|
|
202
|
-
}
|
|
203
|
-
function validateDirectTransactionAction(data, hookChainId, actionPath) {
|
|
204
|
-
if (data.chainId === hookChainId)
|
|
205
|
-
return [];
|
|
206
|
-
return [{
|
|
207
|
-
code: types_1.ViolationCode.HookDirectChainIdMismatch,
|
|
208
|
-
message: "Direct hook Transaction data.chainId must equal hook.chainId",
|
|
209
|
-
path: `${actionPath}.data.chainId`,
|
|
210
|
-
expected: hookChainId,
|
|
211
|
-
actual: data.chainId,
|
|
212
|
-
}];
|
|
213
|
-
}
|
|
214
|
-
function validateProvidePlaceholdersAction(data, hookChainId, expectedDeferred, actionPath) {
|
|
215
|
-
const violations = [];
|
|
216
|
-
if (data.transaction.chainId !== hookChainId) {
|
|
217
|
-
violations.push({
|
|
218
|
-
code: types_1.ViolationCode.HookDirectChainIdMismatch,
|
|
219
|
-
message: "ProvidePlaceholders data.transaction.chainId must equal hook.chainId",
|
|
220
|
-
path: `${actionPath}.data.transaction.chainId`,
|
|
221
|
-
expected: hookChainId,
|
|
222
|
-
actual: data.transaction.chainId,
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
if (!placeholderArraysEqual(data.placeholders, expectedDeferred)) {
|
|
226
|
-
violations.push({
|
|
227
|
-
code: types_1.ViolationCode.HookDirectPlaceholdersMismatch,
|
|
228
|
-
message: "ProvidePlaceholders data.placeholders must match the deferred"
|
|
229
|
-
+ " placeholders declared in the request hook",
|
|
230
|
-
path: `${actionPath}.data.placeholders`,
|
|
231
|
-
expected: expectedDeferred,
|
|
232
|
-
actual: data.placeholders,
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
return violations;
|
|
236
|
-
}
|
|
237
|
-
function placeholderArraysEqual(a, b) {
|
|
238
|
-
if (a.length !== b.length)
|
|
239
|
-
return false;
|
|
240
|
-
for (let i = 0; i < a.length; i++) {
|
|
241
|
-
if (a[i].nameVariable !== b[i].nameVariable)
|
|
242
|
-
return false;
|
|
243
|
-
}
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
// CRITICAL: every EVM hook-action's calldata must equal `request.hook.data`
|
|
247
|
-
// after eager-placeholder substitution (deferred markers must remain in place).
|
|
248
|
-
// Resolution errors themselves are emitted by `validateHookEcho`; here we only
|
|
249
|
-
// report shape mismatches between the action's calldata and the expected value.
|
|
250
|
-
function validateHookActionCalldata(hookPayload, requestHook, basePath, mode, responseTrades, realChainId) {
|
|
251
|
-
// Safe skip: compensation hooks (no requestHook) have no expected calldata
|
|
252
|
-
// to compare against; structural correctness is enforced by
|
|
253
|
-
// `validateCompensationHookStructure` and
|
|
254
|
-
// `validateCompensationHookTransactionCall`.
|
|
255
|
-
if (!requestHook)
|
|
256
|
-
return [];
|
|
257
|
-
const { resolved: expectedCalldata } = (0, placeholder_1.resolveEagerPlaceholders)(requestHook.data, realChainId, requestHook.placeHolders, responseTrades, mode);
|
|
258
|
-
const violations = [];
|
|
259
|
-
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
260
|
-
const action = hookPayload.requiredActions[i];
|
|
261
|
-
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
262
|
-
// Safe skip: Delegate-bearing actions carry EIP-7702 authorization,
|
|
263
|
-
// not hook calldata.
|
|
264
|
-
if (action.actions.includes(types_1.EvmActionOperation.Delegate))
|
|
265
|
-
continue;
|
|
266
|
-
// Safe skip: actions whose hook-tx calldata cannot be extracted
|
|
267
|
-
// (`Sign712MetaMaskCaveats` with empty `transactionCalls` — reported
|
|
268
|
-
// as `HookSign712TransactionCallsEmpty` by
|
|
269
|
-
// `validateSign712TransactionCalls`; or types like `Permit` /
|
|
270
|
-
// `Permit2` that should not appear in a hook — reported by
|
|
271
|
-
// `validateHookActionsList` as a forbidden operation).
|
|
272
|
-
const extracted = extractEvmHookActionCalldata(action);
|
|
273
|
-
if (!extracted)
|
|
274
|
-
continue;
|
|
275
|
-
if (extracted.calldata !== expectedCalldata) {
|
|
276
|
-
violations.push({
|
|
277
|
-
code: types_1.ViolationCode.HookActionCalldataMismatch,
|
|
278
|
-
message: "hook action calldata does not match request.hook.data after"
|
|
279
|
-
+ " eager-placeholder substitution",
|
|
280
|
-
path: `${actionPath}.${extracted.path}`,
|
|
281
|
-
expected: expectedCalldata,
|
|
282
|
-
actual: extracted.calldata,
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
return violations;
|
|
287
|
-
}
|
|
288
|
-
// CRITICAL: `transactionCalls[0].{to, value}` must equal `hook.{to, value}` for
|
|
289
|
-
// `Sign712MetaMaskCaveats(WithPlaceholders)` actions — otherwise the user
|
|
290
|
-
// would sign a delegation that wraps a tx targeting / valued differently than
|
|
291
|
-
// the echoed hook fields.
|
|
292
|
-
function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
|
|
293
|
-
const violations = [];
|
|
294
|
-
const hook = hookPayload.hook;
|
|
295
|
-
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
296
|
-
const action = hookPayload.requiredActions[i];
|
|
297
|
-
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
298
|
-
if (!SIGN712_HOOK_TYPES.includes(action.type))
|
|
299
|
-
continue;
|
|
300
|
-
// Safe skip: missing transactionCalls reported by
|
|
301
|
-
// `validateSign712TransactionCalls`.
|
|
302
|
-
const tx = action.details?.transactionCalls?.[0];
|
|
303
|
-
if (!tx)
|
|
304
|
-
continue;
|
|
305
|
-
violations.push(...compareTransactionCallToHook(tx, hook, actionPath));
|
|
306
|
-
}
|
|
307
|
-
return violations;
|
|
308
|
-
}
|
|
309
|
-
function compareTransactionCallToHook(tx, hook, actionPath) {
|
|
310
|
-
const violations = [];
|
|
311
|
-
if (hook.to !== undefined && tx.to !== hook.to) {
|
|
312
|
-
violations.push({
|
|
313
|
-
code: types_1.ViolationCode.HookActionTransactionToMismatch,
|
|
314
|
-
message: "transactionCalls[0].to must equal hook.to",
|
|
315
|
-
path: `${actionPath}.details.transactionCalls[0].to`,
|
|
316
|
-
expected: hook.to,
|
|
317
|
-
actual: tx.to,
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
const hookValue = hook.value ?? "0";
|
|
321
|
-
if (!evmValuesEqual(tx.value, hookValue)) {
|
|
322
|
-
violations.push({
|
|
323
|
-
code: types_1.ViolationCode.HookActionTransactionValueMismatch,
|
|
324
|
-
message: "transactionCalls[0].value must equal hook.value",
|
|
325
|
-
path: `${actionPath}.details.transactionCalls[0].value`,
|
|
326
|
-
expected: hookValue,
|
|
327
|
-
actual: tx.value,
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
return violations;
|
|
331
|
-
}
|
|
332
|
-
// Returns true if two EVM-value strings are byte-identical or if both parse as
|
|
333
|
-
// BigInt and represent the same number (e.g. `"0x100"` vs `"256"`). Returns
|
|
334
|
-
// false otherwise.
|
|
335
|
-
function evmValuesEqual(a, b) {
|
|
336
|
-
if (a === b)
|
|
337
|
-
return true;
|
|
338
|
-
try {
|
|
339
|
-
return BigInt(a) === BigInt(b);
|
|
340
|
-
}
|
|
341
|
-
catch {
|
|
342
|
-
return false;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
// CRITICAL: a compensation hook's wrapped transaction must itself be a valid
|
|
346
|
-
// gas-compensation transfer — same rules as `compensation-hook.ts` applies to
|
|
347
|
-
// `hook.{to, data, value}`, but here applied to `transactionCalls[0]` so the
|
|
348
|
-
// user does not sign a delegation around a different (malicious) tx.
|
|
349
|
-
function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId) {
|
|
350
|
-
const allGroups = (0, gas_compensation_1.extractGasCompensationGroups)(request);
|
|
351
|
-
const matchingGroups = allGroups.filter(g => g.realChainId === realChainId
|
|
352
|
-
&& (0, address_1.addressEquals)(realChainId, g.sender, hookPayload.hook.from));
|
|
353
|
-
// Safe skip: from-mismatch reported by `validateCompensationHookStructure`
|
|
354
|
-
// (`CompensationHookFromMismatch`); without a matching group we can't
|
|
355
|
-
// meaningfully classify native vs ERC20.
|
|
356
|
-
if (matchingGroups.length === 0)
|
|
357
|
-
return [];
|
|
358
|
-
const violations = [];
|
|
359
|
-
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
360
|
-
const action = hookPayload.requiredActions[i];
|
|
361
|
-
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
362
|
-
if (!SIGN712_HOOK_TYPES.includes(action.type))
|
|
363
|
-
continue;
|
|
364
|
-
// Safe skip: missing transactionCalls reported by
|
|
365
|
-
// `validateSign712TransactionCalls`.
|
|
366
|
-
const tx = action.details?.transactionCalls?.[0];
|
|
367
|
-
if (!tx)
|
|
368
|
-
continue;
|
|
369
|
-
violations.push(...(0, evm_gas_compensation_tx_1.validateEvmGasCompensationTx)(tx, matchingGroups, realChainId, `${actionPath}.details.transactionCalls[0]`, {
|
|
370
|
-
toMismatch: types_1.ViolationCode.CompensationHookEvmToMismatch,
|
|
371
|
-
dataInvalid: types_1.ViolationCode.CompensationHookEvmDataInvalid,
|
|
372
|
-
valueInvalid: types_1.ViolationCode.CompensationHookEvmValueInvalid,
|
|
373
|
-
}));
|
|
374
|
-
}
|
|
375
|
-
return violations;
|
|
376
|
-
}
|
|
377
|
-
// Returns the calldata field for an EVM hook-action, plus the relative path
|
|
378
|
-
// to it. `undefined` is reserved for action types that don't carry a
|
|
379
|
-
// hook-tx calldata (e.g. Sign7702Authorization, Permit), or for malformed
|
|
380
|
-
// payloads where the expected nested field is missing — those are reported by
|
|
381
|
-
// dedicated validators (`validateSign712TransactionCalls` for empty
|
|
382
|
-
// transactionCalls, `validateHookActionsList` for forbidden operations).
|
|
383
|
-
function extractEvmHookActionCalldata(action) {
|
|
384
|
-
if (action.type === types_1.EvmActionKind.Transaction) {
|
|
385
|
-
const data = action.data;
|
|
386
|
-
// Safe skip: malformed payload (action.type tampered to mismatch
|
|
387
|
-
// action.data shape). The type/payload mismatch is reported via
|
|
388
|
-
// `HookDirectActionTypeInvalid` / `HookDelegatedActionTypeInvalid`.
|
|
389
|
-
if (typeof data?.data !== "string")
|
|
390
|
-
return undefined;
|
|
391
|
-
return { calldata: data.data, path: "data.data" };
|
|
392
|
-
}
|
|
393
|
-
if (action.type === types_1.EvmActionKind.ProvidePlaceholders) {
|
|
394
|
-
const data = action.data;
|
|
395
|
-
// Safe skip: same as Transaction above.
|
|
396
|
-
if (typeof data?.transaction?.data !== "string")
|
|
397
|
-
return undefined;
|
|
398
|
-
return { calldata: data.transaction.data, path: "data.transaction.data" };
|
|
399
|
-
}
|
|
400
|
-
if (action.type === types_1.EvmActionKind.Sign712MetaMaskCaveats
|
|
401
|
-
|| action.type === types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
|
|
402
|
-
// The API wraps a single hook tx into a one-element `transactionCalls`
|
|
403
|
-
// array. Hook scope never produces batch delegations, so `[0]` is the
|
|
404
|
-
// hook-tx call we want. A `transactionCalls` array longer than one is
|
|
405
|
-
// a structural anomaly reported by `validateSign712TransactionCalls`.
|
|
406
|
-
const tx = action.details?.transactionCalls?.[0];
|
|
407
|
-
// Safe skip: empty / missing `transactionCalls` is reported as
|
|
408
|
-
// `HookSign712TransactionCallsEmpty` by `validateSign712TransactionCalls`.
|
|
409
|
-
if (!tx)
|
|
410
|
-
return undefined;
|
|
411
|
-
return { calldata: tx.data, path: "details.transactionCalls[0].data" };
|
|
412
|
-
}
|
|
413
|
-
return undefined;
|
|
414
|
-
}
|
|
415
8
|
//# sourceMappingURL=evm-op-hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-op-hook.js","sourceRoot":"","sources":["../../../src/validations/evm-op-hook.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evm-op-hook.js","sourceRoot":"","sources":["../../../src/validations/evm-op-hook.ts"],"names":[],"mappings":";;AAIA,wDAKC;AAPD,wCAAwC;AAExC,SAAgB,sBAAsB,CAClC,QAA6B,EAC7B,SAAiB;IAEjB,OAAO,EAAE,CAAC;AACd,CAAC"}
|
|
@@ -9,7 +9,7 @@ const evm_calldata_1 = require("../helpers/evm-calldata");
|
|
|
9
9
|
const evm_token_1 = require("../helpers/evm-token");
|
|
10
10
|
const evm_trade_amounts_1 = require("../helpers/evm-trade-amounts");
|
|
11
11
|
const evm_action_1 = require("../helpers/evm-action");
|
|
12
|
-
function validateWrapOperations(actions, basePath, trades,
|
|
12
|
+
function validateWrapOperations(actions, basePath, trades, realChainId) {
|
|
13
13
|
const violations = [];
|
|
14
14
|
for (let i = 0; i < actions.length; i++) {
|
|
15
15
|
const action = actions[i];
|
|
@@ -37,13 +37,13 @@ function validateWrapOperations(actions, basePath, trades, responseTrades, realC
|
|
|
37
37
|
actual: txCalls.length,
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
-
violations.push(...validateWrapNativeToken(trades, actionPath
|
|
40
|
+
violations.push(...validateWrapNativeToken(trades, actionPath), ...validateWrapTo(txCalls[0], actionPath, realChainId), ...validateWrapCalldata(txCalls[0], actionPath), ...validateWrapAmount(txCalls[0], actionPath, trades, realChainId));
|
|
41
41
|
}
|
|
42
42
|
return violations;
|
|
43
43
|
}
|
|
44
44
|
// CRITICAL: native token must be present in trades
|
|
45
|
-
function validateWrapNativeToken(trades, actionPath
|
|
46
|
-
const hasNative = trades.some(t => (0, evm_token_1.isNativeToken)(t.srcChainTokenIn
|
|
45
|
+
function validateWrapNativeToken(trades, actionPath) {
|
|
46
|
+
const hasNative = trades.some(t => (0, evm_token_1.isNativeToken)(t.srcChainTokenIn));
|
|
47
47
|
if (!hasNative) {
|
|
48
48
|
return [{
|
|
49
49
|
code: types_1.ViolationCode.WrapNativeTokenNotInTrades,
|
|
@@ -78,12 +78,9 @@ function validateWrapCalldata(txCall, actionPath) {
|
|
|
78
78
|
}
|
|
79
79
|
return [];
|
|
80
80
|
}
|
|
81
|
-
// CRITICAL: deposit amount (from value) must match sum of native trade amounts
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
// `srcChainTokenInAmount + approximateOperatingExpense` over native trades.
|
|
85
|
-
function validateWrapAmount(txCall, actionPath, trades, responseTrades, realChainId) {
|
|
86
|
-
const sumResult = (0, evm_trade_amounts_1.sumTradeAmounts)(trades, viem_1.zeroAddress, realChainId, responseTrades);
|
|
81
|
+
// CRITICAL: deposit amount (from value) must match sum of native trade amounts
|
|
82
|
+
function validateWrapAmount(txCall, actionPath, trades, realChainId) {
|
|
83
|
+
const sumResult = (0, evm_trade_amounts_1.sumTradeAmounts)(trades, viem_1.zeroAddress, realChainId);
|
|
87
84
|
if (sumResult.violations)
|
|
88
85
|
return sumResult.violations;
|
|
89
86
|
if (sumResult.skip)
|