zklicensing 0.1.0-beta.2 → 0.1.0-beta.4
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 +335 -97
- 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 +15 -1
- package/build/archiveBootstrap.d.ts.map +1 -0
- package/build/archiveBootstrap.js +62 -9
- package/build/archiveBootstrap.js.map +1 -0
- package/build/bindClient.d.ts +51 -0
- package/build/bindClient.d.ts.map +1 -0
- package/build/bindClient.js +115 -0
- package/build/bindClient.js.map +1 -0
- package/build/buyClient.d.ts +10 -3
- package/build/buyClient.d.ts.map +1 -0
- package/build/buyClient.js +33 -15
- package/build/buyClient.js.map +1 -0
- package/build/contractInterface.d.ts +11 -5
- package/build/contractInterface.d.ts.map +1 -0
- package/build/contractInterface.js +82 -17
- package/build/contractInterface.js.map +1 -0
- package/build/countryStats.d.ts +6 -1
- package/build/countryStats.d.ts.map +1 -0
- package/build/countryStats.js +33 -9
- package/build/countryStats.js.map +1 -0
- package/build/deployClient.d.ts.map +1 -0
- package/build/deployClient.js +1 -1
- 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.map +1 -0
- package/build/freezeClient.js +1 -1
- package/build/freezeClient.js.map +1 -0
- package/build/generationClient.d.ts +1 -0
- package/build/generationClient.d.ts.map +1 -0
- package/build/generationClient.js +2 -2
- package/build/generationClient.js.map +1 -0
- package/build/index.d.ts +27 -37
- package/build/index.d.ts.map +1 -0
- package/build/index.js +85 -116
- package/build/index.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 +20 -1
- package/build/licenseRecord.d.ts.map +1 -0
- package/build/licenseRecord.js +1 -1
- package/build/licenseRecord.js.map +1 -0
- package/build/licenseStore.d.ts +17 -2
- package/build/licenseStore.d.ts.map +1 -0
- package/build/licenseStore.js +167 -7
- package/build/licenseStore.js.map +1 -0
- package/build/manifestVerify.d.ts.map +1 -0
- package/build/manifestVerify.js +8 -3
- package/build/manifestVerify.js.map +1 -0
- package/build/migrateClient.d.ts +6 -21
- package/build/migrateClient.d.ts.map +1 -0
- package/build/migrateClient.js +30 -17
- package/build/migrateClient.js.map +1 -0
- package/build/onChainRoot.d.ts +67 -0
- package/build/onChainRoot.d.ts.map +1 -0
- package/build/onChainRoot.js +87 -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 +122 -0
- package/build/ownershipSignature.d.ts.map +1 -0
- package/build/ownershipSignature.js +244 -0
- package/build/ownershipSignature.js.map +1 -0
- package/build/proveErrors.d.ts +35 -0
- package/build/proveErrors.d.ts.map +1 -0
- package/build/proveErrors.js +49 -0
- package/build/proveErrors.js.map +1 -0
- package/build/refundClient.d.ts +2 -11
- package/build/refundClient.d.ts.map +1 -0
- package/build/refundClient.js +35 -17
- package/build/refundClient.js.map +1 -0
- package/build/renewClient.d.ts +4 -1
- package/build/renewClient.d.ts.map +1 -0
- package/build/renewClient.js +11 -4
- 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/statsClient.d.ts +47 -4
- package/build/statsClient.d.ts.map +1 -0
- package/build/statsClient.js +44 -5
- package/build/statsClient.js.map +1 -0
- package/build/trustAnchorVerify.d.ts +48 -0
- package/build/trustAnchorVerify.d.ts.map +1 -0
- package/build/trustAnchorVerify.js +431 -0
- package/build/trustAnchorVerify.js.map +1 -0
- package/build/trustAnchorVerifyCli.d.ts +35 -0
- package/build/trustAnchorVerifyCli.d.ts.map +1 -0
- package/build/trustAnchorVerifyCli.js +177 -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 +56 -0
- package/build/unbindClient.d.ts.map +1 -0
- package/build/unbindClient.js +113 -0
- package/build/unbindClient.js.map +1 -0
- package/build/vendorAccountClient.d.ts +56 -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 +1 -1
- package/build/verifyCore.d.ts.map +1 -0
- package/build/verifyCore.js +11 -4
- 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 +582 -455
- package/build/verifyService.js.map +1 -0
- package/build/verifyWithAncestors.d.ts +18 -0
- package/build/verifyWithAncestors.d.ts.map +1 -0
- package/build/verifyWithAncestors.js +119 -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 +57 -13
- package/src/appsLookup.ts +48 -0
- package/src/archiveBootstrap.ts +342 -0
- package/src/bindClient.ts +175 -0
- package/src/buyClient.ts +304 -0
- package/src/contractInterface.d.ts +61 -0
- package/src/contractInterface.ts +313 -0
- package/src/countryStats.ts +171 -0
- package/src/deployClient.ts +388 -0
- package/src/deviceIdentity.ts +249 -0
- package/src/freezeClient.ts +117 -0
- package/src/generationClient.ts +165 -0
- package/src/index.ts +329 -0
- package/src/licenseLeaf.ts +221 -0
- package/src/licenseRecord.ts +108 -0
- package/src/licenseStore.ts +538 -0
- package/src/manifestVerify.ts +111 -0
- package/src/migrateClient.ts +84 -0
- package/src/onChainRoot.ts +107 -0
- package/src/ownershipLicenseHash.ts +31 -0
- package/src/ownershipSignature.ts +354 -0
- package/src/proveErrors.ts +70 -0
- package/src/refundClient.ts +158 -0
- package/src/renewClient.ts +214 -0
- package/src/seatName.ts +165 -0
- package/src/statsClient.ts +235 -0
- package/src/trustAnchorVerify.ts +548 -0
- package/src/trustAnchorVerifyCli.ts +179 -0
- package/src/txBroadcastClient.ts +48 -0
- package/src/unbindClient.ts +149 -0
- package/src/vendorAccountClient.ts +110 -0
- package/src/verifyCore.ts +92 -0
- package/src/verifyOffline.ts +212 -0
- package/src/verifyService.ts +969 -0
- package/src/verifyWithAncestors.ts +153 -0
- package/src/zipToState.ts +94 -0
- package/build/licenseProof.d.ts +0 -26
- package/build/licenseProof.js +0 -41
- package/build/ownership.d.ts +0 -34
- package/build/ownership.js +0 -147
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
|
+
/**
|
|
4
|
+
* deviceIdentity.ts
|
|
5
|
+
*
|
|
6
|
+
* Per-install Pallas Schnorr keypair used to identify a device to the
|
|
7
|
+
* non-custodial binding flow. `getOrCreateDeviceIdentity(storageKey)`
|
|
8
|
+
* returns a stable keypair for the caller's storage key: created on
|
|
9
|
+
* first call, loaded verbatim on every subsequent call.
|
|
10
|
+
*
|
|
11
|
+
* The `deviceCommitment` this module exposes matches the on-chain
|
|
12
|
+
* `occupied[i]` field shape written by `LicensingApp.bind()` — it's
|
|
13
|
+
* `Poseidon([pk.x, pk.isOdd.toField()])` over the device's Pallas
|
|
14
|
+
* pubkey (see `ownerPubKeyHash` in ./licenseLeaf.ts for the identical
|
|
15
|
+
* shape applied to the ownership pubkey). Callers pass the commitment
|
|
16
|
+
* to `proveBind` and to the ownership signature; the raw device pubkey
|
|
17
|
+
* itself never crosses the wire.
|
|
18
|
+
*
|
|
19
|
+
* Storage tradeoffs (documented up front — the plan's original
|
|
20
|
+
* assumption was WebCrypto extractable=false, which only applies to
|
|
21
|
+
* WebCrypto-native primitives):
|
|
22
|
+
*
|
|
23
|
+
* Browser path — IndexedDB.
|
|
24
|
+
* Pallas is not a WebCrypto primitive, so we cannot store the
|
|
25
|
+
* private key as a non-extractable CryptoKey. The private key is
|
|
26
|
+
* persisted as its Mina canonical base58 encoding. An adversary
|
|
27
|
+
* with access to the browser profile (malware running as the user,
|
|
28
|
+
* evil browser extension) can read it. This matches the trust
|
|
29
|
+
* model of every other browser-persisted secret today (bearer
|
|
30
|
+
* cookies, IndexedDB tokens); binding to a fresh device after
|
|
31
|
+
* compromise is a keypair regen + one on-chain bind — no funds
|
|
32
|
+
* at risk, only slot churn. Users who want stronger storage can
|
|
33
|
+
* wipe the storageKey between sessions and re-bind on demand.
|
|
34
|
+
*
|
|
35
|
+
* Node / Electron path — keytar (OS keychain).
|
|
36
|
+
* `keytar` is loaded lazily and marked as an optional peer
|
|
37
|
+
* dependency in package.json so the browser bundle isn't dragged
|
|
38
|
+
* into installing native bindings it can't use. If keytar is
|
|
39
|
+
* unavailable at runtime, the SDK throws with a clear message
|
|
40
|
+
* rather than falling back to plaintext-on-disk.
|
|
41
|
+
*
|
|
42
|
+
* The keypair is Pallas-scalar-random, NOT passphrase-derived — the
|
|
43
|
+
* device identity is meant to survive a passphrase reset (the user
|
|
44
|
+
* can re-derive their ownership key from the passphrase, then unbind
|
|
45
|
+
* / rebind existing device slots without re-installing the app).
|
|
46
|
+
*/
|
|
47
|
+
import { PrivateKey, Poseidon } from 'o1js';
|
|
48
|
+
// ── Storage key namespacing ───────────────────────────────────────
|
|
49
|
+
// All device identities live under this shared prefix in whatever
|
|
50
|
+
// backing store is chosen. Callers pass a per-app / per-installation
|
|
51
|
+
// suffix (e.g. the app's short name) so a single browser profile can
|
|
52
|
+
// hold distinct device identities for distinct vendors' apps.
|
|
53
|
+
const STORAGE_PREFIX = 'zklic_device_';
|
|
54
|
+
function namespaced(storageKey) {
|
|
55
|
+
return `${STORAGE_PREFIX}${storageKey}`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Compute the on-chain-shaped device commitment from a Pallas pubkey.
|
|
59
|
+
* Exported so tests and downstream tooling can re-derive it without
|
|
60
|
+
* re-instantiating the whole DeviceIdentity.
|
|
61
|
+
*/
|
|
62
|
+
export function computeDeviceCommitment(devicePubKey) {
|
|
63
|
+
return Poseidon.hash([devicePubKey.x, devicePubKey.isOdd.toField()]).toString();
|
|
64
|
+
}
|
|
65
|
+
function buildIdentity(privateKey) {
|
|
66
|
+
const devicePubKey = privateKey.toPublicKey();
|
|
67
|
+
return {
|
|
68
|
+
devicePrivateKey: privateKey,
|
|
69
|
+
devicePubKey,
|
|
70
|
+
deviceCommitment: computeDeviceCommitment(devicePubKey),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// ── Environment detection ─────────────────────────────────────────
|
|
74
|
+
function hasIndexedDB() {
|
|
75
|
+
return typeof globalThis !== 'undefined'
|
|
76
|
+
&& typeof globalThis.indexedDB !== 'undefined';
|
|
77
|
+
}
|
|
78
|
+
function isNodeLike() {
|
|
79
|
+
// Node exposes `process.versions.node`; Deno/Bun don't (their
|
|
80
|
+
// process shims omit this key). Browsers have no `process` global
|
|
81
|
+
// unless something's polyfilled it, but the indexedDB branch runs
|
|
82
|
+
// first so that ordering is fine.
|
|
83
|
+
return typeof globalThis.process !== 'undefined'
|
|
84
|
+
&& typeof globalThis.process?.versions?.node === 'string';
|
|
85
|
+
}
|
|
86
|
+
// ── IndexedDB backing store (browser) ─────────────────────────────
|
|
87
|
+
// Small promisified wrapper — no third-party idb library, to keep the
|
|
88
|
+
// SDK dependency surface minimal. Single key/value store; the whole
|
|
89
|
+
// database is one object store with `storageKey` as the key.
|
|
90
|
+
const IDB_DB_NAME = 'zklicensing';
|
|
91
|
+
const IDB_STORE_NAME = 'device_identities';
|
|
92
|
+
const IDB_VERSION = 1;
|
|
93
|
+
function openIdb() {
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
const req = globalThis.indexedDB.open(IDB_DB_NAME, IDB_VERSION);
|
|
96
|
+
req.onupgradeneeded = () => {
|
|
97
|
+
const db = req.result;
|
|
98
|
+
if (!db.objectStoreNames.contains(IDB_STORE_NAME)) {
|
|
99
|
+
db.createObjectStore(IDB_STORE_NAME);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
req.onsuccess = () => resolve(req.result);
|
|
103
|
+
req.onerror = () => reject(req.error ?? new Error('IndexedDB open failed'));
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async function idbGet(key) {
|
|
107
|
+
const db = await openIdb();
|
|
108
|
+
try {
|
|
109
|
+
return await new Promise((resolve, reject) => {
|
|
110
|
+
const tx = db.transaction(IDB_STORE_NAME, 'readonly');
|
|
111
|
+
const store = tx.objectStore(IDB_STORE_NAME);
|
|
112
|
+
const req = store.get(key);
|
|
113
|
+
req.onsuccess = () => resolve(req.result ?? null);
|
|
114
|
+
req.onerror = () => reject(req.error ?? new Error('IndexedDB get failed'));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
db.close();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function idbPut(key, value) {
|
|
122
|
+
const db = await openIdb();
|
|
123
|
+
try {
|
|
124
|
+
await new Promise((resolve, reject) => {
|
|
125
|
+
const tx = db.transaction(IDB_STORE_NAME, 'readwrite');
|
|
126
|
+
const store = tx.objectStore(IDB_STORE_NAME);
|
|
127
|
+
const req = store.put(value, key);
|
|
128
|
+
req.onsuccess = () => resolve();
|
|
129
|
+
req.onerror = () => reject(req.error ?? new Error('IndexedDB put failed'));
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
db.close();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// ── keytar backing store (Node / Electron) ────────────────────────
|
|
137
|
+
// Loaded via dynamic import so a browser bundler doesn't try to
|
|
138
|
+
// resolve the native module. If keytar isn't installed we throw with
|
|
139
|
+
// a message that tells the caller which optional peer dep to add,
|
|
140
|
+
// rather than silently persisting to plaintext.
|
|
141
|
+
async function loadKeytar() {
|
|
142
|
+
try {
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
144
|
+
return await Function('return import("keytar")')();
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
throw new Error('deviceIdentity requires the optional peer dependency `keytar` in Node/Electron. ' +
|
|
148
|
+
'Install it with `npm i keytar` alongside the zklicensing SDK.');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// keytar's shape: getPassword(service, account) / setPassword(service, account, value).
|
|
152
|
+
// We use a single service name and let `storageKey` be the account, so
|
|
153
|
+
// multiple apps under the same node install can coexist under distinct
|
|
154
|
+
// storage keys without stomping each other.
|
|
155
|
+
const KEYTAR_SERVICE = 'zklicensing-device-identity';
|
|
156
|
+
async function keytarGet(key) {
|
|
157
|
+
const keytar = await loadKeytar();
|
|
158
|
+
const mod = (keytar.default ?? keytar);
|
|
159
|
+
return mod.getPassword(KEYTAR_SERVICE, key);
|
|
160
|
+
}
|
|
161
|
+
async function keytarPut(key, value) {
|
|
162
|
+
const keytar = await loadKeytar();
|
|
163
|
+
const mod = (keytar.default ?? keytar);
|
|
164
|
+
await mod.setPassword(KEYTAR_SERVICE, key, value);
|
|
165
|
+
}
|
|
166
|
+
function pickBackend() {
|
|
167
|
+
if (hasIndexedDB())
|
|
168
|
+
return { get: idbGet, put: idbPut };
|
|
169
|
+
if (isNodeLike())
|
|
170
|
+
return { get: keytarGet, put: keytarPut };
|
|
171
|
+
throw new Error('deviceIdentity: no suitable storage backend detected. ' +
|
|
172
|
+
'Expected IndexedDB in the browser or a Node/Electron runtime with `keytar` installed.');
|
|
173
|
+
}
|
|
174
|
+
// ── Public API ────────────────────────────────────────────────────
|
|
175
|
+
/**
|
|
176
|
+
* Load an existing device keypair for `storageKey`, or create + persist
|
|
177
|
+
* a fresh one on first call. Idempotent across every subsequent call
|
|
178
|
+
* for the same key on the same install.
|
|
179
|
+
*
|
|
180
|
+
* The `storageKey` should be per-app (e.g. the vendor's app short
|
|
181
|
+
* name or its `appId`), so a single browser profile / OS user account
|
|
182
|
+
* can hold distinct device identities for distinct vendors without
|
|
183
|
+
* cross-contamination.
|
|
184
|
+
*/
|
|
185
|
+
export async function getOrCreateDeviceIdentity(storageKey) {
|
|
186
|
+
if (!storageKey || typeof storageKey !== 'string') {
|
|
187
|
+
throw new Error('getOrCreateDeviceIdentity: storageKey must be a non-empty string');
|
|
188
|
+
}
|
|
189
|
+
const backend = pickBackend();
|
|
190
|
+
const key = namespaced(storageKey);
|
|
191
|
+
const existing = await backend.get(key);
|
|
192
|
+
if (existing) {
|
|
193
|
+
try {
|
|
194
|
+
const privateKey = PrivateKey.fromBase58(existing);
|
|
195
|
+
return buildIdentity(privateKey);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Corrupt persisted value — fall through and mint a fresh key,
|
|
199
|
+
// overwriting the bad blob. Losing a device identity here is
|
|
200
|
+
// recoverable: the caller re-binds the new keypair and unbinds
|
|
201
|
+
// the old slot from any other device that still has the
|
|
202
|
+
// ownership key.
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const privateKey = PrivateKey.random();
|
|
206
|
+
await backend.put(key, privateKey.toBase58());
|
|
207
|
+
return buildIdentity(privateKey);
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=deviceIdentity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceIdentity.js","sourceRoot":"","sources":["../src/deviceIdentity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freezeClient.d.ts","sourceRoot":"","sources":["../src/freezeClient.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAW,MAAM,CAAC;IACxB,OAAO,EAAU,MAAM,CAAC;IACxB,IAAI,EAAa,MAAM,CAAC;IACxB,WAAW,EAAM,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAGxB,WAAW,EAAM,OAAO,CAAC;IAKzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAM/B,WAAW,EAAM,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAgBF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAG,OAAO,KAAK,CAAC;IACxB,MAAM,CAAC,EAAI,WAAW,CAAC;CACxB,CAAC;AAKF,wBAAsB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAKzF;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAS,MAAM,CAAC;IAGzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAU,OAAO,KAAK,CAAC;IAC/B,MAAM,CAAC,EAAW,WAAW,CAAC;CAC/B,CAAC;AAOF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyB9F"}
|
package/build/freezeClient.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freezeClient.js","sourceRoot":"","sources":["../src/freezeClient.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oCAAoC;AA8CpC,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa;IACpB,yEAAyE;IACzE,sDAAsD;IACtD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAQD,qEAAqE;AACrE,wEAAwE;AACxE,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA4B;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzF,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,OAAO,MAAM,IAAI,CAAC,IAAI,EAAkB,CAAC;AAC3C,CAAC;AAWD,yEAAyE;AACzE,oEAAoE;AACpE,yEAAyE;AACzE,6EAA6E;AAC7E,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA+B;IACtE,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QACzE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC1F,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAI,IAAI,CAAC,OAAO;YACvB,MAAM,EAAK,IAAI,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,OAAO;YACL,WAAW,EAAM,MAAM,CAAC,WAAW,KAAK,IAAI;YAC5C,eAAe,EAAE,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;YAC3F,WAAW,EAAM,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;SACtE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,qEAAqE;QACrE,mBAAmB;QACnB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC1E,CAAC;AACH,CAAC"}
|
|
@@ -15,6 +15,7 @@ export interface GenerationInfo {
|
|
|
15
15
|
}
|
|
16
16
|
export interface FetchGenerationRequest {
|
|
17
17
|
keeperUrl: string;
|
|
18
|
+
network: 'devnet' | 'mainnet';
|
|
18
19
|
appId: string;
|
|
19
20
|
/** Base64-encoded Ed25519 public keys pinned by the caller. Empty ⇒ verified:false. */
|
|
20
21
|
pinnedPublicKeysBase64: readonly string[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generationClient.d.ts","sourceRoot":"","sources":["../src/generationClient.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAW,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAQ,SAAS,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAG,MAAM,CAAC;IACrB,UAAU,CAAC,EAAG,MAAM,CAAC;IACrB,SAAS,CAAC,EAAI,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,sGAAsG;IACtG,OAAO,EAAM,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,EAAK,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAG,QAAQ,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAK,MAAM,CAAC;IACjB,uFAAuF;IACvF,sBAAsB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,MAAM,CAAC,EAAG,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,YAAY,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,sBAAsB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,MAAM,CAAC,EAAG,WAAW,CAAC;CACvB;AA6CD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAc9F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,+BAA+B,GACnC,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
-
//
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
3
|
/**
|
|
4
4
|
* generationClient.ts
|
|
5
5
|
*
|
|
@@ -61,7 +61,7 @@ async function verifyAndProject(parsed, pinnedPublicKeysBase64) {
|
|
|
61
61
|
*/
|
|
62
62
|
export async function fetchGenerationInfo(req) {
|
|
63
63
|
const fetcher = req.fetcher ?? fetch;
|
|
64
|
-
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/apps/${encodeURIComponent(req.appId)}`, {
|
|
64
|
+
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/apps/${encodeURIComponent(req.appId)}?network=${req.network}`, {
|
|
65
65
|
method: 'GET',
|
|
66
66
|
signal: req.signal,
|
|
67
67
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generationClient.js","sourceRoot":"","sources":["../src/generationClient.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -1,60 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* verifyLicense — client SDK.
|
|
3
3
|
*
|
|
4
|
-
* Calls the
|
|
5
|
-
* license has closed; from that point on returns from a
|
|
6
|
-
* never touches the network again. The refund-window
|
|
7
|
-
* side: the
|
|
8
|
-
* response, computed from its own record of
|
|
9
|
-
* against the on-chain `currentSlot`.
|
|
10
|
-
*
|
|
11
|
-
* file, so a user who forges
|
|
12
|
-
* branch prematurely.
|
|
4
|
+
* Calls the licensing service's GET /verify until the on-chain refund
|
|
5
|
+
* window for the license has closed; from that point on returns from a
|
|
6
|
+
* local anchor and never touches the network again. The refund-window
|
|
7
|
+
* decision is server-side: the service returns `refundWindowClosed:
|
|
8
|
+
* boolean` on its /verify response, computed from its own record of
|
|
9
|
+
* `purchaseSlot + REFUND_WINDOW_N` against the on-chain `currentSlot`.
|
|
10
|
+
* The SDK gates anchor writes on that boolean and never trusts a
|
|
11
|
+
* `purchaseSlot` supplied by the local proof file, so a user who forges
|
|
12
|
+
* their proof metadata cannot force the offline branch prematurely.
|
|
13
13
|
*
|
|
14
14
|
* Anchor purity: every field persisted in the Anchor derives from the
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* service's /verify response — `anchoredSlot`, `expirySlot`. The only
|
|
16
|
+
* client-supplied input to the offline branch is `proof.expirySlot`,
|
|
17
|
+
* used solely as the loadAnchor binding key. A tampered proof file
|
|
18
|
+
* therefore never gets a wrong answer; it gets no offline branch at all
|
|
19
|
+
* and falls through to the licensing service on every call.
|
|
20
20
|
*/
|
|
21
21
|
import { REFUND_WINDOW_N, GRACE_PERIOD_N } from './contractInterface.js';
|
|
22
22
|
declare const MS_PER_SLOT = 90000;
|
|
23
|
+
export declare const DEFAULT_VERIFIER_URL = "https://zklicensing.com/api/verify";
|
|
23
24
|
export interface Storage {
|
|
24
25
|
getItem(key: string): string | null;
|
|
25
26
|
setItem(key: string, value: string): void;
|
|
26
27
|
}
|
|
27
|
-
export interface ActivationRecord {
|
|
28
|
-
token: string;
|
|
29
|
-
expiresAt: number;
|
|
30
|
-
secretHash?: string;
|
|
31
|
-
}
|
|
32
|
-
export declare function loadActivation(storage: Storage, zkAppAddress: string, licenseHash: string, nowMs?: number): ActivationRecord | null;
|
|
33
|
-
export declare function saveActivation(storage: Storage, zkAppAddress: string, licenseHash: string, rec: ActivationRecord): void;
|
|
34
28
|
export interface ProofInput {
|
|
35
29
|
licenseHash: string;
|
|
36
30
|
zkAppAddress: string;
|
|
37
31
|
expirySlot: number;
|
|
38
|
-
verifierUrl?: string;
|
|
39
32
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Callback that proves an OwnershipChallenge using a stored secretHash.
|
|
42
|
-
* Callers wire this up with their own o1js + LicenseProof imports so the SDK
|
|
43
|
-
* stays dependency-free for the verify-only path. Return value is the
|
|
44
|
-
* `proof.toJSON()` payload the verifier's POST /respond expects.
|
|
45
|
-
*/
|
|
46
|
-
export type TokenProver = (input: {
|
|
47
|
-
licenseHash: string;
|
|
48
|
-
nonce: string;
|
|
49
|
-
secretHash: string;
|
|
50
|
-
}) => Promise<unknown>;
|
|
51
33
|
export interface VerifyOptions {
|
|
52
|
-
verifierUrl?: string;
|
|
53
34
|
storage?: Storage | null;
|
|
54
35
|
fetcher?: typeof fetch;
|
|
55
36
|
now?: () => number;
|
|
56
|
-
prover?: TokenProver;
|
|
57
|
-
secretHash?: string;
|
|
58
37
|
}
|
|
59
38
|
export interface VerifyResult {
|
|
60
39
|
valid: boolean;
|
|
@@ -65,8 +44,19 @@ export interface VerifyResult {
|
|
|
65
44
|
remainingDays: number;
|
|
66
45
|
reason: string | null;
|
|
67
46
|
source: 'offline' | 'chain';
|
|
68
|
-
ownership: 'verified' | 'unverified';
|
|
69
47
|
}
|
|
70
48
|
export declare function verifyLicense(proof: ProofInput, options?: VerifyOptions): Promise<VerifyResult>;
|
|
71
49
|
export { REFUND_WINDOW_N, GRACE_PERIOD_N, MS_PER_SLOT };
|
|
50
|
+
export { proveBind, confirmBind } from './bindClient.js';
|
|
51
|
+
export type { ProveBindRequest, ProveBindResponse, ConfirmBindRequest, } from './bindClient.js';
|
|
52
|
+
export { proveUnbind, confirmUnbind } from './unbindClient.js';
|
|
53
|
+
export type { ProveUnbindRequest, ProveUnbindResponse, ConfirmUnbindRequest, } from './unbindClient.js';
|
|
54
|
+
export { getOrCreateDeviceIdentity, computeDeviceCommitment, } from './deviceIdentity.js';
|
|
55
|
+
export type { DeviceIdentity } from './deviceIdentity.js';
|
|
56
|
+
export { verifyOffline, deviceCommitmentFromFields } from './verifyOffline.js';
|
|
57
|
+
export type { VerifyOfflineInput, VerifyOfflineResult, DeviceSlotSnapshot, } from './verifyOffline.js';
|
|
58
|
+
export { fetchOnChainLicensesRoot, DEFAULT_MINA_GRAPHQL_URLS } from './onChainRoot.js';
|
|
59
|
+
export type { FetchOnChainLicensesRootInput, NetworkName } from './onChainRoot.js';
|
|
60
|
+
export { seatNameFor, SEAT_NAME_COMBINATIONS } from './seatName.js';
|
|
61
|
+
export type { SeatNameInput } from './seatName.js';
|
|
72
62
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,eAAe,EACf,cAAc,EAGf,MAAM,wBAAwB,CAAC;AAEhC,QAAA,MAAM,WAAW,QAAgB,CAAC;AAOlC,eAAO,MAAM,oBAAoB,uCAAuC,CAAC;AAezE,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IAInB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAIzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IAIvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;CAC7B;AAgFD,wBAAsB,aAAa,CACjC,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAoGvB;AAID,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AAQxD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACvF,YAAY,EAAE,6BAA6B,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOnF,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|