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
@@ -0,0 +1,347 @@
1
+ // Copyright (c) 2025-2026 zkLicensing project developers
2
+ // SPDX-License-Identifier: BUSL-1.1
3
+ /**
4
+ * permitRegistryRebuild.ts — `zklicensing/permits/rebuild`
5
+ *
6
+ * Rebuilds a PermitRegistry's permits tree from its events alone. Every
7
+ * event that changes a permit carries the full new leaf, so the tree is
8
+ * recoverable from the chain without the Keeper (PERMITS_PLAN.md §8.2).
9
+ * The Keeper's indexer uses this same code. Open applications (fees in
10
+ * escrow) are rebuilt the same way: filed minus settled.
11
+ */
12
+ import { Field, PublicKey, UInt32, UInt64 } from 'o1js';
13
+ import { CompactMerkleMap, encodeFields, decodeFields } from './compactMerkleMap.js';
14
+ import { Application, PermitLeaf, applicationHash, permitLeafHash, unpackFees, unpackPolicy } from './permitMessages.js';
15
+ import { PermitRegistryEvents } from './permitInterface.js';
16
+ import { forkBumpedExpiry } from './contractInterface.js';
17
+ export function leafToRecord(leaf) {
18
+ return {
19
+ subject: leaf.subject.toString(),
20
+ // The never-granted leaf's key is PublicKey.empty() (not a curve point): ''.
21
+ holderKey: leaf.holderKey.equals(PublicKey.empty()).toBoolean() ? '' : leaf.holderKey.toBase58(),
22
+ scope: leaf.scope.toString(),
23
+ validFrom: Number(leaf.validFrom.toString()),
24
+ expirySlot: Number(leaf.expirySlot.toString()),
25
+ status: Number(leaf.status.toString()),
26
+ seq: Number(leaf.seq.toString()),
27
+ docHash: leaf.docHash.toString(),
28
+ };
29
+ }
30
+ export function applicationToRecord(app) {
31
+ return {
32
+ subject: app.subject.toString(),
33
+ holderKey: app.holderKey.toBase58(),
34
+ payer: app.payer.toBase58(),
35
+ baseSeq: Number(app.baseSeq.toString()),
36
+ scope: app.scope.toString(),
37
+ validFrom: Number(app.validFrom.toString()),
38
+ expirySlot: Number(app.expirySlot.toString()),
39
+ docHash: app.docHash.toString(),
40
+ fee: app.fee.toString(),
41
+ processingFee: app.processingFee.toString(),
42
+ deadline: Number(app.deadline.toString()),
43
+ filing: Number(app.filing.toString()),
44
+ };
45
+ }
46
+ export function recordToApplication(r) {
47
+ return new Application({
48
+ subject: Field(r.subject),
49
+ holderKey: PublicKey.fromBase58(r.holderKey),
50
+ payer: PublicKey.fromBase58(r.payer),
51
+ baseSeq: UInt32.from(r.baseSeq),
52
+ scope: Field(r.scope),
53
+ validFrom: UInt32.from(r.validFrom),
54
+ expirySlot: UInt32.from(r.expirySlot),
55
+ docHash: Field(r.docHash),
56
+ fee: UInt64.from(r.fee),
57
+ processingFee: UInt64.from(r.processingFee),
58
+ deadline: UInt32.from(r.deadline),
59
+ filing: UInt32.from(r.filing),
60
+ });
61
+ }
62
+ export function recordToLeaf(r) {
63
+ return new PermitLeaf({
64
+ subject: Field(r.subject),
65
+ holderKey: r.holderKey === '' ? PublicKey.empty() : PublicKey.fromBase58(r.holderKey),
66
+ scope: Field(r.scope),
67
+ validFrom: UInt32.from(r.validFrom),
68
+ expirySlot: UInt32.from(r.expirySlot),
69
+ status: UInt32.from(r.status),
70
+ seq: UInt32.from(r.seq),
71
+ docHash: Field(r.docHash),
72
+ });
73
+ }
74
+ /**
75
+ * The view a redeployed registry starts with: a copy of its retired
76
+ * predecessor's permits and tree (the initialPermitsRoot its keys signed).
77
+ * Its own events then apply on top; `registryCreated` checks the root.
78
+ */
79
+ export function seededRegistryView(predecessor) {
80
+ const view = registryViewFromStored({ ...registryViewToStored(predecessor), applications: [] });
81
+ view.start = { root: view.root, seqs: new Map([...view.permits.values()].map(p => [p.subject, p.seq])) };
82
+ return view;
83
+ }
84
+ /**
85
+ * The retired registry a registry continues, from its `registryCreated`
86
+ * event (base58), or null for a first generation. With it a registry's
87
+ * lineage can be walked back on chain events alone; the successor's start
88
+ * was checked against the predecessor's retired root when it was deployed.
89
+ */
90
+ export function registryPredecessor(events) {
91
+ const created = events.find(e => e.type === 'registryCreated');
92
+ const p = created?.event.data.predecessor;
93
+ if (!p || p.equals(PublicKey.empty()).toBoolean())
94
+ return null;
95
+ return p.toBase58();
96
+ }
97
+ export function emptyRegistryView() {
98
+ const tree = new CompactMerkleMap();
99
+ return { tree, root: tree.getRoot().toString(), permits: new Map(), keysHash: null, epoch: 0, feesPacked: null, ...emptyEscrow(), eventsApplied: 0 };
100
+ }
101
+ function emptyEscrow() {
102
+ const escrow = new CompactMerkleMap();
103
+ return { escrow, escrowRoot: escrow.getRoot().toString(), applications: new Map(), settlements: new Map() };
104
+ }
105
+ /**
106
+ * Open applications from filed and settled events. A settled event names the
107
+ * application by hash; the same hash can be filed again after it settles, so
108
+ * filings and settlements are counted. Events of a transaction the chain
109
+ * refused can show up in some sources (the local test chain records them):
110
+ * a settlement with no filing is ignored, and of two open filings for one
111
+ * subject the later filing wins, since a subject can only be filed again
112
+ * once its previous application settled. The view's escrowRoot against the
113
+ * contract's is the check that the result is right.
114
+ */
115
+ function openApplications(filed, settled) {
116
+ const closed = new Map();
117
+ for (const h of settled)
118
+ closed.set(h, (closed.get(h) ?? 0) + 1);
119
+ const open = new Map();
120
+ for (const app of filed) {
121
+ const h = applicationHash(app).toString();
122
+ const n = closed.get(h) ?? 0;
123
+ if (n > 0) {
124
+ closed.set(h, n - 1);
125
+ continue;
126
+ }
127
+ const rec = applicationToRecord(app);
128
+ const other = open.get(rec.subject);
129
+ if (!other || rec.filing > other.filing)
130
+ open.set(rec.subject, rec);
131
+ }
132
+ return open;
133
+ }
134
+ /** Replaces the view's open applications and rebuilds the (small) escrow tree. */
135
+ function setApplications(view, open) {
136
+ const escrow = new CompactMerkleMap();
137
+ escrow.setMany([...open.values()].map(r => [Field(r.subject), applicationHash(recordToApplication(r))]));
138
+ view.escrow = escrow;
139
+ view.escrowRoot = escrow.getRoot().toString();
140
+ view.applications = open;
141
+ }
142
+ /**
143
+ * Applies events in any order. Archive nodes, local chains and paginated
144
+ * fetches don't agree on ordering, so none is assumed: each subject's leaves
145
+ * are ordered by `seq` (the contract advances it by exactly one per change),
146
+ * key rotations by `epoch` and fee changes by `actionNonce`. A gap in a
147
+ * subject's sequence means events are missing, and throws rather than build
148
+ * a wrong tree. Applying to a non-empty view continues from its state.
149
+ */
150
+ export function applyRegistryEvents(view, events) {
151
+ const updates = [];
152
+ const esc = { filed: [...view.applications.values()].map(recordToApplication), settled: [] };
153
+ for (const [subject, last] of collectRegistryEvents(view, events, esc)) {
154
+ updates.push([last.leaf.subject, permitLeafHash(last.leaf)]);
155
+ view.permits.set(subject, last.rec);
156
+ }
157
+ view.tree.setMany(updates);
158
+ view.root = view.tree.getRoot().toString();
159
+ setApplications(view, openApplications(esc.filed, esc.settled));
160
+ return view;
161
+ }
162
+ /**
163
+ * Brings `view` up to date with a registry's full event list, re-hashing only
164
+ * the permits whose latest leaf changed: a full rebuild costs a 256-level tree
165
+ * path per permit, a refresh one per changed permit. Returns the subjects
166
+ * that changed (added or updated).
167
+ */
168
+ export function refreshRegistryView(view, events) {
169
+ const fresh = { tree: view.tree, root: view.root, permits: new Map(), keysHash: null, epoch: 0, feesPacked: null, ...emptyEscrow(), eventsApplied: 0, ...(view.start ? { start: view.start } : {}) };
170
+ const esc = { filed: [], settled: [] };
171
+ const latest = collectRegistryEvents(fresh, events, esc);
172
+ const changed = [];
173
+ const updates = [];
174
+ for (const [subject, last] of latest) {
175
+ const cur = view.permits.get(subject);
176
+ if (cur && sameRecord(cur, last.rec))
177
+ continue;
178
+ updates.push([last.leaf.subject, permitLeafHash(last.leaf)]);
179
+ view.permits.set(subject, last.rec);
180
+ changed.push(subject);
181
+ }
182
+ view.tree.setMany(updates);
183
+ view.keysHash = fresh.keysHash;
184
+ view.epoch = fresh.epoch;
185
+ view.feesPacked = fresh.feesPacked;
186
+ view.eventsApplied = fresh.eventsApplied;
187
+ view.settlements = fresh.settlements;
188
+ view.root = view.tree.getRoot().toString();
189
+ setApplications(view, openApplications(esc.filed, esc.settled));
190
+ return changed;
191
+ }
192
+ /** Same permit leaf (field by field: cheaper than hashing both). */
193
+ function sameRecord(a, b) {
194
+ return a.seq === b.seq && a.status === b.status && a.scope === b.scope && a.validFrom === b.validFrom
195
+ && a.expirySlot === b.expirySlot && a.holderKey === b.holderKey && a.docHash === b.docHash && a.subject === b.subject;
196
+ }
197
+ /**
198
+ * Validates the events and returns each subject's latest leaf; updates the
199
+ * view's keys, epoch and fees, and collects escrow events into `esc`.
200
+ */
201
+ function collectRegistryEvents(view, events, esc) {
202
+ const bySubject = new Map();
203
+ let lastEpoch = view.epoch;
204
+ let lastFeeNonce = -1;
205
+ for (const e of events) {
206
+ const d = e.event.data;
207
+ switch (e.type) {
208
+ case 'registryCreated': {
209
+ if (view.keysHash === null)
210
+ view.keysHash = d.keysHash.toString();
211
+ const startRoot = view.start?.root ?? emptyRegistryView().root;
212
+ if (d.permitsRoot !== undefined && d.permitsRoot.toString() !== startRoot) {
213
+ throw new Error('the registry started from another permits tree: seed the view with its predecessor (seededRegistryView)');
214
+ }
215
+ break;
216
+ }
217
+ case 'authorityRotated': {
218
+ const epoch = Number(d.epoch.toString());
219
+ if (epoch > lastEpoch || view.keysHash === null) {
220
+ lastEpoch = epoch;
221
+ view.keysHash = d.keysHash.toString();
222
+ view.epoch = epoch;
223
+ }
224
+ break;
225
+ }
226
+ case 'feesUpdated': {
227
+ const nonce = Number(d.actionNonce.toString());
228
+ if (nonce > lastFeeNonce) {
229
+ lastFeeNonce = nonce;
230
+ view.feesPacked = d.feesPacked.toString();
231
+ }
232
+ break;
233
+ }
234
+ // A permit moved to a new holder key: its new leaf (seq 1, a new subject);
235
+ // the old one closes as MOVED in a permitStatusChanged event.
236
+ case 'permitMoved':
237
+ case 'permitGranted':
238
+ case 'permitStatusChanged': {
239
+ const leaf = d.leaf;
240
+ const rec = leafToRecord(leaf);
241
+ const list = bySubject.get(rec.subject) ?? [];
242
+ list.push({ type: e.type, leaf, rec });
243
+ bySubject.set(rec.subject, list);
244
+ break;
245
+ }
246
+ case 'applicationFiled':
247
+ esc.filed.push(d.application);
248
+ break;
249
+ case 'applicationSettled': {
250
+ const hash = d.applicationHash.toString();
251
+ esc.settled.push(hash);
252
+ view.settlements.set(hash, { subject: d.subject.toString(), outcome: Number(d.outcome.toString()), kept: d.kept.toString(), refunded: d.refunded.toString() });
253
+ break;
254
+ }
255
+ // Payout and platform-key changes touch no permit (the account state has them).
256
+ case 'payoutProposed':
257
+ case 'payoutChanged':
258
+ case 'platformChanged':
259
+ break;
260
+ case 'registryRetired':
261
+ view.retiredRoot = d.permitsRoot.toString();
262
+ view.retiredByPlatform = d.byPlatform.toBoolean();
263
+ view.retiredForced = d.forced.toBoolean();
264
+ break;
265
+ default:
266
+ throw new Error(`unknown registry event type: ${e.type}`);
267
+ }
268
+ view.eventsApplied++;
269
+ }
270
+ // A rotation to epoch N implies the registryCreated keys were replaced.
271
+ const out = new Map();
272
+ for (const [subject, list] of bySubject) {
273
+ list.sort((a, b) => a.rec.seq - b.rec.seq);
274
+ // Each change is the previous seq + 1, from the start: 0, or the seq a
275
+ // carried-over permit had when the registry started.
276
+ let prevSeq = view.permits.get(subject)?.seq ?? view.start?.seqs.get(subject) ?? 0;
277
+ for (const item of list) {
278
+ if (item.rec.seq !== prevSeq + 1) {
279
+ throw new Error(`event out of order for ${subject}: seq ${item.rec.seq} after ${prevSeq || 'none'}`);
280
+ }
281
+ prevSeq = item.rec.seq;
282
+ }
283
+ out.set(subject, list[list.length - 1]);
284
+ }
285
+ return out;
286
+ }
287
+ /** Fetches a registry's events (active Mina instance) and rebuilds its tree. */
288
+ export async function rebuildRegistry(address) {
289
+ const pk = typeof address === 'string' ? PublicKey.fromBase58(address) : address;
290
+ const events = await new PermitRegistryEvents(pk).fetchEvents();
291
+ return applyRegistryEvents(emptyRegistryView(), events);
292
+ }
293
+ /**
294
+ * Effective status of a permit at `slot`: revoked and suspended win, then the
295
+ * dates. `gracePeriod` comes from the registry policy.
296
+ */
297
+ /**
298
+ * A permit's status at `slot`. With the registry's `forkActivationSlot`
299
+ * (a successor deployed after a Mina hard fork): a permit that lapsed
300
+ * shortly before the fork, while its registry was retired and couldn't
301
+ * renew it, counts as expiring at the fork slot, so its grace runs from the
302
+ * fork (as licensing's effectiveExpirySlot). Anonymous holder proofs check
303
+ * the expiry as granted.
304
+ */
305
+ export function permitStatusAt(rec, slot, gracePeriod = 0, forkActivationSlot = 0) {
306
+ if (!rec)
307
+ return 'unknown';
308
+ if (rec.status === 2)
309
+ return 'revoked';
310
+ if (rec.status === 3)
311
+ return 'moved';
312
+ if (rec.status === 1)
313
+ return 'suspended';
314
+ if (slot < rec.validFrom)
315
+ return 'not-yet-valid';
316
+ const expiry = forkBumpedExpiry(rec.expirySlot, forkActivationSlot, gracePeriod);
317
+ if (slot <= expiry)
318
+ return 'active';
319
+ if (slot <= expiry + gracePeriod)
320
+ return 'in-grace';
321
+ return 'expired';
322
+ }
323
+ export { unpackFees, unpackPolicy };
324
+ export function registryViewToStored(view) {
325
+ const d = view.tree.toCompact();
326
+ return {
327
+ root: view.root, permits: [...view.permits.values()], applications: [...view.applications.values()],
328
+ tree: { indices: encodeFields(d.indices), leaves: encodeFields(d.leaves), splits: encodeFields(d.splits) },
329
+ ...(view.start ? { start: { root: view.start.root, seqs: [...view.start.seqs] } } : {}),
330
+ };
331
+ }
332
+ /**
333
+ * Loads a saved view without re-hashing; its keys, epoch and fees come back
334
+ * with the next refreshRegistryView. Throws if the copy is inconsistent.
335
+ */
336
+ export function registryViewFromStored(s) {
337
+ const tree = CompactMerkleMap.fromCompact({ indices: decodeFields(s.tree.indices), leaves: decodeFields(s.tree.leaves), splits: decodeFields(s.tree.splits) }, s.root);
338
+ if (tree.size !== s.permits.length)
339
+ throw new Error('saved registry view: the permits and the tree disagree');
340
+ const permits = new Map(s.permits.map(p => [p.subject, p]));
341
+ const view = { tree, root: s.root, permits, keysHash: null, epoch: 0, feesPacked: null, ...emptyEscrow(), eventsApplied: 0 };
342
+ setApplications(view, new Map((s.applications ?? []).map(a => [a.subject, a])));
343
+ if (s.start)
344
+ view.start = { root: s.start.root, seqs: new Map(s.start.seqs) };
345
+ return view;
346
+ }
347
+ //# sourceMappingURL=permitRegistryRebuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permitRegistryRebuild.js","sourceRoot":"","sources":["../src/permitRegistryRebuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * permitTree.ts — `zklicensing/permits/tree`
3
+ *
4
+ * A compact copy of a registry's permits tree, for holders to build their
5
+ * Merkle witness without the keeper learning which permit is theirs, and
6
+ * without rebuilding the 256-level tree (one 256-hash path per permit,
7
+ * about 0.1 s each).
8
+ *
9
+ * The tree is sparse: permits sit at random-looking positions, so below the
10
+ * top few levels nearly every permit is alone in its subtree and everything
11
+ * beside it is empty — known constants. The only non-constant siblings any
12
+ * witness needs are the two children of each node where two permits' paths
13
+ * split: with the permits sorted by position, one such node per adjacent
14
+ * pair, N − 1 in all. The compact tree is every permit's record plus those
15
+ * 2(N − 1) node values. Everyone downloads the same thing; a wrong copy only
16
+ * makes the holder's proof fail against the chain's root, never pass.
17
+ *
18
+ * Updates: `applyTreeDiff` takes the records that changed since a root the
19
+ * holder has and recomputes only the nodes above them.
20
+ */
21
+ import { MerkleMap } from 'o1js';
22
+ import { type PermitRecord } from './permitRegistryRebuild.js';
23
+ import { CompactMerkleMap } from './compactMerkleMap.js';
24
+ export type CompactTree = {
25
+ registry: string;
26
+ root: string;
27
+ slot: number;
28
+ /** Every permit, sorted by tree position. */
29
+ permits: PermitRecord[];
30
+ /** The 2(N − 1) split-children values, 32 bytes each, big-endian, base64. */
31
+ nodes: string;
32
+ };
33
+ export type TreeDiff = {
34
+ registry: string;
35
+ root: string;
36
+ slot: number;
37
+ since: string;
38
+ changed: PermitRecord[];
39
+ };
40
+ /** A subject's leaf position (as MerkleMap places it). */
41
+ export declare function subjectIndex(subject: string): bigint;
42
+ /**
43
+ * The compact tree from a full permits tree (the keeper's MerkleMap). Reads
44
+ * node values; no hashing.
45
+ */
46
+ export declare function compactTreeFrom(args: {
47
+ registry: string;
48
+ slot: number;
49
+ tree: MerkleMap | CompactMerkleMap;
50
+ permits: Iterable<PermitRecord>;
51
+ }): CompactTree;
52
+ /**
53
+ * The Merkle witness for `subject` from the compact tree, checked by folding
54
+ * it to the tree's root (one path of hashes).
55
+ */
56
+ export declare function witnessFromCompactTree(ct: CompactTree, subject: string): {
57
+ root: string;
58
+ witness: {
59
+ isLefts: boolean[];
60
+ siblings: string[];
61
+ };
62
+ permit: PermitRecord;
63
+ };
64
+ /**
65
+ * Applies the records that changed since `old.root`, recomputing only the
66
+ * nodes above them, and checks the result against `diff.root`.
67
+ */
68
+ export declare function applyTreeDiff(old: CompactTree, diff: TreeDiff): CompactTree;
69
+ /** Where a holder keeps its registry copies (IndexedDB in a browser, memory or a file elsewhere). */
70
+ export type TreeCache = {
71
+ get(registry: string): Promise<CompactTree | null>;
72
+ set(registry: string, tree: CompactTree): Promise<void>;
73
+ };
74
+ /**
75
+ * The registry's current compact tree: the cached copy brought up to date
76
+ * with a diff when the keeper has one, else a full download.
77
+ */
78
+ export declare function syncRegistryTree(args: {
79
+ registry: string;
80
+ fetchTree: (since?: string) => Promise<CompactTree | TreeDiff | {
81
+ root: string;
82
+ slot: number;
83
+ unchanged: true;
84
+ }>;
85
+ cache?: TreeCache;
86
+ onProgress?: (what: 'cached' | 'diff' | 'full') => void;
87
+ }): Promise<CompactTree>;
88
+ //# sourceMappingURL=permitTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permitTree.d.ts","sourceRoot":"","sources":["../src/permitTree.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAS,SAAS,EAAY,MAAM,MAAM,CAAC;AAElD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAA8B,MAAM,uBAAuB,CAAC;AAIrF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;AAiBhH,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAyBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAA;CAAE,GAAG,WAAW,CAW1J;AAsBD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAmBpK;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,WAAW,CA6C3E;AAED,qGAAqG;AACrG,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD,CAAC;AAEF;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IACjH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;CACzD,GAAG,OAAO,CAAC,WAAW,CAAC,CAiBvB"}