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.
- package/README.md +417 -201
- package/build/agent.d.ts +371 -0
- package/build/agent.d.ts.map +1 -0
- package/build/agent.js +553 -0
- package/build/agent.js.map +1 -0
- package/build/agentActions.d.ts +841 -0
- package/build/agentActions.d.ts.map +1 -0
- package/build/agentActions.js +581 -0
- package/build/agentActions.js.map +1 -0
- package/build/agentRecord.d.ts +83 -0
- package/build/agentRecord.d.ts.map +1 -0
- package/build/agentRecord.js +69 -0
- package/build/agentRecord.js.map +1 -0
- package/build/agentVendor.d.ts +220 -0
- package/build/agentVendor.d.ts.map +1 -0
- package/build/agentVendor.js +306 -0
- package/build/agentVendor.js.map +1 -0
- package/build/appsLookup.d.ts +14 -0
- package/build/appsLookup.d.ts.map +1 -0
- package/build/appsLookup.js +12 -0
- package/build/appsLookup.js.map +1 -0
- package/build/archiveBootstrap.d.ts +31 -5
- package/build/archiveBootstrap.d.ts.map +1 -0
- package/build/archiveBootstrap.js +140 -47
- package/build/archiveBootstrap.js.map +1 -0
- package/build/atomicJson.d.ts +5 -0
- package/build/atomicJson.d.ts.map +1 -0
- package/build/atomicJson.js +55 -0
- package/build/atomicJson.js.map +1 -0
- package/build/bindClient.d.ts +85 -0
- package/build/bindClient.d.ts.map +1 -0
- package/build/bindClient.js +187 -0
- package/build/bindClient.js.map +1 -0
- package/build/buyClient.d.ts +27 -4
- package/build/buyClient.d.ts.map +1 -0
- package/build/buyClient.js +72 -26
- package/build/buyClient.js.map +1 -0
- package/build/chainHead.d.ts +61 -0
- package/build/chainHead.d.ts.map +1 -0
- package/build/chainHead.js +88 -0
- package/build/chainHead.js.map +1 -0
- package/build/compactMerkleMap.d.ts +72 -0
- package/build/compactMerkleMap.d.ts.map +1 -0
- package/build/compactMerkleMap.js +224 -0
- package/build/compactMerkleMap.js.map +1 -0
- package/build/contractInterface.d.ts +191 -51
- package/build/contractInterface.d.ts.map +1 -0
- package/build/contractInterface.js +234 -43
- package/build/contractInterface.js.map +1 -0
- package/build/contractTypes.d.ts +9 -0
- package/build/contractTypes.d.ts.map +1 -0
- package/build/contractTypes.js +28 -0
- package/build/contractTypes.js.map +1 -0
- package/build/countryStats.d.ts +12 -3
- package/build/countryStats.d.ts.map +1 -0
- package/build/countryStats.js +87 -23
- package/build/countryStats.js.map +1 -0
- package/build/deployClient.d.ts +138 -24
- package/build/deployClient.d.ts.map +1 -0
- package/build/deployClient.js +91 -31
- package/build/deployClient.js.map +1 -0
- package/build/deviceIdentity.d.ts +68 -0
- package/build/deviceIdentity.d.ts.map +1 -0
- package/build/deviceIdentity.js +209 -0
- package/build/deviceIdentity.js.map +1 -0
- package/build/freezeClient.d.ts +26 -6
- package/build/freezeClient.d.ts.map +1 -0
- package/build/freezeClient.js +30 -6
- package/build/freezeClient.js.map +1 -0
- package/build/generationClient.d.ts +6 -3
- package/build/generationClient.d.ts.map +1 -0
- package/build/generationClient.js +25 -38
- package/build/generationClient.js.map +1 -0
- package/build/holderSecret.d.ts +70 -0
- package/build/holderSecret.d.ts.map +1 -0
- package/build/holderSecret.js +76 -0
- package/build/holderSecret.js.map +1 -0
- package/build/index.d.ts +38 -38
- package/build/index.d.ts.map +1 -0
- package/build/index.js +97 -121
- package/build/index.js.map +1 -0
- package/build/keysClient.d.ts +142 -0
- package/build/keysClient.d.ts.map +1 -0
- package/build/keysClient.js +109 -0
- package/build/keysClient.js.map +1 -0
- package/build/licenseLeaf.d.ts +76 -0
- package/build/licenseLeaf.d.ts.map +1 -0
- package/build/licenseLeaf.js +189 -0
- package/build/licenseLeaf.js.map +1 -0
- package/build/licenseRecord.d.ts +68 -5
- package/build/licenseRecord.d.ts.map +1 -0
- package/build/licenseRecord.js +26 -1
- package/build/licenseRecord.js.map +1 -0
- package/build/licenseStore.d.ts +81 -4
- package/build/licenseStore.d.ts.map +1 -0
- package/build/licenseStore.js +400 -30
- package/build/licenseStore.js.map +1 -0
- package/build/licenseTrustless.d.ts +43 -0
- package/build/licenseTrustless.d.ts.map +1 -0
- package/build/licenseTrustless.js +180 -0
- package/build/licenseTrustless.js.map +1 -0
- package/build/manifestVerify.d.ts +29 -1
- package/build/manifestVerify.d.ts.map +1 -0
- package/build/manifestVerify.js +46 -4
- package/build/manifestVerify.js.map +1 -0
- package/build/minaPriceHistory.d.ts +9 -0
- package/build/minaPriceHistory.d.ts.map +1 -0
- package/build/minaPriceHistory.js +152 -0
- package/build/minaPriceHistory.js.map +1 -0
- package/build/onChainRoot.d.ts +60 -0
- package/build/onChainRoot.d.ts.map +1 -0
- package/build/onChainRoot.js +74 -0
- package/build/onChainRoot.js.map +1 -0
- package/build/ownershipLicenseHash.d.ts +25 -0
- package/build/ownershipLicenseHash.d.ts.map +1 -0
- package/build/ownershipLicenseHash.js +29 -0
- package/build/ownershipLicenseHash.js.map +1 -0
- package/build/ownershipSignature.d.ts +153 -0
- package/build/ownershipSignature.d.ts.map +1 -0
- package/build/ownershipSignature.js +297 -0
- package/build/ownershipSignature.js.map +1 -0
- package/build/permitCheckFlow.d.ts +155 -0
- package/build/permitCheckFlow.d.ts.map +1 -0
- package/build/permitCheckFlow.js +196 -0
- package/build/permitCheckFlow.js.map +1 -0
- package/build/permitDescribe.d.ts +124 -0
- package/build/permitDescribe.d.ts.map +1 -0
- package/build/permitDescribe.js +324 -0
- package/build/permitDescribe.js.map +1 -0
- package/build/permitInterface.d.ts +85 -0
- package/build/permitInterface.d.ts.map +1 -0
- package/build/permitInterface.js +121 -0
- package/build/permitInterface.js.map +1 -0
- package/build/permitMessages.d.ts +313 -0
- package/build/permitMessages.d.ts.map +1 -0
- package/build/permitMessages.js +462 -0
- package/build/permitMessages.js.map +1 -0
- package/build/permitProof.d.ts +108 -0
- package/build/permitProof.d.ts.map +1 -0
- package/build/permitProof.js +202 -0
- package/build/permitProof.js.map +1 -0
- package/build/permitRegistryRebuild.d.ts +166 -0
- package/build/permitRegistryRebuild.d.ts.map +1 -0
- package/build/permitRegistryRebuild.js +347 -0
- package/build/permitRegistryRebuild.js.map +1 -0
- package/build/permitTree.d.ts +88 -0
- package/build/permitTree.d.ts.map +1 -0
- package/build/permitTree.js +230 -0
- package/build/permitTree.js.map +1 -0
- package/build/permitsClient.d.ts +680 -0
- package/build/permitsClient.d.ts.map +1 -0
- package/build/permitsClient.js +597 -0
- package/build/permitsClient.js.map +1 -0
- package/build/proveErrors.d.ts +50 -0
- package/build/proveErrors.d.ts.map +1 -0
- package/build/proveErrors.js +76 -0
- package/build/proveErrors.js.map +1 -0
- package/build/receipt.d.ts +95 -0
- package/build/receipt.d.ts.map +1 -0
- package/build/receipt.js +84 -0
- package/build/receipt.js.map +1 -0
- package/build/refundClient.d.ts +7 -12
- package/build/refundClient.d.ts.map +1 -0
- package/build/refundClient.js +52 -21
- package/build/refundClient.js.map +1 -0
- package/build/registryTrustVerify.d.ts +78 -0
- package/build/registryTrustVerify.d.ts.map +1 -0
- package/build/registryTrustVerify.js +129 -0
- package/build/registryTrustVerify.js.map +1 -0
- package/build/releaseClient.d.ts +26 -0
- package/build/releaseClient.d.ts.map +1 -0
- package/build/releaseClient.js +65 -0
- package/build/releaseClient.js.map +1 -0
- package/build/renewClient.d.ts +28 -2
- package/build/renewClient.d.ts.map +1 -0
- package/build/renewClient.js +31 -27
- package/build/renewClient.js.map +1 -0
- package/build/seatName.d.ts +8 -0
- package/build/seatName.d.ts.map +1 -0
- package/build/seatName.js +136 -0
- package/build/seatName.js.map +1 -0
- package/build/slotConstants.d.ts +15 -0
- package/build/slotConstants.d.ts.map +1 -0
- package/build/slotConstants.js +17 -0
- package/build/slotConstants.js.map +1 -0
- package/build/statsClient.d.ts +61 -7
- package/build/statsClient.d.ts.map +1 -0
- package/build/statsClient.js +44 -5
- package/build/statsClient.js.map +1 -0
- package/build/successorChain.d.ts +35 -0
- package/build/successorChain.d.ts.map +1 -0
- package/build/successorChain.js +69 -0
- package/build/successorChain.js.map +1 -0
- package/build/taxId.d.ts +44 -0
- package/build/taxId.d.ts.map +1 -0
- package/build/taxId.js +212 -0
- package/build/taxId.js.map +1 -0
- package/build/trustAnchorVerify.d.ts +49 -0
- package/build/trustAnchorVerify.d.ts.map +1 -0
- package/build/trustAnchorVerify.js +432 -0
- package/build/trustAnchorVerify.js.map +1 -0
- package/build/trustAnchorVerifyCli.d.ts +45 -0
- package/build/trustAnchorVerifyCli.d.ts.map +1 -0
- package/build/trustAnchorVerifyCli.js +235 -0
- package/build/trustAnchorVerifyCli.js.map +1 -0
- package/build/txBroadcastClient.d.ts +26 -0
- package/build/txBroadcastClient.d.ts.map +1 -0
- package/build/txBroadcastClient.js +20 -0
- package/build/txBroadcastClient.js.map +1 -0
- package/build/unbindClient.d.ts +77 -0
- package/build/unbindClient.d.ts.map +1 -0
- package/build/unbindClient.js +169 -0
- package/build/unbindClient.js.map +1 -0
- package/build/units.d.ts +28 -0
- package/build/units.d.ts.map +1 -0
- package/build/units.js +65 -0
- package/build/units.js.map +1 -0
- package/build/vatRates.d.ts +54 -0
- package/build/vatRates.d.ts.map +1 -0
- package/build/vatRates.js +82 -0
- package/build/vatRates.js.map +1 -0
- package/build/vatRatesData.d.ts +5 -0
- package/build/vatRatesData.d.ts.map +1 -0
- package/build/vatRatesData.js +42 -0
- package/build/vatRatesData.js.map +1 -0
- package/build/vendorAccountClient.d.ts +66 -0
- package/build/vendorAccountClient.d.ts.map +1 -0
- package/build/vendorAccountClient.js +47 -0
- package/build/vendorAccountClient.js.map +1 -0
- package/build/verifyCore.d.ts +4 -1
- package/build/verifyCore.d.ts.map +1 -0
- package/build/verifyCore.js +21 -10
- package/build/verifyCore.js.map +1 -0
- package/build/verifyOffline.d.ts +85 -0
- package/build/verifyOffline.d.ts.map +1 -0
- package/build/verifyOffline.js +139 -0
- package/build/verifyOffline.js.map +1 -0
- package/build/verifyService.d.ts.map +1 -0
- package/build/verifyService.js +571 -501
- package/build/verifyService.js.map +1 -0
- package/build/verifyWithAncestors.d.ts +19 -0
- package/build/verifyWithAncestors.d.ts.map +1 -0
- package/build/verifyWithAncestors.js +127 -0
- package/build/verifyWithAncestors.js.map +1 -0
- package/build/zipToState.d.ts +2 -0
- package/build/zipToState.d.ts.map +1 -0
- package/build/zipToState.js +94 -0
- package/build/zipToState.js.map +1 -0
- package/package.json +141 -16
- package/src/agent.ts +682 -0
- package/src/agentActions.ts +637 -0
- package/src/agentRecord.ts +121 -0
- package/src/agentVendor.ts +356 -0
- package/src/appsLookup.ts +48 -0
- package/src/archiveBootstrap.ts +386 -0
- package/src/atomicJson.ts +53 -0
- package/src/bindClient.ts +297 -0
- package/src/buyClient.ts +344 -0
- package/src/chainHead.ts +106 -0
- package/src/compactMerkleMap.ts +222 -0
- package/src/contractInterface.ts +465 -0
- package/src/contractTypes.ts +31 -0
- package/src/countryStats.ts +200 -0
- package/src/deployClient.ts +517 -0
- package/src/deviceIdentity.ts +249 -0
- package/src/freezeClient.ts +162 -0
- package/src/generationClient.ts +145 -0
- package/src/holderSecret.ts +91 -0
- package/src/index.ts +362 -0
- package/src/keysClient.ts +135 -0
- package/src/licenseLeaf.ts +221 -0
- package/src/licenseRecord.ts +190 -0
- package/src/licenseStore.ts +767 -0
- package/src/licenseTrustless.ts +207 -0
- package/src/manifestVerify.ts +164 -0
- package/src/minaPriceHistory.ts +166 -0
- package/src/onChainRoot.ts +90 -0
- package/src/ownershipLicenseHash.ts +31 -0
- package/src/ownershipSignature.ts +421 -0
- package/src/permitCheckFlow.ts +227 -0
- package/src/permitDescribe.ts +362 -0
- package/src/permitInterface.ts +146 -0
- package/src/permitMessages.ts +572 -0
- package/src/permitProof.ts +230 -0
- package/src/permitRegistryRebuild.ts +423 -0
- package/src/permitTree.ts +232 -0
- package/src/permitsClient.ts +746 -0
- package/src/proveErrors.ts +98 -0
- package/src/receipt.ts +156 -0
- package/src/refundClient.ts +177 -0
- package/src/registryTrustVerify.ts +192 -0
- package/src/releaseClient.ts +101 -0
- package/src/renewClient.ts +234 -0
- package/src/seatName.ts +165 -0
- package/src/slotConstants.ts +18 -0
- package/src/statsClient.ts +249 -0
- package/src/successorChain.ts +87 -0
- package/src/taxId.ts +227 -0
- package/src/trustAnchorVerify.ts +550 -0
- package/src/trustAnchorVerifyCli.ts +234 -0
- package/src/txBroadcastClient.ts +48 -0
- package/src/unbindClient.ts +233 -0
- package/src/units.ts +74 -0
- package/src/vatRates.ts +100 -0
- package/src/vatRatesData.ts +43 -0
- package/src/vendorAccountClient.ts +120 -0
- package/src/verifyCore.ts +100 -0
- package/src/verifyOffline.ts +212 -0
- package/src/verifyService.ts +982 -0
- package/src/verifyWithAncestors.ts +163 -0
- package/src/zipToState.ts +94 -0
- package/build/licenseProof.d.ts +0 -26
- package/build/licenseProof.js +0 -41
- package/build/migrateClient.d.ts +0 -43
- package/build/migrateClient.js +0 -47
- package/build/ownership.d.ts +0 -34
- 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"}
|