@debridge-finance/borderless-validation-sdk 0.0.7 → 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.
Files changed (164) hide show
  1. package/dist/cjs/helpers/eip712-types.js +29 -0
  2. package/dist/cjs/helpers/eip712-types.js.map +1 -0
  3. package/dist/cjs/helpers/evm-action.js +18 -2
  4. package/dist/cjs/helpers/evm-action.js.map +1 -1
  5. package/dist/cjs/helpers/evm-gas-compensation-tx.js +24 -6
  6. package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -1
  7. package/dist/cjs/helpers/evm-token.js +1 -1
  8. package/dist/cjs/helpers/evm-token.js.map +1 -1
  9. package/dist/cjs/helpers/placeholder.js +96 -2
  10. package/dist/cjs/helpers/placeholder.js.map +1 -1
  11. package/dist/cjs/types/validation.js +22 -0
  12. package/dist/cjs/types/validation.js.map +1 -1
  13. package/dist/cjs/validations/compensation-hook.js +5 -4
  14. package/dist/cjs/validations/compensation-hook.js.map +1 -1
  15. package/dist/cjs/validations/evm-caveats.js +7 -8
  16. package/dist/cjs/validations/evm-caveats.js.map +1 -1
  17. package/dist/cjs/validations/evm-op-budget.js +162 -53
  18. package/dist/cjs/validations/evm-op-budget.js.map +1 -1
  19. package/dist/cjs/validations/evm-op-hook.js +60 -25
  20. package/dist/cjs/validations/evm-op-hook.js.map +1 -1
  21. package/dist/cjs/validations/evm-op-wrap.js +28 -26
  22. package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
  23. package/dist/cjs/validations/evm-permit.js +143 -42
  24. package/dist/cjs/validations/evm-permit.js.map +1 -1
  25. package/dist/cjs/validations/evm-permit2.js +25 -35
  26. package/dist/cjs/validations/evm-permit2.js.map +1 -1
  27. package/dist/cjs/validations/evm-required-actions.js +10 -5
  28. package/dist/cjs/validations/evm-required-actions.js.map +1 -1
  29. package/dist/cjs/validations/evm-sign712-metamask.js +126 -3
  30. package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
  31. package/dist/cjs/validations/evm-sign712-shared.js +4 -5
  32. package/dist/cjs/validations/evm-sign712-shared.js.map +1 -1
  33. package/dist/cjs/validations/evm-sign712.js +3 -23
  34. package/dist/cjs/validations/evm-sign712.js.map +1 -1
  35. package/dist/cjs/validations/evm-sign7702.js +4 -5
  36. package/dist/cjs/validations/evm-sign7702.js.map +1 -1
  37. package/dist/cjs/validations/hooks-common.js +247 -29
  38. package/dist/cjs/validations/hooks-common.js.map +1 -1
  39. package/dist/cjs/validations/intent.js +2 -1
  40. package/dist/cjs/validations/intent.js.map +1 -1
  41. package/dist/cjs/validations/required-actions.js +4 -2
  42. package/dist/cjs/validations/required-actions.js.map +1 -1
  43. package/dist/cjs/validations/solana-hook.js +72 -9
  44. package/dist/cjs/validations/solana-hook.js.map +1 -1
  45. package/dist/cjs/validations/solana-op-budget.js +69 -1
  46. package/dist/cjs/validations/solana-op-budget.js.map +1 -1
  47. package/dist/cjs/validations/solana-op-wrap.js +30 -3
  48. package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
  49. package/dist/cjs/validations/solana-sign.js +31 -15
  50. package/dist/cjs/validations/solana-sign.js.map +1 -1
  51. package/dist/cjs/validations/solana-transaction.js +29 -2
  52. package/dist/cjs/validations/solana-transaction.js.map +1 -1
  53. package/dist/cjs/validator.js +6 -3
  54. package/dist/cjs/validator.js.map +1 -1
  55. package/dist/cjs/whitelists/environment-config.js +61 -12
  56. package/dist/cjs/whitelists/environment-config.js.map +1 -1
  57. package/dist/cjs/whitelists/solana/intent-signature.js +7 -2
  58. package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
  59. package/dist/cjs/whitelists/types.js.map +1 -1
  60. package/dist/esm/helpers/eip712-types.js +26 -0
  61. package/dist/esm/helpers/eip712-types.js.map +1 -0
  62. package/dist/esm/helpers/evm-action.js +16 -2
  63. package/dist/esm/helpers/evm-action.js.map +1 -1
  64. package/dist/esm/helpers/evm-gas-compensation-tx.js +24 -6
  65. package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -1
  66. package/dist/esm/helpers/evm-token.js +3 -3
  67. package/dist/esm/helpers/evm-token.js.map +1 -1
  68. package/dist/esm/helpers/placeholder.js +95 -2
  69. package/dist/esm/helpers/placeholder.js.map +1 -1
  70. package/dist/esm/types/validation.js +22 -0
  71. package/dist/esm/types/validation.js.map +1 -1
  72. package/dist/esm/validations/compensation-hook.js +5 -4
  73. package/dist/esm/validations/compensation-hook.js.map +1 -1
  74. package/dist/esm/validations/evm-caveats.js +7 -8
  75. package/dist/esm/validations/evm-caveats.js.map +1 -1
  76. package/dist/esm/validations/evm-op-budget.js +162 -54
  77. package/dist/esm/validations/evm-op-budget.js.map +1 -1
  78. package/dist/esm/validations/evm-op-hook.js +61 -26
  79. package/dist/esm/validations/evm-op-hook.js.map +1 -1
  80. package/dist/esm/validations/evm-op-wrap.js +29 -27
  81. package/dist/esm/validations/evm-op-wrap.js.map +1 -1
  82. package/dist/esm/validations/evm-permit.js +144 -43
  83. package/dist/esm/validations/evm-permit.js.map +1 -1
  84. package/dist/esm/validations/evm-permit2.js +26 -36
  85. package/dist/esm/validations/evm-permit2.js.map +1 -1
  86. package/dist/esm/validations/evm-required-actions.js +11 -6
  87. package/dist/esm/validations/evm-required-actions.js.map +1 -1
  88. package/dist/esm/validations/evm-sign712-metamask.js +126 -3
  89. package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
  90. package/dist/esm/validations/evm-sign712-shared.js +4 -5
  91. package/dist/esm/validations/evm-sign712-shared.js.map +1 -1
  92. package/dist/esm/validations/evm-sign712.js +3 -23
  93. package/dist/esm/validations/evm-sign712.js.map +1 -1
  94. package/dist/esm/validations/evm-sign7702.js +4 -5
  95. package/dist/esm/validations/evm-sign7702.js.map +1 -1
  96. package/dist/esm/validations/hooks-common.js +249 -31
  97. package/dist/esm/validations/hooks-common.js.map +1 -1
  98. package/dist/esm/validations/intent.js +4 -3
  99. package/dist/esm/validations/intent.js.map +1 -1
  100. package/dist/esm/validations/required-actions.js +5 -3
  101. package/dist/esm/validations/required-actions.js.map +1 -1
  102. package/dist/esm/validations/solana-hook.js +72 -9
  103. package/dist/esm/validations/solana-hook.js.map +1 -1
  104. package/dist/esm/validations/solana-op-budget.js +69 -1
  105. package/dist/esm/validations/solana-op-budget.js.map +1 -1
  106. package/dist/esm/validations/solana-op-wrap.js +30 -3
  107. package/dist/esm/validations/solana-op-wrap.js.map +1 -1
  108. package/dist/esm/validations/solana-sign.js +31 -15
  109. package/dist/esm/validations/solana-sign.js.map +1 -1
  110. package/dist/esm/validations/solana-transaction.js +29 -2
  111. package/dist/esm/validations/solana-transaction.js.map +1 -1
  112. package/dist/esm/validator.js +6 -3
  113. package/dist/esm/validator.js.map +1 -1
  114. package/dist/esm/whitelists/environment-config.js +61 -12
  115. package/dist/esm/whitelists/environment-config.js.map +1 -1
  116. package/dist/esm/whitelists/solana/intent-signature.js +7 -2
  117. package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
  118. package/dist/esm/whitelists/types.js.map +1 -1
  119. package/dist/types/helpers/eip712-types.d.ts +7 -0
  120. package/dist/types/helpers/eip712-types.d.ts.map +1 -0
  121. package/dist/types/helpers/evm-action.d.ts +6 -0
  122. package/dist/types/helpers/evm-action.d.ts.map +1 -1
  123. package/dist/types/helpers/evm-gas-compensation-tx.d.ts +3 -1
  124. package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -1
  125. package/dist/types/helpers/evm-token.d.ts.map +1 -1
  126. package/dist/types/helpers/placeholder.d.ts +3 -1
  127. package/dist/types/helpers/placeholder.d.ts.map +1 -1
  128. package/dist/types/types/validation.d.ts +23 -0
  129. package/dist/types/types/validation.d.ts.map +1 -1
  130. package/dist/types/validations/compensation-hook.d.ts +2 -1
  131. package/dist/types/validations/compensation-hook.d.ts.map +1 -1
  132. package/dist/types/validations/evm-caveats.d.ts +2 -1
  133. package/dist/types/validations/evm-caveats.d.ts.map +1 -1
  134. package/dist/types/validations/evm-op-budget.d.ts +8 -0
  135. package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
  136. package/dist/types/validations/evm-op-hook.d.ts +2 -1
  137. package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
  138. package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
  139. package/dist/types/validations/evm-permit.d.ts.map +1 -1
  140. package/dist/types/validations/evm-permit2.d.ts.map +1 -1
  141. package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
  142. package/dist/types/validations/evm-sign712-metamask.d.ts +2 -1
  143. package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
  144. package/dist/types/validations/evm-sign712-shared.d.ts +3 -2
  145. package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -1
  146. package/dist/types/validations/evm-sign712.d.ts.map +1 -1
  147. package/dist/types/validations/evm-sign7702.d.ts +3 -2
  148. package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
  149. package/dist/types/validations/hooks-common.d.ts +5 -1
  150. package/dist/types/validations/hooks-common.d.ts.map +1 -1
  151. package/dist/types/validations/intent.d.ts.map +1 -1
  152. package/dist/types/validations/required-actions.d.ts.map +1 -1
  153. package/dist/types/validations/solana-hook.d.ts +2 -1
  154. package/dist/types/validations/solana-hook.d.ts.map +1 -1
  155. package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
  156. package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
  157. package/dist/types/validations/solana-transaction.d.ts.map +1 -1
  158. package/dist/types/validator.d.ts.map +1 -1
  159. package/dist/types/whitelists/environment-config.d.ts.map +1 -1
  160. package/dist/types/whitelists/solana/intent-signature.d.ts +1 -0
  161. package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
  162. package/dist/types/whitelists/types.d.ts +9 -0
  163. package/dist/types/whitelists/types.d.ts.map +1 -1
  164. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateBudgetOperations = validateBudgetOperations;
4
+ exports.getBudgetApprovalInfo = getBudgetApprovalInfo;
4
5
  const types_1 = require("../types");
5
6
  const types_2 = require("../whitelists/types");
6
7
  const evm_calldata_1 = require("../helpers/evm-calldata");
@@ -9,6 +10,7 @@ const evm_token_1 = require("../helpers/evm-token");
9
10
  const address_1 = require("../helpers/address");
10
11
  const evm_trade_amounts_1 = require("../helpers/evm-trade-amounts");
11
12
  const evm_action_1 = require("../helpers/evm-action");
13
+ const integer_1 = require("../helpers/integer");
12
14
  function validateBudgetOperations(actions, basePath, request, trades, responseTrades, realChainId, envConfig) {
13
15
  const violations = [];
14
16
  for (let i = 0; i < actions.length; i++) {
@@ -18,12 +20,11 @@ function validateBudgetOperations(actions, basePath, request, trades, responseTr
18
20
  const actionPath = `${basePath}.requiredActions[${i}]`;
19
21
  // Applies to ALL Budget actions regardless of type
20
22
  violations.push(...validateBudgetApproveNone(request, actionPath));
21
- // Token address and calldata checks only apply to actions that use transactionCalls
22
- // (Transaction, Sign712MetaMaskCaveats). For Permit/Permit2 (Sign712), these are
23
- // validated by the permit/permit2 validators instead.
23
+ // Token address and calldata checks only apply to actions that carry
24
+ // effective transaction calls. Permit/Permit2 are validated separately.
24
25
  if (!(0, evm_action_1.actionUsesTransactionCalls)(action))
25
26
  continue;
26
- violations.push(...validateBudgetTokenAddress(action, actionPath, trades, realChainId), ...validateBudgetCalldata(action, actionPath, request, trades, responseTrades, realChainId, envConfig));
27
+ violations.push(...validateBudgetTokenAddress(action, actionPath, trades, realChainId), ...validateBudgetTransactionValues(action, actionPath), ...validateBudgetCalldata(actions, i, actionPath, request, trades, responseTrades, realChainId, envConfig));
27
28
  }
28
29
  return violations;
29
30
  }
@@ -39,17 +40,19 @@ function validateBudgetApproveNone(request, actionPath) {
39
40
  }
40
41
  return [];
41
42
  }
42
- // CRITICAL: transactionCalls[].to == details.tokenAddress, non-zero, in trades
43
+ // CRITICAL: effective call target == details.tokenAddress, non-zero, in trades
43
44
  function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
44
45
  const violations = [];
45
- const txCalls = (0, evm_action_1.getTransactionCalls)(action);
46
+ const txCallRefs = (0, evm_action_1.getTransactionCallRefs)(action, actionPath);
46
47
  const tokenAddress = action.details?.tokenAddress;
47
- // CRITICAL: transactionCalls must be present
48
- if (txCalls.length === 0) {
48
+ // CRITICAL: at least one effective transaction call must be present.
49
+ // Non-AA Transaction actions store it in action.data; AA actions store it
50
+ // in details.transactionCalls[].
51
+ if (txCallRefs.length === 0) {
49
52
  violations.push({
50
53
  code: types_1.ViolationCode.BudgetTransactionCallsMissing,
51
- message: `Budget must have at least one transactionCall`,
52
- path: `${actionPath}.details.transactionCalls`,
54
+ message: `Budget must have at least one effective transaction call`,
55
+ path: (0, evm_action_1.getTransactionCallsContainerPath)(action, actionPath),
53
56
  actual: [],
54
57
  });
55
58
  }
@@ -64,18 +67,21 @@ function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
64
67
  }
65
68
  // Skip further checks if critical data is missing.
66
69
  // It's safe as we already reported the violations for missing the required fields.
67
- if (txCalls.length === 0 || !tokenAddress)
70
+ if (txCallRefs.length === 0 || !tokenAddress)
68
71
  return violations;
69
- const txTo = txCalls[0].to;
70
- // CRITICAL: transactionCalls[].to must equal details.tokenAddress
71
- if (!txTo || !(0, address_1.addressEquals)(realChainId, txTo, tokenAddress)) {
72
- violations.push({
73
- code: types_1.ViolationCode.BudgetTokenAddressMismatch,
74
- message: `Budget transactionCalls[0].to must equal details.tokenAddress`,
75
- path: `${actionPath}.details.transactionCalls[0].to`,
76
- expected: tokenAddress,
77
- actual: txTo,
78
- });
72
+ // CRITICAL: every effective Budget approve/reset call target must equal
73
+ // details.tokenAddress. This covers both one-call and reset+approve shapes.
74
+ for (const txCallRef of txCallRefs) {
75
+ const txTo = txCallRef.call.to;
76
+ if (!txTo || !(0, address_1.addressEquals)(realChainId, txTo, tokenAddress)) {
77
+ violations.push({
78
+ code: types_1.ViolationCode.BudgetTokenAddressMismatch,
79
+ message: `Budget transaction call target must equal details.tokenAddress`,
80
+ path: `${txCallRef.path}.to`,
81
+ expected: tokenAddress,
82
+ actual: txTo,
83
+ });
84
+ }
79
85
  }
80
86
  // CRITICAL: must be non-zero address
81
87
  if ((0, evm_token_1.isNativeToken)(tokenAddress, realChainId)) {
@@ -104,70 +110,111 @@ function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
104
110
  }
105
111
  return violations;
106
112
  }
113
+ // CRITICAL: Budget approve/reset calls must not send native value.
114
+ function validateBudgetTransactionValues(action, actionPath) {
115
+ const violations = [];
116
+ const txCallRefs = (0, evm_action_1.getTransactionCallRefs)(action, actionPath);
117
+ for (const txCallRef of txCallRefs) {
118
+ try {
119
+ const value = (0, integer_1.parseIntegerString)(txCallRef.call.value);
120
+ if (value !== 0n) {
121
+ violations.push({
122
+ code: types_1.ViolationCode.BudgetTransactionValueNonZero,
123
+ message: `Budget transaction call value must be zero`,
124
+ path: `${txCallRef.path}.value`,
125
+ expected: "0",
126
+ actual: value.toString(),
127
+ });
128
+ }
129
+ }
130
+ catch (error) {
131
+ violations.push({
132
+ code: types_1.ViolationCode.BudgetTransactionValueNonZero,
133
+ message: `Budget transaction call value is not a valid integer`,
134
+ path: `${txCallRef.path}.value`,
135
+ expected: "0",
136
+ actual: txCallRef.call.value,
137
+ details: error,
138
+ });
139
+ }
140
+ }
141
+ return violations;
142
+ }
107
143
  // CRITICAL: decode approve calldata, validate spender + amount + allowanceHolder
108
- // Handles two-step approve: approve(spender, 0) reset + approve(spender, amount)
109
- function validateBudgetCalldata(action, actionPath, request, trades, responseTrades, realChainId, envConfig) {
110
- const txCalls = (0, evm_action_1.getTransactionCalls)(action);
144
+ // Handles both accepted reset shapes:
145
+ // - separate reset action followed by the main Budget action;
146
+ // - one action with reset + main transactionCalls.
147
+ function validateBudgetCalldata(actions, actionIndex, actionPath, request, trades, responseTrades, realChainId, envConfig) {
148
+ const action = actions[actionIndex];
149
+ const txCallRefs = (0, evm_action_1.getTransactionCallRefs)(action, actionPath);
111
150
  // Missing txCalls is reported by validateBudgetTokenAddress
112
- if (txCalls.length === 0)
151
+ if (txCallRefs.length === 0)
113
152
  return [];
114
- const decoded = decodeBudgetApproveCalls(txCalls, actionPath);
153
+ const decoded = decodeBudgetApproveCalls(txCallRefs, action, actionPath, realChainId);
115
154
  if ("violations" in decoded)
116
155
  return decoded.violations;
117
156
  const violations = [];
118
- violations.push(...validateBudgetAmount(decoded.amount, actionPath, decoded.mainApproveIndex, request, trades, responseTrades, action, realChainId), ...validateBudgetAllowanceHolder(decoded.spender, action, actionPath, decoded.mainApproveIndex, realChainId, envConfig));
157
+ const isSeparateReset = txCallRefs.length === 1 && decoded.amount === 0n;
158
+ violations.push(...validateBudgetAllowanceHolder(decoded.spender, action, actionPath, decoded.path, realChainId, envConfig));
159
+ if (isSeparateReset) {
160
+ violations.push(...validateSeparateBudgetResetPair(actions, actionIndex, actionPath, decoded, realChainId));
161
+ }
162
+ else {
163
+ violations.push(...validateBudgetAmount(decoded.amount, decoded.path, request, trades, responseTrades, action, realChainId));
164
+ }
119
165
  return violations;
120
166
  }
121
167
  // Decodes one or two approve calls. Returns the "real" approve.
122
168
  // If two calls: first must be approve(spender, 0), second is the real one.
123
- function decodeBudgetApproveCalls(txCalls, actionPath) {
124
- const calldataPath = `${actionPath}.details.transactionCalls`;
125
- // CRITICAL: at most 2 transactionCalls
126
- if (txCalls.length > 2) {
169
+ function decodeBudgetApproveCalls(txCallRefs, action, actionPath, realChainId) {
170
+ const calldataPath = (0, evm_action_1.getTransactionCallsContainerPath)(action, actionPath);
171
+ // CRITICAL: at most 2 effective transaction calls
172
+ if (txCallRefs.length > 2) {
127
173
  return { violations: [{
128
174
  code: types_1.ViolationCode.BudgetTooManyTransactionCalls,
129
- message: `Budget must have at most 2 transactionCalls (reset + approve)`,
175
+ message: `Budget must have at most 2 effective transaction calls`,
130
176
  path: calldataPath,
131
177
  expected: 2,
132
- actual: txCalls.length,
178
+ actual: txCallRefs.length,
133
179
  }] };
134
180
  }
135
- const mainApproveIndex = txCalls.length - 1;
181
+ const mainApproveIndex = txCallRefs.length - 1;
182
+ const mainCallRef = txCallRefs[mainApproveIndex];
136
183
  // Decode last call — this is always the "real" approve
137
184
  let mainApprove;
138
185
  try {
139
- mainApprove = (0, evm_calldata_1.decodeApproveCalldata)(txCalls[mainApproveIndex].data);
186
+ mainApprove = (0, evm_calldata_1.decodeApproveCalldata)(mainCallRef.call.data);
140
187
  }
141
188
  catch (e) {
142
189
  return { violations: [{
143
190
  code: types_1.ViolationCode.BudgetCalldataInvalid,
144
191
  message: `Budget calldata is not valid approve`,
145
- path: `${calldataPath}[${mainApproveIndex}].data`,
146
- actual: txCalls[mainApproveIndex].data,
192
+ path: `${mainCallRef.path}.data`,
193
+ actual: mainCallRef.call.data,
147
194
  details: e,
148
195
  }] };
149
196
  }
150
197
  // If two calls, the first must be a reset: approve(same spender, 0)
151
- if (txCalls.length === 2) {
152
- const resetViolations = validateBudgetResetCall(txCalls[0], mainApprove.spender, calldataPath);
198
+ if (txCallRefs.length === 2) {
199
+ const resetViolations = validateBudgetResetCall(txCallRefs[0], mainApprove.spender, realChainId);
153
200
  if (resetViolations.length > 0) {
154
201
  return { violations: resetViolations };
155
202
  }
156
203
  }
157
- return { ...mainApprove, mainApproveIndex };
204
+ return { ...mainApprove, path: `${mainCallRef.path}.data` };
158
205
  }
159
206
  // Validates the reset call: must be approve(same spender, 0)
160
- function validateBudgetResetCall(txCall, expectedSpender, calldataPath) {
207
+ function validateBudgetResetCall(txCallRef, expectedSpender, realChainId) {
161
208
  let resetApprove;
162
209
  try {
163
- resetApprove = (0, evm_calldata_1.decodeApproveCalldata)(txCall.data);
210
+ resetApprove = (0, evm_calldata_1.decodeApproveCalldata)(txCallRef.call.data);
164
211
  }
165
212
  catch (e) {
166
213
  return [{
167
214
  code: types_1.ViolationCode.BudgetCalldataInvalid,
168
215
  message: `Budget reset calldata is not valid approve`,
169
- path: `${calldataPath}[0].data`,
170
- actual: txCall.data,
216
+ path: `${txCallRef.path}.data`,
217
+ actual: txCallRef.call.data,
171
218
  details: e,
172
219
  }];
173
220
  }
@@ -177,37 +224,99 @@ function validateBudgetResetCall(txCall, expectedSpender, calldataPath) {
177
224
  violations.push({
178
225
  code: types_1.ViolationCode.BudgetCalldataInvalid,
179
226
  message: `Budget two-step approve: first call must be approve(spender, 0)`,
180
- path: `${calldataPath}[0].data`,
227
+ path: `${txCallRef.path}.data`,
181
228
  expected: "0",
182
229
  actual: resetApprove.amount.toString(),
183
230
  });
184
231
  }
185
232
  // CRITICAL: reset spender must match main spender
186
- if (resetApprove.spender !== expectedSpender) {
233
+ if (!(0, address_1.addressEquals)(realChainId, resetApprove.spender, expectedSpender)) {
187
234
  violations.push({
188
235
  code: types_1.ViolationCode.BudgetCalldataInvalid,
189
236
  message: `Budget two-step approve: reset spender must match main spender`,
190
- path: `${calldataPath}[0].data`,
237
+ path: `${txCallRef.path}.data`,
191
238
  expected: expectedSpender,
192
239
  actual: resetApprove.spender,
193
240
  });
194
241
  }
195
242
  return violations;
196
243
  }
244
+ function getBudgetApprovalInfo(action) {
245
+ if (action === undefined ||
246
+ !action.actions.includes(types_1.EvmActionOperation.Budget) ||
247
+ !(0, evm_action_1.actionUsesTransactionCalls)(action) ||
248
+ !action.details?.tokenAddress) {
249
+ return undefined;
250
+ }
251
+ const txCalls = (0, evm_action_1.getTransactionCalls)(action);
252
+ if (txCalls.length === 0 || txCalls.length > 2)
253
+ return undefined;
254
+ try {
255
+ const approve = (0, evm_calldata_1.decodeApproveCalldata)(txCalls[txCalls.length - 1].data);
256
+ return {
257
+ tokenAddress: action.details.tokenAddress,
258
+ allowanceHolder: action.details.allowanceHolder,
259
+ spender: approve.spender,
260
+ amount: approve.amount,
261
+ callCount: txCalls.length,
262
+ };
263
+ }
264
+ catch {
265
+ return undefined;
266
+ }
267
+ }
268
+ // HIGH: a standalone zero-reset approve is only valid when it is immediately
269
+ // followed by the main Budget approve for the same token/spender/holder.
270
+ function validateSeparateBudgetResetPair(actions, actionIndex, actionPath, decodedReset, realChainId) {
271
+ const current = getBudgetApprovalInfo(actions[actionIndex]);
272
+ const next = getBudgetApprovalInfo(actions[actionIndex + 1]);
273
+ const paired = current !== undefined &&
274
+ next !== undefined &&
275
+ current.callCount === 1 &&
276
+ next.callCount === 1 &&
277
+ next.amount !== 0n &&
278
+ sameBudgetApprovalTarget(current, next, realChainId);
279
+ if (paired)
280
+ return [];
281
+ return [{
282
+ code: types_1.ViolationCode.BudgetResetActionUnpaired,
283
+ message: `Budget zero-reset action must be immediately followed by`
284
+ + ` the main Budget approve for the same token and spender`,
285
+ path: actionPath,
286
+ actual: {
287
+ tokenAddress: current?.tokenAddress,
288
+ allowanceHolder: current?.allowanceHolder,
289
+ spender: decodedReset.spender,
290
+ amount: decodedReset.amount.toString(),
291
+ next: next ? {
292
+ tokenAddress: next.tokenAddress,
293
+ allowanceHolder: next.allowanceHolder,
294
+ spender: next.spender,
295
+ amount: next.amount.toString(),
296
+ } : undefined,
297
+ },
298
+ }];
299
+ }
300
+ function sameBudgetApprovalTarget(a, b, realChainId) {
301
+ return (0, address_1.addressEquals)(realChainId, a.tokenAddress, b.tokenAddress) &&
302
+ (0, address_1.addressEquals)(realChainId, a.spender, b.spender) &&
303
+ a.allowanceHolder !== undefined &&
304
+ b.allowanceHolder !== undefined &&
305
+ (0, address_1.addressEquals)(realChainId, a.allowanceHolder, b.allowanceHolder);
306
+ }
197
307
  // CRITICAL: approve amount validation. The expected amount is
198
308
  // `Σ response.trades[i].srcChainTokenIn.amount` over trades whose input
199
309
  // token matches the Budget action's token — the same response-side number
200
310
  // the API uses for `intent.inputToken[].constraintBudget` and Wrap.value.
201
- function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, trades, responseTrades, action, realChainId) {
311
+ function validateBudgetAmount(approveAmount, calldataPath, request, trades, responseTrades, action, realChainId) {
202
312
  const flag = request.approveAmountFlag;
203
- const dataPath = `${actionPath}.details.transactionCalls[${mainIndex}].data`;
204
313
  // unlimited: must be maxUint256
205
314
  if (flag === types_1.ApproveAmountFlag.Unlimited) {
206
315
  if (approveAmount !== viem_1.maxUint256) {
207
316
  return [{
208
317
  code: types_1.ViolationCode.BudgetAmountMismatch,
209
318
  message: `Budget approve amount must be maxUint256 when approveAmountFlag="unlimited"`,
210
- path: dataPath,
319
+ path: calldataPath,
211
320
  expected: viem_1.maxUint256.toString(),
212
321
  actual: approveAmount.toString(),
213
322
  }];
@@ -228,7 +337,7 @@ function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, tra
228
337
  return [{
229
338
  code: types_1.ViolationCode.BudgetAmountMismatch,
230
339
  message: `Budget approve amount does not match sum of trade amounts`,
231
- path: dataPath,
340
+ path: calldataPath,
232
341
  expected: sumResult.sum.toString(),
233
342
  actual: approveAmount.toString(),
234
343
  }];
@@ -236,7 +345,7 @@ function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, tra
236
345
  return [];
237
346
  }
238
347
  // CRITICAL: approve target == details.allowanceHolder, both whitelisted
239
- function validateBudgetAllowanceHolder(approveSpender, action, actionPath, mainIndex, realChainId, envConfig) {
348
+ function validateBudgetAllowanceHolder(approveSpender, action, actionPath, calldataPath, realChainId, envConfig) {
240
349
  const violations = [];
241
350
  const allowanceHolder = action.details?.allowanceHolder;
242
351
  // CRITICAL: approve target must equal details.allowanceHolder
@@ -255,7 +364,7 @@ function validateBudgetAllowanceHolder(approveSpender, action, actionPath, mainI
255
364
  violations.push({
256
365
  code: types_1.ViolationCode.BudgetAllowanceHolderNotWhitelisted,
257
366
  message: `Budget approve spender is not a whitelisted AllowanceHolder`,
258
- path: `${actionPath}.details.transactionCalls[${mainIndex}].data`,
367
+ path: calldataPath,
259
368
  actual: approveSpender,
260
369
  });
261
370
  }
@@ -1 +1 @@
1
- {"version":3,"file":"evm-op-budget.js","sourceRoot":"","sources":["../../../src/validations/evm-op-budget.ts"],"names":[],"mappings":";;AAmBA,4DAkCC;AArDD,oCAUkB;AAClB,+CAAuE;AACvE,0DAAgF;AAChF,+BAAkC;AAClC,oDAAiF;AACjF,gDAAqE;AACrE,oEAA+D;AAC/D,sDAAwF;AAExF,SAAgB,wBAAwB,CACpC,OAA4B,EAC5B,QAAgB,EAChB,OAA8B,EAC9B,MAAsB,EACtB,cAA6C,EAC7C,WAAoB,EACpB,SAA4B;IAE5B,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAAkB,CAAC,MAAM,CAAC;YAAE,SAAS;QAElE,MAAM,UAAU,GAAG,GAAG,QAAQ,oBAAoB,CAAC,GAAG,CAAC;QAEvD,mDAAmD;QACnD,UAAU,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAEnE,oFAAoF;QACpF,iFAAiF;QACjF,sDAAsD;QACtD,IAAI,CAAC,IAAA,uCAA0B,EAAC,MAAM,CAAC;YAAE,SAAS;QAElD,UAAU,CAAC,IAAI,CACX,GAAG,0BAA0B,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EACtE,GAAG,sBAAsB,CACrB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,CAC9E,CACJ,CAAC;IACN,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,+DAA+D;AAC/D,SAAS,yBAAyB,CAC9B,OAA8B,EAC9B,UAAkB;IAElB,IAAI,OAAO,CAAC,iBAAiB,KAAK,yBAAiB,CAAC,IAAI,EAAE,CAAC;QACvD,OAAO,CAAC;gBACJ,IAAI,EAAE,qBAAa,CAAC,8BAA8B;gBAClD,OAAO,EAAE,0DAA0D;gBACnE,IAAI,EAAE,GAAG,UAAU,UAAU;gBAC7B,MAAM,EAAE,yBAAiB,CAAC,IAAI;aACjC,CAAC,CAAC;IACP,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,SAAS,0BAA0B,CAC/B,MAAyB,EACzB,UAAkB,EAClB,MAAsB,EACtB,WAAoB;IAEpB,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,IAAA,gCAAmB,EAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;IAElD,6CAA6C;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,6BAA6B;YACjD,OAAO,EAAE,+CAA+C;YACxD,IAAI,EAAE,GAAG,UAAU,2BAA2B;YAC9C,MAAM,EAAE,EAAE;SACb,CAAC,CAAC;IACP,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,yBAAyB;YAC7C,OAAO,EAAE,uCAAuC;YAChD,IAAI,EAAE,GAAG,UAAU,uBAAuB;YAC1C,MAAM,EAAE,SAAS;SACpB,CAAC,CAAC;IACP,CAAC;IAED,mDAAmD;IACnD,mFAAmF;IACnF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO,UAAU,CAAC;IAE7D,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3B,kEAAkE;IAClE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAA,uBAAa,EAAC,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,0BAA0B;YAC9C,OAAO,EAAE,+DAA+D;YACxE,IAAI,EAAE,GAAG,UAAU,iCAAiC;YACpD,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,IAAI;SACf,CAAC,CAAC;IACP,CAAC;IAED,qCAAqC;IACrC,IAAI,IAAA,yBAAa,EAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;QAC3C,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,sBAAsB;YAC1C,OAAO,EAAE,mDAAmD;YAC5D,IAAI,EAAE,GAAG,UAAU,uBAAuB;YAC1C,MAAM,EAAE,YAAY;SACvB,CAAC,CAAC;IACP,CAAC;IAED,4CAA4C;IAC5C,0FAA0F;IAC1F,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC/B,MAAM,QAAQ,GAAG,IAAA,sCAA0B,EAAC,CAAC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAC5E,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAA,0BAAgB,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAA,0BAAgB,EAAC,WAAW,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAA,0BAAgB,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACpE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACzC,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,sBAAsB;YAC1C,OAAO,EAAE,4DAA4D;YACrE,IAAI,EAAE,GAAG,UAAU,uBAAuB;YAC1C,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,YAAY;SACvB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,iFAAiF;AACjF,iFAAiF;AACjF,SAAS,sBAAsB,CAC3B,MAAyB,EACzB,UAAkB,EAClB,OAA8B,EAC9B,MAAsB,EACtB,cAA6C,EAC7C,WAAoB,EACpB,SAA4B;IAE5B,MAAM,OAAO,GAAG,IAAA,gCAAmB,EAAC,MAAM,CAAC,CAAC;IAC5C,4DAA4D;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,YAAY,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,UAAU,CAAC;IAEvD,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,UAAU,CAAC,IAAI,CACX,GAAG,oBAAoB,CACnB,OAAO,CAAC,MAAM,EACd,UAAU,EACV,OAAO,CAAC,gBAAgB,EACxB,OAAO,EACP,MAAM,EACN,cAAc,EACd,MAAM,EACN,WAAW,CACd,EACD,GAAG,6BAA6B,CAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,gBAAgB,EAAE,WAAW,EAAE,SAAS,CACxF,CACJ,CAAC;IAEF,OAAO,UAAU,CAAC;AACtB,CAAC;AAID,gEAAgE;AAChE,2EAA2E;AAC3E,SAAS,wBAAwB,CAC7B,OAAsD,EACtD,UAAkB;IAElB,MAAM,YAAY,GAAG,GAAG,UAAU,2BAA2B,CAAC;IAE9D,uCAAuC;IACvC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,UAAU,EAAE,CAAC;oBAClB,IAAI,EAAE,qBAAa,CAAC,6BAA6B;oBACjD,OAAO,EAAE,+DAA+D;oBACxE,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,OAAO,CAAC,MAAM;iBACzB,CAAC,EAAE,CAAC;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5C,uDAAuD;IACvD,IAAI,WAA2B,CAAC;IAChC,IAAI,CAAC;QACD,WAAW,GAAG,IAAA,oCAAqB,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,EAAE,UAAU,EAAE,CAAC;oBAClB,IAAI,EAAE,qBAAa,CAAC,qBAAqB;oBACzC,OAAO,EAAE,sCAAsC;oBAC/C,IAAI,EAAE,GAAG,YAAY,IAAI,gBAAgB,QAAQ;oBACjD,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI;oBACtC,OAAO,EAAE,CAAC;iBACb,CAAC,EAAE,CAAC;IACT,CAAC;IAED,oEAAoE;IACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,uBAAuB,CAC3C,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY,CAChD,CAAC;QACF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;QAC3C,CAAC;IACL,CAAC;IAED,OAAO,EAAE,GAAG,WAAW,EAAE,gBAAgB,EAAE,CAAC;AAChD,CAAC;AAED,6DAA6D;AAC7D,SAAS,uBAAuB,CAC5B,MAAmD,EACnD,eAAuB,EACvB,YAAoB;IAEpB,IAAI,YAA4B,CAAC;IACjC,IAAI,CAAC;QACD,YAAY,GAAG,IAAA,oCAAqB,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC;gBACJ,IAAI,EAAE,qBAAa,CAAC,qBAAqB;gBACzC,OAAO,EAAE,4CAA4C;gBACrD,IAAI,EAAE,GAAG,YAAY,UAAU;gBAC/B,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,OAAO,EAAE,CAAC;aACb,CAAC,CAAC;IACP,CAAC;IAED,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,mCAAmC;IACnC,IAAI,YAAY,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,qBAAqB;YACzC,OAAO,EAAE,iEAAiE;YAC1E,IAAI,EAAE,GAAG,YAAY,UAAU;YAC/B,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE;SACzC,CAAC,CAAC;IACP,CAAC;IAED,kDAAkD;IAClD,IAAI,YAAY,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;QAC3C,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,qBAAqB;YACzC,OAAO,EAAE,gEAAgE;YACzE,IAAI,EAAE,GAAG,YAAY,UAAU;YAC/B,QAAQ,EAAE,eAAe;YACzB,MAAM,EAAE,YAAY,CAAC,OAAO;SAC/B,CAAC,CAAC;IACP,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,8DAA8D;AAC9D,wEAAwE;AACxE,0EAA0E;AAC1E,0EAA0E;AAC1E,SAAS,oBAAoB,CACzB,aAAqB,EACrB,UAAkB,EAClB,SAAiB,EACjB,OAA8B,EAC9B,MAAsB,EACtB,cAA6C,EAC7C,MAAyB,EACzB,WAAoB;IAEpB,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,UAAU,6BAA6B,SAAS,QAAQ,CAAC;IAE7E,gCAAgC;IAChC,IAAI,IAAI,KAAK,yBAAiB,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,aAAa,KAAK,iBAAU,EAAE,CAAC;YAC/B,OAAO,CAAC;oBACJ,IAAI,EAAE,qBAAa,CAAC,oBAAoB;oBACxC,OAAO,EAAE,6EAA6E;oBACtF,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,iBAAU,CAAC,QAAQ,EAAE;oBAC/B,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE;iBACnC,CAAC,CAAC;QACP,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;IAClD,mFAAmF;IACnF,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,CAAC;IAE7B,MAAM,SAAS,GAAG,IAAA,mCAAe,EAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IACrF,IAAI,SAAS,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC,UAAU,CAAC;IACtD,IAAI,SAAS,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAE9B,IAAI,aAAa,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;QAClC,OAAO,CAAC;gBACJ,IAAI,EAAE,qBAAa,CAAC,oBAAoB;gBACxC,OAAO,EAAE,2DAA2D;gBACpE,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAClC,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE;aACnC,CAAC,CAAC;IACP,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAGD,wEAAwE;AACxE,SAAS,6BAA6B,CAClC,cAAsB,EACtB,MAAyB,EACzB,UAAkB,EAClB,SAAiB,EACjB,WAAoB,EACpB,SAA4B;IAE5B,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC;IAExD,8DAA8D;IAC9D,IACI,eAAe,KAAK,SAAS;QAC7B,CAAC,IAAA,uBAAa,EAAC,WAAW,EAAE,cAAc,EAAE,eAAe,CAAC,EAC9D,CAAC;QACC,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,6BAA6B;YACjD,OAAO,EAAE,2DAA2D;YACpE,IAAI,EAAE,GAAG,UAAU,0BAA0B;YAC7C,QAAQ,EAAE,cAAc;YACxB,MAAM,EAAE,eAAe;SAC1B,CAAC,CAAC;IACP,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC,IAAA,qBAAa,EAAC,SAAS,CAAC,wBAAwB,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,CAAC;QAClF,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,mCAAmC;YACvD,OAAO,EAAE,6DAA6D;YACtE,IAAI,EAAE,GAAG,UAAU,6BAA6B,SAAS,QAAQ;YACjE,MAAM,EAAE,cAAc;SACzB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"evm-op-budget.js","sourceRoot":"","sources":["../../../src/validations/evm-op-budget.ts"],"names":[],"mappings":"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"}
@@ -15,14 +15,14 @@ const SIGN712_HOOK_TYPES = [
15
15
  types_1.EvmActionKind.Sign712MetaMaskCaveats,
16
16
  types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders,
17
17
  ];
18
- function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request) {
18
+ function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request, envConfig) {
19
19
  const violations = [];
20
20
  if (!(0, request_1.isRequestHookV2)(hookPayload.hook))
21
21
  return violations;
22
22
  for (let i = 0; i < hookPayload.requiredActions.length; i++) {
23
23
  const action = hookPayload.requiredActions[i];
24
24
  const actionPath = `${basePath}.requiredActions[${i}]`;
25
- violations.push(...validateHookSign7702Binding(action, actionPath, realChainId));
25
+ violations.push(...validateHookSign7702Binding(action, actionPath, realChainId, envConfig));
26
26
  }
27
27
  if (hookPayload.hook.type === types_1.BundleHookType.Direct) {
28
28
  violations.push(...validateDirectEvmHookActions(hookPayload, requestHook, basePath));
@@ -34,12 +34,12 @@ function validateEvmHookActions(hookPayload, requestHook, basePath, mode, respon
34
34
  const expectedDelegate = request.enableAccountAbstraction
35
35
  ? (0, expected_delegate_1.getExpectedBundleHookDelegate)(request.trades, hookPayload.hook.chainId)
36
36
  : undefined;
37
- violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp, expectedDelegate));
37
+ violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp, expectedDelegate, envConfig));
38
38
  }
39
39
  violations.push(...validateHookActionCalldata(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
40
- violations.push(...validateHookActionTransactionCallsMatch(hookPayload, basePath));
40
+ violations.push(...validateHookActionTransactionCallsMatch(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
41
41
  if (requestHook === undefined && mode === placeholder_1.HookMode.PreHooks) {
42
- violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId));
42
+ violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId, envConfig));
43
43
  }
44
44
  return violations;
45
45
  }
@@ -50,7 +50,7 @@ function validateEvmHookActions(hookPayload, requestHook, basePath, mode, respon
50
50
  // `Transaction`) would slip through the operation/position checks elsewhere.
51
51
  // The per-action [Delegate] + contractAddress checks are shared with intent-scope
52
52
  // via `validateSign7702Action`; the type <-> [Delegate] binding is hook-specific.
53
- function validateHookSign7702Binding(action, actionPath, realChainId) {
53
+ function validateHookSign7702Binding(action, actionPath, realChainId, envConfig) {
54
54
  const violations = [];
55
55
  const ops = action.actions;
56
56
  const hasDelegate = ops.includes(types_1.EvmActionOperation.Delegate);
@@ -66,7 +66,7 @@ function validateHookSign7702Binding(action, actionPath, realChainId) {
66
66
  });
67
67
  }
68
68
  if (isSign7702) {
69
- violations.push(...(0, evm_sign7702_1.validateSign7702Action)(action, actionPath, realChainId));
69
+ violations.push(...(0, evm_sign7702_1.validateSign7702Action)(action, actionPath, realChainId, envConfig));
70
70
  }
71
71
  return violations;
72
72
  }
@@ -113,7 +113,7 @@ function validateDirectAction(action, expectsTransaction, hookChainId, expectedD
113
113
  // `Sign712MetaMaskCaveatsWithPlaceholders` (when at least one deferred
114
114
  // placeholder is declared). transactionCalls form, placeholders match, and
115
115
  // EIP-712 content checks (domain, delegator, caveats) are checked per-action below.
116
- function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp, expectedDelegate) {
116
+ function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp, expectedDelegate, envConfig) {
117
117
  const violations = [];
118
118
  const expectedDeferred = collectDeferredPlaceholders(requestHook);
119
119
  const hasDeferred = expectedDeferred.length > 0;
@@ -126,6 +126,7 @@ function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, rea
126
126
  realChainId,
127
127
  expirationTimestamp,
128
128
  expectedDelegate,
129
+ envConfig,
129
130
  };
130
131
  // Collected `message.delegate` values across all delegated actions in this
131
132
  // hook — checked for cross-action consistency after the loop.
@@ -180,7 +181,7 @@ function validateDelegatedAction(action, actionPath, ctx, observedDelegates) {
180
181
  violations.push(...presenceErrors);
181
182
  return violations;
182
183
  }
183
- 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"));
184
+ violations.push(...(0, evm_sign712_shared_1.validateSign712Domain)(data, actionPath, ctx.realChainId, ctx.envConfig), ...(0, evm_sign712_shared_1.validateSign712Delegator)(data, actionPath, ctx.realChainId, ctx.hookFrom, "hook.from"));
184
185
  // Scoped delegate check: applies only when the request explicitly
185
186
  // pinned a delegate via `trade.srcAllowedSender` on a matching-chain
186
187
  // trade (caller set `ctx.expectedDelegate`). Otherwise the API
@@ -210,7 +211,7 @@ function validateDelegatedAction(action, actionPath, ctx, observedDelegates) {
210
211
  }
211
212
  const caveats = (data.message.caveats ?? []);
212
213
  const txCalls = action.details?.transactionCalls ?? [];
213
- violations.push(...(0, evm_sign712_shared_1.validateSign712Caveats)(caveats, action.actionId, txCalls, actionPath, ctx.realChainId, ctx.expirationTimestamp));
214
+ violations.push(...(0, evm_sign712_shared_1.validateSign712Caveats)(caveats, action.actionId, txCalls, actionPath, ctx.realChainId, ctx.expirationTimestamp, ctx.envConfig));
214
215
  if (ctx.expectedType === types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
215
216
  const withPlaceholdersData = data;
216
217
  const actualPlaceholders = withPlaceholdersData.placeholders ?? [];
@@ -349,7 +350,7 @@ function validateHookActionCalldata(hookPayload, requestHook, basePath, mode, re
349
350
  // `Sign712MetaMaskCaveats(WithPlaceholders)` actions — otherwise the user
350
351
  // would sign a delegation that wraps a tx targeting / valued differently than
351
352
  // the echoed hook fields.
352
- function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
353
+ function validateHookActionTransactionCallsMatch(hookPayload, requestHook, basePath, mode, responseTrades, realChainId) {
353
354
  const violations = [];
354
355
  const hook = hookPayload.hook;
355
356
  if (!(0, request_1.isRequestHookV2)(hook))
@@ -357,40 +358,45 @@ function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
357
358
  for (let i = 0; i < hookPayload.requiredActions.length; i++) {
358
359
  const action = hookPayload.requiredActions[i];
359
360
  const actionPath = `${basePath}.requiredActions[${i}]`;
360
- if (!SIGN712_HOOK_TYPES.includes(action.type))
361
+ // Safe skip: Delegate-bearing actions carry EIP-7702 authorization,
362
+ // not the hook transaction.
363
+ if (action.actions.includes(types_1.EvmActionOperation.Delegate))
361
364
  continue;
362
- // Safe skip: missing transactionCalls reported by
363
- // `validateSign712TransactionCalls`.
364
- const tx = action.details?.transactionCalls?.[0];
365
+ const tx = extractEvmHookActionTransaction(action);
365
366
  if (!tx)
366
367
  continue;
367
- violations.push(...compareTransactionCallToHook(tx, hook, actionPath));
368
+ violations.push(...compareTransactionCallToHook(tx.triplet, hook, requestHook, actionPath, tx.path, mode, responseTrades, realChainId));
368
369
  }
369
370
  return violations;
370
371
  }
371
- function compareTransactionCallToHook(tx, hook, actionPath) {
372
+ function compareTransactionCallToHook(tx, hook, requestHook, actionPath, txPath, mode, responseTrades, realChainId) {
372
373
  const violations = [];
373
- if (hook.to !== undefined && tx.to !== hook.to) {
374
+ if (hook.to !== undefined && !(0, address_1.addressEquals)(realChainId, tx.to, hook.to)) {
374
375
  violations.push({
375
376
  code: types_1.ViolationCode.HookActionTransactionToMismatch,
376
- message: "transactionCalls[0].to must equal hook.to",
377
- path: `${actionPath}.details.transactionCalls[0].to`,
377
+ message: "hook action transaction target must equal hook.to",
378
+ path: `${actionPath}.${txPath}.to`,
378
379
  expected: hook.to,
379
380
  actual: tx.to,
380
381
  });
381
382
  }
382
- const hookValue = hook.value ?? "0";
383
+ const hookValue = resolveExpectedHookValue(hook, requestHook, mode, responseTrades, realChainId);
383
384
  if (!evmValuesEqual(tx.value, hookValue)) {
384
385
  violations.push({
385
386
  code: types_1.ViolationCode.HookActionTransactionValueMismatch,
386
- message: "transactionCalls[0].value must equal hook.value",
387
- path: `${actionPath}.details.transactionCalls[0].value`,
387
+ message: "hook action transaction value must equal hook.value",
388
+ path: `${actionPath}.${txPath}.value`,
388
389
  expected: hookValue,
389
390
  actual: tx.value,
390
391
  });
391
392
  }
392
393
  return violations;
393
394
  }
395
+ function resolveExpectedHookValue(hook, requestHook, mode, responseTrades, realChainId) {
396
+ if (requestHook?.value === undefined)
397
+ return hook.value ?? "0";
398
+ return (0, placeholder_1.resolveEagerValuePlaceholders)(requestHook.value, realChainId, requestHook.placeHolders, responseTrades, mode).resolved;
399
+ }
394
400
  // Returns true if two EVM-value strings are byte-identical or if both parse as
395
401
  // BigInt and represent the same number (e.g. `"0x100"` vs `"256"`). Returns
396
402
  // false otherwise.
@@ -408,7 +414,7 @@ function evmValuesEqual(a, b) {
408
414
  // gas-compensation transfer — same rules as `compensation-hook.ts` applies to
409
415
  // `hook.{to, data, value}`, but here applied to `transactionCalls[0]` so the
410
416
  // user does not sign a delegation around a different (malicious) tx.
411
- function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId) {
417
+ function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId, envConfig) {
412
418
  const allGroups = (0, gas_compensation_1.extractGasCompensationGroups)(request);
413
419
  const matchingGroups = allGroups.filter(g => g.realChainId === realChainId
414
420
  && (0, address_1.addressEquals)(realChainId, g.sender, hookPayload.hook.from));
@@ -430,9 +436,10 @@ function validateCompensationHookTransactionCall(hookPayload, basePath, request,
430
436
  continue;
431
437
  violations.push(...(0, evm_gas_compensation_tx_1.validateEvmGasCompensationTx)(tx, matchingGroups, realChainId, `${actionPath}.details.transactionCalls[0]`, {
432
438
  toMismatch: types_1.ViolationCode.CompensationHookEvmToMismatch,
439
+ recipientMismatch: types_1.ViolationCode.CompensationHookEvmRecipientMismatch,
433
440
  dataInvalid: types_1.ViolationCode.CompensationHookEvmDataInvalid,
434
441
  valueInvalid: types_1.ViolationCode.CompensationHookEvmValueInvalid,
435
- }));
442
+ }, envConfig.compensationDelegateContracts));
436
443
  }
437
444
  return violations;
438
445
  }
@@ -474,4 +481,32 @@ function extractEvmHookActionCalldata(action) {
474
481
  }
475
482
  return undefined;
476
483
  }
484
+ function extractEvmHookActionTransaction(action) {
485
+ if (action.type === types_1.EvmActionKind.Transaction) {
486
+ const data = action.data;
487
+ if (!isTransactionTriplet(data))
488
+ return undefined;
489
+ return { triplet: data, path: "data" };
490
+ }
491
+ if (action.type === types_1.EvmActionKind.ProvidePlaceholders) {
492
+ const data = action.data;
493
+ if (!isTransactionTriplet(data?.transaction))
494
+ return undefined;
495
+ return { triplet: data.transaction, path: "data.transaction" };
496
+ }
497
+ if (action.type === types_1.EvmActionKind.Sign712MetaMaskCaveats
498
+ || action.type === types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
499
+ const tx = action.details?.transactionCalls?.[0];
500
+ if (!isTransactionTriplet(tx))
501
+ return undefined;
502
+ return { triplet: tx, path: "details.transactionCalls[0]" };
503
+ }
504
+ return undefined;
505
+ }
506
+ function isTransactionTriplet(value) {
507
+ const maybe = value;
508
+ return typeof maybe?.to === "string"
509
+ && typeof maybe.data === "string"
510
+ && typeof maybe.value === "string";
511
+ }
477
512
  //# sourceMappingURL=evm-op-hook.js.map