@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
@@ -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, actionUsesTransactionCalls } from "../helpers/evm-action.js";
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 use transactionCalls
19
- // (Transaction, Sign712MetaMaskCaveats). For Permit/Permit2 (Sign712), these are
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), ...validateBudgetCalldata(action, actionPath, request, trades, responseTrades, realChainId, envConfig));
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: transactionCalls[].to == details.tokenAddress, non-zero, in trades
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 txCalls = getTransactionCalls(action);
42
+ const txCallRefs = getTransactionCallRefs(action, actionPath);
43
43
  const tokenAddress = action.details?.tokenAddress;
44
- // CRITICAL: transactionCalls must be present
45
- if (txCalls.length === 0) {
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 transactionCall`,
49
- path: `${actionPath}.details.transactionCalls`,
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 (txCalls.length === 0 || !tokenAddress)
66
+ if (txCallRefs.length === 0 || !tokenAddress)
65
67
  return violations;
66
- const txTo = txCalls[0].to;
67
- // CRITICAL: transactionCalls[].to must equal details.tokenAddress
68
- if (!txTo || !addressEquals(realChainId, txTo, tokenAddress)) {
69
- violations.push({
70
- code: ViolationCode.BudgetTokenAddressMismatch,
71
- message: `Budget transactionCalls[0].to must equal details.tokenAddress`,
72
- path: `${actionPath}.details.transactionCalls[0].to`,
73
- expected: tokenAddress,
74
- actual: txTo,
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 two-step approve: approve(spender, 0) reset + approve(spender, amount)
106
- function validateBudgetCalldata(action, actionPath, request, trades, responseTrades, realChainId, envConfig) {
107
- const txCalls = getTransactionCalls(action);
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 (txCalls.length === 0)
147
+ if (txCallRefs.length === 0)
110
148
  return [];
111
- const decoded = decodeBudgetApproveCalls(txCalls, actionPath);
149
+ const decoded = decodeBudgetApproveCalls(txCallRefs, action, actionPath, realChainId);
112
150
  if ("violations" in decoded)
113
151
  return decoded.violations;
114
152
  const violations = [];
115
- violations.push(...validateBudgetAmount(decoded.amount, actionPath, decoded.mainApproveIndex, request, trades, responseTrades, action, realChainId), ...validateBudgetAllowanceHolder(decoded.spender, action, actionPath, decoded.mainApproveIndex, realChainId, envConfig));
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(txCalls, actionPath) {
121
- const calldataPath = `${actionPath}.details.transactionCalls`;
122
- // CRITICAL: at most 2 transactionCalls
123
- if (txCalls.length > 2) {
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 transactionCalls (reset + approve)`,
171
+ message: `Budget must have at most 2 effective transaction calls`,
127
172
  path: calldataPath,
128
173
  expected: 2,
129
- actual: txCalls.length,
174
+ actual: txCallRefs.length,
130
175
  }] };
131
176
  }
132
- const mainApproveIndex = txCalls.length - 1;
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(txCalls[mainApproveIndex].data);
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: `${calldataPath}[${mainApproveIndex}].data`,
143
- actual: txCalls[mainApproveIndex].data,
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 (txCalls.length === 2) {
149
- const resetViolations = validateBudgetResetCall(txCalls[0], mainApprove.spender, calldataPath);
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, mainApproveIndex };
200
+ return { ...mainApprove, path: `${mainCallRef.path}.data` };
155
201
  }
156
202
  // Validates the reset call: must be approve(same spender, 0)
157
- function validateBudgetResetCall(txCall, expectedSpender, calldataPath) {
203
+ function validateBudgetResetCall(txCallRef, expectedSpender, realChainId) {
158
204
  let resetApprove;
159
205
  try {
160
- resetApprove = decodeApproveCalldata(txCall.data);
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: `${calldataPath}[0].data`,
167
- actual: txCall.data,
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: `${calldataPath}[0].data`,
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 !== expectedSpender) {
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: `${calldataPath}[0].data`,
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, actionPath, mainIndex, request, trades, responseTrades, action, realChainId) {
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: dataPath,
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: dataPath,
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, mainIndex, realChainId, envConfig) {
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: `${actionPath}.details.transactionCalls[${mainIndex}].data`,
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,6 +1,6 @@
1
1
  import { ViolationCode, EvmActionKind, EvmActionOperation, PlaceholderType, BundleHookType, } from "../types/index.js";
2
2
  import { isRequestHookV2 } from "../types/request.js";
3
- import { HookMode, resolveEagerPlaceholders } from "../helpers/placeholder.js";
3
+ import { HookMode, resolveEagerPlaceholders, resolveEagerValuePlaceholders, } from "../helpers/placeholder.js";
4
4
  import { extractGasCompensationGroups } from "../helpers/gas-compensation.js";
5
5
  import { validateEvmGasCompensationTx } from "../helpers/evm-gas-compensation-tx.js";
6
6
  import { parseIntegerString } from "../helpers/integer.js";
@@ -12,14 +12,14 @@ const SIGN712_HOOK_TYPES = [
12
12
  EvmActionKind.Sign712MetaMaskCaveats,
13
13
  EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders,
14
14
  ];
15
- export function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request) {
15
+ export function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request, envConfig) {
16
16
  const violations = [];
17
17
  if (!isRequestHookV2(hookPayload.hook))
18
18
  return violations;
19
19
  for (let i = 0; i < hookPayload.requiredActions.length; i++) {
20
20
  const action = hookPayload.requiredActions[i];
21
21
  const actionPath = `${basePath}.requiredActions[${i}]`;
22
- violations.push(...validateHookSign7702Binding(action, actionPath, realChainId));
22
+ violations.push(...validateHookSign7702Binding(action, actionPath, realChainId, envConfig));
23
23
  }
24
24
  if (hookPayload.hook.type === BundleHookType.Direct) {
25
25
  violations.push(...validateDirectEvmHookActions(hookPayload, requestHook, basePath));
@@ -31,12 +31,12 @@ export function validateEvmHookActions(hookPayload, requestHook, basePath, mode,
31
31
  const expectedDelegate = request.enableAccountAbstraction
32
32
  ? getExpectedBundleHookDelegate(request.trades, hookPayload.hook.chainId)
33
33
  : undefined;
34
- violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp, expectedDelegate));
34
+ violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp, expectedDelegate, envConfig));
35
35
  }
36
36
  violations.push(...validateHookActionCalldata(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
37
- violations.push(...validateHookActionTransactionCallsMatch(hookPayload, basePath));
37
+ violations.push(...validateHookActionTransactionCallsMatch(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
38
38
  if (requestHook === undefined && mode === HookMode.PreHooks) {
39
- violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId));
39
+ violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId, envConfig));
40
40
  }
41
41
  return violations;
42
42
  }
@@ -47,7 +47,7 @@ export function validateEvmHookActions(hookPayload, requestHook, basePath, mode,
47
47
  // `Transaction`) would slip through the operation/position checks elsewhere.
48
48
  // The per-action [Delegate] + contractAddress checks are shared with intent-scope
49
49
  // via `validateSign7702Action`; the type <-> [Delegate] binding is hook-specific.
50
- function validateHookSign7702Binding(action, actionPath, realChainId) {
50
+ function validateHookSign7702Binding(action, actionPath, realChainId, envConfig) {
51
51
  const violations = [];
52
52
  const ops = action.actions;
53
53
  const hasDelegate = ops.includes(EvmActionOperation.Delegate);
@@ -63,7 +63,7 @@ function validateHookSign7702Binding(action, actionPath, realChainId) {
63
63
  });
64
64
  }
65
65
  if (isSign7702) {
66
- violations.push(...validateSign7702Action(action, actionPath, realChainId));
66
+ violations.push(...validateSign7702Action(action, actionPath, realChainId, envConfig));
67
67
  }
68
68
  return violations;
69
69
  }
@@ -110,7 +110,7 @@ function validateDirectAction(action, expectsTransaction, hookChainId, expectedD
110
110
  // `Sign712MetaMaskCaveatsWithPlaceholders` (when at least one deferred
111
111
  // placeholder is declared). transactionCalls form, placeholders match, and
112
112
  // EIP-712 content checks (domain, delegator, caveats) are checked per-action below.
113
- function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp, expectedDelegate) {
113
+ function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp, expectedDelegate, envConfig) {
114
114
  const violations = [];
115
115
  const expectedDeferred = collectDeferredPlaceholders(requestHook);
116
116
  const hasDeferred = expectedDeferred.length > 0;
@@ -123,6 +123,7 @@ function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, rea
123
123
  realChainId,
124
124
  expirationTimestamp,
125
125
  expectedDelegate,
126
+ envConfig,
126
127
  };
127
128
  // Collected `message.delegate` values across all delegated actions in this
128
129
  // hook — checked for cross-action consistency after the loop.
@@ -177,7 +178,7 @@ function validateDelegatedAction(action, actionPath, ctx, observedDelegates) {
177
178
  violations.push(...presenceErrors);
178
179
  return violations;
179
180
  }
180
- 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"));
181
182
  // Scoped delegate check: applies only when the request explicitly
182
183
  // pinned a delegate via `trade.srcAllowedSender` on a matching-chain
183
184
  // trade (caller set `ctx.expectedDelegate`). Otherwise the API
@@ -207,7 +208,7 @@ function validateDelegatedAction(action, actionPath, ctx, observedDelegates) {
207
208
  }
208
209
  const caveats = (data.message.caveats ?? []);
209
210
  const txCalls = action.details?.transactionCalls ?? [];
210
- 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));
211
212
  if (ctx.expectedType === EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
212
213
  const withPlaceholdersData = data;
213
214
  const actualPlaceholders = withPlaceholdersData.placeholders ?? [];
@@ -346,7 +347,7 @@ function validateHookActionCalldata(hookPayload, requestHook, basePath, mode, re
346
347
  // `Sign712MetaMaskCaveats(WithPlaceholders)` actions — otherwise the user
347
348
  // would sign a delegation that wraps a tx targeting / valued differently than
348
349
  // the echoed hook fields.
349
- function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
350
+ function validateHookActionTransactionCallsMatch(hookPayload, requestHook, basePath, mode, responseTrades, realChainId) {
350
351
  const violations = [];
351
352
  const hook = hookPayload.hook;
352
353
  if (!isRequestHookV2(hook))
@@ -354,40 +355,45 @@ function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
354
355
  for (let i = 0; i < hookPayload.requiredActions.length; i++) {
355
356
  const action = hookPayload.requiredActions[i];
356
357
  const actionPath = `${basePath}.requiredActions[${i}]`;
357
- if (!SIGN712_HOOK_TYPES.includes(action.type))
358
+ // Safe skip: Delegate-bearing actions carry EIP-7702 authorization,
359
+ // not the hook transaction.
360
+ if (action.actions.includes(EvmActionOperation.Delegate))
358
361
  continue;
359
- // Safe skip: missing transactionCalls reported by
360
- // `validateSign712TransactionCalls`.
361
- const tx = action.details?.transactionCalls?.[0];
362
+ const tx = extractEvmHookActionTransaction(action);
362
363
  if (!tx)
363
364
  continue;
364
- violations.push(...compareTransactionCallToHook(tx, hook, actionPath));
365
+ violations.push(...compareTransactionCallToHook(tx.triplet, hook, requestHook, actionPath, tx.path, mode, responseTrades, realChainId));
365
366
  }
366
367
  return violations;
367
368
  }
368
- function compareTransactionCallToHook(tx, hook, actionPath) {
369
+ function compareTransactionCallToHook(tx, hook, requestHook, actionPath, txPath, mode, responseTrades, realChainId) {
369
370
  const violations = [];
370
- if (hook.to !== undefined && tx.to !== hook.to) {
371
+ if (hook.to !== undefined && !addressEquals(realChainId, tx.to, hook.to)) {
371
372
  violations.push({
372
373
  code: ViolationCode.HookActionTransactionToMismatch,
373
- message: "transactionCalls[0].to must equal hook.to",
374
- path: `${actionPath}.details.transactionCalls[0].to`,
374
+ message: "hook action transaction target must equal hook.to",
375
+ path: `${actionPath}.${txPath}.to`,
375
376
  expected: hook.to,
376
377
  actual: tx.to,
377
378
  });
378
379
  }
379
- const hookValue = hook.value ?? "0";
380
+ const hookValue = resolveExpectedHookValue(hook, requestHook, mode, responseTrades, realChainId);
380
381
  if (!evmValuesEqual(tx.value, hookValue)) {
381
382
  violations.push({
382
383
  code: ViolationCode.HookActionTransactionValueMismatch,
383
- message: "transactionCalls[0].value must equal hook.value",
384
- path: `${actionPath}.details.transactionCalls[0].value`,
384
+ message: "hook action transaction value must equal hook.value",
385
+ path: `${actionPath}.${txPath}.value`,
385
386
  expected: hookValue,
386
387
  actual: tx.value,
387
388
  });
388
389
  }
389
390
  return violations;
390
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
+ }
391
397
  // Returns true if two EVM-value strings are byte-identical or if both parse as
392
398
  // BigInt and represent the same number (e.g. `"0x100"` vs `"256"`). Returns
393
399
  // false otherwise.
@@ -405,7 +411,7 @@ function evmValuesEqual(a, b) {
405
411
  // gas-compensation transfer — same rules as `compensation-hook.ts` applies to
406
412
  // `hook.{to, data, value}`, but here applied to `transactionCalls[0]` so the
407
413
  // user does not sign a delegation around a different (malicious) tx.
408
- function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId) {
414
+ function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId, envConfig) {
409
415
  const allGroups = extractGasCompensationGroups(request);
410
416
  const matchingGroups = allGroups.filter(g => g.realChainId === realChainId
411
417
  && addressEquals(realChainId, g.sender, hookPayload.hook.from));
@@ -427,9 +433,10 @@ function validateCompensationHookTransactionCall(hookPayload, basePath, request,
427
433
  continue;
428
434
  violations.push(...validateEvmGasCompensationTx(tx, matchingGroups, realChainId, `${actionPath}.details.transactionCalls[0]`, {
429
435
  toMismatch: ViolationCode.CompensationHookEvmToMismatch,
436
+ recipientMismatch: ViolationCode.CompensationHookEvmRecipientMismatch,
430
437
  dataInvalid: ViolationCode.CompensationHookEvmDataInvalid,
431
438
  valueInvalid: ViolationCode.CompensationHookEvmValueInvalid,
432
- }));
439
+ }, envConfig.compensationDelegateContracts));
433
440
  }
434
441
  return violations;
435
442
  }
@@ -471,4 +478,32 @@ function extractEvmHookActionCalldata(action) {
471
478
  }
472
479
  return undefined;
473
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
+ }
474
509
  //# sourceMappingURL=evm-op-hook.js.map