@debridge-finance/borderless-validation-sdk 0.0.1 → 0.0.3

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 (292) hide show
  1. package/README.md +164 -0
  2. package/dist/cjs/helpers/address.js +53 -18
  3. package/dist/cjs/helpers/address.js.map +1 -1
  4. package/dist/cjs/helpers/evm-action.js +3 -3
  5. package/dist/cjs/helpers/evm-action.js.map +1 -1
  6. package/dist/cjs/helpers/evm-dln-hook-pack.js +87 -0
  7. package/dist/cjs/helpers/evm-dln-hook-pack.js.map +1 -0
  8. package/dist/cjs/helpers/evm-gas-compensation-tx.js +102 -0
  9. package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -0
  10. package/dist/cjs/helpers/evm-intent-id.js +27 -13
  11. package/dist/cjs/helpers/evm-intent-id.js.map +1 -1
  12. package/dist/cjs/helpers/evm-trade-amounts.js +36 -1
  13. package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
  14. package/dist/cjs/helpers/gas-compensation.js +36 -0
  15. package/dist/cjs/helpers/gas-compensation.js.map +1 -0
  16. package/dist/cjs/helpers/hex.js +24 -0
  17. package/dist/cjs/helpers/hex.js.map +1 -0
  18. package/dist/cjs/helpers/placeholder.js +174 -0
  19. package/dist/cjs/helpers/placeholder.js.map +1 -0
  20. package/dist/cjs/helpers/sets.js +13 -0
  21. package/dist/cjs/helpers/sets.js.map +1 -0
  22. package/dist/cjs/types/enums.js +51 -2
  23. package/dist/cjs/types/enums.js.map +1 -1
  24. package/dist/cjs/types/request.js +36 -3
  25. package/dist/cjs/types/request.js.map +1 -1
  26. package/dist/cjs/types/response.js +126 -6
  27. package/dist/cjs/types/response.js.map +1 -1
  28. package/dist/cjs/types/validation.js +82 -10
  29. package/dist/cjs/types/validation.js.map +1 -1
  30. package/dist/cjs/validations/compensation-hook.js +203 -0
  31. package/dist/cjs/validations/compensation-hook.js.map +1 -0
  32. package/dist/cjs/validations/evm-caveats.js +4 -14
  33. package/dist/cjs/validations/evm-caveats.js.map +1 -1
  34. package/dist/cjs/validations/evm-op-budget.js +13 -10
  35. package/dist/cjs/validations/evm-op-budget.js.map +1 -1
  36. package/dist/cjs/validations/evm-op-hook.js +410 -3
  37. package/dist/cjs/validations/evm-op-hook.js.map +1 -1
  38. package/dist/cjs/validations/evm-op-wrap.js +10 -7
  39. package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
  40. package/dist/cjs/validations/evm-required-actions.js +7 -9
  41. package/dist/cjs/validations/evm-required-actions.js.map +1 -1
  42. package/dist/cjs/validations/evm-sign712-metamask.js +17 -94
  43. package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
  44. package/dist/cjs/validations/evm-sign712-shared.js +116 -0
  45. package/dist/cjs/validations/evm-sign712-shared.js.map +1 -0
  46. package/dist/cjs/validations/evm-sign7702.js +34 -22
  47. package/dist/cjs/validations/evm-sign7702.js.map +1 -1
  48. package/dist/cjs/validations/hooks-common.js +252 -37
  49. package/dist/cjs/validations/hooks-common.js.map +1 -1
  50. package/dist/cjs/validations/intent-destinations.js +197 -0
  51. package/dist/cjs/validations/intent-destinations.js.map +1 -0
  52. package/dist/cjs/validations/intent-tokens.js +357 -0
  53. package/dist/cjs/validations/intent-tokens.js.map +1 -0
  54. package/dist/cjs/validations/intent.js +288 -0
  55. package/dist/cjs/validations/intent.js.map +1 -0
  56. package/dist/cjs/validations/required-actions.js +7 -7
  57. package/dist/cjs/validations/required-actions.js.map +1 -1
  58. package/dist/cjs/validations/solana-hook.js +33 -22
  59. package/dist/cjs/validations/solana-hook.js.map +1 -1
  60. package/dist/cjs/validations/solana-op-budget.js +56 -18
  61. package/dist/cjs/validations/solana-op-budget.js.map +1 -1
  62. package/dist/cjs/validations/solana-op-wrap.js +46 -13
  63. package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
  64. package/dist/cjs/validations/solana-required-actions.js +3 -3
  65. package/dist/cjs/validations/solana-required-actions.js.map +1 -1
  66. package/dist/cjs/validations/solana-transaction.js +5 -5
  67. package/dist/cjs/validations/solana-transaction.js.map +1 -1
  68. package/dist/cjs/validations/trade-grouping.js +139 -1
  69. package/dist/cjs/validations/trade-grouping.js.map +1 -1
  70. package/dist/cjs/validations/trades.js +168 -40
  71. package/dist/cjs/validations/trades.js.map +1 -1
  72. package/dist/cjs/validator.js +41 -15
  73. package/dist/cjs/validator.js.map +1 -1
  74. package/dist/cjs/whitelists/api-endpoints.js +10 -0
  75. package/dist/cjs/whitelists/api-endpoints.js.map +1 -0
  76. package/dist/cjs/whitelists/environment-config.js +47 -28
  77. package/dist/cjs/whitelists/environment-config.js.map +1 -1
  78. package/dist/cjs/whitelists/evm/caveat-enforcers.js +21 -5
  79. package/dist/cjs/whitelists/evm/caveat-enforcers.js.map +1 -1
  80. package/dist/cjs/whitelists/evm/delegation-manager.js +7 -2
  81. package/dist/cjs/whitelists/evm/delegation-manager.js.map +1 -1
  82. package/dist/cjs/whitelists/evm/eip7702-delegation.js +7 -2
  83. package/dist/cjs/whitelists/evm/eip7702-delegation.js.map +1 -1
  84. package/dist/cjs/whitelists/evm/index.js +14 -1
  85. package/dist/cjs/whitelists/evm/index.js.map +1 -1
  86. package/dist/cjs/whitelists/evm/metamask-delegation-chains.js +16 -0
  87. package/dist/cjs/whitelists/evm/metamask-delegation-chains.js.map +1 -0
  88. package/dist/cjs/whitelists/evm/permit2.js +16 -12
  89. package/dist/cjs/whitelists/evm/permit2.js.map +1 -1
  90. package/dist/cjs/whitelists/evm/weth.js +16 -5
  91. package/dist/cjs/whitelists/evm/weth.js.map +1 -1
  92. package/dist/cjs/whitelists/solana/intent-signature.js +0 -1
  93. package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
  94. package/dist/cjs/whitelists/subscription-to-chain-id.js +10 -0
  95. package/dist/cjs/whitelists/subscription-to-chain-id.js.map +1 -1
  96. package/dist/cjs/whitelists/types.js +13 -3
  97. package/dist/cjs/whitelists/types.js.map +1 -1
  98. package/dist/esm/helpers/address.js +48 -17
  99. package/dist/esm/helpers/address.js.map +1 -1
  100. package/dist/esm/helpers/evm-action.js +3 -3
  101. package/dist/esm/helpers/evm-action.js.map +1 -1
  102. package/dist/esm/helpers/evm-dln-hook-pack.js +82 -0
  103. package/dist/esm/helpers/evm-dln-hook-pack.js.map +1 -0
  104. package/dist/esm/helpers/evm-gas-compensation-tx.js +99 -0
  105. package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -0
  106. package/dist/esm/helpers/evm-intent-id.js +27 -13
  107. package/dist/esm/helpers/evm-intent-id.js.map +1 -1
  108. package/dist/esm/helpers/evm-trade-amounts.js +36 -1
  109. package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
  110. package/dist/esm/helpers/gas-compensation.js +33 -0
  111. package/dist/esm/helpers/gas-compensation.js.map +1 -0
  112. package/dist/esm/helpers/hex.js +20 -0
  113. package/dist/esm/helpers/hex.js.map +1 -0
  114. package/dist/esm/helpers/placeholder.js +168 -0
  115. package/dist/esm/helpers/placeholder.js.map +1 -0
  116. package/dist/esm/helpers/sets.js +10 -0
  117. package/dist/esm/helpers/sets.js.map +1 -0
  118. package/dist/esm/types/enums.js +50 -1
  119. package/dist/esm/types/enums.js.map +1 -1
  120. package/dist/esm/types/request.js +37 -4
  121. package/dist/esm/types/request.js.map +1 -1
  122. package/dist/esm/types/response.js +126 -6
  123. package/dist/esm/types/response.js.map +1 -1
  124. package/dist/esm/types/validation.js +82 -10
  125. package/dist/esm/types/validation.js.map +1 -1
  126. package/dist/esm/validations/compensation-hook.js +200 -0
  127. package/dist/esm/validations/compensation-hook.js.map +1 -0
  128. package/dist/esm/validations/evm-caveats.js +4 -14
  129. package/dist/esm/validations/evm-caveats.js.map +1 -1
  130. package/dist/esm/validations/evm-op-budget.js +13 -10
  131. package/dist/esm/validations/evm-op-budget.js.map +1 -1
  132. package/dist/esm/validations/evm-op-hook.js +409 -2
  133. package/dist/esm/validations/evm-op-hook.js.map +1 -1
  134. package/dist/esm/validations/evm-op-wrap.js +10 -7
  135. package/dist/esm/validations/evm-op-wrap.js.map +1 -1
  136. package/dist/esm/validations/evm-required-actions.js +7 -9
  137. package/dist/esm/validations/evm-required-actions.js.map +1 -1
  138. package/dist/esm/validations/evm-sign712-metamask.js +17 -94
  139. package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
  140. package/dist/esm/validations/evm-sign712-shared.js +110 -0
  141. package/dist/esm/validations/evm-sign712-shared.js.map +1 -0
  142. package/dist/esm/validations/evm-sign7702.js +33 -22
  143. package/dist/esm/validations/evm-sign7702.js.map +1 -1
  144. package/dist/esm/validations/hooks-common.js +251 -38
  145. package/dist/esm/validations/hooks-common.js.map +1 -1
  146. package/dist/esm/validations/intent-destinations.js +194 -0
  147. package/dist/esm/validations/intent-destinations.js.map +1 -0
  148. package/dist/esm/validations/intent-tokens.js +354 -0
  149. package/dist/esm/validations/intent-tokens.js.map +1 -0
  150. package/dist/esm/validations/intent.js +285 -0
  151. package/dist/esm/validations/intent.js.map +1 -0
  152. package/dist/esm/validations/required-actions.js +7 -7
  153. package/dist/esm/validations/required-actions.js.map +1 -1
  154. package/dist/esm/validations/solana-hook.js +35 -24
  155. package/dist/esm/validations/solana-hook.js.map +1 -1
  156. package/dist/esm/validations/solana-op-budget.js +56 -18
  157. package/dist/esm/validations/solana-op-budget.js.map +1 -1
  158. package/dist/esm/validations/solana-op-wrap.js +47 -14
  159. package/dist/esm/validations/solana-op-wrap.js.map +1 -1
  160. package/dist/esm/validations/solana-required-actions.js +3 -3
  161. package/dist/esm/validations/solana-required-actions.js.map +1 -1
  162. package/dist/esm/validations/solana-transaction.js +7 -7
  163. package/dist/esm/validations/solana-transaction.js.map +1 -1
  164. package/dist/esm/validations/trade-grouping.js +139 -1
  165. package/dist/esm/validations/trade-grouping.js.map +1 -1
  166. package/dist/esm/validations/trades.js +169 -41
  167. package/dist/esm/validations/trades.js.map +1 -1
  168. package/dist/esm/validator.js +41 -15
  169. package/dist/esm/validator.js.map +1 -1
  170. package/dist/esm/whitelists/api-endpoints.js +7 -0
  171. package/dist/esm/whitelists/api-endpoints.js.map +1 -0
  172. package/dist/esm/whitelists/environment-config.js +47 -28
  173. package/dist/esm/whitelists/environment-config.js.map +1 -1
  174. package/dist/esm/whitelists/evm/caveat-enforcers.js +20 -4
  175. package/dist/esm/whitelists/evm/caveat-enforcers.js.map +1 -1
  176. package/dist/esm/whitelists/evm/delegation-manager.js +6 -1
  177. package/dist/esm/whitelists/evm/delegation-manager.js.map +1 -1
  178. package/dist/esm/whitelists/evm/eip7702-delegation.js +6 -1
  179. package/dist/esm/whitelists/evm/eip7702-delegation.js.map +1 -1
  180. package/dist/esm/whitelists/evm/index.js +4 -4
  181. package/dist/esm/whitelists/evm/index.js.map +1 -1
  182. package/dist/esm/whitelists/evm/metamask-delegation-chains.js +13 -0
  183. package/dist/esm/whitelists/evm/metamask-delegation-chains.js.map +1 -0
  184. package/dist/esm/whitelists/evm/permit2.js +9 -5
  185. package/dist/esm/whitelists/evm/permit2.js.map +1 -1
  186. package/dist/esm/whitelists/evm/weth.js +16 -5
  187. package/dist/esm/whitelists/evm/weth.js.map +1 -1
  188. package/dist/esm/whitelists/solana/intent-signature.js +0 -1
  189. package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
  190. package/dist/esm/whitelists/subscription-to-chain-id.js +9 -0
  191. package/dist/esm/whitelists/subscription-to-chain-id.js.map +1 -1
  192. package/dist/esm/whitelists/types.js +14 -5
  193. package/dist/esm/whitelists/types.js.map +1 -1
  194. package/dist/types/helpers/address.d.ts +7 -7
  195. package/dist/types/helpers/address.d.ts.map +1 -1
  196. package/dist/types/helpers/evm-dln-hook-pack.d.ts +19 -0
  197. package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +1 -0
  198. package/dist/types/helpers/evm-gas-compensation-tx.d.ts +13 -0
  199. package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -0
  200. package/dist/types/helpers/evm-intent-id.d.ts.map +1 -1
  201. package/dist/types/helpers/evm-trade-amounts.d.ts +2 -2
  202. package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
  203. package/dist/types/helpers/gas-compensation.d.ts +10 -0
  204. package/dist/types/helpers/gas-compensation.d.ts.map +1 -0
  205. package/dist/types/helpers/hex.d.ts +3 -0
  206. package/dist/types/helpers/hex.d.ts.map +1 -0
  207. package/dist/types/helpers/placeholder.d.ts +41 -0
  208. package/dist/types/helpers/placeholder.d.ts.map +1 -0
  209. package/dist/types/helpers/sets.d.ts +2 -0
  210. package/dist/types/helpers/sets.d.ts.map +1 -0
  211. package/dist/types/types/enums.d.ts +39 -1
  212. package/dist/types/types/enums.d.ts.map +1 -1
  213. package/dist/types/types/request.d.ts +21 -11
  214. package/dist/types/types/request.d.ts.map +1 -1
  215. package/dist/types/types/response.d.ts +1019 -21
  216. package/dist/types/types/response.d.ts.map +1 -1
  217. package/dist/types/types/validation.d.ts +74 -11
  218. package/dist/types/types/validation.d.ts.map +1 -1
  219. package/dist/types/validations/compensation-hook.d.ts +3 -0
  220. package/dist/types/validations/compensation-hook.d.ts.map +1 -0
  221. package/dist/types/validations/evm-caveats.d.ts.map +1 -1
  222. package/dist/types/validations/evm-op-budget.d.ts +2 -2
  223. package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
  224. package/dist/types/validations/evm-op-hook.d.ts +4 -2
  225. package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
  226. package/dist/types/validations/evm-op-wrap.d.ts +2 -2
  227. package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
  228. package/dist/types/validations/evm-required-actions.d.ts +2 -2
  229. package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
  230. package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
  231. package/dist/types/validations/evm-sign712-shared.d.ts +7 -0
  232. package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -0
  233. package/dist/types/validations/evm-sign7702.d.ts +2 -1
  234. package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
  235. package/dist/types/validations/hooks-common.d.ts +1 -0
  236. package/dist/types/validations/hooks-common.d.ts.map +1 -1
  237. package/dist/types/validations/intent-destinations.d.ts +4 -0
  238. package/dist/types/validations/intent-destinations.d.ts.map +1 -0
  239. package/dist/types/validations/intent-tokens.d.ts +4 -0
  240. package/dist/types/validations/intent-tokens.d.ts.map +1 -0
  241. package/dist/types/validations/intent.d.ts +5 -0
  242. package/dist/types/validations/intent.d.ts.map +1 -0
  243. package/dist/types/validations/required-actions.d.ts +2 -1
  244. package/dist/types/validations/required-actions.d.ts.map +1 -1
  245. package/dist/types/validations/solana-hook.d.ts +4 -2
  246. package/dist/types/validations/solana-hook.d.ts.map +1 -1
  247. package/dist/types/validations/solana-op-budget.d.ts +2 -2
  248. package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
  249. package/dist/types/validations/solana-op-wrap.d.ts +2 -2
  250. package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
  251. package/dist/types/validations/solana-required-actions.d.ts +2 -2
  252. package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
  253. package/dist/types/validations/solana-transaction.d.ts +3 -3
  254. package/dist/types/validations/solana-transaction.d.ts.map +1 -1
  255. package/dist/types/validations/trade-grouping.d.ts +6 -2
  256. package/dist/types/validations/trade-grouping.d.ts.map +1 -1
  257. package/dist/types/validations/trades.d.ts.map +1 -1
  258. package/dist/types/validator.d.ts.map +1 -1
  259. package/dist/types/whitelists/api-endpoints.d.ts +2 -0
  260. package/dist/types/whitelists/api-endpoints.d.ts.map +1 -0
  261. package/dist/types/whitelists/environment-config.d.ts.map +1 -1
  262. package/dist/types/whitelists/evm/caveat-enforcers.d.ts +8 -0
  263. package/dist/types/whitelists/evm/caveat-enforcers.d.ts.map +1 -1
  264. package/dist/types/whitelists/evm/delegation-manager.d.ts +2 -0
  265. package/dist/types/whitelists/evm/delegation-manager.d.ts.map +1 -1
  266. package/dist/types/whitelists/evm/eip7702-delegation.d.ts +2 -0
  267. package/dist/types/whitelists/evm/eip7702-delegation.d.ts.map +1 -1
  268. package/dist/types/whitelists/evm/index.d.ts +4 -4
  269. package/dist/types/whitelists/evm/index.d.ts.map +1 -1
  270. package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts +3 -0
  271. package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts.map +1 -0
  272. package/dist/types/whitelists/evm/permit2.d.ts +1 -0
  273. package/dist/types/whitelists/evm/permit2.d.ts.map +1 -1
  274. package/dist/types/whitelists/evm/weth.d.ts.map +1 -1
  275. package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
  276. package/dist/types/whitelists/subscription-to-chain-id.d.ts +1 -0
  277. package/dist/types/whitelists/subscription-to-chain-id.d.ts.map +1 -1
  278. package/dist/types/whitelists/types.d.ts +1 -1
  279. package/dist/types/whitelists/types.d.ts.map +1 -1
  280. package/package.json +4 -3
  281. package/dist/cjs/helpers/constants.js +0 -6
  282. package/dist/cjs/helpers/constants.js.map +0 -1
  283. package/dist/cjs/validations/evm-op-gas-compensation.js +0 -152
  284. package/dist/cjs/validations/evm-op-gas-compensation.js.map +0 -1
  285. package/dist/esm/helpers/constants.js +0 -3
  286. package/dist/esm/helpers/constants.js.map +0 -1
  287. package/dist/esm/validations/evm-op-gas-compensation.js +0 -149
  288. package/dist/esm/validations/evm-op-gas-compensation.js.map +0 -1
  289. package/dist/types/helpers/constants.d.ts +0 -2
  290. package/dist/types/helpers/constants.d.ts.map +0 -1
  291. package/dist/types/validations/evm-op-gas-compensation.d.ts +0 -3
  292. package/dist/types/validations/evm-op-gas-compensation.d.ts.map +0 -1
package/README.md ADDED
@@ -0,0 +1,164 @@
1
+ # @debridge-finance/borderless-validation-sdk
2
+
3
+ Validation SDK for deBridge **borderless intents** API (`POST /v1.0/bundle`) responses.
4
+
5
+ ## Purpose
6
+
7
+ When a user submits a bundle request to the deBridge API, the response contains transactions and signable payloads (EIP-712 messages, permits, Solana transactions, etc.) that the user is expected to sign.
8
+
9
+ **Every field the user signs is a potential attack vector.** If the API is compromised (MITM, server bug, malicious rewrite), the user could unknowingly sign a transaction that drains their funds.
10
+
11
+ This SDK runs on the client and independently verifies that every signable field in the response matches the original request — before the user signs anything.
12
+
13
+ ### Threats mitigated
14
+
15
+ - **MITM attacks** against the API endpoint.
16
+ - **Bugs on the API side** that produce subtly wrong responses.
17
+ - **Reduced API trust** — the client no longer has to take API responses on faith.
18
+ - **Regression safety net** when testing new API versions.
19
+
20
+ ## Installation
21
+
22
+ ```bash
23
+ npm install @debridge-finance/borderless-validation-sdk
24
+ ```
25
+
26
+ Peer dependencies:
27
+
28
+ ```bash
29
+ npm install viem zod bs58 @solana/web3.js
30
+ ```
31
+
32
+ ## Basic usage
33
+
34
+ ```ts
35
+ import { createValidator, Environment } from "@debridge-finance/borderless-validation-sdk";
36
+
37
+ const validator = createValidator({ environment: Environment.Prod });
38
+
39
+ const url = "https://cross-chain-api.debridge.finance/v1.0/bundle";
40
+
41
+ const response = await fetch(url, {
42
+ method: "POST",
43
+ headers: { "Content-Type": "application/json" },
44
+ body: JSON.stringify(request),
45
+ }).then(res => res.json());
46
+
47
+ const result = validator.validate(url, request, response);
48
+
49
+ if (!result.ok) {
50
+ console.error("Validation failed:", result.violations);
51
+ // Do NOT let the user sign anything.
52
+ return;
53
+ }
54
+
55
+ // Safe to proceed with signing.
56
+ ```
57
+
58
+ ### API
59
+
60
+ ```ts
61
+ createValidator(config: { environment: Environment }): Validator
62
+
63
+ type Validator = {
64
+ validate(url: string, request: object, response: object): ValidationResult;
65
+ };
66
+
67
+ type ValidationResult = {
68
+ ok: boolean; // true if no violations
69
+ violations: Violation[]; // all issues found
70
+ };
71
+
72
+ type Violation = {
73
+ code: ViolationCode; // machine-readable identifier
74
+ message: string; // human-readable description
75
+ path: string; // JSON path of the offending field
76
+ expected?: unknown;
77
+ actual?: unknown;
78
+ details?: unknown;
79
+ };
80
+ ```
81
+
82
+ `validator.validate()` **never throws** — every error condition is reported as a `Violation`. Safe to call in any code path.
83
+
84
+ ## Integration guide for UI teams
85
+
86
+ The SDK is designed to run **between** receiving the API response and presenting it to the user for signing. Wire it into that seam.
87
+
88
+ ### 1. Where to call
89
+
90
+ ```
91
+ ┌──────────────┐ ┌─────────┐ ┌─────────────────-─┐ ┌──────────────┐
92
+ │ Build request│ ──▶ │ fetch() │ ──▶ │ validator.validate│ ──▶ │ Sign / submit│
93
+ └──────────────┘ └─────────┘ └──────────────────-┘ └──────────────┘
94
+ │
95
+ ▼
96
+ ok ? proceed : block
97
+ ```
98
+
99
+ - **Before `validate`:** the user has not yet seen or signed anything.
100
+ - **After `validate`:** if `result.ok === false`, **do not forward any signable payload** (intent message, permit, transaction) to the wallet. The API response cannot be trusted.
101
+
102
+ ### 2. Choosing the environment
103
+
104
+ ```ts
105
+ import { Environment } from "@debridge-finance/borderless-validation-sdk";
106
+ ```
107
+
108
+ - `Environment.Prod` — production.
109
+ - `Environment.Hanoi`, `Environment.Dubai`, `Environment.Madrid` — non-prod deployments (may have empty whitelists; ask the SDK team before use).
110
+
111
+ Pass the same environment your app is already configured for — don't make it user-selectable.
112
+
113
+ ### 3. Pass the exact URL you called
114
+
115
+ ```ts
116
+ const url = "https://cross-chain-api.debridge.finance/v1.0/bundle";
117
+ const response = await fetch(url, { ... });
118
+ const result = validator.validate(url, request, response);
119
+ ```
120
+
121
+ The `url` argument is checked against a per-environment whitelist. Passing a hardcoded constant defeats the check — pass the same string you handed to `fetch`.
122
+
123
+ ### 4. Handling violations
124
+
125
+ On `result.ok === false`:
126
+
127
+ 1. **Block the signing flow.** Do not show a wallet popup or write any pending tx to state.
128
+ 2. **Log the full `violations` array** to your error reporting system (Sentry / Datadog / etc.). Include `code`, `path`, `expected`, `actual`, `details`.
129
+ 3. **Show the user a generic error.** Do not leak raw `Violation` data into the UI — messages are for developers, not end-users. A single "Quote is invalid, please retry" is enough.
130
+ 4. **Do not retry automatically.** If the API is compromised, retries make it worse. Let the user manually trigger a retry.
131
+
132
+ ### 5. Browser compatibility
133
+
134
+ The SDK is published as both CJS and ESM and uses only browser-compatible APIs (no `fs`, `crypto`, `Buffer`, `process`). It has been smoke-tested in a plain `<script type="module">` environment — see [`tmp/front/`](./tmp/front/) for a minimal example.
135
+
136
+ Tree-shaking: the ESM build preserves named exports. Importing only `createValidator` will not pull in unused validators.
137
+
138
+ ### 6. Bundle size
139
+
140
+ Roughly 1 MB unpacked (a lot of it is source maps — drop them in production). The heaviest peer dep is `@solana/web3.js`; if your app only deals with EVM trades, your bundler's tree-shaking should eliminate most of it.
141
+
142
+ ### 7. TypeScript
143
+
144
+ Full type declarations ship in `dist/types/`. `ValidatorConfig`, `ValidationResult`, `Violation`, and `ViolationCode` are all exported — use them directly, don't re-declare.
145
+
146
+ ### 8. What NOT to do
147
+
148
+ - ❌ **Don't skip validation** because "the API is our own." Compromise detection is the whole point.
149
+ - ❌ **Don't mutate `request` or `response`** between the API call and `validate()` — the validator needs the exact payload the user received.
150
+ - ❌ **Don't interpret `violations[].message` programmatically** — message wording may change between versions. Branch on `code` instead.
151
+ - ❌ **Don't cache the validator if `environment` changes.** Create a new instance via `createValidator` for each environment.
152
+
153
+ ## Development
154
+
155
+ See [`CLAUDE.md`](./CLAUDE.md) for project conventions, validation rules, and security guidelines.
156
+
157
+ - Unit tests: `npm test`
158
+ - Coverage: `npm run coverage`
159
+ - E2E tests (hit the staging API): `npm run test:e2e`
160
+ - Build: `npm run build`
161
+
162
+ ## License
163
+
164
+ BUSL-1.1
@@ -3,12 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.AddressFormat = exports.TRON_NATIVE_ADDRESS = void 0;
7
- exports.getAddressFormat = getAddressFormat;
6
+ exports.TRON_NATIVE_ADDRESS = void 0;
7
+ exports.getChainEngine = getChainEngine;
8
8
  exports.isTronAddress = isTronAddress;
9
9
  exports.tronAddressToEvmHex = tronAddressToEvmHex;
10
10
  exports.normalizeAddress = normalizeAddress;
11
+ exports.detectChainEngine = detectChainEngine;
12
+ exports.normalizeAddressByValue = normalizeAddressByValue;
11
13
  exports.addressEquals = addressEquals;
14
+ exports.addressToHex = addressToHex;
15
+ exports.addressToHexByValue = addressToHexByValue;
12
16
  exports.isNativeToken = isNativeToken;
13
17
  const viem_1 = require("viem");
14
18
  const bs58_1 = __importDefault(require("bs58"));
@@ -16,18 +20,12 @@ const enums_1 = require("../types/enums");
16
20
  const solana_1 = require("../whitelists/solana");
17
21
  // Tron-specific addresses (Base58Check format)
18
22
  exports.TRON_NATIVE_ADDRESS = "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb";
19
- var AddressFormat;
20
- (function (AddressFormat) {
21
- AddressFormat[AddressFormat["EVM"] = 0] = "EVM";
22
- AddressFormat[AddressFormat["Tron"] = 1] = "Tron";
23
- AddressFormat[AddressFormat["Solana"] = 2] = "Solana";
24
- })(AddressFormat || (exports.AddressFormat = AddressFormat = {}));
25
- function getAddressFormat(chainId) {
23
+ function getChainEngine(chainId) {
26
24
  if (chainId === enums_1.ChainId.Tron)
27
- return AddressFormat.Tron;
25
+ return enums_1.ChainEngine.Tron;
28
26
  if (chainId === enums_1.ChainId.Solana)
29
- return AddressFormat.Solana;
30
- return AddressFormat.EVM;
27
+ return enums_1.ChainEngine.Solana;
28
+ return enums_1.ChainEngine.EVM;
31
29
  }
32
30
  function isTronAddress(address) {
33
31
  if (!address)
@@ -50,10 +48,26 @@ function tronAddressToEvmHex(tronAddress) {
50
48
  const addressBytes = decoded.slice(1, 21);
51
49
  return (0, viem_1.bytesToHex)(addressBytes);
52
50
  }
53
- // Normalizes address for comparison based on chain format
51
+ // Normalizes address for comparison based on chain engine
54
52
  function normalizeAddress(chainId, address) {
55
- const format = getAddressFormat(chainId);
56
- if (format === AddressFormat.Tron || format === AddressFormat.Solana) {
53
+ const engine = getChainEngine(chainId);
54
+ return applyEngineNormalization(address, engine);
55
+ }
56
+ // Detects the chain engine from the address value alone (no chainId required).
57
+ // Useful when a chain is not fixed (e.g. destinationChainIds = "any").
58
+ function detectChainEngine(address) {
59
+ if (address.startsWith("0x"))
60
+ return enums_1.ChainEngine.EVM;
61
+ if (isTronAddress(address))
62
+ return enums_1.ChainEngine.Tron;
63
+ return enums_1.ChainEngine.Solana;
64
+ }
65
+ // Normalizes an address using only its own value — no chainId needed.
66
+ function normalizeAddressByValue(address) {
67
+ return applyEngineNormalization(address, detectChainEngine(address));
68
+ }
69
+ function applyEngineNormalization(address, engine) {
70
+ if (engine === enums_1.ChainEngine.Tron || engine === enums_1.ChainEngine.Solana) {
57
71
  return address; // case-sensitive
58
72
  }
59
73
  return address.toLowerCase(); // EVM: case-insensitive
@@ -62,12 +76,33 @@ function normalizeAddress(chainId, address) {
62
76
  function addressEquals(chainId, a, b) {
63
77
  return normalizeAddress(chainId, a) === normalizeAddress(chainId, b);
64
78
  }
65
- // Checks if address is native token for the given chain
79
+ // Raw byte representation, used when an address flows into the intent ID
80
+ // keccak256 hash. EVM → 20 bytes, Tron → 20 bytes (after stripping 0x41
81
+ // prefix and checksum), Solana → 32 bytes (base58, no checksum).
82
+ function addressToHex(chainId, address) {
83
+ return applyEngineToHex(address, getChainEngine(chainId));
84
+ }
85
+ // Same as addressToHex but infers the engine from the address value alone.
86
+ // Use when the chainId is unknown (e.g. destinationChainIds = "any").
87
+ function addressToHexByValue(address) {
88
+ return applyEngineToHex(address, detectChainEngine(address));
89
+ }
90
+ function applyEngineToHex(address, engine) {
91
+ if (engine === enums_1.ChainEngine.EVM) {
92
+ return address.toLowerCase();
93
+ }
94
+ if (engine === enums_1.ChainEngine.Tron) {
95
+ return tronAddressToEvmHex(address);
96
+ }
97
+ return (0, viem_1.bytesToHex)(bs58_1.default.decode(address));
98
+ }
99
+ // Checks if address is the native token for the given chain.
66
100
  function isNativeToken(address, chainId) {
67
- if (chainId === enums_1.ChainId.Tron) {
101
+ const engine = getChainEngine(chainId);
102
+ if (engine === enums_1.ChainEngine.Tron) {
68
103
  return address === exports.TRON_NATIVE_ADDRESS;
69
104
  }
70
- if (chainId === enums_1.ChainId.Solana) {
105
+ if (engine === enums_1.ChainEngine.Solana) {
71
106
  return address === solana_1.SYSTEM_PROGRAM;
72
107
  }
73
108
  return address.toLowerCase() === viem_1.zeroAddress;
@@ -1 +1 @@
1
- {"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/helpers/address.ts"],"names":[],"mappings":";;;;;;AAcA,4CAIC;AAED,sCAOC;AAKD,kDAKC;AAGD,4CAMC;AAGD,sCAEC;AAGD,sCAQC;AA9DD,+BAA+C;AAC/C,gDAAwB;AACxB,0CAAyC;AACzC,iDAAsD;AAEtD,+CAA+C;AAClC,QAAA,mBAAmB,GAAG,oCAAoC,CAAC;AAExE,IAAY,aAIX;AAJD,WAAY,aAAa;IACrB,+CAAG,CAAA;IACH,iDAAI,CAAA;IACJ,qDAAM,CAAA;AACV,CAAC,EAJW,aAAa,6BAAb,aAAa,QAIxB;AAED,SAAgB,gBAAgB,CAAC,OAAe;IAC5C,IAAI,OAAO,KAAK,eAAO,CAAC,IAAI;QAAE,OAAO,aAAa,CAAC,IAAI,CAAC;IACxD,IAAI,OAAO,KAAK,eAAO,CAAC,MAAM;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC;IAC5D,OAAO,aAAa,CAAC,GAAG,CAAC;AAC7B,CAAC;AAED,SAAgB,aAAa,CAAC,OAAe;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACxC,4DAA4D;IAC5D,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,8DAA8D;AAC9D,4EAA4E;AAC5E,oEAAoE;AACpE,SAAgB,mBAAmB,CAAC,WAAmB;IACnD,MAAM,OAAO,GAAG,cAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACzC,4DAA4D;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,IAAA,iBAAU,EAAC,YAAY,CAAC,CAAC;AACpC,CAAC;AAED,0DAA0D;AAC1D,SAAgB,gBAAgB,CAAC,OAAe,EAAE,OAAe;IAC7D,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,MAAM,KAAK,aAAa,CAAC,IAAI,IAAI,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QACnE,OAAO,OAAO,CAAC,CAAC,iBAAiB;IACrC,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,wBAAwB;AAC1D,CAAC;AAED,wDAAwD;AACxD,SAAgB,aAAa,CAAC,OAAe,EAAE,CAAS,EAAE,CAAS;IAC/D,OAAO,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,wDAAwD;AACxD,SAAgB,aAAa,CAAC,OAAe,EAAE,OAAgB;IAC3D,IAAI,OAAO,KAAK,eAAO,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,OAAO,KAAK,2BAAmB,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,KAAK,eAAO,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,OAAO,KAAK,uBAAc,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,kBAAW,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/helpers/address.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.actionUsesTransactionCalls = actionUsesTransactionCalls;
4
4
  exports.getTransactionCalls = getTransactionCalls;
5
5
  const types_1 = require("../types");
6
- // Transaction and Sign712MetaMask actions carry transactionCalls;
6
+ // Transaction and Sign712MetaMaskCaveats actions carry transactionCalls;
7
7
  // Sign712 (Permit/Permit2) and Sign7702Authorization do not.
8
8
  function actionUsesTransactionCalls(action) {
9
9
  return action.type === types_1.EvmActionKind.Transaction
10
- || action.type === types_1.EvmActionKind.Sign712MetaMask;
10
+ || action.type === types_1.EvmActionKind.Sign712MetaMaskCaveats;
11
11
  }
12
12
  // For Transaction-type actions (non-AA), the call is in action.data directly.
13
- // For Sign712MetaMask-type actions (AA), the calls are in details.transactionCalls.
13
+ // For Sign712MetaMaskCaveats-type actions (AA), the calls are in details.transactionCalls.
14
14
  function getTransactionCalls(action) {
15
15
  if (action.type === types_1.EvmActionKind.Transaction) {
16
16
  return [action.data];
@@ -1 +1 @@
1
- {"version":3,"file":"evm-action.js","sourceRoot":"","sources":["../../../src/helpers/evm-action.ts"],"names":[],"mappings":";;AAIA,gEAGC;AAID,kDAKC;AAhBD,oCAAgF;AAEhF,kEAAkE;AAClE,6DAA6D;AAC7D,SAAgB,0BAA0B,CAAC,MAAyB;IAChE,OAAO,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,WAAW;WACzC,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,eAAe,CAAC;AACzD,CAAC;AAED,8EAA8E;AAC9E,oFAAoF;AACpF,SAAgB,mBAAmB,CAAC,MAAyB;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,IAA0B,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,EAAE,gBAAgB,IAAI,EAAE,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"evm-action.js","sourceRoot":"","sources":["../../../src/helpers/evm-action.ts"],"names":[],"mappings":";;AAIA,gEAGC;AAID,kDAKC;AAhBD,oCAAgF;AAEhF,yEAAyE;AACzE,6DAA6D;AAC7D,SAAgB,0BAA0B,CAAC,MAAyB;IAChE,OAAO,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,WAAW;WACzC,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,sBAAsB,CAAC;AAChE,CAAC;AAED,8EAA8E;AAC9E,2FAA2F;AAC3F,SAAgB,mBAAmB,CAAC,MAAyB;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,IAA0B,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,EAAE,gBAAgB,IAAI,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.packEvmHookV1 = packEvmHookV1;
4
+ exports.packEvmTransactionCall = packEvmTransactionCall;
5
+ exports.serializeDlnHook = serializeDlnHook;
6
+ const viem_1 = require("viem");
7
+ const enums_1 = require("../types/enums");
8
+ // Hook envelope: ABI-encoded tuple prefixed with a `uint8 version=1` byte.
9
+ // keccak256 of these bytes is what ends up in `intent.externalCallHash`.
10
+ const ENVELOPE_TUPLE = {
11
+ type: "tuple",
12
+ components: [
13
+ { name: "fallbackAddress", type: "address" },
14
+ { name: "executorAddress", type: "address" },
15
+ { name: "executionFee", type: "uint160" },
16
+ { name: "allowDelayedExecution", type: "bool" },
17
+ { name: "requireSuccessfullExecution", type: "bool" },
18
+ { name: "payload", type: "bytes" },
19
+ ],
20
+ };
21
+ const ENVELOPE_VERSION_PREFIX = "0x01";
22
+ function packEvmHookV1(data) {
23
+ const tuple = (0, viem_1.encodeAbiParameters)([ENVELOPE_TUPLE], [{
24
+ fallbackAddress: data.fallbackAddress,
25
+ executorAddress: data.target,
26
+ executionFee: BigInt(data.reward),
27
+ allowDelayedExecution: data.isNonAtomic,
28
+ requireSuccessfullExecution: data.isSuccessRequired,
29
+ payload: data.targetPayload,
30
+ }]);
31
+ return (0, viem_1.concatHex)([ENVELOPE_VERSION_PREFIX, tuple]);
32
+ }
33
+ // `evm_transaction_call` wraps the user-supplied (to, gas, calldata) tuple in
34
+ // the same envelope, with fixed field values:
35
+ // executionFee = 0
36
+ // allowDelayedExecution = false
37
+ // requireSuccessfullExecution = true
38
+ // fallbackAddress = dstChainAuthorityAddress
39
+ // executorAddress = 0x0
40
+ function packEvmTransactionCall(data, dstChainAuthorityAddress) {
41
+ const inner = (0, viem_1.encodeAbiParameters)([{
42
+ type: "tuple",
43
+ components: [
44
+ { name: "to", type: "address" },
45
+ { name: "txGas", type: "uint32" },
46
+ { name: "callData", type: "bytes" },
47
+ ],
48
+ }], [{
49
+ to: data.to,
50
+ txGas: Number(data.gas ?? 0),
51
+ callData: data.calldata,
52
+ }]);
53
+ return packEvmHookV1({
54
+ fallbackAddress: dstChainAuthorityAddress,
55
+ target: viem_1.zeroAddress,
56
+ reward: "0",
57
+ isNonAtomic: false,
58
+ isSuccessRequired: true,
59
+ targetPayload: inner,
60
+ });
61
+ }
62
+ // Parses a request trade's `dlnHook` JSON and returns the bytes the API
63
+ // hashes into `intent.externalCallHash`. Returns `undefined` when the trade
64
+ // has no hook. Throws on unknown / Solana hook types — Solana hooks live in
65
+ // the response under their own validator and never feed into this hash.
66
+ function serializeDlnHook(trade) {
67
+ if (!trade.dlnHook)
68
+ return undefined;
69
+ const hook = JSON.parse(trade.dlnHook);
70
+ switch (hook.type) {
71
+ case enums_1.DlnHookType.EvmHookV1:
72
+ return packEvmHookV1(hook.data);
73
+ case enums_1.DlnHookType.EvmTransactionCall: {
74
+ if (trade.dstChainAuthorityAddress === undefined) {
75
+ throw new Error("evm_transaction_call hook requires dstChainAuthorityAddress on the trade");
76
+ }
77
+ return packEvmTransactionCall(hook.data, trade.dstChainAuthorityAddress);
78
+ }
79
+ case enums_1.DlnHookType.SolanaSerializedInstructions:
80
+ throw new Error("Solana hook types are not folded into externalCallHash");
81
+ default: {
82
+ const exhaustive = hook;
83
+ throw new Error(`Unknown dlnHook type: ${JSON.stringify(exhaustive)}`);
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=evm-dln-hook-pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm-dln-hook-pack.js","sourceRoot":"","sources":["../../../src/helpers/evm-dln-hook-pack.ts"],"names":[],"mappings":";;AAwCA,sCAaC;AASD,wDA4BC;AAMD,4CAuBC;AAvHD,+BAAmE;AACnE,0CAA6C;AAG7C,2EAA2E;AAC3E,yEAAyE;AACzE,MAAM,cAAc,GAAG;IACnB,IAAI,EAAE,OAAO;IACb,UAAU,EAAE;QACR,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC5C,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC5C,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;QACzC,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,EAAE;QAC/C,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,MAAM,EAAE;QACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;KACrC;CACK,CAAC;AAEX,MAAM,uBAAuB,GAAkB,MAAM,CAAC;AAsBtD,SAAgB,aAAa,CAAC,IAAmB;IAC7C,MAAM,KAAK,GAAG,IAAA,0BAAmB,EAC7B,CAAC,cAAc,CAAC,EAChB,CAAC;YACG,eAAe,EAAE,IAAI,CAAC,eAAgC;YACtD,eAAe,EAAE,IAAI,CAAC,MAAuB;YAC7C,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC,qBAAqB,EAAE,IAAI,CAAC,WAAW;YACvC,2BAA2B,EAAE,IAAI,CAAC,iBAAiB;YACnD,OAAO,EAAE,IAAI,CAAC,aAA8B;SAC/C,CAAC,CACL,CAAC;IACF,OAAO,IAAA,gBAAS,EAAC,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,8CAA8C;AAC9C,qBAAqB;AACrB,kCAAkC;AAClC,uCAAuC;AACvC,+CAA+C;AAC/C,0BAA0B;AAC1B,SAAgB,sBAAsB,CAClC,IAA4B,EAC5B,wBAAgC;IAEhC,MAAM,KAAK,GAAG,IAAA,0BAAmB,EAC7B,CAAC;YACG,IAAI,EAAE,OAAO;YACb,UAAU,EAAE;gBACR,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACjC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;aACtC;SACJ,CAAC,EACF,CAAC;YACG,EAAE,EAAE,IAAI,CAAC,EAAmB;YAC5B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAyB;SAC3C,CAAC,CACL,CAAC;IAEF,OAAO,aAAa,CAAC;QACjB,eAAe,EAAE,wBAAwB;QACzC,MAAM,EAAE,kBAAW;QACnB,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,KAAK;QAClB,iBAAiB,EAAE,IAAI;QACvB,aAAa,EAAE,KAAK;KACvB,CAAC,CAAC;AACP,CAAC;AAED,wEAAwE;AACxE,4EAA4E;AAC5E,4EAA4E;AAC5E,wEAAwE;AACxE,SAAgB,gBAAgB,CAAC,KAAmB;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAErC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAEtD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,mBAAW,CAAC,SAAS;YACtB,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,mBAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,wBAAwB,KAAK,SAAS,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CACX,0EAA0E,CAC7E,CAAC;YACN,CAAC;YACD,OAAO,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,mBAAW,CAAC,4BAA4B;YACzC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC9E,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,UAAU,GAAU,IAAI,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateEvmGasCompensationTx = validateEvmGasCompensationTx;
4
+ const evm_calldata_1 = require("./evm-calldata");
5
+ const evm_token_1 = require("./evm-token");
6
+ const address_1 = require("./address");
7
+ // Validates an EVM `{to, data, value}` triplet that is expected to encode a
8
+ // gas-compensation transfer. `groups` are the gas-compensation groups
9
+ // associated with this triplet's source (already filtered to the relevant
10
+ // `(chainId, sender)` pair by the caller).
11
+ //
12
+ // Classification: dispatched on `triplet.data`:
13
+ // - `data === "0x"` → native compensation (data="0x", value > 0,
14
+ // and at least one group must carry a native token).
15
+ // - otherwise → ERC20 compensation (`triplet.to` matches some non-native
16
+ // group's tokenAddress, data is `transfer(...)`, value === "0").
17
+ function validateEvmGasCompensationTx(triplet, groups, realChainId, basePath, codes) {
18
+ if (triplet.data === "0x") {
19
+ return validateNativeCompensation(triplet, groups, basePath, codes);
20
+ }
21
+ return validateErc20Compensation(triplet, groups, realChainId, basePath, codes);
22
+ }
23
+ function validateNativeCompensation(triplet, groups, basePath, codes) {
24
+ const violations = [];
25
+ // CRITICAL: data="0x" implies native — must have at least one native group.
26
+ const hasNativeGroup = groups.some(g => (0, evm_token_1.isNativeToken)(g.tokenAddress, g.realChainId));
27
+ if (!hasNativeGroup) {
28
+ violations.push({
29
+ code: codes.dataInvalid,
30
+ message: "data=\"0x\" implies native compensation but no group has a native token",
31
+ path: `${basePath}.data`,
32
+ expected: groups.map(g => g.tokenAddress),
33
+ actual: "0x",
34
+ });
35
+ }
36
+ // HIGH: native compensation value must parse and be > 0.
37
+ violations.push(...validateNativeValue(triplet.value, basePath, codes));
38
+ return violations;
39
+ }
40
+ function validateNativeValue(rawValue, basePath, codes) {
41
+ try {
42
+ if (BigInt(rawValue) <= 0n) {
43
+ return [{
44
+ code: codes.valueInvalid,
45
+ message: "native compensation must have value > 0",
46
+ path: `${basePath}.value`,
47
+ actual: rawValue,
48
+ }];
49
+ }
50
+ return [];
51
+ }
52
+ catch (error) {
53
+ return [{
54
+ code: codes.valueInvalid,
55
+ message: "native compensation value is not a valid number",
56
+ path: `${basePath}.value`,
57
+ actual: rawValue,
58
+ details: error,
59
+ }];
60
+ }
61
+ }
62
+ function validateErc20Compensation(triplet, groups, realChainId, basePath, codes) {
63
+ const violations = [];
64
+ // CRITICAL: `to` must equal some non-native group's tokenAddress.
65
+ const erc20Groups = groups.filter(g => !(0, evm_token_1.isNativeToken)(g.tokenAddress, g.realChainId));
66
+ const matches = erc20Groups.some(g => (0, address_1.normalizeAddress)(g.realChainId, g.tokenAddress)
67
+ === (0, address_1.normalizeAddress)(realChainId, triplet.to));
68
+ if (!matches) {
69
+ violations.push({
70
+ code: codes.toMismatch,
71
+ message: "ERC20 compensation `to` does not match any group's tokenAddress",
72
+ path: `${basePath}.to`,
73
+ expected: erc20Groups.map(g => g.tokenAddress),
74
+ actual: triplet.to,
75
+ });
76
+ }
77
+ // CRITICAL: data must be a valid ERC20 transfer calldata.
78
+ try {
79
+ (0, evm_calldata_1.decodeTransferCalldata)(triplet.data);
80
+ }
81
+ catch (error) {
82
+ violations.push({
83
+ code: codes.dataInvalid,
84
+ message: "ERC20 compensation data is not a valid transfer calldata",
85
+ path: `${basePath}.data`,
86
+ actual: triplet.data,
87
+ details: error,
88
+ });
89
+ }
90
+ // HIGH: ERC20 compensation must have value="0".
91
+ if (triplet.value !== "0") {
92
+ violations.push({
93
+ code: codes.valueInvalid,
94
+ message: "ERC20 compensation must have value=\"0\"",
95
+ path: `${basePath}.value`,
96
+ expected: "0",
97
+ actual: triplet.value,
98
+ });
99
+ }
100
+ return violations;
101
+ }
102
+ //# sourceMappingURL=evm-gas-compensation-tx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm-gas-compensation-tx.js","sourceRoot":"","sources":["../../../src/helpers/evm-gas-compensation-tx.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.computeIntentId = computeIntentId;
4
4
  const viem_1 = require("viem");
5
5
  const evm_intent_id_abi_1 = require("./evm-intent-id-abi");
6
+ const address_1 = require("./address");
7
+ const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
6
8
  function computeIntentId(intent) {
7
9
  const struct = convertToIntentStruct(intent);
8
10
  const encoded = (0, viem_1.encodeAbiParameters)(evm_intent_id_abi_1.SUBMIT_INTENT_ABI_PARAMS, [struct]);
@@ -20,7 +22,7 @@ function convertToIntentStruct(intent) {
20
22
  intentTimestamp: BigInt(intent.intentTimestamp),
21
23
  srcAllowedSender: (intent.srcAllowedSender ?? []),
22
24
  executionMetadata: (intent.executionMetadata ?? viem_1.zeroHash),
23
- isAnyDlnMetadataAllowed: true,
25
+ isAnyDlnMetadataAllowed: !intent.dlnMetadata,
24
26
  dlnMetadata: (intent.dlnMetadata ?? "0x"),
25
27
  externalCallHash: (intent.externalCallHash ?? viem_1.zeroHash),
26
28
  combinedInteractions: "0x",
@@ -29,14 +31,22 @@ function convertToIntentStruct(intent) {
29
31
  intentAuthority: intent.intentAuthority,
30
32
  };
31
33
  }
34
+ // Encodes addresses as raw bytes — non-EVM strings can't be passed as-is.
32
35
  function convertAllowedAddresses(details) {
33
36
  if (!details)
34
37
  return [];
35
- return details.map(d => ({
36
- allowedAddress: d.address,
37
- chains: d.destinationChainIds === "any" ? [] : d.destinationChainIds,
38
- isAnyChain: d.destinationChainIds === "any",
39
- }));
38
+ return details.map(d => {
39
+ const isAnyChain = d.destinationChainIds === "any";
40
+ const chains = isAnyChain ? [] : d.destinationChainIds;
41
+ // All chains within one entry share the same address family (validated
42
+ // elsewhere), so any chainId in the list resolves the address family
43
+ // identically. For "any" / empty chains, the family is inferred from
44
+ // the address itself.
45
+ const allowedAddress = chains.length > 0
46
+ ? (0, address_1.addressToHex)((0, subscription_to_chain_id_1.resolveChainId)(chains[0]) ?? chains[0], d.address)
47
+ : (0, address_1.addressToHexByValue)(d.address);
48
+ return { allowedAddress, chains, isAnyChain };
49
+ });
40
50
  }
41
51
  function convertInputTokens(tokens) {
42
52
  if (!tokens)
@@ -58,13 +68,17 @@ function convertGiveTokens(tokens) {
58
68
  denominator: Number(t.denominator),
59
69
  }));
60
70
  }
71
+ // Encode addresses as raw bytes — non-EVM strings can't be passed as-is.
61
72
  function convertTakeTokens(tokens) {
62
- return tokens.map(t => ({
63
- giveToken: t.fromTokenAddress,
64
- takeTokenChain: t.takeTokenChainId,
65
- takeToken: t.takeTokenAddress,
66
- numerator: BigInt(t.numerator),
67
- denominator: Number(t.denominator),
68
- }));
73
+ return tokens.map(t => {
74
+ const realChainId = (0, subscription_to_chain_id_1.resolveChainId)(t.takeTokenChainId) ?? t.takeTokenChainId;
75
+ return {
76
+ giveToken: t.fromTokenAddress,
77
+ takeTokenChain: t.takeTokenChainId,
78
+ takeToken: (0, address_1.addressToHex)(realChainId, t.takeTokenAddress),
79
+ numerator: BigInt(t.numerator),
80
+ denominator: Number(t.denominator),
81
+ };
82
+ });
69
83
  }
70
84
  //# sourceMappingURL=evm-intent-id.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evm-intent-id.js","sourceRoot":"","sources":["../../../src/helpers/evm-intent-id.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evm-intent-id.js","sourceRoot":"","sources":["../../../src/helpers/evm-intent-id.ts"],"names":[],"mappings":"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"}