@debridge-finance/borderless-validation-sdk 0.0.0-dev-3dc1a82 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/dist/cjs/helpers/address.js +18 -31
  2. package/dist/cjs/helpers/address.js.map +1 -1
  3. package/dist/cjs/helpers/constants.js +6 -0
  4. package/dist/cjs/helpers/constants.js.map +1 -0
  5. package/dist/cjs/helpers/evm-action.js +3 -3
  6. package/dist/cjs/helpers/evm-action.js.map +1 -1
  7. package/dist/cjs/helpers/evm-intent-id.js +1 -1
  8. package/dist/cjs/helpers/evm-intent-id.js.map +1 -1
  9. package/dist/cjs/helpers/evm-trade-amounts.js +1 -36
  10. package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
  11. package/dist/cjs/types/enums.js +2 -26
  12. package/dist/cjs/types/enums.js.map +1 -1
  13. package/dist/cjs/types/request.js +2 -25
  14. package/dist/cjs/types/request.js.map +1 -1
  15. package/dist/cjs/types/response.js +4 -120
  16. package/dist/cjs/types/response.js.map +1 -1
  17. package/dist/cjs/types/validation.js +10 -74
  18. package/dist/cjs/types/validation.js.map +1 -1
  19. package/dist/cjs/validations/evm-caveats.js +14 -4
  20. package/dist/cjs/validations/evm-caveats.js.map +1 -1
  21. package/dist/cjs/validations/evm-op-budget.js +10 -13
  22. package/dist/cjs/validations/evm-op-budget.js.map +1 -1
  23. package/dist/cjs/validations/evm-op-gas-compensation.js +152 -0
  24. package/dist/cjs/validations/evm-op-gas-compensation.js.map +1 -0
  25. package/dist/cjs/validations/evm-op-hook.js +3 -410
  26. package/dist/cjs/validations/evm-op-hook.js.map +1 -1
  27. package/dist/cjs/validations/evm-op-wrap.js +7 -10
  28. package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
  29. package/dist/cjs/validations/evm-required-actions.js +9 -7
  30. package/dist/cjs/validations/evm-required-actions.js.map +1 -1
  31. package/dist/cjs/validations/evm-sign712-metamask.js +94 -17
  32. package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
  33. package/dist/cjs/validations/evm-sign7702.js +22 -34
  34. package/dist/cjs/validations/evm-sign7702.js.map +1 -1
  35. package/dist/cjs/validations/hooks-common.js +37 -252
  36. package/dist/cjs/validations/hooks-common.js.map +1 -1
  37. package/dist/cjs/validations/required-actions.js +7 -4
  38. package/dist/cjs/validations/required-actions.js.map +1 -1
  39. package/dist/cjs/validations/solana-hook.js +18 -32
  40. package/dist/cjs/validations/solana-hook.js.map +1 -1
  41. package/dist/cjs/validations/solana-op-budget.js +18 -56
  42. package/dist/cjs/validations/solana-op-budget.js.map +1 -1
  43. package/dist/cjs/validations/solana-op-wrap.js +13 -46
  44. package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
  45. package/dist/cjs/validations/solana-required-actions.js +3 -3
  46. package/dist/cjs/validations/solana-required-actions.js.map +1 -1
  47. package/dist/cjs/validations/solana-transaction.js +5 -5
  48. package/dist/cjs/validations/solana-transaction.js.map +1 -1
  49. package/dist/cjs/validations/trade-grouping.js +1 -68
  50. package/dist/cjs/validations/trade-grouping.js.map +1 -1
  51. package/dist/cjs/validations/trades.js +37 -59
  52. package/dist/cjs/validations/trades.js.map +1 -1
  53. package/dist/cjs/validator.js +16 -11
  54. package/dist/cjs/validator.js.map +1 -1
  55. package/dist/cjs/whitelists/environment-config.js +28 -47
  56. package/dist/cjs/whitelists/environment-config.js.map +1 -1
  57. package/dist/cjs/whitelists/evm/caveat-enforcers.js +5 -21
  58. package/dist/cjs/whitelists/evm/caveat-enforcers.js.map +1 -1
  59. package/dist/cjs/whitelists/evm/delegation-manager.js +2 -7
  60. package/dist/cjs/whitelists/evm/delegation-manager.js.map +1 -1
  61. package/dist/cjs/whitelists/evm/eip7702-delegation.js +2 -7
  62. package/dist/cjs/whitelists/evm/eip7702-delegation.js.map +1 -1
  63. package/dist/cjs/whitelists/evm/index.js +1 -14
  64. package/dist/cjs/whitelists/evm/index.js.map +1 -1
  65. package/dist/cjs/whitelists/evm/permit2.js +12 -16
  66. package/dist/cjs/whitelists/evm/permit2.js.map +1 -1
  67. package/dist/cjs/whitelists/evm/weth.js +5 -16
  68. package/dist/cjs/whitelists/evm/weth.js.map +1 -1
  69. package/dist/cjs/whitelists/solana/intent-signature.js +1 -0
  70. package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
  71. package/dist/cjs/whitelists/subscription-to-chain-id.js +0 -10
  72. package/dist/cjs/whitelists/subscription-to-chain-id.js.map +1 -1
  73. package/dist/cjs/whitelists/types.js +3 -13
  74. package/dist/cjs/whitelists/types.js.map +1 -1
  75. package/dist/esm/helpers/address.js +17 -28
  76. package/dist/esm/helpers/address.js.map +1 -1
  77. package/dist/esm/helpers/constants.js +3 -0
  78. package/dist/esm/helpers/constants.js.map +1 -0
  79. package/dist/esm/helpers/evm-action.js +3 -3
  80. package/dist/esm/helpers/evm-action.js.map +1 -1
  81. package/dist/esm/helpers/evm-intent-id.js +1 -1
  82. package/dist/esm/helpers/evm-intent-id.js.map +1 -1
  83. package/dist/esm/helpers/evm-trade-amounts.js +1 -36
  84. package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
  85. package/dist/esm/types/enums.js +1 -25
  86. package/dist/esm/types/enums.js.map +1 -1
  87. package/dist/esm/types/request.js +3 -26
  88. package/dist/esm/types/request.js.map +1 -1
  89. package/dist/esm/types/response.js +3 -119
  90. package/dist/esm/types/response.js.map +1 -1
  91. package/dist/esm/types/validation.js +10 -74
  92. package/dist/esm/types/validation.js.map +1 -1
  93. package/dist/esm/validations/evm-caveats.js +14 -4
  94. package/dist/esm/validations/evm-caveats.js.map +1 -1
  95. package/dist/esm/validations/evm-op-budget.js +10 -13
  96. package/dist/esm/validations/evm-op-budget.js.map +1 -1
  97. package/dist/esm/validations/evm-op-gas-compensation.js +149 -0
  98. package/dist/esm/validations/evm-op-gas-compensation.js.map +1 -0
  99. package/dist/esm/validations/evm-op-hook.js +2 -409
  100. package/dist/esm/validations/evm-op-hook.js.map +1 -1
  101. package/dist/esm/validations/evm-op-wrap.js +7 -10
  102. package/dist/esm/validations/evm-op-wrap.js.map +1 -1
  103. package/dist/esm/validations/evm-required-actions.js +9 -7
  104. package/dist/esm/validations/evm-required-actions.js.map +1 -1
  105. package/dist/esm/validations/evm-sign712-metamask.js +94 -17
  106. package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
  107. package/dist/esm/validations/evm-sign7702.js +22 -33
  108. package/dist/esm/validations/evm-sign7702.js.map +1 -1
  109. package/dist/esm/validations/hooks-common.js +38 -251
  110. package/dist/esm/validations/hooks-common.js.map +1 -1
  111. package/dist/esm/validations/required-actions.js +7 -4
  112. package/dist/esm/validations/required-actions.js.map +1 -1
  113. package/dist/esm/validations/solana-hook.js +20 -34
  114. package/dist/esm/validations/solana-hook.js.map +1 -1
  115. package/dist/esm/validations/solana-op-budget.js +18 -56
  116. package/dist/esm/validations/solana-op-budget.js.map +1 -1
  117. package/dist/esm/validations/solana-op-wrap.js +14 -47
  118. package/dist/esm/validations/solana-op-wrap.js.map +1 -1
  119. package/dist/esm/validations/solana-required-actions.js +3 -3
  120. package/dist/esm/validations/solana-required-actions.js.map +1 -1
  121. package/dist/esm/validations/solana-transaction.js +7 -7
  122. package/dist/esm/validations/solana-transaction.js.map +1 -1
  123. package/dist/esm/validations/trade-grouping.js +1 -68
  124. package/dist/esm/validations/trade-grouping.js.map +1 -1
  125. package/dist/esm/validations/trades.js +37 -59
  126. package/dist/esm/validations/trades.js.map +1 -1
  127. package/dist/esm/validator.js +16 -11
  128. package/dist/esm/validator.js.map +1 -1
  129. package/dist/esm/whitelists/environment-config.js +28 -47
  130. package/dist/esm/whitelists/environment-config.js.map +1 -1
  131. package/dist/esm/whitelists/evm/caveat-enforcers.js +4 -20
  132. package/dist/esm/whitelists/evm/caveat-enforcers.js.map +1 -1
  133. package/dist/esm/whitelists/evm/delegation-manager.js +1 -6
  134. package/dist/esm/whitelists/evm/delegation-manager.js.map +1 -1
  135. package/dist/esm/whitelists/evm/eip7702-delegation.js +1 -6
  136. package/dist/esm/whitelists/evm/eip7702-delegation.js.map +1 -1
  137. package/dist/esm/whitelists/evm/index.js +4 -4
  138. package/dist/esm/whitelists/evm/index.js.map +1 -1
  139. package/dist/esm/whitelists/evm/permit2.js +5 -9
  140. package/dist/esm/whitelists/evm/permit2.js.map +1 -1
  141. package/dist/esm/whitelists/evm/weth.js +5 -16
  142. package/dist/esm/whitelists/evm/weth.js.map +1 -1
  143. package/dist/esm/whitelists/solana/intent-signature.js +1 -0
  144. package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
  145. package/dist/esm/whitelists/subscription-to-chain-id.js +0 -9
  146. package/dist/esm/whitelists/subscription-to-chain-id.js.map +1 -1
  147. package/dist/esm/whitelists/types.js +5 -14
  148. package/dist/esm/whitelists/types.js.map +1 -1
  149. package/dist/types/helpers/address.d.ts +7 -5
  150. package/dist/types/helpers/address.d.ts.map +1 -1
  151. package/dist/types/helpers/constants.d.ts +2 -0
  152. package/dist/types/helpers/constants.d.ts.map +1 -0
  153. package/dist/types/helpers/evm-trade-amounts.d.ts +2 -2
  154. package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
  155. package/dist/types/types/enums.d.ts +1 -19
  156. package/dist/types/types/enums.d.ts.map +1 -1
  157. package/dist/types/types/request.d.ts +9 -19
  158. package/dist/types/types/request.d.ts.map +1 -1
  159. package/dist/types/types/response.d.ts +11 -367
  160. package/dist/types/types/response.d.ts.map +1 -1
  161. package/dist/types/types/validation.d.ts +11 -67
  162. package/dist/types/types/validation.d.ts.map +1 -1
  163. package/dist/types/validations/evm-caveats.d.ts.map +1 -1
  164. package/dist/types/validations/evm-op-budget.d.ts +2 -2
  165. package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
  166. package/dist/types/validations/evm-op-gas-compensation.d.ts +3 -0
  167. package/dist/types/validations/evm-op-gas-compensation.d.ts.map +1 -0
  168. package/dist/types/validations/evm-op-hook.d.ts +2 -4
  169. package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
  170. package/dist/types/validations/evm-op-wrap.d.ts +2 -2
  171. package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
  172. package/dist/types/validations/evm-required-actions.d.ts +2 -2
  173. package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
  174. package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
  175. package/dist/types/validations/evm-sign7702.d.ts +1 -2
  176. package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
  177. package/dist/types/validations/hooks-common.d.ts +0 -1
  178. package/dist/types/validations/hooks-common.d.ts.map +1 -1
  179. package/dist/types/validations/required-actions.d.ts +1 -2
  180. package/dist/types/validations/required-actions.d.ts.map +1 -1
  181. package/dist/types/validations/solana-hook.d.ts +2 -4
  182. package/dist/types/validations/solana-hook.d.ts.map +1 -1
  183. package/dist/types/validations/solana-op-budget.d.ts +2 -2
  184. package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
  185. package/dist/types/validations/solana-op-wrap.d.ts +2 -2
  186. package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
  187. package/dist/types/validations/solana-required-actions.d.ts +2 -2
  188. package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
  189. package/dist/types/validations/solana-transaction.d.ts +3 -3
  190. package/dist/types/validations/solana-transaction.d.ts.map +1 -1
  191. package/dist/types/validations/trade-grouping.d.ts +2 -3
  192. package/dist/types/validations/trade-grouping.d.ts.map +1 -1
  193. package/dist/types/validator.d.ts.map +1 -1
  194. package/dist/types/whitelists/environment-config.d.ts.map +1 -1
  195. package/dist/types/whitelists/evm/caveat-enforcers.d.ts +0 -8
  196. package/dist/types/whitelists/evm/caveat-enforcers.d.ts.map +1 -1
  197. package/dist/types/whitelists/evm/delegation-manager.d.ts +0 -2
  198. package/dist/types/whitelists/evm/delegation-manager.d.ts.map +1 -1
  199. package/dist/types/whitelists/evm/eip7702-delegation.d.ts +0 -2
  200. package/dist/types/whitelists/evm/eip7702-delegation.d.ts.map +1 -1
  201. package/dist/types/whitelists/evm/index.d.ts +4 -4
  202. package/dist/types/whitelists/evm/index.d.ts.map +1 -1
  203. package/dist/types/whitelists/evm/permit2.d.ts +0 -1
  204. package/dist/types/whitelists/evm/permit2.d.ts.map +1 -1
  205. package/dist/types/whitelists/evm/weth.d.ts.map +1 -1
  206. package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
  207. package/dist/types/whitelists/subscription-to-chain-id.d.ts +0 -1
  208. package/dist/types/whitelists/subscription-to-chain-id.d.ts.map +1 -1
  209. package/dist/types/whitelists/types.d.ts +1 -1
  210. package/dist/types/whitelists/types.d.ts.map +1 -1
  211. package/package.json +2 -2
  212. package/README.md +0 -164
  213. package/dist/cjs/helpers/evm-gas-compensation-tx.js +0 -102
  214. package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +0 -1
  215. package/dist/cjs/helpers/gas-compensation.js +0 -36
  216. package/dist/cjs/helpers/gas-compensation.js.map +0 -1
  217. package/dist/cjs/helpers/placeholder.js +0 -174
  218. package/dist/cjs/helpers/placeholder.js.map +0 -1
  219. package/dist/cjs/helpers/sets.js +0 -13
  220. package/dist/cjs/helpers/sets.js.map +0 -1
  221. package/dist/cjs/validations/compensation-hook.js +0 -203
  222. package/dist/cjs/validations/compensation-hook.js.map +0 -1
  223. package/dist/cjs/validations/evm-sign712-shared.js +0 -116
  224. package/dist/cjs/validations/evm-sign712-shared.js.map +0 -1
  225. package/dist/cjs/validations/intent-destinations.js +0 -197
  226. package/dist/cjs/validations/intent-destinations.js.map +0 -1
  227. package/dist/cjs/validations/intent-tokens.js +0 -341
  228. package/dist/cjs/validations/intent-tokens.js.map +0 -1
  229. package/dist/cjs/validations/intent.js +0 -288
  230. package/dist/cjs/validations/intent.js.map +0 -1
  231. package/dist/cjs/whitelists/evm/metamask-delegation-chains.js +0 -16
  232. package/dist/cjs/whitelists/evm/metamask-delegation-chains.js.map +0 -1
  233. package/dist/esm/helpers/evm-gas-compensation-tx.js +0 -99
  234. package/dist/esm/helpers/evm-gas-compensation-tx.js.map +0 -1
  235. package/dist/esm/helpers/gas-compensation.js +0 -33
  236. package/dist/esm/helpers/gas-compensation.js.map +0 -1
  237. package/dist/esm/helpers/placeholder.js +0 -168
  238. package/dist/esm/helpers/placeholder.js.map +0 -1
  239. package/dist/esm/helpers/sets.js +0 -10
  240. package/dist/esm/helpers/sets.js.map +0 -1
  241. package/dist/esm/validations/compensation-hook.js +0 -200
  242. package/dist/esm/validations/compensation-hook.js.map +0 -1
  243. package/dist/esm/validations/evm-sign712-shared.js +0 -110
  244. package/dist/esm/validations/evm-sign712-shared.js.map +0 -1
  245. package/dist/esm/validations/intent-destinations.js +0 -194
  246. package/dist/esm/validations/intent-destinations.js.map +0 -1
  247. package/dist/esm/validations/intent-tokens.js +0 -338
  248. package/dist/esm/validations/intent-tokens.js.map +0 -1
  249. package/dist/esm/validations/intent.js +0 -285
  250. package/dist/esm/validations/intent.js.map +0 -1
  251. package/dist/esm/whitelists/evm/metamask-delegation-chains.js +0 -13
  252. package/dist/esm/whitelists/evm/metamask-delegation-chains.js.map +0 -1
  253. package/dist/types/helpers/evm-gas-compensation-tx.d.ts +0 -13
  254. package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +0 -1
  255. package/dist/types/helpers/gas-compensation.d.ts +0 -10
  256. package/dist/types/helpers/gas-compensation.d.ts.map +0 -1
  257. package/dist/types/helpers/placeholder.d.ts +0 -41
  258. package/dist/types/helpers/placeholder.d.ts.map +0 -1
  259. package/dist/types/helpers/sets.d.ts +0 -2
  260. package/dist/types/helpers/sets.d.ts.map +0 -1
  261. package/dist/types/validations/compensation-hook.d.ts +0 -3
  262. package/dist/types/validations/compensation-hook.d.ts.map +0 -1
  263. package/dist/types/validations/evm-sign712-shared.d.ts +0 -7
  264. package/dist/types/validations/evm-sign712-shared.d.ts.map +0 -1
  265. package/dist/types/validations/intent-destinations.d.ts +0 -4
  266. package/dist/types/validations/intent-destinations.d.ts.map +0 -1
  267. package/dist/types/validations/intent-tokens.d.ts +0 -4
  268. package/dist/types/validations/intent-tokens.d.ts.map +0 -1
  269. package/dist/types/validations/intent.d.ts +0 -5
  270. package/dist/types/validations/intent.d.ts.map +0 -1
  271. package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts +0 -3
  272. package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts.map +0 -1
@@ -2,7 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateSign712MetaMaskActions = validateSign712MetaMaskActions;
4
4
  const types_1 = require("../types");
5
- const evm_sign712_shared_1 = require("./evm-sign712-shared");
5
+ const types_2 = require("../whitelists/types");
6
+ const evm_1 = require("../whitelists/evm");
7
+ const address_1 = require("../helpers/address");
8
+ const evm_caveats_1 = require("./evm-caveats");
6
9
  const SIGN712_METAMASK_ALLOWED_ACTIONS = [
7
10
  types_1.EvmActionOperation.Budget,
8
11
  types_1.EvmActionOperation.Wrap,
@@ -13,28 +16,23 @@ function validateSign712MetaMaskActions(actions, basePath, realChainId, quoteMod
13
16
  const violations = [];
14
17
  for (let i = 0; i < actions.length; i++) {
15
18
  const action = actions[i];
16
- if (action.type !== types_1.EvmActionKind.Sign712MetaMaskCaveats)
19
+ if (action.type !== types_1.EvmActionKind.Sign712MetaMask)
17
20
  continue;
18
21
  const actionPath = `${basePath}.requiredActions[${i}]`;
19
22
  const data = action.data;
20
- // CRITICAL: data structural presence — downstream content checks
21
- // assume `data.domain` and `data.message` exist.
22
- const presenceErrors = (0, evm_sign712_shared_1.validateSign712DataPresent)(data, actionPath);
23
- if (presenceErrors.length > 0) {
24
- violations.push(...presenceErrors);
23
+ // CRITICAL: `data` must be present and contain `domain` and `message`
24
+ if (!data || !data.domain || !data.message) {
25
+ violations.push({
26
+ code: types_1.ViolationCode.Sign712MetaMaskDomainNameNotDelegationManager,
27
+ message: `Sign712MetaMask data is missing domain or message`,
28
+ path: `${actionPath}.data`,
29
+ actual: data,
30
+ });
25
31
  continue;
26
32
  }
27
- violations.push(...validateSign712TransactionCalls(action, actionPath), ...validateSign712AllowedActions(action, actionPath), ...(0, evm_sign712_shared_1.validateSign712Domain)(data, actionPath, realChainId),
28
- // Delegator: in quote mode we cannot determine the trust source —
29
- // skip the check entirely. In execution mode the helper compares
30
- // against `srcChainAuthorityAddress` (which may itself be
31
- // `undefined` as a defensive check — preserved by passing through).
32
- ...(quoteMode
33
- ? []
34
- : (0, evm_sign712_shared_1.validateSign712Delegator)(data, actionPath, realChainId, srcChainAuthorityAddress, "srcChainAuthorityAddress")));
33
+ violations.push(...validateSign712TransactionCalls(action, actionPath), ...validateSign712AllowedActions(action, actionPath), ...validateSign712Domain(data, actionPath, realChainId), ...validateSign712Delegator(data, actionPath, realChainId, quoteMode, srcChainAuthorityAddress));
35
34
  const caveats = (data.message.caveats ?? []);
36
- const txCalls = action.details?.transactionCalls ?? [];
37
- violations.push(...(0, evm_sign712_shared_1.validateSign712Caveats)(caveats, action.actionId, txCalls, actionPath, realChainId, expirationTimestamp));
35
+ violations.push(...validateSign712MetaMaskCaveats(caveats, action, actionPath, realChainId, expirationTimestamp));
38
36
  }
39
37
  return violations;
40
38
  }
@@ -67,4 +65,83 @@ function validateSign712AllowedActions(action, actionPath) {
67
65
  }
68
66
  return violations;
69
67
  }
68
+ // CRITICAL: domain.name must be "DelegationManager"
69
+ // CRITICAL: domain.chainId must equal the real chainId
70
+ // CRITICAL: domain.verifyingContract must be in the DelegationManager whitelist
71
+ function validateSign712Domain(data, actionPath, realChainId) {
72
+ const violations = [];
73
+ if (data.domain.name !== "DelegationManager") {
74
+ violations.push({
75
+ code: types_1.ViolationCode.Sign712MetaMaskDomainNameNotDelegationManager,
76
+ message: `Sign712MetaMask domain.name must be "DelegationManager"`,
77
+ path: `${actionPath}.data.domain.name`,
78
+ expected: "DelegationManager",
79
+ actual: data.domain.name,
80
+ });
81
+ }
82
+ if (data.domain.chainId !== realChainId) {
83
+ violations.push({
84
+ code: types_1.ViolationCode.Sign712MetaMaskChainIdMismatch,
85
+ message: `Sign712MetaMask domain.chainId does not match the real chainId`,
86
+ path: `${actionPath}.data.domain.chainId`,
87
+ expected: realChainId,
88
+ actual: data.domain.chainId,
89
+ });
90
+ }
91
+ if (data.domain.verifyingContract === undefined ||
92
+ !(0, types_2.isWhitelisted)(evm_1.DELEGATION_MANAGER_CONTRACTS, realChainId, data.domain.verifyingContract)) {
93
+ violations.push({
94
+ code: types_1.ViolationCode.Sign712MetaMaskVerifyingContractNotWhitelisted,
95
+ message: `Sign712MetaMask domain.verifyingContract is not whitelisted`,
96
+ path: `${actionPath}.data.domain.verifyingContract`,
97
+ actual: data.domain.verifyingContract,
98
+ });
99
+ }
100
+ return violations;
101
+ }
102
+ // LOW: in execution mode, message.delegator must match srcChainAuthorityAddress
103
+ function validateSign712Delegator(data, actionPath, realChainId, quoteMode, srcChainAuthorityAddress) {
104
+ if (quoteMode)
105
+ return [];
106
+ const delegator = data.message.delegator;
107
+ if (srcChainAuthorityAddress === undefined ||
108
+ delegator === undefined ||
109
+ !(0, address_1.addressEquals)(realChainId, delegator, srcChainAuthorityAddress)) {
110
+ return [{
111
+ code: types_1.ViolationCode.Sign712MetaMaskDelegatorMismatch,
112
+ message: `Sign712MetaMask message.delegator must match srcChainAuthorityAddress`,
113
+ path: `${actionPath}.data.message.delegator`,
114
+ expected: srcChainAuthorityAddress,
115
+ actual: delegator,
116
+ }];
117
+ }
118
+ return [];
119
+ }
120
+ function validateSign712MetaMaskCaveats(caveats, action, actionPath, realChainId, expirationTimestamp) {
121
+ const violations = [];
122
+ const classified = (0, evm_caveats_1.classifyCaveats)(caveats, action.actionId, actionPath, realChainId, violations);
123
+ const txCalls = action.details?.transactionCalls ?? [];
124
+ violations.push(...(0, evm_caveats_1.validateExactExecutionPresence)(classified, txCalls, actionPath));
125
+ (0, evm_caveats_1.validateExactExecutionContent)(classified, txCalls, actionPath, violations);
126
+ // CRITICAL: must have at least one IdEnforcer caveat (replay protection)
127
+ if (!classified.hasIdEnforcer) {
128
+ violations.push({
129
+ code: types_1.ViolationCode.Sign712MetaMaskMissingIdEnforcerCaveat,
130
+ message: `Sign712MetaMask must have an IdEnforcer caveat`,
131
+ path: `${actionPath}.data.message.caveats`,
132
+ });
133
+ }
134
+ // CRITICAL: must have exactly one TimestampEnforcer caveat
135
+ if (classified.timestampCount === 0) {
136
+ violations.push({
137
+ code: types_1.ViolationCode.Sign712MetaMaskMissingTimestampEnforcerCaveat,
138
+ message: `Sign712MetaMask must have a TimestampEnforcer caveat`,
139
+ path: `${actionPath}.data.message.caveats`,
140
+ });
141
+ }
142
+ if (classified.firstTimestamp) {
143
+ (0, evm_caveats_1.validateTimestampEnforcerValue)(classified.firstTimestamp.caveat, expirationTimestamp, classified.firstTimestamp.index, actionPath, violations);
144
+ }
145
+ return violations;
146
+ }
70
147
  //# sourceMappingURL=evm-sign712-metamask.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evm-sign712-metamask.js","sourceRoot":"","sources":["../../../src/validations/evm-sign712-metamask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evm-sign712-metamask.js","sourceRoot":"","sources":["../../../src/validations/evm-sign712-metamask.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateSign7702Action = validateSign7702Action;
4
3
  exports.validateSign7702Actions = validateSign7702Actions;
5
4
  const types_1 = require("../types");
6
5
  const types_2 = require("../whitelists/types");
@@ -8,38 +7,6 @@ const evm_1 = require("../whitelists/evm");
8
7
  // =============================================
9
8
  // Sign7702Authorization constraints
10
9
  // =============================================
11
- // CRITICAL: per-action checks for a `Sign7702Authorization` action.
12
- // Shared between intent-scope (`validateSign7702Actions`) and hook-scope
13
- // (`validateHookSign7702Binding`); both wrap this with their scope-specific
14
- // constraints (intent: position+duplicate; hook: type↔actions binding +
15
- // `validateHookDelegateOp` for position/count).
16
- function validateSign7702Action(action, actionPath, realChainId) {
17
- const violations = [];
18
- // HIGH: actions[] must contain exactly one element — Delegate
19
- const ops = action.actions;
20
- if (ops.length !== 1 || ops[0] !== types_1.EvmActionOperation.Delegate) {
21
- violations.push({
22
- code: types_1.ViolationCode.Sign7702ActionsNotSingleDelegate,
23
- message: `Sign7702Authorization actions must contain exactly [Delegate]`,
24
- path: `${actionPath}.actions`,
25
- expected: [types_1.EvmActionOperation.Delegate],
26
- actual: action.actions,
27
- });
28
- }
29
- // CRITICAL: data.contractAddress must be in the whitelist
30
- const data = action.data;
31
- const contractAddress = data?.contractAddress;
32
- if (!contractAddress
33
- || !(0, types_2.isWhitelisted)(evm_1.EIP7702_DELEGATION_CONTRACTS, realChainId, contractAddress)) {
34
- violations.push({
35
- code: types_1.ViolationCode.Sign7702ContractAddressNotWhitelisted,
36
- message: `Sign7702Authorization contractAddress is not in the whitelist`,
37
- path: `${actionPath}.data.contractAddress`,
38
- actual: contractAddress,
39
- });
40
- }
41
- return violations;
42
- }
43
10
  function validateSign7702Actions(actions, basePath, realChainId) {
44
11
  const violations = [];
45
12
  let sign7702Count = 0;
@@ -49,7 +16,28 @@ function validateSign7702Actions(actions, basePath, realChainId) {
49
16
  if (action.type !== types_1.EvmActionKind.Sign7702Authorization)
50
17
  continue;
51
18
  const actionPath = `${basePath}.requiredActions[${i}]`;
52
- violations.push(...validateSign7702Action(action, actionPath, realChainId));
19
+ // HIGH: actions[] must contain exactly one element — Delegate
20
+ if (action.actions.length !== 1 ||
21
+ action.actions[0] !== types_1.EvmActionOperation.Delegate) {
22
+ violations.push({
23
+ code: types_1.ViolationCode.Sign7702ActionsNotSingleDelegate,
24
+ message: `Sign7702Authorization actions must contain exactly [Delegate]`,
25
+ path: `${actionPath}.actions`,
26
+ expected: [types_1.EvmActionOperation.Delegate],
27
+ actual: action.actions,
28
+ });
29
+ }
30
+ // CRITICAL: data.contractAddress must be in the whitelist
31
+ const data = action.data;
32
+ const contractAddress = data?.contractAddress;
33
+ if (!contractAddress || !(0, types_2.isWhitelisted)(evm_1.EIP7702_DELEGATION_CONTRACTS, realChainId, contractAddress)) {
34
+ violations.push({
35
+ code: types_1.ViolationCode.Sign7702ContractAddressNotWhitelisted,
36
+ message: `Sign7702Authorization contractAddress is not in the whitelist`,
37
+ path: `${actionPath}.data.contractAddress`,
38
+ actual: contractAddress,
39
+ });
40
+ }
53
41
  // HIGH: at most one Sign7702Authorization per intent
54
42
  // Note: only the first duplicate will be reported, subsequent ones will be ignored
55
43
  sign7702Count++;
@@ -1 +1 @@
1
- {"version":3,"file":"evm-sign7702.js","sourceRoot":"","sources":["../../../src/validations/evm-sign7702.ts"],"names":[],"mappings":";;AAsBA,wDAmCC;AAED,0DAiCC;AA5FD,oCASkB;AAClB,+CAAoD;AACpD,2CAAiE;AAEjE,gDAAgD;AAChD,oCAAoC;AACpC,gDAAgD;AAEhD,oEAAoE;AACpE,yEAAyE;AACzE,4EAA4E;AAC5E,wEAAwE;AACxE,gDAAgD;AAChD,SAAgB,sBAAsB,CAClC,MAA0E,EAC1E,UAAkB,EAClB,WAAoB;IAEpB,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,8DAA8D;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAmB,CAAC;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,0BAAkB,CAAC,QAAQ,EAAE,CAAC;QAC7D,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,gCAAgC;YACpD,OAAO,EAAE,+DAA+D;YACxE,IAAI,EAAE,GAAG,UAAU,UAAU;YAC7B,QAAQ,EAAE,CAAC,0BAAkB,CAAC,QAAQ,CAAC;YACvC,MAAM,EAAE,MAAM,CAAC,OAAO;SACzB,CAAC,CAAC;IACP,CAAC;IAED,0DAA0D;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAgD,CAAC;IACrE,MAAM,eAAe,GAAG,IAAI,EAAE,eAAe,CAAC;IAC9C,IACI,CAAC,eAAe;WACb,CAAC,IAAA,qBAAa,EAAC,kCAA4B,EAAE,WAAW,EAAE,eAAe,CAAC,EAC/E,CAAC;QACC,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,qCAAqC;YACzD,OAAO,EAAE,+DAA+D;YACxE,IAAI,EAAE,GAAG,UAAU,uBAAuB;YAC1C,MAAM,EAAE,eAAe;SAC1B,CAAC,CAAC;IACP,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAgB,uBAAuB,CACnC,OAA4B,EAC5B,QAAgB,EAChB,WAAoB;IAEpB,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,qBAAqB;YAAE,SAAS;QAElE,MAAM,UAAU,GAAG,GAAG,QAAQ,oBAAoB,CAAC,GAAG,CAAC;QACvD,UAAU,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QAE5E,qDAAqD;QACrD,mFAAmF;QACnF,aAAa,EAAE,CAAC;QAChB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACtB,kBAAkB,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,8BAA8B;gBAClD,OAAO,EAAE,kEAAkE,kBAAkB,QAAQ,CAAC,EAAE;gBACxG,IAAI,EAAE,GAAG,UAAU,OAAO;gBAC1B,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,aAAa;aACxB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"evm-sign7702.js","sourceRoot":"","sources":["../../../src/validations/evm-sign7702.ts"],"names":[],"mappings":";;AAgBA,0DA0DC;AA1ED,oCAQkB;AAClB,+CAAoD;AACpD,2CAAiE;AAEjE,gDAAgD;AAChD,oCAAoC;AACpC,gDAAgD;AAEhD,SAAgB,uBAAuB,CACnC,OAA4B,EAC5B,QAAgB,EAChB,WAAoB;IAEpB,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,qBAAqB;YAAE,SAAS;QAElE,MAAM,UAAU,GAAG,GAAG,QAAQ,oBAAoB,CAAC,GAAG,CAAC;QAEvD,8DAA8D;QAC9D,IACI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,0BAAkB,CAAC,QAAQ,EACnD,CAAC;YACC,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,gCAAgC;gBACpD,OAAO,EAAE,+DAA+D;gBACxE,IAAI,EAAE,GAAG,UAAU,UAAU;gBAC7B,QAAQ,EAAE,CAAC,0BAAkB,CAAC,QAAQ,CAAC;gBACvC,MAAM,EAAE,MAAM,CAAC,OAAO;aACzB,CAAC,CAAC;QACP,CAAC;QAED,0DAA0D;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAgD,CAAC;QACrE,MAAM,eAAe,GAAG,IAAI,EAAE,eAAe,CAAC;QAC9C,IAAI,CAAC,eAAe,IAAI,CAAC,IAAA,qBAAa,EAAC,kCAA4B,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC;YACjG,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,qCAAqC;gBACzD,OAAO,EAAE,+DAA+D;gBACxE,IAAI,EAAE,GAAG,UAAU,uBAAuB;gBAC1C,MAAM,EAAE,eAAe;aAC1B,CAAC,CAAC;QACP,CAAC;QAED,qDAAqD;QACrD,mFAAmF;QACnF,aAAa,EAAE,CAAC;QAChB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACtB,kBAAkB,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,8BAA8B;gBAClD,OAAO,EAAE,kEAAkE,kBAAkB,QAAQ,CAAC,EAAE;gBACxG,IAAI,EAAE,GAAG,UAAU,OAAO;gBAC1B,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,aAAa;aACxB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC"}
@@ -1,31 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HookMode = void 0;
4
3
  exports.validateHooks = validateHooks;
5
4
  const types_1 = require("../types");
6
5
  const enums_1 = require("../types/enums");
7
- const address_1 = require("../helpers/address");
8
- const gas_compensation_1 = require("../helpers/gas-compensation");
9
- const placeholder_1 = require("../helpers/placeholder");
10
6
  const solana_hook_1 = require("./solana-hook");
11
- const evm_op_hook_1 = require("./evm-op-hook");
12
- const compensation_hook_1 = require("./compensation-hook");
13
- const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
14
- // Re-exported so call sites can pass the mode without importing from helpers.
15
- var placeholder_2 = require("../helpers/placeholder");
16
- Object.defineProperty(exports, "HookMode", { enumerable: true, get: function () { return placeholder_2.HookMode; } });
17
- // Allowed hook-scope operations — each chain checked against its own enum.
18
- const EVM_HOOK_OPERATIONS = [
19
- enums_1.EvmActionOperation.Delegate,
20
- enums_1.EvmActionOperation.Hook,
21
- enums_1.EvmActionOperation.GasCompensation,
22
- ];
23
- const EVM_HOOK_OPERATIONS_SET = new Set(EVM_HOOK_OPERATIONS);
24
- const SOLANA_HOOK_OPERATIONS = [
25
- enums_1.SolanaActionOperation.Hook,
26
- enums_1.SolanaActionOperation.GasCompensation,
27
- ];
28
- const SOLANA_HOOK_OPERATIONS_SET = new Set(SOLANA_HOOK_OPERATIONS);
7
+ // Both EVM and Solana use identical string values for hook operations
8
+ const HOOK_OPERATIONS = ["Hook", "GasCompensation"];
9
+ const HOOK_OPERATIONS_SET = new Set(HOOK_OPERATIONS);
29
10
  function validateHooks(request, response, quoteMode) {
30
11
  return [
31
12
  ...validateHookAAConstraint(request, response),
@@ -59,35 +40,26 @@ function validateHookAAConstraint(request, response) {
59
40
  }
60
41
  return violations;
61
42
  }
62
- // HIGH: preHooks = request.preHooks + one compensation hook per unique
63
- // gasCompensationInfo group (exact equality — API always adds one per group).
64
- // postHooks must match exactly — the API never adds extras to postHooks.
43
+ // HIGH: response.preHooks.length must equal request.preHooks.length
65
44
  function validateHookCounts(request, response) {
66
45
  const violations = [];
67
46
  const requestPreCount = request.preHooks?.length ?? 0;
68
47
  const requestPostCount = request.postHooks?.length ?? 0;
69
- // preHooks: exactly request.preHooks.length + one per unique gas
70
- // compensation group. If request has no gasCompensationInfo at all, extras
71
- // are forbidden (this also guards against MITM adding preHook entries when
72
- // the user never asked for compensation).
73
- const compensationGroupCount = (0, gas_compensation_1.extractGasCompensationGroups)(request).length;
74
- const expectedPreCount = requestPreCount + compensationGroupCount;
75
- if (response.preHooks.length !== expectedPreCount) {
48
+ if (response.preHooks.length !== requestPreCount) {
76
49
  violations.push({
77
50
  code: types_1.ViolationCode.HookCountMismatch,
78
- message: "response.preHooks count does not match"
79
- + " request.preHooks.length + unique gasCompensationInfo groups",
51
+ message: "response.preHooks count does not match request.preHooks count",
80
52
  path: "response.preHooks",
81
- expected: expectedPreCount,
53
+ expected: requestPreCount,
82
54
  actual: response.preHooks.length,
83
55
  });
84
56
  }
85
- // postHooks: strict 1:1 match, no extras allowed
86
- if (response.postHooks.length !== requestPostCount) {
57
+ // postHooks may contain additional compensation hooks beyond what was in the request,
58
+ // so response count must be >= request count
59
+ if (response.postHooks.length < requestPostCount) {
87
60
  violations.push({
88
61
  code: types_1.ViolationCode.HookCountMismatch,
89
- message: "response.postHooks count does not match"
90
- + " request.postHooks count",
62
+ message: "response.postHooks count is less than request.postHooks count",
91
63
  path: "response.postHooks",
92
64
  expected: requestPostCount,
93
65
  actual: response.postHooks.length,
@@ -102,7 +74,7 @@ function validatePreHooks(request, response, quoteMode) {
102
74
  const basePath = `response.preHooks[${i}]`;
103
75
  const hookPayload = response.preHooks[i];
104
76
  const requestHook = requestHooks[i];
105
- violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, response.trades, placeholder_1.HookMode.PreHooks, quoteMode));
77
+ violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode));
106
78
  }
107
79
  return violations;
108
80
  }
@@ -114,153 +86,31 @@ function validatePostHooks(request, response, quoteMode) {
114
86
  const hookPayload = response.postHooks[i];
115
87
  // User postHooks are matched by index; extra entries are compensation hooks
116
88
  const requestHook = i < requestHooks.length ? requestHooks[i] : undefined;
117
- violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, response.trades, placeholder_1.HookMode.PostHooks, quoteMode));
89
+ violations.push(...validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode));
118
90
  }
119
91
  return violations;
120
92
  }
121
- function validateSingleHookPayload(hookPayload, requestHook, basePath, request, responseTrades, mode, quoteMode) {
122
- const isCompensationPreHook = requestHook === undefined && mode === placeholder_1.HookMode.PreHooks;
93
+ function validateSingleHookPayload(hookPayload, requestHook, basePath, request, quoteMode) {
123
94
  return [
124
- ...validateHookEcho(hookPayload, requestHook, basePath, responseTrades, mode),
95
+ ...validateHookEcho(hookPayload, requestHook, basePath),
125
96
  ...validateHookUniqueActionIds(hookPayload, basePath),
126
97
  ...validateHookActionsList(hookPayload, basePath),
127
- ...validateHookDelegateOp(hookPayload, basePath),
128
- ...validateHookSolanaNotDirect(hookPayload, basePath),
129
98
  ...validateGasCompensationRequiresInfo(hookPayload, basePath, request),
130
- ...(isCompensationPreHook
131
- ? (0, compensation_hook_1.validateCompensationHookStructure)(hookPayload, basePath, request)
132
- : []),
133
- ...dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request, mode, responseTrades),
99
+ ...dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request),
134
100
  ];
135
101
  }
136
- // MEDIUM: Solana hooks must not be of type 'direct'.
137
- function validateHookSolanaNotDirect(hookPayload, basePath) {
138
- const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(hookPayload.hook.chainId);
139
- if ((0, address_1.getChainEngine)(realChainId) !== enums_1.ChainEngine.Solana)
102
+ // CRITICAL: response hook must echo back the request hook exactly
103
+ function validateHookEcho(hookPayload, requestHook, basePath) {
104
+ if (!requestHook)
140
105
  return [];
141
- if (hookPayload.hook.type !== enums_1.BundleHookType.Direct)
142
- return [];
143
- return [{
144
- code: types_1.ViolationCode.HookSolanaCannotBeDirect,
145
- message: "Solana hooks cannot be of type 'direct'",
146
- path: `${basePath}.hook.type`,
147
- expected: enums_1.BundleHookType.Delegated,
148
- actual: hookPayload.hook.type,
149
- }];
150
- }
151
- // CRITICAL: response hook must echo back the request hook field-by-field.
152
- // Notes:
153
- // - hook.data in the response has eager placeholders resolved (deferred markers kept).
154
- // We apply the same resolution to request.data and compare.
155
- // - For Solana hooks the API deletes `to` and `value` in the echo; we skip those.
156
- // - For EVM hooks `value` is copied from request as-is (eager resolution is not
157
- // reflected in the echoed value — only in internal txData used by requiredActions).
158
- function validateHookEcho(hookPayload, requestHook, basePath, responseTrades, mode) {
159
- // Missing request counterpart — two shapes, both are MITM-safe:
160
- // (a) preHook with `i >= request.preHooks.length`:
161
- // legitimate case — compensation hook appended by the API.
162
- // MITM case — attacker injects an arbitrary preHook.
163
- // The echo-by-field check can't distinguish them (there's no request
164
- // to compare against), so we delegate to the structural compensation
165
- // check.
166
- // (b) postHook with `i >= request.postHooks.length`:
167
- // no legitimate case — the API never appends to postHooks. So we
168
- // produce a violation.
169
- if (!requestHook) {
170
- if (mode === placeholder_1.HookMode.PostHooks) {
171
- return [{
172
- code: types_1.ViolationCode.UnexpectedPostHook,
173
- message: "response.postHooks contains an entry with no matching"
174
- + " request postHook",
175
- path: `${basePath}.hook`,
176
- actual: hookPayload.hook,
177
- }];
178
- }
179
- return [];
180
- }
181
- const echoed = hookPayload.hook;
182
- const chainId = requestHook.chainId;
183
- const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(chainId);
184
- const isSolana = (0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana;
185
- const hookPath = `${basePath}.hook`;
186
- const violations = [];
187
- // chainId — strict number equality (subscriptionId on both sides)
188
- if (echoed.chainId !== chainId) {
189
- violations.push(echoMismatch(`${hookPath}.chainId`, requestHook.chainId, echoed.chainId));
190
- }
191
- // from — address equality
192
- if (!(0, address_1.addressEquals)(realChainId, echoed.from, requestHook.from)) {
193
- violations.push(echoMismatch(`${hookPath}.from`, requestHook.from, echoed.from));
194
- }
195
- // isAtomic — strict boolean
196
- if (echoed.isAtomic !== requestHook.isAtomic) {
197
- violations.push(echoMismatch(`${hookPath}.isAtomic`, requestHook.isAtomic, echoed.isAtomic));
198
- }
199
- // to, value — chain-dependent.
200
- // Solana: API deletes both from the echo; skip entirely.
201
- // EVM: compare as-is (value is not modified by placeholder resolution).
202
- if (!isSolana) {
203
- violations.push(...compareOptionalAddress(realChainId, `${hookPath}.to`, requestHook.to, echoed.to));
204
- violations.push(...compareOptionalString(`${hookPath}.value`, requestHook.value, echoed.value));
205
- }
206
- // data — eager placeholders are resolved by the API before echoing.
207
- const { resolved: expectedData, errors } = (0, placeholder_1.resolveEagerPlaceholders)(requestHook.data, realChainId, requestHook.placeHolders, responseTrades, mode);
208
- for (const error of errors) {
209
- const reasonText = placeholder_1.PlaceholderResolutionErrorReason[error.reason];
210
- violations.push({
211
- code: types_1.ViolationCode.HookPlaceholderResolutionFailed,
212
- message: `failed to resolve placeholder "${error.nameVariable}"`
213
- + ` (${reasonText})`,
214
- path: `${hookPath}.data`,
215
- actual: { nameVariable: error.nameVariable, reason: reasonText },
216
- details: error.details,
217
- });
218
- }
219
- if (expectedData !== echoed.data) {
220
- violations.push(echoMismatch(`${hookPath}.data`, expectedData, echoed.data));
221
- }
222
- // placeHolders — deep equality via stringify (same source → same serialization).
223
- if (JSON.stringify(echoed.placeHolders)
224
- !== JSON.stringify(requestHook.placeHolders)) {
225
- violations.push(echoMismatch(`${hookPath}.placeHolders`, requestHook.placeHolders, echoed.placeHolders));
226
- }
227
- // gasCompensationInfo — deep equality or both undefined.
228
- if (JSON.stringify(echoed.gasCompensationInfo)
229
- !== JSON.stringify(requestHook.gasCompensationInfo)) {
230
- violations.push(echoMismatch(`${hookPath}.gasCompensationInfo`, requestHook.gasCompensationInfo, echoed.gasCompensationInfo));
231
- }
232
- // type — strict equality (or both undefined).
233
- if (echoed.type !== requestHook.type) {
234
- violations.push(echoMismatch(`${hookPath}.type`, requestHook.type, echoed.type));
235
- }
236
- // gasLimit — strict string equality (or both undefined).
237
- if (echoed.gasLimit !== requestHook.gasLimit) {
238
- violations.push(echoMismatch(`${hookPath}.gasLimit`, requestHook.gasLimit, echoed.gasLimit));
239
- }
240
- return violations;
241
- }
242
- function echoMismatch(path, expected, actual) {
243
- return {
244
- code: types_1.ViolationCode.HookEchoMismatch,
245
- message: "response hook field does not match request",
246
- path,
247
- expected,
248
- actual,
249
- };
250
- }
251
- function compareOptionalString(path, expected, actual) {
252
- if (expected === actual)
253
- return [];
254
- return [echoMismatch(path, expected, actual)];
255
- }
256
- function compareOptionalAddress(chainId, path, expected, actual) {
257
- if (expected === undefined && actual === undefined)
258
- return [];
259
- if (expected === undefined || actual === undefined) {
260
- return [echoMismatch(path, expected, actual)];
261
- }
262
- if (!(0, address_1.addressEquals)(chainId, expected, actual)) {
263
- return [echoMismatch(path, expected, actual)];
106
+ if (JSON.stringify(hookPayload.hook) !== JSON.stringify(requestHook)) {
107
+ return [{
108
+ code: types_1.ViolationCode.HookEchoMismatch,
109
+ message: "response hook does not match request hook",
110
+ path: `${basePath}.hook`,
111
+ expected: requestHook,
112
+ actual: hookPayload.hook,
113
+ }];
264
114
  }
265
115
  return [];
266
116
  }
@@ -288,10 +138,6 @@ function validateHookUniqueActionIds(hookPayload, basePath) {
288
138
  }
289
139
  // HIGH: each hook required action must have exactly one operation: [Hook] or [GasCompensation]
290
140
  function validateHookActionsList(hookPayload, basePath) {
291
- const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(hookPayload.hook.chainId);
292
- const isSolana = (0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana;
293
- const allowedSet = isSolana ? SOLANA_HOOK_OPERATIONS_SET : EVM_HOOK_OPERATIONS_SET;
294
- const allowedList = isSolana ? SOLANA_HOOK_OPERATIONS : EVM_HOOK_OPERATIONS;
295
141
  const violations = [];
296
142
  for (let i = 0; i < hookPayload.requiredActions.length; i++) {
297
143
  const action = hookPayload.requiredActions[i];
@@ -306,85 +152,26 @@ function validateHookActionsList(hookPayload, basePath) {
306
152
  });
307
153
  continue;
308
154
  }
309
- if (!allowedSet.has(action.actions[0])) {
155
+ if (!HOOK_OPERATIONS_SET.has(action.actions[0])) {
310
156
  violations.push({
311
157
  code: types_1.ViolationCode.HookActionsInvalid,
312
158
  message: "hook required action operation must be Hook"
313
159
  + " or GasCompensation",
314
160
  path: `${actionPath}.actions`,
315
- expected: allowedList,
161
+ expected: HOOK_OPERATIONS,
316
162
  actual: action.actions,
317
163
  });
318
164
  }
319
165
  }
320
166
  return violations;
321
167
  }
322
- // HIGH: Delegate-op constraints for EVM hook requiredActions.
323
- // * `Delegate` may appear at most once.
324
- // * If present, it must be the first required action (the API emits
325
- // Sign7702Authorization → Sign712MetaMaskCaveats* in this order).
326
- // * Direct hooks (`hook.type === 'direct'`) must not contain `Delegate`
327
- // (Direct mode skips EIP-7702 delegation entirely).
328
- // Solana hooks bypass this check — `Delegate` is rejected upstream by
329
- // `validateHookActionsList`.
330
- function validateHookDelegateOp(hookPayload, basePath) {
331
- const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(hookPayload.hook.chainId);
332
- if ((0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana)
333
- return [];
334
- const indices = [];
335
- for (let i = 0; i < hookPayload.requiredActions.length; i++) {
336
- const action = hookPayload.requiredActions[i];
337
- const ops = action.actions;
338
- if (ops.includes(enums_1.EvmActionOperation.Delegate)) {
339
- indices.push(i);
340
- }
341
- }
342
- if (indices.length === 0)
343
- return [];
344
- const violations = [];
345
- if (hookPayload.hook.type === enums_1.BundleHookType.Direct) {
346
- violations.push({
347
- code: types_1.ViolationCode.HookDelegateInDirect,
348
- message: "Direct hook must not contain a Delegate operation"
349
- + " (Direct mode skips EIP-7702 delegation)",
350
- path: `${basePath}.requiredActions`,
351
- actual: indices,
352
- });
353
- }
354
- if (indices.length > 1) {
355
- violations.push({
356
- code: types_1.ViolationCode.HookMultipleDelegate,
357
- message: "hook requiredActions must contain at most one Delegate",
358
- path: `${basePath}.requiredActions`,
359
- expected: 1,
360
- actual: indices,
361
- });
362
- }
363
- if (indices[0] !== 0) {
364
- violations.push({
365
- code: types_1.ViolationCode.HookDelegateNotFirst,
366
- message: "if Delegate is present in hook requiredActions, it must be"
367
- + " the first action",
368
- path: `${basePath}.requiredActions[${indices[0]}]`,
369
- expected: 0,
370
- actual: indices[0],
371
- });
372
- }
373
- return violations;
374
- }
375
168
  // CRITICAL: GasCompensation must only appear when gasCompensationInfo exists
376
169
  function validateGasCompensationRequiresInfo(hookPayload, basePath, request) {
377
170
  const hasGasCompensationInfo = (request.preHooks ?? []).some(h => h.gasCompensationInfo !== undefined);
378
- const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(hookPayload.hook.chainId);
379
- const isSolana = (0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana;
380
- const gasCompensationOp = isSolana
381
- ? enums_1.SolanaActionOperation.GasCompensation
382
- : enums_1.EvmActionOperation.GasCompensation;
383
171
  const violations = [];
384
172
  for (let i = 0; i < hookPayload.requiredActions.length; i++) {
385
173
  const action = hookPayload.requiredActions[i];
386
- const hasGasCompensation = action.actions
387
- .includes(gasCompensationOp);
174
+ const hasGasCompensation = action.actions.includes("GasCompensation");
388
175
  if (hasGasCompensation && !hasGasCompensationInfo) {
389
176
  violations.push({
390
177
  code: types_1.ViolationCode.HookGasCompensationWithoutInfo,
@@ -397,20 +184,18 @@ function validateGasCompensationRequiresInfo(hookPayload, basePath, request) {
397
184
  }
398
185
  return violations;
399
186
  }
400
- function dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request, mode, responseTrades) {
401
- const realChainId = (0, subscription_to_chain_id_1.resolveChainIdOrSelf)(hookPayload.hook.chainId);
402
- if ((0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana) {
187
+ function dispatchChainSpecificValidation(hookPayload, requestHook, basePath, quoteMode, request) {
188
+ const chainId = hookPayload.hook.chainId;
189
+ if (chainId === enums_1.ChainId.Solana) {
403
190
  const srcChainAuthorityAddress = findSolanaSrcChainAuthority(request);
404
- return (0, solana_hook_1.validateSolanaHookActions)(hookPayload, requestHook, basePath, quoteMode, srcChainAuthorityAddress, request, realChainId, mode, responseTrades);
191
+ return (0, solana_hook_1.validateSolanaHookActions)(hookPayload, requestHook, basePath, quoteMode, srcChainAuthorityAddress, request);
405
192
  }
406
- return (0, evm_op_hook_1.validateEvmHookActions)(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request);
193
+ // AI: EVM hook validation dispatch will go here when implemented
194
+ return [];
407
195
  }
408
196
  function findSolanaSrcChainAuthority(request) {
409
197
  for (const trade of request.trades) {
410
- const realChainId = (0, subscription_to_chain_id_1.resolveChainId)(trade.srcChainId);
411
- if (realChainId === undefined)
412
- continue;
413
- if ((0, address_1.getChainEngine)(realChainId) === enums_1.ChainEngine.Solana) {
198
+ if (trade.srcChainId === enums_1.ChainId.Solana) {
414
199
  return trade.srcChainAuthorityAddress;
415
200
  }
416
201
  }