@oma3/omatrust 0.1.0-alpha.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OMA3
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # @oma3/omatrust
2
+
3
+ Framework-agnostic TypeScript SDK for OMATrust.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @oma3/omatrust ethers
9
+ ```
10
+
11
+ If you use `@oma3/omatrust/reputation`, also install EAS SDK:
12
+
13
+ ```bash
14
+ npm install @ethereum-attestation-service/eas-sdk
15
+ ```
16
+
17
+ ## Modules
18
+
19
+ - `@oma3/omatrust/identity`
20
+ - `@oma3/omatrust/reputation`
21
+ - `@oma3/omatrust/app-registry`
22
+
23
+ ## Example
24
+
25
+ ```ts
26
+ import { normalizeDid, didToAddress } from "@oma3/omatrust/identity";
27
+
28
+ const did = normalizeDid("did:web:example.com");
29
+ const address = didToAddress(did);
30
+ ```
@@ -0,0 +1,244 @@
1
+ 'use strict';
2
+
3
+ var ethers = require('ethers');
4
+ var canonicalize = require('canonicalize');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var canonicalize__default = /*#__PURE__*/_interopDefault(canonicalize);
9
+
10
+ // src/app-registry/traits.ts
11
+
12
+ // src/shared/errors.ts
13
+ var OmaTrustError = class extends Error {
14
+ code;
15
+ details;
16
+ constructor(code, message, details) {
17
+ super(message);
18
+ this.name = "OmaTrustError";
19
+ this.code = code;
20
+ this.details = details;
21
+ }
22
+ };
23
+
24
+ // src/shared/assert.ts
25
+ function assertString(value, name, code = "INVALID_INPUT") {
26
+ if (typeof value !== "string" || value.trim().length === 0) {
27
+ throw new OmaTrustError(code, `${name} must be a non-empty string`, { value });
28
+ }
29
+ }
30
+
31
+ // src/app-registry/traits.ts
32
+ function hashTrait(trait) {
33
+ assertString(trait, "trait");
34
+ return ethers.id(trait);
35
+ }
36
+ function hashTraits(traits) {
37
+ if (!Array.isArray(traits)) {
38
+ throw new TypeError("traits must be an array");
39
+ }
40
+ return traits.map((trait) => hashTrait(trait));
41
+ }
42
+
43
+ // src/app-registry/interfaces.ts
44
+ var BIT_HUMAN = 1;
45
+ var BIT_API = 2;
46
+ var BIT_CONTRACT = 4;
47
+ function computeInterfacesBitmap(flags) {
48
+ return (flags.human ? BIT_HUMAN : 0) + (flags.api ? BIT_API : 0) + (flags.smartContract ? BIT_CONTRACT : 0);
49
+ }
50
+ function parseBitmapToFlags(bitmap) {
51
+ return {
52
+ human: (bitmap & BIT_HUMAN) !== 0,
53
+ api: (bitmap & BIT_API) !== 0,
54
+ smartContract: (bitmap & BIT_CONTRACT) !== 0
55
+ };
56
+ }
57
+ function hasInterface(bitmap, type) {
58
+ switch (type) {
59
+ case "human":
60
+ return (bitmap & BIT_HUMAN) !== 0;
61
+ case "api":
62
+ return (bitmap & BIT_API) !== 0;
63
+ case "contract":
64
+ return (bitmap & BIT_CONTRACT) !== 0;
65
+ default:
66
+ throw new OmaTrustError("INVALID_INPUT", "Unsupported interface type", { type });
67
+ }
68
+ }
69
+ function getInterfaceTypes(bitmap) {
70
+ const results = [];
71
+ if (hasInterface(bitmap, "human")) {
72
+ results.push("human");
73
+ }
74
+ if (hasInterface(bitmap, "api")) {
75
+ results.push("api");
76
+ }
77
+ if (hasInterface(bitmap, "contract")) {
78
+ results.push("contract");
79
+ }
80
+ return results;
81
+ }
82
+
83
+ // src/app-registry/status.ts
84
+ function registryCodeToStatus(code) {
85
+ switch (code) {
86
+ case 0:
87
+ return "Active";
88
+ case 1:
89
+ return "Deprecated";
90
+ case 2:
91
+ return "Replaced";
92
+ default:
93
+ throw new OmaTrustError("INVALID_INPUT", "Invalid registry status code", { code });
94
+ }
95
+ }
96
+ function registryStatusToCode(status) {
97
+ switch (status) {
98
+ case "Active":
99
+ return 0;
100
+ case "Deprecated":
101
+ return 1;
102
+ case "Replaced":
103
+ return 2;
104
+ default:
105
+ throw new OmaTrustError("INVALID_INPUT", "Invalid registry status", { status });
106
+ }
107
+ }
108
+ function isValidRegistryStatus(status) {
109
+ return status === "Active" || status === "Deprecated" || status === "Replaced";
110
+ }
111
+
112
+ // src/app-registry/version.ts
113
+ function parseVersion(input) {
114
+ const match = input.match(/^(\d+)\.(\d+)\.(\d+)$/);
115
+ if (!match) {
116
+ throw new OmaTrustError("INVALID_INPUT", "Invalid semantic version", { input });
117
+ }
118
+ return {
119
+ major: Number(match[1]),
120
+ minor: Number(match[2]),
121
+ patch: Number(match[3])
122
+ };
123
+ }
124
+ function formatVersion(version) {
125
+ return `${version.major}.${version.minor}.${version.patch}`;
126
+ }
127
+ function compareVersions(a, b) {
128
+ if (a.major !== b.major) {
129
+ return a.major < b.major ? -1 : 1;
130
+ }
131
+ if (a.minor !== b.minor) {
132
+ return a.minor < b.minor ? -1 : 1;
133
+ }
134
+ if (a.patch !== b.patch) {
135
+ return a.patch < b.patch ? -1 : 1;
136
+ }
137
+ return 0;
138
+ }
139
+ function isVersionGreater(a, b) {
140
+ return compareVersions(a, b) === 1;
141
+ }
142
+ function isVersionEqual(a, b) {
143
+ return compareVersions(a, b) === 0;
144
+ }
145
+ function getLatestVersion(history) {
146
+ if (history.length === 0) {
147
+ throw new OmaTrustError("INVALID_INPUT", "Version history cannot be empty");
148
+ }
149
+ return history.reduce((current, candidate) => {
150
+ return compareVersions(candidate, current) === 1 ? candidate : current;
151
+ });
152
+ }
153
+
154
+ // src/app-registry/metadata-keys.ts
155
+ var METADATA_KEY_DID = "omat.did";
156
+ var METADATA_KEY_DID_HASH = "omat.didHash";
157
+ var METADATA_KEY_DATA_HASH = "omat.dataHash";
158
+ var METADATA_KEY_DATA_HASH_ALGORITHM = "omat.dataHashAlgorithm";
159
+ var METADATA_KEY_STATUS = "omat.status";
160
+ var METADATA_KEY_INTERFACES = "omat.interfaces";
161
+ var METADATA_KEY_FUNGIBLE_TOKEN_ID = "omat.fungibleTokenId";
162
+ var METADATA_KEY_CONTRACT_ID = "omat.contractId";
163
+ var METADATA_KEY_VERSION_MAJOR = "omat.versionMajor";
164
+ var METADATA_KEY_VERSION_MINOR = "omat.versionMinor";
165
+ var METADATA_KEY_VERSION_PATCH = "omat.versionPatch";
166
+ var METADATA_KEY_TRAIT_HASHES = "omat.traitHashes";
167
+ var METADATA_KEY_METADATA_JSON = "omat.metadataJson";
168
+ function canonicalizeJson(obj) {
169
+ const jcs = canonicalize__default.default(obj);
170
+ if (!jcs) {
171
+ throw new OmaTrustError("INVALID_INPUT", "Object cannot be canonicalized", { obj });
172
+ }
173
+ return jcs;
174
+ }
175
+
176
+ // src/app-registry/data-hash.ts
177
+ async function fetchJson(url) {
178
+ let response;
179
+ try {
180
+ response = await fetch(url, { headers: { Accept: "application/json" } });
181
+ } catch (err) {
182
+ throw new OmaTrustError("NETWORK_ERROR", "Failed to fetch data URL", { url, err });
183
+ }
184
+ if (!response.ok) {
185
+ throw new OmaTrustError("NETWORK_ERROR", "Failed to fetch data URL", {
186
+ url,
187
+ status: response.status
188
+ });
189
+ }
190
+ try {
191
+ return await response.json();
192
+ } catch (err) {
193
+ throw new OmaTrustError("INVALID_INPUT", "Response body is not valid JSON", { url, err });
194
+ }
195
+ }
196
+ function hashJcs(jcsJson, algorithm) {
197
+ const bytes = ethers.toUtf8Bytes(jcsJson);
198
+ return algorithm === "keccak256" ? ethers.keccak256(bytes) : ethers.sha256(bytes);
199
+ }
200
+ async function computeDataHashFromUrl(url, algorithm) {
201
+ if (!url || typeof url !== "string") {
202
+ throw new OmaTrustError("INVALID_INPUT", "url must be a non-empty string", { url });
203
+ }
204
+ const json = await fetchJson(url);
205
+ const jcsJson = canonicalizeJson(json);
206
+ return hashJcs(jcsJson, algorithm);
207
+ }
208
+ async function verifyDataUrlHash(url, expectedHash, algorithm) {
209
+ const computedHash = await computeDataHashFromUrl(url, algorithm);
210
+ return computedHash.toLowerCase() === expectedHash.toLowerCase();
211
+ }
212
+
213
+ exports.METADATA_KEY_CONTRACT_ID = METADATA_KEY_CONTRACT_ID;
214
+ exports.METADATA_KEY_DATA_HASH = METADATA_KEY_DATA_HASH;
215
+ exports.METADATA_KEY_DATA_HASH_ALGORITHM = METADATA_KEY_DATA_HASH_ALGORITHM;
216
+ exports.METADATA_KEY_DID = METADATA_KEY_DID;
217
+ exports.METADATA_KEY_DID_HASH = METADATA_KEY_DID_HASH;
218
+ exports.METADATA_KEY_FUNGIBLE_TOKEN_ID = METADATA_KEY_FUNGIBLE_TOKEN_ID;
219
+ exports.METADATA_KEY_INTERFACES = METADATA_KEY_INTERFACES;
220
+ exports.METADATA_KEY_METADATA_JSON = METADATA_KEY_METADATA_JSON;
221
+ exports.METADATA_KEY_STATUS = METADATA_KEY_STATUS;
222
+ exports.METADATA_KEY_TRAIT_HASHES = METADATA_KEY_TRAIT_HASHES;
223
+ exports.METADATA_KEY_VERSION_MAJOR = METADATA_KEY_VERSION_MAJOR;
224
+ exports.METADATA_KEY_VERSION_MINOR = METADATA_KEY_VERSION_MINOR;
225
+ exports.METADATA_KEY_VERSION_PATCH = METADATA_KEY_VERSION_PATCH;
226
+ exports.compareVersions = compareVersions;
227
+ exports.computeDataHashFromUrl = computeDataHashFromUrl;
228
+ exports.computeInterfacesBitmap = computeInterfacesBitmap;
229
+ exports.formatVersion = formatVersion;
230
+ exports.getInterfaceTypes = getInterfaceTypes;
231
+ exports.getLatestVersion = getLatestVersion;
232
+ exports.hasInterface = hasInterface;
233
+ exports.hashTrait = hashTrait;
234
+ exports.hashTraits = hashTraits;
235
+ exports.isValidRegistryStatus = isValidRegistryStatus;
236
+ exports.isVersionEqual = isVersionEqual;
237
+ exports.isVersionGreater = isVersionGreater;
238
+ exports.parseBitmapToFlags = parseBitmapToFlags;
239
+ exports.parseVersion = parseVersion;
240
+ exports.registryCodeToStatus = registryCodeToStatus;
241
+ exports.registryStatusToCode = registryStatusToCode;
242
+ exports.verifyDataUrlHash = verifyDataUrlHash;
243
+ //# sourceMappingURL=index.cjs.map
244
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/errors.ts","../../src/shared/assert.ts","../../src/app-registry/traits.ts","../../src/app-registry/interfaces.ts","../../src/app-registry/status.ts","../../src/app-registry/version.ts","../../src/app-registry/metadata-keys.ts","../../src/identity/data.ts","../../src/app-registry/data-hash.ts"],"names":["id","canonicalize","toUtf8Bytes","keccak256","sha256"],"mappings":"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","file":"index.cjs","sourcesContent":["export class OmaTrustError extends Error {\n code: string;\n details?: unknown;\n\n constructor(code: string, message: string, details?: unknown) {\n super(message);\n this.name = \"OmaTrustError\";\n this.code = code;\n this.details = details;\n }\n}\n\nexport function toOmaTrustError(\n code: string,\n message: string,\n details?: unknown\n): OmaTrustError {\n return new OmaTrustError(code, message, details);\n}\n","import { OmaTrustError } from \"./errors\";\n\nexport function assertString(value: unknown, name: string, code = \"INVALID_INPUT\"): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new OmaTrustError(code, `${name} must be a non-empty string`, { value });\n }\n}\n\nexport function assertNumber(value: unknown, name: string, code = \"INVALID_INPUT\"): asserts value is number {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new OmaTrustError(code, `${name} must be a valid number`, { value });\n }\n}\n\nexport function assertObject(value: unknown, name: string, code = \"INVALID_INPUT\"): asserts value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new OmaTrustError(code, `${name} must be an object`, { value });\n }\n}\n\nexport function asError(err: unknown): Error {\n if (err instanceof Error) {\n return err;\n }\n return new Error(String(err));\n}\n","import { id } from \"ethers\";\nimport { assertString } from \"../shared/assert\";\n\ntype Hex = `0x${string}`;\n\nexport function hashTrait(trait: string): Hex {\n assertString(trait, \"trait\");\n return id(trait) as Hex;\n}\n\nexport function hashTraits(traits: string[]): Hex[] {\n if (!Array.isArray(traits)) {\n throw new TypeError(\"traits must be an array\");\n }\n return traits.map((trait) => hashTrait(trait));\n}\n","import type { InterfaceFlags, InterfaceType } from \"./types\";\nimport { OmaTrustError } from \"../shared/errors\";\n\nconst BIT_HUMAN = 1;\nconst BIT_API = 2;\nconst BIT_CONTRACT = 4;\n\nexport function computeInterfacesBitmap(flags: InterfaceFlags): number {\n return (flags.human ? BIT_HUMAN : 0) +\n (flags.api ? BIT_API : 0) +\n (flags.smartContract ? BIT_CONTRACT : 0);\n}\n\nexport function parseBitmapToFlags(bitmap: number): InterfaceFlags {\n return {\n human: (bitmap & BIT_HUMAN) !== 0,\n api: (bitmap & BIT_API) !== 0,\n smartContract: (bitmap & BIT_CONTRACT) !== 0\n };\n}\n\nexport function hasInterface(bitmap: number, type: InterfaceType): boolean {\n switch (type) {\n case \"human\":\n return (bitmap & BIT_HUMAN) !== 0;\n case \"api\":\n return (bitmap & BIT_API) !== 0;\n case \"contract\":\n return (bitmap & BIT_CONTRACT) !== 0;\n default:\n throw new OmaTrustError(\"INVALID_INPUT\", \"Unsupported interface type\", { type });\n }\n}\n\nexport function getInterfaceTypes(bitmap: number): InterfaceType[] {\n const results: InterfaceType[] = [];\n if (hasInterface(bitmap, \"human\")) {\n results.push(\"human\");\n }\n if (hasInterface(bitmap, \"api\")) {\n results.push(\"api\");\n }\n if (hasInterface(bitmap, \"contract\")) {\n results.push(\"contract\");\n }\n return results;\n}\n","import type { RegistryStatus } from \"./types\";\nimport { OmaTrustError } from \"../shared/errors\";\n\nexport function registryCodeToStatus(code: number): RegistryStatus {\n switch (code) {\n case 0:\n return \"Active\";\n case 1:\n return \"Deprecated\";\n case 2:\n return \"Replaced\";\n default:\n throw new OmaTrustError(\"INVALID_INPUT\", \"Invalid registry status code\", { code });\n }\n}\n\nexport function registryStatusToCode(status: RegistryStatus): number {\n switch (status) {\n case \"Active\":\n return 0;\n case \"Deprecated\":\n return 1;\n case \"Replaced\":\n return 2;\n default:\n throw new OmaTrustError(\"INVALID_INPUT\", \"Invalid registry status\", { status });\n }\n}\n\nexport function isValidRegistryStatus(status: string): status is RegistryStatus {\n return status === \"Active\" || status === \"Deprecated\" || status === \"Replaced\";\n}\n","import type { Version } from \"./types\";\nimport { OmaTrustError } from \"../shared/errors\";\n\nexport function parseVersion(input: string): Version {\n const match = input.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n if (!match) {\n throw new OmaTrustError(\"INVALID_INPUT\", \"Invalid semantic version\", { input });\n }\n\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3])\n };\n}\n\nexport function formatVersion(version: Version): string {\n return `${version.major}.${version.minor}.${version.patch}`;\n}\n\nexport function compareVersions(a: Version, b: Version): -1 | 0 | 1 {\n if (a.major !== b.major) {\n return a.major < b.major ? -1 : 1;\n }\n if (a.minor !== b.minor) {\n return a.minor < b.minor ? -1 : 1;\n }\n if (a.patch !== b.patch) {\n return a.patch < b.patch ? -1 : 1;\n }\n return 0;\n}\n\nexport function isVersionGreater(a: Version, b: Version): boolean {\n return compareVersions(a, b) === 1;\n}\n\nexport function isVersionEqual(a: Version, b: Version): boolean {\n return compareVersions(a, b) === 0;\n}\n\nexport function getLatestVersion(history: Version[]): Version {\n if (history.length === 0) {\n throw new OmaTrustError(\"INVALID_INPUT\", \"Version history cannot be empty\");\n }\n\n return history.reduce((current, candidate) => {\n return compareVersions(candidate, current) === 1 ? candidate : current;\n });\n}\n","export const METADATA_KEY_DID = \"omat.did\";\nexport const METADATA_KEY_DID_HASH = \"omat.didHash\";\nexport const METADATA_KEY_DATA_HASH = \"omat.dataHash\";\nexport const METADATA_KEY_DATA_HASH_ALGORITHM = \"omat.dataHashAlgorithm\";\nexport const METADATA_KEY_STATUS = \"omat.status\";\nexport const METADATA_KEY_INTERFACES = \"omat.interfaces\";\nexport const METADATA_KEY_FUNGIBLE_TOKEN_ID = \"omat.fungibleTokenId\";\nexport const METADATA_KEY_CONTRACT_ID = \"omat.contractId\";\nexport const METADATA_KEY_VERSION_MAJOR = \"omat.versionMajor\";\nexport const METADATA_KEY_VERSION_MINOR = \"omat.versionMinor\";\nexport const METADATA_KEY_VERSION_PATCH = \"omat.versionPatch\";\nexport const METADATA_KEY_TRAIT_HASHES = \"omat.traitHashes\";\nexport const METADATA_KEY_METADATA_JSON = \"omat.metadataJson\";\n","import canonicalize from \"canonicalize\";\nimport { keccak256, sha256, toUtf8Bytes } from \"ethers\";\nimport { OmaTrustError } from \"../shared/errors\";\n\ntype Hex = `0x${string}`;\n\nexport function canonicalizeJson(obj: unknown): string {\n const jcs = canonicalize(obj);\n if (!jcs) {\n throw new OmaTrustError(\"INVALID_INPUT\", \"Object cannot be canonicalized\", { obj });\n }\n return jcs;\n}\n\nexport function canonicalizeForHash(obj: unknown): { jcsJson: string; hash: Hex } {\n const jcsJson = canonicalizeJson(obj);\n return {\n jcsJson,\n hash: keccak256(toUtf8Bytes(jcsJson)) as Hex\n };\n}\n\nexport function hashCanonicalizedJson(obj: unknown, algorithm: \"keccak256\" | \"sha256\"): Hex {\n const jcs = canonicalizeJson(obj);\n const bytes = toUtf8Bytes(jcs);\n return (algorithm === \"keccak256\" ? keccak256(bytes) : sha256(bytes)) as Hex;\n}\n","import { keccak256, sha256, toUtf8Bytes } from \"ethers\";\nimport { canonicalizeJson } from \"../identity/data\";\nimport { OmaTrustError } from \"../shared/errors\";\n\ntype Hex = `0x${string}`;\nexport type DataHashAlgorithm = \"keccak256\" | \"sha256\";\n\nasync function fetchJson(url: string): Promise<unknown> {\n let response: Response;\n try {\n response = await fetch(url, { headers: { Accept: \"application/json\" } });\n } catch (err) {\n throw new OmaTrustError(\"NETWORK_ERROR\", \"Failed to fetch data URL\", { url, err });\n }\n\n if (!response.ok) {\n throw new OmaTrustError(\"NETWORK_ERROR\", \"Failed to fetch data URL\", {\n url,\n status: response.status\n });\n }\n\n try {\n return await response.json();\n } catch (err) {\n throw new OmaTrustError(\"INVALID_INPUT\", \"Response body is not valid JSON\", { url, err });\n }\n}\n\nfunction hashJcs(jcsJson: string, algorithm: DataHashAlgorithm): Hex {\n const bytes = toUtf8Bytes(jcsJson);\n return (algorithm === \"keccak256\" ? keccak256(bytes) : sha256(bytes)) as Hex;\n}\n\nexport async function computeDataHashFromUrl(\n url: string,\n algorithm: DataHashAlgorithm\n): Promise<Hex> {\n if (!url || typeof url !== \"string\") {\n throw new OmaTrustError(\"INVALID_INPUT\", \"url must be a non-empty string\", { url });\n }\n\n const json = await fetchJson(url);\n const jcsJson = canonicalizeJson(json);\n return hashJcs(jcsJson, algorithm);\n}\n\nexport async function verifyDataUrlHash(\n url: string,\n expectedHash: Hex,\n algorithm: DataHashAlgorithm\n): Promise<boolean> {\n const computedHash = await computeDataHashFromUrl(url, algorithm);\n return computedHash.toLowerCase() === expectedHash.toLowerCase();\n}\n"]}
@@ -0,0 +1 @@
1
+ export { D as DataHashAlgorithm, H as Hex, I as InterfaceFlags, a as InterfaceType, M as METADATA_KEY_CONTRACT_ID, b as METADATA_KEY_DATA_HASH, c as METADATA_KEY_DATA_HASH_ALGORITHM, d as METADATA_KEY_DID, e as METADATA_KEY_DID_HASH, f as METADATA_KEY_FUNGIBLE_TOKEN_ID, g as METADATA_KEY_INTERFACES, h as METADATA_KEY_METADATA_JSON, j as METADATA_KEY_STATUS, k as METADATA_KEY_TRAIT_HASHES, l as METADATA_KEY_VERSION_MAJOR, m as METADATA_KEY_VERSION_MINOR, n as METADATA_KEY_VERSION_PATCH, R as RegistryStatus, V as Version, o as compareVersions, p as computeDataHashFromUrl, q as computeInterfacesBitmap, r as formatVersion, s as getInterfaceTypes, t as getLatestVersion, u as hasInterface, v as hashTrait, w as hashTraits, x as isValidRegistryStatus, y as isVersionEqual, z as isVersionGreater, A as parseBitmapToFlags, B as parseVersion, C as registryCodeToStatus, E as registryStatusToCode, F as verifyDataUrlHash } from '../index-_Bkhoj8k.cjs';
@@ -0,0 +1 @@
1
+ export { D as DataHashAlgorithm, H as Hex, I as InterfaceFlags, a as InterfaceType, M as METADATA_KEY_CONTRACT_ID, b as METADATA_KEY_DATA_HASH, c as METADATA_KEY_DATA_HASH_ALGORITHM, d as METADATA_KEY_DID, e as METADATA_KEY_DID_HASH, f as METADATA_KEY_FUNGIBLE_TOKEN_ID, g as METADATA_KEY_INTERFACES, h as METADATA_KEY_METADATA_JSON, j as METADATA_KEY_STATUS, k as METADATA_KEY_TRAIT_HASHES, l as METADATA_KEY_VERSION_MAJOR, m as METADATA_KEY_VERSION_MINOR, n as METADATA_KEY_VERSION_PATCH, R as RegistryStatus, V as Version, o as compareVersions, p as computeDataHashFromUrl, q as computeInterfacesBitmap, r as formatVersion, s as getInterfaceTypes, t as getLatestVersion, u as hasInterface, v as hashTrait, w as hashTraits, x as isValidRegistryStatus, y as isVersionEqual, z as isVersionGreater, A as parseBitmapToFlags, B as parseVersion, C as registryCodeToStatus, E as registryStatusToCode, F as verifyDataUrlHash } from '../index-_Bkhoj8k.js';
@@ -0,0 +1,209 @@
1
+ import { id, toUtf8Bytes, keccak256, sha256 } from 'ethers';
2
+ import canonicalize from 'canonicalize';
3
+
4
+ // src/app-registry/traits.ts
5
+
6
+ // src/shared/errors.ts
7
+ var OmaTrustError = class extends Error {
8
+ code;
9
+ details;
10
+ constructor(code, message, details) {
11
+ super(message);
12
+ this.name = "OmaTrustError";
13
+ this.code = code;
14
+ this.details = details;
15
+ }
16
+ };
17
+
18
+ // src/shared/assert.ts
19
+ function assertString(value, name, code = "INVALID_INPUT") {
20
+ if (typeof value !== "string" || value.trim().length === 0) {
21
+ throw new OmaTrustError(code, `${name} must be a non-empty string`, { value });
22
+ }
23
+ }
24
+
25
+ // src/app-registry/traits.ts
26
+ function hashTrait(trait) {
27
+ assertString(trait, "trait");
28
+ return id(trait);
29
+ }
30
+ function hashTraits(traits) {
31
+ if (!Array.isArray(traits)) {
32
+ throw new TypeError("traits must be an array");
33
+ }
34
+ return traits.map((trait) => hashTrait(trait));
35
+ }
36
+
37
+ // src/app-registry/interfaces.ts
38
+ var BIT_HUMAN = 1;
39
+ var BIT_API = 2;
40
+ var BIT_CONTRACT = 4;
41
+ function computeInterfacesBitmap(flags) {
42
+ return (flags.human ? BIT_HUMAN : 0) + (flags.api ? BIT_API : 0) + (flags.smartContract ? BIT_CONTRACT : 0);
43
+ }
44
+ function parseBitmapToFlags(bitmap) {
45
+ return {
46
+ human: (bitmap & BIT_HUMAN) !== 0,
47
+ api: (bitmap & BIT_API) !== 0,
48
+ smartContract: (bitmap & BIT_CONTRACT) !== 0
49
+ };
50
+ }
51
+ function hasInterface(bitmap, type) {
52
+ switch (type) {
53
+ case "human":
54
+ return (bitmap & BIT_HUMAN) !== 0;
55
+ case "api":
56
+ return (bitmap & BIT_API) !== 0;
57
+ case "contract":
58
+ return (bitmap & BIT_CONTRACT) !== 0;
59
+ default:
60
+ throw new OmaTrustError("INVALID_INPUT", "Unsupported interface type", { type });
61
+ }
62
+ }
63
+ function getInterfaceTypes(bitmap) {
64
+ const results = [];
65
+ if (hasInterface(bitmap, "human")) {
66
+ results.push("human");
67
+ }
68
+ if (hasInterface(bitmap, "api")) {
69
+ results.push("api");
70
+ }
71
+ if (hasInterface(bitmap, "contract")) {
72
+ results.push("contract");
73
+ }
74
+ return results;
75
+ }
76
+
77
+ // src/app-registry/status.ts
78
+ function registryCodeToStatus(code) {
79
+ switch (code) {
80
+ case 0:
81
+ return "Active";
82
+ case 1:
83
+ return "Deprecated";
84
+ case 2:
85
+ return "Replaced";
86
+ default:
87
+ throw new OmaTrustError("INVALID_INPUT", "Invalid registry status code", { code });
88
+ }
89
+ }
90
+ function registryStatusToCode(status) {
91
+ switch (status) {
92
+ case "Active":
93
+ return 0;
94
+ case "Deprecated":
95
+ return 1;
96
+ case "Replaced":
97
+ return 2;
98
+ default:
99
+ throw new OmaTrustError("INVALID_INPUT", "Invalid registry status", { status });
100
+ }
101
+ }
102
+ function isValidRegistryStatus(status) {
103
+ return status === "Active" || status === "Deprecated" || status === "Replaced";
104
+ }
105
+
106
+ // src/app-registry/version.ts
107
+ function parseVersion(input) {
108
+ const match = input.match(/^(\d+)\.(\d+)\.(\d+)$/);
109
+ if (!match) {
110
+ throw new OmaTrustError("INVALID_INPUT", "Invalid semantic version", { input });
111
+ }
112
+ return {
113
+ major: Number(match[1]),
114
+ minor: Number(match[2]),
115
+ patch: Number(match[3])
116
+ };
117
+ }
118
+ function formatVersion(version) {
119
+ return `${version.major}.${version.minor}.${version.patch}`;
120
+ }
121
+ function compareVersions(a, b) {
122
+ if (a.major !== b.major) {
123
+ return a.major < b.major ? -1 : 1;
124
+ }
125
+ if (a.minor !== b.minor) {
126
+ return a.minor < b.minor ? -1 : 1;
127
+ }
128
+ if (a.patch !== b.patch) {
129
+ return a.patch < b.patch ? -1 : 1;
130
+ }
131
+ return 0;
132
+ }
133
+ function isVersionGreater(a, b) {
134
+ return compareVersions(a, b) === 1;
135
+ }
136
+ function isVersionEqual(a, b) {
137
+ return compareVersions(a, b) === 0;
138
+ }
139
+ function getLatestVersion(history) {
140
+ if (history.length === 0) {
141
+ throw new OmaTrustError("INVALID_INPUT", "Version history cannot be empty");
142
+ }
143
+ return history.reduce((current, candidate) => {
144
+ return compareVersions(candidate, current) === 1 ? candidate : current;
145
+ });
146
+ }
147
+
148
+ // src/app-registry/metadata-keys.ts
149
+ var METADATA_KEY_DID = "omat.did";
150
+ var METADATA_KEY_DID_HASH = "omat.didHash";
151
+ var METADATA_KEY_DATA_HASH = "omat.dataHash";
152
+ var METADATA_KEY_DATA_HASH_ALGORITHM = "omat.dataHashAlgorithm";
153
+ var METADATA_KEY_STATUS = "omat.status";
154
+ var METADATA_KEY_INTERFACES = "omat.interfaces";
155
+ var METADATA_KEY_FUNGIBLE_TOKEN_ID = "omat.fungibleTokenId";
156
+ var METADATA_KEY_CONTRACT_ID = "omat.contractId";
157
+ var METADATA_KEY_VERSION_MAJOR = "omat.versionMajor";
158
+ var METADATA_KEY_VERSION_MINOR = "omat.versionMinor";
159
+ var METADATA_KEY_VERSION_PATCH = "omat.versionPatch";
160
+ var METADATA_KEY_TRAIT_HASHES = "omat.traitHashes";
161
+ var METADATA_KEY_METADATA_JSON = "omat.metadataJson";
162
+ function canonicalizeJson(obj) {
163
+ const jcs = canonicalize(obj);
164
+ if (!jcs) {
165
+ throw new OmaTrustError("INVALID_INPUT", "Object cannot be canonicalized", { obj });
166
+ }
167
+ return jcs;
168
+ }
169
+
170
+ // src/app-registry/data-hash.ts
171
+ async function fetchJson(url) {
172
+ let response;
173
+ try {
174
+ response = await fetch(url, { headers: { Accept: "application/json" } });
175
+ } catch (err) {
176
+ throw new OmaTrustError("NETWORK_ERROR", "Failed to fetch data URL", { url, err });
177
+ }
178
+ if (!response.ok) {
179
+ throw new OmaTrustError("NETWORK_ERROR", "Failed to fetch data URL", {
180
+ url,
181
+ status: response.status
182
+ });
183
+ }
184
+ try {
185
+ return await response.json();
186
+ } catch (err) {
187
+ throw new OmaTrustError("INVALID_INPUT", "Response body is not valid JSON", { url, err });
188
+ }
189
+ }
190
+ function hashJcs(jcsJson, algorithm) {
191
+ const bytes = toUtf8Bytes(jcsJson);
192
+ return algorithm === "keccak256" ? keccak256(bytes) : sha256(bytes);
193
+ }
194
+ async function computeDataHashFromUrl(url, algorithm) {
195
+ if (!url || typeof url !== "string") {
196
+ throw new OmaTrustError("INVALID_INPUT", "url must be a non-empty string", { url });
197
+ }
198
+ const json = await fetchJson(url);
199
+ const jcsJson = canonicalizeJson(json);
200
+ return hashJcs(jcsJson, algorithm);
201
+ }
202
+ async function verifyDataUrlHash(url, expectedHash, algorithm) {
203
+ const computedHash = await computeDataHashFromUrl(url, algorithm);
204
+ return computedHash.toLowerCase() === expectedHash.toLowerCase();
205
+ }
206
+
207
+ export { METADATA_KEY_CONTRACT_ID, METADATA_KEY_DATA_HASH, METADATA_KEY_DATA_HASH_ALGORITHM, METADATA_KEY_DID, METADATA_KEY_DID_HASH, METADATA_KEY_FUNGIBLE_TOKEN_ID, METADATA_KEY_INTERFACES, METADATA_KEY_METADATA_JSON, METADATA_KEY_STATUS, METADATA_KEY_TRAIT_HASHES, METADATA_KEY_VERSION_MAJOR, METADATA_KEY_VERSION_MINOR, METADATA_KEY_VERSION_PATCH, compareVersions, computeDataHashFromUrl, computeInterfacesBitmap, formatVersion, getInterfaceTypes, getLatestVersion, hasInterface, hashTrait, hashTraits, isValidRegistryStatus, isVersionEqual, isVersionGreater, parseBitmapToFlags, parseVersion, registryCodeToStatus, registryStatusToCode, verifyDataUrlHash };
208
+ //# sourceMappingURL=index.js.map
209
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/errors.ts","../../src/shared/assert.ts","../../src/app-registry/traits.ts","../../src/app-registry/interfaces.ts","../../src/app-registry/status.ts","../../src/app-registry/version.ts","../../src/app-registry/metadata-keys.ts","../../src/identity/data.ts","../../src/app-registry/data-hash.ts"],"names":["toUtf8Bytes","keccak256","sha256"],"mappings":"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","file":"index.js","sourcesContent":["export class OmaTrustError extends Error {\n code: string;\n details?: unknown;\n\n constructor(code: string, message: string, details?: unknown) {\n super(message);\n this.name = \"OmaTrustError\";\n this.code = code;\n this.details = details;\n }\n}\n\nexport function toOmaTrustError(\n code: string,\n message: string,\n details?: unknown\n): OmaTrustError {\n return new OmaTrustError(code, message, details);\n}\n","import { OmaTrustError } from \"./errors\";\n\nexport function assertString(value: unknown, name: string, code = \"INVALID_INPUT\"): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new OmaTrustError(code, `${name} must be a non-empty string`, { value });\n }\n}\n\nexport function assertNumber(value: unknown, name: string, code = \"INVALID_INPUT\"): asserts value is number {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new OmaTrustError(code, `${name} must be a valid number`, { value });\n }\n}\n\nexport function assertObject(value: unknown, name: string, code = \"INVALID_INPUT\"): asserts value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new OmaTrustError(code, `${name} must be an object`, { value });\n }\n}\n\nexport function asError(err: unknown): Error {\n if (err instanceof Error) {\n return err;\n }\n return new Error(String(err));\n}\n","import { id } from \"ethers\";\nimport { assertString } from \"../shared/assert\";\n\ntype Hex = `0x${string}`;\n\nexport function hashTrait(trait: string): Hex {\n assertString(trait, \"trait\");\n return id(trait) as Hex;\n}\n\nexport function hashTraits(traits: string[]): Hex[] {\n if (!Array.isArray(traits)) {\n throw new TypeError(\"traits must be an array\");\n }\n return traits.map((trait) => hashTrait(trait));\n}\n","import type { InterfaceFlags, InterfaceType } from \"./types\";\nimport { OmaTrustError } from \"../shared/errors\";\n\nconst BIT_HUMAN = 1;\nconst BIT_API = 2;\nconst BIT_CONTRACT = 4;\n\nexport function computeInterfacesBitmap(flags: InterfaceFlags): number {\n return (flags.human ? BIT_HUMAN : 0) +\n (flags.api ? BIT_API : 0) +\n (flags.smartContract ? BIT_CONTRACT : 0);\n}\n\nexport function parseBitmapToFlags(bitmap: number): InterfaceFlags {\n return {\n human: (bitmap & BIT_HUMAN) !== 0,\n api: (bitmap & BIT_API) !== 0,\n smartContract: (bitmap & BIT_CONTRACT) !== 0\n };\n}\n\nexport function hasInterface(bitmap: number, type: InterfaceType): boolean {\n switch (type) {\n case \"human\":\n return (bitmap & BIT_HUMAN) !== 0;\n case \"api\":\n return (bitmap & BIT_API) !== 0;\n case \"contract\":\n return (bitmap & BIT_CONTRACT) !== 0;\n default:\n throw new OmaTrustError(\"INVALID_INPUT\", \"Unsupported interface type\", { type });\n }\n}\n\nexport function getInterfaceTypes(bitmap: number): InterfaceType[] {\n const results: InterfaceType[] = [];\n if (hasInterface(bitmap, \"human\")) {\n results.push(\"human\");\n }\n if (hasInterface(bitmap, \"api\")) {\n results.push(\"api\");\n }\n if (hasInterface(bitmap, \"contract\")) {\n results.push(\"contract\");\n }\n return results;\n}\n","import type { RegistryStatus } from \"./types\";\nimport { OmaTrustError } from \"../shared/errors\";\n\nexport function registryCodeToStatus(code: number): RegistryStatus {\n switch (code) {\n case 0:\n return \"Active\";\n case 1:\n return \"Deprecated\";\n case 2:\n return \"Replaced\";\n default:\n throw new OmaTrustError(\"INVALID_INPUT\", \"Invalid registry status code\", { code });\n }\n}\n\nexport function registryStatusToCode(status: RegistryStatus): number {\n switch (status) {\n case \"Active\":\n return 0;\n case \"Deprecated\":\n return 1;\n case \"Replaced\":\n return 2;\n default:\n throw new OmaTrustError(\"INVALID_INPUT\", \"Invalid registry status\", { status });\n }\n}\n\nexport function isValidRegistryStatus(status: string): status is RegistryStatus {\n return status === \"Active\" || status === \"Deprecated\" || status === \"Replaced\";\n}\n","import type { Version } from \"./types\";\nimport { OmaTrustError } from \"../shared/errors\";\n\nexport function parseVersion(input: string): Version {\n const match = input.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n if (!match) {\n throw new OmaTrustError(\"INVALID_INPUT\", \"Invalid semantic version\", { input });\n }\n\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3])\n };\n}\n\nexport function formatVersion(version: Version): string {\n return `${version.major}.${version.minor}.${version.patch}`;\n}\n\nexport function compareVersions(a: Version, b: Version): -1 | 0 | 1 {\n if (a.major !== b.major) {\n return a.major < b.major ? -1 : 1;\n }\n if (a.minor !== b.minor) {\n return a.minor < b.minor ? -1 : 1;\n }\n if (a.patch !== b.patch) {\n return a.patch < b.patch ? -1 : 1;\n }\n return 0;\n}\n\nexport function isVersionGreater(a: Version, b: Version): boolean {\n return compareVersions(a, b) === 1;\n}\n\nexport function isVersionEqual(a: Version, b: Version): boolean {\n return compareVersions(a, b) === 0;\n}\n\nexport function getLatestVersion(history: Version[]): Version {\n if (history.length === 0) {\n throw new OmaTrustError(\"INVALID_INPUT\", \"Version history cannot be empty\");\n }\n\n return history.reduce((current, candidate) => {\n return compareVersions(candidate, current) === 1 ? candidate : current;\n });\n}\n","export const METADATA_KEY_DID = \"omat.did\";\nexport const METADATA_KEY_DID_HASH = \"omat.didHash\";\nexport const METADATA_KEY_DATA_HASH = \"omat.dataHash\";\nexport const METADATA_KEY_DATA_HASH_ALGORITHM = \"omat.dataHashAlgorithm\";\nexport const METADATA_KEY_STATUS = \"omat.status\";\nexport const METADATA_KEY_INTERFACES = \"omat.interfaces\";\nexport const METADATA_KEY_FUNGIBLE_TOKEN_ID = \"omat.fungibleTokenId\";\nexport const METADATA_KEY_CONTRACT_ID = \"omat.contractId\";\nexport const METADATA_KEY_VERSION_MAJOR = \"omat.versionMajor\";\nexport const METADATA_KEY_VERSION_MINOR = \"omat.versionMinor\";\nexport const METADATA_KEY_VERSION_PATCH = \"omat.versionPatch\";\nexport const METADATA_KEY_TRAIT_HASHES = \"omat.traitHashes\";\nexport const METADATA_KEY_METADATA_JSON = \"omat.metadataJson\";\n","import canonicalize from \"canonicalize\";\nimport { keccak256, sha256, toUtf8Bytes } from \"ethers\";\nimport { OmaTrustError } from \"../shared/errors\";\n\ntype Hex = `0x${string}`;\n\nexport function canonicalizeJson(obj: unknown): string {\n const jcs = canonicalize(obj);\n if (!jcs) {\n throw new OmaTrustError(\"INVALID_INPUT\", \"Object cannot be canonicalized\", { obj });\n }\n return jcs;\n}\n\nexport function canonicalizeForHash(obj: unknown): { jcsJson: string; hash: Hex } {\n const jcsJson = canonicalizeJson(obj);\n return {\n jcsJson,\n hash: keccak256(toUtf8Bytes(jcsJson)) as Hex\n };\n}\n\nexport function hashCanonicalizedJson(obj: unknown, algorithm: \"keccak256\" | \"sha256\"): Hex {\n const jcs = canonicalizeJson(obj);\n const bytes = toUtf8Bytes(jcs);\n return (algorithm === \"keccak256\" ? keccak256(bytes) : sha256(bytes)) as Hex;\n}\n","import { keccak256, sha256, toUtf8Bytes } from \"ethers\";\nimport { canonicalizeJson } from \"../identity/data\";\nimport { OmaTrustError } from \"../shared/errors\";\n\ntype Hex = `0x${string}`;\nexport type DataHashAlgorithm = \"keccak256\" | \"sha256\";\n\nasync function fetchJson(url: string): Promise<unknown> {\n let response: Response;\n try {\n response = await fetch(url, { headers: { Accept: \"application/json\" } });\n } catch (err) {\n throw new OmaTrustError(\"NETWORK_ERROR\", \"Failed to fetch data URL\", { url, err });\n }\n\n if (!response.ok) {\n throw new OmaTrustError(\"NETWORK_ERROR\", \"Failed to fetch data URL\", {\n url,\n status: response.status\n });\n }\n\n try {\n return await response.json();\n } catch (err) {\n throw new OmaTrustError(\"INVALID_INPUT\", \"Response body is not valid JSON\", { url, err });\n }\n}\n\nfunction hashJcs(jcsJson: string, algorithm: DataHashAlgorithm): Hex {\n const bytes = toUtf8Bytes(jcsJson);\n return (algorithm === \"keccak256\" ? keccak256(bytes) : sha256(bytes)) as Hex;\n}\n\nexport async function computeDataHashFromUrl(\n url: string,\n algorithm: DataHashAlgorithm\n): Promise<Hex> {\n if (!url || typeof url !== \"string\") {\n throw new OmaTrustError(\"INVALID_INPUT\", \"url must be a non-empty string\", { url });\n }\n\n const json = await fetchJson(url);\n const jcsJson = canonicalizeJson(json);\n return hashJcs(jcsJson, algorithm);\n}\n\nexport async function verifyDataUrlHash(\n url: string,\n expectedHash: Hex,\n algorithm: DataHashAlgorithm\n): Promise<boolean> {\n const computedHash = await computeDataHashFromUrl(url, algorithm);\n return computedHash.toLowerCase() === expectedHash.toLowerCase();\n}\n"]}