@zanii/kyb 0.1.1 → 0.1.2
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 +4 -0
- package/dist/entity.d.ts +183 -0
- package/dist/entity.d.ts.map +1 -0
- package/dist/entity.js +151 -0
- package/dist/entity.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/entity.ts +151 -0
- package/src/index.ts +1 -0
package/README.md
CHANGED
|
@@ -54,3 +54,7 @@ solvent, or is lawfully named. Real KYB (registry checks, sanctions, UBO) is an
|
|
|
54
54
|
off-protocol process this package makes *auditable*: the attestation is signed and
|
|
55
55
|
permanent, so a false claim is attributable forever. We verify domain control; we
|
|
56
56
|
never certify companies — the `@zanii/credentials` posture, unchanged.
|
|
57
|
+
|
|
58
|
+
## Changelog
|
|
59
|
+
|
|
60
|
+
- **0.1.2** — Entity checks: ISO 17442 `isValidLei`, `checkRegistry` against GLEIF or a company register you supply (failing closed), committed beneficial-ownership declarations (`declareUbo` / `verifyUboReveal`), `signatoryAuthority` / `mayAuthorise`, DNS TXT bindings, `lifecycleEvent` / `entityStatus`, signed `groupStructure`s, `verifyLicence` against a regulator's register, reusable `kybCertificate`s and `domainDocChanges` monitoring.
|
package/dist/entity.d.ts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { type SignedObject } from '@zanii/core';
|
|
2
|
+
import { type FetchLike, type LegalEntity, type OwnerDoc } from './index.js';
|
|
3
|
+
/** ISO 17442: 20 characters, the last two check digits by ISO 7064 mod 97-10. */
|
|
4
|
+
export declare function isValidLei(lei: string): boolean;
|
|
5
|
+
/** Check an entity against a registry or GLEIF record you fetch: name (normalised) and, if given, jurisdiction must agree. */
|
|
6
|
+
export declare function checkRegistry(entity: LegalEntity & {
|
|
7
|
+
lei?: string;
|
|
8
|
+
}, lookup: (id: string) => Promise<{
|
|
9
|
+
name: string;
|
|
10
|
+
jurisdiction?: string;
|
|
11
|
+
status?: string;
|
|
12
|
+
} | null>): Promise<{
|
|
13
|
+
ok: boolean;
|
|
14
|
+
reasons: string[];
|
|
15
|
+
}>;
|
|
16
|
+
export type UboDeclaration = SignedObject<{
|
|
17
|
+
v: 1;
|
|
18
|
+
type: 'kyb.ubo';
|
|
19
|
+
entity: string;
|
|
20
|
+
owners: Array<{
|
|
21
|
+
commitment: string;
|
|
22
|
+
share_pct: number;
|
|
23
|
+
}>;
|
|
24
|
+
ts: string;
|
|
25
|
+
}>;
|
|
26
|
+
/** Beneficial owners declared as salted commitments with their shares; reveal one owner to one verifier later. */
|
|
27
|
+
export declare function declareUbo(entity: string, owners: Array<{
|
|
28
|
+
name: string;
|
|
29
|
+
share_pct: number;
|
|
30
|
+
}>, ownerPrivateKey: Uint8Array, ts?: string): {
|
|
31
|
+
declaration: SignedObject<{
|
|
32
|
+
v: 1;
|
|
33
|
+
type: "kyb.ubo";
|
|
34
|
+
entity: string;
|
|
35
|
+
owners: {
|
|
36
|
+
commitment: string;
|
|
37
|
+
share_pct: number;
|
|
38
|
+
}[];
|
|
39
|
+
ts: string;
|
|
40
|
+
}>;
|
|
41
|
+
reveal: (i: number) => {
|
|
42
|
+
name: string;
|
|
43
|
+
salt: string;
|
|
44
|
+
index: number;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
/** Check a revealed owner against the signed declaration. */
|
|
48
|
+
export declare function verifyUboReveal(d: UboDeclaration, reveal: {
|
|
49
|
+
name: string;
|
|
50
|
+
salt: string;
|
|
51
|
+
index: number;
|
|
52
|
+
}): boolean;
|
|
53
|
+
export type SignatoryAuthority = SignedObject<{
|
|
54
|
+
v: 1;
|
|
55
|
+
type: 'kyb.signatory';
|
|
56
|
+
entity: string;
|
|
57
|
+
person: string;
|
|
58
|
+
scopes: string[];
|
|
59
|
+
limit_minor?: string;
|
|
60
|
+
exp: string;
|
|
61
|
+
ts: string;
|
|
62
|
+
}>;
|
|
63
|
+
/** The entity's owner key authorises a person to grant delegations on its behalf, within scopes and until a date. */
|
|
64
|
+
export declare function signatoryAuthority(input: {
|
|
65
|
+
entity: string;
|
|
66
|
+
person: string;
|
|
67
|
+
scopes: string[];
|
|
68
|
+
limit_minor?: string;
|
|
69
|
+
exp: string;
|
|
70
|
+
ts?: string;
|
|
71
|
+
}, ownerPrivateKey: Uint8Array): SignatoryAuthority;
|
|
72
|
+
export declare function mayAuthorise(a: SignatoryAuthority, ownerDid: string, person: string, scope: string, now?: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* The domain's DNS TXT record names the owner DID (`zanii-owner=did:key:...`). Use a
|
|
75
|
+
* DNSSEC-validating resolver for `resolveTxt`; this checks what it returns.
|
|
76
|
+
*/
|
|
77
|
+
export declare function dnsTxtBinding(domain: string, did: string, resolveTxt: (name: string) => Promise<string[][]>): Promise<{
|
|
78
|
+
ok: boolean;
|
|
79
|
+
records: string[];
|
|
80
|
+
error?: undefined;
|
|
81
|
+
} | {
|
|
82
|
+
ok: boolean;
|
|
83
|
+
records: string[];
|
|
84
|
+
error: string;
|
|
85
|
+
}>;
|
|
86
|
+
export type LifecycleEvent = SignedObject<{
|
|
87
|
+
v: 1;
|
|
88
|
+
type: 'kyb.lifecycle';
|
|
89
|
+
entity: string;
|
|
90
|
+
event: 'renamed' | 'merged' | 'acquired' | 'dissolved';
|
|
91
|
+
successor?: string;
|
|
92
|
+
ts: string;
|
|
93
|
+
}>;
|
|
94
|
+
export declare function lifecycleEvent(input: {
|
|
95
|
+
entity: string;
|
|
96
|
+
event: LifecycleEvent['event'];
|
|
97
|
+
successor?: string;
|
|
98
|
+
ts?: string;
|
|
99
|
+
}, ownerPrivateKey: Uint8Array): LifecycleEvent;
|
|
100
|
+
/** The entity's current standing after its lifecycle events: active, succeeded by another, or dissolved. */
|
|
101
|
+
export declare function entityStatus(events: LifecycleEvent[], ownerDid: string): {
|
|
102
|
+
status: "active";
|
|
103
|
+
since?: undefined;
|
|
104
|
+
successor?: undefined;
|
|
105
|
+
} | {
|
|
106
|
+
status: "dissolved";
|
|
107
|
+
since: string;
|
|
108
|
+
successor?: undefined;
|
|
109
|
+
} | {
|
|
110
|
+
status: "succeeded";
|
|
111
|
+
successor: string | null;
|
|
112
|
+
since: string;
|
|
113
|
+
};
|
|
114
|
+
export type GroupStructure = SignedObject<{
|
|
115
|
+
v: 1;
|
|
116
|
+
type: 'kyb.group';
|
|
117
|
+
parent: string;
|
|
118
|
+
subsidiaries: Array<{
|
|
119
|
+
name: string;
|
|
120
|
+
domain?: string;
|
|
121
|
+
ownership_pct: number;
|
|
122
|
+
}>;
|
|
123
|
+
ts: string;
|
|
124
|
+
}>;
|
|
125
|
+
export declare function groupStructure(input: {
|
|
126
|
+
parent: string;
|
|
127
|
+
subsidiaries: Array<{
|
|
128
|
+
name: string;
|
|
129
|
+
domain?: string;
|
|
130
|
+
ownership_pct: number;
|
|
131
|
+
}>;
|
|
132
|
+
ts?: string;
|
|
133
|
+
}, parentPrivateKey: Uint8Array): GroupStructure;
|
|
134
|
+
/** Is this domain a controlled (> 50%) subsidiary in the signed group structure? */
|
|
135
|
+
export declare function isControlledSubsidiary(g: GroupStructure, domain: string): boolean;
|
|
136
|
+
/** A licence claim checked against the regulator's register you supply. */
|
|
137
|
+
export declare function verifyLicence(licence: {
|
|
138
|
+
regulator: string;
|
|
139
|
+
number: string;
|
|
140
|
+
activity: string;
|
|
141
|
+
entity: string;
|
|
142
|
+
}, register: (regulator: string, number: string) => Promise<{
|
|
143
|
+
holder: string;
|
|
144
|
+
activities: string[];
|
|
145
|
+
exp?: string;
|
|
146
|
+
} | null>, now?: string): Promise<{
|
|
147
|
+
ok: boolean;
|
|
148
|
+
reason: string;
|
|
149
|
+
} | {
|
|
150
|
+
ok: boolean;
|
|
151
|
+
reason?: undefined;
|
|
152
|
+
}>;
|
|
153
|
+
export type KybCertificate = SignedObject<{
|
|
154
|
+
v: 1;
|
|
155
|
+
type: 'kyb.certificate';
|
|
156
|
+
ownerDid: string;
|
|
157
|
+
entity: LegalEntity;
|
|
158
|
+
checks: string[];
|
|
159
|
+
validUntil: string;
|
|
160
|
+
ts: string;
|
|
161
|
+
}>;
|
|
162
|
+
/** A verifier's signed, reusable KYB result, so the next counterparty need not repeat it. */
|
|
163
|
+
export declare function kybCertificate(input: {
|
|
164
|
+
ownerDid: string;
|
|
165
|
+
entity: LegalEntity;
|
|
166
|
+
checks: string[];
|
|
167
|
+
validDays: number;
|
|
168
|
+
ts?: string;
|
|
169
|
+
}, verifierPrivateKey: Uint8Array): KybCertificate;
|
|
170
|
+
export declare function acceptKybCertificate(c: KybCertificate, opts: {
|
|
171
|
+
ownerDid: string;
|
|
172
|
+
trustedVerifiers: string[];
|
|
173
|
+
now?: string;
|
|
174
|
+
}): boolean;
|
|
175
|
+
/** Re-fetch a domain's owner document and report what changed since the last check. */
|
|
176
|
+
export declare function domainDocChanges(domain: string, previous: OwnerDoc | null, fetchImpl?: FetchLike): Promise<{
|
|
177
|
+
current: null;
|
|
178
|
+
changes: string[];
|
|
179
|
+
} | {
|
|
180
|
+
current: OwnerDoc;
|
|
181
|
+
changes: string[];
|
|
182
|
+
}>;
|
|
183
|
+
//# sourceMappingURL=entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"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"}
|
package/dist/entity.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Know-your-business beyond the domain binding: LEI checks and GLEIF lookups, company
|
|
3
|
+
* registry comparison, committed beneficial-ownership declarations, signatory authority,
|
|
4
|
+
* DNS TXT bindings, entity lifecycle events, group structures, licences, reusable KYB
|
|
5
|
+
* certificates and continuous monitoring of the published owner document.
|
|
6
|
+
*
|
|
7
|
+
* Zanii verifies signatures and consistency; registries, GLEIF, DNS and regulators remain
|
|
8
|
+
* the sources of truth, reached through functions you supply.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
11
|
+
import { jcsHash, signObject, verifySignedObject } from '@zanii/core';
|
|
12
|
+
import { resolveOwnerDoc } from './index.js';
|
|
13
|
+
/** ISO 17442: 20 characters, the last two check digits by ISO 7064 mod 97-10. */
|
|
14
|
+
export function isValidLei(lei) {
|
|
15
|
+
if (!/^[A-Z0-9]{18}\d{2}$/.test(lei))
|
|
16
|
+
return false;
|
|
17
|
+
const digits = lei.split('').map((c) => (/\d/.test(c) ? c : String(c.charCodeAt(0) - 55))).join('');
|
|
18
|
+
let rem = 0;
|
|
19
|
+
for (const d of digits)
|
|
20
|
+
rem = (rem * 10 + Number(d)) % 97;
|
|
21
|
+
return rem === 1;
|
|
22
|
+
}
|
|
23
|
+
const norm = (s) => s.toLowerCase().replace(/\./g, '').normalize('NFKD').replace(/[̀-ͯ]/g, '').replace(/\b(llc|ltd|inc|plc|fz-?llc|fzco|fze|pjsc|llp|co|limited|company)\b\.?/g, '').replace(/[^a-z0-9-ۿ]+/g, ' ').trim();
|
|
24
|
+
/** Check an entity against a registry or GLEIF record you fetch: name (normalised) and, if given, jurisdiction must agree. */
|
|
25
|
+
export async function checkRegistry(entity, lookup) {
|
|
26
|
+
const id = entity.lei ?? entity.registration;
|
|
27
|
+
if (!id)
|
|
28
|
+
return { ok: false, reasons: ['no LEI or registration number to look up'] };
|
|
29
|
+
if (entity.lei && !isValidLei(entity.lei))
|
|
30
|
+
return { ok: false, reasons: ['LEI checksum is invalid'] };
|
|
31
|
+
try {
|
|
32
|
+
const rec = await lookup(id);
|
|
33
|
+
const reasons = [];
|
|
34
|
+
if (!rec)
|
|
35
|
+
reasons.push('not found in the registry');
|
|
36
|
+
else {
|
|
37
|
+
if (norm(rec.name) !== norm(entity.name))
|
|
38
|
+
reasons.push(`registry name "${rec.name}" does not match "${entity.name}"`);
|
|
39
|
+
if (entity.jurisdiction && rec.jurisdiction && rec.jurisdiction !== entity.jurisdiction)
|
|
40
|
+
reasons.push(`jurisdiction ${rec.jurisdiction} differs`);
|
|
41
|
+
if (rec.status && !/^(active|issued)$/i.test(rec.status))
|
|
42
|
+
reasons.push(`registry status is ${rec.status}`);
|
|
43
|
+
}
|
|
44
|
+
return { ok: reasons.length === 0, reasons };
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
return { ok: false, reasons: [`registry unavailable: ${err.message}`] };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Beneficial owners declared as salted commitments with their shares; reveal one owner to one verifier later. */
|
|
51
|
+
export function declareUbo(entity, owners, ownerPrivateKey, ts = new Date().toISOString()) {
|
|
52
|
+
const total = owners.reduce((s, o) => s + o.share_pct, 0);
|
|
53
|
+
if (total > 100.0001)
|
|
54
|
+
throw new Error(`kyb: shares add up to ${total}%`);
|
|
55
|
+
const salts = owners.map(() => randomBytes(16).toString('hex'));
|
|
56
|
+
const commit = (name, salt) => 'sha256:' + createHash('sha256').update(`${salt}\u0000${name.trim().toLowerCase()}`).digest('hex');
|
|
57
|
+
const declaration = signObject({ v: 1, type: 'kyb.ubo', entity, owners: owners.map((o, i) => ({ commitment: commit(o.name, salts[i]), share_pct: o.share_pct })), ts }, ownerPrivateKey);
|
|
58
|
+
return { declaration, reveal: (i) => ({ name: owners[i].name, salt: salts[i], index: i }) };
|
|
59
|
+
}
|
|
60
|
+
/** Check a revealed owner against the signed declaration. */
|
|
61
|
+
export function verifyUboReveal(d, reveal) {
|
|
62
|
+
const c = 'sha256:' + createHash('sha256').update(`${reveal.salt}\u0000${reveal.name.trim().toLowerCase()}`).digest('hex');
|
|
63
|
+
return verifySignedObject(d) && d.owners[reveal.index]?.commitment === c;
|
|
64
|
+
}
|
|
65
|
+
/** The entity's owner key authorises a person to grant delegations on its behalf, within scopes and until a date. */
|
|
66
|
+
export function signatoryAuthority(input, ownerPrivateKey) {
|
|
67
|
+
return signObject({ v: 1, type: 'kyb.signatory', ...input, ts: input.ts ?? new Date().toISOString() }, ownerPrivateKey);
|
|
68
|
+
}
|
|
69
|
+
export function mayAuthorise(a, ownerDid, person, scope, now = new Date().toISOString()) {
|
|
70
|
+
return verifySignedObject(a) && a.signer === ownerDid && a.person === person && now <= a.exp && a.scopes.some((s) => s === '*' || s === scope || (s.endsWith('.*') && scope.startsWith(s.slice(0, -1))));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The domain's DNS TXT record names the owner DID (`zanii-owner=did:key:...`). Use a
|
|
74
|
+
* DNSSEC-validating resolver for `resolveTxt`; this checks what it returns.
|
|
75
|
+
*/
|
|
76
|
+
export async function dnsTxtBinding(domain, did, resolveTxt) {
|
|
77
|
+
try {
|
|
78
|
+
const records = (await resolveTxt(`_zanii.${domain}`)).map((r) => r.join(''));
|
|
79
|
+
return { ok: records.includes(`zanii-owner=${did}`), records };
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
return { ok: false, records: [], error: err.message };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export function lifecycleEvent(input, ownerPrivateKey) {
|
|
86
|
+
return signObject({ v: 1, type: 'kyb.lifecycle', ...input, ts: input.ts ?? new Date().toISOString() }, ownerPrivateKey);
|
|
87
|
+
}
|
|
88
|
+
/** The entity's current standing after its lifecycle events: active, succeeded by another, or dissolved. */
|
|
89
|
+
export function entityStatus(events, ownerDid) {
|
|
90
|
+
const valid = events.filter((e) => verifySignedObject(e) && e.signer === ownerDid).sort((a, b) => a.ts.localeCompare(b.ts));
|
|
91
|
+
const last = valid.at(-1);
|
|
92
|
+
if (!last)
|
|
93
|
+
return { status: 'active' };
|
|
94
|
+
if (last.event === 'dissolved')
|
|
95
|
+
return { status: 'dissolved', since: last.ts };
|
|
96
|
+
if (last.event === 'merged' || last.event === 'acquired')
|
|
97
|
+
return { status: 'succeeded', successor: last.successor ?? null, since: last.ts };
|
|
98
|
+
return { status: 'active' };
|
|
99
|
+
}
|
|
100
|
+
export function groupStructure(input, parentPrivateKey) {
|
|
101
|
+
return signObject({ v: 1, type: 'kyb.group', ...input, ts: input.ts ?? new Date().toISOString() }, parentPrivateKey);
|
|
102
|
+
}
|
|
103
|
+
/** Is this domain a controlled (> 50%) subsidiary in the signed group structure? */
|
|
104
|
+
export function isControlledSubsidiary(g, domain) {
|
|
105
|
+
return verifySignedObject(g) && g.subsidiaries.some((s) => s.domain === domain && s.ownership_pct > 50);
|
|
106
|
+
}
|
|
107
|
+
/** A licence claim checked against the regulator's register you supply. */
|
|
108
|
+
export async function verifyLicence(licence, register, now = new Date().toISOString()) {
|
|
109
|
+
try {
|
|
110
|
+
const r = await register(licence.regulator, licence.number);
|
|
111
|
+
if (!r)
|
|
112
|
+
return { ok: false, reason: 'licence not found' };
|
|
113
|
+
if (norm(r.holder) !== norm(licence.entity))
|
|
114
|
+
return { ok: false, reason: `licence is held by ${r.holder}` };
|
|
115
|
+
if (!r.activities.includes(licence.activity))
|
|
116
|
+
return { ok: false, reason: `licence does not cover ${licence.activity}` };
|
|
117
|
+
if (r.exp && r.exp < now)
|
|
118
|
+
return { ok: false, reason: `licence expired ${r.exp}` };
|
|
119
|
+
return { ok: true };
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
return { ok: false, reason: `register unavailable: ${err.message}` };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** A verifier's signed, reusable KYB result, so the next counterparty need not repeat it. */
|
|
126
|
+
export function kybCertificate(input, verifierPrivateKey) {
|
|
127
|
+
const ts = input.ts ?? new Date().toISOString();
|
|
128
|
+
return signObject({ v: 1, type: 'kyb.certificate', ownerDid: input.ownerDid, entity: input.entity, checks: input.checks, validUntil: new Date(Date.parse(ts) + input.validDays * 86_400_000).toISOString(), ts }, verifierPrivateKey);
|
|
129
|
+
}
|
|
130
|
+
export function acceptKybCertificate(c, opts) {
|
|
131
|
+
return verifySignedObject(c) && c.ownerDid === opts.ownerDid && opts.trustedVerifiers.includes(c.signer) && (opts.now ?? new Date().toISOString()) <= c.validUntil;
|
|
132
|
+
}
|
|
133
|
+
/** Re-fetch a domain's owner document and report what changed since the last check. */
|
|
134
|
+
export async function domainDocChanges(domain, previous, fetchImpl) {
|
|
135
|
+
const current = await resolveOwnerDoc(domain, { fetchImpl });
|
|
136
|
+
if (!current)
|
|
137
|
+
return { current: null, changes: previous ? ['owner document is no longer published'] : [] };
|
|
138
|
+
const changes = [];
|
|
139
|
+
if (previous) {
|
|
140
|
+
for (const d of previous.owner_dids)
|
|
141
|
+
if (!current.owner_dids.includes(d))
|
|
142
|
+
changes.push(`owner DID ${d} removed`);
|
|
143
|
+
for (const d of current.owner_dids)
|
|
144
|
+
if (!previous.owner_dids.includes(d))
|
|
145
|
+
changes.push(`owner DID ${d} added`);
|
|
146
|
+
if (jcsHash(previous.entity) !== jcsHash(current.entity))
|
|
147
|
+
changes.push('legal entity details changed');
|
|
148
|
+
}
|
|
149
|
+
return { current, changes };
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -59,4 +59,5 @@ export declare function verifyOwnerBinding(attestation: OwnerAttestation, doc: O
|
|
|
59
59
|
export declare function fetchAndVerifyOwner(attestation: OwnerAttestation, opts?: {
|
|
60
60
|
fetchImpl?: FetchLike;
|
|
61
61
|
}): Promise<KybCheck>;
|
|
62
|
+
export * from './entity.js';
|
|
62
63
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjF,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,uGAAuG;AACvG,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,CAAC,CAAC;IACL,MAAM,EAAE,WAAW,CAAC;IACpB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qEAAqE;AACrE,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,iBAAiB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oDAAoD;AACpD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACxE,eAAe,EAAE,UAAU,GAC1B,gBAAgB,CAelB;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAa/E;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAE3D;AAED,oHAAoH;AACpH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,SAAS,CAAA;CAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAepH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oDAAoD;IACpD,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAyBhG;AAED,iFAAiF;AACjF,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,gBAAgB,EAC7B,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,SAAS,CAAA;CAAO,GACnC,OAAO,CAAC,QAAQ,CAAC,CAMnB"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjF,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,uGAAuG;AACvG,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,CAAC,CAAC;IACL,MAAM,EAAE,WAAW,CAAC;IACpB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qEAAqE;AACrE,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,iBAAiB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oDAAoD;AACpD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACxE,eAAe,EAAE,UAAU,GAC1B,gBAAgB,CAelB;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAa/E;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAE3D;AAED,oHAAoH;AACpH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,SAAS,CAAA;CAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAepH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oDAAoD;IACpD,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAyBhG;AAED,iFAAiF;AACjF,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,gBAAgB,EAC7B,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,SAAS,CAAA;CAAO,GACnC,OAAO,CAAC,QAAQ,CAAC,CAMnB;AACD,cAAc,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoCxE,oDAAoD;AACpD,MAAM,UAAU,qBAAqB,CACnC,MAAwE,EACxE,eAA2B;IAE3B,IAAI,CAAC,MAAM,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG;QACf,CAAC,EAAE,CAAU;QACb,IAAI,EAAE,iBAA0B;QAChC,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,EAAE,EAAE,MAAM,CAAC,EAAE;KACd,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC;IACpE,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,WAAW,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AAC5D,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,sBAAsB,CAAC,CAA+B;IACpE,MAAM,CAAC,GAAG,CAAC,IAAK,EAAuB,CAAC;IACxC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI;QAAE,OAAO,KAAK,CAAC;IACtG,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,QAA8C,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAmB;IACjD,OAAO,OAAO,CAAC,CAAuC,CAAC,CAAC;AAC1D,CAAC;AAED,oHAAoH;AACpH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,OAAkC,EAAE;IACxF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAS,EAAE,CAAe,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,WAAW,IAAI,+BAA+B,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAa,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,+EAA+E;IAC/E,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrF,OAAO,GAAG,CAAC;AACb,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAA6B,EAAE,GAAoB;IACpF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,8CAA8C,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChG,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACjH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,2EAA2E,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAClJ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,qBAAqB,WAAW,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,4BAA4B,WAAW,CAAC,GAAG,oEAAoE,CAAC,CAAC;IAChI,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,sCAAsC,GAAG,CAAC,MAAM,CAAC,IAAI,oBAAoB,WAAW,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IACpH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,cAAc,CAAU,EAAE,CAAC;QAC9D,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,2BAA2B,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACjG,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAA6B,EAC7B,OAAkC,EAAE;IAEpC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,8CAA8C,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChG,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5D,OAAO,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC9C,CAAC;AACD,cAAc,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zanii/kyb",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Owner-to-legal-entity binding - the missing link between an owner did:key and who is legally on the hook. Two-way: the company serves .well-known/zanii-owner.json on its own domain AND the owner signs an attestation naming that domain and entity; verification requires both. Zanii verifies domain control, never corporate registration - the claim becomes verifiable and attributable, not officially certified.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://ledger.zanii.agency",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@noble/curves": "^1.8.1",
|
|
35
35
|
"@noble/hashes": "^1.7.1",
|
|
36
|
-
"@zanii/core": "^0.5.
|
|
36
|
+
"@zanii/core": "^0.5.4"
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "tsc -p tsconfig.build.json",
|
package/src/entity.ts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Know-your-business beyond the domain binding: LEI checks and GLEIF lookups, company
|
|
3
|
+
* registry comparison, committed beneficial-ownership declarations, signatory authority,
|
|
4
|
+
* DNS TXT bindings, entity lifecycle events, group structures, licences, reusable KYB
|
|
5
|
+
* certificates and continuous monitoring of the published owner document.
|
|
6
|
+
*
|
|
7
|
+
* Zanii verifies signatures and consistency; registries, GLEIF, DNS and regulators remain
|
|
8
|
+
* the sources of truth, reached through functions you supply.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
11
|
+
import { jcsHash, signObject, verifySignedObject, type SignedObject } from '@zanii/core';
|
|
12
|
+
import { resolveOwnerDoc, type FetchLike, type LegalEntity, type OwnerDoc } from './index.js';
|
|
13
|
+
|
|
14
|
+
/** ISO 17442: 20 characters, the last two check digits by ISO 7064 mod 97-10. */
|
|
15
|
+
export function isValidLei(lei: string): boolean {
|
|
16
|
+
if (!/^[A-Z0-9]{18}\d{2}$/.test(lei)) return false;
|
|
17
|
+
const digits = lei.split('').map((c) => (/\d/.test(c) ? c : String(c.charCodeAt(0) - 55))).join('');
|
|
18
|
+
let rem = 0;
|
|
19
|
+
for (const d of digits) rem = (rem * 10 + Number(d)) % 97;
|
|
20
|
+
return rem === 1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const norm = (s: string) => s.toLowerCase().replace(/\./g, '').normalize('NFKD').replace(/[̀-ͯ]/g, '').replace(/\b(llc|ltd|inc|plc|fz-?llc|fzco|fze|pjsc|llp|co|limited|company)\b\.?/g, '').replace(/[^a-z0-9-ۿ]+/g, ' ').trim();
|
|
24
|
+
|
|
25
|
+
/** Check an entity against a registry or GLEIF record you fetch: name (normalised) and, if given, jurisdiction must agree. */
|
|
26
|
+
export async function checkRegistry(entity: LegalEntity & { lei?: string }, lookup: (id: string) => Promise<{ name: string; jurisdiction?: string; status?: string } | null>) {
|
|
27
|
+
const id = entity.lei ?? entity.registration;
|
|
28
|
+
if (!id) return { ok: false, reasons: ['no LEI or registration number to look up'] };
|
|
29
|
+
if (entity.lei && !isValidLei(entity.lei)) return { ok: false, reasons: ['LEI checksum is invalid'] };
|
|
30
|
+
try {
|
|
31
|
+
const rec = await lookup(id);
|
|
32
|
+
const reasons: string[] = [];
|
|
33
|
+
if (!rec) reasons.push('not found in the registry');
|
|
34
|
+
else {
|
|
35
|
+
if (norm(rec.name) !== norm(entity.name)) reasons.push(`registry name "${rec.name}" does not match "${entity.name}"`);
|
|
36
|
+
if (entity.jurisdiction && rec.jurisdiction && rec.jurisdiction !== entity.jurisdiction) reasons.push(`jurisdiction ${rec.jurisdiction} differs`);
|
|
37
|
+
if (rec.status && !/^(active|issued)$/i.test(rec.status)) reasons.push(`registry status is ${rec.status}`);
|
|
38
|
+
}
|
|
39
|
+
return { ok: reasons.length === 0, reasons };
|
|
40
|
+
} catch (err) {
|
|
41
|
+
return { ok: false, reasons: [`registry unavailable: ${(err as Error).message}`] };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type UboDeclaration = SignedObject<{ v: 1; type: 'kyb.ubo'; entity: string; owners: Array<{ commitment: string; share_pct: number }>; ts: string }>;
|
|
46
|
+
|
|
47
|
+
/** Beneficial owners declared as salted commitments with their shares; reveal one owner to one verifier later. */
|
|
48
|
+
export function declareUbo(entity: string, owners: Array<{ name: string; share_pct: number }>, ownerPrivateKey: Uint8Array, ts = new Date().toISOString()) {
|
|
49
|
+
const total = owners.reduce((s, o) => s + o.share_pct, 0);
|
|
50
|
+
if (total > 100.0001) throw new Error(`kyb: shares add up to ${total}%`);
|
|
51
|
+
const salts = owners.map(() => randomBytes(16).toString('hex'));
|
|
52
|
+
const commit = (name: string, salt: string) => 'sha256:' + createHash('sha256').update(`${salt}\u0000${name.trim().toLowerCase()}`).digest('hex');
|
|
53
|
+
const declaration = signObject({ v: 1 as const, type: 'kyb.ubo' as const, entity, owners: owners.map((o, i) => ({ commitment: commit(o.name, salts[i]!), share_pct: o.share_pct })), ts }, ownerPrivateKey);
|
|
54
|
+
return { declaration, reveal: (i: number) => ({ name: owners[i]!.name, salt: salts[i]!, index: i }) };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Check a revealed owner against the signed declaration. */
|
|
58
|
+
export function verifyUboReveal(d: UboDeclaration, reveal: { name: string; salt: string; index: number }): boolean {
|
|
59
|
+
const c = 'sha256:' + createHash('sha256').update(`${reveal.salt}\u0000${reveal.name.trim().toLowerCase()}`).digest('hex');
|
|
60
|
+
return verifySignedObject(d) && d.owners[reveal.index]?.commitment === c;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type SignatoryAuthority = SignedObject<{ v: 1; type: 'kyb.signatory'; entity: string; person: string; scopes: string[]; limit_minor?: string; exp: string; ts: string }>;
|
|
64
|
+
|
|
65
|
+
/** The entity's owner key authorises a person to grant delegations on its behalf, within scopes and until a date. */
|
|
66
|
+
export function signatoryAuthority(input: { entity: string; person: string; scopes: string[]; limit_minor?: string; exp: string; ts?: string }, ownerPrivateKey: Uint8Array): SignatoryAuthority {
|
|
67
|
+
return signObject({ v: 1 as const, type: 'kyb.signatory' as const, ...input, ts: input.ts ?? new Date().toISOString() }, ownerPrivateKey);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function mayAuthorise(a: SignatoryAuthority, ownerDid: string, person: string, scope: string, now = new Date().toISOString()): boolean {
|
|
71
|
+
return verifySignedObject(a) && a.signer === ownerDid && a.person === person && now <= a.exp && a.scopes.some((s) => s === '*' || s === scope || (s.endsWith('.*') && scope.startsWith(s.slice(0, -1))));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The domain's DNS TXT record names the owner DID (`zanii-owner=did:key:...`). Use a
|
|
76
|
+
* DNSSEC-validating resolver for `resolveTxt`; this checks what it returns.
|
|
77
|
+
*/
|
|
78
|
+
export async function dnsTxtBinding(domain: string, did: string, resolveTxt: (name: string) => Promise<string[][]>) {
|
|
79
|
+
try {
|
|
80
|
+
const records = (await resolveTxt(`_zanii.${domain}`)).map((r) => r.join(''));
|
|
81
|
+
return { ok: records.includes(`zanii-owner=${did}`), records };
|
|
82
|
+
} catch (err) {
|
|
83
|
+
return { ok: false, records: [] as string[], error: (err as Error).message };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type LifecycleEvent = SignedObject<{ v: 1; type: 'kyb.lifecycle'; entity: string; event: 'renamed' | 'merged' | 'acquired' | 'dissolved'; successor?: string; ts: string }>;
|
|
88
|
+
|
|
89
|
+
export function lifecycleEvent(input: { entity: string; event: LifecycleEvent['event']; successor?: string; ts?: string }, ownerPrivateKey: Uint8Array): LifecycleEvent {
|
|
90
|
+
return signObject({ v: 1 as const, type: 'kyb.lifecycle' as const, ...input, ts: input.ts ?? new Date().toISOString() }, ownerPrivateKey);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** The entity's current standing after its lifecycle events: active, succeeded by another, or dissolved. */
|
|
94
|
+
export function entityStatus(events: LifecycleEvent[], ownerDid: string) {
|
|
95
|
+
const valid = events.filter((e) => verifySignedObject(e) && e.signer === ownerDid).sort((a, b) => a.ts.localeCompare(b.ts));
|
|
96
|
+
const last = valid.at(-1);
|
|
97
|
+
if (!last) return { status: 'active' as const };
|
|
98
|
+
if (last.event === 'dissolved') return { status: 'dissolved' as const, since: last.ts };
|
|
99
|
+
if (last.event === 'merged' || last.event === 'acquired') return { status: 'succeeded' as const, successor: last.successor ?? null, since: last.ts };
|
|
100
|
+
return { status: 'active' as const };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export type GroupStructure = SignedObject<{ v: 1; type: 'kyb.group'; parent: string; subsidiaries: Array<{ name: string; domain?: string; ownership_pct: number }>; ts: string }>;
|
|
104
|
+
|
|
105
|
+
export function groupStructure(input: { parent: string; subsidiaries: Array<{ name: string; domain?: string; ownership_pct: number }>; ts?: string }, parentPrivateKey: Uint8Array): GroupStructure {
|
|
106
|
+
return signObject({ v: 1 as const, type: 'kyb.group' as const, ...input, ts: input.ts ?? new Date().toISOString() }, parentPrivateKey);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Is this domain a controlled (> 50%) subsidiary in the signed group structure? */
|
|
110
|
+
export function isControlledSubsidiary(g: GroupStructure, domain: string): boolean {
|
|
111
|
+
return verifySignedObject(g) && g.subsidiaries.some((s) => s.domain === domain && s.ownership_pct > 50);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** A licence claim checked against the regulator's register you supply. */
|
|
115
|
+
export async function verifyLicence(licence: { regulator: string; number: string; activity: string; entity: string }, register: (regulator: string, number: string) => Promise<{ holder: string; activities: string[]; exp?: string } | null>, now = new Date().toISOString()) {
|
|
116
|
+
try {
|
|
117
|
+
const r = await register(licence.regulator, licence.number);
|
|
118
|
+
if (!r) return { ok: false, reason: 'licence not found' };
|
|
119
|
+
if (norm(r.holder) !== norm(licence.entity)) return { ok: false, reason: `licence is held by ${r.holder}` };
|
|
120
|
+
if (!r.activities.includes(licence.activity)) return { ok: false, reason: `licence does not cover ${licence.activity}` };
|
|
121
|
+
if (r.exp && r.exp < now) return { ok: false, reason: `licence expired ${r.exp}` };
|
|
122
|
+
return { ok: true };
|
|
123
|
+
} catch (err) {
|
|
124
|
+
return { ok: false, reason: `register unavailable: ${(err as Error).message}` };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export type KybCertificate = SignedObject<{ v: 1; type: 'kyb.certificate'; ownerDid: string; entity: LegalEntity; checks: string[]; validUntil: string; ts: string }>;
|
|
129
|
+
|
|
130
|
+
/** A verifier's signed, reusable KYB result, so the next counterparty need not repeat it. */
|
|
131
|
+
export function kybCertificate(input: { ownerDid: string; entity: LegalEntity; checks: string[]; validDays: number; ts?: string }, verifierPrivateKey: Uint8Array): KybCertificate {
|
|
132
|
+
const ts = input.ts ?? new Date().toISOString();
|
|
133
|
+
return signObject({ v: 1 as const, type: 'kyb.certificate' as const, ownerDid: input.ownerDid, entity: input.entity, checks: input.checks, validUntil: new Date(Date.parse(ts) + input.validDays * 86_400_000).toISOString(), ts }, verifierPrivateKey);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function acceptKybCertificate(c: KybCertificate, opts: { ownerDid: string; trustedVerifiers: string[]; now?: string }): boolean {
|
|
137
|
+
return verifySignedObject(c) && c.ownerDid === opts.ownerDid && opts.trustedVerifiers.includes(c.signer) && (opts.now ?? new Date().toISOString()) <= c.validUntil;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Re-fetch a domain's owner document and report what changed since the last check. */
|
|
141
|
+
export async function domainDocChanges(domain: string, previous: OwnerDoc | null, fetchImpl?: FetchLike) {
|
|
142
|
+
const current = await resolveOwnerDoc(domain, { fetchImpl });
|
|
143
|
+
if (!current) return { current: null, changes: previous ? ['owner document is no longer published'] : [] };
|
|
144
|
+
const changes: string[] = [];
|
|
145
|
+
if (previous) {
|
|
146
|
+
for (const d of previous.owner_dids) if (!current.owner_dids.includes(d)) changes.push(`owner DID ${d} removed`);
|
|
147
|
+
for (const d of current.owner_dids) if (!previous.owner_dids.includes(d)) changes.push(`owner DID ${d} added`);
|
|
148
|
+
if (jcsHash(previous.entity as never) !== jcsHash(current.entity as never)) changes.push('legal entity details changed');
|
|
149
|
+
}
|
|
150
|
+
return { current, changes };
|
|
151
|
+
}
|
package/src/index.ts
CHANGED