@debridge-finance/borderless-validation-sdk 0.0.6 → 0.0.8
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/eip712-types.js +29 -0
- package/dist/cjs/helpers/eip712-types.js.map +1 -0
- package/dist/cjs/helpers/evm-action.js +18 -2
- package/dist/cjs/helpers/evm-action.js.map +1 -1
- package/dist/cjs/helpers/evm-dln-hook-pack.js +8 -6
- package/dist/cjs/helpers/evm-dln-hook-pack.js.map +1 -1
- package/dist/cjs/helpers/evm-gas-compensation-tx.js +26 -7
- package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -1
- package/dist/cjs/helpers/evm-intent-id.js +6 -5
- package/dist/cjs/helpers/evm-intent-id.js.map +1 -1
- package/dist/cjs/helpers/evm-token.js +1 -1
- package/dist/cjs/helpers/evm-token.js.map +1 -1
- package/dist/cjs/helpers/evm-trade-amounts.js +2 -1
- package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/cjs/helpers/expected-delegate.js +10 -11
- package/dist/cjs/helpers/expected-delegate.js.map +1 -1
- package/dist/cjs/helpers/gas-compensation.js +3 -0
- package/dist/cjs/helpers/gas-compensation.js.map +1 -1
- package/dist/cjs/helpers/hex.js +35 -0
- package/dist/cjs/helpers/hex.js.map +1 -1
- package/dist/cjs/helpers/integer.js +10 -0
- package/dist/cjs/helpers/integer.js.map +1 -0
- package/dist/cjs/helpers/placeholder.js +99 -4
- package/dist/cjs/helpers/placeholder.js.map +1 -1
- package/dist/cjs/helpers/solana-intent-id.js +6 -5
- package/dist/cjs/helpers/solana-intent-id.js.map +1 -1
- package/dist/cjs/helpers/synthetic-native-wrap.js +56 -0
- package/dist/cjs/helpers/synthetic-native-wrap.js.map +1 -0
- package/dist/cjs/types/enums.js +2 -0
- package/dist/cjs/types/enums.js.map +1 -1
- package/dist/cjs/types/request.js +25 -5
- package/dist/cjs/types/request.js.map +1 -1
- package/dist/cjs/types/response.js +10 -3
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +28 -1
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/validations/accumulative-token.js +5 -4
- package/dist/cjs/validations/accumulative-token.js.map +1 -1
- package/dist/cjs/validations/compensation-hook.js +14 -4
- package/dist/cjs/validations/compensation-hook.js.map +1 -1
- package/dist/cjs/validations/dln-metadata.js +63 -0
- package/dist/cjs/validations/dln-metadata.js.map +1 -0
- package/dist/cjs/validations/evm-caveats.js +12 -11
- package/dist/cjs/validations/evm-caveats.js.map +1 -1
- package/dist/cjs/validations/evm-op-budget.js +162 -53
- package/dist/cjs/validations/evm-op-budget.js.map +1 -1
- package/dist/cjs/validations/evm-op-hook.js +67 -26
- package/dist/cjs/validations/evm-op-hook.js.map +1 -1
- package/dist/cjs/validations/evm-op-wrap.js +29 -26
- package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
- package/dist/cjs/validations/evm-permit.js +143 -42
- package/dist/cjs/validations/evm-permit.js.map +1 -1
- package/dist/cjs/validations/evm-permit2.js +32 -39
- package/dist/cjs/validations/evm-permit2.js.map +1 -1
- package/dist/cjs/validations/evm-required-actions.js +17 -9
- package/dist/cjs/validations/evm-required-actions.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-metamask.js +126 -3
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-shared.js +4 -5
- package/dist/cjs/validations/evm-sign712-shared.js.map +1 -1
- package/dist/cjs/validations/evm-sign712.js +3 -23
- package/dist/cjs/validations/evm-sign712.js.map +1 -1
- package/dist/cjs/validations/evm-sign7702.js +4 -5
- package/dist/cjs/validations/evm-sign7702.js.map +1 -1
- package/dist/cjs/validations/external-call.js +330 -0
- package/dist/cjs/validations/external-call.js.map +1 -0
- package/dist/cjs/validations/hooks-common.js +279 -25
- package/dist/cjs/validations/hooks-common.js.map +1 -1
- package/dist/cjs/validations/intent-tokens.js +23 -15
- package/dist/cjs/validations/intent-tokens.js.map +1 -1
- package/dist/cjs/validations/intent.js +194 -72
- package/dist/cjs/validations/intent.js.map +1 -1
- package/dist/cjs/validations/ptp.js +7 -6
- package/dist/cjs/validations/ptp.js.map +1 -1
- package/dist/cjs/validations/required-actions.js +6 -4
- package/dist/cjs/validations/required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-hook.js +74 -9
- package/dist/cjs/validations/solana-hook.js.map +1 -1
- package/dist/cjs/validations/solana-op-budget.js +71 -2
- package/dist/cjs/validations/solana-op-budget.js.map +1 -1
- package/dist/cjs/validations/solana-op-wrap.js +32 -4
- package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
- package/dist/cjs/validations/solana-sign.js +31 -15
- package/dist/cjs/validations/solana-sign.js.map +1 -1
- package/dist/cjs/validations/solana-transaction.js +29 -2
- package/dist/cjs/validations/solana-transaction.js.map +1 -1
- package/dist/cjs/validations/total-dst-amount.js +36 -22
- package/dist/cjs/validations/total-dst-amount.js.map +1 -1
- package/dist/cjs/validations/trade-grouping.js +67 -31
- package/dist/cjs/validations/trade-grouping.js.map +1 -1
- package/dist/cjs/validations/trade-matching.js +112 -0
- package/dist/cjs/validations/trade-matching.js.map +1 -0
- package/dist/cjs/validations/trades.js +53 -52
- package/dist/cjs/validations/trades.js.map +1 -1
- package/dist/cjs/validator.js +19 -7
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/environment-config.js +65 -16
- package/dist/cjs/whitelists/environment-config.js.map +1 -1
- package/dist/cjs/whitelists/solana/intent-signature.js +7 -2
- package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/cjs/whitelists/types.js.map +1 -1
- package/dist/esm/helpers/eip712-types.js +26 -0
- package/dist/esm/helpers/eip712-types.js.map +1 -0
- package/dist/esm/helpers/evm-action.js +16 -2
- package/dist/esm/helpers/evm-action.js.map +1 -1
- package/dist/esm/helpers/evm-dln-hook-pack.js +8 -6
- package/dist/esm/helpers/evm-dln-hook-pack.js.map +1 -1
- package/dist/esm/helpers/evm-gas-compensation-tx.js +26 -7
- package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -1
- package/dist/esm/helpers/evm-intent-id.js +6 -5
- package/dist/esm/helpers/evm-intent-id.js.map +1 -1
- package/dist/esm/helpers/evm-token.js +3 -3
- package/dist/esm/helpers/evm-token.js.map +1 -1
- package/dist/esm/helpers/evm-trade-amounts.js +2 -1
- package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/esm/helpers/expected-delegate.js +10 -11
- package/dist/esm/helpers/expected-delegate.js.map +1 -1
- package/dist/esm/helpers/gas-compensation.js +3 -0
- package/dist/esm/helpers/gas-compensation.js.map +1 -1
- package/dist/esm/helpers/hex.js +29 -0
- package/dist/esm/helpers/hex.js.map +1 -1
- package/dist/esm/helpers/integer.js +7 -0
- package/dist/esm/helpers/integer.js.map +1 -0
- package/dist/esm/helpers/placeholder.js +98 -4
- package/dist/esm/helpers/placeholder.js.map +1 -1
- package/dist/esm/helpers/solana-intent-id.js +6 -5
- package/dist/esm/helpers/solana-intent-id.js.map +1 -1
- package/dist/esm/helpers/synthetic-native-wrap.js +52 -0
- package/dist/esm/helpers/synthetic-native-wrap.js.map +1 -0
- package/dist/esm/types/enums.js +2 -0
- package/dist/esm/types/enums.js.map +1 -1
- package/dist/esm/types/request.js +23 -4
- package/dist/esm/types/request.js.map +1 -1
- package/dist/esm/types/response.js +10 -3
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +28 -1
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/validations/accumulative-token.js +5 -4
- package/dist/esm/validations/accumulative-token.js.map +1 -1
- package/dist/esm/validations/compensation-hook.js +14 -4
- package/dist/esm/validations/compensation-hook.js.map +1 -1
- package/dist/esm/validations/dln-metadata.js +56 -0
- package/dist/esm/validations/dln-metadata.js.map +1 -0
- package/dist/esm/validations/evm-caveats.js +12 -11
- package/dist/esm/validations/evm-caveats.js.map +1 -1
- package/dist/esm/validations/evm-op-budget.js +162 -54
- package/dist/esm/validations/evm-op-budget.js.map +1 -1
- package/dist/esm/validations/evm-op-hook.js +68 -27
- package/dist/esm/validations/evm-op-hook.js.map +1 -1
- package/dist/esm/validations/evm-op-wrap.js +30 -27
- package/dist/esm/validations/evm-op-wrap.js.map +1 -1
- package/dist/esm/validations/evm-permit.js +144 -43
- package/dist/esm/validations/evm-permit.js.map +1 -1
- package/dist/esm/validations/evm-permit2.js +33 -40
- package/dist/esm/validations/evm-permit2.js.map +1 -1
- package/dist/esm/validations/evm-required-actions.js +18 -10
- package/dist/esm/validations/evm-required-actions.js.map +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js +126 -3
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/esm/validations/evm-sign712-shared.js +4 -5
- package/dist/esm/validations/evm-sign712-shared.js.map +1 -1
- package/dist/esm/validations/evm-sign712.js +3 -23
- package/dist/esm/validations/evm-sign712.js.map +1 -1
- package/dist/esm/validations/evm-sign7702.js +4 -5
- package/dist/esm/validations/evm-sign7702.js.map +1 -1
- package/dist/esm/validations/external-call.js +325 -0
- package/dist/esm/validations/external-call.js.map +1 -0
- package/dist/esm/validations/hooks-common.js +280 -26
- package/dist/esm/validations/hooks-common.js.map +1 -1
- package/dist/esm/validations/intent-tokens.js +23 -15
- package/dist/esm/validations/intent-tokens.js.map +1 -1
- package/dist/esm/validations/intent.js +197 -75
- package/dist/esm/validations/intent.js.map +1 -1
- package/dist/esm/validations/ptp.js +7 -6
- package/dist/esm/validations/ptp.js.map +1 -1
- package/dist/esm/validations/required-actions.js +7 -5
- package/dist/esm/validations/required-actions.js.map +1 -1
- package/dist/esm/validations/solana-hook.js +74 -9
- package/dist/esm/validations/solana-hook.js.map +1 -1
- package/dist/esm/validations/solana-op-budget.js +71 -2
- package/dist/esm/validations/solana-op-budget.js.map +1 -1
- package/dist/esm/validations/solana-op-wrap.js +32 -4
- package/dist/esm/validations/solana-op-wrap.js.map +1 -1
- package/dist/esm/validations/solana-sign.js +31 -15
- package/dist/esm/validations/solana-sign.js.map +1 -1
- package/dist/esm/validations/solana-transaction.js +29 -2
- package/dist/esm/validations/solana-transaction.js.map +1 -1
- package/dist/esm/validations/total-dst-amount.js +36 -22
- package/dist/esm/validations/total-dst-amount.js.map +1 -1
- package/dist/esm/validations/trade-grouping.js +67 -31
- package/dist/esm/validations/trade-grouping.js.map +1 -1
- package/dist/esm/validations/trade-matching.js +109 -0
- package/dist/esm/validations/trade-matching.js.map +1 -0
- package/dist/esm/validations/trades.js +53 -52
- package/dist/esm/validations/trades.js.map +1 -1
- package/dist/esm/validator.js +19 -7
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/environment-config.js +65 -16
- package/dist/esm/whitelists/environment-config.js.map +1 -1
- package/dist/esm/whitelists/solana/intent-signature.js +7 -2
- package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/esm/whitelists/types.js.map +1 -1
- package/dist/types/helpers/eip712-types.d.ts +7 -0
- package/dist/types/helpers/eip712-types.d.ts.map +1 -0
- package/dist/types/helpers/evm-action.d.ts +6 -0
- package/dist/types/helpers/evm-action.d.ts.map +1 -1
- package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +1 -1
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts +3 -1
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -1
- package/dist/types/helpers/evm-intent-id.d.ts.map +1 -1
- package/dist/types/helpers/evm-token.d.ts.map +1 -1
- package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
- package/dist/types/helpers/expected-delegate.d.ts.map +1 -1
- package/dist/types/helpers/gas-compensation.d.ts.map +1 -1
- package/dist/types/helpers/hex.d.ts +6 -0
- package/dist/types/helpers/hex.d.ts.map +1 -1
- package/dist/types/helpers/integer.d.ts +2 -0
- package/dist/types/helpers/integer.d.ts.map +1 -0
- package/dist/types/helpers/placeholder.d.ts +3 -1
- package/dist/types/helpers/placeholder.d.ts.map +1 -1
- package/dist/types/helpers/solana-intent-id.d.ts.map +1 -1
- package/dist/types/helpers/synthetic-native-wrap.d.ts +4 -0
- package/dist/types/helpers/synthetic-native-wrap.d.ts.map +1 -0
- package/dist/types/types/enums.d.ts +4 -2
- package/dist/types/types/enums.d.ts.map +1 -1
- package/dist/types/types/request.d.ts +83 -6
- package/dist/types/types/request.d.ts.map +1 -1
- package/dist/types/types/response.d.ts +95 -12
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +29 -1
- package/dist/types/types/validation.d.ts.map +1 -1
- package/dist/types/validations/accumulative-token.d.ts.map +1 -1
- package/dist/types/validations/compensation-hook.d.ts +2 -1
- package/dist/types/validations/compensation-hook.d.ts.map +1 -1
- package/dist/types/validations/dln-metadata.d.ts +7 -0
- package/dist/types/validations/dln-metadata.d.ts.map +1 -0
- package/dist/types/validations/evm-caveats.d.ts +2 -1
- package/dist/types/validations/evm-caveats.d.ts.map +1 -1
- package/dist/types/validations/evm-op-budget.d.ts +8 -0
- package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
- package/dist/types/validations/evm-op-hook.d.ts +2 -1
- package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
- package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/evm-permit.d.ts.map +1 -1
- package/dist/types/validations/evm-permit2.d.ts.map +1 -1
- package/dist/types/validations/evm-required-actions.d.ts +1 -1
- package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts +2 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-shared.d.ts +3 -2
- package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712.d.ts.map +1 -1
- package/dist/types/validations/evm-sign7702.d.ts +3 -2
- package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
- package/dist/types/validations/external-call.d.ts +15 -0
- package/dist/types/validations/external-call.d.ts.map +1 -0
- package/dist/types/validations/hooks-common.d.ts +5 -1
- package/dist/types/validations/hooks-common.d.ts.map +1 -1
- package/dist/types/validations/intent-tokens.d.ts.map +1 -1
- package/dist/types/validations/intent.d.ts +1 -1
- package/dist/types/validations/intent.d.ts.map +1 -1
- package/dist/types/validations/ptp.d.ts.map +1 -1
- package/dist/types/validations/required-actions.d.ts +1 -1
- package/dist/types/validations/required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-hook.d.ts +2 -1
- package/dist/types/validations/solana-hook.d.ts.map +1 -1
- package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
- package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/solana-transaction.d.ts.map +1 -1
- package/dist/types/validations/total-dst-amount.d.ts.map +1 -1
- package/dist/types/validations/trade-grouping.d.ts +2 -1
- package/dist/types/validations/trade-grouping.d.ts.map +1 -1
- package/dist/types/validations/trade-matching.d.ts +13 -0
- package/dist/types/validations/trade-matching.d.ts.map +1 -0
- package/dist/types/validations/trades.d.ts +2 -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/solana/intent-signature.d.ts +1 -0
- package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
- package/dist/types/whitelists/types.d.ts +9 -0
- package/dist/types/whitelists/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -5,7 +5,8 @@ import { maxUint256 } from "viem";
|
|
|
5
5
|
import { isNativeToken, resolveWrappedTokenAddress } from "../helpers/evm-token.js";
|
|
6
6
|
import { addressEquals, normalizeAddress } from "../helpers/address.js";
|
|
7
7
|
import { sumTradeAmounts } from "../helpers/evm-trade-amounts.js";
|
|
8
|
-
import { getTransactionCalls,
|
|
8
|
+
import { actionUsesTransactionCalls, getTransactionCallRefs, getTransactionCalls, getTransactionCallsContainerPath, } from "../helpers/evm-action.js";
|
|
9
|
+
import { parseIntegerString } from "../helpers/integer.js";
|
|
9
10
|
export function validateBudgetOperations(actions, basePath, request, trades, responseTrades, realChainId, envConfig) {
|
|
10
11
|
const violations = [];
|
|
11
12
|
for (let i = 0; i < actions.length; i++) {
|
|
@@ -15,12 +16,11 @@ export function validateBudgetOperations(actions, basePath, request, trades, res
|
|
|
15
16
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
16
17
|
// Applies to ALL Budget actions regardless of type
|
|
17
18
|
violations.push(...validateBudgetApproveNone(request, actionPath));
|
|
18
|
-
// Token address and calldata checks only apply to actions that
|
|
19
|
-
//
|
|
20
|
-
// validated by the permit/permit2 validators instead.
|
|
19
|
+
// Token address and calldata checks only apply to actions that carry
|
|
20
|
+
// effective transaction calls. Permit/Permit2 are validated separately.
|
|
21
21
|
if (!actionUsesTransactionCalls(action))
|
|
22
22
|
continue;
|
|
23
|
-
violations.push(...validateBudgetTokenAddress(action, actionPath, trades, realChainId), ...
|
|
23
|
+
violations.push(...validateBudgetTokenAddress(action, actionPath, trades, realChainId), ...validateBudgetTransactionValues(action, actionPath), ...validateBudgetCalldata(actions, i, actionPath, request, trades, responseTrades, realChainId, envConfig));
|
|
24
24
|
}
|
|
25
25
|
return violations;
|
|
26
26
|
}
|
|
@@ -36,17 +36,19 @@ function validateBudgetApproveNone(request, actionPath) {
|
|
|
36
36
|
}
|
|
37
37
|
return [];
|
|
38
38
|
}
|
|
39
|
-
// CRITICAL:
|
|
39
|
+
// CRITICAL: effective call target == details.tokenAddress, non-zero, in trades
|
|
40
40
|
function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
|
|
41
41
|
const violations = [];
|
|
42
|
-
const
|
|
42
|
+
const txCallRefs = getTransactionCallRefs(action, actionPath);
|
|
43
43
|
const tokenAddress = action.details?.tokenAddress;
|
|
44
|
-
// CRITICAL:
|
|
45
|
-
|
|
44
|
+
// CRITICAL: at least one effective transaction call must be present.
|
|
45
|
+
// Non-AA Transaction actions store it in action.data; AA actions store it
|
|
46
|
+
// in details.transactionCalls[].
|
|
47
|
+
if (txCallRefs.length === 0) {
|
|
46
48
|
violations.push({
|
|
47
49
|
code: ViolationCode.BudgetTransactionCallsMissing,
|
|
48
|
-
message: `Budget must have at least one
|
|
49
|
-
path:
|
|
50
|
+
message: `Budget must have at least one effective transaction call`,
|
|
51
|
+
path: getTransactionCallsContainerPath(action, actionPath),
|
|
50
52
|
actual: [],
|
|
51
53
|
});
|
|
52
54
|
}
|
|
@@ -61,18 +63,21 @@ function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
|
|
|
61
63
|
}
|
|
62
64
|
// Skip further checks if critical data is missing.
|
|
63
65
|
// It's safe as we already reported the violations for missing the required fields.
|
|
64
|
-
if (
|
|
66
|
+
if (txCallRefs.length === 0 || !tokenAddress)
|
|
65
67
|
return violations;
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
68
|
+
// CRITICAL: every effective Budget approve/reset call target must equal
|
|
69
|
+
// details.tokenAddress. This covers both one-call and reset+approve shapes.
|
|
70
|
+
for (const txCallRef of txCallRefs) {
|
|
71
|
+
const txTo = txCallRef.call.to;
|
|
72
|
+
if (!txTo || !addressEquals(realChainId, txTo, tokenAddress)) {
|
|
73
|
+
violations.push({
|
|
74
|
+
code: ViolationCode.BudgetTokenAddressMismatch,
|
|
75
|
+
message: `Budget transaction call target must equal details.tokenAddress`,
|
|
76
|
+
path: `${txCallRef.path}.to`,
|
|
77
|
+
expected: tokenAddress,
|
|
78
|
+
actual: txTo,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
76
81
|
}
|
|
77
82
|
// CRITICAL: must be non-zero address
|
|
78
83
|
if (isNativeToken(tokenAddress, realChainId)) {
|
|
@@ -101,70 +106,111 @@ function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
|
|
|
101
106
|
}
|
|
102
107
|
return violations;
|
|
103
108
|
}
|
|
109
|
+
// CRITICAL: Budget approve/reset calls must not send native value.
|
|
110
|
+
function validateBudgetTransactionValues(action, actionPath) {
|
|
111
|
+
const violations = [];
|
|
112
|
+
const txCallRefs = getTransactionCallRefs(action, actionPath);
|
|
113
|
+
for (const txCallRef of txCallRefs) {
|
|
114
|
+
try {
|
|
115
|
+
const value = parseIntegerString(txCallRef.call.value);
|
|
116
|
+
if (value !== 0n) {
|
|
117
|
+
violations.push({
|
|
118
|
+
code: ViolationCode.BudgetTransactionValueNonZero,
|
|
119
|
+
message: `Budget transaction call value must be zero`,
|
|
120
|
+
path: `${txCallRef.path}.value`,
|
|
121
|
+
expected: "0",
|
|
122
|
+
actual: value.toString(),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
violations.push({
|
|
128
|
+
code: ViolationCode.BudgetTransactionValueNonZero,
|
|
129
|
+
message: `Budget transaction call value is not a valid integer`,
|
|
130
|
+
path: `${txCallRef.path}.value`,
|
|
131
|
+
expected: "0",
|
|
132
|
+
actual: txCallRef.call.value,
|
|
133
|
+
details: error,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return violations;
|
|
138
|
+
}
|
|
104
139
|
// CRITICAL: decode approve calldata, validate spender + amount + allowanceHolder
|
|
105
|
-
// Handles
|
|
106
|
-
|
|
107
|
-
|
|
140
|
+
// Handles both accepted reset shapes:
|
|
141
|
+
// - separate reset action followed by the main Budget action;
|
|
142
|
+
// - one action with reset + main transactionCalls.
|
|
143
|
+
function validateBudgetCalldata(actions, actionIndex, actionPath, request, trades, responseTrades, realChainId, envConfig) {
|
|
144
|
+
const action = actions[actionIndex];
|
|
145
|
+
const txCallRefs = getTransactionCallRefs(action, actionPath);
|
|
108
146
|
// Missing txCalls is reported by validateBudgetTokenAddress
|
|
109
|
-
if (
|
|
147
|
+
if (txCallRefs.length === 0)
|
|
110
148
|
return [];
|
|
111
|
-
const decoded = decodeBudgetApproveCalls(
|
|
149
|
+
const decoded = decodeBudgetApproveCalls(txCallRefs, action, actionPath, realChainId);
|
|
112
150
|
if ("violations" in decoded)
|
|
113
151
|
return decoded.violations;
|
|
114
152
|
const violations = [];
|
|
115
|
-
|
|
153
|
+
const isSeparateReset = txCallRefs.length === 1 && decoded.amount === 0n;
|
|
154
|
+
violations.push(...validateBudgetAllowanceHolder(decoded.spender, action, actionPath, decoded.path, realChainId, envConfig));
|
|
155
|
+
if (isSeparateReset) {
|
|
156
|
+
violations.push(...validateSeparateBudgetResetPair(actions, actionIndex, actionPath, decoded, realChainId));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
violations.push(...validateBudgetAmount(decoded.amount, decoded.path, request, trades, responseTrades, action, realChainId));
|
|
160
|
+
}
|
|
116
161
|
return violations;
|
|
117
162
|
}
|
|
118
163
|
// Decodes one or two approve calls. Returns the "real" approve.
|
|
119
164
|
// If two calls: first must be approve(spender, 0), second is the real one.
|
|
120
|
-
function decodeBudgetApproveCalls(
|
|
121
|
-
const calldataPath =
|
|
122
|
-
// CRITICAL: at most 2
|
|
123
|
-
if (
|
|
165
|
+
function decodeBudgetApproveCalls(txCallRefs, action, actionPath, realChainId) {
|
|
166
|
+
const calldataPath = getTransactionCallsContainerPath(action, actionPath);
|
|
167
|
+
// CRITICAL: at most 2 effective transaction calls
|
|
168
|
+
if (txCallRefs.length > 2) {
|
|
124
169
|
return { violations: [{
|
|
125
170
|
code: ViolationCode.BudgetTooManyTransactionCalls,
|
|
126
|
-
message: `Budget must have at most 2
|
|
171
|
+
message: `Budget must have at most 2 effective transaction calls`,
|
|
127
172
|
path: calldataPath,
|
|
128
173
|
expected: 2,
|
|
129
|
-
actual:
|
|
174
|
+
actual: txCallRefs.length,
|
|
130
175
|
}] };
|
|
131
176
|
}
|
|
132
|
-
const mainApproveIndex =
|
|
177
|
+
const mainApproveIndex = txCallRefs.length - 1;
|
|
178
|
+
const mainCallRef = txCallRefs[mainApproveIndex];
|
|
133
179
|
// Decode last call — this is always the "real" approve
|
|
134
180
|
let mainApprove;
|
|
135
181
|
try {
|
|
136
|
-
mainApprove = decodeApproveCalldata(
|
|
182
|
+
mainApprove = decodeApproveCalldata(mainCallRef.call.data);
|
|
137
183
|
}
|
|
138
184
|
catch (e) {
|
|
139
185
|
return { violations: [{
|
|
140
186
|
code: ViolationCode.BudgetCalldataInvalid,
|
|
141
187
|
message: `Budget calldata is not valid approve`,
|
|
142
|
-
path: `${
|
|
143
|
-
actual:
|
|
188
|
+
path: `${mainCallRef.path}.data`,
|
|
189
|
+
actual: mainCallRef.call.data,
|
|
144
190
|
details: e,
|
|
145
191
|
}] };
|
|
146
192
|
}
|
|
147
193
|
// If two calls, the first must be a reset: approve(same spender, 0)
|
|
148
|
-
if (
|
|
149
|
-
const resetViolations = validateBudgetResetCall(
|
|
194
|
+
if (txCallRefs.length === 2) {
|
|
195
|
+
const resetViolations = validateBudgetResetCall(txCallRefs[0], mainApprove.spender, realChainId);
|
|
150
196
|
if (resetViolations.length > 0) {
|
|
151
197
|
return { violations: resetViolations };
|
|
152
198
|
}
|
|
153
199
|
}
|
|
154
|
-
return { ...mainApprove,
|
|
200
|
+
return { ...mainApprove, path: `${mainCallRef.path}.data` };
|
|
155
201
|
}
|
|
156
202
|
// Validates the reset call: must be approve(same spender, 0)
|
|
157
|
-
function validateBudgetResetCall(
|
|
203
|
+
function validateBudgetResetCall(txCallRef, expectedSpender, realChainId) {
|
|
158
204
|
let resetApprove;
|
|
159
205
|
try {
|
|
160
|
-
resetApprove = decodeApproveCalldata(
|
|
206
|
+
resetApprove = decodeApproveCalldata(txCallRef.call.data);
|
|
161
207
|
}
|
|
162
208
|
catch (e) {
|
|
163
209
|
return [{
|
|
164
210
|
code: ViolationCode.BudgetCalldataInvalid,
|
|
165
211
|
message: `Budget reset calldata is not valid approve`,
|
|
166
|
-
path: `${
|
|
167
|
-
actual:
|
|
212
|
+
path: `${txCallRef.path}.data`,
|
|
213
|
+
actual: txCallRef.call.data,
|
|
168
214
|
details: e,
|
|
169
215
|
}];
|
|
170
216
|
}
|
|
@@ -174,37 +220,99 @@ function validateBudgetResetCall(txCall, expectedSpender, calldataPath) {
|
|
|
174
220
|
violations.push({
|
|
175
221
|
code: ViolationCode.BudgetCalldataInvalid,
|
|
176
222
|
message: `Budget two-step approve: first call must be approve(spender, 0)`,
|
|
177
|
-
path: `${
|
|
223
|
+
path: `${txCallRef.path}.data`,
|
|
178
224
|
expected: "0",
|
|
179
225
|
actual: resetApprove.amount.toString(),
|
|
180
226
|
});
|
|
181
227
|
}
|
|
182
228
|
// CRITICAL: reset spender must match main spender
|
|
183
|
-
if (resetApprove.spender
|
|
229
|
+
if (!addressEquals(realChainId, resetApprove.spender, expectedSpender)) {
|
|
184
230
|
violations.push({
|
|
185
231
|
code: ViolationCode.BudgetCalldataInvalid,
|
|
186
232
|
message: `Budget two-step approve: reset spender must match main spender`,
|
|
187
|
-
path: `${
|
|
233
|
+
path: `${txCallRef.path}.data`,
|
|
188
234
|
expected: expectedSpender,
|
|
189
235
|
actual: resetApprove.spender,
|
|
190
236
|
});
|
|
191
237
|
}
|
|
192
238
|
return violations;
|
|
193
239
|
}
|
|
240
|
+
export function getBudgetApprovalInfo(action) {
|
|
241
|
+
if (action === undefined ||
|
|
242
|
+
!action.actions.includes(EvmActionOperation.Budget) ||
|
|
243
|
+
!actionUsesTransactionCalls(action) ||
|
|
244
|
+
!action.details?.tokenAddress) {
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
const txCalls = getTransactionCalls(action);
|
|
248
|
+
if (txCalls.length === 0 || txCalls.length > 2)
|
|
249
|
+
return undefined;
|
|
250
|
+
try {
|
|
251
|
+
const approve = decodeApproveCalldata(txCalls[txCalls.length - 1].data);
|
|
252
|
+
return {
|
|
253
|
+
tokenAddress: action.details.tokenAddress,
|
|
254
|
+
allowanceHolder: action.details.allowanceHolder,
|
|
255
|
+
spender: approve.spender,
|
|
256
|
+
amount: approve.amount,
|
|
257
|
+
callCount: txCalls.length,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// HIGH: a standalone zero-reset approve is only valid when it is immediately
|
|
265
|
+
// followed by the main Budget approve for the same token/spender/holder.
|
|
266
|
+
function validateSeparateBudgetResetPair(actions, actionIndex, actionPath, decodedReset, realChainId) {
|
|
267
|
+
const current = getBudgetApprovalInfo(actions[actionIndex]);
|
|
268
|
+
const next = getBudgetApprovalInfo(actions[actionIndex + 1]);
|
|
269
|
+
const paired = current !== undefined &&
|
|
270
|
+
next !== undefined &&
|
|
271
|
+
current.callCount === 1 &&
|
|
272
|
+
next.callCount === 1 &&
|
|
273
|
+
next.amount !== 0n &&
|
|
274
|
+
sameBudgetApprovalTarget(current, next, realChainId);
|
|
275
|
+
if (paired)
|
|
276
|
+
return [];
|
|
277
|
+
return [{
|
|
278
|
+
code: ViolationCode.BudgetResetActionUnpaired,
|
|
279
|
+
message: `Budget zero-reset action must be immediately followed by`
|
|
280
|
+
+ ` the main Budget approve for the same token and spender`,
|
|
281
|
+
path: actionPath,
|
|
282
|
+
actual: {
|
|
283
|
+
tokenAddress: current?.tokenAddress,
|
|
284
|
+
allowanceHolder: current?.allowanceHolder,
|
|
285
|
+
spender: decodedReset.spender,
|
|
286
|
+
amount: decodedReset.amount.toString(),
|
|
287
|
+
next: next ? {
|
|
288
|
+
tokenAddress: next.tokenAddress,
|
|
289
|
+
allowanceHolder: next.allowanceHolder,
|
|
290
|
+
spender: next.spender,
|
|
291
|
+
amount: next.amount.toString(),
|
|
292
|
+
} : undefined,
|
|
293
|
+
},
|
|
294
|
+
}];
|
|
295
|
+
}
|
|
296
|
+
function sameBudgetApprovalTarget(a, b, realChainId) {
|
|
297
|
+
return addressEquals(realChainId, a.tokenAddress, b.tokenAddress) &&
|
|
298
|
+
addressEquals(realChainId, a.spender, b.spender) &&
|
|
299
|
+
a.allowanceHolder !== undefined &&
|
|
300
|
+
b.allowanceHolder !== undefined &&
|
|
301
|
+
addressEquals(realChainId, a.allowanceHolder, b.allowanceHolder);
|
|
302
|
+
}
|
|
194
303
|
// CRITICAL: approve amount validation. The expected amount is
|
|
195
304
|
// `Σ response.trades[i].srcChainTokenIn.amount` over trades whose input
|
|
196
305
|
// token matches the Budget action's token — the same response-side number
|
|
197
306
|
// the API uses for `intent.inputToken[].constraintBudget` and Wrap.value.
|
|
198
|
-
function validateBudgetAmount(approveAmount,
|
|
307
|
+
function validateBudgetAmount(approveAmount, calldataPath, request, trades, responseTrades, action, realChainId) {
|
|
199
308
|
const flag = request.approveAmountFlag;
|
|
200
|
-
const dataPath = `${actionPath}.details.transactionCalls[${mainIndex}].data`;
|
|
201
309
|
// unlimited: must be maxUint256
|
|
202
310
|
if (flag === ApproveAmountFlag.Unlimited) {
|
|
203
311
|
if (approveAmount !== maxUint256) {
|
|
204
312
|
return [{
|
|
205
313
|
code: ViolationCode.BudgetAmountMismatch,
|
|
206
314
|
message: `Budget approve amount must be maxUint256 when approveAmountFlag="unlimited"`,
|
|
207
|
-
path:
|
|
315
|
+
path: calldataPath,
|
|
208
316
|
expected: maxUint256.toString(),
|
|
209
317
|
actual: approveAmount.toString(),
|
|
210
318
|
}];
|
|
@@ -225,7 +333,7 @@ function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, tra
|
|
|
225
333
|
return [{
|
|
226
334
|
code: ViolationCode.BudgetAmountMismatch,
|
|
227
335
|
message: `Budget approve amount does not match sum of trade amounts`,
|
|
228
|
-
path:
|
|
336
|
+
path: calldataPath,
|
|
229
337
|
expected: sumResult.sum.toString(),
|
|
230
338
|
actual: approveAmount.toString(),
|
|
231
339
|
}];
|
|
@@ -233,7 +341,7 @@ function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, tra
|
|
|
233
341
|
return [];
|
|
234
342
|
}
|
|
235
343
|
// CRITICAL: approve target == details.allowanceHolder, both whitelisted
|
|
236
|
-
function validateBudgetAllowanceHolder(approveSpender, action, actionPath,
|
|
344
|
+
function validateBudgetAllowanceHolder(approveSpender, action, actionPath, calldataPath, realChainId, envConfig) {
|
|
237
345
|
const violations = [];
|
|
238
346
|
const allowanceHolder = action.details?.allowanceHolder;
|
|
239
347
|
// CRITICAL: approve target must equal details.allowanceHolder
|
|
@@ -252,7 +360,7 @@ function validateBudgetAllowanceHolder(approveSpender, action, actionPath, mainI
|
|
|
252
360
|
violations.push({
|
|
253
361
|
code: ViolationCode.BudgetAllowanceHolderNotWhitelisted,
|
|
254
362
|
message: `Budget approve spender is not a whitelisted AllowanceHolder`,
|
|
255
|
-
path:
|
|
363
|
+
path: calldataPath,
|
|
256
364
|
actual: approveSpender,
|
|
257
365
|
});
|
|
258
366
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-op-budget.js","sourceRoot":"","sources":["../../../src/validations/evm-op-budget.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evm-op-budget.js","sourceRoot":"","sources":["../../../src/validations/evm-op-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { ViolationCode, EvmActionKind, EvmActionOperation, PlaceholderType, BundleHookType, } from "../types/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { isRequestHookV2 } from "../types/request.js";
|
|
3
|
+
import { HookMode, resolveEagerPlaceholders, resolveEagerValuePlaceholders, } from "../helpers/placeholder.js";
|
|
3
4
|
import { extractGasCompensationGroups } from "../helpers/gas-compensation.js";
|
|
4
5
|
import { validateEvmGasCompensationTx } from "../helpers/evm-gas-compensation-tx.js";
|
|
6
|
+
import { parseIntegerString } from "../helpers/integer.js";
|
|
5
7
|
import { addressEquals } from "../helpers/address.js";
|
|
6
8
|
import { getExpectedBundleHookDelegate } from "../helpers/expected-delegate.js";
|
|
7
9
|
import { validateSign7702Action } from "./evm-sign7702.js";
|
|
@@ -10,12 +12,14 @@ const SIGN712_HOOK_TYPES = [
|
|
|
10
12
|
EvmActionKind.Sign712MetaMaskCaveats,
|
|
11
13
|
EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders,
|
|
12
14
|
];
|
|
13
|
-
export function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request) {
|
|
15
|
+
export function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request, envConfig) {
|
|
14
16
|
const violations = [];
|
|
17
|
+
if (!isRequestHookV2(hookPayload.hook))
|
|
18
|
+
return violations;
|
|
15
19
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
16
20
|
const action = hookPayload.requiredActions[i];
|
|
17
21
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
18
|
-
violations.push(...validateHookSign7702Binding(action, actionPath, realChainId));
|
|
22
|
+
violations.push(...validateHookSign7702Binding(action, actionPath, realChainId, envConfig));
|
|
19
23
|
}
|
|
20
24
|
if (hookPayload.hook.type === BundleHookType.Direct) {
|
|
21
25
|
violations.push(...validateDirectEvmHookActions(hookPayload, requestHook, basePath));
|
|
@@ -27,12 +31,12 @@ export function validateEvmHookActions(hookPayload, requestHook, basePath, mode,
|
|
|
27
31
|
const expectedDelegate = request.enableAccountAbstraction
|
|
28
32
|
? getExpectedBundleHookDelegate(request.trades, hookPayload.hook.chainId)
|
|
29
33
|
: undefined;
|
|
30
|
-
violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp, expectedDelegate));
|
|
34
|
+
violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp, expectedDelegate, envConfig));
|
|
31
35
|
}
|
|
32
36
|
violations.push(...validateHookActionCalldata(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
|
|
33
|
-
violations.push(...validateHookActionTransactionCallsMatch(hookPayload, basePath));
|
|
37
|
+
violations.push(...validateHookActionTransactionCallsMatch(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
|
|
34
38
|
if (requestHook === undefined && mode === HookMode.PreHooks) {
|
|
35
|
-
violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId));
|
|
39
|
+
violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId, envConfig));
|
|
36
40
|
}
|
|
37
41
|
return violations;
|
|
38
42
|
}
|
|
@@ -43,7 +47,7 @@ export function validateEvmHookActions(hookPayload, requestHook, basePath, mode,
|
|
|
43
47
|
// `Transaction`) would slip through the operation/position checks elsewhere.
|
|
44
48
|
// The per-action [Delegate] + contractAddress checks are shared with intent-scope
|
|
45
49
|
// via `validateSign7702Action`; the type <-> [Delegate] binding is hook-specific.
|
|
46
|
-
function validateHookSign7702Binding(action, actionPath, realChainId) {
|
|
50
|
+
function validateHookSign7702Binding(action, actionPath, realChainId, envConfig) {
|
|
47
51
|
const violations = [];
|
|
48
52
|
const ops = action.actions;
|
|
49
53
|
const hasDelegate = ops.includes(EvmActionOperation.Delegate);
|
|
@@ -59,7 +63,7 @@ function validateHookSign7702Binding(action, actionPath, realChainId) {
|
|
|
59
63
|
});
|
|
60
64
|
}
|
|
61
65
|
if (isSign7702) {
|
|
62
|
-
violations.push(...validateSign7702Action(action, actionPath, realChainId));
|
|
66
|
+
violations.push(...validateSign7702Action(action, actionPath, realChainId, envConfig));
|
|
63
67
|
}
|
|
64
68
|
return violations;
|
|
65
69
|
}
|
|
@@ -106,7 +110,7 @@ function validateDirectAction(action, expectsTransaction, hookChainId, expectedD
|
|
|
106
110
|
// `Sign712MetaMaskCaveatsWithPlaceholders` (when at least one deferred
|
|
107
111
|
// placeholder is declared). transactionCalls form, placeholders match, and
|
|
108
112
|
// EIP-712 content checks (domain, delegator, caveats) are checked per-action below.
|
|
109
|
-
function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp, expectedDelegate) {
|
|
113
|
+
function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp, expectedDelegate, envConfig) {
|
|
110
114
|
const violations = [];
|
|
111
115
|
const expectedDeferred = collectDeferredPlaceholders(requestHook);
|
|
112
116
|
const hasDeferred = expectedDeferred.length > 0;
|
|
@@ -119,6 +123,7 @@ function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, rea
|
|
|
119
123
|
realChainId,
|
|
120
124
|
expirationTimestamp,
|
|
121
125
|
expectedDelegate,
|
|
126
|
+
envConfig,
|
|
122
127
|
};
|
|
123
128
|
// Collected `message.delegate` values across all delegated actions in this
|
|
124
129
|
// hook — checked for cross-action consistency after the loop.
|
|
@@ -173,7 +178,7 @@ function validateDelegatedAction(action, actionPath, ctx, observedDelegates) {
|
|
|
173
178
|
violations.push(...presenceErrors);
|
|
174
179
|
return violations;
|
|
175
180
|
}
|
|
176
|
-
violations.push(...validateSign712Domain(data, actionPath, ctx.realChainId), ...validateSign712Delegator(data, actionPath, ctx.realChainId, ctx.hookFrom, "hook.from"));
|
|
181
|
+
violations.push(...validateSign712Domain(data, actionPath, ctx.realChainId, ctx.envConfig), ...validateSign712Delegator(data, actionPath, ctx.realChainId, ctx.hookFrom, "hook.from"));
|
|
177
182
|
// Scoped delegate check: applies only when the request explicitly
|
|
178
183
|
// pinned a delegate via `trade.srcAllowedSender` on a matching-chain
|
|
179
184
|
// trade (caller set `ctx.expectedDelegate`). Otherwise the API
|
|
@@ -203,7 +208,7 @@ function validateDelegatedAction(action, actionPath, ctx, observedDelegates) {
|
|
|
203
208
|
}
|
|
204
209
|
const caveats = (data.message.caveats ?? []);
|
|
205
210
|
const txCalls = action.details?.transactionCalls ?? [];
|
|
206
|
-
violations.push(...validateSign712Caveats(caveats, action.actionId, txCalls, actionPath, ctx.realChainId, ctx.expirationTimestamp));
|
|
211
|
+
violations.push(...validateSign712Caveats(caveats, action.actionId, txCalls, actionPath, ctx.realChainId, ctx.expirationTimestamp, ctx.envConfig));
|
|
207
212
|
if (ctx.expectedType === EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
|
|
208
213
|
const withPlaceholdersData = data;
|
|
209
214
|
const actualPlaceholders = withPlaceholdersData.placeholders ?? [];
|
|
@@ -342,46 +347,53 @@ function validateHookActionCalldata(hookPayload, requestHook, basePath, mode, re
|
|
|
342
347
|
// `Sign712MetaMaskCaveats(WithPlaceholders)` actions — otherwise the user
|
|
343
348
|
// would sign a delegation that wraps a tx targeting / valued differently than
|
|
344
349
|
// the echoed hook fields.
|
|
345
|
-
function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
|
|
350
|
+
function validateHookActionTransactionCallsMatch(hookPayload, requestHook, basePath, mode, responseTrades, realChainId) {
|
|
346
351
|
const violations = [];
|
|
347
352
|
const hook = hookPayload.hook;
|
|
353
|
+
if (!isRequestHookV2(hook))
|
|
354
|
+
return violations;
|
|
348
355
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
349
356
|
const action = hookPayload.requiredActions[i];
|
|
350
357
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
351
|
-
|
|
358
|
+
// Safe skip: Delegate-bearing actions carry EIP-7702 authorization,
|
|
359
|
+
// not the hook transaction.
|
|
360
|
+
if (action.actions.includes(EvmActionOperation.Delegate))
|
|
352
361
|
continue;
|
|
353
|
-
|
|
354
|
-
// `validateSign712TransactionCalls`.
|
|
355
|
-
const tx = action.details?.transactionCalls?.[0];
|
|
362
|
+
const tx = extractEvmHookActionTransaction(action);
|
|
356
363
|
if (!tx)
|
|
357
364
|
continue;
|
|
358
|
-
violations.push(...compareTransactionCallToHook(tx, hook, actionPath));
|
|
365
|
+
violations.push(...compareTransactionCallToHook(tx.triplet, hook, requestHook, actionPath, tx.path, mode, responseTrades, realChainId));
|
|
359
366
|
}
|
|
360
367
|
return violations;
|
|
361
368
|
}
|
|
362
|
-
function compareTransactionCallToHook(tx, hook, actionPath) {
|
|
369
|
+
function compareTransactionCallToHook(tx, hook, requestHook, actionPath, txPath, mode, responseTrades, realChainId) {
|
|
363
370
|
const violations = [];
|
|
364
|
-
if (hook.to !== undefined && tx.to
|
|
371
|
+
if (hook.to !== undefined && !addressEquals(realChainId, tx.to, hook.to)) {
|
|
365
372
|
violations.push({
|
|
366
373
|
code: ViolationCode.HookActionTransactionToMismatch,
|
|
367
|
-
message: "
|
|
368
|
-
path: `${actionPath}.
|
|
374
|
+
message: "hook action transaction target must equal hook.to",
|
|
375
|
+
path: `${actionPath}.${txPath}.to`,
|
|
369
376
|
expected: hook.to,
|
|
370
377
|
actual: tx.to,
|
|
371
378
|
});
|
|
372
379
|
}
|
|
373
|
-
const hookValue = hook
|
|
380
|
+
const hookValue = resolveExpectedHookValue(hook, requestHook, mode, responseTrades, realChainId);
|
|
374
381
|
if (!evmValuesEqual(tx.value, hookValue)) {
|
|
375
382
|
violations.push({
|
|
376
383
|
code: ViolationCode.HookActionTransactionValueMismatch,
|
|
377
|
-
message: "
|
|
378
|
-
path: `${actionPath}.
|
|
384
|
+
message: "hook action transaction value must equal hook.value",
|
|
385
|
+
path: `${actionPath}.${txPath}.value`,
|
|
379
386
|
expected: hookValue,
|
|
380
387
|
actual: tx.value,
|
|
381
388
|
});
|
|
382
389
|
}
|
|
383
390
|
return violations;
|
|
384
391
|
}
|
|
392
|
+
function resolveExpectedHookValue(hook, requestHook, mode, responseTrades, realChainId) {
|
|
393
|
+
if (requestHook?.value === undefined)
|
|
394
|
+
return hook.value ?? "0";
|
|
395
|
+
return resolveEagerValuePlaceholders(requestHook.value, realChainId, requestHook.placeHolders, responseTrades, mode).resolved;
|
|
396
|
+
}
|
|
385
397
|
// Returns true if two EVM-value strings are byte-identical or if both parse as
|
|
386
398
|
// BigInt and represent the same number (e.g. `"0x100"` vs `"256"`). Returns
|
|
387
399
|
// false otherwise.
|
|
@@ -389,7 +401,7 @@ function evmValuesEqual(a, b) {
|
|
|
389
401
|
if (a === b)
|
|
390
402
|
return true;
|
|
391
403
|
try {
|
|
392
|
-
return
|
|
404
|
+
return parseIntegerString(a) === parseIntegerString(b);
|
|
393
405
|
}
|
|
394
406
|
catch {
|
|
395
407
|
return false;
|
|
@@ -399,7 +411,7 @@ function evmValuesEqual(a, b) {
|
|
|
399
411
|
// gas-compensation transfer — same rules as `compensation-hook.ts` applies to
|
|
400
412
|
// `hook.{to, data, value}`, but here applied to `transactionCalls[0]` so the
|
|
401
413
|
// user does not sign a delegation around a different (malicious) tx.
|
|
402
|
-
function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId) {
|
|
414
|
+
function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId, envConfig) {
|
|
403
415
|
const allGroups = extractGasCompensationGroups(request);
|
|
404
416
|
const matchingGroups = allGroups.filter(g => g.realChainId === realChainId
|
|
405
417
|
&& addressEquals(realChainId, g.sender, hookPayload.hook.from));
|
|
@@ -421,9 +433,10 @@ function validateCompensationHookTransactionCall(hookPayload, basePath, request,
|
|
|
421
433
|
continue;
|
|
422
434
|
violations.push(...validateEvmGasCompensationTx(tx, matchingGroups, realChainId, `${actionPath}.details.transactionCalls[0]`, {
|
|
423
435
|
toMismatch: ViolationCode.CompensationHookEvmToMismatch,
|
|
436
|
+
recipientMismatch: ViolationCode.CompensationHookEvmRecipientMismatch,
|
|
424
437
|
dataInvalid: ViolationCode.CompensationHookEvmDataInvalid,
|
|
425
438
|
valueInvalid: ViolationCode.CompensationHookEvmValueInvalid,
|
|
426
|
-
}));
|
|
439
|
+
}, envConfig.compensationDelegateContracts));
|
|
427
440
|
}
|
|
428
441
|
return violations;
|
|
429
442
|
}
|
|
@@ -465,4 +478,32 @@ function extractEvmHookActionCalldata(action) {
|
|
|
465
478
|
}
|
|
466
479
|
return undefined;
|
|
467
480
|
}
|
|
481
|
+
function extractEvmHookActionTransaction(action) {
|
|
482
|
+
if (action.type === EvmActionKind.Transaction) {
|
|
483
|
+
const data = action.data;
|
|
484
|
+
if (!isTransactionTriplet(data))
|
|
485
|
+
return undefined;
|
|
486
|
+
return { triplet: data, path: "data" };
|
|
487
|
+
}
|
|
488
|
+
if (action.type === EvmActionKind.ProvidePlaceholders) {
|
|
489
|
+
const data = action.data;
|
|
490
|
+
if (!isTransactionTriplet(data?.transaction))
|
|
491
|
+
return undefined;
|
|
492
|
+
return { triplet: data.transaction, path: "data.transaction" };
|
|
493
|
+
}
|
|
494
|
+
if (action.type === EvmActionKind.Sign712MetaMaskCaveats
|
|
495
|
+
|| action.type === EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
|
|
496
|
+
const tx = action.details?.transactionCalls?.[0];
|
|
497
|
+
if (!isTransactionTriplet(tx))
|
|
498
|
+
return undefined;
|
|
499
|
+
return { triplet: tx, path: "details.transactionCalls[0]" };
|
|
500
|
+
}
|
|
501
|
+
return undefined;
|
|
502
|
+
}
|
|
503
|
+
function isTransactionTriplet(value) {
|
|
504
|
+
const maybe = value;
|
|
505
|
+
return typeof maybe?.to === "string"
|
|
506
|
+
&& typeof maybe.data === "string"
|
|
507
|
+
&& typeof maybe.value === "string";
|
|
508
|
+
}
|
|
468
509
|
//# sourceMappingURL=evm-op-hook.js.map
|