@debridge-finance/borderless-validation-sdk 0.0.0-dev-4a73f49 → 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 (286) hide show
  1. package/dist/cjs/helpers/address.js +18 -53
  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 +13 -27
  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 -32
  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 +5 -125
  16. package/dist/cjs/types/response.js.map +1 -1
  17. package/dist/cjs/types/validation.js +10 -81
  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 -7
  38. package/dist/cjs/validations/required-actions.js.map +1 -1
  39. package/dist/cjs/validations/solana-hook.js +22 -33
  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 -139
  50. package/dist/cjs/validations/trade-grouping.js.map +1 -1
  51. package/dist/cjs/validations/trades.js +40 -162
  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 -48
  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 +13 -27
  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 -31
  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 +4 -124
  90. package/dist/esm/types/response.js.map +1 -1
  91. package/dist/esm/types/validation.js +10 -81
  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 -7
  112. package/dist/esm/validations/required-actions.js.map +1 -1
  113. package/dist/esm/validations/solana-hook.js +24 -35
  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 -139
  124. package/dist/esm/validations/trade-grouping.js.map +1 -1
  125. package/dist/esm/validations/trades.js +41 -163
  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 -7
  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-intent-id.d.ts.map +1 -1
  154. package/dist/types/helpers/evm-trade-amounts.d.ts +2 -2
  155. package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
  156. package/dist/types/types/enums.d.ts +1 -24
  157. package/dist/types/types/enums.d.ts.map +1 -1
  158. package/dist/types/types/request.d.ts +9 -19
  159. package/dist/types/types/request.d.ts.map +1 -1
  160. package/dist/types/types/response.d.ts +17 -1015
  161. package/dist/types/types/response.d.ts.map +1 -1
  162. package/dist/types/types/validation.d.ts +11 -73
  163. package/dist/types/types/validation.d.ts.map +1 -1
  164. package/dist/types/validations/evm-caveats.d.ts.map +1 -1
  165. package/dist/types/validations/evm-op-budget.d.ts +2 -2
  166. package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
  167. package/dist/types/validations/evm-op-gas-compensation.d.ts +3 -0
  168. package/dist/types/validations/evm-op-gas-compensation.d.ts.map +1 -0
  169. package/dist/types/validations/evm-op-hook.d.ts +2 -4
  170. package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
  171. package/dist/types/validations/evm-op-wrap.d.ts +2 -2
  172. package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
  173. package/dist/types/validations/evm-required-actions.d.ts +2 -2
  174. package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
  175. package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
  176. package/dist/types/validations/evm-sign7702.d.ts +1 -2
  177. package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
  178. package/dist/types/validations/hooks-common.d.ts +0 -1
  179. package/dist/types/validations/hooks-common.d.ts.map +1 -1
  180. package/dist/types/validations/required-actions.d.ts +1 -2
  181. package/dist/types/validations/required-actions.d.ts.map +1 -1
  182. package/dist/types/validations/solana-hook.d.ts +2 -4
  183. package/dist/types/validations/solana-hook.d.ts.map +1 -1
  184. package/dist/types/validations/solana-op-budget.d.ts +2 -2
  185. package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
  186. package/dist/types/validations/solana-op-wrap.d.ts +2 -2
  187. package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
  188. package/dist/types/validations/solana-required-actions.d.ts +2 -2
  189. package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
  190. package/dist/types/validations/solana-transaction.d.ts +3 -3
  191. package/dist/types/validations/solana-transaction.d.ts.map +1 -1
  192. package/dist/types/validations/trade-grouping.d.ts +2 -6
  193. package/dist/types/validations/trade-grouping.d.ts.map +1 -1
  194. package/dist/types/validations/trades.d.ts.map +1 -1
  195. package/dist/types/validator.d.ts.map +1 -1
  196. package/dist/types/whitelists/environment-config.d.ts.map +1 -1
  197. package/dist/types/whitelists/evm/caveat-enforcers.d.ts +0 -8
  198. package/dist/types/whitelists/evm/caveat-enforcers.d.ts.map +1 -1
  199. package/dist/types/whitelists/evm/delegation-manager.d.ts +0 -2
  200. package/dist/types/whitelists/evm/delegation-manager.d.ts.map +1 -1
  201. package/dist/types/whitelists/evm/eip7702-delegation.d.ts +0 -2
  202. package/dist/types/whitelists/evm/eip7702-delegation.d.ts.map +1 -1
  203. package/dist/types/whitelists/evm/index.d.ts +4 -4
  204. package/dist/types/whitelists/evm/index.d.ts.map +1 -1
  205. package/dist/types/whitelists/evm/permit2.d.ts +0 -1
  206. package/dist/types/whitelists/evm/permit2.d.ts.map +1 -1
  207. package/dist/types/whitelists/evm/weth.d.ts.map +1 -1
  208. package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
  209. package/dist/types/whitelists/subscription-to-chain-id.d.ts +0 -1
  210. package/dist/types/whitelists/subscription-to-chain-id.d.ts.map +1 -1
  211. package/dist/types/whitelists/types.d.ts +1 -1
  212. package/dist/types/whitelists/types.d.ts.map +1 -1
  213. package/package.json +3 -4
  214. package/README.md +0 -164
  215. package/dist/cjs/helpers/evm-dln-hook-pack.js +0 -87
  216. package/dist/cjs/helpers/evm-dln-hook-pack.js.map +0 -1
  217. package/dist/cjs/helpers/evm-gas-compensation-tx.js +0 -102
  218. package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +0 -1
  219. package/dist/cjs/helpers/gas-compensation.js +0 -36
  220. package/dist/cjs/helpers/gas-compensation.js.map +0 -1
  221. package/dist/cjs/helpers/hex.js +0 -24
  222. package/dist/cjs/helpers/hex.js.map +0 -1
  223. package/dist/cjs/helpers/placeholder.js +0 -174
  224. package/dist/cjs/helpers/placeholder.js.map +0 -1
  225. package/dist/cjs/helpers/sets.js +0 -13
  226. package/dist/cjs/helpers/sets.js.map +0 -1
  227. package/dist/cjs/validations/compensation-hook.js +0 -203
  228. package/dist/cjs/validations/compensation-hook.js.map +0 -1
  229. package/dist/cjs/validations/evm-sign712-shared.js +0 -116
  230. package/dist/cjs/validations/evm-sign712-shared.js.map +0 -1
  231. package/dist/cjs/validations/intent-destinations.js +0 -197
  232. package/dist/cjs/validations/intent-destinations.js.map +0 -1
  233. package/dist/cjs/validations/intent-tokens.js +0 -347
  234. package/dist/cjs/validations/intent-tokens.js.map +0 -1
  235. package/dist/cjs/validations/intent.js +0 -288
  236. package/dist/cjs/validations/intent.js.map +0 -1
  237. package/dist/cjs/whitelists/evm/metamask-delegation-chains.js +0 -16
  238. package/dist/cjs/whitelists/evm/metamask-delegation-chains.js.map +0 -1
  239. package/dist/esm/helpers/evm-dln-hook-pack.js +0 -82
  240. package/dist/esm/helpers/evm-dln-hook-pack.js.map +0 -1
  241. package/dist/esm/helpers/evm-gas-compensation-tx.js +0 -99
  242. package/dist/esm/helpers/evm-gas-compensation-tx.js.map +0 -1
  243. package/dist/esm/helpers/gas-compensation.js +0 -33
  244. package/dist/esm/helpers/gas-compensation.js.map +0 -1
  245. package/dist/esm/helpers/hex.js +0 -20
  246. package/dist/esm/helpers/hex.js.map +0 -1
  247. package/dist/esm/helpers/placeholder.js +0 -168
  248. package/dist/esm/helpers/placeholder.js.map +0 -1
  249. package/dist/esm/helpers/sets.js +0 -10
  250. package/dist/esm/helpers/sets.js.map +0 -1
  251. package/dist/esm/validations/compensation-hook.js +0 -200
  252. package/dist/esm/validations/compensation-hook.js.map +0 -1
  253. package/dist/esm/validations/evm-sign712-shared.js +0 -110
  254. package/dist/esm/validations/evm-sign712-shared.js.map +0 -1
  255. package/dist/esm/validations/intent-destinations.js +0 -194
  256. package/dist/esm/validations/intent-destinations.js.map +0 -1
  257. package/dist/esm/validations/intent-tokens.js +0 -344
  258. package/dist/esm/validations/intent-tokens.js.map +0 -1
  259. package/dist/esm/validations/intent.js +0 -285
  260. package/dist/esm/validations/intent.js.map +0 -1
  261. package/dist/esm/whitelists/evm/metamask-delegation-chains.js +0 -13
  262. package/dist/esm/whitelists/evm/metamask-delegation-chains.js.map +0 -1
  263. package/dist/types/helpers/evm-dln-hook-pack.d.ts +0 -19
  264. package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +0 -1
  265. package/dist/types/helpers/evm-gas-compensation-tx.d.ts +0 -13
  266. package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +0 -1
  267. package/dist/types/helpers/gas-compensation.d.ts +0 -10
  268. package/dist/types/helpers/gas-compensation.d.ts.map +0 -1
  269. package/dist/types/helpers/hex.d.ts +0 -3
  270. package/dist/types/helpers/hex.d.ts.map +0 -1
  271. package/dist/types/helpers/placeholder.d.ts +0 -41
  272. package/dist/types/helpers/placeholder.d.ts.map +0 -1
  273. package/dist/types/helpers/sets.d.ts +0 -2
  274. package/dist/types/helpers/sets.d.ts.map +0 -1
  275. package/dist/types/validations/compensation-hook.d.ts +0 -3
  276. package/dist/types/validations/compensation-hook.d.ts.map +0 -1
  277. package/dist/types/validations/evm-sign712-shared.d.ts +0 -7
  278. package/dist/types/validations/evm-sign712-shared.d.ts.map +0 -1
  279. package/dist/types/validations/intent-destinations.d.ts +0 -4
  280. package/dist/types/validations/intent-destinations.d.ts.map +0 -1
  281. package/dist/types/validations/intent-tokens.d.ts +0 -4
  282. package/dist/types/validations/intent-tokens.d.ts.map +0 -1
  283. package/dist/types/validations/intent.d.ts +0 -5
  284. package/dist/types/validations/intent.d.ts.map +0 -1
  285. package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts +0 -3
  286. package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@debridge-finance/borderless-validation-sdk",
3
- "version": "0.0.0-dev-4a73f49",
3
+ "version": "0.0.1",
4
4
  "description": "Validation SDK for deBridge borderless intents API responses",
5
5
  "author": "deBridge",
6
- "license": "BUSL-1.1",
6
+ "license": "MIT",
7
7
  "main": "./dist/cjs/index.js",
8
8
  "module": "./dist/esm/index.js",
9
9
  "browser": "./dist/esm/index.js",
@@ -29,8 +29,7 @@
29
29
  "build": "npm run clean && npm run build:esm && npm run build:cjs && npm run build:types && npm run build:fixup",
30
30
  "test": "jest --verbose",
31
31
  "coverage": "jest --verbose --coverage",
32
- "test:e2e": "jest --config e2e/jest.config.js --verbose",
33
- "coverage:e2e": "jest --config e2e/jest.config.js --verbose --coverage"
32
+ "test:e2e": "jest --config e2e/jest.config.js --verbose"
34
33
  },
35
34
  "publishConfig": {
36
35
  "access": "restricted"
package/README.md DELETED
@@ -1,164 +0,0 @@
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
@@ -1,87 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"evm-dln-hook-pack.js","sourceRoot":"","sources":["../../../src/helpers/evm-dln-hook-pack.ts"],"names":[],"mappings":"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"}
@@ -1,102 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"evm-gas-compensation-tx.js","sourceRoot":"","sources":["../../../src/helpers/evm-gas-compensation-tx.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.extractGasCompensationGroups = extractGasCompensationGroups;
4
- const address_1 = require("./address");
5
- const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
6
- // Groups `gasCompensationInfo` entries from request.preHooks by
7
- // (chainId, tokenAddress, sender). One compensation hook per
8
- // unique group is expected to be appended to response.preHooks.
9
- // Groups with an unknown subscription chainId are skipped — they'll surface as
10
- // `UnknownSubscriptionId` via the trade-grouping pass.
11
- function extractGasCompensationGroups(request) {
12
- const seen = new Set();
13
- const groups = [];
14
- for (const hook of request.preHooks ?? []) {
15
- const info = hook.gasCompensationInfo;
16
- if (!info)
17
- continue;
18
- const realChainId = (0, subscription_to_chain_id_1.resolveChainId)(info.chainId);
19
- if (realChainId === undefined)
20
- continue;
21
- const key = `${realChainId}`
22
- + `:${(0, address_1.normalizeAddress)(realChainId, info.tokenAddress)}`
23
- + `:${(0, address_1.normalizeAddress)(realChainId, info.sender)}`;
24
- if (seen.has(key))
25
- continue;
26
- seen.add(key);
27
- groups.push({
28
- chainId: info.chainId,
29
- realChainId,
30
- tokenAddress: info.tokenAddress,
31
- sender: info.sender,
32
- });
33
- }
34
- return groups;
35
- }
36
- //# sourceMappingURL=gas-compensation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas-compensation.js","sourceRoot":"","sources":["../../../src/helpers/gas-compensation.ts"],"names":[],"mappings":";;AAiBA,oEA8BC;AA7CD,uCAA6C;AAC7C,qFAAwE;AASxE,gEAAgE;AAChE,6DAA6D;AAC7D,gEAAgE;AAChE,+EAA+E;AAC/E,uDAAuD;AACvD,SAAgB,4BAA4B,CACxC,OAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,WAAW,GAAG,IAAA,yCAAc,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QAExC,MAAM,GAAG,GAAG,GAAG,WAAW,EAAE;cACtB,IAAI,IAAA,0BAAgB,EAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE;cACtD,IAAI,IAAA,0BAAgB,EAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAEvD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW;YACX,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isEmptyHex = isEmptyHex;
4
- exports.hexEquals = hexEquals;
5
- const viem_1 = require("viem");
6
- // Treats undefined, "0x" and `zeroHash` (`0x000...0`) as the same empty value.
7
- function isEmptyHex(value) {
8
- if (value === undefined)
9
- return true;
10
- const normalized = value.toLowerCase();
11
- return normalized === "0x" || normalized === viem_1.zeroHash;
12
- }
13
- // Case-insensitive comparison of two hex strings, with `undefined` / `0x` /
14
- // `zeroHash` treated as a single equivalence class. Use whenever an API field
15
- // can be omitted, empty, or zero-padded interchangeably.
16
- function hexEquals(a, b) {
17
- if (isEmptyHex(a) && isEmptyHex(b))
18
- return true;
19
- // If one is `undefined` and the other is not, they are not equal.
20
- if (a === undefined || b === undefined)
21
- return false;
22
- return a.toLowerCase() === b.toLowerCase();
23
- }
24
- //# sourceMappingURL=hex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../src/helpers/hex.ts"],"names":[],"mappings":";;AAGA,gCAIC;AAKD,8BAUC;AAtBD,+BAAgC;AAEhC,+EAA+E;AAC/E,SAAgB,UAAU,CAAC,KAAyB;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,OAAO,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,eAAQ,CAAC;AAC1D,CAAC;AAED,4EAA4E;AAC5E,8EAA8E;AAC9E,yDAAyD;AACzD,SAAgB,SAAS,CACrB,CAAqB,EACrB,CAAqB;IAErB,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhD,kEAAkE;IAClE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAErD,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/C,CAAC"}
@@ -1,174 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PlaceholderResolutionErrorReason = exports.HookMode = exports.SOLANA_DEFAULT_PLACEHOLDER_BYTE_COUNT = exports.EVM_DEFAULT_PLACEHOLDER_BYTE_COUNT = void 0;
4
- exports.encodePlaceholderAmount = encodePlaceholderAmount;
5
- exports.computeCumulativeTradeAmount = computeCumulativeTradeAmount;
6
- exports.resolveEagerPlaceholders = resolveEagerPlaceholders;
7
- const enums_1 = require("../types/enums");
8
- const address_1 = require("./address");
9
- const MIN_PLACEHOLDER_BYTE_COUNT = 1;
10
- const MAX_PLACEHOLDER_BYTE_COUNT = 32;
11
- exports.EVM_DEFAULT_PLACEHOLDER_BYTE_COUNT = MAX_PLACEHOLDER_BYTE_COUNT;
12
- exports.SOLANA_DEFAULT_PLACEHOLDER_BYTE_COUNT = 8;
13
- var HookMode;
14
- (function (HookMode) {
15
- HookMode[HookMode["PreHooks"] = 0] = "PreHooks";
16
- HookMode[HookMode["PostHooks"] = 1] = "PostHooks";
17
- })(HookMode || (exports.HookMode = HookMode = {}));
18
- var PlaceholderResolutionErrorReason;
19
- (function (PlaceholderResolutionErrorReason) {
20
- PlaceholderResolutionErrorReason[PlaceholderResolutionErrorReason["MissingTokenOrAddress"] = 0] = "MissingTokenOrAddress";
21
- PlaceholderResolutionErrorReason[PlaceholderResolutionErrorReason["NegativeAmount"] = 1] = "NegativeAmount";
22
- PlaceholderResolutionErrorReason[PlaceholderResolutionErrorReason["Overflow"] = 2] = "Overflow";
23
- PlaceholderResolutionErrorReason[PlaceholderResolutionErrorReason["InvalidByteCount"] = 3] = "InvalidByteCount";
24
- PlaceholderResolutionErrorReason[PlaceholderResolutionErrorReason["InvalidAdditionalAmount"] = 4] = "InvalidAdditionalAmount";
25
- PlaceholderResolutionErrorReason[PlaceholderResolutionErrorReason["NoMatchingTradeOrAdditional"] = 5] = "NoMatchingTradeOrAdditional";
26
- })(PlaceholderResolutionErrorReason || (exports.PlaceholderResolutionErrorReason = PlaceholderResolutionErrorReason = {}));
27
- // Encodes a non-negative integer as a zero-padded hex string (no "0x" prefix),
28
- // fitting exactly `byteCount` bytes, using the chain engine's endianness.
29
- // Solana: little-endian. EVM/Tron: big-endian.
30
- // `byteCount` must be an integer in
31
- // [MIN_PLACEHOLDER_BYTE_COUNT, MAX_PLACEHOLDER_BYTE_COUNT].
32
- function encodePlaceholderAmount(amount, byteCount, engine) {
33
- if (!isValidByteCount(byteCount)) {
34
- return { ok: false, reason: PlaceholderResolutionErrorReason.InvalidByteCount };
35
- }
36
- if (amount < 0n) {
37
- return { ok: false, reason: PlaceholderResolutionErrorReason.NegativeAmount };
38
- }
39
- const maxValue = (1n << BigInt(byteCount * 8)) - 1n;
40
- if (amount > maxValue) {
41
- return { ok: false, reason: PlaceholderResolutionErrorReason.Overflow };
42
- }
43
- if (engine === enums_1.ChainEngine.Solana) { // Use little-endian for Solana
44
- const bytes = [];
45
- let value = amount;
46
- for (let i = 0; i < byteCount; i++) {
47
- bytes.push((value & 0xffn).toString(16).padStart(2, "0"));
48
- value >>= 8n;
49
- }
50
- return { ok: true, hex: bytes.join("") };
51
- }
52
- // Use big-endian (EVM/Tron): simple hex conversion with left-padding.
53
- return { ok: true, hex: amount.toString(16).padStart(byteCount * 2, "0") };
54
- }
55
- function isValidByteCount(byteCount) {
56
- return Number.isInteger(byteCount)
57
- && byteCount >= MIN_PLACEHOLDER_BYTE_COUNT
58
- && byteCount <= MAX_PLACEHOLDER_BYTE_COUNT;
59
- }
60
- // Sums the trade amount matching the placeholder's (chainId, tokenAddress, address).
61
- // preHooks: sums trade.srcChainTokenIn.amount across trades where
62
- // trade.srcChainTokenIn.{chainId,address} and trade.srcChainAuthorityAddress match.
63
- // postHooks: sums trade.dstChainTokenOut.amount across trades where
64
- // trade.dstChainTokenOut.{chainId,address} and trade.dstChainTokenOutRecipient match.
65
- // In quote mode authority/recipient is undefined — such trades are skipped.
66
- function computeCumulativeTradeAmount(trades, mode, chainId, tokenAddress, address) {
67
- let sum = 0n;
68
- let matchCount = 0;
69
- for (const trade of trades) {
70
- const tradeChainId = mode === HookMode.PreHooks
71
- ? trade.srcChainTokenIn.chainId
72
- : trade.dstChainTokenOut.chainId;
73
- if (tradeChainId !== chainId)
74
- continue;
75
- const tradeAuthority = mode === HookMode.PreHooks
76
- ? trade.srcChainAuthorityAddress
77
- : trade.dstChainTokenOutRecipient;
78
- if (tradeAuthority === undefined)
79
- continue;
80
- const tradeToken = mode === HookMode.PreHooks
81
- ? trade.srcChainTokenIn.address
82
- : trade.dstChainTokenOut.address;
83
- if (!(0, address_1.addressEquals)(chainId, tradeToken, tokenAddress))
84
- continue;
85
- if (!(0, address_1.addressEquals)(chainId, tradeAuthority, address))
86
- continue;
87
- const amount = mode === HookMode.PreHooks
88
- ? trade.srcChainTokenIn.amount
89
- : trade.dstChainTokenOut.amount;
90
- sum += BigInt(amount);
91
- matchCount++;
92
- }
93
- return { cumulative: sum, matchCount };
94
- }
95
- // Applies eager-placeholder substitution to a hex string (calldata or value).
96
- // Markers: `{name}` or `{name.N}` (N = byte count).
97
- // Deferred placeholders are not touched — their markers remain in the output.
98
- // If any eager placeholder cannot be resolved, its marker is left intact and the
99
- // error is collected into `errors`; callers decide how to report it.
100
- function resolveEagerPlaceholders(data, hookChainId, placeholders, trades, mode) {
101
- const engine = (0, address_1.getChainEngine)(hookChainId);
102
- const defaultByteCount = engine === enums_1.ChainEngine.Solana
103
- ? exports.SOLANA_DEFAULT_PLACEHOLDER_BYTE_COUNT
104
- : exports.EVM_DEFAULT_PLACEHOLDER_BYTE_COUNT;
105
- let result = data;
106
- const errors = [];
107
- for (const placeholder of placeholders) {
108
- if (placeholder.type === enums_1.PlaceholderType.Deferred)
109
- continue;
110
- // Eager placeholder — type is either explicitly 'eager' or undefined (default).
111
- if (placeholder.tokenAddress === undefined
112
- || placeholder.address === undefined) {
113
- // Zod guards this at the schema level; defensive branch for callers
114
- // that bypass structural validation.
115
- errors.push({
116
- nameVariable: placeholder.nameVariable,
117
- reason: PlaceholderResolutionErrorReason.MissingTokenOrAddress,
118
- });
119
- continue;
120
- }
121
- let additional = 0n;
122
- if (placeholder.additionalAmount !== undefined) {
123
- try {
124
- additional = BigInt(placeholder.additionalAmount);
125
- }
126
- catch (error) {
127
- errors.push({
128
- nameVariable: placeholder.nameVariable,
129
- reason: PlaceholderResolutionErrorReason.InvalidAdditionalAmount,
130
- details: error,
131
- });
132
- continue;
133
- }
134
- }
135
- const { cumulative, matchCount } = computeCumulativeTradeAmount(trades, mode, hookChainId, placeholder.tokenAddress, placeholder.address);
136
- const expectedAmount = cumulative + additional;
137
- const nameEscaped = escapeRegex(placeholder.nameVariable);
138
- const markerRegex = new RegExp(`\\{${nameEscaped}(?:\\.(\\d+))?\\}`, "g");
139
- // MEDIUM: when no trade matches and no `additionalAmount` is supplied,
140
- // the API rejects the request. Here we are mirroring this logic.
141
- if (matchCount === 0
142
- && placeholder.additionalAmount === undefined
143
- && markerRegex.test(result)) {
144
- errors.push({
145
- nameVariable: placeholder.nameVariable,
146
- reason: PlaceholderResolutionErrorReason.NoMatchingTradeOrAdditional,
147
- });
148
- // Reset RegExp.lastIndex before the `replace` below.
149
- markerRegex.lastIndex = 0;
150
- // Skip substitution — leave marker in `result` so calldata comparison
151
- // surfaces any mutated value as a separate violation.
152
- continue;
153
- }
154
- result = result.replace(markerRegex, (match, byteCountStr) => {
155
- const byteCount = byteCountStr
156
- ? parseInt(byteCountStr, 10)
157
- : defaultByteCount;
158
- const encoded = encodePlaceholderAmount(expectedAmount, byteCount, engine);
159
- if (!encoded.ok) {
160
- errors.push({
161
- nameVariable: placeholder.nameVariable,
162
- reason: encoded.reason,
163
- });
164
- return match;
165
- }
166
- return encoded.hex;
167
- });
168
- }
169
- return { resolved: result, errors };
170
- }
171
- function escapeRegex(s) {
172
- return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
173
- }
174
- //# sourceMappingURL=placeholder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"placeholder.js","sourceRoot":"","sources":["../../../src/helpers/placeholder.ts"],"names":[],"mappings":"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"}