zerc20-client-sdk 0.1.14 → 0.2.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 (304) hide show
  1. package/README.md +239 -25
  2. package/dist/chain/__tests__/metadata.test.d.ts +2 -0
  3. package/dist/chain/__tests__/metadata.test.d.ts.map +1 -0
  4. package/dist/chain/__tests__/metadata.test.js +162 -0
  5. package/dist/chain/__tests__/metadata.test.js.map +1 -0
  6. package/dist/chain/index.d.ts +3 -0
  7. package/dist/chain/index.d.ts.map +1 -0
  8. package/dist/chain/index.js +2 -0
  9. package/dist/chain/index.js.map +1 -0
  10. package/dist/chain/metadata.d.ts +38 -0
  11. package/dist/chain/metadata.d.ts.map +1 -0
  12. package/dist/chain/metadata.js +158 -0
  13. package/dist/chain/metadata.js.map +1 -0
  14. package/dist/chain/types.d.ts +18 -0
  15. package/dist/chain/types.d.ts.map +1 -0
  16. package/dist/chain/types.js +2 -0
  17. package/dist/chain/types.js.map +1 -0
  18. package/dist/constants.d.ts +3 -3
  19. package/dist/constants.js +3 -3
  20. package/dist/ic/__tests__/connections.test.js +16 -152
  21. package/dist/ic/__tests__/connections.test.js.map +1 -1
  22. package/dist/ic/__tests__/recipient.test.d.ts +2 -0
  23. package/dist/ic/__tests__/recipient.test.d.ts.map +1 -0
  24. package/dist/ic/__tests__/recipient.test.js +47 -0
  25. package/dist/ic/__tests__/recipient.test.js.map +1 -0
  26. package/dist/ic/authorization.js +2 -2
  27. package/dist/ic/authorization.js.map +1 -1
  28. package/dist/ic/connections.d.ts +0 -50
  29. package/dist/ic/connections.d.ts.map +1 -1
  30. package/dist/ic/connections.js +0 -127
  31. package/dist/ic/connections.js.map +1 -1
  32. package/dist/ic/index.d.ts +4 -8
  33. package/dist/ic/index.d.ts.map +1 -1
  34. package/dist/ic/index.js +3 -8
  35. package/dist/ic/index.js.map +1 -1
  36. package/dist/ic/recipient.d.ts +10 -0
  37. package/dist/ic/recipient.d.ts.map +1 -1
  38. package/dist/ic/recipient.js +21 -1
  39. package/dist/ic/recipient.js.map +1 -1
  40. package/dist/index.d.ts +14 -5
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +8 -5
  43. package/dist/index.js.map +1 -1
  44. package/dist/onchain/__tests__/contracts.test.js +2 -32
  45. package/dist/onchain/__tests__/contracts.test.js.map +1 -1
  46. package/dist/onchain/__tests__/decode.test.d.ts +2 -0
  47. package/dist/onchain/__tests__/decode.test.d.ts.map +1 -0
  48. package/dist/onchain/__tests__/decode.test.js +155 -0
  49. package/dist/onchain/__tests__/decode.test.js.map +1 -0
  50. package/dist/onchain/__tests__/tokenReads.test.d.ts +2 -0
  51. package/dist/onchain/__tests__/tokenReads.test.d.ts.map +1 -0
  52. package/dist/onchain/__tests__/tokenReads.test.js +60 -0
  53. package/dist/onchain/__tests__/tokenReads.test.js.map +1 -0
  54. package/dist/onchain/contracts.d.ts +3 -29734
  55. package/dist/onchain/contracts.d.ts.map +1 -1
  56. package/dist/onchain/contracts.js +3 -59
  57. package/dist/onchain/contracts.js.map +1 -1
  58. package/dist/onchain/decode.d.ts +39 -0
  59. package/dist/onchain/decode.d.ts.map +1 -0
  60. package/dist/onchain/decode.js +100 -0
  61. package/dist/onchain/decode.js.map +1 -0
  62. package/dist/onchain/tokenReads.d.ts +30 -0
  63. package/dist/onchain/tokenReads.d.ts.map +1 -0
  64. package/dist/onchain/tokenReads.js +51 -0
  65. package/dist/onchain/tokenReads.js.map +1 -0
  66. package/dist/operations/__tests__/invoice.test.js +52 -1
  67. package/dist/operations/__tests__/invoice.test.js.map +1 -1
  68. package/dist/operations/__tests__/privateSendTransfer.test.d.ts +2 -0
  69. package/dist/operations/__tests__/privateSendTransfer.test.d.ts.map +1 -0
  70. package/dist/operations/__tests__/privateSendTransfer.test.js +60 -0
  71. package/dist/operations/__tests__/privateSendTransfer.test.js.map +1 -0
  72. package/dist/operations/__tests__/reexports.test.js +1 -1
  73. package/dist/operations/__tests__/reexports.test.js.map +1 -1
  74. package/dist/operations/__tests__/teleportProof.test.js +35 -75
  75. package/dist/operations/__tests__/teleportProof.test.js.map +1 -1
  76. package/dist/operations/invoice.d.ts +14 -0
  77. package/dist/operations/invoice.d.ts.map +1 -1
  78. package/dist/operations/invoice.js +22 -0
  79. package/dist/operations/invoice.js.map +1 -1
  80. package/dist/operations/layerzeroScan/__tests__/codec.decode.test.d.ts +2 -0
  81. package/dist/operations/layerzeroScan/__tests__/codec.decode.test.d.ts.map +1 -0
  82. package/dist/operations/layerzeroScan/__tests__/codec.decode.test.js +57 -0
  83. package/dist/operations/layerzeroScan/__tests__/codec.decode.test.js.map +1 -0
  84. package/dist/operations/layerzeroScan/__tests__/codec.test.d.ts +2 -0
  85. package/dist/operations/layerzeroScan/__tests__/codec.test.d.ts.map +1 -0
  86. package/dist/operations/layerzeroScan/__tests__/codec.test.js +120 -0
  87. package/dist/operations/layerzeroScan/__tests__/codec.test.js.map +1 -0
  88. package/dist/operations/layerzeroScan/__tests__/formatters.test.d.ts +2 -0
  89. package/dist/operations/layerzeroScan/__tests__/formatters.test.d.ts.map +1 -0
  90. package/dist/operations/layerzeroScan/__tests__/formatters.test.js +164 -0
  91. package/dist/operations/layerzeroScan/__tests__/formatters.test.js.map +1 -0
  92. package/dist/operations/layerzeroScan/__tests__/integration.test.d.ts +2 -0
  93. package/dist/operations/layerzeroScan/__tests__/integration.test.d.ts.map +1 -0
  94. package/dist/operations/layerzeroScan/__tests__/integration.test.js +164 -0
  95. package/dist/operations/layerzeroScan/__tests__/integration.test.js.map +1 -0
  96. package/dist/operations/layerzeroScan/__tests__/scan.test.d.ts +2 -0
  97. package/dist/operations/layerzeroScan/__tests__/scan.test.d.ts.map +1 -0
  98. package/dist/operations/layerzeroScan/__tests__/scan.test.js +103 -0
  99. package/dist/operations/layerzeroScan/__tests__/scan.test.js.map +1 -0
  100. package/dist/operations/layerzeroScan/__tests__/status.test.d.ts +2 -0
  101. package/dist/operations/layerzeroScan/__tests__/status.test.d.ts.map +1 -0
  102. package/dist/operations/layerzeroScan/__tests__/status.test.js +153 -0
  103. package/dist/operations/layerzeroScan/__tests__/status.test.js.map +1 -0
  104. package/dist/operations/layerzeroScan/codec.d.ts +34 -0
  105. package/dist/operations/layerzeroScan/codec.d.ts.map +1 -0
  106. package/dist/operations/layerzeroScan/codec.js +79 -0
  107. package/dist/operations/layerzeroScan/codec.js.map +1 -0
  108. package/dist/operations/layerzeroScan/formatters.d.ts +26 -0
  109. package/dist/operations/layerzeroScan/formatters.d.ts.map +1 -0
  110. package/dist/operations/layerzeroScan/formatters.js +75 -0
  111. package/dist/operations/layerzeroScan/formatters.js.map +1 -0
  112. package/dist/operations/layerzeroScan/index.d.ts +9 -0
  113. package/dist/operations/layerzeroScan/index.d.ts.map +1 -0
  114. package/dist/operations/layerzeroScan/index.js +12 -0
  115. package/dist/operations/layerzeroScan/index.js.map +1 -0
  116. package/dist/operations/layerzeroScan/scan.d.ts +21 -0
  117. package/dist/operations/layerzeroScan/scan.d.ts.map +1 -0
  118. package/dist/operations/layerzeroScan/scan.js +70 -0
  119. package/dist/operations/layerzeroScan/scan.js.map +1 -0
  120. package/dist/operations/layerzeroScan/status.d.ts +17 -0
  121. package/dist/operations/layerzeroScan/status.d.ts.map +1 -0
  122. package/dist/operations/layerzeroScan/status.js +178 -0
  123. package/dist/operations/layerzeroScan/status.js.map +1 -0
  124. package/dist/operations/layerzeroScan/types.d.ts +181 -0
  125. package/dist/operations/layerzeroScan/types.d.ts.map +1 -0
  126. package/dist/operations/layerzeroScan/types.js +5 -0
  127. package/dist/operations/layerzeroScan/types.js.map +1 -0
  128. package/dist/operations/layerzeroScan.d.ts +5 -0
  129. package/dist/operations/layerzeroScan.d.ts.map +1 -0
  130. package/dist/operations/layerzeroScan.js +5 -0
  131. package/dist/operations/layerzeroScan.js.map +1 -0
  132. package/dist/operations/liquidityManager/__tests__/balance.test.js +24 -37
  133. package/dist/operations/liquidityManager/__tests__/balance.test.js.map +1 -1
  134. package/dist/operations/liquidityManager/__tests__/crossUnwrap.test.js +51 -31
  135. package/dist/operations/liquidityManager/__tests__/crossUnwrap.test.js.map +1 -1
  136. package/dist/operations/liquidityManager/__tests__/helpers.test.js +11 -8
  137. package/dist/operations/liquidityManager/__tests__/helpers.test.js.map +1 -1
  138. package/dist/operations/liquidityManager/__tests__/unwrap.test.js +68 -82
  139. package/dist/operations/liquidityManager/__tests__/unwrap.test.js.map +1 -1
  140. package/dist/operations/liquidityManager/__tests__/wrap.test.js +55 -64
  141. package/dist/operations/liquidityManager/__tests__/wrap.test.js.map +1 -1
  142. package/dist/operations/liquidityManager/abi.d.ts +57 -0
  143. package/dist/operations/liquidityManager/abi.d.ts.map +1 -0
  144. package/dist/operations/liquidityManager/abi.js +41 -0
  145. package/dist/operations/liquidityManager/abi.js.map +1 -0
  146. package/dist/operations/liquidityManager/balance.d.ts +3 -3
  147. package/dist/operations/liquidityManager/balance.d.ts.map +1 -1
  148. package/dist/operations/liquidityManager/balance.js +22 -15
  149. package/dist/operations/liquidityManager/balance.js.map +1 -1
  150. package/dist/operations/liquidityManager/crossUnwrap.d.ts +13 -11
  151. package/dist/operations/liquidityManager/crossUnwrap.d.ts.map +1 -1
  152. package/dist/operations/liquidityManager/crossUnwrap.js +44 -20
  153. package/dist/operations/liquidityManager/crossUnwrap.js.map +1 -1
  154. package/dist/operations/liquidityManager/helpers.d.ts +10 -15474
  155. package/dist/operations/liquidityManager/helpers.d.ts.map +1 -1
  156. package/dist/operations/liquidityManager/helpers.js +28 -18
  157. package/dist/operations/liquidityManager/helpers.js.map +1 -1
  158. package/dist/operations/liquidityManager/index.d.ts +1 -0
  159. package/dist/operations/liquidityManager/index.d.ts.map +1 -1
  160. package/dist/operations/liquidityManager/index.js +2 -0
  161. package/dist/operations/liquidityManager/index.js.map +1 -1
  162. package/dist/operations/liquidityManager/types.d.ts +1 -1
  163. package/dist/operations/liquidityManager/types.d.ts.map +1 -1
  164. package/dist/operations/liquidityManager/unwrap.d.ts +9 -9
  165. package/dist/operations/liquidityManager/unwrap.d.ts.map +1 -1
  166. package/dist/operations/liquidityManager/unwrap.js +48 -24
  167. package/dist/operations/liquidityManager/unwrap.js.map +1 -1
  168. package/dist/operations/liquidityManager/wrap.d.ts +7 -7
  169. package/dist/operations/liquidityManager/wrap.d.ts.map +1 -1
  170. package/dist/operations/liquidityManager/wrap.js +35 -16
  171. package/dist/operations/liquidityManager/wrap.js.map +1 -1
  172. package/dist/operations/privateSend.d.ts +33 -0
  173. package/dist/operations/privateSend.d.ts.map +1 -1
  174. package/dist/operations/privateSend.js +26 -0
  175. package/dist/operations/privateSend.js.map +1 -1
  176. package/dist/operations/receive/__tests__/announcementStatus.test.js +34 -11
  177. package/dist/operations/receive/__tests__/announcementStatus.test.js.map +1 -1
  178. package/dist/operations/receive/__tests__/cache.test.js +28 -167
  179. package/dist/operations/receive/__tests__/cache.test.js.map +1 -1
  180. package/dist/operations/receive/__tests__/createVerifierReader.test.d.ts +2 -0
  181. package/dist/operations/receive/__tests__/createVerifierReader.test.d.ts.map +1 -0
  182. package/dist/operations/receive/__tests__/createVerifierReader.test.js +28 -0
  183. package/dist/operations/receive/__tests__/createVerifierReader.test.js.map +1 -0
  184. package/dist/operations/receive/__tests__/helpers.test.js +9 -9
  185. package/dist/operations/receive/__tests__/helpers.test.js.map +1 -1
  186. package/dist/operations/receive/__tests__/redeemTransaction.test.d.ts +2 -0
  187. package/dist/operations/receive/__tests__/redeemTransaction.test.d.ts.map +1 -0
  188. package/dist/operations/receive/__tests__/redeemTransaction.test.js +258 -0
  189. package/dist/operations/receive/__tests__/redeemTransaction.test.js.map +1 -0
  190. package/dist/operations/receive/__tests__/submitRedeem.test.d.ts +2 -0
  191. package/dist/operations/receive/__tests__/submitRedeem.test.d.ts.map +1 -0
  192. package/dist/operations/receive/__tests__/submitRedeem.test.js +58 -0
  193. package/dist/operations/receive/__tests__/submitRedeem.test.js.map +1 -0
  194. package/dist/operations/receive/announcementStatus.d.ts +1 -1
  195. package/dist/operations/receive/announcementStatus.d.ts.map +1 -1
  196. package/dist/operations/receive/announcementStatus.js +7 -5
  197. package/dist/operations/receive/announcementStatus.js.map +1 -1
  198. package/dist/operations/receive/cache.d.ts +0 -18
  199. package/dist/operations/receive/cache.d.ts.map +1 -1
  200. package/dist/operations/receive/cache.js +0 -30
  201. package/dist/operations/receive/cache.js.map +1 -1
  202. package/dist/operations/receive/helpers.d.ts +14 -3
  203. package/dist/operations/receive/helpers.d.ts.map +1 -1
  204. package/dist/operations/receive/helpers.js +33 -3
  205. package/dist/operations/receive/helpers.js.map +1 -1
  206. package/dist/operations/receive/index.d.ts +6 -2
  207. package/dist/operations/receive/index.d.ts.map +1 -1
  208. package/dist/operations/receive/index.js +6 -1
  209. package/dist/operations/receive/index.js.map +1 -1
  210. package/dist/operations/receive/redeemTransaction.d.ts +30 -0
  211. package/dist/operations/receive/redeemTransaction.d.ts.map +1 -0
  212. package/dist/operations/receive/redeemTransaction.js +104 -0
  213. package/dist/operations/receive/redeemTransaction.js.map +1 -0
  214. package/dist/operations/receive/submitRedeem.d.ts +32 -0
  215. package/dist/operations/receive/submitRedeem.d.ts.map +1 -0
  216. package/dist/operations/receive/submitRedeem.js +27 -0
  217. package/dist/operations/receive/submitRedeem.js.map +1 -0
  218. package/dist/operations/receive/types.d.ts +53 -5
  219. package/dist/operations/receive/types.d.ts.map +1 -1
  220. package/dist/operations/teleportProof.d.ts +10 -31
  221. package/dist/operations/teleportProof.d.ts.map +1 -1
  222. package/dist/operations/teleportProof.js +14 -26
  223. package/dist/operations/teleportProof.js.map +1 -1
  224. package/dist/registry/__tests__/helpers.test.js +2 -44
  225. package/dist/registry/__tests__/helpers.test.js.map +1 -1
  226. package/dist/registry/__tests__/loader.test.js +17 -191
  227. package/dist/registry/__tests__/loader.test.js.map +1 -1
  228. package/dist/registry/__tests__/normalize.test.js +109 -1
  229. package/dist/registry/__tests__/normalize.test.js.map +1 -1
  230. package/dist/registry/helpers.d.ts +0 -7
  231. package/dist/registry/helpers.d.ts.map +1 -1
  232. package/dist/registry/helpers.js +0 -14
  233. package/dist/registry/helpers.js.map +1 -1
  234. package/dist/registry/index.d.ts +5 -5
  235. package/dist/registry/index.d.ts.map +1 -1
  236. package/dist/registry/index.js +4 -4
  237. package/dist/registry/index.js.map +1 -1
  238. package/dist/registry/loader.d.ts +0 -25
  239. package/dist/registry/loader.d.ts.map +1 -1
  240. package/dist/registry/loader.js +0 -68
  241. package/dist/registry/loader.js.map +1 -1
  242. package/dist/registry/normalize.d.ts +13 -1
  243. package/dist/registry/normalize.d.ts.map +1 -1
  244. package/dist/registry/normalize.js +43 -0
  245. package/dist/registry/normalize.js.map +1 -1
  246. package/dist/registry/types.d.ts +13 -2
  247. package/dist/registry/types.d.ts.map +1 -1
  248. package/dist/types/__tests__/evm.test.d.ts +2 -0
  249. package/dist/types/__tests__/evm.test.d.ts.map +1 -0
  250. package/dist/types/__tests__/evm.test.js +15 -0
  251. package/dist/types/__tests__/evm.test.js.map +1 -0
  252. package/dist/types/evm.d.ts +95 -0
  253. package/dist/types/evm.d.ts.map +1 -0
  254. package/dist/types/evm.js +11 -0
  255. package/dist/types/evm.js.map +1 -0
  256. package/dist/types.d.ts +15 -13
  257. package/dist/types.d.ts.map +1 -1
  258. package/dist/utils/__tests__/fees.test.js +66 -29
  259. package/dist/utils/__tests__/fees.test.js.map +1 -1
  260. package/dist/utils/__tests__/hex.test.js +64 -1
  261. package/dist/utils/__tests__/hex.test.js.map +1 -1
  262. package/dist/utils/__tests__/http.test.js +2 -64
  263. package/dist/utils/__tests__/http.test.js.map +1 -1
  264. package/dist/utils/fees.d.ts +7 -2
  265. package/dist/utils/fees.d.ts.map +1 -1
  266. package/dist/utils/fees.js +32 -16
  267. package/dist/utils/fees.js.map +1 -1
  268. package/dist/utils/hex.d.ts +11 -0
  269. package/dist/utils/hex.d.ts.map +1 -1
  270. package/dist/utils/hex.js +16 -1
  271. package/dist/utils/hex.js.map +1 -1
  272. package/dist/utils/http.d.ts +0 -27
  273. package/dist/utils/http.d.ts.map +1 -1
  274. package/dist/utils/http.js +0 -36
  275. package/dist/utils/http.js.map +1 -1
  276. package/dist/wasm/__tests__/functions.test.js +56 -1
  277. package/dist/wasm/__tests__/functions.test.js.map +1 -1
  278. package/dist/wasm/functions.d.ts +6 -0
  279. package/dist/wasm/functions.d.ts.map +1 -1
  280. package/dist/wasm/functions.js +17 -0
  281. package/dist/wasm/functions.js.map +1 -1
  282. package/dist/wasm/index.d.ts +1 -1
  283. package/dist/wasm/index.d.ts.map +1 -1
  284. package/dist/wasm/index.js +1 -1
  285. package/dist/wasm/index.js.map +1 -1
  286. package/dist/zkp/__tests__/proofService.test.js +34 -52
  287. package/dist/zkp/__tests__/proofService.test.js.map +1 -1
  288. package/dist/zkp/__tests__/workerClient.test.js +1 -40
  289. package/dist/zkp/__tests__/workerClient.test.js.map +1 -1
  290. package/dist/zkp/index.d.ts +1 -1
  291. package/dist/zkp/index.d.ts.map +1 -1
  292. package/dist/zkp/index.js +1 -1
  293. package/dist/zkp/index.js.map +1 -1
  294. package/dist/zkp/proofService.d.ts +6 -2
  295. package/dist/zkp/proofService.d.ts.map +1 -1
  296. package/dist/zkp/proofService.js +12 -15
  297. package/dist/zkp/proofService.js.map +1 -1
  298. package/dist/zkp/worker.js +2142 -42
  299. package/dist/zkp/worker.js.map +1 -1
  300. package/dist/zkp/workerClient.d.ts +0 -24
  301. package/dist/zkp/workerClient.d.ts.map +1 -1
  302. package/dist/zkp/workerClient.js +0 -36
  303. package/dist/zkp/workerClient.js.map +1 -1
  304. package/package.json +7 -6
package/README.md CHANGED
@@ -23,6 +23,27 @@ npm install zerc20-client-sdk
23
23
  - Node.js >= 18
24
24
  - Browser with WebAssembly support
25
25
 
26
+ ## Compatibility Notes
27
+
28
+ - This package is **ESM-only** (`"type": "module"`). CommonJS (`require`) is not supported.
29
+ - HTTP-based modules (e.g. Decider client, LayerZero Scan) rely on `fetch`.
30
+ - Node.js 18+ includes `fetch` globally.
31
+ - In custom runtimes, provide a compatible `fetch` implementation where needed.
32
+
33
+ ## Provider Abstraction (Library/Framework Agnostic)
34
+
35
+ The SDK public API is designed to be wallet/provider agnostic:
36
+
37
+ - Read paths accept `EvmReadProvider`
38
+ - Write paths accept `EvmWriteProvider`
39
+ - UI frameworks are not part of the SDK surface
40
+
41
+ This lets integrators use viem, ethers, web3.js, or custom adapters without depending on React/Vue internals.
42
+
43
+ ```typescript
44
+ import type { EvmReadProvider, EvmWriteProvider } from "zerc20-client-sdk";
45
+ ```
46
+
26
47
  ## Quick Start
27
48
 
28
49
  ```typescript
@@ -73,35 +94,31 @@ src/
73
94
  │ ├── invoice.ts # Invoice creation
74
95
  │ ├── teleport.ts # Single teleport proof
75
96
  │ ├── teleportProof.ts # Batch teleport proof (Nova + Decider)
76
- └── liquidityManager/ # Wrap/unwrap with slippage protection
97
+ ├── liquidityManager/ # Wrap/unwrap with slippage protection
98
+ │ └── layerzeroScan/ # LayerZero message tracking & decoding
77
99
  ├── wasm/ # WASM runtime & bindings
78
100
  │ ├── index.ts # WasmRuntime class
79
101
  │ ├── loader.ts # WASM bindings loader (browser/Node.js)
80
102
  │ └── serialization.ts # Type conversion utilities
81
103
  ├── zkp/ # Zero-knowledge proof orchestration
82
104
  ├── decider/ # Decider proof generation (HTTP client)
105
+ ├── chain/ # Chain metadata (names, explorers, aliases)
83
106
  ├── registry/ # Token & hub configuration
84
- ├── onchain/ # Viem contract bindings
107
+ ├── onchain/ # Contract interaction (ABI decoding, token reads)
85
108
  └── utils/ # Shared utilities
86
109
  ```
87
110
 
88
111
  ## Key Modules
89
112
 
90
- ### WasmRuntime
113
+ ### WASM Configuration
91
114
 
92
- Manages WASM module loading with dual runtime support (Browser/Node.js):
115
+ Configure the WASM runtime for cryptographic operations:
93
116
 
94
117
  ```typescript
95
- import { WasmRuntime, getDefaultWasmRuntime } from "zerc20-client-sdk";
118
+ import { configureWasmLocator } from "zerc20-client-sdk";
96
119
 
97
- // Use default singleton
98
- const runtime = getDefaultWasmRuntime();
99
- await runtime.ready();
100
-
101
- // Or create a custom instance
102
- const customRuntime = new WasmRuntime({
103
- url: "https://example.com/zerc20_wasm_bg.wasm",
104
- });
120
+ // Point to your hosted WASM binary
121
+ configureWasmLocator({ url: "/zerc20_wasm_bg.wasm" });
105
122
  ```
106
123
 
107
124
  ### StealthCanisterClient
@@ -133,7 +150,8 @@ import {
133
150
 
134
151
  // Local unwrap with slippage protection
135
152
  await unwrapWithLiquidityManager({
136
- walletClient,
153
+ writeProvider,
154
+ readProvider,
137
155
  liquidityManagerAddress,
138
156
  zerc20TokenAddress,
139
157
  amount: 1000n,
@@ -146,33 +164,229 @@ const quote = await buildCrossUnwrapQuote({
146
164
  destinationToken,
147
165
  amount: 1000n,
148
166
  account,
167
+ readProviderSource: sourceReadProvider,
168
+ readProviderDestination: destReadProvider,
149
169
  slippageBps: 50, // 0.5% slippage tolerance
150
170
  });
151
171
  ```
152
172
 
153
- ### Proof Generation
173
+ ### LayerZero Scan
174
+
175
+ Track and decode LayerZero cross-chain messages. Configuration and providers are injected as parameters, making this module framework-agnostic:
176
+
177
+ ```typescript
178
+ import {
179
+ fetchWalletStatus,
180
+ type FetchWalletStatusParams,
181
+ type LayerZeroScanConfig,
182
+ } from "zerc20-client-sdk";
183
+
184
+ const scanConfig: LayerZeroScanConfig = {
185
+ baseUrl: "https://scan.layerzero-api.com/v1/",
186
+ apiKey: "your-api-key", // optional
187
+ };
188
+
189
+ const result = await fetchWalletStatus({
190
+ address: "0xuser",
191
+ tokens,
192
+ scanConfig,
193
+ createReadProvider: (token) => createPublicClient({ chain: ... }),
194
+ limit: 10,
195
+ filterByToken: true,
196
+ });
197
+
198
+ // result.items: LayerZeroMessageSummary[]
199
+ // result.walletUrl: string (link to LZ Scan)
200
+ // result.nextToken: string | undefined (pagination cursor)
201
+ ```
202
+
203
+ Notes:
204
+ - `fetchWalletStatus` can use transaction input (`getTransaction`) and receipt logs (`getTransactionReceipt`) when available.
205
+ - If those methods are unavailable, decoding still falls back to payload-based paths where possible.
206
+
207
+ ### Seed Derivation
208
+
209
+ Derive a seed from a wallet signature. The SDK handles the message retrieval, signature validation, and keccak256 hashing internally, while accepting a wallet-agnostic sign function:
210
+
211
+ ```typescript
212
+ import { deriveSeed } from "zerc20-client-sdk";
213
+
214
+ // Works with any wallet library (wagmi, ethers.js, web3.js, etc.)
215
+ const seed = await deriveSeed(async (message) => {
216
+ // Return the signature as a 0x-prefixed hex string (65 bytes for personal_sign)
217
+ return wallet.signMessage(message);
218
+ });
219
+ ```
220
+
221
+ The function validates that the returned signature is a valid hex string of exactly 65 bytes before hashing. Invalid signatures throw descriptive errors to prevent silent seed misderivation.
222
+
223
+ ### Chain Metadata
224
+
225
+ Look up chain display names, short labels, block explorer URLs, and resolve chain name aliases — all from a single source of truth shared across products:
226
+
227
+ ```typescript
228
+ import {
229
+ getChainMetadata,
230
+ getChainDisplayName,
231
+ getExplorerTxUrl,
232
+ resolveChainId,
233
+ resolveNetworkDisplayName,
234
+ } from "zerc20-client-sdk";
235
+
236
+ getChainDisplayName(42161); // "Arbitrum"
237
+ getChainDisplayName(999999); // "Chain 999999"
238
+
239
+ getExplorerTxUrl(42161, "0xabc..."); // "https://arbiscan.io/tx/0xabc..."
240
+
241
+ resolveChainId("arb-sepolia"); // 421614
242
+ resolveNetworkDisplayName("arb-sepolia"); // "Arbitrum Sepolia"
243
+ ```
244
+
245
+ ### Token Loading with RPC Overrides
246
+
247
+ Load and normalize token configuration with runtime RPC URL overrides (e.g. environment-specific Alchemy/Infura endpoints):
248
+
249
+ ```typescript
250
+ import { normalizeTokensWithOverrides } from "zerc20-client-sdk";
251
+ import tokensJson from "./tokens.json";
252
+
253
+ const tokens = normalizeTokensWithOverrides(
254
+ tokensJson as TokensFile, // snake_case JSON is accepted as-is
255
+ {
256
+ tokens: {
257
+ "arb-mainnet": ["https://arb-mainnet.g.alchemy.com/v2/KEY"],
258
+ "base-mainnet": ["https://base-mainnet.g.alchemy.com/v2/KEY"],
259
+ },
260
+ hub: ["https://base-mainnet.g.alchemy.com/v2/KEY"],
261
+ },
262
+ );
263
+ ```
264
+
265
+ Without overrides, `normalizeTokensWithOverrides(file)` behaves identically to `normalizeTokens(file)`.
266
+
267
+ ### Redeem Flow
268
+
269
+ Prepare a redeem transaction from a collected redeem context. The SDK handles single vs batch proof selection, `GeneralRecipient` construction, and contract call parameter assembly internally:
154
270
 
155
271
  ```typescript
156
272
  import {
273
+ collectRedeemContext,
274
+ prepareRedeemTransaction,
275
+ createTeleportProofClient,
157
276
  HttpDeciderClient,
277
+ } from "zerc20-client-sdk";
278
+
279
+ // Initialize proof client and decider
280
+ const teleportProofClient = createTeleportProofClient();
281
+ const decider = new HttpDeciderClient("https://decider.example.com");
282
+
283
+ // 1. Collect redeem context (eligible events, proofs, etc.)
284
+ const redeemContext = await collectRedeemContext({ burn, tokens, hub, verifierContract, indexerUrl });
285
+
286
+ // 2. Prepare the transaction (SDK picks single vs batch automatically)
287
+ const tx = await prepareRedeemTransaction({
288
+ redeemContext,
289
+ burn,
290
+ teleportProofClient,
291
+ decider, // required only when eligible.length > 1
292
+ });
293
+
294
+ // 3. Submit via your wallet library
295
+ const hash = await walletClient.writeContract({
296
+ address: tx.address as `0x${string}`,
297
+ abi: tx.abi,
298
+ functionName: tx.functionName,
299
+ args: tx.args,
300
+ account,
301
+ chain,
302
+ });
303
+ ```
304
+
305
+ The returned `RedeemTransaction` is pure data (`{ address, abi, functionName, args, mode }`) with no wallet dependency.
306
+
307
+ #### Manual batch flow with UI progress
308
+
309
+ For batch redeems, callers can use the 2-step proof API to insert UI updates between Nova and Decider steps:
310
+
311
+ ```typescript
312
+ import {
313
+ collectRedeemContext,
314
+ buildBatchRedeemTransaction,
158
315
  createTeleportProofClient,
159
- getDefaultWasmRuntime,
316
+ HttpDeciderClient,
160
317
  } from "zerc20-client-sdk";
161
318
 
162
- const runtime = getDefaultWasmRuntime();
163
- await runtime.ready();
319
+ const teleportProofClient = createTeleportProofClient();
320
+ const decider = new HttpDeciderClient("https://decider.example.com");
321
+ const redeemContext = await collectRedeemContext({ burn, tokens, hub, verifierContract, indexerUrl });
322
+
323
+ // Step 1: Nova proof
324
+ const novaResult = await teleportProofClient.createNovaProof({
325
+ aggregationState: redeemContext.aggregationState,
326
+ recipientFr: burn.generalRecipient.fr,
327
+ secretHex: burn.secret,
328
+ events: redeemContext.events.eligible,
329
+ proofs: redeemContext.globalProofs,
330
+ });
331
+
332
+ updateUI("Requesting decider proof…"); // ← insert UI update here
333
+
334
+ // Step 2: Decider proof
335
+ const deciderProof = await teleportProofClient.requestDeciderProof(decider, novaResult.ivcProof);
164
336
 
165
- const proofClient = createTeleportProofClient({ wasm: runtime });
337
+ // Step 3: Build transaction
338
+ const tx = buildBatchRedeemTransaction({ redeemContext, burn, deciderProof });
339
+ ```
340
+
341
+ ### LayerZero Decode Utilities
342
+
343
+ Decode LayerZero OFT transaction data — `send()` calldata, `OFTSent` event logs, and BridgeRequest compose messages:
344
+
345
+ ```typescript
346
+ import {
347
+ decodeSendPayload,
348
+ extractOftSentAmount,
349
+ decodeBridgeRequest,
350
+ } from "zerc20-client-sdk";
351
+
352
+ // Decode send() transaction input
353
+ const payload = decodeSendPayload(txData);
354
+ // → { dstEid, to, amountLD, minAmountLD, composeMsg }
355
+
356
+ // Extract amountReceivedLD from OFTSent event logs
357
+ const amount = extractOftSentAmount(receipt.logs);
358
+
359
+ // Decode a BridgeRequest compose message (returns null on failure)
360
+ const bridgeReq = decodeBridgeRequest(payload.composeMsg);
361
+ // → { dstEid, to, refundAddress, minAmountOut } | null
362
+ ```
363
+
364
+ ### Proof Generation
365
+
366
+ ```typescript
367
+ import {
368
+ HttpDeciderClient,
369
+ createTeleportProofClient,
370
+ } from "zerc20-client-sdk";
371
+
372
+ const proofClient = createTeleportProofClient();
166
373
 
167
374
  // Single teleport proof (Groth16)
168
375
  const singleProof = await proofClient.createSingleTeleportProof(/* ... */);
169
376
 
170
- // Batch teleport proof (Nova + Decider)
171
- const decider = new HttpDeciderClient("https://decider.example.com");
172
- const batchProof = await proofClient.createBatchTeleportProof({
173
- decider,
174
- // ... other inputs
377
+ // Batch teleport proof (Nova + Decider) — two-step API
378
+ const novaResult = await proofClient.createNovaProof({
379
+ aggregationState,
380
+ recipientFr,
381
+ secretHex,
382
+ events,
383
+ proofs,
175
384
  });
385
+
386
+ // Callers can update UI between steps (e.g. progress indicators)
387
+
388
+ const decider = new HttpDeciderClient("https://decider.example.com");
389
+ const deciderProof = await proofClient.requestDeciderProof(decider, novaResult.ivcProof);
176
390
  ```
177
391
 
178
392
  ## Development
@@ -201,7 +415,7 @@ npm run typecheck
201
415
  npm test
202
416
  ```
203
417
 
204
- **Current (as of 2026-02-06): 755 passed, 2 skipped**
418
+ **Current (as of 2026-03-05): 943 passed, 2 skipped**
205
419
  Note: This number will drift over time; treat `npm test` output as the source of truth.
206
420
 
207
421
  ### Skipped Tests
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metadata.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.test.d.ts","sourceRoot":"","sources":["../../../src/chain/__tests__/metadata.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,162 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getChainMetadata, getChainDisplayName, getChainShortName, getExplorerTxUrl, resolveChainId, resolveNetworkDisplayName, } from "../metadata.js";
3
+ // ── getChainMetadata ────────────────────────────────────────────────
4
+ describe("getChainMetadata", () => {
5
+ it.each([
6
+ [1, "Ethereum"],
7
+ [42161, "Arbitrum"],
8
+ [10, "Optimism"],
9
+ [8453, "Base"],
10
+ [56, "BNB Chain"],
11
+ [11155111, "Ethereum Sepolia"],
12
+ [421614, "Arbitrum Sepolia"],
13
+ [11155420, "Optimism Sepolia"],
14
+ [84532, "Base Sepolia"],
15
+ [97, "BNB Testnet"],
16
+ ])("returns metadata for chain %i (%s)", (chainId, expectedName) => {
17
+ const meta = getChainMetadata(chainId);
18
+ expect(meta).toBeDefined();
19
+ expect(meta.name).toBe(expectedName);
20
+ expect(meta.shortName).toBeTruthy();
21
+ expect(meta.explorerUrl).toMatch(/^https:\/\//);
22
+ });
23
+ it("returns undefined for an unknown chain", () => {
24
+ expect(getChainMetadata(999999)).toBeUndefined();
25
+ });
26
+ it("accepts bigint chain IDs", () => {
27
+ expect(getChainMetadata(42161n)?.name).toBe("Arbitrum");
28
+ expect(getChainMetadata(999999n)).toBeUndefined();
29
+ });
30
+ });
31
+ // ── getChainDisplayName ─────────────────────────────────────────────
32
+ describe("getChainDisplayName", () => {
33
+ it("returns the display name for known chains", () => {
34
+ expect(getChainDisplayName(42161)).toBe("Arbitrum");
35
+ expect(getChainDisplayName(11155111)).toBe("Ethereum Sepolia");
36
+ });
37
+ it("falls back to 'Chain {id}' for unknown chains", () => {
38
+ expect(getChainDisplayName(123456)).toBe("Chain 123456");
39
+ });
40
+ it("accepts bigint chain IDs", () => {
41
+ expect(getChainDisplayName(42161n)).toBe("Arbitrum");
42
+ expect(getChainDisplayName(123456n)).toBe("Chain 123456");
43
+ });
44
+ });
45
+ // ── getChainShortName ───────────────────────────────────────────────
46
+ describe("getChainShortName", () => {
47
+ it("returns short name for known chains", () => {
48
+ expect(getChainShortName(42161)).toBe("ARB");
49
+ expect(getChainShortName(10)).toBe("OP");
50
+ expect(getChainShortName(8453)).toBe("BASE");
51
+ });
52
+ it("returns undefined for unknown chains", () => {
53
+ expect(getChainShortName(999999)).toBeUndefined();
54
+ });
55
+ });
56
+ // ── getExplorerTxUrl ────────────────────────────────────────────────
57
+ describe("getExplorerTxUrl", () => {
58
+ const txHash = "0xabc123";
59
+ it.each([
60
+ [1, "https://etherscan.io/tx/0xabc123"],
61
+ [42161, "https://arbiscan.io/tx/0xabc123"],
62
+ [10, "https://optimistic.etherscan.io/tx/0xabc123"],
63
+ [8453, "https://basescan.org/tx/0xabc123"],
64
+ [56, "https://bscscan.com/tx/0xabc123"],
65
+ [11155111, "https://sepolia.etherscan.io/tx/0xabc123"],
66
+ [421614, "https://sepolia.arbiscan.io/tx/0xabc123"],
67
+ [11155420, "https://sepolia-optimism.etherscan.io/tx/0xabc123"],
68
+ [84532, "https://sepolia.basescan.org/tx/0xabc123"],
69
+ [97, "https://testnet.bscscan.com/tx/0xabc123"],
70
+ ])("builds correct URL for chain %i", (chainId, expectedUrl) => {
71
+ expect(getExplorerTxUrl(chainId, txHash)).toBe(expectedUrl);
72
+ });
73
+ it("returns undefined for unknown chain", () => {
74
+ expect(getExplorerTxUrl(999999, txHash)).toBeUndefined();
75
+ });
76
+ it("accepts bigint chain IDs", () => {
77
+ expect(getExplorerTxUrl(42161n, txHash)).toBe("https://arbiscan.io/tx/0xabc123");
78
+ });
79
+ });
80
+ // ── resolveChainId ──────────────────────────────────────────────────
81
+ describe("resolveChainId", () => {
82
+ it.each([
83
+ // mainnet names
84
+ ["ethereum", 1],
85
+ ["eth", 1],
86
+ ["eth-mainnet", 1],
87
+ ["arbitrum", 42161],
88
+ ["arb", 42161],
89
+ ["arb-mainnet", 42161],
90
+ ["optimism", 10],
91
+ ["op", 10],
92
+ ["op-mainnet", 10],
93
+ ["base", 8453],
94
+ ["base-mainnet", 8453],
95
+ ["bnb", 56],
96
+ ["bsc", 56],
97
+ // testnet names
98
+ ["sepolia", 11155111],
99
+ ["ethereum-sepolia", 11155111],
100
+ ["arb-sepolia", 421614],
101
+ ["arbitrum-sepolia", 421614],
102
+ ["op-sepolia", 11155420],
103
+ ["optimism-sepolia", 11155420],
104
+ ["base-sepolia", 84532],
105
+ ["bnb-testnet", 97],
106
+ ["bsc-testnet", 97],
107
+ ])("resolves '%s' → %i", (name, expectedId) => {
108
+ expect(resolveChainId(name)).toBe(expectedId);
109
+ });
110
+ it("is case-insensitive", () => {
111
+ expect(resolveChainId("Ethereum")).toBe(1);
112
+ expect(resolveChainId("ARB-SEPOLIA")).toBe(421614);
113
+ expect(resolveChainId(" Base ")).toBe(8453);
114
+ });
115
+ it("returns undefined for unknown names", () => {
116
+ expect(resolveChainId("solana")).toBeUndefined();
117
+ expect(resolveChainId("")).toBeUndefined();
118
+ });
119
+ });
120
+ // ── resolveNetworkDisplayName ───────────────────────────────────────
121
+ describe("resolveNetworkDisplayName", () => {
122
+ it.each([
123
+ ["sepolia", "Ethereum Sepolia"],
124
+ ["arb-sepolia", "Arbitrum Sepolia"],
125
+ ["op-sepolia", "Optimism Sepolia"],
126
+ ["base-sepolia", "Base Sepolia"],
127
+ ["bnb-testnet", "BNB Testnet"],
128
+ ["bsc-testnet", "BNB Testnet"],
129
+ ["ethereum-sepolia", "Ethereum Sepolia"],
130
+ ["arbitrum-sepolia", "Arbitrum Sepolia"],
131
+ ["optimism-sepolia", "Optimism Sepolia"],
132
+ ["eth-mainnet", "Ethereum"],
133
+ ["arb-mainnet", "Arbitrum"],
134
+ ["op-mainnet", "Optimism"],
135
+ ["base-mainnet", "Base"],
136
+ ["ethereum", "Ethereum"],
137
+ ["arbitrum", "Arbitrum"],
138
+ ["optimism", "Optimism"],
139
+ ["base", "Base"],
140
+ ["bsc", "BNB Chain"],
141
+ ["arb", "Arbitrum"],
142
+ ["op", "Optimism"],
143
+ ["bnb", "BNB Chain"],
144
+ ])("resolves '%s' → '%s'", (label, expected) => {
145
+ expect(resolveNetworkDisplayName(label)).toBe(expected);
146
+ });
147
+ it("is case-insensitive", () => {
148
+ expect(resolveNetworkDisplayName("ETHEREUM")).toBe("Ethereum");
149
+ expect(resolveNetworkDisplayName("Arb-Sepolia")).toBe("Arbitrum Sepolia");
150
+ });
151
+ it("capitalizes unknown labels as fallback", () => {
152
+ expect(resolveNetworkDisplayName("polygon")).toBe("Polygon");
153
+ expect(resolveNetworkDisplayName("mychain")).toBe("Mychain");
154
+ });
155
+ it("trims whitespace and preserves original casing in fallback", () => {
156
+ expect(resolveNetworkDisplayName(" polygon ")).toBe("Polygon");
157
+ expect(resolveNetworkDisplayName("POLYGON")).toBe("POLYGON");
158
+ expect(resolveNetworkDisplayName(" MYCHAIN ")).toBe("MYCHAIN");
159
+ expect(resolveNetworkDisplayName("FOOBar")).toBe("FOOBar");
160
+ });
161
+ });
162
+ //# sourceMappingURL=metadata.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.test.js","sourceRoot":"","sources":["../../../src/chain/__tests__/metadata.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { ChainMetadata } from "./types.js";
2
+ export { getChainMetadata, getChainDisplayName, getChainShortName, getExplorerTxUrl, resolveChainId, resolveNetworkDisplayName, } from "./metadata.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chain/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,yBAAyB,GAC1B,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { getChainMetadata, getChainDisplayName, getChainShortName, getExplorerTxUrl, resolveChainId, resolveNetworkDisplayName, } from "./metadata.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chain/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,yBAAyB,GAC1B,MAAM,eAAe,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { ChainMetadata } from "./types.js";
2
+ /**
3
+ * Returns chain metadata for the given chain ID, or `undefined` if unknown.
4
+ * Accepts both `number` and `bigint` to align with SDK's `TokenEntry.chainId`.
5
+ */
6
+ export declare function getChainMetadata(chainId: number | bigint): ChainMetadata | undefined;
7
+ /**
8
+ * Returns a human-readable chain name.
9
+ * Falls back to `"Chain {chainId}"` when the chain is not recognised.
10
+ */
11
+ export declare function getChainDisplayName(chainId: number | bigint): string;
12
+ /**
13
+ * Returns the short label for a chain (e.g. "ARB", "ETH").
14
+ * Falls back to `undefined` when the chain is not recognised.
15
+ */
16
+ export declare function getChainShortName(chainId: number | bigint): string | undefined;
17
+ /**
18
+ * Builds a block-explorer transaction URL.
19
+ * Returns `undefined` when the chain is not recognised.
20
+ */
21
+ export declare function getExplorerTxUrl(chainId: number | bigint, txHash: string): string | undefined;
22
+ /**
23
+ * Resolves a chain name or token label to an EVM chain ID.
24
+ * The lookup is case-insensitive.
25
+ * Returns `undefined` when the name is not recognised.
26
+ */
27
+ export declare function resolveChainId(name: string): number | undefined;
28
+ /**
29
+ * Converts a token / network label (e.g. "arb-sepolia", "ethereum")
30
+ * to a user-friendly display name (e.g. "Arbitrum Sepolia", "Ethereum").
31
+ *
32
+ * Resolution order:
33
+ * 1. Override table ({@link LABEL_DISPLAY_OVERRIDES})
34
+ * 2. Resolve label → chainId → metadata name
35
+ * 3. Capitalize the first letter of the label as a last resort
36
+ */
37
+ export declare function resolveNetworkDisplayName(label: string): string;
38
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/chain/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAmGhD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAEpF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAGpE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI7F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgB/D"}