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,14 @@
|
|
|
1
|
+
export type LookupableDeployment = {
|
|
2
|
+
zkAppAddress: string;
|
|
3
|
+
deploymentHistory?: Array<{
|
|
4
|
+
zkAppAddress: string;
|
|
5
|
+
}>;
|
|
6
|
+
};
|
|
7
|
+
export type LookupableApp = {
|
|
8
|
+
deployments: {
|
|
9
|
+
devnet?: LookupableDeployment;
|
|
10
|
+
mainnet?: LookupableDeployment;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export declare function findAppByAnyAddress<T extends LookupableApp>(apps: readonly T[], zkAppAddress: string): T | undefined;
|
|
14
|
+
//# sourceMappingURL=appsLookup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appsLookup.d.ts","sourceRoot":"","sources":["../src/appsLookup.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD,CAAC;AAKF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE;QACX,MAAM,CAAC,EAAG,oBAAoB,CAAC;QAC/B,OAAO,CAAC,EAAE,oBAAoB,CAAC;KAChC,CAAC;CACH,CAAC;AAMF,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,aAAa,EACzD,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,YAAY,EAAE,MAAM,GACnB,CAAC,GAAG,SAAS,CAOf"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
|
+
// Return the first app whose devnet OR mainnet deployment matches (current
|
|
4
|
+
// live address or any retired generation in deploymentHistory). Under the
|
|
5
|
+
// keeper-routing design a buyer who pinned an original devnet address stays
|
|
6
|
+
// resolvable across N mainnet promotions and any number of retired gens.
|
|
7
|
+
export function findAppByAnyAddress(apps, zkAppAddress) {
|
|
8
|
+
const matches = (d) => !!d && (d.zkAppAddress === zkAppAddress ||
|
|
9
|
+
(d.deploymentHistory ?? []).some(h => h.zkAppAddress === zkAppAddress));
|
|
10
|
+
return apps.find(a => matches(a.deployments.devnet) || matches(a.deployments.mainnet));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=appsLookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appsLookup.js","sourceRoot":"","sources":["../src/appsLookup.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oCAAoC;AAgCpC,2EAA2E;AAC3E,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CACjC,IAAkB,EAClB,YAAoB;IAEpB,MAAM,OAAO,GAAG,CAAC,CAAwB,EAAW,EAAE,CACpD,CAAC,CAAC,CAAC,IAAI,CACL,CAAC,CAAC,YAAY,KAAK,YAAY;QAC/B,CAAC,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,CACvE,CAAC;IACJ,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const SYNC_CHUNK_SLOTS = 10000;
|
|
2
2
|
export declare const MAX_LOOKBACK_SLOTS = 525600;
|
|
3
|
-
export type Tier = 'monthly' | 'yearly' | 'fiveYear';
|
|
3
|
+
export type Tier = 'monthly' | 'yearly' | 'fiveYear' | 'perpetual';
|
|
4
4
|
export type NormalizedEvent = {
|
|
5
5
|
kind: 'licenseIssued';
|
|
6
6
|
slot: number;
|
|
@@ -34,12 +34,26 @@ export type NormalizedEvent = {
|
|
|
34
34
|
kind: 'fundsReleased';
|
|
35
35
|
slot: number;
|
|
36
36
|
licenseHash: string;
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'deviceBound';
|
|
39
|
+
slot: number;
|
|
40
|
+
licenseHash: string;
|
|
41
|
+
slotIndex: number;
|
|
42
|
+
deviceCommitment: string;
|
|
43
|
+
boundAtSlot: number;
|
|
44
|
+
} | {
|
|
45
|
+
kind: 'deviceUnbound';
|
|
46
|
+
slot: number;
|
|
47
|
+
licenseHash: string;
|
|
48
|
+
slotIndex: number;
|
|
49
|
+
freedAtSlot: number;
|
|
37
50
|
} | {
|
|
38
51
|
kind: 'priceUpdated';
|
|
39
52
|
slot: number;
|
|
40
53
|
priceMonthly: bigint;
|
|
41
54
|
priceYearly: bigint;
|
|
42
55
|
priceFiveYear: bigint;
|
|
56
|
+
pricePerpetual: bigint;
|
|
43
57
|
};
|
|
44
58
|
export declare function tierFromExpiryDelta(slots: number): Tier | null;
|
|
45
59
|
export type FetchRange = {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archiveBootstrap.d.ts","sourceRoot":"","sources":["../src/archiveBootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
* archiveBootstrap.ts
|
|
5
5
|
*
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
* licenseMigrated → applyLicenseIssued (escrowless: true, migrated: true)
|
|
16
16
|
* refundIssued → recordRefund
|
|
17
17
|
* fundsReleased → recordRelease
|
|
18
|
+
* deviceBound → applyDeviceBound (non-custodial binding)
|
|
19
|
+
* deviceUnbound → applyDeviceUnbound (non-custodial binding)
|
|
18
20
|
* priceUpdated → ignored (price-history tracking lives in the private
|
|
19
21
|
* zklicensing-app keeper alongside vendor-stats)
|
|
20
22
|
*
|
|
@@ -23,8 +25,8 @@
|
|
|
23
25
|
* private LicensingApp circuit source.
|
|
24
26
|
*/
|
|
25
27
|
import { PublicKey, UInt32 } from 'o1js';
|
|
26
|
-
import { LicensingAppEventsContract, MONTHLY_SLOTS_N, ONE_YEAR_SLOTS_N, FIVE_YEAR_SLOTS_N, } from './contractInterface.js';
|
|
27
|
-
import { applyLicenseIssued,
|
|
28
|
+
import { LicensingAppEventsContract, MONTHLY_SLOTS_N, ONE_YEAR_SLOTS_N, FIVE_YEAR_SLOTS_N, PERPETUAL_SLOTS_N, } from './contractInterface.js';
|
|
29
|
+
import { applyLicenseIssued, applyLicenseRenewed, applyDeviceBound, applyDeviceUnbound, recordRefund, recordRelease, } from './licenseStore.js';
|
|
28
30
|
export const SYNC_CHUNK_SLOTS = 10_000;
|
|
29
31
|
export const MAX_LOOKBACK_SLOTS = 525_600;
|
|
30
32
|
// Back-derive the duration tier from (expirySlot - purchaseSlot). Tolerance
|
|
@@ -37,6 +39,8 @@ export function tierFromExpiryDelta(slots) {
|
|
|
37
39
|
return 'yearly';
|
|
38
40
|
if (within(FIVE_YEAR_SLOTS_N))
|
|
39
41
|
return 'fiveYear';
|
|
42
|
+
if (within(PERPETUAL_SLOTS_N))
|
|
43
|
+
return 'perpetual';
|
|
40
44
|
return null;
|
|
41
45
|
}
|
|
42
46
|
export async function bootstrapFromArchive(zkAppAddress, range = {}) {
|
|
@@ -60,6 +64,7 @@ export async function bootstrapFromArchive(zkAppAddress, range = {}) {
|
|
|
60
64
|
priceMonthly: BigInt(data.priceMonthly.toString()),
|
|
61
65
|
priceYearly: BigInt(data.priceYearly.toString()),
|
|
62
66
|
priceFiveYear: BigInt(data.priceFiveYear.toString()),
|
|
67
|
+
pricePerpetual: BigInt(data.pricePerpetual.toString()),
|
|
63
68
|
});
|
|
64
69
|
break;
|
|
65
70
|
}
|
|
@@ -114,6 +119,33 @@ export async function bootstrapFromArchive(zkAppAddress, range = {}) {
|
|
|
114
119
|
case 'fundsReleased':
|
|
115
120
|
events.push({ kind: 'fundsReleased', slot, licenseHash: ev.event.data.toString() });
|
|
116
121
|
break;
|
|
122
|
+
case 'deviceBound': {
|
|
123
|
+
const data = ev.event.data;
|
|
124
|
+
events.push({
|
|
125
|
+
kind: 'deviceBound',
|
|
126
|
+
slot,
|
|
127
|
+
licenseHash: data.licenseHash.toString(),
|
|
128
|
+
slotIndex: Number(data.slotIndex.toString()),
|
|
129
|
+
deviceCommitment: data.deviceCommitment.toString(),
|
|
130
|
+
// Proof-time slot, NOT the block slot. The circuit packs this into
|
|
131
|
+
// the leaf's freedAt field, so the mirror must use the same value
|
|
132
|
+
// or the reconstructed leaf hash won't match the on-chain root.
|
|
133
|
+
boundAtSlot: Number(data.boundAtSlot.toString()),
|
|
134
|
+
});
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
case 'deviceUnbound': {
|
|
138
|
+
const data = ev.event.data;
|
|
139
|
+
events.push({
|
|
140
|
+
kind: 'deviceUnbound',
|
|
141
|
+
slot,
|
|
142
|
+
licenseHash: data.licenseHash.toString(),
|
|
143
|
+
slotIndex: Number(data.slotIndex.toString()),
|
|
144
|
+
// Proof-time slot; see deviceBound comment above.
|
|
145
|
+
freedAtSlot: Number(data.freedAtSlot.toString()),
|
|
146
|
+
});
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
117
149
|
}
|
|
118
150
|
}
|
|
119
151
|
const maxSeenSlot = canonical.length === 0
|
|
@@ -152,9 +184,7 @@ export async function applyEventsToStore(zkAppAddress, events) {
|
|
|
152
184
|
break;
|
|
153
185
|
}
|
|
154
186
|
case 'licenseRenewed': {
|
|
155
|
-
const ok = await
|
|
156
|
-
markRenewed: true,
|
|
157
|
-
});
|
|
187
|
+
const ok = await applyLicenseRenewed(zkAppAddress, ev.licenseHash, { newExpiry: ev.newExpiry });
|
|
158
188
|
if (!ok)
|
|
159
189
|
warnings.push(`renew for unknown license ${ev.licenseHash.slice(0, 16)}…`);
|
|
160
190
|
break;
|
|
@@ -181,6 +211,25 @@ export async function applyEventsToStore(zkAppAddress, events) {
|
|
|
181
211
|
warnings.push(`release for unknown license ${ev.licenseHash.slice(0, 16)}…`);
|
|
182
212
|
break;
|
|
183
213
|
}
|
|
214
|
+
case 'deviceBound': {
|
|
215
|
+
const ok = await applyDeviceBound(zkAppAddress, ev.licenseHash, {
|
|
216
|
+
slotIndex: ev.slotIndex,
|
|
217
|
+
deviceCommitment: ev.deviceCommitment,
|
|
218
|
+
boundAtSlot: ev.boundAtSlot,
|
|
219
|
+
});
|
|
220
|
+
if (!ok)
|
|
221
|
+
warnings.push(`bind for unknown license ${ev.licenseHash.slice(0, 16)}…`);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
case 'deviceUnbound': {
|
|
225
|
+
const ok = await applyDeviceUnbound(zkAppAddress, ev.licenseHash, {
|
|
226
|
+
slotIndex: ev.slotIndex,
|
|
227
|
+
freedAtSlot: ev.freedAtSlot,
|
|
228
|
+
});
|
|
229
|
+
if (!ok)
|
|
230
|
+
warnings.push(`unbind for unknown license ${ev.licenseHash.slice(0, 16)}…`);
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
184
233
|
}
|
|
185
234
|
}
|
|
186
235
|
return { count, warnings };
|
|
@@ -212,14 +261,18 @@ export async function lazyBootstrap(zkAppAddress) {
|
|
|
212
261
|
return existing;
|
|
213
262
|
const short = zkAppAddress.slice(0, 12) + '…';
|
|
214
263
|
const p = (async () => {
|
|
264
|
+
const started = Date.now();
|
|
215
265
|
try {
|
|
216
266
|
const { events } = await bootstrapFromArchive(zkAppAddress);
|
|
217
267
|
const { count, warnings } = await applyEventsToStore(zkAppAddress, events);
|
|
218
268
|
for (const w of warnings)
|
|
219
269
|
console.warn(`[lazy-bootstrap] ${short}: ${w}`);
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
270
|
+
// Always log the outcome — count=0 with a mismatch trigger is the
|
|
271
|
+
// interesting case: it means either the archive is behind Mina's own
|
|
272
|
+
// best chain (transient) or the local mirror silently drifted and the
|
|
273
|
+
// replay didn't fix it (a real bug — verify will keep looping through
|
|
274
|
+
// this until the next mutation event lands). Silence would hide both.
|
|
275
|
+
console.log(`[lazy-bootstrap] ${short}: replayed ${count} record(s) in ${Date.now() - started}ms`);
|
|
223
276
|
}
|
|
224
277
|
catch (e) {
|
|
225
278
|
console.warn(`[lazy-bootstrap] ${short}: ${e?.message ?? e}`);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archiveBootstrap.js","sourceRoot":"","sources":["../src/archiveBootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bindClient.ts
|
|
3
|
+
*
|
|
4
|
+
* Browser-safe client for the non-custodial device-binding flow.
|
|
5
|
+
* Mirrors `buyClient.ts` in shape: the caller drives the wallet step
|
|
6
|
+
* between `proveBind` and `confirmBind`, so the SDK stays
|
|
7
|
+
* wallet-agnostic.
|
|
8
|
+
*
|
|
9
|
+
* Binding is a root-mutating tx on the same per-app in-flight slot
|
|
10
|
+
* that buy / renew / refund / migrate use — a concurrent request
|
|
11
|
+
* against the same app returns 409 `ProveQueueBusyError`, which the
|
|
12
|
+
* caller must catch and retry (see the retry loop in
|
|
13
|
+
* examples/src/bind.ts).
|
|
14
|
+
*
|
|
15
|
+
* The signature scheme is Pallas Schnorr and is re-verified INSIDE
|
|
16
|
+
* the on-chain circuit via `Signature.verify()` — a compromised
|
|
17
|
+
* backend cannot forge a bind because it can't produce a signature
|
|
18
|
+
* that satisfies the in-circuit check.
|
|
19
|
+
*/
|
|
20
|
+
import { PrivateKey } from 'o1js';
|
|
21
|
+
export type ProveBindRequest = {
|
|
22
|
+
keeperUrl: string;
|
|
23
|
+
network: 'devnet' | 'mainnet';
|
|
24
|
+
zkAppAddress: string;
|
|
25
|
+
licenseHash: string;
|
|
26
|
+
ownerPrivateKey: PrivateKey;
|
|
27
|
+
deviceCommitment: string;
|
|
28
|
+
slotIndex: number;
|
|
29
|
+
buyerAddress: string;
|
|
30
|
+
nonce?: string;
|
|
31
|
+
fetcher?: typeof fetch;
|
|
32
|
+
signal?: AbortSignal;
|
|
33
|
+
};
|
|
34
|
+
export type ProveBindResponse = {
|
|
35
|
+
provenTxJson: string;
|
|
36
|
+
licenseHash: string;
|
|
37
|
+
slotIndex: number;
|
|
38
|
+
};
|
|
39
|
+
export type ConfirmBindRequest = {
|
|
40
|
+
keeperUrl: string;
|
|
41
|
+
zkAppAddress: string;
|
|
42
|
+
licenseHash: string;
|
|
43
|
+
txHash: string;
|
|
44
|
+
fetcher?: typeof fetch;
|
|
45
|
+
signal?: AbortSignal;
|
|
46
|
+
};
|
|
47
|
+
export declare function proveBind(req: ProveBindRequest): Promise<ProveBindResponse>;
|
|
48
|
+
export declare function confirmBind(req: ConfirmBindRequest): Promise<{
|
|
49
|
+
ok: true;
|
|
50
|
+
}>;
|
|
51
|
+
//# sourceMappingURL=bindClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindClient.d.ts","sourceRoot":"","sources":["../src/bindClient.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAS,UAAU,EAAwB,MAAM,MAAM,CAAC;AAS/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAS,MAAM,CAAC;IAGzB,OAAO,EAAW,QAAQ,GAAG,SAAS,CAAC;IAGvC,YAAY,EAAM,MAAM,CAAC;IAKzB,WAAW,EAAO,MAAM,CAAC;IAIzB,eAAe,EAAG,UAAU,CAAC;IAK7B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,SAAS,EAAS,MAAM,CAAC;IAEzB,YAAY,EAAM,MAAM,CAAC;IAKzB,KAAK,CAAC,EAAY,MAAM,CAAC;IACzB,OAAO,CAAC,EAAU,OAAO,KAAK,CAAC;IAC/B,MAAM,CAAC,EAAW,WAAW,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAG,MAAM,CAAC;IACrB,SAAS,EAAK,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAK,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAG,MAAM,CAAC;IACrB,MAAM,EAAQ,MAAM,CAAC;IACrB,OAAO,CAAC,EAAM,OAAO,KAAK,CAAC;IAC3B,MAAM,CAAC,EAAO,WAAW,CAAC;CAC3B,CAAC;AAuCF,wBAAsB,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmCjF;AAMD,wBAAsB,WAAW,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,CAchF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
|
+
/**
|
|
4
|
+
* bindClient.ts
|
|
5
|
+
*
|
|
6
|
+
* Browser-safe client for the non-custodial device-binding flow.
|
|
7
|
+
* Mirrors `buyClient.ts` in shape: the caller drives the wallet step
|
|
8
|
+
* between `proveBind` and `confirmBind`, so the SDK stays
|
|
9
|
+
* wallet-agnostic.
|
|
10
|
+
*
|
|
11
|
+
* Binding is a root-mutating tx on the same per-app in-flight slot
|
|
12
|
+
* that buy / renew / refund / migrate use — a concurrent request
|
|
13
|
+
* against the same app returns 409 `ProveQueueBusyError`, which the
|
|
14
|
+
* caller must catch and retry (see the retry loop in
|
|
15
|
+
* examples/src/bind.ts).
|
|
16
|
+
*
|
|
17
|
+
* The signature scheme is Pallas Schnorr and is re-verified INSIDE
|
|
18
|
+
* the on-chain circuit via `Signature.verify()` — a compromised
|
|
19
|
+
* backend cannot forge a bind because it can't produce a signature
|
|
20
|
+
* that satisfies the in-circuit check.
|
|
21
|
+
*/
|
|
22
|
+
import { Field } from 'o1js';
|
|
23
|
+
import { readErrorBody, tryQueueBusyFromBody } from './proveErrors.js';
|
|
24
|
+
import { encodePublicKey, encodeSignature, signBinding } from './ownershipSignature.js';
|
|
25
|
+
function baseUrl(url) {
|
|
26
|
+
return url.replace(/\/+$/, '');
|
|
27
|
+
}
|
|
28
|
+
async function readJsonError(resp) {
|
|
29
|
+
try {
|
|
30
|
+
const body = await resp.json();
|
|
31
|
+
if (typeof body.error === 'string')
|
|
32
|
+
return body.error;
|
|
33
|
+
}
|
|
34
|
+
catch { /* body wasn't JSON */ }
|
|
35
|
+
return `HTTP ${resp.status}`;
|
|
36
|
+
}
|
|
37
|
+
// Sample a fresh replay-defense nonce. WebCrypto is required for
|
|
38
|
+
// `crypto.getRandomValues` — same runtime floor as the rest of the
|
|
39
|
+
// signing surface (Node ≥ 20, modern browsers).
|
|
40
|
+
function freshNonce() {
|
|
41
|
+
const crypto = globalThis.crypto;
|
|
42
|
+
if (!crypto?.getRandomValues) {
|
|
43
|
+
throw new Error('crypto.getRandomValues unavailable — bindClient requires Node ≥ 20 or a modern browser');
|
|
44
|
+
}
|
|
45
|
+
const bytes = new Uint8Array(16); // 128 bits
|
|
46
|
+
crypto.getRandomValues(bytes);
|
|
47
|
+
let n = 0n;
|
|
48
|
+
for (const b of bytes)
|
|
49
|
+
n = (n << 8n) | BigInt(b);
|
|
50
|
+
// Field(n) is safe: 128 bits << the Pallas base field size, so no
|
|
51
|
+
// modular reduction ever fires here.
|
|
52
|
+
return Field(n).toString();
|
|
53
|
+
}
|
|
54
|
+
// POST /prove/bind — backend compiles + proves the bind tx.
|
|
55
|
+
//
|
|
56
|
+
// Retry contract:
|
|
57
|
+
// - 409 `proving queue busy` → `ProveQueueBusyError`; caller catches
|
|
58
|
+
// and retries with `retryAfterMs` cadence (see examples/src/bind.ts).
|
|
59
|
+
// - Any other non-2xx surfaces the body's `error` field verbatim.
|
|
60
|
+
export async function proveBind(req) {
|
|
61
|
+
const fetcher = req.fetcher ?? fetch;
|
|
62
|
+
const nonce = req.nonce ?? freshNonce();
|
|
63
|
+
const ownerPubKey = req.ownerPrivateKey.toPublicKey();
|
|
64
|
+
const ownerSig = signBinding(req.ownerPrivateKey, {
|
|
65
|
+
licenseHash: req.licenseHash,
|
|
66
|
+
deviceCommitment: req.deviceCommitment,
|
|
67
|
+
slotIndex: req.slotIndex,
|
|
68
|
+
nonce,
|
|
69
|
+
});
|
|
70
|
+
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/prove/bind`, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers: { 'Content-Type': 'application/json' },
|
|
73
|
+
signal: req.signal,
|
|
74
|
+
body: JSON.stringify({
|
|
75
|
+
licenseHash: req.licenseHash,
|
|
76
|
+
buyerAddress: req.buyerAddress,
|
|
77
|
+
zkAppAddress: req.zkAppAddress,
|
|
78
|
+
network: req.network,
|
|
79
|
+
ownerPubKey: encodePublicKey(ownerPubKey),
|
|
80
|
+
ownerSig: encodeSignature(ownerSig),
|
|
81
|
+
deviceCommitment: req.deviceCommitment,
|
|
82
|
+
slotIndex: req.slotIndex,
|
|
83
|
+
nonce,
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
if (!resp.ok) {
|
|
87
|
+
const parsed = await readErrorBody(resp);
|
|
88
|
+
const queueBusy = tryQueueBusyFromBody(parsed);
|
|
89
|
+
if (queueBusy)
|
|
90
|
+
throw queueBusy;
|
|
91
|
+
throw new Error(parsed.message);
|
|
92
|
+
}
|
|
93
|
+
return await resp.json();
|
|
94
|
+
}
|
|
95
|
+
// POST /confirm/bind — pass-through no-op that clears the staged
|
|
96
|
+
// intent on the backend. Call this only after the wallet has returned
|
|
97
|
+
// a real txHash; a cancelled or dropped signature leaves the intent
|
|
98
|
+
// to expire on its own.
|
|
99
|
+
export async function confirmBind(req) {
|
|
100
|
+
const fetcher = req.fetcher ?? fetch;
|
|
101
|
+
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/confirm/bind`, {
|
|
102
|
+
method: 'POST',
|
|
103
|
+
headers: { 'Content-Type': 'application/json' },
|
|
104
|
+
signal: req.signal,
|
|
105
|
+
body: JSON.stringify({
|
|
106
|
+
zkAppAddress: req.zkAppAddress,
|
|
107
|
+
licenseHash: req.licenseHash,
|
|
108
|
+
txHash: req.txHash,
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
if (!resp.ok)
|
|
112
|
+
throw new Error(await readJsonError(resp));
|
|
113
|
+
return { ok: true };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=bindClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindClient.js","sourceRoot":"","sources":["../src/bindClient.ts"],"names":[],"mappings":"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"}
|
package/build/buyClient.d.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
+
import type { PrivateKey, PublicKey } from 'o1js';
|
|
1
2
|
export type BuyIdentity = {
|
|
2
|
-
|
|
3
|
+
publicKey: PublicKey;
|
|
4
|
+
publicKeyBase58: string;
|
|
5
|
+
privateKey: PrivateKey;
|
|
3
6
|
licenseHash: string;
|
|
4
7
|
};
|
|
5
|
-
export declare function deriveBuyIdentity(passphrase: string): BuyIdentity
|
|
8
|
+
export declare function deriveBuyIdentity(passphrase: string, zkAppAddress: string): Promise<BuyIdentity>;
|
|
6
9
|
export type ProveBuyRequest = {
|
|
7
10
|
keeperUrl: string;
|
|
8
11
|
licenseHash: string;
|
|
9
12
|
buyerAddress: string;
|
|
10
13
|
zkAppAddress: string;
|
|
11
|
-
|
|
14
|
+
ownerPubKey: string;
|
|
15
|
+
network: 'devnet' | 'mainnet';
|
|
16
|
+
duration: 0 | 1 | 2 | 3;
|
|
12
17
|
buyerCountry: string;
|
|
18
|
+
buyerZip?: string;
|
|
13
19
|
refundWaiverAccepted?: boolean;
|
|
14
20
|
freezeAfterSlot?: number | null;
|
|
15
21
|
fetcher?: typeof fetch;
|
|
@@ -25,6 +31,7 @@ export type ProveBuyResponse = {
|
|
|
25
31
|
duration: number;
|
|
26
32
|
durationLabel: string;
|
|
27
33
|
generation: number;
|
|
34
|
+
appKey: string;
|
|
28
35
|
};
|
|
29
36
|
export type ConfirmBuyRequest = {
|
|
30
37
|
keeperUrl: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buyClient.d.ts","sourceRoot":"","sources":["../src/buyClient.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAElD,MAAM,MAAM,WAAW,GAAG;IAMxB,SAAS,EAAQ,SAAS,CAAC;IAG3B,eAAe,EAAE,MAAM,CAAC;IAKxB,UAAU,EAAO,UAAU,CAAC;IAK5B,WAAW,EAAM,MAAM,CAAC;CACzB,CAAC;AAaF,wBAAsB,iBAAiB,CACrC,UAAU,EAAI,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC,CAItB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAO,MAAM,CAAC;IAOvB,WAAW,EAAK,MAAM,CAAC;IACvB,YAAY,EAAI,MAAM,CAAC;IACvB,YAAY,EAAI,MAAM,CAAC;IAOvB,WAAW,EAAK,MAAM,CAAC;IAKvB,OAAO,EAAS,QAAQ,GAAG,SAAS,CAAC;IACrC,QAAQ,EAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,YAAY,EAAI,MAAM,CAAC;IAIvB,QAAQ,CAAC,EAAO,MAAM,CAAC;IASvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAG/B,eAAe,CAAC,EAAO,MAAM,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,EAAQ,OAAO,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAS,WAAW,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAS,MAAM,CAAC;IAC5B,UAAU,EAAW,MAAM,CAAC;IAC5B,WAAW,EAAU,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAS,MAAM,CAAC;IAC5B,cAAc,EAAO,MAAM,CAAC;IAC5B,QAAQ,EAAa,MAAM,CAAC;IAC5B,aAAa,EAAQ,MAAM,CAAC;IAI5B,UAAU,EAAW,MAAM,CAAC;IAK5B,MAAM,EAAe,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAK,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAG,MAAM,CAAC;IACrB,MAAM,EAAQ,MAAM,CAAC;IACrB,OAAO,CAAC,EAAM,OAAO,KAAK,CAAC;IAC3B,MAAM,CAAC,EAAO,WAAW,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAe,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACpE,MAAM,CAAC,EAAc,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAQ,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAW,MAAM,CAAC;CAC7B,CAAC;AAiCF,wBAAsB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+D9E;AAMD,wBAAsB,UAAU,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,CAc9E;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAO,MAAM,CAAC;IACvB,WAAW,EAAK,MAAM,CAAC;IACvB,OAAO,CAAC,EAAQ,OAAO,KAAK,CAAC;IAI7B,UAAU,CAAC,EAAK,MAAM,CAAC;IACvB,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB,MAAM,CAAC,EAAS,WAAW,CAAC;IAC5B,MAAM,CAAC,EAAS,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;CAC7C,CAAC;AAKF,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,CAmBlF"}
|
package/build/buyClient.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
|
/**
|
|
4
4
|
* buyClient.ts
|
|
5
5
|
*
|
|
@@ -10,22 +10,33 @@
|
|
|
10
10
|
* `confirmBuy`, so the SDK stays wallet-agnostic and can be reused by CLI
|
|
11
11
|
* tools, alternate UIs, and third-party integrators.
|
|
12
12
|
*
|
|
13
|
-
* Peer dep: o1js (for Poseidon +
|
|
14
|
-
*
|
|
13
|
+
* Peer dep: o1js (for Poseidon + Pallas PrivateKey/PublicKey/Signature).
|
|
14
|
+
* The ownership-signing surface (ownershipSignature.ts) uses Mina-native
|
|
15
|
+
* Schnorr so the passphrase-derived keypair also authorizes /prove/bind
|
|
16
|
+
* and /prove/unbind — verified IN-CIRCUIT there via Signature.verify(),
|
|
17
|
+
* which requires o1js. Every buy-flow consumer already ships o1js for the
|
|
18
|
+
* buy-witness path, so this is not new cost.
|
|
15
19
|
*/
|
|
16
|
-
import { Encoding, Poseidon } from 'o1js';
|
|
17
20
|
import { resolveFreezeState } from './freezeClient.js';
|
|
18
21
|
import { REFUND_WINDOW_N, TOLERANCE_WINDOW_N } from './contractInterface.js';
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
// the
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
import { readErrorBody, tryQueueBusyFromBody } from './proveErrors.js';
|
|
23
|
+
import { deriveOwnershipKeypair } from './ownershipSignature.js';
|
|
24
|
+
import { licenseHashFromPubkey } from './ownershipLicenseHash.js';
|
|
25
|
+
// Derive the ownership keypair + licenseHash the buy flow keys off.
|
|
26
|
+
// Deterministic in (passphrase, zkAppAddress) — same inputs always map
|
|
27
|
+
// to the same keypair (via HKDF-SHA256) and therefore the same
|
|
28
|
+
// licenseHash on every device, so a buyer can re-derive their license
|
|
29
|
+
// identity anywhere from the passphrase and the app address. Binding
|
|
30
|
+
// the derivation to the app address means a leaked passphrase for app A
|
|
31
|
+
// cannot be replayed as a valid activation for app B.
|
|
32
|
+
//
|
|
33
|
+
// HKDF still needs WebCrypto (Node ≥20, Chromium 137+, Safari 17+,
|
|
34
|
+
// Firefox 130+); the scalar reduction and Pallas group operations are
|
|
35
|
+
// pure JS through o1js. Async because subtle.deriveBits is async.
|
|
36
|
+
export async function deriveBuyIdentity(passphrase, zkAppAddress) {
|
|
37
|
+
const { privateKey, publicKey, publicKeyBase58 } = await deriveOwnershipKeypair(passphrase, zkAppAddress);
|
|
38
|
+
const licenseHash = licenseHashFromPubkey(publicKey);
|
|
39
|
+
return { publicKey, publicKeyBase58, privateKey, licenseHash };
|
|
29
40
|
}
|
|
30
41
|
function baseUrl(url) {
|
|
31
42
|
return url.replace(/\/+$/, '');
|
|
@@ -95,8 +106,11 @@ export async function proveBuy(req) {
|
|
|
95
106
|
licenseHash: req.licenseHash,
|
|
96
107
|
buyerAddress: req.buyerAddress,
|
|
97
108
|
zkAppAddress: req.zkAppAddress,
|
|
109
|
+
ownerPubKey: req.ownerPubKey,
|
|
110
|
+
network: req.network,
|
|
98
111
|
duration: req.duration,
|
|
99
112
|
buyerCountry: req.buyerCountry,
|
|
113
|
+
...(req.buyerZip ? { buyerZip: req.buyerZip } : {}),
|
|
100
114
|
...(req.refundWaiverAccepted === true ? { refundWaiverAccepted: true } : {}),
|
|
101
115
|
}),
|
|
102
116
|
});
|
|
@@ -108,7 +122,11 @@ export async function proveBuy(req) {
|
|
|
108
122
|
if (useNoEscrow && resp.status === 404) {
|
|
109
123
|
throw new Error('Keeper does not offer /prove/buy-no-escrow — this vendor\'s zkApp does not support the escrowless (waiver) path; vendor must redeploy via the hardfork-migration flow');
|
|
110
124
|
}
|
|
111
|
-
|
|
125
|
+
const parsed = await readErrorBody(resp);
|
|
126
|
+
const queueBusy = tryQueueBusyFromBody(parsed);
|
|
127
|
+
if (queueBusy)
|
|
128
|
+
throw queueBusy;
|
|
129
|
+
throw new Error(parsed.message);
|
|
112
130
|
}
|
|
113
131
|
return await resp.json();
|
|
114
132
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buyClient.js","sourceRoot":"","sources":["../src/buyClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,11 +22,18 @@ export type AppCreatedEvent = any;
|
|
|
22
22
|
export const LicenseMigratedEvent: any;
|
|
23
23
|
export type LicenseMigratedEvent = any;
|
|
24
24
|
|
|
25
|
-
export
|
|
25
|
+
export const DeviceBoundEvent: any;
|
|
26
|
+
export type DeviceBoundEvent = any;
|
|
27
|
+
|
|
28
|
+
export const DeviceUnboundEvent: any;
|
|
29
|
+
export type DeviceUnboundEvent = any;
|
|
30
|
+
|
|
31
|
+
export function unpackPrices(packed: Field): { priceMonthly: UInt64; priceYearly: UInt64; priceFiveYear: UInt64; pricePerpetual: UInt64 };
|
|
26
32
|
|
|
27
33
|
export const MONTHLY_SLOTS_N: number;
|
|
28
34
|
export const ONE_YEAR_SLOTS_N: number;
|
|
29
35
|
export const FIVE_YEAR_SLOTS_N: number;
|
|
36
|
+
export const PERPETUAL_SLOTS_N: number;
|
|
30
37
|
export const REFUND_WINDOW_N: number;
|
|
31
38
|
export const GRACE_PERIOD_N: number;
|
|
32
39
|
export const MS_PER_SLOT_N: number;
|
|
@@ -36,9 +43,9 @@ export const TOLERANCE_WINDOW_N: number;
|
|
|
36
43
|
export const EMPTY: Field;
|
|
37
44
|
export const EMPTY_ROOT: Field;
|
|
38
45
|
|
|
39
|
-
export const DURATION_LABELS: readonly ['1 Month', '1 Year', '5 Years'];
|
|
40
|
-
export type DurationLabel = '1 Month' | '1 Year' | '5 Years';
|
|
41
|
-
export const DURATION_INDEX: { readonly '1 Month': 0; readonly '1 Year': 1; readonly '5 Years': 2 };
|
|
46
|
+
export const DURATION_LABELS: readonly ['1 Month', '1 Year', '5 Years', 'Perpetual'];
|
|
47
|
+
export type DurationLabel = '1 Month' | '1 Year' | '5 Years' | 'Perpetual';
|
|
48
|
+
export const DURATION_INDEX: { readonly '1 Month': 0; readonly '1 Year': 1; readonly '5 Years': 2; readonly 'Perpetual': 3 };
|
|
42
49
|
|
|
43
50
|
export function durationSlotsFromLabel(label?: string | null): number | null;
|
|
44
51
|
export function durationIndexFromLabel(label?: string | null): number | null;
|
|
@@ -52,4 +59,3 @@ export function fetchLicensingAppVersion(zkAppAddress: string): Promise<number |
|
|
|
52
59
|
export const CANONICAL_VK_HASHES: Readonly<Record<number, string>>;
|
|
53
60
|
export const CURRENT_GENERATION: number;
|
|
54
61
|
export const CANONICAL_VK_HASH: string;
|
|
55
|
-
export const CANONICAL_LICENSE_PROOF_VK_HASH: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractInterface.d.ts","sourceRoot":"","sources":["../src/contractInterface.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAA8B,KAAK,EAAa,aAAa,EAAkB,MAAM,EAAa,MAAM,MAAM,CAAC;AA8BtH,eAAO,MAAM,kBAAkB,EAAE,GAO/B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAErC,eAAO,MAAM,iBAAiB,EAAE,GAG9B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAEpC,eAAO,MAAM,iBAAiB,EAAE,GAK9B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAEpC,eAAO,MAAM,eAAe,EAAE,GAE5B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC;AAelC,eAAO,MAAM,oBAAoB,EAAE,GAOjC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAevC,eAAO,MAAM,gBAAgB,EAAE,GAK7B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAYnC,eAAO,MAAM,kBAAkB,EAAE,GAI/B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAMrC,eAAO,MAAM,eAAe,QAAY,CAAC;AACzC,eAAO,MAAM,gBAAgB,SAAY,CAAC;AAC1C,eAAO,MAAM,iBAAiB,UAAa,CAAC;AAC5C,eAAO,MAAM,iBAAiB,YAAe,CAAC;AAC9C,eAAO,MAAM,eAAe,QAAY,CAAC;AACzC,eAAO,MAAM,cAAc,OAAY,CAAC;AACxC,eAAO,MAAM,aAAa,QAAc,CAAC;AACzC,eAAO,MAAM,eAAe,MAAS,CAAC;AAStC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,KAAK,EAAE,KAAqB,CAAC;AAC1C,eAAO,MAAM,UAAU,EAAE,KAAiC,CAAC;AAM3D,eAAO,MAAM,eAAe,wDAAyD,CAAC;AACtF,MAAM,MAAM,aAAa,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,cAAc;;;;;CAAuE,CAAC;AAEnG,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAM3E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAM3E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAExE;AAUD,qBAAa,0BAA2B,SAAQ,aAAa;IAC3D,MAAM,EAAE,GAAG,CAWT;CACH;AAqBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,GAAG;IAC3C,YAAY,EAAI,MAAM,CAAC;IACvB,WAAW,EAAK,MAAM,CAAC;IACvB,aAAa,EAAG,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CASA;AAgBD,eAAO,MAAM,gCAAgC,EAAE,SAAS,MAAM,EAAQ,CAAC;AAKvE,wBAAsB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU3F;AAuBD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGhE,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAU,CAAC;AAE5C,eAAO,MAAM,iBAAiB,EAAE,MAAgD,CAAC"}
|