zklicensing 0.1.0-beta.2 → 0.1.0-beta.21

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 (317) hide show
  1. package/README.md +417 -201
  2. package/build/agent.d.ts +371 -0
  3. package/build/agent.d.ts.map +1 -0
  4. package/build/agent.js +553 -0
  5. package/build/agent.js.map +1 -0
  6. package/build/agentActions.d.ts +841 -0
  7. package/build/agentActions.d.ts.map +1 -0
  8. package/build/agentActions.js +581 -0
  9. package/build/agentActions.js.map +1 -0
  10. package/build/agentRecord.d.ts +83 -0
  11. package/build/agentRecord.d.ts.map +1 -0
  12. package/build/agentRecord.js +69 -0
  13. package/build/agentRecord.js.map +1 -0
  14. package/build/agentVendor.d.ts +220 -0
  15. package/build/agentVendor.d.ts.map +1 -0
  16. package/build/agentVendor.js +306 -0
  17. package/build/agentVendor.js.map +1 -0
  18. package/build/appsLookup.d.ts +14 -0
  19. package/build/appsLookup.d.ts.map +1 -0
  20. package/build/appsLookup.js +12 -0
  21. package/build/appsLookup.js.map +1 -0
  22. package/build/archiveBootstrap.d.ts +31 -5
  23. package/build/archiveBootstrap.d.ts.map +1 -0
  24. package/build/archiveBootstrap.js +140 -47
  25. package/build/archiveBootstrap.js.map +1 -0
  26. package/build/atomicJson.d.ts +5 -0
  27. package/build/atomicJson.d.ts.map +1 -0
  28. package/build/atomicJson.js +55 -0
  29. package/build/atomicJson.js.map +1 -0
  30. package/build/bindClient.d.ts +85 -0
  31. package/build/bindClient.d.ts.map +1 -0
  32. package/build/bindClient.js +187 -0
  33. package/build/bindClient.js.map +1 -0
  34. package/build/buyClient.d.ts +27 -4
  35. package/build/buyClient.d.ts.map +1 -0
  36. package/build/buyClient.js +72 -26
  37. package/build/buyClient.js.map +1 -0
  38. package/build/chainHead.d.ts +61 -0
  39. package/build/chainHead.d.ts.map +1 -0
  40. package/build/chainHead.js +88 -0
  41. package/build/chainHead.js.map +1 -0
  42. package/build/compactMerkleMap.d.ts +72 -0
  43. package/build/compactMerkleMap.d.ts.map +1 -0
  44. package/build/compactMerkleMap.js +224 -0
  45. package/build/compactMerkleMap.js.map +1 -0
  46. package/build/contractInterface.d.ts +191 -51
  47. package/build/contractInterface.d.ts.map +1 -0
  48. package/build/contractInterface.js +234 -43
  49. package/build/contractInterface.js.map +1 -0
  50. package/build/contractTypes.d.ts +9 -0
  51. package/build/contractTypes.d.ts.map +1 -0
  52. package/build/contractTypes.js +28 -0
  53. package/build/contractTypes.js.map +1 -0
  54. package/build/countryStats.d.ts +12 -3
  55. package/build/countryStats.d.ts.map +1 -0
  56. package/build/countryStats.js +87 -23
  57. package/build/countryStats.js.map +1 -0
  58. package/build/deployClient.d.ts +138 -24
  59. package/build/deployClient.d.ts.map +1 -0
  60. package/build/deployClient.js +91 -31
  61. package/build/deployClient.js.map +1 -0
  62. package/build/deviceIdentity.d.ts +68 -0
  63. package/build/deviceIdentity.d.ts.map +1 -0
  64. package/build/deviceIdentity.js +209 -0
  65. package/build/deviceIdentity.js.map +1 -0
  66. package/build/freezeClient.d.ts +26 -6
  67. package/build/freezeClient.d.ts.map +1 -0
  68. package/build/freezeClient.js +30 -6
  69. package/build/freezeClient.js.map +1 -0
  70. package/build/generationClient.d.ts +6 -3
  71. package/build/generationClient.d.ts.map +1 -0
  72. package/build/generationClient.js +25 -38
  73. package/build/generationClient.js.map +1 -0
  74. package/build/holderSecret.d.ts +70 -0
  75. package/build/holderSecret.d.ts.map +1 -0
  76. package/build/holderSecret.js +76 -0
  77. package/build/holderSecret.js.map +1 -0
  78. package/build/index.d.ts +38 -38
  79. package/build/index.d.ts.map +1 -0
  80. package/build/index.js +97 -121
  81. package/build/index.js.map +1 -0
  82. package/build/keysClient.d.ts +142 -0
  83. package/build/keysClient.d.ts.map +1 -0
  84. package/build/keysClient.js +109 -0
  85. package/build/keysClient.js.map +1 -0
  86. package/build/licenseLeaf.d.ts +76 -0
  87. package/build/licenseLeaf.d.ts.map +1 -0
  88. package/build/licenseLeaf.js +189 -0
  89. package/build/licenseLeaf.js.map +1 -0
  90. package/build/licenseRecord.d.ts +68 -5
  91. package/build/licenseRecord.d.ts.map +1 -0
  92. package/build/licenseRecord.js +26 -1
  93. package/build/licenseRecord.js.map +1 -0
  94. package/build/licenseStore.d.ts +81 -4
  95. package/build/licenseStore.d.ts.map +1 -0
  96. package/build/licenseStore.js +400 -30
  97. package/build/licenseStore.js.map +1 -0
  98. package/build/licenseTrustless.d.ts +43 -0
  99. package/build/licenseTrustless.d.ts.map +1 -0
  100. package/build/licenseTrustless.js +180 -0
  101. package/build/licenseTrustless.js.map +1 -0
  102. package/build/manifestVerify.d.ts +29 -1
  103. package/build/manifestVerify.d.ts.map +1 -0
  104. package/build/manifestVerify.js +46 -4
  105. package/build/manifestVerify.js.map +1 -0
  106. package/build/minaPriceHistory.d.ts +9 -0
  107. package/build/minaPriceHistory.d.ts.map +1 -0
  108. package/build/minaPriceHistory.js +152 -0
  109. package/build/minaPriceHistory.js.map +1 -0
  110. package/build/onChainRoot.d.ts +60 -0
  111. package/build/onChainRoot.d.ts.map +1 -0
  112. package/build/onChainRoot.js +74 -0
  113. package/build/onChainRoot.js.map +1 -0
  114. package/build/ownershipLicenseHash.d.ts +25 -0
  115. package/build/ownershipLicenseHash.d.ts.map +1 -0
  116. package/build/ownershipLicenseHash.js +29 -0
  117. package/build/ownershipLicenseHash.js.map +1 -0
  118. package/build/ownershipSignature.d.ts +153 -0
  119. package/build/ownershipSignature.d.ts.map +1 -0
  120. package/build/ownershipSignature.js +297 -0
  121. package/build/ownershipSignature.js.map +1 -0
  122. package/build/permitCheckFlow.d.ts +155 -0
  123. package/build/permitCheckFlow.d.ts.map +1 -0
  124. package/build/permitCheckFlow.js +196 -0
  125. package/build/permitCheckFlow.js.map +1 -0
  126. package/build/permitDescribe.d.ts +124 -0
  127. package/build/permitDescribe.d.ts.map +1 -0
  128. package/build/permitDescribe.js +324 -0
  129. package/build/permitDescribe.js.map +1 -0
  130. package/build/permitInterface.d.ts +85 -0
  131. package/build/permitInterface.d.ts.map +1 -0
  132. package/build/permitInterface.js +121 -0
  133. package/build/permitInterface.js.map +1 -0
  134. package/build/permitMessages.d.ts +313 -0
  135. package/build/permitMessages.d.ts.map +1 -0
  136. package/build/permitMessages.js +462 -0
  137. package/build/permitMessages.js.map +1 -0
  138. package/build/permitProof.d.ts +108 -0
  139. package/build/permitProof.d.ts.map +1 -0
  140. package/build/permitProof.js +202 -0
  141. package/build/permitProof.js.map +1 -0
  142. package/build/permitRegistryRebuild.d.ts +166 -0
  143. package/build/permitRegistryRebuild.d.ts.map +1 -0
  144. package/build/permitRegistryRebuild.js +347 -0
  145. package/build/permitRegistryRebuild.js.map +1 -0
  146. package/build/permitTree.d.ts +88 -0
  147. package/build/permitTree.d.ts.map +1 -0
  148. package/build/permitTree.js +230 -0
  149. package/build/permitTree.js.map +1 -0
  150. package/build/permitsClient.d.ts +680 -0
  151. package/build/permitsClient.d.ts.map +1 -0
  152. package/build/permitsClient.js +597 -0
  153. package/build/permitsClient.js.map +1 -0
  154. package/build/proveErrors.d.ts +50 -0
  155. package/build/proveErrors.d.ts.map +1 -0
  156. package/build/proveErrors.js +76 -0
  157. package/build/proveErrors.js.map +1 -0
  158. package/build/receipt.d.ts +95 -0
  159. package/build/receipt.d.ts.map +1 -0
  160. package/build/receipt.js +84 -0
  161. package/build/receipt.js.map +1 -0
  162. package/build/refundClient.d.ts +7 -12
  163. package/build/refundClient.d.ts.map +1 -0
  164. package/build/refundClient.js +52 -21
  165. package/build/refundClient.js.map +1 -0
  166. package/build/registryTrustVerify.d.ts +78 -0
  167. package/build/registryTrustVerify.d.ts.map +1 -0
  168. package/build/registryTrustVerify.js +129 -0
  169. package/build/registryTrustVerify.js.map +1 -0
  170. package/build/releaseClient.d.ts +26 -0
  171. package/build/releaseClient.d.ts.map +1 -0
  172. package/build/releaseClient.js +65 -0
  173. package/build/releaseClient.js.map +1 -0
  174. package/build/renewClient.d.ts +28 -2
  175. package/build/renewClient.d.ts.map +1 -0
  176. package/build/renewClient.js +31 -27
  177. package/build/renewClient.js.map +1 -0
  178. package/build/seatName.d.ts +8 -0
  179. package/build/seatName.d.ts.map +1 -0
  180. package/build/seatName.js +136 -0
  181. package/build/seatName.js.map +1 -0
  182. package/build/slotConstants.d.ts +15 -0
  183. package/build/slotConstants.d.ts.map +1 -0
  184. package/build/slotConstants.js +17 -0
  185. package/build/slotConstants.js.map +1 -0
  186. package/build/statsClient.d.ts +61 -7
  187. package/build/statsClient.d.ts.map +1 -0
  188. package/build/statsClient.js +44 -5
  189. package/build/statsClient.js.map +1 -0
  190. package/build/successorChain.d.ts +35 -0
  191. package/build/successorChain.d.ts.map +1 -0
  192. package/build/successorChain.js +69 -0
  193. package/build/successorChain.js.map +1 -0
  194. package/build/taxId.d.ts +44 -0
  195. package/build/taxId.d.ts.map +1 -0
  196. package/build/taxId.js +212 -0
  197. package/build/taxId.js.map +1 -0
  198. package/build/trustAnchorVerify.d.ts +49 -0
  199. package/build/trustAnchorVerify.d.ts.map +1 -0
  200. package/build/trustAnchorVerify.js +432 -0
  201. package/build/trustAnchorVerify.js.map +1 -0
  202. package/build/trustAnchorVerifyCli.d.ts +45 -0
  203. package/build/trustAnchorVerifyCli.d.ts.map +1 -0
  204. package/build/trustAnchorVerifyCli.js +235 -0
  205. package/build/trustAnchorVerifyCli.js.map +1 -0
  206. package/build/txBroadcastClient.d.ts +26 -0
  207. package/build/txBroadcastClient.d.ts.map +1 -0
  208. package/build/txBroadcastClient.js +20 -0
  209. package/build/txBroadcastClient.js.map +1 -0
  210. package/build/unbindClient.d.ts +77 -0
  211. package/build/unbindClient.d.ts.map +1 -0
  212. package/build/unbindClient.js +169 -0
  213. package/build/unbindClient.js.map +1 -0
  214. package/build/units.d.ts +28 -0
  215. package/build/units.d.ts.map +1 -0
  216. package/build/units.js +65 -0
  217. package/build/units.js.map +1 -0
  218. package/build/vatRates.d.ts +54 -0
  219. package/build/vatRates.d.ts.map +1 -0
  220. package/build/vatRates.js +82 -0
  221. package/build/vatRates.js.map +1 -0
  222. package/build/vatRatesData.d.ts +5 -0
  223. package/build/vatRatesData.d.ts.map +1 -0
  224. package/build/vatRatesData.js +42 -0
  225. package/build/vatRatesData.js.map +1 -0
  226. package/build/vendorAccountClient.d.ts +66 -0
  227. package/build/vendorAccountClient.d.ts.map +1 -0
  228. package/build/vendorAccountClient.js +47 -0
  229. package/build/vendorAccountClient.js.map +1 -0
  230. package/build/verifyCore.d.ts +4 -1
  231. package/build/verifyCore.d.ts.map +1 -0
  232. package/build/verifyCore.js +21 -10
  233. package/build/verifyCore.js.map +1 -0
  234. package/build/verifyOffline.d.ts +85 -0
  235. package/build/verifyOffline.d.ts.map +1 -0
  236. package/build/verifyOffline.js +139 -0
  237. package/build/verifyOffline.js.map +1 -0
  238. package/build/verifyService.d.ts.map +1 -0
  239. package/build/verifyService.js +571 -501
  240. package/build/verifyService.js.map +1 -0
  241. package/build/verifyWithAncestors.d.ts +19 -0
  242. package/build/verifyWithAncestors.d.ts.map +1 -0
  243. package/build/verifyWithAncestors.js +127 -0
  244. package/build/verifyWithAncestors.js.map +1 -0
  245. package/build/zipToState.d.ts +2 -0
  246. package/build/zipToState.d.ts.map +1 -0
  247. package/build/zipToState.js +94 -0
  248. package/build/zipToState.js.map +1 -0
  249. package/package.json +141 -16
  250. package/src/agent.ts +682 -0
  251. package/src/agentActions.ts +637 -0
  252. package/src/agentRecord.ts +121 -0
  253. package/src/agentVendor.ts +356 -0
  254. package/src/appsLookup.ts +48 -0
  255. package/src/archiveBootstrap.ts +386 -0
  256. package/src/atomicJson.ts +53 -0
  257. package/src/bindClient.ts +297 -0
  258. package/src/buyClient.ts +344 -0
  259. package/src/chainHead.ts +106 -0
  260. package/src/compactMerkleMap.ts +222 -0
  261. package/src/contractInterface.ts +465 -0
  262. package/src/contractTypes.ts +31 -0
  263. package/src/countryStats.ts +200 -0
  264. package/src/deployClient.ts +517 -0
  265. package/src/deviceIdentity.ts +249 -0
  266. package/src/freezeClient.ts +162 -0
  267. package/src/generationClient.ts +145 -0
  268. package/src/holderSecret.ts +91 -0
  269. package/src/index.ts +362 -0
  270. package/src/keysClient.ts +135 -0
  271. package/src/licenseLeaf.ts +221 -0
  272. package/src/licenseRecord.ts +190 -0
  273. package/src/licenseStore.ts +767 -0
  274. package/src/licenseTrustless.ts +207 -0
  275. package/src/manifestVerify.ts +164 -0
  276. package/src/minaPriceHistory.ts +166 -0
  277. package/src/onChainRoot.ts +90 -0
  278. package/src/ownershipLicenseHash.ts +31 -0
  279. package/src/ownershipSignature.ts +421 -0
  280. package/src/permitCheckFlow.ts +227 -0
  281. package/src/permitDescribe.ts +362 -0
  282. package/src/permitInterface.ts +146 -0
  283. package/src/permitMessages.ts +572 -0
  284. package/src/permitProof.ts +230 -0
  285. package/src/permitRegistryRebuild.ts +423 -0
  286. package/src/permitTree.ts +232 -0
  287. package/src/permitsClient.ts +746 -0
  288. package/src/proveErrors.ts +98 -0
  289. package/src/receipt.ts +156 -0
  290. package/src/refundClient.ts +177 -0
  291. package/src/registryTrustVerify.ts +192 -0
  292. package/src/releaseClient.ts +101 -0
  293. package/src/renewClient.ts +234 -0
  294. package/src/seatName.ts +165 -0
  295. package/src/slotConstants.ts +18 -0
  296. package/src/statsClient.ts +249 -0
  297. package/src/successorChain.ts +87 -0
  298. package/src/taxId.ts +227 -0
  299. package/src/trustAnchorVerify.ts +550 -0
  300. package/src/trustAnchorVerifyCli.ts +234 -0
  301. package/src/txBroadcastClient.ts +48 -0
  302. package/src/unbindClient.ts +233 -0
  303. package/src/units.ts +74 -0
  304. package/src/vatRates.ts +100 -0
  305. package/src/vatRatesData.ts +43 -0
  306. package/src/vendorAccountClient.ts +120 -0
  307. package/src/verifyCore.ts +100 -0
  308. package/src/verifyOffline.ts +212 -0
  309. package/src/verifyService.ts +982 -0
  310. package/src/verifyWithAncestors.ts +163 -0
  311. package/src/zipToState.ts +94 -0
  312. package/build/licenseProof.d.ts +0 -26
  313. package/build/licenseProof.js +0 -41
  314. package/build/migrateClient.d.ts +0 -43
  315. package/build/migrateClient.js +0 -47
  316. package/build/ownership.d.ts +0 -34
  317. package/build/ownership.js +0 -147
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) 2025-2026 zkLicensing project developers
2
- // All rights reserved.
2
+ // SPDX-License-Identifier: BUSL-1.1
3
3
  /**
4
4
  * archiveBootstrap.ts
5
5
  *
@@ -12,19 +12,22 @@
12
12
  * licenseIssued → applyLicenseIssued
13
13
  * licenseIssuedNoEscrow → applyLicenseIssued (escrowless: true)
14
14
  * licenseRenewed → updateExpiry
15
- * licenseMigrated → applyLicenseIssued (escrowless: true, migrated: true)
15
+ * appCreated (successor) → carryOverRecords from its predecessor (lazyBootstrap)
16
+ * appRetired → ignored (the app is frozen; its successor carries on)
16
17
  * refundIssued → recordRefund
17
18
  * fundsReleased → recordRelease
19
+ * deviceBound → applyDeviceBound (non-custodial binding)
20
+ * deviceUnbound → applyDeviceUnbound (non-custodial binding)
18
21
  * priceUpdated → ignored (price-history tracking lives in the private
19
- * zklicensing-app keeper alongside vendor-stats)
22
+ * zklicensing-app backend alongside vendor-stats)
20
23
  *
21
24
  * Uses LicensingAppEventsContract (from contractInterface) for fetchEvents —
22
25
  * this lets the public verify service read events without depending on the
23
26
  * private LicensingApp circuit source.
24
27
  */
25
- import { PublicKey, UInt32 } from 'o1js';
26
- import { LicensingAppEventsContract, MONTHLY_SLOTS_N, ONE_YEAR_SLOTS_N, FIVE_YEAR_SLOTS_N, } from './contractInterface.js';
27
- import { applyLicenseIssued, updateExpiry, recordRefund, recordRelease, } from './licenseStore.js';
28
+ import { PublicKey } from 'o1js';
29
+ import { LicensingAppEventsContract, MONTHLY_SLOTS_N, ONE_YEAR_SLOTS_N, FIVE_YEAR_SLOTS_N, PERPETUAL_SLOTS_N, } from './contractInterface.js';
30
+ import { applyLicenseIssued, applyLicenseRenewed, applyDeviceBound, applyDeviceUnbound, applyLicenseTransferred, recordRefund, recordRelease, readRecords, carryOverRecords, } from './licenseStore.js';
28
31
  export const SYNC_CHUNK_SLOTS = 10_000;
29
32
  export const MAX_LOOKBACK_SLOTS = 525_600;
30
33
  // Back-derive the duration tier from (expirySlot - purchaseSlot). Tolerance
@@ -37,16 +40,36 @@ export function tierFromExpiryDelta(slots) {
37
40
  return 'yearly';
38
41
  if (within(FIVE_YEAR_SLOTS_N))
39
42
  return 'fiveYear';
43
+ if (within(PERPETUAL_SLOTS_N))
44
+ return 'perpetual';
40
45
  return null;
41
46
  }
42
47
  export async function bootstrapFromArchive(zkAppAddress, range = {}) {
43
48
  const pubKey = PublicKey.fromBase58(zkAppAddress);
44
49
  const zkApp = new LicensingAppEventsContract(pubKey);
45
- const start = range.from !== undefined ? UInt32.from(range.from) : undefined;
46
- const end = range.to !== undefined ? UInt32.from(range.to) : undefined;
47
- const allEvents = await zkApp.fetchEvents(start, end);
50
+ // o1js's fetchEvents(from, to) passes these directly to the archive-node
51
+ // GraphQL as `from`/`to`, which the reference Mina archive interprets as
52
+ // BLOCK HEIGHTS, not global slots. We track everything in slots, so the two
53
+ // never match and every query returned zero events. Fetch all events for
54
+ // the address and filter by globalSlot client-side — over-fetches per
55
+ // chunked call, but is the only correct behavior against this archive.
56
+ const allEvents = await zkApp.fetchEvents();
57
+ const fromSlot = range.from ?? 0;
58
+ const toSlot = range.to ?? Number.MAX_SAFE_INTEGER;
59
+ // Filter out only orphaned events; keep both 'canonical' and 'pending'.
60
+ // The devnet-archive-node-api.gcp.o1test.net archive returns everything
61
+ // with chainStatus='pending' (it doesn't finalize the flag), so a strict
62
+ // `=== 'canonical'` filter drops every event and the mirror stays empty.
63
+ // Mina's k-block finality means recently-landed events on the best chain
64
+ // are safe to replay; if one later reorgs out, the next sync sweep will
65
+ // re-derive state from the new canonical events (a no-op if none of them
66
+ // touch this record).
48
67
  const canonical = [...allEvents]
49
- .filter(e => e.chainStatus === 'canonical')
68
+ .filter(e => e.chainStatus !== 'orphaned')
69
+ .filter(e => {
70
+ const slot = Number(e.globalSlot.toString());
71
+ return slot >= fromSlot && slot <= toSlot;
72
+ })
50
73
  .sort((a, b) => Number(a.globalSlot.toString()) - Number(b.globalSlot.toString()));
51
74
  const events = [];
52
75
  for (const ev of canonical) {
@@ -60,6 +83,7 @@ export async function bootstrapFromArchive(zkAppAddress, range = {}) {
60
83
  priceMonthly: BigInt(data.priceMonthly.toString()),
61
84
  priceYearly: BigInt(data.priceYearly.toString()),
62
85
  priceFiveYear: BigInt(data.priceFiveYear.toString()),
86
+ pricePerpetual: BigInt(data.pricePerpetual.toString()),
63
87
  });
64
88
  break;
65
89
  }
@@ -72,6 +96,8 @@ export async function bootstrapFromArchive(zkAppAddress, range = {}) {
72
96
  amount: BigInt(data.amount.toString()),
73
97
  issuedSlot: Number(data.slot.toString()),
74
98
  expirySlot: Number(data.expirySlot.toString()),
99
+ buyerAddress: data.buyer.toBase58(),
100
+ cap: Number(data.cap.toString()),
75
101
  });
76
102
  break;
77
103
  }
@@ -84,6 +110,8 @@ export async function bootstrapFromArchive(zkAppAddress, range = {}) {
84
110
  amount: BigInt(data.amount.toString()),
85
111
  issuedSlot: Number(data.slot.toString()),
86
112
  expirySlot: Number(data.expirySlot.toString()),
113
+ buyerAddress: data.buyer.toBase58(),
114
+ cap: Number(data.cap.toString()),
87
115
  });
88
116
  break;
89
117
  }
@@ -97,23 +125,53 @@ export async function bootstrapFromArchive(zkAppAddress, range = {}) {
97
125
  });
98
126
  break;
99
127
  }
100
- case 'licenseMigrated': {
128
+ case 'appCreated': {
101
129
  const data = ev.event.data;
102
- events.push({
103
- kind: 'licenseMigrated',
104
- slot,
105
- licenseHash: data.licenseHash.toString(),
106
- expirySlot: Number(data.expirySlot.toString()),
107
- ancestorGen: Number(data.ancestorGen.toString()),
108
- });
130
+ const pred = data.predecessor;
131
+ events.push({ kind: 'appCreated', slot, predecessor: pred.equals(PublicKey.empty()).toBoolean() ? null : pred.toBase58() });
109
132
  break;
110
133
  }
134
+ case 'appRetired':
135
+ events.push({ kind: 'appRetired', slot, licensesRoot: ev.event.data.licensesRoot.toString() });
136
+ break;
111
137
  case 'refundIssued':
112
138
  events.push({ kind: 'refundIssued', slot, licenseHash: ev.event.data.toString() });
113
139
  break;
114
140
  case 'fundsReleased':
115
141
  events.push({ kind: 'fundsReleased', slot, licenseHash: ev.event.data.toString() });
116
142
  break;
143
+ case 'deviceBound': {
144
+ const data = ev.event.data;
145
+ events.push({
146
+ kind: 'deviceBound',
147
+ slot,
148
+ licenseHash: data.licenseHash.toString(),
149
+ slotIndex: Number(data.slotIndex.toString()),
150
+ deviceCommitment: data.deviceCommitment.toString(),
151
+ // Proof-time slot, NOT the block slot. The circuit packs this into
152
+ // the leaf's freedAt field, so the mirror must use the same value
153
+ // or the reconstructed leaf hash won't match the on-chain root.
154
+ boundAtSlot: Number(data.boundAtSlot.toString()),
155
+ });
156
+ break;
157
+ }
158
+ case 'licenseTransferred': {
159
+ const data = ev.event.data;
160
+ events.push({ kind: 'licenseTransferred', slot, from: data.from.toString(), to: data.to.toString(), wallet: data.wallet.toBase58() });
161
+ break;
162
+ }
163
+ case 'deviceUnbound': {
164
+ const data = ev.event.data;
165
+ events.push({
166
+ kind: 'deviceUnbound',
167
+ slot,
168
+ licenseHash: data.licenseHash.toString(),
169
+ slotIndex: Number(data.slotIndex.toString()),
170
+ // Proof-time slot; see deviceBound comment above.
171
+ freedAtSlot: Number(data.freedAtSlot.toString()),
172
+ });
173
+ break;
174
+ }
117
175
  }
118
176
  }
119
177
  const maxSeenSlot = canonical.length === 0
@@ -134,6 +192,8 @@ export async function applyEventsToStore(zkAppAddress, events) {
134
192
  expirySlot: ev.expirySlot,
135
193
  purchaseSlot: ev.issuedSlot,
136
194
  purchaseAmount: ev.amount.toString(),
195
+ buyerAddress: ev.buyerAddress,
196
+ deviceCap: ev.cap,
137
197
  ...(tier ? { tier } : {}),
138
198
  });
139
199
  count++;
@@ -146,29 +206,24 @@ export async function applyEventsToStore(zkAppAddress, events) {
146
206
  purchaseSlot: ev.issuedSlot,
147
207
  purchaseAmount: ev.amount.toString(),
148
208
  escrowless: true,
209
+ buyerAddress: ev.buyerAddress,
210
+ deviceCap: ev.cap,
149
211
  ...(tier ? { tier } : {}),
150
212
  });
151
213
  count++;
152
214
  break;
153
215
  }
154
216
  case 'licenseRenewed': {
155
- const ok = await updateExpiry(zkAppAddress, ev.licenseHash, ev.newExpiry, {
156
- markRenewed: true,
157
- });
217
+ const ok = await applyLicenseRenewed(zkAppAddress, ev.licenseHash, { newExpiry: ev.newExpiry });
158
218
  if (!ok)
159
219
  warnings.push(`renew for unknown license ${ev.licenseHash.slice(0, 16)}…`);
160
220
  break;
161
221
  }
162
- case 'licenseMigrated': {
163
- await applyLicenseIssued(zkAppAddress, ev.licenseHash, {
164
- expirySlot: ev.expirySlot,
165
- purchaseSlot: 0,
166
- purchaseAmount: '0',
167
- escrowless: true,
168
- });
169
- count++;
222
+ case 'appCreated':
223
+ case 'appRetired':
224
+ // A successor's carried-over licenses are copied by lazyBootstrap
225
+ // (from its predecessor) before its own events apply.
170
226
  break;
171
- }
172
227
  case 'refundIssued': {
173
228
  const ok = await recordRefund(zkAppAddress, ev.licenseHash);
174
229
  if (!ok)
@@ -181,6 +236,31 @@ export async function applyEventsToStore(zkAppAddress, events) {
181
236
  warnings.push(`release for unknown license ${ev.licenseHash.slice(0, 16)}…`);
182
237
  break;
183
238
  }
239
+ case 'deviceBound': {
240
+ const ok = await applyDeviceBound(zkAppAddress, ev.licenseHash, {
241
+ slotIndex: ev.slotIndex,
242
+ deviceCommitment: ev.deviceCommitment,
243
+ boundAtSlot: ev.boundAtSlot,
244
+ });
245
+ if (!ok)
246
+ warnings.push(`bind for unknown license ${ev.licenseHash.slice(0, 16)}…`);
247
+ break;
248
+ }
249
+ case 'licenseTransferred': {
250
+ const ok = await applyLicenseTransferred(zkAppAddress, ev.from, ev.to, { wallet: ev.wallet });
251
+ if (!ok)
252
+ warnings.push(`transfer of unknown license ${ev.from.slice(0, 16)}…`);
253
+ break;
254
+ }
255
+ case 'deviceUnbound': {
256
+ const ok = await applyDeviceUnbound(zkAppAddress, ev.licenseHash, {
257
+ slotIndex: ev.slotIndex,
258
+ freedAtSlot: ev.freedAtSlot,
259
+ });
260
+ if (!ok)
261
+ warnings.push(`unbind for unknown license ${ev.licenseHash.slice(0, 16)}…`);
262
+ break;
263
+ }
184
264
  }
185
265
  }
186
266
  return { count, warnings };
@@ -189,20 +269,21 @@ export async function discoverAppCreatedSlot(zkAppAddress, nowSlot, lookbackSlot
189
269
  const pubKey = PublicKey.fromBase58(zkAppAddress);
190
270
  const zkApp = new LicensingAppEventsContract(pubKey);
191
271
  const floor = Math.max(1, nowSlot - lookbackSlots);
192
- let to = nowSlot;
193
- while (to >= floor) {
194
- const from = Math.max(floor, to - SYNC_CHUNK_SLOTS + 1);
195
- const events = await zkApp.fetchEvents(UInt32.from(from), UInt32.from(to));
196
- const created = events
197
- .filter(e => e.chainStatus === 'canonical' && e.type === 'appCreated')
198
- .sort((a, b) => Number(a.globalSlot.toString()) - Number(b.globalSlot.toString()));
199
- if (created.length > 0) {
200
- return Number(created[0].globalSlot.toString());
201
- }
202
- if (from <= floor)
203
- break;
204
- to = from - 1;
205
- }
272
+ // See bootstrapFromArchive: fetchEvents(from, to) filters by BLOCK HEIGHT
273
+ // in the reference archive, not slot. One full fetch + client-side slot
274
+ // filter is the only correct approach. Also keeps chainStatus='pending'
275
+ // events — o1test.net's devnet archive doesn't finalize that flag; strict
276
+ // 'canonical' filtering leaves discovery empty on freshly-deployed apps.
277
+ const events = await zkApp.fetchEvents();
278
+ const created = events
279
+ .filter(e => e.chainStatus !== 'orphaned' && e.type === 'appCreated')
280
+ .filter(e => {
281
+ const slot = Number(e.globalSlot.toString());
282
+ return slot >= floor && slot <= nowSlot;
283
+ })
284
+ .sort((a, b) => Number(a.globalSlot.toString()) - Number(b.globalSlot.toString()));
285
+ if (created.length > 0)
286
+ return Number(created[0].globalSlot.toString());
206
287
  return null;
207
288
  }
208
289
  const inFlightBootstraps = new Map();
@@ -212,14 +293,26 @@ export async function lazyBootstrap(zkAppAddress) {
212
293
  return existing;
213
294
  const short = zkAppAddress.slice(0, 12) + '…';
214
295
  const p = (async () => {
296
+ const started = Date.now();
215
297
  try {
216
298
  const { events } = await bootstrapFromArchive(zkAppAddress);
299
+ // A redeployed app's successor starts with its predecessor's licenses:
300
+ // rebuild those first (recursively), then copy them across.
301
+ const created = events.find(e => e.kind === 'appCreated');
302
+ if (created?.kind === 'appCreated' && created.predecessor) {
303
+ if (!(await readRecords()).some(r => r.zkAppAddress === created.predecessor))
304
+ await lazyBootstrap(created.predecessor);
305
+ await carryOverRecords(created.predecessor, zkAppAddress);
306
+ }
217
307
  const { count, warnings } = await applyEventsToStore(zkAppAddress, events);
218
308
  for (const w of warnings)
219
309
  console.warn(`[lazy-bootstrap] ${short}: ${w}`);
220
- if (count > 0) {
221
- console.log(`[lazy-bootstrap] ${short}: replayed ${count} record(s)`);
222
- }
310
+ // Always log the outcome — count=0 with a mismatch trigger is the
311
+ // interesting case: it means either the archive is behind Mina's own
312
+ // best chain (transient) or the local mirror silently drifted and the
313
+ // replay didn't fix it (a real bug — verify will keep looping through
314
+ // this until the next mutation event lands). Silence would hide both.
315
+ console.log(`[lazy-bootstrap] ${short}: replayed ${count} record(s) in ${Date.now() - started}ms`);
223
316
  }
224
317
  catch (e) {
225
318
  console.warn(`[lazy-bootstrap] ${short}: ${e?.message ?? e}`);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archiveBootstrap.js","sourceRoot":"","sources":["../src/archiveBootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function readJsonOr<T>(path: string, fallback: T): Promise<T>;
2
+ export declare function writeJsonAtomic(path: string, value: unknown, opts?: {
3
+ mode?: number;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=atomicJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicJson.d.ts","sourceRoot":"","sources":["../src/atomicJson.ts"],"names":[],"mappings":"AAmBA,wBAAsB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAazE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/G"}
@@ -0,0 +1,55 @@
1
+ // Copyright (c) 2025-2026 zkLicensing project developers
2
+ // SPDX-License-Identifier: BUSL-1.1
3
+ /**
4
+ * atomicJson.ts — `zklicensing/internal/atomicJson`
5
+ *
6
+ * Crash-safe JSON files. A write goes to a temporary file in the same
7
+ * directory, is flushed to disk, and replaces the target with one rename, so
8
+ * a crash leaves either the old or the new file — never half of one. A read
9
+ * returns the fallback only when the file doesn't exist; a file that exists
10
+ * but doesn't parse is an error, so a damaged store is never mistaken for an
11
+ * empty one (and then overwritten with nothing).
12
+ */
13
+ // Only a default import of fs/promises (no named imports from Node modules):
14
+ // browser bundles that reach this file through licenseStore get Vite's empty
15
+ // stub for it instead of a build error.
16
+ import fs from 'fs/promises';
17
+ export async function readJsonOr(path, fallback) {
18
+ let text;
19
+ try {
20
+ text = await fs.readFile(path, 'utf8');
21
+ }
22
+ catch (e) {
23
+ if (e?.code === 'ENOENT')
24
+ return fallback;
25
+ throw e;
26
+ }
27
+ try {
28
+ return JSON.parse(text);
29
+ }
30
+ catch (e) {
31
+ throw new Error(`${path} exists but is not valid JSON (${e?.message ?? e}); restore it from a backup — refusing to treat it as empty`);
32
+ }
33
+ }
34
+ export async function writeJsonAtomic(path, value, opts = {}) {
35
+ // Same directory as the target (rename is only atomic within a file system).
36
+ const slash = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\'));
37
+ const suffix = [...crypto.getRandomValues(new Uint8Array(6))].map(b => b.toString(16).padStart(2, '0')).join('');
38
+ const tmp = `${path.slice(0, slash + 1)}.${path.slice(slash + 1)}.${suffix}.tmp`;
39
+ const fh = await fs.open(tmp, 'w', opts.mode ?? 0o600);
40
+ try {
41
+ await fh.writeFile(JSON.stringify(value, null, 2), 'utf8');
42
+ await fh.sync();
43
+ }
44
+ finally {
45
+ await fh.close();
46
+ }
47
+ try {
48
+ await fs.rename(tmp, path);
49
+ }
50
+ catch (e) {
51
+ await fs.rm(tmp, { force: true });
52
+ throw e;
53
+ }
54
+ }
55
+ //# sourceMappingURL=atomicJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicJson.js","sourceRoot":"","sources":["../src/atomicJson.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oCAAoC;AAEpC;;;;;;;;;GASG;AAEH,6EAA6E;AAC7E,6EAA6E;AAC7E,wCAAwC;AACxC,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,IAAY,EAAE,QAAW;IAC3D,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC1C,MAAM,CAAC,CAAC;IACV,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kCAAkC,CAAC,EAAE,OAAO,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACzI,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAAc,EAAE,OAA0B,EAAE;IAC9F,6EAA6E;IAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;IACjF,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * bindClient.ts
3
+ *
4
+ * Browser-safe client for the non-custodial device-binding flow.
5
+ * Mirrors `buyClient.ts` in shape: the caller drives the wallet step
6
+ * between `proveBind` and `confirmBind`, so the SDK stays
7
+ * wallet-agnostic.
8
+ *
9
+ * Binding is a root-mutating tx on the same per-app in-flight slot
10
+ * that buy / renew / refund use — a concurrent request
11
+ * against the same app returns 409 `ProveQueueBusyError`, which the
12
+ * caller must catch and retry (see the retry loop in
13
+ * examples/src/bind.ts).
14
+ *
15
+ * The signature scheme is Pallas Schnorr and is re-verified INSIDE
16
+ * the on-chain circuit via `Signature.verify()` — a compromised
17
+ * backend cannot forge a bind because it can't produce a signature
18
+ * that satisfies the in-circuit check.
19
+ */
20
+ import { PrivateKey } from 'o1js';
21
+ export type ProveBindRequest = {
22
+ keeperUrl: string;
23
+ network: 'devnet' | 'mainnet';
24
+ zkAppAddress: string;
25
+ licenseHash: string;
26
+ ownerPrivateKey: PrivateKey;
27
+ deviceCommitment: string;
28
+ slotIndex: number;
29
+ buyerAddress: string;
30
+ nonce?: string;
31
+ slotState?: string;
32
+ expirySlot?: number;
33
+ fetcher?: typeof fetch;
34
+ signal?: AbortSignal;
35
+ };
36
+ export type ProveBindResponse = {
37
+ provenTxJson: string;
38
+ licenseHash: string;
39
+ slotIndex: number;
40
+ };
41
+ export type ConfirmBindRequest = {
42
+ keeperUrl: string;
43
+ zkAppAddress: string;
44
+ licenseHash: string;
45
+ txHash: string;
46
+ fetcher?: typeof fetch;
47
+ signal?: AbortSignal;
48
+ };
49
+ export declare function fetchBindingState(opts: {
50
+ keeperUrl: string;
51
+ network: 'devnet' | 'mainnet';
52
+ zkAppAddress: string;
53
+ licenseHash: string;
54
+ slotIndex: number;
55
+ fetcher?: typeof fetch;
56
+ signal?: AbortSignal;
57
+ }): Promise<{
58
+ slotState: string;
59
+ expirySlot: number;
60
+ }>;
61
+ export declare function proveBind(req: ProveBindRequest): Promise<ProveBindResponse>;
62
+ export declare function confirmBind(req: ConfirmBindRequest): Promise<{
63
+ ok: true;
64
+ }>;
65
+ export type BindStatus = {
66
+ status: 'confirmed' | 'pending' | 'unknown';
67
+ slotIndex?: number;
68
+ deviceCommitment?: string;
69
+ elapsedMs?: number;
70
+ };
71
+ export type PollBindStatusOptions = {
72
+ keeperUrl: string;
73
+ network: 'devnet' | 'mainnet';
74
+ zkAppAddress: string;
75
+ licenseHash: string;
76
+ slotIndex: number;
77
+ deviceCommitment: string;
78
+ fetcher?: typeof fetch;
79
+ intervalMs?: number;
80
+ timeoutMs?: number;
81
+ signal?: AbortSignal;
82
+ onTick?: (status: BindStatus) => void;
83
+ };
84
+ export declare function pollBindStatus(opts: PollBindStatusOptions): Promise<BindStatus>;
85
+ //# sourceMappingURL=bindClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindClient.d.ts","sourceRoot":"","sources":["../src/bindClient.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAS,UAAU,EAAwB,MAAM,MAAM,CAAC;AAS/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAS,MAAM,CAAC;IAGzB,OAAO,EAAW,QAAQ,GAAG,SAAS,CAAC;IAGvC,YAAY,EAAM,MAAM,CAAC;IAKzB,WAAW,EAAO,MAAM,CAAC;IAIzB,eAAe,EAAG,UAAU,CAAC;IAK7B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,SAAS,EAAS,MAAM,CAAC;IAEzB,YAAY,EAAM,MAAM,CAAC;IAKzB,KAAK,CAAC,EAAY,MAAM,CAAC;IAOzB,SAAS,CAAC,EAAQ,MAAM,CAAC;IACzB,UAAU,CAAC,EAAO,MAAM,CAAC;IACzB,OAAO,CAAC,EAAU,OAAO,KAAK,CAAC;IAC/B,MAAM,CAAC,EAAW,WAAW,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAG,MAAM,CAAC;IACrB,SAAS,EAAK,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAK,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAG,MAAM,CAAC;IACrB,MAAM,EAAQ,MAAM,CAAC;IACrB,OAAO,CAAC,EAAM,OAAO,KAAK,CAAC;IAC3B,MAAM,CAAC,EAAO,WAAW,CAAC;CAC3B,CAAC;AAmCF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,SAAS,EAAK,MAAM,CAAC;IACrB,OAAO,EAAO,QAAQ,GAAG,SAAS,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAG,MAAM,CAAC;IACrB,SAAS,EAAK,MAAM,CAAC;IACrB,OAAO,CAAC,EAAM,OAAO,KAAK,CAAC;IAC3B,MAAM,CAAC,EAAO,WAAW,CAAC;CAC3B,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBrD;AAQD,wBAAsB,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyCjF;AAMD,wBAAsB,WAAW,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,CAchF;AAED,MAAM,MAAM,UAAU,GAAG;IAKvB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,SAAS,CAAC,EAAS,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAS,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAS,MAAM,CAAC;IACzB,OAAO,EAAW,QAAQ,GAAG,SAAS,CAAC;IACvC,YAAY,EAAM,MAAM,CAAC;IACzB,WAAW,EAAO,MAAM,CAAC;IACzB,SAAS,EAAS,MAAM,CAAC;IAKzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAU,OAAO,KAAK,CAAC;IAG/B,UAAU,CAAC,EAAO,MAAM,CAAC;IACzB,SAAS,CAAC,EAAQ,MAAM,CAAC;IACzB,MAAM,CAAC,EAAW,WAAW,CAAC;IAC9B,MAAM,CAAC,EAAW,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CAChD,CAAC;AAKF,wBAAsB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4CrF"}