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.
Files changed (173) hide show
  1. package/README.md +335 -97
  2. package/build/appsLookup.d.ts +14 -0
  3. package/build/appsLookup.d.ts.map +1 -0
  4. package/build/appsLookup.js +12 -0
  5. package/build/appsLookup.js.map +1 -0
  6. package/build/archiveBootstrap.d.ts +15 -1
  7. package/build/archiveBootstrap.d.ts.map +1 -0
  8. package/build/archiveBootstrap.js +62 -9
  9. package/build/archiveBootstrap.js.map +1 -0
  10. package/build/bindClient.d.ts +51 -0
  11. package/build/bindClient.d.ts.map +1 -0
  12. package/build/bindClient.js +115 -0
  13. package/build/bindClient.js.map +1 -0
  14. package/build/buyClient.d.ts +10 -3
  15. package/build/buyClient.d.ts.map +1 -0
  16. package/build/buyClient.js +33 -15
  17. package/build/buyClient.js.map +1 -0
  18. package/build/contractInterface.d.ts +11 -5
  19. package/build/contractInterface.d.ts.map +1 -0
  20. package/build/contractInterface.js +82 -17
  21. package/build/contractInterface.js.map +1 -0
  22. package/build/countryStats.d.ts +6 -1
  23. package/build/countryStats.d.ts.map +1 -0
  24. package/build/countryStats.js +33 -9
  25. package/build/countryStats.js.map +1 -0
  26. package/build/deployClient.d.ts.map +1 -0
  27. package/build/deployClient.js +1 -1
  28. package/build/deployClient.js.map +1 -0
  29. package/build/deviceIdentity.d.ts +68 -0
  30. package/build/deviceIdentity.d.ts.map +1 -0
  31. package/build/deviceIdentity.js +209 -0
  32. package/build/deviceIdentity.js.map +1 -0
  33. package/build/freezeClient.d.ts.map +1 -0
  34. package/build/freezeClient.js +1 -1
  35. package/build/freezeClient.js.map +1 -0
  36. package/build/generationClient.d.ts +1 -0
  37. package/build/generationClient.d.ts.map +1 -0
  38. package/build/generationClient.js +2 -2
  39. package/build/generationClient.js.map +1 -0
  40. package/build/index.d.ts +27 -37
  41. package/build/index.d.ts.map +1 -0
  42. package/build/index.js +85 -116
  43. package/build/index.js.map +1 -0
  44. package/build/licenseLeaf.d.ts +76 -0
  45. package/build/licenseLeaf.d.ts.map +1 -0
  46. package/build/licenseLeaf.js +189 -0
  47. package/build/licenseLeaf.js.map +1 -0
  48. package/build/licenseRecord.d.ts +20 -1
  49. package/build/licenseRecord.d.ts.map +1 -0
  50. package/build/licenseRecord.js +1 -1
  51. package/build/licenseRecord.js.map +1 -0
  52. package/build/licenseStore.d.ts +17 -2
  53. package/build/licenseStore.d.ts.map +1 -0
  54. package/build/licenseStore.js +167 -7
  55. package/build/licenseStore.js.map +1 -0
  56. package/build/manifestVerify.d.ts.map +1 -0
  57. package/build/manifestVerify.js +8 -3
  58. package/build/manifestVerify.js.map +1 -0
  59. package/build/migrateClient.d.ts +6 -21
  60. package/build/migrateClient.d.ts.map +1 -0
  61. package/build/migrateClient.js +30 -17
  62. package/build/migrateClient.js.map +1 -0
  63. package/build/onChainRoot.d.ts +67 -0
  64. package/build/onChainRoot.d.ts.map +1 -0
  65. package/build/onChainRoot.js +87 -0
  66. package/build/onChainRoot.js.map +1 -0
  67. package/build/ownershipLicenseHash.d.ts +25 -0
  68. package/build/ownershipLicenseHash.d.ts.map +1 -0
  69. package/build/ownershipLicenseHash.js +29 -0
  70. package/build/ownershipLicenseHash.js.map +1 -0
  71. package/build/ownershipSignature.d.ts +122 -0
  72. package/build/ownershipSignature.d.ts.map +1 -0
  73. package/build/ownershipSignature.js +244 -0
  74. package/build/ownershipSignature.js.map +1 -0
  75. package/build/proveErrors.d.ts +35 -0
  76. package/build/proveErrors.d.ts.map +1 -0
  77. package/build/proveErrors.js +49 -0
  78. package/build/proveErrors.js.map +1 -0
  79. package/build/refundClient.d.ts +2 -11
  80. package/build/refundClient.d.ts.map +1 -0
  81. package/build/refundClient.js +35 -17
  82. package/build/refundClient.js.map +1 -0
  83. package/build/renewClient.d.ts +4 -1
  84. package/build/renewClient.d.ts.map +1 -0
  85. package/build/renewClient.js +11 -4
  86. package/build/renewClient.js.map +1 -0
  87. package/build/seatName.d.ts +8 -0
  88. package/build/seatName.d.ts.map +1 -0
  89. package/build/seatName.js +136 -0
  90. package/build/seatName.js.map +1 -0
  91. package/build/statsClient.d.ts +47 -4
  92. package/build/statsClient.d.ts.map +1 -0
  93. package/build/statsClient.js +44 -5
  94. package/build/statsClient.js.map +1 -0
  95. package/build/trustAnchorVerify.d.ts +48 -0
  96. package/build/trustAnchorVerify.d.ts.map +1 -0
  97. package/build/trustAnchorVerify.js +431 -0
  98. package/build/trustAnchorVerify.js.map +1 -0
  99. package/build/trustAnchorVerifyCli.d.ts +35 -0
  100. package/build/trustAnchorVerifyCli.d.ts.map +1 -0
  101. package/build/trustAnchorVerifyCli.js +177 -0
  102. package/build/trustAnchorVerifyCli.js.map +1 -0
  103. package/build/txBroadcastClient.d.ts +26 -0
  104. package/build/txBroadcastClient.d.ts.map +1 -0
  105. package/build/txBroadcastClient.js +20 -0
  106. package/build/txBroadcastClient.js.map +1 -0
  107. package/build/unbindClient.d.ts +56 -0
  108. package/build/unbindClient.d.ts.map +1 -0
  109. package/build/unbindClient.js +113 -0
  110. package/build/unbindClient.js.map +1 -0
  111. package/build/vendorAccountClient.d.ts +56 -0
  112. package/build/vendorAccountClient.d.ts.map +1 -0
  113. package/build/vendorAccountClient.js +47 -0
  114. package/build/vendorAccountClient.js.map +1 -0
  115. package/build/verifyCore.d.ts +1 -1
  116. package/build/verifyCore.d.ts.map +1 -0
  117. package/build/verifyCore.js +11 -4
  118. package/build/verifyCore.js.map +1 -0
  119. package/build/verifyOffline.d.ts +85 -0
  120. package/build/verifyOffline.d.ts.map +1 -0
  121. package/build/verifyOffline.js +139 -0
  122. package/build/verifyOffline.js.map +1 -0
  123. package/build/verifyService.d.ts.map +1 -0
  124. package/build/verifyService.js +582 -455
  125. package/build/verifyService.js.map +1 -0
  126. package/build/verifyWithAncestors.d.ts +18 -0
  127. package/build/verifyWithAncestors.d.ts.map +1 -0
  128. package/build/verifyWithAncestors.js +119 -0
  129. package/build/verifyWithAncestors.js.map +1 -0
  130. package/build/zipToState.d.ts +2 -0
  131. package/build/zipToState.d.ts.map +1 -0
  132. package/build/zipToState.js +94 -0
  133. package/build/zipToState.js.map +1 -0
  134. package/package.json +57 -13
  135. package/src/appsLookup.ts +48 -0
  136. package/src/archiveBootstrap.ts +342 -0
  137. package/src/bindClient.ts +175 -0
  138. package/src/buyClient.ts +304 -0
  139. package/src/contractInterface.d.ts +61 -0
  140. package/src/contractInterface.ts +313 -0
  141. package/src/countryStats.ts +171 -0
  142. package/src/deployClient.ts +388 -0
  143. package/src/deviceIdentity.ts +249 -0
  144. package/src/freezeClient.ts +117 -0
  145. package/src/generationClient.ts +165 -0
  146. package/src/index.ts +329 -0
  147. package/src/licenseLeaf.ts +221 -0
  148. package/src/licenseRecord.ts +108 -0
  149. package/src/licenseStore.ts +538 -0
  150. package/src/manifestVerify.ts +111 -0
  151. package/src/migrateClient.ts +84 -0
  152. package/src/onChainRoot.ts +107 -0
  153. package/src/ownershipLicenseHash.ts +31 -0
  154. package/src/ownershipSignature.ts +354 -0
  155. package/src/proveErrors.ts +70 -0
  156. package/src/refundClient.ts +158 -0
  157. package/src/renewClient.ts +214 -0
  158. package/src/seatName.ts +165 -0
  159. package/src/statsClient.ts +235 -0
  160. package/src/trustAnchorVerify.ts +548 -0
  161. package/src/trustAnchorVerifyCli.ts +179 -0
  162. package/src/txBroadcastClient.ts +48 -0
  163. package/src/unbindClient.ts +149 -0
  164. package/src/vendorAccountClient.ts +110 -0
  165. package/src/verifyCore.ts +92 -0
  166. package/src/verifyOffline.ts +212 -0
  167. package/src/verifyService.ts +969 -0
  168. package/src/verifyWithAncestors.ts +153 -0
  169. package/src/zipToState.ts +94 -0
  170. package/build/licenseProof.d.ts +0 -26
  171. package/build/licenseProof.js +0 -41
  172. package/build/ownership.d.ts +0 -34
  173. package/build/ownership.js +0 -147
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) 2025-2026 zkLicensing project developers
2
- // All rights reserved.
2
+ // SPDX-License-Identifier: BUSL-1.1
3
3
  /**
4
4
  * contractInterface.ts
5
5
  *
@@ -12,12 +12,9 @@
12
12
  * about durations are published here so a public verify service can replay
13
13
  * the archive without pulling in the contract source.
14
14
  *
15
- * `CANONICAL_VK_HASH` and `CANONICAL_LICENSE_PROOF_VK_HASH` are the
16
- * verification-key hashes of the two published circuits — `LicensingApp`
17
- * (the on-chain zkApp) and `LicenseOwnershipProgram` (the ownership
18
- * challenge/response `ZkProgram`), respectively. Both are hand-maintained
19
- * constants — bump them whenever the corresponding circuit changes and
20
- * rerun the keeper's boot assertion (see zklicensing-app/src/keeperService.ts)
15
+ * `CANONICAL_VK_HASH` is the verification-key hash of the published
16
+ * `LicensingApp` circuit. Bump it whenever the on-chain zkApp changes
17
+ * and rerun the keeper's boot assertion (see zklicensing-app/src/keeperService.ts)
21
18
  * / the verify service's `ensureCompiled()` check to catch drift.
22
19
  */
23
20
  import { declareState, fetchAccount, Field, PublicKey, SmartContract, Struct, UInt32, UInt64, MerkleMap } from 'o1js';
@@ -33,12 +30,27 @@ import { declareState, fetchAccount, Field, PublicKey, SmartContract, Struct, UI
33
30
  // The clean alternative — `export class X extends Struct({...}) {}` as the
34
31
  // mina-fungible-token repo does — only works when o1js sits inside rootDir,
35
32
  // which a workspace member can't guarantee.
33
+ // `cap` is carried so that a keeper reconstructing the license from archive
34
+ // events (e.g. after losing its in-memory intent map to a restart) can
35
+ // rehydrate the exact LicenseLeaf that was committed on-chain. Without it,
36
+ // leafFromRecord() would default cap to UInt32.zero and every follow-up
37
+ // root-mutating proof (renew, refund, bind, unbind, migrate) would fail the
38
+ // in-circuit hash check.
39
+ //
40
+ // `deviceSlotsRoot` / `deviceSlotsFilled` are omitted deliberately: at issue
41
+ // time they are always EMPTY_DEVICE_SLOTS_ROOT / 0. The keeper's rehydration
42
+ // uses those defaults, matching the leaf the circuit wrote.
43
+ //
44
+ // The leaf carries no separate ownerPubKeyHash — `licenseHash` IS the owner-
45
+ // pubkey commitment (buyLicense asserts them equal), so it doesn't need to
46
+ // ride in the event either.
36
47
  export const LicenseIssuedEvent = Struct({
37
48
  licenseHash: Field,
38
49
  buyer: PublicKey,
39
50
  amount: UInt64,
40
51
  slot: UInt32,
41
52
  expirySlot: UInt32,
53
+ cap: UInt32,
42
54
  });
43
55
  export const ExpiryUpdateEvent = Struct({
44
56
  licenseHash: Field,
@@ -48,6 +60,7 @@ export const PriceUpdatedEvent = Struct({
48
60
  priceMonthly: UInt64,
49
61
  priceYearly: UInt64,
50
62
  priceFiveYear: UInt64,
63
+ pricePerpetual: UInt64,
51
64
  });
52
65
  export const AppCreatedEvent = Struct({
53
66
  vendor: PublicKey,
@@ -59,10 +72,53 @@ export const AppCreatedEvent = Struct({
59
72
  // licensesRoot entry; `ancestorGen` is the generation index the migration
60
73
  // resolved against (needed so archive replay and auditors can trace which
61
74
  // frozen root supplied the entry — skip-generation migrations are one-hop).
75
+ // Migration copies the ancestor leaf verbatim, so a destination keeper that
76
+ // only sees `licenseMigrated` (never saw the original `licenseIssued` on the
77
+ // ancestor deployment) needs every leaf field to rehydrate correctly. Unlike
78
+ // LicenseIssuedEvent, `deviceSlotsRoot` and `deviceSlotsFilled` are included
79
+ // here because a migrated license may carry pre-existing bindings from its
80
+ // ancestor deployment.
62
81
  export const LicenseMigratedEvent = Struct({
63
82
  licenseHash: Field,
64
83
  expirySlot: UInt32,
65
84
  ancestorGen: UInt32,
85
+ cap: UInt32,
86
+ deviceSlotsRoot: Field,
87
+ deviceSlotsFilled: UInt32,
88
+ });
89
+ // Emitted by `bind` when the buyer's device commitment lands in a slot on
90
+ // their license leaf. `deviceCommitment = Poseidon(devicePubKeyHash)` — the
91
+ // raw pubkey is never revealed. `slotIndex` is 0-based within the license's
92
+ // fixed-size slot array (see DEVICE_SLOT_CAP).
93
+ //
94
+ // `boundAtSlot` carries the circuit's proof-time `globalSlotSinceGenesis` —
95
+ // the exact value packed into the leaf's `freedAt` via `packSlotTimes(
96
+ // currentSlot, 0)`. Off-chain keepers rebuilding `deviceSlotsRoot` MUST use
97
+ // this, not the block's globalSlot: the tx's precondition allows any block
98
+ // slot within TOLERANCE_WINDOW of proof time, so block-slot != proof-slot in
99
+ // the general case, and any mismatch flips the packed field, the leaf hash,
100
+ // and the aggregate `licensesRoot`. Follows the same pattern as
101
+ // `LicenseIssuedEvent.slot`.
102
+ export const DeviceBoundEvent = Struct({
103
+ licenseHash: Field,
104
+ slotIndex: UInt32,
105
+ deviceCommitment: Field,
106
+ boundAtSlot: UInt32,
107
+ });
108
+ // Emitted by `unbind` when a slot is freed. `slotIndex` stays occupied in the
109
+ // array (`slotFreedAt` stamp stays set) so the cooldown timer starts; the
110
+ // slot's `occupied` field goes to Field(0). Any device holding the license's
111
+ // ownership key can trigger this — remote log-off is by design.
112
+ //
113
+ // `freedAtSlot` carries the circuit's proof-time `globalSlotSinceGenesis` —
114
+ // the value packed into the leaf's `freedAt` via `packSlotTimes(preservedBound,
115
+ // currentSlot)`. Same off-chain reconstruction reason as `DeviceBoundEvent.
116
+ // boundAtSlot`. The preserved `boundAtSlot` is not re-emitted; keeper reads
117
+ // it from its own record (which still has the earlier bind's stamp).
118
+ export const DeviceUnboundEvent = Struct({
119
+ licenseHash: Field,
120
+ slotIndex: UInt32,
121
+ freedAtSlot: UInt32,
66
122
  });
67
123
  // ------------------------------------------------------------
68
124
  // CONSTANTS (slot math — 90 s/slot after Mesa upgrade)
@@ -70,6 +126,7 @@ export const LicenseMigratedEvent = Struct({
70
126
  export const MONTHLY_SLOTS_N = 28_800; // 30 days × 24 × 40
71
127
  export const ONE_YEAR_SLOTS_N = 350_640; // 365.25 days × 24 × 40 (Julian year)
72
128
  export const FIVE_YEAR_SLOTS_N = 1_753_200; // 5 × ONE_YEAR_SLOTS_N
129
+ export const PERPETUAL_SLOTS_N = 350_640_000; // 1000 × ONE_YEAR_SLOTS_N ("perpetual — until vendor sunset")
73
130
  export const REFUND_WINDOW_N = 13_440;
74
131
  export const GRACE_PERIOD_N = 6_720;
75
132
  export const MS_PER_SLOT_N = 90_000; // Mesa slot duration in ms
@@ -87,8 +144,8 @@ export const EMPTY_ROOT = new MerkleMap().getRoot();
87
144
  // ------------------------------------------------------------
88
145
  // DURATION HELPERS
89
146
  // ------------------------------------------------------------
90
- export const DURATION_LABELS = ['1 Month', '1 Year', '5 Years'];
91
- export const DURATION_INDEX = { '1 Month': 0, '1 Year': 1, '5 Years': 2 };
147
+ export const DURATION_LABELS = ['1 Month', '1 Year', '5 Years', 'Perpetual'];
148
+ export const DURATION_INDEX = { '1 Month': 0, '1 Year': 1, '5 Years': 2, 'Perpetual': 3 };
92
149
  export function durationSlotsFromLabel(label) {
93
150
  if (label === '1 Month')
94
151
  return MONTHLY_SLOTS_N;
@@ -96,6 +153,8 @@ export function durationSlotsFromLabel(label) {
96
153
  return ONE_YEAR_SLOTS_N;
97
154
  if (label === '5 Years')
98
155
  return FIVE_YEAR_SLOTS_N;
156
+ if (label === 'Perpetual')
157
+ return PERPETUAL_SLOTS_N;
99
158
  return null;
100
159
  }
101
160
  export function durationIndexFromLabel(label) {
@@ -105,6 +164,8 @@ export function durationIndexFromLabel(label) {
105
164
  return 1;
106
165
  if (label === '5 Years')
107
166
  return 2;
167
+ if (label === 'Perpetual')
168
+ return 3;
108
169
  return null;
109
170
  }
110
171
  export function durationLabelFromIndex(idx) {
@@ -127,12 +188,14 @@ export class LicensingAppEventsContract extends SmartContract {
127
188
  refundIssued: Field,
128
189
  fundsReleased: Field,
129
190
  priceUpdated: PriceUpdatedEvent,
191
+ deviceBound: DeviceBoundEvent,
192
+ deviceUnbound: DeviceUnboundEvent,
130
193
  };
131
194
  }
132
195
  // State-slot layout mirrors LicensingApp's declareState(). Read-only from here
133
196
  // — no @method bodies exist. Consumers use `.version.get()`, `.licensesRoot.get()`
134
- // etc. after fetchAccount(). `pricesPacked` is a single Field with the three
135
- // UInt64 tier prices packed as [pM | pY<<64 | pF<<128]; unpack with
197
+ // etc. after fetchAccount(). `pricesPacked` is a single Field with the four
198
+ // 63-bit tier prices packed as [pM | pY<<63 | pF<<126 | pP<<189]; unpack with
136
199
  // `unpackPrices` if you need the individual tiers off-chain.
137
200
  declareState(LicensingAppEventsContract, {
138
201
  licensesRoot: Field,
@@ -144,14 +207,17 @@ declareState(LicensingAppEventsContract, {
144
207
  });
145
208
  // Off-chain mirror of the in-circuit price packing (see LicensingApp.ts). Kept
146
209
  // here so the events service can decode `pricesPacked` slots without pulling
147
- // the private contract source.
210
+ // the private contract source. Layout: four 63-bit tiers = 252 bits, fits in
211
+ // the ~254-bit Field. Each tier's high bit is unused — a UInt64 written by
212
+ // packPrices is range-checked to 63 bits in circuit.
148
213
  export function unpackPrices(packed) {
149
214
  const raw = packed.toBigInt();
150
- const mask = (1n << 64n) - 1n;
215
+ const mask = (1n << 63n) - 1n;
151
216
  return {
152
217
  priceMonthly: UInt64.from(raw & mask),
153
- priceYearly: UInt64.from((raw >> 64n) & mask),
154
- priceFiveYear: UInt64.from((raw >> 128n) & mask),
218
+ priceYearly: UInt64.from((raw >> 63n) & mask),
219
+ priceFiveYear: UInt64.from((raw >> 126n) & mask),
220
+ pricePerpetual: UInt64.from((raw >> 189n) & mask),
155
221
  };
156
222
  }
157
223
  // ------------------------------------------------------------
@@ -204,10 +270,9 @@ export async function fetchLicensingAppVersion(zkAppAddress) {
204
270
  // boot-assert are unchanged.
205
271
  // ------------------------------------------------------------
206
272
  export const CANONICAL_VK_HASHES = {
207
- 1: '25510637873522061606403949338800808972643356911784243535869508122414992770753',
273
+ 1: '10361895475617514346344501316555182806545828598248691756333156231763191857993',
208
274
  // 2: '…' — append at each hardfork migration, never delete.
209
275
  };
210
276
  export const CURRENT_GENERATION = 1;
211
277
  export const CANONICAL_VK_HASH = CANONICAL_VK_HASHES[CURRENT_GENERATION];
212
- export const CANONICAL_LICENSE_PROOF_VK_HASH = '6592142093294558010952934797827640785154417146015648013584661926355710165692';
213
278
  //# sourceMappingURL=contractInterface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractInterface.js","sourceRoot":"","sources":["../src/contractInterface.ts"],"names":[],"mappings":"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"}
@@ -18,9 +18,14 @@
18
18
  * Browser-safe: pure computation, no fs, no fetch.
19
19
  */
20
20
  import type { LicenseRecord } from './licenseRecord.js';
21
+ export { zipToState } from './zipToState.js';
21
22
  export type CountryBucket = {
22
23
  count: number;
23
24
  revenueMina: number;
25
+ states?: Record<string, {
26
+ count: number;
27
+ revenueMina: number;
28
+ }>;
24
29
  };
25
30
  export type CountryYearBreakdown = {
26
31
  aggregate: Record<string, CountryBucket>;
@@ -33,5 +38,5 @@ export type CountryBreakdown = {
33
38
  export declare function computeCountryBreakdown(apps: {
34
39
  appId: string;
35
40
  zkAppAddress: string;
36
- }[], records: LicenseRecord[], currentSlot: number, nowMs: number): CountryBreakdown;
41
+ }[], records: LicenseRecord[], currentSlot: number, nowMs: number, tzOffsetMinutes?: number): CountryBreakdown;
37
42
  //# sourceMappingURL=countryStats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"countryStats.d.ts","sourceRoot":"","sources":["../src/countryStats.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAW7C,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IAOpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,KAAK,EAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;CAC1D,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAG,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CAC9C,CAAC;AAOF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,EAC/C,OAAO,EAAE,aAAa,EAAE,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,eAAe,GAAE,MAAU,GAC1B,gBAAgB,CAsGlB"}
@@ -1,5 +1,7 @@
1
1
  // Copyright (c) 2025-2026 zkLicensing project developers
2
- // All rights reserved.
2
+ // SPDX-License-Identifier: BUSL-1.1
3
+ import { zipToState } from './zipToState.js';
4
+ export { zipToState } from './zipToState.js';
3
5
  // LicensingApp charges a 2 % platform fee (200 basis points); the vendor
4
6
  // receives the remaining 9 800 bps. Keep this in sync with the on-chain
5
7
  // constant in LicensingApp.
@@ -7,10 +9,16 @@ const PLATFORM_FEE_BASIS_POINTS = 200n;
7
9
  const VENDOR_BPS = 10000n - PLATFORM_FEE_BASIS_POINTS;
8
10
  // 90 s/slot post-Mesa. Used only for slot→time fallback attribution.
9
11
  const SLOT_DURATION_MS = 90_000;
10
- export function computeCountryBreakdown(apps, records, currentSlot, nowMs) {
12
+ // tzOffsetMinutes: signed minutes east of UTC (e.g. +60 for CET, -480 for PST).
13
+ // Purchase/renewal timestamps are shifted by this offset before extracting the
14
+ // calendar year, so the "tax year" cut-over aligns with the operator's local
15
+ // clock instead of hardcoded UTC. Defaults to 0 (UTC) for callers who don't
16
+ // pass it — preserves the pre-tz behavior.
17
+ export function computeCountryBreakdown(apps, records, currentSlot, nowMs, tzOffsetMinutes = 0) {
11
18
  const appByAddress = new Map(apps.map(a => [a.zkAppAddress, a.appId]));
12
19
  const byYear = {};
13
20
  const yearSet = new Set();
21
+ const tzShiftMs = tzOffsetMinutes * 60_000;
14
22
  const ensureYear = (year) => {
15
23
  let yb = byYear[year];
16
24
  if (!yb) {
@@ -28,7 +36,7 @@ export function computeCountryBreakdown(apps, records, currentSlot, nowMs) {
28
36
  }
29
37
  return ab;
30
38
  };
31
- const add = (bucket, code, count, revenueNano) => {
39
+ const add = (bucket, code, count, revenueNano, state) => {
32
40
  let b = bucket[code];
33
41
  if (!b) {
34
42
  b = { count: 0, revenueMina: 0 };
@@ -36,12 +44,24 @@ export function computeCountryBreakdown(apps, records, currentSlot, nowMs) {
36
44
  }
37
45
  b.count += count;
38
46
  b.revenueMina += Number(revenueNano) / 1e9;
47
+ // State sub-bucket only for US rows whose ZIP resolved to a state.
48
+ // Non-US or unresolvable rows just add to the country total.
49
+ if (code === 'US' && state) {
50
+ const states = b.states ?? (b.states = {});
51
+ let sb = states[state];
52
+ if (!sb) {
53
+ sb = { count: 0, revenueMina: 0 };
54
+ states[state] = sb;
55
+ }
56
+ sb.count += count;
57
+ sb.revenueMina += Number(revenueNano) / 1e9;
58
+ }
39
59
  };
40
60
  const slotToYear = (slot) => {
41
61
  if (currentSlot <= 0)
42
62
  return null;
43
63
  const ms = nowMs - (currentSlot - slot) * SLOT_DURATION_MS;
44
- const y = new Date(ms).getUTCFullYear();
64
+ const y = new Date(ms + tzShiftMs).getUTCFullYear();
45
65
  return Number.isFinite(y) ? y : null;
46
66
  };
47
67
  for (const r of records) {
@@ -49,11 +69,15 @@ export function computeCountryBreakdown(apps, records, currentSlot, nowMs) {
49
69
  if (!appId)
50
70
  continue;
51
71
  const country = r.buyerCountry && /^[A-Z]{2}$/.test(r.buyerCountry) ? r.buyerCountry : '??';
72
+ // Only US rows carry a meaningful ZIP for sales-tax purposes; derive
73
+ // the state jurisdiction here and let `add` roll it up. Non-US ZIPs
74
+ // and unresolvable prefixes fall through to country-total only.
75
+ const state = country === 'US' && r.buyerZip ? zipToState(r.buyerZip) : undefined;
52
76
  // Purchase — attribute to the year of confirm-on-chain (createdAt).
53
77
  // Fallback: slot-derived time for legacy records that lack createdAt.
54
78
  let purchaseYear = null;
55
79
  if (r.createdAt) {
56
- const y = new Date(r.createdAt).getUTCFullYear();
80
+ const y = new Date(new Date(r.createdAt).getTime() + tzShiftMs).getUTCFullYear();
57
81
  if (Number.isFinite(y))
58
82
  purchaseYear = y;
59
83
  }
@@ -66,8 +90,8 @@ export function computeCountryBreakdown(apps, records, currentSlot, nowMs) {
66
90
  const purchaseCut = (!r.refunded && r.purchaseAmount && r.purchaseAmount !== '0')
67
91
  ? (BigInt(r.purchaseAmount) * VENDOR_BPS) / 10000n
68
92
  : 0n;
69
- add(ab, country, 1, purchaseCut);
70
- add(yb.aggregate, country, 1, purchaseCut);
93
+ add(ab, country, 1, purchaseCut, state);
94
+ add(yb.aggregate, country, 1, purchaseCut, state);
71
95
  }
72
96
  // Renewals — revenue only (no license count), attributed to renewal year.
73
97
  for (const rn of r.renewals ?? []) {
@@ -77,8 +101,8 @@ export function computeCountryBreakdown(apps, records, currentSlot, nowMs) {
77
101
  const yb = ensureYear(y);
78
102
  const ab = ensureAppBucket(yb, appId);
79
103
  const cut = (BigInt(rn.amount) * VENDOR_BPS) / 10000n;
80
- add(ab, country, 0, cut);
81
- add(yb.aggregate, country, 0, cut);
104
+ add(ab, country, 0, cut, state);
105
+ add(yb.aggregate, country, 0, cut, state);
82
106
  }
83
107
  }
84
108
  return {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"countryStats.js","sourceRoot":"","sources":["../src/countryStats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployClient.d.ts","sourceRoot":"","sources":["../src/deployClient.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) 2025-2026 zkLicensing project developers
2
- // All rights reserved.
2
+ // SPDX-License-Identifier: BUSL-1.1
3
3
  function baseUrl(url) {
4
4
  return url.replace(/\/+$/, '');
5
5
  }
@@ -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"}