zklicensing 0.1.0-beta.2 → 0.1.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +417 -201
- package/build/agent.d.ts +371 -0
- package/build/agent.d.ts.map +1 -0
- package/build/agent.js +553 -0
- package/build/agent.js.map +1 -0
- package/build/agentActions.d.ts +841 -0
- package/build/agentActions.d.ts.map +1 -0
- package/build/agentActions.js +581 -0
- package/build/agentActions.js.map +1 -0
- package/build/agentRecord.d.ts +83 -0
- package/build/agentRecord.d.ts.map +1 -0
- package/build/agentRecord.js +69 -0
- package/build/agentRecord.js.map +1 -0
- package/build/agentVendor.d.ts +220 -0
- package/build/agentVendor.d.ts.map +1 -0
- package/build/agentVendor.js +306 -0
- package/build/agentVendor.js.map +1 -0
- package/build/appsLookup.d.ts +14 -0
- package/build/appsLookup.d.ts.map +1 -0
- package/build/appsLookup.js +12 -0
- package/build/appsLookup.js.map +1 -0
- package/build/archiveBootstrap.d.ts +31 -5
- package/build/archiveBootstrap.d.ts.map +1 -0
- package/build/archiveBootstrap.js +140 -47
- package/build/archiveBootstrap.js.map +1 -0
- package/build/atomicJson.d.ts +5 -0
- package/build/atomicJson.d.ts.map +1 -0
- package/build/atomicJson.js +55 -0
- package/build/atomicJson.js.map +1 -0
- package/build/bindClient.d.ts +85 -0
- package/build/bindClient.d.ts.map +1 -0
- package/build/bindClient.js +187 -0
- package/build/bindClient.js.map +1 -0
- package/build/buyClient.d.ts +27 -4
- package/build/buyClient.d.ts.map +1 -0
- package/build/buyClient.js +72 -26
- package/build/buyClient.js.map +1 -0
- package/build/chainHead.d.ts +61 -0
- package/build/chainHead.d.ts.map +1 -0
- package/build/chainHead.js +88 -0
- package/build/chainHead.js.map +1 -0
- package/build/compactMerkleMap.d.ts +72 -0
- package/build/compactMerkleMap.d.ts.map +1 -0
- package/build/compactMerkleMap.js +224 -0
- package/build/compactMerkleMap.js.map +1 -0
- package/build/contractInterface.d.ts +191 -51
- package/build/contractInterface.d.ts.map +1 -0
- package/build/contractInterface.js +234 -43
- package/build/contractInterface.js.map +1 -0
- package/build/contractTypes.d.ts +9 -0
- package/build/contractTypes.d.ts.map +1 -0
- package/build/contractTypes.js +28 -0
- package/build/contractTypes.js.map +1 -0
- package/build/countryStats.d.ts +12 -3
- package/build/countryStats.d.ts.map +1 -0
- package/build/countryStats.js +87 -23
- package/build/countryStats.js.map +1 -0
- package/build/deployClient.d.ts +138 -24
- package/build/deployClient.d.ts.map +1 -0
- package/build/deployClient.js +91 -31
- package/build/deployClient.js.map +1 -0
- package/build/deviceIdentity.d.ts +68 -0
- package/build/deviceIdentity.d.ts.map +1 -0
- package/build/deviceIdentity.js +209 -0
- package/build/deviceIdentity.js.map +1 -0
- package/build/freezeClient.d.ts +26 -6
- package/build/freezeClient.d.ts.map +1 -0
- package/build/freezeClient.js +30 -6
- package/build/freezeClient.js.map +1 -0
- package/build/generationClient.d.ts +6 -3
- package/build/generationClient.d.ts.map +1 -0
- package/build/generationClient.js +25 -38
- package/build/generationClient.js.map +1 -0
- package/build/holderSecret.d.ts +70 -0
- package/build/holderSecret.d.ts.map +1 -0
- package/build/holderSecret.js +76 -0
- package/build/holderSecret.js.map +1 -0
- package/build/index.d.ts +38 -38
- package/build/index.d.ts.map +1 -0
- package/build/index.js +97 -121
- package/build/index.js.map +1 -0
- package/build/keysClient.d.ts +142 -0
- package/build/keysClient.d.ts.map +1 -0
- package/build/keysClient.js +109 -0
- package/build/keysClient.js.map +1 -0
- package/build/licenseLeaf.d.ts +76 -0
- package/build/licenseLeaf.d.ts.map +1 -0
- package/build/licenseLeaf.js +189 -0
- package/build/licenseLeaf.js.map +1 -0
- package/build/licenseRecord.d.ts +68 -5
- package/build/licenseRecord.d.ts.map +1 -0
- package/build/licenseRecord.js +26 -1
- package/build/licenseRecord.js.map +1 -0
- package/build/licenseStore.d.ts +81 -4
- package/build/licenseStore.d.ts.map +1 -0
- package/build/licenseStore.js +400 -30
- package/build/licenseStore.js.map +1 -0
- package/build/licenseTrustless.d.ts +43 -0
- package/build/licenseTrustless.d.ts.map +1 -0
- package/build/licenseTrustless.js +180 -0
- package/build/licenseTrustless.js.map +1 -0
- package/build/manifestVerify.d.ts +29 -1
- package/build/manifestVerify.d.ts.map +1 -0
- package/build/manifestVerify.js +46 -4
- package/build/manifestVerify.js.map +1 -0
- package/build/minaPriceHistory.d.ts +9 -0
- package/build/minaPriceHistory.d.ts.map +1 -0
- package/build/minaPriceHistory.js +152 -0
- package/build/minaPriceHistory.js.map +1 -0
- package/build/onChainRoot.d.ts +60 -0
- package/build/onChainRoot.d.ts.map +1 -0
- package/build/onChainRoot.js +74 -0
- package/build/onChainRoot.js.map +1 -0
- package/build/ownershipLicenseHash.d.ts +25 -0
- package/build/ownershipLicenseHash.d.ts.map +1 -0
- package/build/ownershipLicenseHash.js +29 -0
- package/build/ownershipLicenseHash.js.map +1 -0
- package/build/ownershipSignature.d.ts +153 -0
- package/build/ownershipSignature.d.ts.map +1 -0
- package/build/ownershipSignature.js +297 -0
- package/build/ownershipSignature.js.map +1 -0
- package/build/permitCheckFlow.d.ts +155 -0
- package/build/permitCheckFlow.d.ts.map +1 -0
- package/build/permitCheckFlow.js +196 -0
- package/build/permitCheckFlow.js.map +1 -0
- package/build/permitDescribe.d.ts +124 -0
- package/build/permitDescribe.d.ts.map +1 -0
- package/build/permitDescribe.js +324 -0
- package/build/permitDescribe.js.map +1 -0
- package/build/permitInterface.d.ts +85 -0
- package/build/permitInterface.d.ts.map +1 -0
- package/build/permitInterface.js +121 -0
- package/build/permitInterface.js.map +1 -0
- package/build/permitMessages.d.ts +313 -0
- package/build/permitMessages.d.ts.map +1 -0
- package/build/permitMessages.js +462 -0
- package/build/permitMessages.js.map +1 -0
- package/build/permitProof.d.ts +108 -0
- package/build/permitProof.d.ts.map +1 -0
- package/build/permitProof.js +202 -0
- package/build/permitProof.js.map +1 -0
- package/build/permitRegistryRebuild.d.ts +166 -0
- package/build/permitRegistryRebuild.d.ts.map +1 -0
- package/build/permitRegistryRebuild.js +347 -0
- package/build/permitRegistryRebuild.js.map +1 -0
- package/build/permitTree.d.ts +88 -0
- package/build/permitTree.d.ts.map +1 -0
- package/build/permitTree.js +230 -0
- package/build/permitTree.js.map +1 -0
- package/build/permitsClient.d.ts +680 -0
- package/build/permitsClient.d.ts.map +1 -0
- package/build/permitsClient.js +597 -0
- package/build/permitsClient.js.map +1 -0
- package/build/proveErrors.d.ts +50 -0
- package/build/proveErrors.d.ts.map +1 -0
- package/build/proveErrors.js +76 -0
- package/build/proveErrors.js.map +1 -0
- package/build/receipt.d.ts +95 -0
- package/build/receipt.d.ts.map +1 -0
- package/build/receipt.js +84 -0
- package/build/receipt.js.map +1 -0
- package/build/refundClient.d.ts +7 -12
- package/build/refundClient.d.ts.map +1 -0
- package/build/refundClient.js +52 -21
- package/build/refundClient.js.map +1 -0
- package/build/registryTrustVerify.d.ts +78 -0
- package/build/registryTrustVerify.d.ts.map +1 -0
- package/build/registryTrustVerify.js +129 -0
- package/build/registryTrustVerify.js.map +1 -0
- package/build/releaseClient.d.ts +26 -0
- package/build/releaseClient.d.ts.map +1 -0
- package/build/releaseClient.js +65 -0
- package/build/releaseClient.js.map +1 -0
- package/build/renewClient.d.ts +28 -2
- package/build/renewClient.d.ts.map +1 -0
- package/build/renewClient.js +31 -27
- package/build/renewClient.js.map +1 -0
- package/build/seatName.d.ts +8 -0
- package/build/seatName.d.ts.map +1 -0
- package/build/seatName.js +136 -0
- package/build/seatName.js.map +1 -0
- package/build/slotConstants.d.ts +15 -0
- package/build/slotConstants.d.ts.map +1 -0
- package/build/slotConstants.js +17 -0
- package/build/slotConstants.js.map +1 -0
- package/build/statsClient.d.ts +61 -7
- package/build/statsClient.d.ts.map +1 -0
- package/build/statsClient.js +44 -5
- package/build/statsClient.js.map +1 -0
- package/build/successorChain.d.ts +35 -0
- package/build/successorChain.d.ts.map +1 -0
- package/build/successorChain.js +69 -0
- package/build/successorChain.js.map +1 -0
- package/build/taxId.d.ts +44 -0
- package/build/taxId.d.ts.map +1 -0
- package/build/taxId.js +212 -0
- package/build/taxId.js.map +1 -0
- package/build/trustAnchorVerify.d.ts +49 -0
- package/build/trustAnchorVerify.d.ts.map +1 -0
- package/build/trustAnchorVerify.js +432 -0
- package/build/trustAnchorVerify.js.map +1 -0
- package/build/trustAnchorVerifyCli.d.ts +45 -0
- package/build/trustAnchorVerifyCli.d.ts.map +1 -0
- package/build/trustAnchorVerifyCli.js +235 -0
- package/build/trustAnchorVerifyCli.js.map +1 -0
- package/build/txBroadcastClient.d.ts +26 -0
- package/build/txBroadcastClient.d.ts.map +1 -0
- package/build/txBroadcastClient.js +20 -0
- package/build/txBroadcastClient.js.map +1 -0
- package/build/unbindClient.d.ts +77 -0
- package/build/unbindClient.d.ts.map +1 -0
- package/build/unbindClient.js +169 -0
- package/build/unbindClient.js.map +1 -0
- package/build/units.d.ts +28 -0
- package/build/units.d.ts.map +1 -0
- package/build/units.js +65 -0
- package/build/units.js.map +1 -0
- package/build/vatRates.d.ts +54 -0
- package/build/vatRates.d.ts.map +1 -0
- package/build/vatRates.js +82 -0
- package/build/vatRates.js.map +1 -0
- package/build/vatRatesData.d.ts +5 -0
- package/build/vatRatesData.d.ts.map +1 -0
- package/build/vatRatesData.js +42 -0
- package/build/vatRatesData.js.map +1 -0
- package/build/vendorAccountClient.d.ts +66 -0
- package/build/vendorAccountClient.d.ts.map +1 -0
- package/build/vendorAccountClient.js +47 -0
- package/build/vendorAccountClient.js.map +1 -0
- package/build/verifyCore.d.ts +4 -1
- package/build/verifyCore.d.ts.map +1 -0
- package/build/verifyCore.js +21 -10
- package/build/verifyCore.js.map +1 -0
- package/build/verifyOffline.d.ts +85 -0
- package/build/verifyOffline.d.ts.map +1 -0
- package/build/verifyOffline.js +139 -0
- package/build/verifyOffline.js.map +1 -0
- package/build/verifyService.d.ts.map +1 -0
- package/build/verifyService.js +571 -501
- package/build/verifyService.js.map +1 -0
- package/build/verifyWithAncestors.d.ts +19 -0
- package/build/verifyWithAncestors.d.ts.map +1 -0
- package/build/verifyWithAncestors.js +127 -0
- package/build/verifyWithAncestors.js.map +1 -0
- package/build/zipToState.d.ts +2 -0
- package/build/zipToState.d.ts.map +1 -0
- package/build/zipToState.js +94 -0
- package/build/zipToState.js.map +1 -0
- package/package.json +141 -16
- package/src/agent.ts +682 -0
- package/src/agentActions.ts +637 -0
- package/src/agentRecord.ts +121 -0
- package/src/agentVendor.ts +356 -0
- package/src/appsLookup.ts +48 -0
- package/src/archiveBootstrap.ts +386 -0
- package/src/atomicJson.ts +53 -0
- package/src/bindClient.ts +297 -0
- package/src/buyClient.ts +344 -0
- package/src/chainHead.ts +106 -0
- package/src/compactMerkleMap.ts +222 -0
- package/src/contractInterface.ts +465 -0
- package/src/contractTypes.ts +31 -0
- package/src/countryStats.ts +200 -0
- package/src/deployClient.ts +517 -0
- package/src/deviceIdentity.ts +249 -0
- package/src/freezeClient.ts +162 -0
- package/src/generationClient.ts +145 -0
- package/src/holderSecret.ts +91 -0
- package/src/index.ts +362 -0
- package/src/keysClient.ts +135 -0
- package/src/licenseLeaf.ts +221 -0
- package/src/licenseRecord.ts +190 -0
- package/src/licenseStore.ts +767 -0
- package/src/licenseTrustless.ts +207 -0
- package/src/manifestVerify.ts +164 -0
- package/src/minaPriceHistory.ts +166 -0
- package/src/onChainRoot.ts +90 -0
- package/src/ownershipLicenseHash.ts +31 -0
- package/src/ownershipSignature.ts +421 -0
- package/src/permitCheckFlow.ts +227 -0
- package/src/permitDescribe.ts +362 -0
- package/src/permitInterface.ts +146 -0
- package/src/permitMessages.ts +572 -0
- package/src/permitProof.ts +230 -0
- package/src/permitRegistryRebuild.ts +423 -0
- package/src/permitTree.ts +232 -0
- package/src/permitsClient.ts +746 -0
- package/src/proveErrors.ts +98 -0
- package/src/receipt.ts +156 -0
- package/src/refundClient.ts +177 -0
- package/src/registryTrustVerify.ts +192 -0
- package/src/releaseClient.ts +101 -0
- package/src/renewClient.ts +234 -0
- package/src/seatName.ts +165 -0
- package/src/slotConstants.ts +18 -0
- package/src/statsClient.ts +249 -0
- package/src/successorChain.ts +87 -0
- package/src/taxId.ts +227 -0
- package/src/trustAnchorVerify.ts +550 -0
- package/src/trustAnchorVerifyCli.ts +234 -0
- package/src/txBroadcastClient.ts +48 -0
- package/src/unbindClient.ts +233 -0
- package/src/units.ts +74 -0
- package/src/vatRates.ts +100 -0
- package/src/vatRatesData.ts +43 -0
- package/src/vendorAccountClient.ts +120 -0
- package/src/verifyCore.ts +100 -0
- package/src/verifyOffline.ts +212 -0
- package/src/verifyService.ts +982 -0
- package/src/verifyWithAncestors.ts +163 -0
- package/src/zipToState.ts +94 -0
- package/build/licenseProof.d.ts +0 -26
- package/build/licenseProof.js +0 -41
- package/build/migrateClient.d.ts +0 -43
- package/build/migrateClient.js +0 -47
- package/build/ownership.d.ts +0 -34
- package/build/ownership.js +0 -147
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* registryTrustVerify.ts — `zklicensing/permits/trust`
|
|
3
|
+
*
|
|
4
|
+
* Is this address a genuine, unmodifiable zkPermits registry? The permits
|
|
5
|
+
* counterpart of verifyTrustAnchor, used by `zklicensing-verify-trust
|
|
6
|
+
* --registry`. Each check is a discrete finding:
|
|
7
|
+
*
|
|
8
|
+
* chain_account_exists the account exists and is a zkApp
|
|
9
|
+
* chain_vk_hash_pinned its verification key is a published PermitRegistry release
|
|
10
|
+
* chain_initialized authority keys are set (initialize ran)
|
|
11
|
+
* chain_network_bound the registry is bound to this network
|
|
12
|
+
* chain_set_verification_key_locked the circuit can't be replaced
|
|
13
|
+
* chain_set_permissions_impossible permissions are frozen
|
|
14
|
+
* chain_send_proof_only funds move only through the circuit
|
|
15
|
+
* chain_edit_state_proof_only state changes only through the circuit
|
|
16
|
+
* chain_set_zkapp_uri_impossible, chain_set_delegate_impossible, chain_set_timing_impossible
|
|
17
|
+
* chain_website_bound the authority's https website is written into zkappUri (set at deploy, frozen)
|
|
18
|
+
* website_expected (with website) that website is on the host you expected
|
|
19
|
+
* website_claims_registry (with checkWellKnown) the website serves
|
|
20
|
+
* /.well-known/zkpermits/<address>.json naming this registry and network
|
|
21
|
+
* keeper_keys_match (with keeperUrl) the keeper's authority keys hash to the on-chain value
|
|
22
|
+
* keeper_payout_match (with keeperUrl) the keeper's payout address is the on-chain one
|
|
23
|
+
* keeper_website_match (with keeperUrl) the keeper lists the same website
|
|
24
|
+
*
|
|
25
|
+
* The website pair is the registry's identity: zkappUri says which site the
|
|
26
|
+
* registry belongs to, and the .well-known file, which only that site's
|
|
27
|
+
* owner can publish, says the site claims the registry. A copy of a real
|
|
28
|
+
* authority's registry under another address can't have both.
|
|
29
|
+
*
|
|
30
|
+
* Until the circuit is released after its audit, no verification-key hash
|
|
31
|
+
* is published, and chain_vk_hash_pinned fails by design.
|
|
32
|
+
*/
|
|
33
|
+
import type { Finding } from './trustAnchorVerify.js';
|
|
34
|
+
export { permToString } from './trustAnchorVerify.js';
|
|
35
|
+
export type RegistryChainFacts = {
|
|
36
|
+
accountFound: boolean;
|
|
37
|
+
fetchError?: string;
|
|
38
|
+
vkHash?: string;
|
|
39
|
+
/** The website written at deploy. */
|
|
40
|
+
zkappUri?: string;
|
|
41
|
+
/** appState as decimal strings. */
|
|
42
|
+
appState?: string[];
|
|
43
|
+
/** Permission names as permToString gives them ('Impossible', 'Proof', …). */
|
|
44
|
+
permissions?: Record<'setVerificationKey' | 'setPermissions' | 'send' | 'editState' | 'setZkappUri' | 'setDelegate' | 'setTiming', string | undefined>;
|
|
45
|
+
};
|
|
46
|
+
export type RegistryTrustReport = {
|
|
47
|
+
ok: boolean;
|
|
48
|
+
address: string;
|
|
49
|
+
network: 'devnet' | 'mainnet';
|
|
50
|
+
findings: Finding[];
|
|
51
|
+
};
|
|
52
|
+
export type VerifyRegistryTrustOpts = {
|
|
53
|
+
address: string;
|
|
54
|
+
network: 'devnet' | 'mainnet';
|
|
55
|
+
/** Mina node GraphQL; default the public node for the network. */
|
|
56
|
+
minaGraphqlUrl?: string;
|
|
57
|
+
/** Also compare the keeper's record with the chain. */
|
|
58
|
+
keeperUrl?: string;
|
|
59
|
+
fetcher?: typeof fetch;
|
|
60
|
+
/** Override the chain read (tests, custom nodes). */
|
|
61
|
+
readChain?: (address: string) => Promise<RegistryChainFacts>;
|
|
62
|
+
/** The authority's website you expect (from its letters, signage or your own bookmarks); compared by host. */
|
|
63
|
+
website?: string;
|
|
64
|
+
/** Fetch the website's /.well-known/zkpermits/<address>.json and check it claims this registry. */
|
|
65
|
+
checkWellKnown?: boolean;
|
|
66
|
+
/** Override the published hashes (tests). */
|
|
67
|
+
canonicalVkHashes?: Readonly<Record<number, string>>;
|
|
68
|
+
};
|
|
69
|
+
/** Where an authority's website claims a registry: one file per registry address. */
|
|
70
|
+
export declare function wellKnownPath(address: string): string;
|
|
71
|
+
/** The file an authority publishes at wellKnownPath(address) on its website. */
|
|
72
|
+
export declare function wellKnownFile(address: string, network: 'devnet' | 'mainnet', name?: string): {
|
|
73
|
+
registry: string;
|
|
74
|
+
network: 'devnet' | 'mainnet';
|
|
75
|
+
name?: string;
|
|
76
|
+
};
|
|
77
|
+
export declare function verifyRegistryTrust(opts: VerifyRegistryTrustOpts): Promise<RegistryTrustReport>;
|
|
78
|
+
//# sourceMappingURL=registryTrustVerify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registryTrustVerify.d.ts","sourceRoot":"","sources":["../src/registryTrustVerify.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC,oBAAoB,GAAG,gBAAgB,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACxJ,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAEvH,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,qDAAqD;IACrD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7D,8GAA8G;IAC9G,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAE/J;AAiCD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+ErG"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
|
+
export { permToString } from './trustAnchorVerify.js';
|
|
4
|
+
/** Where an authority's website claims a registry: one file per registry address. */
|
|
5
|
+
export function wellKnownPath(address) {
|
|
6
|
+
return `/.well-known/zkpermits/${address}.json`;
|
|
7
|
+
}
|
|
8
|
+
/** The file an authority publishes at wellKnownPath(address) on its website. */
|
|
9
|
+
export function wellKnownFile(address, network, name) {
|
|
10
|
+
return { registry: address, network, ...(name ? { name } : {}) };
|
|
11
|
+
}
|
|
12
|
+
function httpsUrl(v) {
|
|
13
|
+
if (!v)
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
const u = new URL(v);
|
|
17
|
+
return u.protocol === 'https:' && u.hostname && !u.username && !u.password ? u : null;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function readRegistryChain(address, graphqlUrl, fetcher) {
|
|
24
|
+
try {
|
|
25
|
+
const { readZkappAccount } = await import('./chainHead.js');
|
|
26
|
+
const a = await readZkappAccount({ address, graphqlUrl, fetcher });
|
|
27
|
+
if (!a.found)
|
|
28
|
+
return { accountFound: false, fetchError: 'no account' };
|
|
29
|
+
const p = a.permissions ?? {};
|
|
30
|
+
return {
|
|
31
|
+
accountFound: true,
|
|
32
|
+
vkHash: a.vkHash,
|
|
33
|
+
zkappUri: a.zkappUri,
|
|
34
|
+
appState: a.appState,
|
|
35
|
+
permissions: {
|
|
36
|
+
setVerificationKey: p.setVerificationKey?.auth,
|
|
37
|
+
setPermissions: p.setPermissions,
|
|
38
|
+
send: p.send,
|
|
39
|
+
editState: p.editState,
|
|
40
|
+
setZkappUri: p.setZkappUri,
|
|
41
|
+
setDelegate: p.setDelegate,
|
|
42
|
+
setTiming: p.setTiming,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
return { accountFound: false, fetchError: e?.message ?? String(e) };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function verifyRegistryTrust(opts) {
|
|
51
|
+
const { DEFAULT_MINA_GRAPHQL_URLS } = await import('./onChainRoot.js');
|
|
52
|
+
const { PERMIT_REGISTRY_STATE, CANONICAL_PERMIT_VK_HASHES } = await import('./permitInterface.js');
|
|
53
|
+
const findings = [];
|
|
54
|
+
const add = (name, ok, detail) => findings.push({ name, ok, detail });
|
|
55
|
+
const done = () => ({ ok: findings.every(f => f.ok), address: opts.address, network: opts.network, findings });
|
|
56
|
+
const read = opts.readChain ?? ((a) => readRegistryChain(a, opts.minaGraphqlUrl ?? DEFAULT_MINA_GRAPHQL_URLS[opts.network], opts.fetcher));
|
|
57
|
+
const chain = await read(opts.address);
|
|
58
|
+
add('chain_account_exists', chain.accountFound && !!chain.vkHash, chain.accountFound ? (chain.vkHash ? 'zkApp account found' : 'account has no verification key (not a zkApp)') : `not found: ${chain.fetchError ?? ''}`);
|
|
59
|
+
if (!chain.accountFound || !chain.vkHash)
|
|
60
|
+
return done();
|
|
61
|
+
const pinned = opts.canonicalVkHashes ?? CANONICAL_PERMIT_VK_HASHES;
|
|
62
|
+
const gen = Object.entries(pinned).find(([, h]) => h === chain.vkHash)?.[0];
|
|
63
|
+
add('chain_vk_hash_pinned', gen !== undefined, gen !== undefined ? `verification key is PermitRegistry release generation ${gen}`
|
|
64
|
+
: Object.keys(pinned).length === 0 ? 'no PermitRegistry verification-key hash is published yet (pre-release)'
|
|
65
|
+
: `verification key ${chain.vkHash} is not a published PermitRegistry release`);
|
|
66
|
+
const st = (k) => chain.appState?.[PERMIT_REGISTRY_STATE[k]] ?? '0';
|
|
67
|
+
add('chain_initialized', st('authorityKeysHash') !== '0', st('authorityKeysHash') !== '0' ? 'authority keys set' : 'authority keys not set: initialize has not run');
|
|
68
|
+
const { PERMIT_NETWORK } = await import('./permitMessages.js');
|
|
69
|
+
const want = PERMIT_NETWORK[opts.network].toString();
|
|
70
|
+
add('chain_network_bound', st('networkId') === want, st('networkId') === want ? `bound to ${opts.network}` : `bound to network id ${st('networkId')}, expected ${want} (${opts.network})`);
|
|
71
|
+
const perm = (name, key, expected) => {
|
|
72
|
+
const got = chain.permissions?.[key];
|
|
73
|
+
add(name, got === expected, `${key} is ${got ?? 'unknown'}${got === expected ? '' : `, expected ${expected}`}`);
|
|
74
|
+
};
|
|
75
|
+
perm('chain_set_verification_key_locked', 'setVerificationKey', 'Impossible');
|
|
76
|
+
perm('chain_set_permissions_impossible', 'setPermissions', 'Impossible');
|
|
77
|
+
perm('chain_send_proof_only', 'send', 'Proof');
|
|
78
|
+
perm('chain_edit_state_proof_only', 'editState', 'Proof');
|
|
79
|
+
perm('chain_set_zkapp_uri_impossible', 'setZkappUri', 'Impossible');
|
|
80
|
+
perm('chain_set_delegate_impossible', 'setDelegate', 'Impossible');
|
|
81
|
+
perm('chain_set_timing_impossible', 'setTiming', 'Impossible');
|
|
82
|
+
const site = httpsUrl(chain.zkappUri);
|
|
83
|
+
add('chain_website_bound', !!site, site ? `belongs to ${chain.zkappUri}` : chain.zkappUri ? `zkappUri "${chain.zkappUri}" is not an https website` : 'no website written at deploy (zkappUri is empty)');
|
|
84
|
+
if (opts.website !== undefined) {
|
|
85
|
+
const want = httpsUrl(opts.website) ?? httpsUrl(`https://${opts.website}`);
|
|
86
|
+
const same = !!site && !!want && site.hostname.toLowerCase() === want.hostname.toLowerCase();
|
|
87
|
+
add('website_expected', same, same ? `on ${want.hostname}, as expected` : `the registry belongs to ${site?.hostname ?? 'no website'}, not ${want?.hostname ?? opts.website}`);
|
|
88
|
+
}
|
|
89
|
+
if (opts.checkWellKnown) {
|
|
90
|
+
const url = site ? new URL(wellKnownPath(opts.address), site.origin).href : null;
|
|
91
|
+
if (!url)
|
|
92
|
+
add('website_claims_registry', false, 'no website to ask');
|
|
93
|
+
else {
|
|
94
|
+
try {
|
|
95
|
+
const r = await (opts.fetcher ?? fetch)(url, { redirect: 'error', headers: { Accept: 'application/json' } });
|
|
96
|
+
if (!r.ok)
|
|
97
|
+
throw new Error(`HTTP ${r.status}`);
|
|
98
|
+
const j = await r.json();
|
|
99
|
+
const claims = j?.registry === opts.address && j?.network === opts.network;
|
|
100
|
+
add('website_claims_registry', claims, claims ? `${url} claims this registry on ${opts.network}`
|
|
101
|
+
: `${url} names ${j?.registry ?? 'no registry'} on ${j?.network ?? 'no network'}`);
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
add('website_claims_registry', false, `${url}: ${e?.message ?? e}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (opts.keeperUrl) {
|
|
109
|
+
try {
|
|
110
|
+
const r = await (opts.fetcher ?? fetch)(`${opts.keeperUrl.replace(/\/+$/, '')}/permits/registries/${opts.address}`);
|
|
111
|
+
if (!r.ok)
|
|
112
|
+
throw new Error(`HTTP ${r.status}`);
|
|
113
|
+
const { registry } = await r.json();
|
|
114
|
+
const { PublicKey, Field } = await import('o1js');
|
|
115
|
+
const { authorityKeys, authorityKeysHash } = await import('./permitMessages.js');
|
|
116
|
+
const h = authorityKeysHash(authorityKeys(registry.keys.map(k => PublicKey.fromBase58(k)), registry.threshold)).toString();
|
|
117
|
+
add('keeper_keys_match', h === st('authorityKeysHash'), h === st('authorityKeysHash')
|
|
118
|
+
? `keeper lists ${registry.keys.length} keys, threshold ${registry.threshold}, matching the chain` : 'the keeper\'s authority keys do not match the chain (stale or wrong record)');
|
|
119
|
+
const payout = PublicKey.fromFields([Field(st('payoutX')), Field(st('payoutIsOdd'))]).toBase58();
|
|
120
|
+
add('keeper_payout_match', payout === registry.payout, payout === registry.payout ? `payout ${payout}` : `chain pays ${payout}, keeper lists ${registry.payout}`);
|
|
121
|
+
add('keeper_website_match', registry.website === chain.zkappUri, registry.website === chain.zkappUri ? `website ${registry.website}` : `chain says ${chain.zkappUri ?? 'none'}, keeper lists ${registry.website ?? 'none'}`);
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
add('keeper_keys_match', false, `keeper record unavailable: ${e?.message ?? e}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return done();
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=registryTrustVerify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registryTrustVerify.js","sourceRoot":"","sources":["../src/registryTrustVerify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type ProveVendorReleaseRequest = {
|
|
2
|
+
keeperUrl: string;
|
|
3
|
+
licenseHash: string;
|
|
4
|
+
zkAppAddress: string;
|
|
5
|
+
senderPublicKey: string;
|
|
6
|
+
network?: 'devnet' | 'mainnet';
|
|
7
|
+
fetcher?: typeof fetch;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
};
|
|
10
|
+
export type ProveVendorReleaseResponse = {
|
|
11
|
+
provenTxJson: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function proveVendorRelease(req: ProveVendorReleaseRequest): Promise<ProveVendorReleaseResponse>;
|
|
14
|
+
export type ConfirmVendorReleaseRequest = {
|
|
15
|
+
keeperUrl: string;
|
|
16
|
+
licenseHash: string;
|
|
17
|
+
zkAppAddress: string;
|
|
18
|
+
txHash: string;
|
|
19
|
+
fetcher?: typeof fetch;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
};
|
|
22
|
+
export type ConfirmVendorReleaseResponse = {
|
|
23
|
+
ok: true;
|
|
24
|
+
};
|
|
25
|
+
export declare function confirmVendorRelease(req: ConfirmVendorReleaseRequest): Promise<ConfirmVendorReleaseResponse>;
|
|
26
|
+
//# sourceMappingURL=releaseClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releaseClient.d.ts","sourceRoot":"","sources":["../src/releaseClient.ts"],"names":[],"mappings":"AA2BA,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAQ,MAAM,CAAC;IACxB,WAAW,EAAM,MAAM,CAAC;IACxB,YAAY,EAAK,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IAIxB,OAAO,CAAC,EAAS,QAAQ,GAAG,SAAS,CAAC;IACtC,OAAO,CAAC,EAAS,OAAO,KAAK,CAAC;IAC9B,MAAM,CAAC,EAAU,WAAW,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IAGvC,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAMF,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAkB5G;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAK,MAAM,CAAC;IACrB,WAAW,EAAG,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IAGrB,MAAM,EAAQ,MAAM,CAAC;IACrB,OAAO,CAAC,EAAM,OAAO,KAAK,CAAC;IAC3B,MAAM,CAAC,EAAO,WAAW,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC;AAExD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,2BAA2B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAiBlH"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
|
+
/**
|
|
4
|
+
* releaseClient.ts
|
|
5
|
+
*
|
|
6
|
+
* Vendor-signed release path — call POST /prove/release-vendor to get an
|
|
7
|
+
* unsigned proved tx, then broadcast it through the vendor's wallet
|
|
8
|
+
* (`provider.sendTransaction`). The vendor pays the transaction fee and
|
|
9
|
+
* signs the fee-payer AU themselves — the licensing service never needs
|
|
10
|
+
* its own feepayer key for this path.
|
|
11
|
+
*
|
|
12
|
+
* `releaseFunds` is permissionless on-chain, so anyone willing to pay gas
|
|
13
|
+
* may call this. There is no server-side identity check — the client's
|
|
14
|
+
* wallet holds full authority via the fee-payer signature.
|
|
15
|
+
*
|
|
16
|
+
* On-chain settlement is observed by the licensing service's event-sync
|
|
17
|
+
* loop. That sweep runs every 30 minutes, so callers who want the
|
|
18
|
+
* `released` flag to flip within seconds of inclusion should call
|
|
19
|
+
* `confirmVendorRelease` with the wallet's returned tx hash — the service
|
|
20
|
+
* then watches bestChain and mirrors the fundsReleased event optimistically.
|
|
21
|
+
* The event-sync sweep is still authoritative; the confirm/watch path is a
|
|
22
|
+
* latency shortcut and is idempotent.
|
|
23
|
+
*/
|
|
24
|
+
import { readErrorBody, keeperError } from './proveErrors.js';
|
|
25
|
+
function baseUrl(url) {
|
|
26
|
+
return url.replace(/\/+$/, '');
|
|
27
|
+
}
|
|
28
|
+
export async function proveVendorRelease(req) {
|
|
29
|
+
const fetcher = req.fetcher ?? fetch;
|
|
30
|
+
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/prove/release-vendor`, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: { 'Content-Type': 'application/json' },
|
|
33
|
+
signal: req.signal,
|
|
34
|
+
body: JSON.stringify({
|
|
35
|
+
licenseHash: req.licenseHash,
|
|
36
|
+
zkAppAddress: req.zkAppAddress,
|
|
37
|
+
senderPublicKey: req.senderPublicKey,
|
|
38
|
+
...(req.network ? { network: req.network } : {}),
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
if (!resp.ok) {
|
|
42
|
+
const parsed = await readErrorBody(resp);
|
|
43
|
+
throw keeperError(parsed);
|
|
44
|
+
}
|
|
45
|
+
return await resp.json();
|
|
46
|
+
}
|
|
47
|
+
export async function confirmVendorRelease(req) {
|
|
48
|
+
const fetcher = req.fetcher ?? fetch;
|
|
49
|
+
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/confirm/release-vendor`, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: { 'Content-Type': 'application/json' },
|
|
52
|
+
signal: req.signal,
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
zkAppAddress: req.zkAppAddress,
|
|
55
|
+
licenseHash: req.licenseHash,
|
|
56
|
+
txHash: req.txHash,
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
if (!resp.ok) {
|
|
60
|
+
const parsed = await readErrorBody(resp);
|
|
61
|
+
throw keeperError(parsed);
|
|
62
|
+
}
|
|
63
|
+
return await resp.json();
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=releaseClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releaseClient.js","sourceRoot":"","sources":["../src/releaseClient.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oCAAoC;AAEpC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAqB9D,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAA8B;IACrE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE;QAC3E,MAAM,EAAG,MAAM;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,MAAM,EAAG,GAAG,CAAC,MAAM;QACnB,IAAI,EAAK,IAAI,CAAC,SAAS,CAAC;YACtB,WAAW,EAAM,GAAG,CAAC,WAAW;YAChC,YAAY,EAAK,GAAG,CAAC,YAAY;YACjC,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,IAAI,CAAC,IAAI,EAAgC,CAAC;AACzD,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAgC;IACzE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,EAAE;QAC7E,MAAM,EAAG,MAAM;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,MAAM,EAAG,GAAG,CAAC,MAAM;QACnB,IAAI,EAAK,IAAI,CAAC,SAAS,CAAC;YACtB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,WAAW,EAAG,GAAG,CAAC,WAAW;YAC7B,MAAM,EAAQ,GAAG,CAAC,MAAM;SACzB,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,IAAI,CAAC,IAAI,EAAkC,CAAC;AAC3D,CAAC"}
|
package/build/renewClient.d.ts
CHANGED
|
@@ -1,9 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* renewClient.ts
|
|
3
|
+
*
|
|
4
|
+
* Browser-safe client for the renew flow. Mirrors `buyClient.ts` in shape:
|
|
5
|
+
* the caller drives the wallet step between `proveRenew` and `confirmRenew`
|
|
6
|
+
* so the SDK stays wallet-agnostic.
|
|
7
|
+
*
|
|
8
|
+
* Unlike buy, renew carries a legally load-bearing `waiverAccepted` flag —
|
|
9
|
+
* EU/UK CRD Article 16(m) extinguishes the 14-day right of withdrawal only
|
|
10
|
+
* on the buyer's express affirmative act (consent to immediate delivery +
|
|
11
|
+
* acknowledgment of loss of withdrawal). We refuse the /prove/renew call
|
|
12
|
+
* when the flag is false to keep third-party integrators from silently
|
|
13
|
+
* shipping a UI that omits the waiver gate.
|
|
14
|
+
*
|
|
15
|
+
* Also refused pre-network when the backend's sales-freeze schedule has
|
|
16
|
+
* fired (salesFrozen === true) — the backend would 423 the request anyway,
|
|
17
|
+
* so surfacing the specific message client-side avoids a wasted round-trip.
|
|
18
|
+
*/
|
|
19
|
+
import type { PurchaseReceipt } from './receipt.js';
|
|
1
20
|
export type ProveRenewRequest = {
|
|
21
|
+
agentConsent?: unknown;
|
|
2
22
|
keeperUrl: string;
|
|
3
23
|
licenseHash: string;
|
|
4
24
|
buyerAddress: string;
|
|
5
25
|
zkAppAddress: string;
|
|
6
|
-
|
|
26
|
+
network: 'devnet' | 'mainnet';
|
|
27
|
+
duration: 0 | 1 | 2 | 3;
|
|
7
28
|
waiverAccepted: boolean;
|
|
8
29
|
freezeAfterSlot?: number | null;
|
|
9
30
|
fetcher?: typeof fetch;
|
|
@@ -15,6 +36,7 @@ export type ProveRenewResponse = {
|
|
|
15
36
|
licenseHash: string;
|
|
16
37
|
renewAmount: string;
|
|
17
38
|
generation: number;
|
|
39
|
+
appKey: string;
|
|
18
40
|
};
|
|
19
41
|
export type ConfirmRenewRequest = {
|
|
20
42
|
keeperUrl: string;
|
|
@@ -25,17 +47,21 @@ export type ConfirmRenewRequest = {
|
|
|
25
47
|
signal?: AbortSignal;
|
|
26
48
|
};
|
|
27
49
|
export declare function proveRenew(req: ProveRenewRequest): Promise<ProveRenewResponse>;
|
|
50
|
+
/** Returns the buyer's receipt for the renewal when the keeper issued one (put it in the license file as `receipt`). */
|
|
28
51
|
export declare function confirmRenew(req: ConfirmRenewRequest): Promise<{
|
|
29
52
|
ok: true;
|
|
53
|
+
receipt?: PurchaseReceipt;
|
|
30
54
|
}>;
|
|
31
55
|
export type RenewStatus = {
|
|
32
|
-
status: 'confirmed' | 'pending' | 'unknown';
|
|
56
|
+
status: 'confirmed' | 'pending' | 'unknown' | 'failed';
|
|
57
|
+
failureReason?: string;
|
|
33
58
|
expirySlot?: number;
|
|
34
59
|
txHash?: string | null;
|
|
35
60
|
elapsedMs?: number;
|
|
36
61
|
};
|
|
37
62
|
export type PollRenewStatusOptions = {
|
|
38
63
|
keeperUrl: string;
|
|
64
|
+
network: 'devnet' | 'mainnet';
|
|
39
65
|
zkAppAddress: string;
|
|
40
66
|
licenseHash: string;
|
|
41
67
|
newExpirySlot: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renewClient.d.ts","sourceRoot":"","sources":["../src/renewClient.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,MAAM,MAAM,iBAAiB,GAAG;IAG9B,YAAY,CAAC,EAAG,OAAO,CAAC;IACxB,SAAS,EAAQ,MAAM,CAAC;IACxB,WAAW,EAAM,MAAM,CAAC;IACxB,YAAY,EAAK,MAAM,CAAC;IACxB,YAAY,EAAK,MAAM,CAAC;IAGxB,OAAO,EAAU,QAAQ,GAAG,SAAS,CAAC;IACtC,QAAQ,EAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAG/B,cAAc,EAAG,OAAO,CAAC;IAGzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAS,OAAO,KAAK,CAAC;IAC9B,MAAM,CAAC,EAAU,WAAW,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAG,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAI,MAAM,CAAC;IACtB,WAAW,EAAI,MAAM,CAAC;IAItB,UAAU,EAAK,MAAM,CAAC;IAGtB,MAAM,EAAS,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,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;AAmBF,wBAAsB,UAAU,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmCpF;AAID,wHAAwH;AACxH,wBAAsB,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAe7G;AAED,MAAM,MAAM,WAAW,GAAG;IAOxB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAM,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAG,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAM,MAAM,CAAC;IACtB,OAAO,EAAQ,QAAQ,GAAG,SAAS,CAAC;IACpC,YAAY,EAAG,MAAM,CAAC;IACtB,WAAW,EAAI,MAAM,CAAC;IAMtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAO,OAAO,KAAK,CAAC;IAG5B,UAAU,CAAC,EAAI,MAAM,CAAC;IACtB,SAAS,CAAC,EAAK,MAAM,CAAC;IACtB,MAAM,CAAC,EAAQ,WAAW,CAAC;IAC3B,MAAM,CAAC,EAAQ,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC9C,CAAC;AAMF,wBAAsB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAkDxF"}
|
package/build/renewClient.js
CHANGED
|
@@ -1,24 +1,7 @@
|
|
|
1
1
|
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
-
//
|
|
3
|
-
/**
|
|
4
|
-
* renewClient.ts
|
|
5
|
-
*
|
|
6
|
-
* Browser-safe client for the renew flow. Mirrors `buyClient.ts` in shape:
|
|
7
|
-
* the caller drives the wallet step between `proveRenew` and `confirmRenew`
|
|
8
|
-
* so the SDK stays wallet-agnostic.
|
|
9
|
-
*
|
|
10
|
-
* Unlike buy, renew carries a legally load-bearing `waiverAccepted` flag —
|
|
11
|
-
* EU/UK CRD Article 16(m) extinguishes the 14-day right of withdrawal only
|
|
12
|
-
* on the buyer's express affirmative act (consent to immediate delivery +
|
|
13
|
-
* acknowledgment of loss of withdrawal). We refuse the /prove/renew call
|
|
14
|
-
* when the flag is false to keep third-party integrators from silently
|
|
15
|
-
* shipping a UI that omits the waiver gate.
|
|
16
|
-
*
|
|
17
|
-
* Also refused pre-network when the keeper's sales-freeze schedule has
|
|
18
|
-
* fired (salesFrozen === true) — the keeper would 423 the request anyway,
|
|
19
|
-
* so surfacing the specific message client-side avoids a wasted round-trip.
|
|
20
|
-
*/
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
21
3
|
import { resolveFreezeState } from './freezeClient.js';
|
|
4
|
+
import { readErrorBody, tryQueueBusyFromBody, keeperError } from './proveErrors.js';
|
|
22
5
|
function baseUrl(url) {
|
|
23
6
|
return url.replace(/\/+$/, '');
|
|
24
7
|
}
|
|
@@ -31,10 +14,10 @@ async function readJsonError(resp) {
|
|
|
31
14
|
catch { /* body wasn't JSON */ }
|
|
32
15
|
return `HTTP ${resp.status}`;
|
|
33
16
|
}
|
|
34
|
-
// POST /prove/renew —
|
|
17
|
+
// POST /prove/renew — the backend compiles + proves the renew tx.
|
|
35
18
|
// Rejects locally when `waiverAccepted` is false; a network call in that
|
|
36
19
|
// state would be wasted work and would give the caller no signal that the
|
|
37
|
-
// legal precondition was missing. Also rejects when the
|
|
20
|
+
// legal precondition was missing. Also rejects when the backend's freeze
|
|
38
21
|
// has fired — same reasoning.
|
|
39
22
|
export async function proveRenew(req) {
|
|
40
23
|
if (req.waiverAccepted !== true) {
|
|
@@ -43,6 +26,7 @@ export async function proveRenew(req) {
|
|
|
43
26
|
const fetcher = req.fetcher ?? fetch;
|
|
44
27
|
const freeze = await resolveFreezeState({
|
|
45
28
|
keeperUrl: req.keeperUrl,
|
|
29
|
+
network: req.network,
|
|
46
30
|
freezeAfterSlot: req.freezeAfterSlot,
|
|
47
31
|
fetcher,
|
|
48
32
|
signal: req.signal,
|
|
@@ -58,15 +42,23 @@ export async function proveRenew(req) {
|
|
|
58
42
|
licenseHash: req.licenseHash,
|
|
59
43
|
buyerAddress: req.buyerAddress,
|
|
60
44
|
zkAppAddress: req.zkAppAddress,
|
|
45
|
+
network: req.network,
|
|
61
46
|
duration: req.duration,
|
|
47
|
+
...(req.agentConsent ? { agentConsent: req.agentConsent } : {}),
|
|
62
48
|
}),
|
|
63
49
|
});
|
|
64
|
-
if (!resp.ok)
|
|
65
|
-
|
|
50
|
+
if (!resp.ok) {
|
|
51
|
+
const parsed = await readErrorBody(resp);
|
|
52
|
+
const queueBusy = tryQueueBusyFromBody(parsed);
|
|
53
|
+
if (queueBusy)
|
|
54
|
+
throw queueBusy;
|
|
55
|
+
throw keeperError(parsed);
|
|
56
|
+
}
|
|
66
57
|
return await resp.json();
|
|
67
58
|
}
|
|
68
59
|
// POST /confirm/renew — promotes the in-memory renew intent to a pending
|
|
69
60
|
// LicenseRecord. Call this only after the wallet returns a txHash.
|
|
61
|
+
/** Returns the buyer's receipt for the renewal when the keeper issued one (put it in the license file as `receipt`). */
|
|
70
62
|
export async function confirmRenew(req) {
|
|
71
63
|
const fetcher = req.fetcher ?? fetch;
|
|
72
64
|
const resp = await fetcher(`${baseUrl(req.keeperUrl)}/confirm/renew`, {
|
|
@@ -81,19 +73,20 @@ export async function confirmRenew(req) {
|
|
|
81
73
|
});
|
|
82
74
|
if (!resp.ok)
|
|
83
75
|
throw new Error(await readJsonError(resp));
|
|
84
|
-
|
|
76
|
+
const body = await resp.json().catch(() => ({}));
|
|
77
|
+
return { ok: true, ...(body?.receipt ? { receipt: body.receipt } : {}) };
|
|
85
78
|
}
|
|
86
79
|
// Polls GET /license/:zkAppAddress/:licenseHash until the renew has landed
|
|
87
80
|
// on-chain (pending flipped and new expiry recorded) or the timeout fires.
|
|
88
81
|
// Mirrors pollBuyStatus, except the terminal condition is Mina-side rather
|
|
89
|
-
// than
|
|
82
|
+
// than a backend-side buy-watch — renew has no dedicated watch map.
|
|
90
83
|
export async function pollRenewStatus(opts) {
|
|
91
84
|
const fetcher = opts.fetcher ?? fetch;
|
|
92
85
|
const interval = opts.intervalMs ?? 10_000;
|
|
93
86
|
const timeout = opts.timeoutMs ?? 20 * 60 * 1000;
|
|
94
87
|
const startedAt = Date.now();
|
|
95
88
|
const deadline = startedAt + timeout;
|
|
96
|
-
const url = `${baseUrl(opts.keeperUrl)}/license/${encodeURIComponent(opts.zkAppAddress)}/${encodeURIComponent(opts.licenseHash)}`;
|
|
89
|
+
const url = `${baseUrl(opts.keeperUrl)}/license/${encodeURIComponent(opts.zkAppAddress)}/${encodeURIComponent(opts.licenseHash)}?network=${opts.network}`;
|
|
97
90
|
while (true) {
|
|
98
91
|
if (opts.signal?.aborted)
|
|
99
92
|
throw new Error('pollRenewStatus aborted');
|
|
@@ -124,8 +117,19 @@ export async function pollRenewStatus(opts) {
|
|
|
124
117
|
}
|
|
125
118
|
}
|
|
126
119
|
catch { /* transient network — try again on next tick */ }
|
|
120
|
+
// Not confirmed yet: the keeper's landing watch says whether the
|
|
121
|
+
// transaction failed on chain (a keeper without the route: 404, ignored).
|
|
122
|
+
if (status.status !== 'confirmed') {
|
|
123
|
+
try {
|
|
124
|
+
const w = await fetcher(`${baseUrl(opts.keeperUrl)}/renew/status?licenseHash=${encodeURIComponent(opts.licenseHash)}`, { signal: opts.signal });
|
|
125
|
+
const watch = w.ok ? await w.json() : null;
|
|
126
|
+
if (watch?.status === 'failed')
|
|
127
|
+
status = { ...status, status: 'failed', ...(watch.failureReason ? { failureReason: watch.failureReason } : {}) };
|
|
128
|
+
}
|
|
129
|
+
catch { /* transient — try again on next tick */ }
|
|
130
|
+
}
|
|
127
131
|
opts.onTick?.(status);
|
|
128
|
-
if (status.status === 'confirmed')
|
|
132
|
+
if (status.status === 'confirmed' || status.status === 'failed')
|
|
129
133
|
return status;
|
|
130
134
|
if (Date.now() >= deadline)
|
|
131
135
|
return status;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renewClient.js","sourceRoot":"","sources":["../src/renewClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const SEAT_NAME_COMBINATIONS: number;
|
|
2
|
+
export type SeatNameInput = {
|
|
3
|
+
licenseHash: string;
|
|
4
|
+
slotIndex: number;
|
|
5
|
+
boundAtSlot: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function seatNameFor(input: SeatNameInput): string;
|
|
8
|
+
//# sourceMappingURL=seatName.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seatName.d.ts","sourceRoot":"","sources":["../src/seatName.ts"],"names":[],"mappings":"AAwHA,eAAO,MAAM,sBAAsB,EAAE,MAA2C,CAAC;AAiCjF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAI,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAKxD"}
|