@debridge-finance/borderless-validation-sdk 0.3.1 → 0.4.0

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 (284) hide show
  1. package/README.md +120 -11
  2. package/dist/cjs/graylists/evm/token-permit-metadata.js +7 -1
  3. package/dist/cjs/graylists/evm/token-permit-metadata.js.map +1 -1
  4. package/dist/cjs/helpers/address.js +139 -63
  5. package/dist/cjs/helpers/address.js.map +1 -1
  6. package/dist/cjs/helpers/amount.js +8 -0
  7. package/dist/cjs/helpers/amount.js.map +1 -0
  8. package/dist/cjs/helpers/evm-dln-hook-pack.js +16 -4
  9. package/dist/cjs/helpers/evm-dln-hook-pack.js.map +1 -1
  10. package/dist/cjs/helpers/evm-gas-compensation-tx.js +11 -26
  11. package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -1
  12. package/dist/cjs/helpers/evm-intent-id-abi.js +8 -1
  13. package/dist/cjs/helpers/evm-intent-id-abi.js.map +1 -1
  14. package/dist/cjs/helpers/evm-trade-amounts.js +11 -3
  15. package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
  16. package/dist/cjs/helpers/expected-delegate.js +2 -6
  17. package/dist/cjs/helpers/expected-delegate.js.map +1 -1
  18. package/dist/cjs/helpers/gas-compensation.js +8 -4
  19. package/dist/cjs/helpers/gas-compensation.js.map +1 -1
  20. package/dist/cjs/helpers/interactions.js +4 -20
  21. package/dist/cjs/helpers/interactions.js.map +1 -1
  22. package/dist/cjs/helpers/synthetic-native-wrap.js +3 -2
  23. package/dist/cjs/helpers/synthetic-native-wrap.js.map +1 -1
  24. package/dist/cjs/types/enums.js +1 -0
  25. package/dist/cjs/types/enums.js.map +1 -1
  26. package/dist/cjs/types/request.js +15 -2
  27. package/dist/cjs/types/request.js.map +1 -1
  28. package/dist/cjs/types/response.js +2 -1
  29. package/dist/cjs/types/response.js.map +1 -1
  30. package/dist/cjs/types/validation.js +21 -3
  31. package/dist/cjs/types/validation.js.map +1 -1
  32. package/dist/cjs/validations/compensation-hook.js +4 -5
  33. package/dist/cjs/validations/compensation-hook.js.map +1 -1
  34. package/dist/cjs/validations/cost-token.js +9 -1
  35. package/dist/cjs/validations/cost-token.js.map +1 -1
  36. package/dist/cjs/validations/echo-fields.js +18 -0
  37. package/dist/cjs/validations/echo-fields.js.map +1 -1
  38. package/dist/cjs/validations/evm-caveats.js +3 -0
  39. package/dist/cjs/validations/evm-caveats.js.map +1 -1
  40. package/dist/cjs/validations/evm-on-chain-intent.js +150 -0
  41. package/dist/cjs/validations/evm-on-chain-intent.js.map +1 -0
  42. package/dist/cjs/validations/evm-op-budget.js +23 -3
  43. package/dist/cjs/validations/evm-op-budget.js.map +1 -1
  44. package/dist/cjs/validations/evm-op-hook.js +6 -6
  45. package/dist/cjs/validations/evm-op-hook.js.map +1 -1
  46. package/dist/cjs/validations/evm-permit.js +17 -6
  47. package/dist/cjs/validations/evm-permit.js.map +1 -1
  48. package/dist/cjs/validations/evm-permit2.js +14 -6
  49. package/dist/cjs/validations/evm-permit2.js.map +1 -1
  50. package/dist/cjs/validations/evm-required-actions.js +26 -7
  51. package/dist/cjs/validations/evm-required-actions.js.map +1 -1
  52. package/dist/cjs/validations/evm-sign712-metamask.js +3 -126
  53. package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
  54. package/dist/cjs/validations/evm-sign712-shared.js +127 -0
  55. package/dist/cjs/validations/evm-sign712-shared.js.map +1 -1
  56. package/dist/cjs/validations/evm-sign712.js +18 -2
  57. package/dist/cjs/validations/evm-sign712.js.map +1 -1
  58. package/dist/cjs/validations/evm-sign7702.js +2 -0
  59. package/dist/cjs/validations/evm-sign7702.js.map +1 -1
  60. package/dist/cjs/validations/evm-transaction.js +7 -1
  61. package/dist/cjs/validations/evm-transaction.js.map +1 -1
  62. package/dist/cjs/validations/external-call.js +9 -20
  63. package/dist/cjs/validations/external-call.js.map +1 -1
  64. package/dist/cjs/validations/hook-version.js +35 -0
  65. package/dist/cjs/validations/hook-version.js.map +1 -0
  66. package/dist/cjs/validations/hooks-common.js +74 -199
  67. package/dist/cjs/validations/hooks-common.js.map +1 -1
  68. package/dist/cjs/validations/intent-destinations.js +52 -50
  69. package/dist/cjs/validations/intent-destinations.js.map +1 -1
  70. package/dist/cjs/validations/intent-tokens.js +319 -79
  71. package/dist/cjs/validations/intent-tokens.js.map +1 -1
  72. package/dist/cjs/validations/intent.js +34 -26
  73. package/dist/cjs/validations/intent.js.map +1 -1
  74. package/dist/cjs/validations/max-reserved.js +54 -0
  75. package/dist/cjs/validations/max-reserved.js.map +1 -0
  76. package/dist/cjs/validations/on-chain-intent-submission.js +70 -0
  77. package/dist/cjs/validations/on-chain-intent-submission.js.map +1 -0
  78. package/dist/cjs/validations/ptp.js +9 -6
  79. package/dist/cjs/validations/ptp.js.map +1 -1
  80. package/dist/cjs/validations/refill.js +11 -5
  81. package/dist/cjs/validations/refill.js.map +1 -1
  82. package/dist/cjs/validations/solana-hook.js +12 -64
  83. package/dist/cjs/validations/solana-hook.js.map +1 -1
  84. package/dist/cjs/validations/solana-op-budget.js +1 -1
  85. package/dist/cjs/validations/solana-op-budget.js.map +1 -1
  86. package/dist/cjs/validations/solana-op-wrap.js +29 -47
  87. package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
  88. package/dist/cjs/validations/solana-required-actions.js +2 -2
  89. package/dist/cjs/validations/solana-required-actions.js.map +1 -1
  90. package/dist/cjs/validations/solana-transaction.js +4 -53
  91. package/dist/cjs/validations/solana-transaction.js.map +1 -1
  92. package/dist/cjs/validations/total-dst-amount.js +19 -3
  93. package/dist/cjs/validations/total-dst-amount.js.map +1 -1
  94. package/dist/cjs/validations/trade-grouping.js +35 -9
  95. package/dist/cjs/validations/trade-grouping.js.map +1 -1
  96. package/dist/cjs/validations/trade-matching.js +1 -1
  97. package/dist/cjs/validations/trade-matching.js.map +1 -1
  98. package/dist/cjs/validations/trades.js +29 -9
  99. package/dist/cjs/validations/trades.js.map +1 -1
  100. package/dist/cjs/validator.js +28 -17
  101. package/dist/cjs/validator.js.map +1 -1
  102. package/dist/cjs/whitelists/environment-config.js +9 -28
  103. package/dist/cjs/whitelists/environment-config.js.map +1 -1
  104. package/dist/cjs/whitelists/types.js +2 -5
  105. package/dist/cjs/whitelists/types.js.map +1 -1
  106. package/dist/esm/graylists/evm/token-permit-metadata.js +7 -1
  107. package/dist/esm/graylists/evm/token-permit-metadata.js.map +1 -1
  108. package/dist/esm/helpers/address.js +133 -61
  109. package/dist/esm/helpers/address.js.map +1 -1
  110. package/dist/esm/helpers/amount.js +5 -0
  111. package/dist/esm/helpers/amount.js.map +1 -0
  112. package/dist/esm/helpers/evm-dln-hook-pack.js +15 -4
  113. package/dist/esm/helpers/evm-dln-hook-pack.js.map +1 -1
  114. package/dist/esm/helpers/evm-gas-compensation-tx.js +12 -27
  115. package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -1
  116. package/dist/esm/helpers/evm-intent-id-abi.js +7 -0
  117. package/dist/esm/helpers/evm-intent-id-abi.js.map +1 -1
  118. package/dist/esm/helpers/evm-trade-amounts.js +12 -4
  119. package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
  120. package/dist/esm/helpers/expected-delegate.js +2 -6
  121. package/dist/esm/helpers/expected-delegate.js.map +1 -1
  122. package/dist/esm/helpers/gas-compensation.js +9 -5
  123. package/dist/esm/helpers/gas-compensation.js.map +1 -1
  124. package/dist/esm/helpers/interactions.js +5 -21
  125. package/dist/esm/helpers/interactions.js.map +1 -1
  126. package/dist/esm/helpers/synthetic-native-wrap.js +4 -3
  127. package/dist/esm/helpers/synthetic-native-wrap.js.map +1 -1
  128. package/dist/esm/types/enums.js +1 -0
  129. package/dist/esm/types/enums.js.map +1 -1
  130. package/dist/esm/types/request.js +15 -2
  131. package/dist/esm/types/request.js.map +1 -1
  132. package/dist/esm/types/response.js +3 -2
  133. package/dist/esm/types/response.js.map +1 -1
  134. package/dist/esm/types/validation.js +21 -3
  135. package/dist/esm/types/validation.js.map +1 -1
  136. package/dist/esm/validations/compensation-hook.js +4 -5
  137. package/dist/esm/validations/compensation-hook.js.map +1 -1
  138. package/dist/esm/validations/cost-token.js +9 -1
  139. package/dist/esm/validations/cost-token.js.map +1 -1
  140. package/dist/esm/validations/echo-fields.js +18 -0
  141. package/dist/esm/validations/echo-fields.js.map +1 -1
  142. package/dist/esm/validations/evm-caveats.js +3 -0
  143. package/dist/esm/validations/evm-caveats.js.map +1 -1
  144. package/dist/esm/validations/evm-on-chain-intent.js +147 -0
  145. package/dist/esm/validations/evm-on-chain-intent.js.map +1 -0
  146. package/dist/esm/validations/evm-op-budget.js +25 -5
  147. package/dist/esm/validations/evm-op-budget.js.map +1 -1
  148. package/dist/esm/validations/evm-op-hook.js +8 -8
  149. package/dist/esm/validations/evm-op-hook.js.map +1 -1
  150. package/dist/esm/validations/evm-permit.js +18 -7
  151. package/dist/esm/validations/evm-permit.js.map +1 -1
  152. package/dist/esm/validations/evm-permit2.js +15 -7
  153. package/dist/esm/validations/evm-permit2.js.map +1 -1
  154. package/dist/esm/validations/evm-required-actions.js +28 -9
  155. package/dist/esm/validations/evm-required-actions.js.map +1 -1
  156. package/dist/esm/validations/evm-sign712-metamask.js +4 -126
  157. package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
  158. package/dist/esm/validations/evm-sign712-shared.js +126 -1
  159. package/dist/esm/validations/evm-sign712-shared.js.map +1 -1
  160. package/dist/esm/validations/evm-sign712.js +17 -2
  161. package/dist/esm/validations/evm-sign712.js.map +1 -1
  162. package/dist/esm/validations/evm-sign7702.js +2 -0
  163. package/dist/esm/validations/evm-sign7702.js.map +1 -1
  164. package/dist/esm/validations/evm-transaction.js +7 -1
  165. package/dist/esm/validations/evm-transaction.js.map +1 -1
  166. package/dist/esm/validations/external-call.js +10 -21
  167. package/dist/esm/validations/external-call.js.map +1 -1
  168. package/dist/esm/validations/hook-version.js +31 -0
  169. package/dist/esm/validations/hook-version.js.map +1 -0
  170. package/dist/esm/validations/hooks-common.js +75 -200
  171. package/dist/esm/validations/hooks-common.js.map +1 -1
  172. package/dist/esm/validations/intent-destinations.js +53 -51
  173. package/dist/esm/validations/intent-destinations.js.map +1 -1
  174. package/dist/esm/validations/intent-tokens.js +320 -80
  175. package/dist/esm/validations/intent-tokens.js.map +1 -1
  176. package/dist/esm/validations/intent.js +34 -26
  177. package/dist/esm/validations/intent.js.map +1 -1
  178. package/dist/esm/validations/max-reserved.js +51 -0
  179. package/dist/esm/validations/max-reserved.js.map +1 -0
  180. package/dist/esm/validations/on-chain-intent-submission.js +67 -0
  181. package/dist/esm/validations/on-chain-intent-submission.js.map +1 -0
  182. package/dist/esm/validations/ptp.js +9 -6
  183. package/dist/esm/validations/ptp.js.map +1 -1
  184. package/dist/esm/validations/refill.js +11 -5
  185. package/dist/esm/validations/refill.js.map +1 -1
  186. package/dist/esm/validations/solana-hook.js +12 -64
  187. package/dist/esm/validations/solana-hook.js.map +1 -1
  188. package/dist/esm/validations/solana-op-budget.js +1 -1
  189. package/dist/esm/validations/solana-op-budget.js.map +1 -1
  190. package/dist/esm/validations/solana-op-wrap.js +30 -48
  191. package/dist/esm/validations/solana-op-wrap.js.map +1 -1
  192. package/dist/esm/validations/solana-required-actions.js +2 -2
  193. package/dist/esm/validations/solana-required-actions.js.map +1 -1
  194. package/dist/esm/validations/solana-transaction.js +4 -53
  195. package/dist/esm/validations/solana-transaction.js.map +1 -1
  196. package/dist/esm/validations/total-dst-amount.js +20 -4
  197. package/dist/esm/validations/total-dst-amount.js.map +1 -1
  198. package/dist/esm/validations/trade-grouping.js +35 -10
  199. package/dist/esm/validations/trade-grouping.js.map +1 -1
  200. package/dist/esm/validations/trade-matching.js +1 -1
  201. package/dist/esm/validations/trade-matching.js.map +1 -1
  202. package/dist/esm/validations/trades.js +29 -9
  203. package/dist/esm/validations/trades.js.map +1 -1
  204. package/dist/esm/validator.js +28 -17
  205. package/dist/esm/validator.js.map +1 -1
  206. package/dist/esm/whitelists/environment-config.js +8 -27
  207. package/dist/esm/whitelists/environment-config.js.map +1 -1
  208. package/dist/esm/whitelists/types.js +3 -6
  209. package/dist/esm/whitelists/types.js.map +1 -1
  210. package/dist/types/graylists/evm/token-permit-metadata.d.ts.map +1 -1
  211. package/dist/types/helpers/address.d.ts +9 -5
  212. package/dist/types/helpers/address.d.ts.map +1 -1
  213. package/dist/types/helpers/amount.d.ts +2 -0
  214. package/dist/types/helpers/amount.d.ts.map +1 -0
  215. package/dist/types/helpers/evm-dln-hook-pack.d.ts +1 -0
  216. package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +1 -1
  217. package/dist/types/helpers/evm-gas-compensation-tx.d.ts +1 -3
  218. package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -1
  219. package/dist/types/helpers/evm-intent-id-abi.d.ts +111 -0
  220. package/dist/types/helpers/evm-intent-id-abi.d.ts.map +1 -1
  221. package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
  222. package/dist/types/helpers/expected-delegate.d.ts.map +1 -1
  223. package/dist/types/helpers/gas-compensation.d.ts.map +1 -1
  224. package/dist/types/helpers/interactions.d.ts.map +1 -1
  225. package/dist/types/helpers/synthetic-native-wrap.d.ts.map +1 -1
  226. package/dist/types/types/enums.d.ts +1 -0
  227. package/dist/types/types/enums.d.ts.map +1 -1
  228. package/dist/types/types/request.d.ts +32 -23
  229. package/dist/types/types/request.d.ts.map +1 -1
  230. package/dist/types/types/response.d.ts +10 -42
  231. package/dist/types/types/response.d.ts.map +1 -1
  232. package/dist/types/types/validation.d.ts +19 -4
  233. package/dist/types/types/validation.d.ts.map +1 -1
  234. package/dist/types/validations/compensation-hook.d.ts +1 -2
  235. package/dist/types/validations/compensation-hook.d.ts.map +1 -1
  236. package/dist/types/validations/cost-token.d.ts.map +1 -1
  237. package/dist/types/validations/echo-fields.d.ts.map +1 -1
  238. package/dist/types/validations/evm-caveats.d.ts.map +1 -1
  239. package/dist/types/validations/evm-on-chain-intent.d.ts +4 -0
  240. package/dist/types/validations/evm-on-chain-intent.d.ts.map +1 -0
  241. package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
  242. package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
  243. package/dist/types/validations/evm-permit.d.ts.map +1 -1
  244. package/dist/types/validations/evm-permit2.d.ts.map +1 -1
  245. package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
  246. package/dist/types/validations/evm-sign712-metamask.d.ts +0 -11
  247. package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
  248. package/dist/types/validations/evm-sign712-shared.d.ts +12 -0
  249. package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -1
  250. package/dist/types/validations/evm-sign712.d.ts +1 -0
  251. package/dist/types/validations/evm-sign712.d.ts.map +1 -1
  252. package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
  253. package/dist/types/validations/evm-transaction.d.ts +1 -1
  254. package/dist/types/validations/evm-transaction.d.ts.map +1 -1
  255. package/dist/types/validations/external-call.d.ts.map +1 -1
  256. package/dist/types/validations/hook-version.d.ts +7 -0
  257. package/dist/types/validations/hook-version.d.ts.map +1 -0
  258. package/dist/types/validations/hooks-common.d.ts +1 -4
  259. package/dist/types/validations/hooks-common.d.ts.map +1 -1
  260. package/dist/types/validations/intent-destinations.d.ts.map +1 -1
  261. package/dist/types/validations/intent-tokens.d.ts.map +1 -1
  262. package/dist/types/validations/max-reserved.d.ts +3 -0
  263. package/dist/types/validations/max-reserved.d.ts.map +1 -0
  264. package/dist/types/validations/on-chain-intent-submission.d.ts +3 -0
  265. package/dist/types/validations/on-chain-intent-submission.d.ts.map +1 -0
  266. package/dist/types/validations/ptp.d.ts.map +1 -1
  267. package/dist/types/validations/refill.d.ts.map +1 -1
  268. package/dist/types/validations/solana-hook.d.ts +1 -2
  269. package/dist/types/validations/solana-hook.d.ts.map +1 -1
  270. package/dist/types/validations/solana-op-wrap.d.ts +2 -2
  271. package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
  272. package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
  273. package/dist/types/validations/solana-transaction.d.ts +3 -3
  274. package/dist/types/validations/solana-transaction.d.ts.map +1 -1
  275. package/dist/types/validations/total-dst-amount.d.ts.map +1 -1
  276. package/dist/types/validations/trade-grouping.d.ts +1 -0
  277. package/dist/types/validations/trade-grouping.d.ts.map +1 -1
  278. package/dist/types/validations/trades.d.ts.map +1 -1
  279. package/dist/types/validator.d.ts.map +1 -1
  280. package/dist/types/whitelists/environment-config.d.ts +0 -1
  281. package/dist/types/whitelists/environment-config.d.ts.map +1 -1
  282. package/dist/types/whitelists/types.d.ts +0 -1
  283. package/dist/types/whitelists/types.d.ts.map +1 -1
  284. package/package.json +5 -2
package/README.md CHANGED
@@ -8,7 +8,7 @@ When a user submits a bundle request to the deBridge API, the response contains
8
8
 
9
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
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.
11
+ This SDK runs on the client before signing. It validates the response structure and checks signable payloads against the original request, protocol invariants, and environment-specific whitelists.
12
12
 
13
13
  ### Threats mitigated
14
14
 
@@ -23,11 +23,12 @@ This SDK runs on the client and independently verifies that every signable field
23
23
  npm install @debridge-finance/borderless-validation-sdk
24
24
  ```
25
25
 
26
- Peer dependencies:
26
+ Declared peer dependency ranges:
27
27
 
28
- ```bash
29
- npm install viem zod bs58 @solana/web3.js
30
- ```
28
+ - `@solana/web3.js >= 1.90.0`
29
+ - `bs58 >= 5.0.0`
30
+ - `viem >= 2.0.0`
31
+ - `zod ^3.0.0 || ^4.0.0`
31
32
 
32
33
  ## Basic usage
33
34
 
@@ -83,8 +84,6 @@ createValidator(config: ValidatorConfig): Validator
83
84
 
84
85
  type ValidatorConfig = {
85
86
  environment: Environment;
86
- allowLegacyHookV1?: boolean;
87
- validateSolverExecutorAddress?: boolean;
88
87
  };
89
88
 
90
89
  type Validator = {
@@ -115,9 +114,9 @@ The SDK is designed to run **between** receiving the API response and presenting
115
114
  ### 1. Where to call
116
115
 
117
116
  ```
118
- ┌──────────────┐ ┌─────────┐ ┌─────────────────-─┐ ┌──────────────┐
119
- │ Build request│ ──▶ │ fetch() │ ──▶ │ validator.validate│ ──▶ │ Sign / submit│
120
- └──────────────┘ └─────────┘ └──────────────────-┘ └──────────────┘
117
+ ┌───────────────┐ ┌─────────┐ ┌────────────────────┐ ┌───────────────┐
118
+ │ Build request │ ──▶ │ fetch() │ ──▶ │ validator.validate │ ──▶ │ Sign / submit │
119
+ └───────────────┘ └─────────┘ └────────────────────┘ └───────────────┘
121
120
  │
122
121
  ▼
123
122
  ok ? proceed : block
@@ -189,15 +188,125 @@ See [`src/README.md`](./src/README.md) for an overview of the source code struct
189
188
  - Zod 3 E2E compatibility tests (CI mode): `npm run test:e2e:zod3:ci`
190
189
  - Zod 3/4 full compatibility checks: `npm run test:zod-compat`
191
190
  - Unit test coverage: `npm run coverage`
192
- - E2E tests (hit the staging API): `npm run test:e2e`
191
+ - E2E tests (use the stage API by default; override with `API_BASE_URL`): `npm run test:e2e`
192
+ - E2E tests with validation-case recording: `npm run test:e2e:record-validation-cases`
193
193
  - E2E tests (CI mode, serial with longer timeout): `npm run test:e2e:ci`
194
194
  - E2E coverage: `npm run coverage:e2e`
195
+ - Download the matching Java validator CLI: `npm run download:java-validator-cli`
196
+ - Compare TypeScript and Java E2E validation results: `npm run test:e2e:java-parity`
195
197
  - Full build: `npm run build`
196
198
  - Build ESM only: `npm run build:esm`
197
199
  - Build CJS only: `npm run build:cjs`
198
200
  - Build type declarations only: `npm run build:types`
199
201
  - Clean build output: `npm run clean`
200
202
 
203
+ ## Java parity E2E validation
204
+
205
+ This check runs the repository's E2E validation cases through both the TypeScript SDK and its
206
+ Java port, then verifies that both implementations produce equivalent validation results.
207
+
208
+ ### 1. Running the check
209
+
210
+ Use the TypeScript SDK version from the root `package.json`:
211
+
212
+ ```bash
213
+ npm run test:e2e:java-parity
214
+ ```
215
+
216
+ To select the Java release associated with another TypeScript SDK version, pass that version
217
+ explicitly:
218
+
219
+ ```bash
220
+ npm run test:e2e:java-parity [-- <typescript-sdk-version>]
221
+ ```
222
+
223
+ The argument selects the Java release mapping only. It does not check out or install that version of the TypeScript SDK; TypeScript results always come from the current working tree.
224
+
225
+ The command requires Java and access to GitHub releases. For authenticated GitHub access, it uses
226
+ `GITHUB_TOKEN`, `GH_TOKEN`, or the token returned by `gh auth token`, in that order.
227
+
228
+ ### 2. Execution flow and generated files
229
+
230
+ The command performs the following steps:
231
+
232
+ 1. Determines the requested TypeScript SDK version from the command-line argument or the root
233
+ `package.json`.
234
+ 2. Finds the newest published Java release whose release notes contain
235
+ `TypeScript SDK tag: v<version>` and expects that release to contain exactly one `cli-*.jar`
236
+ asset.
237
+ 3. Downloads and verifies the Java CLI, unless the same verified release is already cached under:
238
+
239
+ ```text
240
+ .cache/java-validation-sdk/releases/<typescript-version>/<java-release-tag>/
241
+ ```
242
+
243
+ This directory contains the CLI JAR and its `metadata.json` cache metadata.
244
+ 4. Checks that the Java CLI supports the expected CLI contract version.
245
+ 5. Runs the regular TypeScript E2E suite with validation-case recording enabled. Every Jest worker
246
+ writes its validator inputs and TypeScript results to a separate JSONL file:
247
+
248
+ ```text
249
+ .cache/recorded-validation-cases/<date>__<unix-timestamp>/
250
+ └── recorded-cases__pid-<pid>.jsonl
251
+ ```
252
+
253
+ Each JSONL line contains the test identity, validator URL, request, response, validator config,
254
+ and TypeScript `ValidationResult` for one validator invocation.
255
+ 6. Sends every recorded input to the Java CLI daemon in the same order and reads one Java
256
+ `ValidationResult` per input.
257
+ 7. Compares the corresponding TypeScript and Java results. Up to ten mismatches are printed to the
258
+ console. The complete mismatch report is written to:
259
+
260
+ ```text
261
+ .cache/java-validation-sdk/parity-check-runs/<date>__<unix-timestamp>/mismatches.json
262
+ ```
263
+
264
+ The temporary `.cache/recorded-validation-cases/latest-run.json` file connects the E2E recorder to
265
+ the parity runner and is removed when the command finishes. A successful parity check also removes
266
+ its recorded validation cases. If E2E execution or parity comparison fails, the recorded cases are
267
+ preserved for investigation. A parity-check run directory is created only when mismatches need to
268
+ be reported.
269
+
270
+ ### 3. Comparison rules
271
+
272
+ The raw `ValidationResult` objects are not compared directly. Each result is reduced to this shape:
273
+
274
+ ```ts
275
+ {
276
+ ok: boolean;
277
+ violations: Array<{
278
+ code: string;
279
+ path: string;
280
+ expected?: unknown;
281
+ actual?: unknown;
282
+ }>;
283
+ }
284
+ ```
285
+
286
+ The comparison includes:
287
+
288
+ - the top-level `ok` value;
289
+ - the number of violations, including duplicate violations;
290
+ - each violation's `code` and `path`;
291
+ - the presence and JSON value of `expected` and `actual`;
292
+ - nested value types, string casing, and array element order inside `expected` and `actual`.
293
+
294
+ Before comparison:
295
+
296
+ - violations are sorted, so the order in which the two SDKs report violations does not matter;
297
+ - object keys are sorted recursively, so object property order does not matter;
298
+ - arrays are not sorted, so their element order remains significant.
299
+
300
+ The comparison intentionally ignores:
301
+
302
+ - violation `message` text;
303
+ - violation `details`;
304
+ - any other violation fields;
305
+ - any other top-level result fields.
306
+
307
+ After normalization, the two result objects are serialized and compared exactly. Any remaining
308
+ difference is reported as a parity mismatch.
309
+
201
310
  ## License
202
311
 
203
312
  BUSL-1.1
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.TOKEN_PERMIT_METADATA = void 0;
8
8
  exports.getTokenPermitMetadata = getTokenPermitMetadata;
9
9
  const enums_1 = require("../../types/enums");
10
+ const address_1 = require("../../helpers/address");
10
11
  // Note: addresses in this map MUST be lowercased.
11
12
  exports.TOKEN_PERMIT_METADATA = {
12
13
  // TODO: extend this verified-only graylist with additional tokens after
@@ -56,6 +57,11 @@ function getTokenPermitMetadata(realChainId, tokenAddress) {
56
57
  const chain = exports.TOKEN_PERMIT_METADATA[realChainId];
57
58
  if (!chain)
58
59
  return undefined;
59
- return chain[tokenAddress.toLowerCase()];
60
+ try {
61
+ return chain[(0, address_1.addressToHex)(realChainId, tokenAddress)];
62
+ }
63
+ catch {
64
+ return undefined;
65
+ }
60
66
  }
61
67
  //# sourceMappingURL=token-permit-metadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-permit-metadata.js","sourceRoot":"","sources":["../../../../src/graylists/evm/token-permit-metadata.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,mEAAmE;AACnE,oEAAoE;AACpE,oEAAoE;;;AAgEpE,wDAOC;AArED,6CAA4C;AAgB5C,kDAAkD;AACrC,QAAA,qBAAqB,GAA2B;IACzD,wEAAwE;IACxE,2EAA2E;IAC3E,uEAAuE;IACvE,kEAAkE;IAClE,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;QAChF,4CAA4C,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,EAAE;QACtF,4CAA4C,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;KACvE;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,OAAO,CAAC,EAAE;QACf,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,GAAG,CAAC,EAAE;QACX,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,SAAS,CAAC,EAAE;QACjB,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,IAAI,CAAC,EAAE;QACZ,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,SAAS,CAAC,EAAE;QACjB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;CACJ,CAAC;AAEF,SAAgB,sBAAsB,CAClC,WAAoB,EACpB,YAAoB;IAEpB,MAAM,KAAK,GAAG,6BAAqB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"token-permit-metadata.js","sourceRoot":"","sources":["../../../../src/graylists/evm/token-permit-metadata.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,mEAAmE;AACnE,oEAAoE;AACpE,oEAAoE;;;AAiEpE,wDAYC;AA3ED,6CAA4C;AAC5C,mDAAqD;AAgBrD,kDAAkD;AACrC,QAAA,qBAAqB,GAA2B;IACzD,wEAAwE;IACxE,2EAA2E;IAC3E,uEAAuE;IACvE,kEAAkE;IAClE,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;QAChF,4CAA4C,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,EAAE;QACtF,4CAA4C,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;KACvE;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,OAAO,CAAC,EAAE;QACf,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,GAAG,CAAC,EAAE;QACX,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,SAAS,CAAC,EAAE;QACjB,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,IAAI,CAAC,EAAE;QACZ,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,SAAS,CAAC,EAAE;QACjB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;CACJ,CAAC;AAEF,SAAgB,sBAAsB,CAClC,WAAoB,EACpB,YAAoB;IAEpB,MAAM,KAAK,GAAG,6BAAqB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,IAAI,CAAC;QACD,OAAO,KAAK,CAAC,IAAA,sBAAY,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC"}
@@ -7,11 +7,15 @@ exports.TRON_NATIVE_ADDRESS = void 0;
7
7
  exports.getChainEngine = getChainEngine;
8
8
  exports.isEvmHexAddress = isEvmHexAddress;
9
9
  exports.isTronAddress = isTronAddress;
10
+ exports.isTronAddressOrEvmHex = isTronAddressOrEvmHex;
11
+ exports.isSolanaAddress = isSolanaAddress;
12
+ exports.isAddressRepresentationValidForChain = isAddressRepresentationValidForChain;
13
+ exports.isAddressRepresentationValidForEngine = isAddressRepresentationValidForEngine;
10
14
  exports.evmHexToTronAddress = evmHexToTronAddress;
11
15
  exports.tronAddressToEvmHex = tronAddressToEvmHex;
12
- exports.normalizeAddress = normalizeAddress;
16
+ exports.getAddressIdentityKey = getAddressIdentityKey;
17
+ exports.getAddressIdentityKeyByValue = getAddressIdentityKeyByValue;
13
18
  exports.detectChainEngine = detectChainEngine;
14
- exports.normalizeAddressByValue = normalizeAddressByValue;
15
19
  exports.addressEquals = addressEquals;
16
20
  exports.addressToHex = addressToHex;
17
21
  exports.addressToHexByValue = addressToHexByValue;
@@ -22,8 +26,13 @@ const enums_1 = require("../types/enums");
22
26
  const solana_1 = require("../whitelists/solana");
23
27
  // Tron-specific addresses (Base58Check format)
24
28
  exports.TRON_NATIVE_ADDRESS = "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb";
25
- const EVM_HEX_ADDRESS_REGEX = /^0x[0-9a-f]{40}$/iu;
29
+ const EVM_HEX_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/u;
30
+ const EVM_ADDRESS_BYTE_LENGTH = 20;
31
+ const SOLANA_ADDRESS_BYTE_LENGTH = 32;
26
32
  const TRON_ADDRESS_PREFIX = 0x41;
33
+ const TRON_PAYLOAD_BYTE_LENGTH = 1 + EVM_ADDRESS_BYTE_LENGTH;
34
+ const TRON_CHECKSUM_BYTE_LENGTH = 4;
35
+ const TRON_ADDRESS_BYTE_LENGTH = TRON_PAYLOAD_BYTE_LENGTH + TRON_CHECKSUM_BYTE_LENGTH;
27
36
  function getChainEngine(chainId) {
28
37
  if (chainId === enums_1.ChainId.Tron)
29
38
  return enums_1.ChainEngine.Tron;
@@ -35,16 +44,25 @@ function isEvmHexAddress(address) {
35
44
  return EVM_HEX_ADDRESS_REGEX.test(address);
36
45
  }
37
46
  function isTronAddress(address) {
38
- if (!address)
39
- return false;
40
- if (address.startsWith("0x"))
41
- return false;
42
- if (!address.startsWith("T"))
43
- return false;
44
- if (address.length !== 34)
45
- return false;
46
- // AI: TODO: add Base58Check checksum verification if needed
47
- return true;
47
+ return decodeTronAddressBytes(address) !== undefined;
48
+ }
49
+ function isTronAddressOrEvmHex(address) {
50
+ return isEvmHexAddress(address) || isTronAddress(address);
51
+ }
52
+ function isSolanaAddress(address) {
53
+ return decodeSolanaAddressBytes(address) !== undefined;
54
+ }
55
+ // Use only for standalone semantic address fields. Encoded EIP-712, ABI and
56
+ // interaction fields keep their own stricter wire-format validation.
57
+ function isAddressRepresentationValidForChain(chainId, address) {
58
+ return isAddressRepresentationValidForEngine(getChainEngine(chainId), address);
59
+ }
60
+ function isAddressRepresentationValidForEngine(engine, address) {
61
+ if (engine === enums_1.ChainEngine.EVM)
62
+ return isEvmHexAddress(address);
63
+ if (engine === enums_1.ChainEngine.Tron)
64
+ return isTronAddressOrEvmHex(address);
65
+ return isSolanaAddress(address);
48
66
  }
49
67
  // Converts a 20-byte EVM hex address to Tron Base58Check format.
50
68
  function evmHexToTronAddress(evmAddress) {
@@ -55,83 +73,141 @@ function evmHexToTronAddress(evmAddress) {
55
73
  Uint8Array.of(TRON_ADDRESS_PREFIX),
56
74
  (0, viem_1.hexToBytes)(evmAddress),
57
75
  ]);
58
- const firstHash = (0, viem_1.sha256)(payload);
59
- const secondHash = (0, viem_1.sha256)((0, viem_1.hexToBytes)(firstHash));
60
- const checksum = (0, viem_1.hexToBytes)(secondHash).slice(0, 4);
76
+ const checksum = computeTronChecksum(payload);
61
77
  return bs58_1.default.encode((0, viem_1.concatBytes)([payload, checksum]));
62
78
  }
63
- // Converts Tron Base58Check address to EVM hex format (0x...)
64
- // Tron address = 0x41 (1 byte prefix) + 20 bytes address + 4 bytes checksum
65
- // We extract the 20-byte address part and return as 0x-prefixed hex
79
+ // Converts a valid Tron Base58Check address to its 20-byte EVM hex identity.
66
80
  function tronAddressToEvmHex(tronAddress) {
67
- const decoded = bs58_1.default.decode(tronAddress);
68
- // Skip first byte (0x41 prefix) and last 4 bytes (checksum)
69
- const addressBytes = decoded.slice(1, 21);
81
+ const addressBytes = decodeTronAddressBytes(tronAddress);
82
+ if (addressBytes === undefined) {
83
+ throw new Error(`Invalid Tron Base58Check address: ${tronAddress}`);
84
+ }
70
85
  return (0, viem_1.bytesToHex)(addressBytes);
71
86
  }
72
- // Normalizes address for comparison based on chain engine
73
- function normalizeAddress(chainId, address) {
87
+ // Builds a canonical address-byte key using the representation rules of the
88
+ // given chain. Malformed values have no address identity and return undefined.
89
+ function getAddressIdentityKey(chainId, address) {
74
90
  const engine = getChainEngine(chainId);
75
- return applyEngineNormalization(address, engine);
91
+ return toCanonicalAddressHex(address, engine);
76
92
  }
77
- // Detects the chain engine from the address value alone (no chainId required).
78
- // Useful when a chain is not fixed (e.g. destinationChainIds = "any").
93
+ // Builds an address identity key using only its own value — no chainId needed.
94
+ function getAddressIdentityKeyByValue(address) {
95
+ return toCanonicalAddressHexByValue(address);
96
+ }
97
+ // Detects the chain engine from a valid address value alone. Ambiguous 20-byte
98
+ // hex belongs to the EVM-compatible representation. Invalid values have no
99
+ // detectable chain engine.
79
100
  function detectChainEngine(address) {
80
- if (address.startsWith("0x"))
101
+ if (isEvmHexAddress(address))
81
102
  return enums_1.ChainEngine.EVM;
82
103
  if (isTronAddress(address))
83
104
  return enums_1.ChainEngine.Tron;
84
- return enums_1.ChainEngine.Solana;
85
- }
86
- // Normalizes an address using only its own value — no chainId needed.
87
- function normalizeAddressByValue(address) {
88
- return applyEngineNormalization(address, detectChainEngine(address));
89
- }
90
- function applyEngineNormalization(address, engine) {
91
- if (engine === enums_1.ChainEngine.Tron || engine === enums_1.ChainEngine.Solana) {
92
- return address; // case-sensitive
93
- }
94
- return address.toLowerCase(); // EVM: case-insensitive
105
+ if (isSolanaAddress(address))
106
+ return enums_1.ChainEngine.Solana;
107
+ return undefined;
95
108
  }
96
- // Compares two addresses with chain-aware normalization
97
- function addressEquals(chainId, a, b) {
98
- return normalizeAddress(chainId, a) === normalizeAddress(chainId, b);
109
+ // Compares canonical address identity. Field-specific format validation must
110
+ // happen separately; malformed values never compare equal and never throw.
111
+ function addressEquals(chainId, left, right) {
112
+ const engine = getChainEngine(chainId);
113
+ const leftCanonical = toCanonicalAddressHex(left, engine);
114
+ const rightCanonical = toCanonicalAddressHex(right, engine);
115
+ return leftCanonical !== undefined
116
+ && rightCanonical !== undefined
117
+ && leftCanonical === rightCanonical;
99
118
  }
100
119
  // Raw byte representation, used when an address flows into the intent ID
101
- // keccak256 hash. EVM → 20 bytes, Tron → 20 bytes (after stripping 0x41
102
- // prefix and checksum), Solana → 32 bytes (base58, no checksum).
120
+ // keccak256 hash. EVM → 20 bytes, Tron → 20 bytes, Solana → 32 bytes.
103
121
  function addressToHex(chainId, address) {
104
- return applyEngineToHex(address, getChainEngine(chainId));
122
+ const engine = getChainEngine(chainId);
123
+ const canonical = toCanonicalAddressHex(address, engine);
124
+ if (canonical === undefined) {
125
+ throw new Error(`Invalid ${enums_1.ChainEngine[engine]} address: ${address}`);
126
+ }
127
+ return canonical;
105
128
  }
106
129
  // Same as addressToHex but infers the engine from the address value alone.
107
130
  // Use when the chainId is unknown (e.g. destinationChainIds = "any").
108
131
  function addressToHexByValue(address) {
109
- return applyEngineToHex(address, detectChainEngine(address));
132
+ const canonical = toCanonicalAddressHexByValue(address);
133
+ if (canonical === undefined)
134
+ throw new Error(`Invalid address: ${address}`);
135
+ return canonical;
110
136
  }
111
- function applyEngineToHex(address, engine) {
112
- // API address parsing treats 0x-prefixed values as raw hex for every
113
- // chain, including Tron. Preserve that behavior before engine-specific
114
- // human-readable decoding.
115
- if (address.startsWith("0x")) {
116
- return address.toLowerCase();
137
+ // Checks if address is the native token for the given chain.
138
+ function isNativeToken(address, chainId) {
139
+ const engine = getChainEngine(chainId);
140
+ if (engine === enums_1.ChainEngine.Tron) {
141
+ // Accept strict Tron Base58Check and the equivalent 20-byte EVM hex representation.
142
+ return addressEquals(chainId, address, exports.TRON_NATIVE_ADDRESS);
143
+ }
144
+ if (engine === enums_1.ChainEngine.Solana) {
145
+ // Accept only a valid 32-byte Solana Base58 address.
146
+ return addressEquals(chainId, address, solana_1.SYSTEM_PROGRAM);
117
147
  }
148
+ // Accept only a valid 20-byte EVM hex address.
149
+ return isEvmHexAddress(address) && address.toLowerCase() === viem_1.zeroAddress;
150
+ }
151
+ function toCanonicalAddressHex(address, engine) {
118
152
  if (engine === enums_1.ChainEngine.EVM) {
119
- return address.toLowerCase();
153
+ return isEvmHexAddress(address) ? address.toLowerCase() : undefined;
120
154
  }
121
155
  if (engine === enums_1.ChainEngine.Tron) {
122
- return tronAddressToEvmHex(address);
156
+ if (isEvmHexAddress(address))
157
+ return address.toLowerCase();
158
+ const bytes = decodeTronAddressBytes(address);
159
+ return bytes === undefined ? undefined : (0, viem_1.bytesToHex)(bytes);
123
160
  }
124
- return (0, viem_1.bytesToHex)(bs58_1.default.decode(address));
161
+ const bytes = decodeSolanaAddressBytes(address);
162
+ return bytes === undefined ? undefined : (0, viem_1.bytesToHex)(bytes);
125
163
  }
126
- // Checks if address is the native token for the given chain.
127
- function isNativeToken(address, chainId) {
128
- const engine = getChainEngine(chainId);
129
- if (engine === enums_1.ChainEngine.Tron) {
130
- return address === exports.TRON_NATIVE_ADDRESS;
164
+ function toCanonicalAddressHexByValue(address) {
165
+ if (isEvmHexAddress(address))
166
+ return address.toLowerCase();
167
+ const tronBytes = decodeTronAddressBytes(address);
168
+ if (tronBytes !== undefined)
169
+ return (0, viem_1.bytesToHex)(tronBytes);
170
+ const solanaBytes = decodeSolanaAddressBytes(address);
171
+ return solanaBytes === undefined ? undefined : (0, viem_1.bytesToHex)(solanaBytes);
172
+ }
173
+ function decodeTronAddressBytes(address) {
174
+ const decoded = decodeBase58(address);
175
+ if (decoded === undefined || decoded.length !== TRON_ADDRESS_BYTE_LENGTH)
176
+ return undefined;
177
+ if (decoded[0] !== TRON_ADDRESS_PREFIX)
178
+ return undefined;
179
+ const payload = decoded.slice(0, TRON_PAYLOAD_BYTE_LENGTH);
180
+ const checksum = decoded.slice(TRON_PAYLOAD_BYTE_LENGTH);
181
+ if (!bytesEqual(checksum, computeTronChecksum(payload)))
182
+ return undefined;
183
+ return payload.slice(1);
184
+ }
185
+ function decodeSolanaAddressBytes(address) {
186
+ const decoded = decodeBase58(address);
187
+ return decoded?.length === SOLANA_ADDRESS_BYTE_LENGTH ? decoded : undefined;
188
+ }
189
+ function decodeBase58(value) {
190
+ if (value.length === 0)
191
+ return undefined;
192
+ try {
193
+ return bs58_1.default.decode(value);
131
194
  }
132
- if (engine === enums_1.ChainEngine.Solana) {
133
- return address === solana_1.SYSTEM_PROGRAM;
195
+ catch {
196
+ return undefined;
134
197
  }
135
- return address.toLowerCase() === viem_1.zeroAddress;
198
+ }
199
+ function computeTronChecksum(payload) {
200
+ const firstHash = (0, viem_1.sha256)(payload);
201
+ const secondHash = (0, viem_1.sha256)((0, viem_1.hexToBytes)(firstHash));
202
+ return (0, viem_1.hexToBytes)(secondHash).slice(0, TRON_CHECKSUM_BYTE_LENGTH);
203
+ }
204
+ function bytesEqual(left, right) {
205
+ if (left.length !== right.length)
206
+ return false;
207
+ for (let i = 0; i < left.length; i++) {
208
+ if (left[i] !== right[i])
209
+ return false;
210
+ }
211
+ return true;
136
212
  }
137
213
  //# sourceMappingURL=address.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/helpers/address.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/helpers/address.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isMaxAmountMode = isMaxAmountMode;
4
+ const types_1 = require("../types");
5
+ function isMaxAmountMode(amount) {
6
+ return amount === types_1.SpecialAmount.Max || amount === types_1.SpecialAmount.MaxReserved;
7
+ }
8
+ //# sourceMappingURL=amount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../src/helpers/amount.ts"],"names":[],"mappings":";;AAEA,0CAEC;AAJD,oCAAyC;AAEzC,SAAgB,eAAe,CAAC,MAAc;IAC1C,OAAO,MAAM,KAAK,qBAAa,CAAC,GAAG,IAAI,MAAM,KAAK,qBAAa,CAAC,WAAW,CAAC;AAChF,CAAC"}
@@ -2,9 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.packEvmHookV1 = packEvmHookV1;
4
4
  exports.packEvmTransactionCall = packEvmTransactionCall;
5
+ exports.packEvmTransactionCallForTrade = packEvmTransactionCallForTrade;
5
6
  exports.serializeDlnHook = serializeDlnHook;
6
7
  const viem_1 = require("viem");
7
8
  const enums_1 = require("../types/enums");
9
+ const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
10
+ const address_1 = require("./address");
8
11
  const hex_1 = require("./hex");
9
12
  // Hook envelope: ABI-encoded tuple prefixed with a `uint8 version=1` byte.
10
13
  // keccak256 of these bytes is what ends up in `intent.externalCallHash`.
@@ -60,6 +63,18 @@ function packEvmTransactionCall(data, dstChainAuthorityAddress) {
60
63
  targetPayload: inner,
61
64
  });
62
65
  }
66
+ function packEvmTransactionCallForTrade(data, trade) {
67
+ if (trade.dstChainAuthorityAddress === undefined) {
68
+ throw new Error("evm_transaction_call hook requires dstChainAuthorityAddress on the trade");
69
+ }
70
+ const realDestinationChainId = (0, subscription_to_chain_id_1.resolveChainId)(trade.dstChainId);
71
+ // The API converts a chain-native destination authority, including Tron
72
+ // Base58Check, to its raw address before ABI-encoding the EVM hook envelope.
73
+ const fallbackAddress = realDestinationChainId === undefined
74
+ ? trade.dstChainAuthorityAddress
75
+ : (0, address_1.addressToHex)(realDestinationChainId, trade.dstChainAuthorityAddress);
76
+ return packEvmTransactionCall(data, fallbackAddress);
77
+ }
63
78
  // Parses an EVM request trade's `dlnHook` JSON and returns the serialized
64
79
  // external-call bytes used for hashing. Returns `undefined` when the trade has
65
80
  // no hook. Throws on unknown / Solana hook types; Solana hooks are verified
@@ -73,10 +88,7 @@ function serializeDlnHook(trade) {
73
88
  case enums_1.DlnHookType.EvmHookV1:
74
89
  return packEvmHookV1(hook.data);
75
90
  case enums_1.DlnHookType.EvmTransactionCall: {
76
- if (trade.dstChainAuthorityAddress === undefined) {
77
- throw new Error("evm_transaction_call hook requires dstChainAuthorityAddress on the trade");
78
- }
79
- return packEvmTransactionCall(hook.data, trade.dstChainAuthorityAddress);
91
+ return packEvmTransactionCallForTrade(hook.data, trade);
80
92
  }
81
93
  case enums_1.DlnHookType.SolanaSerializedInstructions:
82
94
  throw new Error("Solana hook types are not folded into externalCallHash");
@@ -1 +1 @@
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
+ {"version":3,"file":"evm-dln-hook-pack.js","sourceRoot":"","sources":["../../../src/helpers/evm-dln-hook-pack.ts"],"names":[],"mappings":"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"}