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
package/build/deployClient.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
-
//
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
3
|
function baseUrl(url) {
|
|
4
4
|
return url.replace(/\/+$/, '');
|
|
5
5
|
}
|
|
@@ -12,13 +12,13 @@ async function readJsonError(resp) {
|
|
|
12
12
|
catch { /* body wasn't JSON */ }
|
|
13
13
|
return `HTTP ${resp.status}`;
|
|
14
14
|
}
|
|
15
|
-
// POST /prove/deploy —
|
|
16
|
-
// the deploy+initialize tx, proves it, and signs the zkApp
|
|
17
|
-
// the throwaway key. The caller forwards `provenTxJson` to
|
|
18
|
-
// for the fee-payer signature.
|
|
15
|
+
// POST /prove/deploy — the backend generates the throwaway zkApp keypair,
|
|
16
|
+
// assembles the deploy+initialize tx, proves it, and signs the zkApp
|
|
17
|
+
// AccountUpdate with the throwaway key. The caller forwards `provenTxJson` to
|
|
18
|
+
// the vendor's wallet for the fee-payer signature.
|
|
19
19
|
//
|
|
20
|
-
// At least one of the
|
|
21
|
-
// by the circuit's `initialize()`).
|
|
20
|
+
// At least one of the four tier prices must be > 0 (enforced by the backend
|
|
21
|
+
// *and* by the circuit's `initialize()`).
|
|
22
22
|
export async function proveDeploy(req) {
|
|
23
23
|
const fetcher = req.fetcher ?? fetch;
|
|
24
24
|
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/prove/deploy`, {
|
|
@@ -31,14 +31,20 @@ export async function proveDeploy(req) {
|
|
|
31
31
|
priceMonthlyMina: req.priceMonthlyMina,
|
|
32
32
|
priceYearlyMina: req.priceYearlyMina,
|
|
33
33
|
priceFiveYearMina: req.priceFiveYearMina,
|
|
34
|
+
pricePerpetualMina: req.pricePerpetualMina,
|
|
35
|
+
deviceCap: req.deviceCap,
|
|
36
|
+
...(req.forkActivationSlot !== undefined ? { forkActivationSlot: req.forkActivationSlot } : {}),
|
|
37
|
+
...(req.network ? { network: req.network } : {}),
|
|
38
|
+
...(req.website ? { website: req.website } : {}),
|
|
39
|
+
...(req.payoutAddress ? { payoutAddress: req.payoutAddress } : {}),
|
|
34
40
|
}),
|
|
35
41
|
});
|
|
36
42
|
if (!resp.ok)
|
|
37
43
|
throw new Error(await readJsonError(resp));
|
|
38
44
|
return await resp.json();
|
|
39
45
|
}
|
|
40
|
-
// Polls GET /deploy/status until it returns a terminal state ('
|
|
41
|
-
// '
|
|
46
|
+
// Polls GET /deploy/status until it returns a terminal state ('landed' or
|
|
47
|
+
// 'timeout') or the timeout fires. 'unknown' means the backend hasn't seen the
|
|
42
48
|
// tx yet (register step not called or watch not armed).
|
|
43
49
|
export async function pollDeployStatus(opts) {
|
|
44
50
|
const fetcher = opts.fetcher ?? fetch;
|
|
@@ -57,7 +63,7 @@ export async function pollDeployStatus(opts) {
|
|
|
57
63
|
}
|
|
58
64
|
catch { /* transient network — try again on next tick */ }
|
|
59
65
|
opts.onTick?.(status);
|
|
60
|
-
if (status.status === '
|
|
66
|
+
if (status.status === 'landed' || status.status === 'timeout')
|
|
61
67
|
return status;
|
|
62
68
|
if (Date.now() >= deadline)
|
|
63
69
|
return status;
|
|
@@ -70,34 +76,50 @@ function adminHeaders(token) {
|
|
|
70
76
|
'Authorization': `Bearer ${token}`,
|
|
71
77
|
};
|
|
72
78
|
}
|
|
73
|
-
// POST /admin/redeploy/:appId —
|
|
74
|
-
// with a descriptive error if any
|
|
75
|
-
// itself throws (500).
|
|
76
|
-
// old one stays on chain
|
|
79
|
+
// POST /admin/redeploy/:appId — the next redeploy step for a single app.
|
|
80
|
+
// Rejects with a descriptive error if any backend guard fails (409) or the
|
|
81
|
+
// transaction itself throws (500). After a deploy step the returned
|
|
82
|
+
// `zkAppAddress` is the successor's; the old one stays on chain, retired.
|
|
77
83
|
export async function redeployApp(req) {
|
|
78
84
|
const fetcher = req.fetcher ?? fetch;
|
|
79
85
|
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/admin/redeploy/${encodeURIComponent(req.appId)}`, {
|
|
80
86
|
method: 'POST',
|
|
81
87
|
headers: adminHeaders(req.adminToken),
|
|
82
88
|
signal: req.signal,
|
|
83
|
-
body: JSON.stringify(
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
...(req.network ? { network: req.network } : {}),
|
|
91
|
+
...(req.retireSignature ? { retireSignature: req.retireSignature } : {}),
|
|
92
|
+
...(req.feePayer ? { feePayer: req.feePayer } : {}),
|
|
93
|
+
...(req.force ? { force: true } : {}),
|
|
94
|
+
}),
|
|
95
|
+
});
|
|
96
|
+
if (!resp.ok)
|
|
97
|
+
throw new Error(await readJsonError(resp));
|
|
98
|
+
return await resp.json();
|
|
99
|
+
}
|
|
100
|
+
// POST /admin/redeploy/:appId/register — the admin wallet sent the proved
|
|
101
|
+
// step: a retire is marked on the app; a deploy is watched until it lands,
|
|
102
|
+
// then the app moves to its successor.
|
|
103
|
+
export async function registerAdminRedeploy(req) {
|
|
104
|
+
const resp = await (req.fetcher ?? fetch)(`${baseUrl(req.keeperUrl)}/admin/redeploy/${encodeURIComponent(req.appId)}/register`, {
|
|
105
|
+
method: 'POST', headers: adminHeaders(req.adminToken), signal: req.signal,
|
|
106
|
+
body: JSON.stringify({ redeployId: req.redeployId, txHash: req.txHash }),
|
|
84
107
|
});
|
|
85
108
|
if (!resp.ok)
|
|
86
109
|
throw new Error(await readJsonError(resp));
|
|
87
110
|
return await resp.json();
|
|
88
111
|
}
|
|
89
|
-
// POST /admin/redeploy-all —
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
// top-level `ok`, which is always true unless the whole request failed.
|
|
112
|
+
// POST /admin/redeploy-all — raises every eligible app's retirement gate at
|
|
113
|
+
// once (one shared drain) and reports each app's next step; the admin wallet
|
|
114
|
+
// then takes them one app at a time with redeployApp (it signs and pays).
|
|
115
|
+
// Apps that can't be redeployed surface as ok:false with the reason.
|
|
94
116
|
export async function redeployAll(req) {
|
|
95
117
|
const fetcher = req.fetcher ?? fetch;
|
|
96
118
|
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/admin/redeploy-all`, {
|
|
97
119
|
method: 'POST',
|
|
98
120
|
headers: adminHeaders(req.adminToken),
|
|
99
121
|
signal: req.signal,
|
|
100
|
-
body: JSON.stringify(req.
|
|
122
|
+
body: JSON.stringify(req.network ? { network: req.network } : {}),
|
|
101
123
|
});
|
|
102
124
|
if (!resp.ok)
|
|
103
125
|
throw new Error(await readJsonError(resp));
|
|
@@ -109,7 +131,7 @@ export async function redeployAll(req) {
|
|
|
109
131
|
// known app failing individual guards).
|
|
110
132
|
export async function fetchVendorRedeployPreflight(opts) {
|
|
111
133
|
const fetcher = opts.fetcher ?? fetch;
|
|
112
|
-
const resp = await fetcher(`${baseUrl(opts.keeperUrl)}/vendor/redeploy/${encodeURIComponent(opts.appId)}/preflight`, {
|
|
134
|
+
const resp = await fetcher(`${baseUrl(opts.keeperUrl)}/vendor/redeploy/${encodeURIComponent(opts.appId)}/preflight?network=${opts.network}`, {
|
|
113
135
|
signal: opts.signal,
|
|
114
136
|
});
|
|
115
137
|
if (!resp.ok)
|
|
@@ -121,18 +143,16 @@ export async function fetchVendorRedeployPreflight(opts) {
|
|
|
121
143
|
// consumed on /prove.
|
|
122
144
|
export async function getVendorRedeployChallenge(opts) {
|
|
123
145
|
const fetcher = opts.fetcher ?? fetch;
|
|
124
|
-
const resp = await fetcher(`${baseUrl(opts.keeperUrl)}/vendor/redeploy/${encodeURIComponent(opts.appId)}/challenge`, {
|
|
146
|
+
const resp = await fetcher(`${baseUrl(opts.keeperUrl)}/vendor/redeploy/${encodeURIComponent(opts.appId)}/challenge?network=${opts.network}`, {
|
|
125
147
|
signal: opts.signal,
|
|
126
148
|
});
|
|
127
149
|
if (!resp.ok)
|
|
128
150
|
throw new Error(await readJsonError(resp));
|
|
129
151
|
return await resp.json();
|
|
130
152
|
}
|
|
131
|
-
// POST /vendor/redeploy/:appId/prove —
|
|
132
|
-
// against the on-chain vendor of the app
|
|
133
|
-
//
|
|
134
|
-
// signs the zkApp AU with the throwaway key. Returns the tx JSON for the
|
|
135
|
-
// vendor's wallet to add the fee-payer signature and broadcast.
|
|
153
|
+
// POST /vendor/redeploy/:appId/prove — the backend verifies the nonce +
|
|
154
|
+
// signature against the on-chain vendor of the app and runs all redeploy
|
|
155
|
+
// guards, then answers with the next step (see the flow above).
|
|
136
156
|
export async function proveVendorRedeploy(req) {
|
|
137
157
|
const fetcher = req.fetcher ?? fetch;
|
|
138
158
|
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/vendor/redeploy/${encodeURIComponent(req.appId)}/prove`, {
|
|
@@ -143,20 +163,60 @@ export async function proveVendorRedeploy(req) {
|
|
|
143
163
|
nonce: req.nonce,
|
|
144
164
|
signature: req.signature,
|
|
145
165
|
senderPublicKey: req.senderPublicKey,
|
|
146
|
-
...(req.
|
|
166
|
+
...(req.retireSignature ? { retireSignature: req.retireSignature } : {}),
|
|
147
167
|
}),
|
|
148
168
|
});
|
|
149
169
|
if (!resp.ok)
|
|
150
170
|
throw new Error(await readJsonError(resp));
|
|
151
171
|
return await resp.json();
|
|
152
172
|
}
|
|
153
|
-
// POST /vendor/redeploy/:appId/register — arm the
|
|
154
|
-
// the new address. On confirmation the
|
|
173
|
+
// POST /vendor/redeploy/:appId/register — arm the backend's deploy-watcher on
|
|
174
|
+
// the new address. On confirmation the backend mutates AppRecord to promote
|
|
155
175
|
// the new deployment (push old to deploymentHistory[], overwrite live fields,
|
|
156
176
|
// clear event-sync cursors). Idempotent to duplicate calls (the watcher
|
|
157
177
|
// checks whether one is already armed for the address). Poll GET
|
|
158
178
|
// /deploy/status?zkAppAddress=<new> — or use pollDeployStatus — for landing
|
|
159
179
|
// progress, same as first-time deploys.
|
|
180
|
+
// POST /vendor/redeploy/:appId/cancel — calls off the vendor's redeploy
|
|
181
|
+
// (gate, drain) before the app is retired on chain. A fresh signed challenge.
|
|
182
|
+
export async function cancelVendorRedeploy(req) {
|
|
183
|
+
const fetcher = req.fetcher ?? fetch;
|
|
184
|
+
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/vendor/redeploy/${encodeURIComponent(req.appId)}/cancel`, {
|
|
185
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' }, signal: req.signal,
|
|
186
|
+
body: JSON.stringify({ nonce: req.nonce, signature: req.signature }),
|
|
187
|
+
});
|
|
188
|
+
if (!resp.ok)
|
|
189
|
+
throw new Error(await readJsonError(resp));
|
|
190
|
+
return await resp.json();
|
|
191
|
+
}
|
|
192
|
+
// POST /admin/redeploy/:appId/drain — the platform starts a redeploy of an
|
|
193
|
+
// app with purchases in escrow: new purchases pause until it is empty.
|
|
194
|
+
export async function startRedeployDrain(req) {
|
|
195
|
+
const resp = await (req.fetcher ?? fetch)(`${baseUrl(req.keeperUrl)}/admin/redeploy/${encodeURIComponent(req.appId)}/drain`, {
|
|
196
|
+
method: 'POST', headers: adminHeaders(req.adminToken), body: JSON.stringify({ network: req.network }),
|
|
197
|
+
});
|
|
198
|
+
if (!resp.ok)
|
|
199
|
+
throw new Error(await readJsonError(resp));
|
|
200
|
+
return await resp.json();
|
|
201
|
+
}
|
|
202
|
+
// POST /admin/redeploy/:appId/cancel — calls off a redeploy or drain not yet retired on chain.
|
|
203
|
+
export async function cancelRedeploy(req) {
|
|
204
|
+
const resp = await (req.fetcher ?? fetch)(`${baseUrl(req.keeperUrl)}/admin/redeploy/${encodeURIComponent(req.appId)}/cancel`, {
|
|
205
|
+
method: 'POST', headers: adminHeaders(req.adminToken), body: JSON.stringify({ network: req.network }),
|
|
206
|
+
});
|
|
207
|
+
if (!resp.ok)
|
|
208
|
+
throw new Error(await readJsonError(resp));
|
|
209
|
+
return await resp.json();
|
|
210
|
+
}
|
|
211
|
+
// POST /admin/redeploy-notice — ahead of an announced hard fork, emails the vendors of live apps.
|
|
212
|
+
export async function sendRedeployNotices(req) {
|
|
213
|
+
const resp = await (req.fetcher ?? fetch)(`${baseUrl(req.keeperUrl)}/admin/redeploy-notice`, {
|
|
214
|
+
method: 'POST', headers: adminHeaders(req.adminToken), body: JSON.stringify({ network: req.network }),
|
|
215
|
+
});
|
|
216
|
+
if (!resp.ok)
|
|
217
|
+
throw new Error(await readJsonError(resp));
|
|
218
|
+
return await resp.json();
|
|
219
|
+
}
|
|
160
220
|
export async function registerVendorRedeploy(req) {
|
|
161
221
|
const fetcher = req.fetcher ?? fetch;
|
|
162
222
|
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/vendor/redeploy/${encodeURIComponent(req.appId)}/register`, {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployClient.js","sourceRoot":"","sources":["../src/deployClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* deviceIdentity.ts
|
|
3
|
+
*
|
|
4
|
+
* Per-install Pallas Schnorr keypair used to identify a device to the
|
|
5
|
+
* non-custodial binding flow. `getOrCreateDeviceIdentity(storageKey)`
|
|
6
|
+
* returns a stable keypair for the caller's storage key: created on
|
|
7
|
+
* first call, loaded verbatim on every subsequent call.
|
|
8
|
+
*
|
|
9
|
+
* The `deviceCommitment` this module exposes matches the on-chain
|
|
10
|
+
* `occupied[i]` field shape written by `LicensingApp.bind()` — it's
|
|
11
|
+
* `Poseidon([pk.x, pk.isOdd.toField()])` over the device's Pallas
|
|
12
|
+
* pubkey (see `ownerPubKeyHash` in ./licenseLeaf.ts for the identical
|
|
13
|
+
* shape applied to the ownership pubkey). Callers pass the commitment
|
|
14
|
+
* to `proveBind` and to the ownership signature; the raw device pubkey
|
|
15
|
+
* itself never crosses the wire.
|
|
16
|
+
*
|
|
17
|
+
* Storage tradeoffs (documented up front — the plan's original
|
|
18
|
+
* assumption was WebCrypto extractable=false, which only applies to
|
|
19
|
+
* WebCrypto-native primitives):
|
|
20
|
+
*
|
|
21
|
+
* Browser path — IndexedDB.
|
|
22
|
+
* Pallas is not a WebCrypto primitive, so we cannot store the
|
|
23
|
+
* private key as a non-extractable CryptoKey. The private key is
|
|
24
|
+
* persisted as its Mina canonical base58 encoding. An adversary
|
|
25
|
+
* with access to the browser profile (malware running as the user,
|
|
26
|
+
* evil browser extension) can read it. This matches the trust
|
|
27
|
+
* model of every other browser-persisted secret today (bearer
|
|
28
|
+
* cookies, IndexedDB tokens); binding to a fresh device after
|
|
29
|
+
* compromise is a keypair regen + one on-chain bind — no funds
|
|
30
|
+
* at risk, only slot churn. Users who want stronger storage can
|
|
31
|
+
* wipe the storageKey between sessions and re-bind on demand.
|
|
32
|
+
*
|
|
33
|
+
* Node / Electron path — keytar (OS keychain).
|
|
34
|
+
* `keytar` is loaded lazily and marked as an optional peer
|
|
35
|
+
* dependency in package.json so the browser bundle isn't dragged
|
|
36
|
+
* into installing native bindings it can't use. If keytar is
|
|
37
|
+
* unavailable at runtime, the SDK throws with a clear message
|
|
38
|
+
* rather than falling back to plaintext-on-disk.
|
|
39
|
+
*
|
|
40
|
+
* The keypair is Pallas-scalar-random, NOT passphrase-derived — the
|
|
41
|
+
* device identity is meant to survive a passphrase reset (the user
|
|
42
|
+
* can re-derive their ownership key from the passphrase, then unbind
|
|
43
|
+
* / rebind existing device slots without re-installing the app).
|
|
44
|
+
*/
|
|
45
|
+
import { PrivateKey, PublicKey } from 'o1js';
|
|
46
|
+
export type DeviceIdentity = {
|
|
47
|
+
devicePrivateKey: PrivateKey;
|
|
48
|
+
devicePubKey: PublicKey;
|
|
49
|
+
deviceCommitment: string;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Compute the on-chain-shaped device commitment from a Pallas pubkey.
|
|
53
|
+
* Exported so tests and downstream tooling can re-derive it without
|
|
54
|
+
* re-instantiating the whole DeviceIdentity.
|
|
55
|
+
*/
|
|
56
|
+
export declare function computeDeviceCommitment(devicePubKey: PublicKey): string;
|
|
57
|
+
/**
|
|
58
|
+
* Load an existing device keypair for `storageKey`, or create + persist
|
|
59
|
+
* a fresh one on first call. Idempotent across every subsequent call
|
|
60
|
+
* for the same key on the same install.
|
|
61
|
+
*
|
|
62
|
+
* The `storageKey` should be per-app (e.g. the vendor's app short
|
|
63
|
+
* name or its `appId`), so a single browser profile / OS user account
|
|
64
|
+
* can hold distinct device identities for distinct vendors without
|
|
65
|
+
* cross-contamination.
|
|
66
|
+
*/
|
|
67
|
+
export declare function getOrCreateDeviceIdentity(storageKey: string): Promise<DeviceIdentity>;
|
|
68
|
+
//# sourceMappingURL=deviceIdentity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceIdentity.d.ts","sourceRoot":"","sources":["../src/deviceIdentity.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAY,MAAM,MAAM,CAAC;AAgBvD,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,EAAE,UAAU,CAAC;IAC7B,YAAY,EAAM,SAAS,CAAC;IAK5B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAEvE;AAsID;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuB3F"}
|
|
@@ -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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"}
|
package/build/freezeClient.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* freezeClient.ts
|
|
3
3
|
*
|
|
4
|
-
* Client-side view of the
|
|
4
|
+
* Client-side view of the backend's sales-freeze schedule. A freeze is set
|
|
5
5
|
* ahead of a hardfork so every open escrow window can drain (refund or
|
|
6
|
-
* release) before v1 → v2 migration. Once past the freeze slot the
|
|
6
|
+
* release) before v1 → v2 migration. Once past the freeze slot the backend
|
|
7
7
|
* refuses new buys and renewals; refunds and verify remain open.
|
|
8
8
|
*
|
|
9
9
|
* Resolution order for buy/renew clients that want to know the current
|
|
@@ -12,17 +12,36 @@
|
|
|
12
12
|
* constant, or pulled from the vendor's own env at boot).
|
|
13
13
|
* 2. `process.env.FREEZE_AFTER_SLOT` when running under Node (server-side
|
|
14
14
|
* integrators / CLIs).
|
|
15
|
-
* 3.
|
|
15
|
+
* 3. Backend's own `/health` payload — the authoritative source of truth.
|
|
16
16
|
*
|
|
17
17
|
* A `freezeAfterSlot` of 0 / null / undefined means "no freeze scheduled".
|
|
18
18
|
*/
|
|
19
|
-
export type
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
export type NetworkHealth = {
|
|
20
|
+
graphqlUrl?: string;
|
|
21
|
+
archiveUrl?: string;
|
|
22
22
|
slot: number;
|
|
23
23
|
salesFrozen: boolean;
|
|
24
24
|
freezeAfterSlot: number | null;
|
|
25
25
|
};
|
|
26
|
+
export type KeeperHealth = {
|
|
27
|
+
status: string;
|
|
28
|
+
devnet?: NetworkHealth;
|
|
29
|
+
mainnet?: NetworkHealth;
|
|
30
|
+
/** @deprecated legacy flat shape */
|
|
31
|
+
network?: string;
|
|
32
|
+
/** @deprecated legacy flat shape */
|
|
33
|
+
slot?: number;
|
|
34
|
+
/** @deprecated legacy flat shape */
|
|
35
|
+
salesFrozen?: boolean;
|
|
36
|
+
/** @deprecated legacy flat shape */
|
|
37
|
+
freezeAfterSlot?: number | null;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* The health block for `network`. Without a network: the only configured
|
|
41
|
+
* one, or null when several are configured (ambiguous). Falls back to the
|
|
42
|
+
* legacy flat shape.
|
|
43
|
+
*/
|
|
44
|
+
export declare function pickNetworkHealth(health: KeeperHealth, network?: 'devnet' | 'mainnet'): NetworkHealth | null;
|
|
26
45
|
export type FreezeState = {
|
|
27
46
|
salesFrozen: boolean;
|
|
28
47
|
freezeAfterSlot: number | null;
|
|
@@ -36,6 +55,7 @@ export type GetKeeperHealthOptions = {
|
|
|
36
55
|
export declare function getKeeperHealth(opts: GetKeeperHealthOptions): Promise<KeeperHealth>;
|
|
37
56
|
export type ResolveFreezeStateOptions = {
|
|
38
57
|
keeperUrl: string;
|
|
58
|
+
network?: 'devnet' | 'mainnet';
|
|
39
59
|
freezeAfterSlot?: number | null;
|
|
40
60
|
fetcher?: typeof fetch;
|
|
41
61
|
signal?: AbortSignal;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freezeClient.d.ts","sourceRoot":"","sources":["../src/freezeClient.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,CAAC,EAAM,MAAM,CAAC;IACxB,UAAU,CAAC,EAAM,MAAM,CAAC;IACxB,IAAI,EAAa,MAAM,CAAC;IACxB,WAAW,EAAM,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAOF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAY,MAAM,CAAC;IACzB,MAAM,CAAC,EAAW,aAAa,CAAC;IAChC,OAAO,CAAC,EAAU,aAAa,CAAC;IAChC,oCAAoC;IACpC,OAAO,CAAC,EAAU,MAAM,CAAC;IACzB,oCAAoC;IACpC,IAAI,CAAC,EAAa,MAAM,CAAC;IACzB,oCAAoC;IACpC,WAAW,CAAC,EAAM,OAAO,CAAC;IAC1B,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAc5G;AAED,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,OAAO,CAAC,EAAU,QAAQ,GAAG,SAAS,CAAC;IAGvC,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,CA2B9F"}
|