zklicensing 0.1.0-beta.2 → 0.1.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +417 -201
- package/build/agent.d.ts +371 -0
- package/build/agent.d.ts.map +1 -0
- package/build/agent.js +553 -0
- package/build/agent.js.map +1 -0
- package/build/agentActions.d.ts +841 -0
- package/build/agentActions.d.ts.map +1 -0
- package/build/agentActions.js +581 -0
- package/build/agentActions.js.map +1 -0
- package/build/agentRecord.d.ts +83 -0
- package/build/agentRecord.d.ts.map +1 -0
- package/build/agentRecord.js +69 -0
- package/build/agentRecord.js.map +1 -0
- package/build/agentVendor.d.ts +220 -0
- package/build/agentVendor.d.ts.map +1 -0
- package/build/agentVendor.js +306 -0
- package/build/agentVendor.js.map +1 -0
- package/build/appsLookup.d.ts +14 -0
- package/build/appsLookup.d.ts.map +1 -0
- package/build/appsLookup.js +12 -0
- package/build/appsLookup.js.map +1 -0
- package/build/archiveBootstrap.d.ts +31 -5
- package/build/archiveBootstrap.d.ts.map +1 -0
- package/build/archiveBootstrap.js +140 -47
- package/build/archiveBootstrap.js.map +1 -0
- package/build/atomicJson.d.ts +5 -0
- package/build/atomicJson.d.ts.map +1 -0
- package/build/atomicJson.js +55 -0
- package/build/atomicJson.js.map +1 -0
- package/build/bindClient.d.ts +85 -0
- package/build/bindClient.d.ts.map +1 -0
- package/build/bindClient.js +187 -0
- package/build/bindClient.js.map +1 -0
- package/build/buyClient.d.ts +27 -4
- package/build/buyClient.d.ts.map +1 -0
- package/build/buyClient.js +72 -26
- package/build/buyClient.js.map +1 -0
- package/build/chainHead.d.ts +61 -0
- package/build/chainHead.d.ts.map +1 -0
- package/build/chainHead.js +88 -0
- package/build/chainHead.js.map +1 -0
- package/build/compactMerkleMap.d.ts +72 -0
- package/build/compactMerkleMap.d.ts.map +1 -0
- package/build/compactMerkleMap.js +224 -0
- package/build/compactMerkleMap.js.map +1 -0
- package/build/contractInterface.d.ts +191 -51
- package/build/contractInterface.d.ts.map +1 -0
- package/build/contractInterface.js +234 -43
- package/build/contractInterface.js.map +1 -0
- package/build/contractTypes.d.ts +9 -0
- package/build/contractTypes.d.ts.map +1 -0
- package/build/contractTypes.js +28 -0
- package/build/contractTypes.js.map +1 -0
- package/build/countryStats.d.ts +12 -3
- package/build/countryStats.d.ts.map +1 -0
- package/build/countryStats.js +87 -23
- package/build/countryStats.js.map +1 -0
- package/build/deployClient.d.ts +138 -24
- package/build/deployClient.d.ts.map +1 -0
- package/build/deployClient.js +91 -31
- package/build/deployClient.js.map +1 -0
- package/build/deviceIdentity.d.ts +68 -0
- package/build/deviceIdentity.d.ts.map +1 -0
- package/build/deviceIdentity.js +209 -0
- package/build/deviceIdentity.js.map +1 -0
- package/build/freezeClient.d.ts +26 -6
- package/build/freezeClient.d.ts.map +1 -0
- package/build/freezeClient.js +30 -6
- package/build/freezeClient.js.map +1 -0
- package/build/generationClient.d.ts +6 -3
- package/build/generationClient.d.ts.map +1 -0
- package/build/generationClient.js +25 -38
- package/build/generationClient.js.map +1 -0
- package/build/holderSecret.d.ts +70 -0
- package/build/holderSecret.d.ts.map +1 -0
- package/build/holderSecret.js +76 -0
- package/build/holderSecret.js.map +1 -0
- package/build/index.d.ts +38 -38
- package/build/index.d.ts.map +1 -0
- package/build/index.js +97 -121
- package/build/index.js.map +1 -0
- package/build/keysClient.d.ts +142 -0
- package/build/keysClient.d.ts.map +1 -0
- package/build/keysClient.js +109 -0
- package/build/keysClient.js.map +1 -0
- package/build/licenseLeaf.d.ts +76 -0
- package/build/licenseLeaf.d.ts.map +1 -0
- package/build/licenseLeaf.js +189 -0
- package/build/licenseLeaf.js.map +1 -0
- package/build/licenseRecord.d.ts +68 -5
- package/build/licenseRecord.d.ts.map +1 -0
- package/build/licenseRecord.js +26 -1
- package/build/licenseRecord.js.map +1 -0
- package/build/licenseStore.d.ts +81 -4
- package/build/licenseStore.d.ts.map +1 -0
- package/build/licenseStore.js +400 -30
- package/build/licenseStore.js.map +1 -0
- package/build/licenseTrustless.d.ts +43 -0
- package/build/licenseTrustless.d.ts.map +1 -0
- package/build/licenseTrustless.js +180 -0
- package/build/licenseTrustless.js.map +1 -0
- package/build/manifestVerify.d.ts +29 -1
- package/build/manifestVerify.d.ts.map +1 -0
- package/build/manifestVerify.js +46 -4
- package/build/manifestVerify.js.map +1 -0
- package/build/minaPriceHistory.d.ts +9 -0
- package/build/minaPriceHistory.d.ts.map +1 -0
- package/build/minaPriceHistory.js +152 -0
- package/build/minaPriceHistory.js.map +1 -0
- package/build/onChainRoot.d.ts +60 -0
- package/build/onChainRoot.d.ts.map +1 -0
- package/build/onChainRoot.js +74 -0
- package/build/onChainRoot.js.map +1 -0
- package/build/ownershipLicenseHash.d.ts +25 -0
- package/build/ownershipLicenseHash.d.ts.map +1 -0
- package/build/ownershipLicenseHash.js +29 -0
- package/build/ownershipLicenseHash.js.map +1 -0
- package/build/ownershipSignature.d.ts +153 -0
- package/build/ownershipSignature.d.ts.map +1 -0
- package/build/ownershipSignature.js +297 -0
- package/build/ownershipSignature.js.map +1 -0
- package/build/permitCheckFlow.d.ts +155 -0
- package/build/permitCheckFlow.d.ts.map +1 -0
- package/build/permitCheckFlow.js +196 -0
- package/build/permitCheckFlow.js.map +1 -0
- package/build/permitDescribe.d.ts +124 -0
- package/build/permitDescribe.d.ts.map +1 -0
- package/build/permitDescribe.js +324 -0
- package/build/permitDescribe.js.map +1 -0
- package/build/permitInterface.d.ts +85 -0
- package/build/permitInterface.d.ts.map +1 -0
- package/build/permitInterface.js +121 -0
- package/build/permitInterface.js.map +1 -0
- package/build/permitMessages.d.ts +313 -0
- package/build/permitMessages.d.ts.map +1 -0
- package/build/permitMessages.js +462 -0
- package/build/permitMessages.js.map +1 -0
- package/build/permitProof.d.ts +108 -0
- package/build/permitProof.d.ts.map +1 -0
- package/build/permitProof.js +202 -0
- package/build/permitProof.js.map +1 -0
- package/build/permitRegistryRebuild.d.ts +166 -0
- package/build/permitRegistryRebuild.d.ts.map +1 -0
- package/build/permitRegistryRebuild.js +347 -0
- package/build/permitRegistryRebuild.js.map +1 -0
- package/build/permitTree.d.ts +88 -0
- package/build/permitTree.d.ts.map +1 -0
- package/build/permitTree.js +230 -0
- package/build/permitTree.js.map +1 -0
- package/build/permitsClient.d.ts +680 -0
- package/build/permitsClient.d.ts.map +1 -0
- package/build/permitsClient.js +597 -0
- package/build/permitsClient.js.map +1 -0
- package/build/proveErrors.d.ts +50 -0
- package/build/proveErrors.d.ts.map +1 -0
- package/build/proveErrors.js +76 -0
- package/build/proveErrors.js.map +1 -0
- package/build/receipt.d.ts +95 -0
- package/build/receipt.d.ts.map +1 -0
- package/build/receipt.js +84 -0
- package/build/receipt.js.map +1 -0
- package/build/refundClient.d.ts +7 -12
- package/build/refundClient.d.ts.map +1 -0
- package/build/refundClient.js +52 -21
- package/build/refundClient.js.map +1 -0
- package/build/registryTrustVerify.d.ts +78 -0
- package/build/registryTrustVerify.d.ts.map +1 -0
- package/build/registryTrustVerify.js +129 -0
- package/build/registryTrustVerify.js.map +1 -0
- package/build/releaseClient.d.ts +26 -0
- package/build/releaseClient.d.ts.map +1 -0
- package/build/releaseClient.js +65 -0
- package/build/releaseClient.js.map +1 -0
- package/build/renewClient.d.ts +28 -2
- package/build/renewClient.d.ts.map +1 -0
- package/build/renewClient.js +31 -27
- package/build/renewClient.js.map +1 -0
- package/build/seatName.d.ts +8 -0
- package/build/seatName.d.ts.map +1 -0
- package/build/seatName.js +136 -0
- package/build/seatName.js.map +1 -0
- package/build/slotConstants.d.ts +15 -0
- package/build/slotConstants.d.ts.map +1 -0
- package/build/slotConstants.js +17 -0
- package/build/slotConstants.js.map +1 -0
- package/build/statsClient.d.ts +61 -7
- package/build/statsClient.d.ts.map +1 -0
- package/build/statsClient.js +44 -5
- package/build/statsClient.js.map +1 -0
- package/build/successorChain.d.ts +35 -0
- package/build/successorChain.d.ts.map +1 -0
- package/build/successorChain.js +69 -0
- package/build/successorChain.js.map +1 -0
- package/build/taxId.d.ts +44 -0
- package/build/taxId.d.ts.map +1 -0
- package/build/taxId.js +212 -0
- package/build/taxId.js.map +1 -0
- package/build/trustAnchorVerify.d.ts +49 -0
- package/build/trustAnchorVerify.d.ts.map +1 -0
- package/build/trustAnchorVerify.js +432 -0
- package/build/trustAnchorVerify.js.map +1 -0
- package/build/trustAnchorVerifyCli.d.ts +45 -0
- package/build/trustAnchorVerifyCli.d.ts.map +1 -0
- package/build/trustAnchorVerifyCli.js +235 -0
- package/build/trustAnchorVerifyCli.js.map +1 -0
- package/build/txBroadcastClient.d.ts +26 -0
- package/build/txBroadcastClient.d.ts.map +1 -0
- package/build/txBroadcastClient.js +20 -0
- package/build/txBroadcastClient.js.map +1 -0
- package/build/unbindClient.d.ts +77 -0
- package/build/unbindClient.d.ts.map +1 -0
- package/build/unbindClient.js +169 -0
- package/build/unbindClient.js.map +1 -0
- package/build/units.d.ts +28 -0
- package/build/units.d.ts.map +1 -0
- package/build/units.js +65 -0
- package/build/units.js.map +1 -0
- package/build/vatRates.d.ts +54 -0
- package/build/vatRates.d.ts.map +1 -0
- package/build/vatRates.js +82 -0
- package/build/vatRates.js.map +1 -0
- package/build/vatRatesData.d.ts +5 -0
- package/build/vatRatesData.d.ts.map +1 -0
- package/build/vatRatesData.js +42 -0
- package/build/vatRatesData.js.map +1 -0
- package/build/vendorAccountClient.d.ts +66 -0
- package/build/vendorAccountClient.d.ts.map +1 -0
- package/build/vendorAccountClient.js +47 -0
- package/build/vendorAccountClient.js.map +1 -0
- package/build/verifyCore.d.ts +4 -1
- package/build/verifyCore.d.ts.map +1 -0
- package/build/verifyCore.js +21 -10
- package/build/verifyCore.js.map +1 -0
- package/build/verifyOffline.d.ts +85 -0
- package/build/verifyOffline.d.ts.map +1 -0
- package/build/verifyOffline.js +139 -0
- package/build/verifyOffline.js.map +1 -0
- package/build/verifyService.d.ts.map +1 -0
- package/build/verifyService.js +571 -501
- package/build/verifyService.js.map +1 -0
- package/build/verifyWithAncestors.d.ts +19 -0
- package/build/verifyWithAncestors.d.ts.map +1 -0
- package/build/verifyWithAncestors.js +127 -0
- package/build/verifyWithAncestors.js.map +1 -0
- package/build/zipToState.d.ts +2 -0
- package/build/zipToState.d.ts.map +1 -0
- package/build/zipToState.js +94 -0
- package/build/zipToState.js.map +1 -0
- package/package.json +141 -16
- package/src/agent.ts +682 -0
- package/src/agentActions.ts +637 -0
- package/src/agentRecord.ts +121 -0
- package/src/agentVendor.ts +356 -0
- package/src/appsLookup.ts +48 -0
- package/src/archiveBootstrap.ts +386 -0
- package/src/atomicJson.ts +53 -0
- package/src/bindClient.ts +297 -0
- package/src/buyClient.ts +344 -0
- package/src/chainHead.ts +106 -0
- package/src/compactMerkleMap.ts +222 -0
- package/src/contractInterface.ts +465 -0
- package/src/contractTypes.ts +31 -0
- package/src/countryStats.ts +200 -0
- package/src/deployClient.ts +517 -0
- package/src/deviceIdentity.ts +249 -0
- package/src/freezeClient.ts +162 -0
- package/src/generationClient.ts +145 -0
- package/src/holderSecret.ts +91 -0
- package/src/index.ts +362 -0
- package/src/keysClient.ts +135 -0
- package/src/licenseLeaf.ts +221 -0
- package/src/licenseRecord.ts +190 -0
- package/src/licenseStore.ts +767 -0
- package/src/licenseTrustless.ts +207 -0
- package/src/manifestVerify.ts +164 -0
- package/src/minaPriceHistory.ts +166 -0
- package/src/onChainRoot.ts +90 -0
- package/src/ownershipLicenseHash.ts +31 -0
- package/src/ownershipSignature.ts +421 -0
- package/src/permitCheckFlow.ts +227 -0
- package/src/permitDescribe.ts +362 -0
- package/src/permitInterface.ts +146 -0
- package/src/permitMessages.ts +572 -0
- package/src/permitProof.ts +230 -0
- package/src/permitRegistryRebuild.ts +423 -0
- package/src/permitTree.ts +232 -0
- package/src/permitsClient.ts +746 -0
- package/src/proveErrors.ts +98 -0
- package/src/receipt.ts +156 -0
- package/src/refundClient.ts +177 -0
- package/src/registryTrustVerify.ts +192 -0
- package/src/releaseClient.ts +101 -0
- package/src/renewClient.ts +234 -0
- package/src/seatName.ts +165 -0
- package/src/slotConstants.ts +18 -0
- package/src/statsClient.ts +249 -0
- package/src/successorChain.ts +87 -0
- package/src/taxId.ts +227 -0
- package/src/trustAnchorVerify.ts +550 -0
- package/src/trustAnchorVerifyCli.ts +234 -0
- package/src/txBroadcastClient.ts +48 -0
- package/src/unbindClient.ts +233 -0
- package/src/units.ts +74 -0
- package/src/vatRates.ts +100 -0
- package/src/vatRatesData.ts +43 -0
- package/src/vendorAccountClient.ts +120 -0
- package/src/verifyCore.ts +100 -0
- package/src/verifyOffline.ts +212 -0
- package/src/verifyService.ts +982 -0
- package/src/verifyWithAncestors.ts +163 -0
- package/src/zipToState.ts +94 -0
- package/build/licenseProof.d.ts +0 -26
- package/build/licenseProof.js +0 -41
- package/build/migrateClient.d.ts +0 -43
- package/build/migrateClient.js +0 -47
- package/build/ownership.d.ts +0 -34
- package/build/ownership.js +0 -147
package/build/taxId.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
|
+
/** EU member states, by ISO 3166-1 alpha-2 country code, with their VAT prefix and number format. */
|
|
4
|
+
const EU = {
|
|
5
|
+
AT: { prefix: 'AT', re: /^U\d{8}$/, example: 'ATU12345678' },
|
|
6
|
+
BE: { prefix: 'BE', re: /^[01]\d{9}$/, example: 'BE0123456789' },
|
|
7
|
+
BG: { prefix: 'BG', re: /^\d{9,10}$/, example: 'BG123456789' },
|
|
8
|
+
CY: { prefix: 'CY', re: /^\d{8}[A-Z]$/, example: 'CY12345678X' },
|
|
9
|
+
CZ: { prefix: 'CZ', re: /^\d{8,10}$/, example: 'CZ12345678' },
|
|
10
|
+
DE: { prefix: 'DE', re: /^\d{9}$/, example: 'DE123456789' },
|
|
11
|
+
DK: { prefix: 'DK', re: /^\d{8}$/, example: 'DK12345678' },
|
|
12
|
+
EE: { prefix: 'EE', re: /^\d{9}$/, example: 'EE123456789' },
|
|
13
|
+
GR: { prefix: 'EL', re: /^\d{9}$/, example: 'EL123456789' },
|
|
14
|
+
ES: { prefix: 'ES', re: /^[A-Z0-9]\d{7}[A-Z0-9]$/, example: 'ESX1234567X' },
|
|
15
|
+
FI: { prefix: 'FI', re: /^\d{8}$/, example: 'FI12345678' },
|
|
16
|
+
FR: { prefix: 'FR', re: /^[A-HJ-NP-Z0-9]{2}\d{9}$/, example: 'FRXX123456789' },
|
|
17
|
+
HR: { prefix: 'HR', re: /^\d{11}$/, example: 'HR12345678901' },
|
|
18
|
+
HU: { prefix: 'HU', re: /^\d{8}$/, example: 'HU12345678' },
|
|
19
|
+
IE: { prefix: 'IE', re: /^(\d{7}[A-W][A-I]?|\d[A-Z+*]\d{5}[A-W])$/, example: 'IE1234567WA' },
|
|
20
|
+
IT: { prefix: 'IT', re: /^\d{11}$/, example: 'IT12345678901' },
|
|
21
|
+
LT: { prefix: 'LT', re: /^(\d{9}|\d{12})$/, example: 'LT123456789' },
|
|
22
|
+
LU: { prefix: 'LU', re: /^\d{8}$/, example: 'LU12345678' },
|
|
23
|
+
LV: { prefix: 'LV', re: /^\d{11}$/, example: 'LV12345678901' },
|
|
24
|
+
MT: { prefix: 'MT', re: /^\d{8}$/, example: 'MT12345678' },
|
|
25
|
+
NL: { prefix: 'NL', re: /^\d{9}B\d{2}$/, example: 'NL123456789B01' },
|
|
26
|
+
PL: { prefix: 'PL', re: /^\d{10}$/, example: 'PL1234567890' },
|
|
27
|
+
PT: { prefix: 'PT', re: /^\d{9}$/, example: 'PT123456789' },
|
|
28
|
+
RO: { prefix: 'RO', re: /^\d{2,10}$/, example: 'RO1234567890' },
|
|
29
|
+
SE: { prefix: 'SE', re: /^\d{12}$/, example: 'SE123456789012' },
|
|
30
|
+
SI: { prefix: 'SI', re: /^\d{8}$/, example: 'SI12345678' },
|
|
31
|
+
SK: { prefix: 'SK', re: /^\d{10}$/, example: 'SK1234567890' },
|
|
32
|
+
};
|
|
33
|
+
/** True for the 27 EU member states (ISO codes; Greece is GR here). */
|
|
34
|
+
export function isEuCountry(country) {
|
|
35
|
+
return Object.prototype.hasOwnProperty.call(EU, String(country).toUpperCase());
|
|
36
|
+
}
|
|
37
|
+
/** An example of the expected format for `country`, for form placeholders. */
|
|
38
|
+
export function taxIdExample(country) {
|
|
39
|
+
const c = String(country).toUpperCase();
|
|
40
|
+
if (isEuCountry(c))
|
|
41
|
+
return EU[c].example;
|
|
42
|
+
return {
|
|
43
|
+
GB: 'GB123456789', NO: 'NO123456789MVA', CH: 'CHE-123.456.789 MWST', LI: 'CHE-123.456.789 MWST',
|
|
44
|
+
AU: '12 345 678 901', NZ: '123-456-789', CA: '123456789RT0001', US: '12-3456789',
|
|
45
|
+
JP: 'T1234567890123', IN: '22AAAAA0000A1Z5', SG: 'M2-1234567-8',
|
|
46
|
+
}[c] ?? 'Your national tax or VAT number';
|
|
47
|
+
}
|
|
48
|
+
const digits = (s) => [...s].map(Number);
|
|
49
|
+
function gbCheck(n) {
|
|
50
|
+
const x = digits(n.slice(0, 9));
|
|
51
|
+
const sum = x.slice(0, 7).reduce((a, v, i) => a + v * (8 - i), 0) + Number(n.slice(7, 9));
|
|
52
|
+
return sum % 97 === 0 || (sum + 55) % 97 === 0;
|
|
53
|
+
}
|
|
54
|
+
/** Weighted mod-11 check used by Norway (org. number) and Switzerland (UID). */
|
|
55
|
+
function mod11(n, weights) {
|
|
56
|
+
const x = digits(n);
|
|
57
|
+
let c = 11 - (weights.reduce((a, w, i) => a + w * x[i], 0) % 11);
|
|
58
|
+
if (c === 11)
|
|
59
|
+
c = 0;
|
|
60
|
+
return c !== 10 && c === x[weights.length];
|
|
61
|
+
}
|
|
62
|
+
function abnCheck(n) {
|
|
63
|
+
const x = digits(n);
|
|
64
|
+
x[0] -= 1;
|
|
65
|
+
return [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19].reduce((a, w, i) => a + w * x[i], 0) % 89 === 0;
|
|
66
|
+
}
|
|
67
|
+
function nzCheck(raw) {
|
|
68
|
+
const n = raw.padStart(9, '0');
|
|
69
|
+
const v = Number(n);
|
|
70
|
+
if (v < 10_000_000 || v > 150_000_000)
|
|
71
|
+
return false;
|
|
72
|
+
const x = digits(n);
|
|
73
|
+
const calc = (w) => { const r = w.reduce((a, k, i) => a + k * x[i], 0) % 11; return r === 0 ? 0 : 11 - r; };
|
|
74
|
+
let c = calc([3, 2, 7, 6, 5, 4, 3, 2]);
|
|
75
|
+
if (c === 10)
|
|
76
|
+
c = calc([7, 4, 3, 2, 5, 2, 7, 6]);
|
|
77
|
+
return c !== 10 && c === x[8];
|
|
78
|
+
}
|
|
79
|
+
function luhn(n) {
|
|
80
|
+
let s = 0;
|
|
81
|
+
[...n].reverse().forEach((ch, i) => { let v = Number(ch); if (i % 2) {
|
|
82
|
+
v *= 2;
|
|
83
|
+
if (v > 9)
|
|
84
|
+
v -= 9;
|
|
85
|
+
} s += v; });
|
|
86
|
+
return s % 10 === 0;
|
|
87
|
+
}
|
|
88
|
+
const B36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
89
|
+
function gstinCheck(g) {
|
|
90
|
+
let s = 0;
|
|
91
|
+
for (let i = 0; i < 14; i++) {
|
|
92
|
+
const p = B36.indexOf(g[i]) * (i % 2 === 0 ? 1 : 2);
|
|
93
|
+
s += Math.floor(p / 36) + (p % 36);
|
|
94
|
+
}
|
|
95
|
+
return B36[(36 - (s % 36)) % 36] === g[14];
|
|
96
|
+
}
|
|
97
|
+
// IRS campus prefixes never issued for an EIN.
|
|
98
|
+
const EIN_INVALID_PREFIXES = new Set(['00', '07', '08', '09', '17', '18', '19', '28', '29', '49', '69', '70', '78', '79', '89', '96', '97']);
|
|
99
|
+
/**
|
|
100
|
+
* Checks `taxId` for a vendor in `country` (ISO 3166-1 alpha-2): the format
|
|
101
|
+
* and, where the scheme has one, the check digit. Spaces, dots and dashes
|
|
102
|
+
* are ignored; letters are upper-cased.
|
|
103
|
+
*/
|
|
104
|
+
export function checkTaxId(country, taxId) {
|
|
105
|
+
const c = String(country ?? '').trim().toUpperCase();
|
|
106
|
+
const raw = String(taxId ?? '').trim().toUpperCase();
|
|
107
|
+
const compact = raw.replace(/[\s.\-]/g, '');
|
|
108
|
+
const fail = (scheme, error) => ({ ok: false, scheme, error, example: taxIdExample(c) });
|
|
109
|
+
if (!compact)
|
|
110
|
+
return fail('other', 'A tax ID is required');
|
|
111
|
+
if (compact.length > 30)
|
|
112
|
+
return fail('other', 'The tax ID is too long');
|
|
113
|
+
if (isEuCountry(c)) {
|
|
114
|
+
const { prefix, re } = EU[c];
|
|
115
|
+
// The country prefix is optional on input (some numbers, e.g. Spanish,
|
|
116
|
+
// may themselves start with a letter, so test the body as given too).
|
|
117
|
+
const body = compact.startsWith(prefix) && re.test(compact.slice(prefix.length)) ? compact.slice(prefix.length) : compact;
|
|
118
|
+
if (!re.test(body)) {
|
|
119
|
+
return fail('eu-vat', /^[A-Z]{2}/.test(compact) && !compact.startsWith(prefix)
|
|
120
|
+
? `A VAT number for ${c} starts with ${prefix}` : `Not a valid ${c} VAT number`);
|
|
121
|
+
}
|
|
122
|
+
return { ok: true, scheme: 'eu-vat', normalized: prefix + body, vies: { countryCode: prefix, number: body } };
|
|
123
|
+
}
|
|
124
|
+
switch (c) {
|
|
125
|
+
case 'GB': {
|
|
126
|
+
const b = compact.replace(/^GB/, '');
|
|
127
|
+
if (/^(GD|HA)\d{3}$/.test(b))
|
|
128
|
+
return { ok: true, scheme: 'gb-vat', normalized: 'GB' + b };
|
|
129
|
+
if (!/^(\d{9}|\d{12})$/.test(b))
|
|
130
|
+
return fail('gb-vat', 'A UK VAT number is GB and 9 or 12 digits');
|
|
131
|
+
if (!gbCheck(b))
|
|
132
|
+
return fail('gb-vat', 'The UK VAT number\'s check digits are wrong');
|
|
133
|
+
return { ok: true, scheme: 'gb-vat', normalized: 'GB' + b };
|
|
134
|
+
}
|
|
135
|
+
case 'NO': {
|
|
136
|
+
const b = compact.replace(/^NO/, '').replace(/MVA$/, '');
|
|
137
|
+
if (!/^\d{9}$/.test(b))
|
|
138
|
+
return fail('no-mva', 'A Norwegian VAT number is 9 digits followed by MVA');
|
|
139
|
+
if (!mod11(b, [3, 2, 7, 6, 5, 4, 3, 2]))
|
|
140
|
+
return fail('no-mva', 'The organisation number\'s check digit is wrong');
|
|
141
|
+
return { ok: true, scheme: 'no-mva', normalized: `NO${b}MVA` };
|
|
142
|
+
}
|
|
143
|
+
case 'CH':
|
|
144
|
+
case 'LI': {
|
|
145
|
+
const m = /^CHE(\d{9})(MWST|TVA|IVA|MVA)?$/.exec(compact);
|
|
146
|
+
if (!m)
|
|
147
|
+
return fail('ch-uid', 'A Swiss VAT number is CHE-123.456.789 MWST');
|
|
148
|
+
if (!mod11(m[1], [5, 4, 3, 2, 7, 6, 5, 4]))
|
|
149
|
+
return fail('ch-uid', 'The UID\'s check digit is wrong');
|
|
150
|
+
const d = m[1];
|
|
151
|
+
return { ok: true, scheme: 'ch-uid', normalized: `CHE-${d.slice(0, 3)}.${d.slice(3, 6)}.${d.slice(6)} ${m[2] ?? 'MWST'}` };
|
|
152
|
+
}
|
|
153
|
+
case 'AU': {
|
|
154
|
+
const b = compact.replace(/^ABN/, '');
|
|
155
|
+
if (!/^\d{11}$/.test(b))
|
|
156
|
+
return fail('au-abn', 'An ABN is 11 digits');
|
|
157
|
+
if (!abnCheck(b))
|
|
158
|
+
return fail('au-abn', 'The ABN\'s check digits are wrong');
|
|
159
|
+
return { ok: true, scheme: 'au-abn', normalized: `${b.slice(0, 2)} ${b.slice(2, 5)} ${b.slice(5, 8)} ${b.slice(8)}` };
|
|
160
|
+
}
|
|
161
|
+
case 'NZ': {
|
|
162
|
+
if (!/^\d{8,9}$/.test(compact))
|
|
163
|
+
return fail('nz-gst', 'A New Zealand GST number is 8 or 9 digits');
|
|
164
|
+
if (!nzCheck(compact))
|
|
165
|
+
return fail('nz-gst', 'The GST number\'s check digit is wrong');
|
|
166
|
+
const n = compact.padStart(9, '0');
|
|
167
|
+
return { ok: true, scheme: 'nz-gst', normalized: `${n.slice(0, 3)}-${n.slice(3, 6)}-${n.slice(6)}` };
|
|
168
|
+
}
|
|
169
|
+
case 'CA': {
|
|
170
|
+
const m = /^(\d{9})(RT\d{4})?$/.exec(compact);
|
|
171
|
+
if (!m)
|
|
172
|
+
return fail('ca-bn', 'A Canadian business number is 9 digits, optionally followed by RT0001');
|
|
173
|
+
if (!luhn(m[1]))
|
|
174
|
+
return fail('ca-bn', 'The business number\'s check digit is wrong');
|
|
175
|
+
return { ok: true, scheme: 'ca-bn', normalized: m[1] + (m[2] ?? '') };
|
|
176
|
+
}
|
|
177
|
+
case 'US': {
|
|
178
|
+
if (!/^\d{9}$/.test(compact))
|
|
179
|
+
return fail('us-ein', 'An EIN is 9 digits (12-3456789)');
|
|
180
|
+
if (EIN_INVALID_PREFIXES.has(compact.slice(0, 2)))
|
|
181
|
+
return fail('us-ein', 'No EIN starts with ' + compact.slice(0, 2));
|
|
182
|
+
return { ok: true, scheme: 'us-ein', normalized: `${compact.slice(0, 2)}-${compact.slice(2)}` };
|
|
183
|
+
}
|
|
184
|
+
case 'JP': {
|
|
185
|
+
// Format only: T and the 13-digit corporate number.
|
|
186
|
+
const b = compact.replace(/^T/, '');
|
|
187
|
+
if (!/^\d{13}$/.test(b))
|
|
188
|
+
return fail('jp-invoice', 'A Japanese registration number is T and 13 digits');
|
|
189
|
+
return { ok: true, scheme: 'jp-invoice', normalized: 'T' + b };
|
|
190
|
+
}
|
|
191
|
+
case 'IN': {
|
|
192
|
+
if (!/^\d{2}[A-Z]{5}\d{4}[A-Z][1-9A-Z]Z[0-9A-Z]$/.test(compact))
|
|
193
|
+
return fail('in-gstin', 'A GSTIN is 15 characters, like 22AAAAA0000A1Z5');
|
|
194
|
+
if (!gstinCheck(compact))
|
|
195
|
+
return fail('in-gstin', 'The GSTIN\'s check character is wrong');
|
|
196
|
+
return { ok: true, scheme: 'in-gstin', normalized: compact };
|
|
197
|
+
}
|
|
198
|
+
case 'SG': {
|
|
199
|
+
if (!/^(M[2-9A-Z]\d{7}[0-9A-Z]|\d{8,9}[A-Z]|[TSR]\d{2}[A-Z]{2}\d{4}[A-Z])$/.test(compact)) {
|
|
200
|
+
return fail('sg-gst', 'Not a Singapore GST registration number');
|
|
201
|
+
}
|
|
202
|
+
return { ok: true, scheme: 'sg-gst', normalized: compact };
|
|
203
|
+
}
|
|
204
|
+
default: {
|
|
205
|
+
// No known format: accept sensible input for an admin to review.
|
|
206
|
+
if (!/^[A-Z0-9]{4,30}$/.test(compact))
|
|
207
|
+
return fail('other', 'Use letters and digits only');
|
|
208
|
+
return { ok: true, scheme: 'other', normalized: raw.replace(/\s+/g, ' '), review: true };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=taxId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxId.js","sourceRoot":"","sources":["../src/taxId.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oCAAoC;AAkCpC,qGAAqG;AACrG,MAAM,EAAE,GAAoE;IAC1E,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;IAC5D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE;IAChE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE;IAC9D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE;IAChE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE;IAC7D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE;IAC3D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE;IAC3D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE;IAC3D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,yBAAyB,EAAE,OAAO,EAAE,aAAa,EAAE;IAC3E,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,0BAA0B,EAAE,OAAO,EAAE,eAAe,EAAE;IAC9E,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE;IAC9D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,0CAA0C,EAAE,OAAO,EAAE,aAAa,EAAE;IAC5F,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE;IAC9D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE;IACpE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE;IAC9D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE;IACpE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE;IAC7D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE;IAC3D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE;IAC/D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE;IAC/D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE;CAC9D,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,WAAW,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACzC,OAAQ;QACN,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,sBAAsB;QAC/F,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,YAAY;QAChF,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,cAAc;KACrC,CAAC,CAAC,CAAC,IAAI,iCAAiC,CAAC;AACvE,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAEjD,SAAS,OAAO,CAAC,CAAS;IACxB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,gFAAgF;AAChF,SAAS,KAAK,CAAC,CAAS,EAAE,OAAiB;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE;QAAE,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACV,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,WAAW;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,CAAC,CAAW,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtH,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE;QAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,IAAI,CAAC,CAAS;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAAC,CAAC,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,GAAG,CAAC;YAAE,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,GAAG,GAAG,sCAAsC,CAAC;AACnD,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,+CAA+C;AAC/C,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAE7I;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,KAAa;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,CAAC,MAAmB,EAAE,KAAa,EAAe,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3H,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAExE,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,uEAAuE;QACvE,sEAAsE;QACtE,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1H,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC5E,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;IAChH,CAAC;IAED,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1F,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;YACnG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;YACtF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;QAC9D,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,oDAAoD,CAAC,CAAC;YACpG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,iDAAiD,CAAC,CAAC;YAClH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACjE,CAAC;QACD,KAAK,IAAI,CAAC;QAAC,KAAK,IAAI,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,4CAA4C,CAAC,CAAC;YAC5E,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAC;YACrG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC;QAC7H,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YAC7E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACxH,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,2CAA2C,CAAC,CAAC;YACnG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;YACvF,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACnC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACvG,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,EAAE,uEAAuE,CAAC,CAAC;YACtG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,EAAE,6CAA6C,CAAC,CAAC;YACrF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACxE,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAC;YACvF,IAAI,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClG,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,oDAAoD;YACpD,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,YAAY,EAAE,mDAAmD,CAAC,CAAC;YACxG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACjE,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,IAAI,CAAC,4CAA4C,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,UAAU,EAAE,gDAAgD,CAAC,CAAC;YAC3I,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,UAAU,EAAE,uCAAuC,CAAC,CAAC;YAC3F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QAC/D,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,IAAI,CAAC,sEAAsE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1F,OAAO,IAAI,CAAC,QAAQ,EAAE,yCAAyC,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,iEAAiE;YACjE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC;YAC3F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type Finding = {
|
|
2
|
+
/** Machine-readable check identifier, stable across releases. */
|
|
3
|
+
name: string;
|
|
4
|
+
/** True iff the check passed. */
|
|
5
|
+
ok: boolean;
|
|
6
|
+
/** Human-readable one-line summary or reason. */
|
|
7
|
+
detail: string;
|
|
8
|
+
};
|
|
9
|
+
export type TrustAnchorReport = {
|
|
10
|
+
/** True iff every finding is ok. */
|
|
11
|
+
ok: boolean;
|
|
12
|
+
origin: string;
|
|
13
|
+
/** Address that was checked. Echoed from opts.address. */
|
|
14
|
+
address: string;
|
|
15
|
+
/** appId as declared in the signed manifest payload. Undefined if the fetch/signature failed. */
|
|
16
|
+
appId?: string;
|
|
17
|
+
/** Generation index the address maps to in the signed manifest (1-based). */
|
|
18
|
+
generation?: number;
|
|
19
|
+
findings: Finding[];
|
|
20
|
+
};
|
|
21
|
+
export interface VerifyTrustAnchorOpts {
|
|
22
|
+
/** Vendor origin, e.g. `https://store.example.com`. HTTPS required. */
|
|
23
|
+
origin: string;
|
|
24
|
+
/** zkApp address (base58 PublicKey) — the manifest lives at `/.well-known/zklicensing/<address>.json`. */
|
|
25
|
+
address: string;
|
|
26
|
+
/** Platform manifest Ed25519 public keys (base64). Comma-list from `VITE_MANIFEST_PUBKEYS`. */
|
|
27
|
+
pinnedPublicKeysBase64: readonly string[];
|
|
28
|
+
/** Mina GraphQL endpoint for on-chain reads. Ignored when `skipChainChecks` is true. */
|
|
29
|
+
minaGraphqlUrl?: string;
|
|
30
|
+
/** Optional Mina networkId — 'mainnet' or 'testnet'. Defaults to 'mainnet'. */
|
|
31
|
+
minaNetworkId?: 'mainnet' | 'testnet' | 'devnet';
|
|
32
|
+
/** Fetch timeout in ms for the manifest fetch. Default 15000. */
|
|
33
|
+
fetchTimeoutMs?: number;
|
|
34
|
+
/** When true, skips all `chain_*` checks. Useful for manifest-only audits. */
|
|
35
|
+
skipChainChecks?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* When true, runs an extra `manifest_matches_backend` finding: fetch the
|
|
38
|
+
* same signed payload from `https://zklicensing.com/apps/by-address/{address}`,
|
|
39
|
+
* verify it against the same pinned keys, then byte-compare canonicalized
|
|
40
|
+
* payloads (minus `signature`, `publicKey`, `issuedAt`, `app`). Catches a
|
|
41
|
+
* vendor serving a stale/rolled-back manifest even when its own signature
|
|
42
|
+
* is still valid. Not on by default — adds a second network fetch and
|
|
43
|
+
* couples the verifier to zklicensing.com being reachable.
|
|
44
|
+
*/
|
|
45
|
+
crossCheck?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare function permToString(p: any): string | undefined;
|
|
48
|
+
export declare function verifyTrustAnchor(opts: VerifyTrustAnchorOpts): Promise<TrustAnchorReport>;
|
|
49
|
+
//# sourceMappingURL=trustAnchorVerify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trustAnchorVerify.d.ts","sourceRoot":"","sources":["../src/trustAnchorVerify.ts"],"names":[],"mappings":"AA4DA,MAAM,MAAM,OAAO,GAAG;IACpB,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oCAAoC;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,OAAO,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,sBAAsB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAuLD,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS,CAWvD;AAyCD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+M/F"}
|