ocp-verify 1.1.0 → 2.0.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/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ # Changelog
2
+
3
+ All notable changes to this package will be documented in this file.
4
+
5
+ ## [2.0.0] — 2026-06-10
6
+
7
+ First release implementing ERC-8281 (`erc8281/1`) with the Extraction Profiles extension.
8
+
9
+ ### Added
10
+
11
+ - Full 5-step verification invariant: recompute → compare → confirm inclusion → confirm committer → confirm block, with fail-closed semantics (partial verification is never reported as success).
12
+ - Extraction profile registry with both registered profiles:
13
+ - `recorded` (default) — `Recorded(bytes32,address)`, 3 topics, digest at `topics[1]`, committer at `topics[2]`.
14
+ - `erc8263-anchorproof` — `AnchorProof(uint8,bytes32,bytes32,address,bytes)`, 4 topics, digest (`proofHash`) at `topics[2]`, committer (`operator`) at `topics[3]`, with the `proofHash != bytes32(0)` canonical-form assertion. `agentId` is not authenticated.
15
+ - Dependency-free hash implementations for the full registry: `sha2-256` (node:crypto), `keccak-256` (pure JS), `blake2b-256` (pure JS, parameterized digest length per RFC 7693 — not truncated BLAKE2b-512), each validated against known vectors via `selfTest()`.
16
+ - Envelope schema validation and field normalization: exact-match `erc8281/1` version check, decoded-value comparisons throughout, EIP-55 checksum validation with rejection of invalid addresses, unknown-field tolerance.
17
+ - `eth_chainId` verification against the envelope's `chain_id` before any receipt fetch.
18
+ - Log selection by `receipt_log_position` (receipt-array position, explicitly not the block-scoped JSON-RPC `logIndex`).
19
+ - Strict topic-count assertions per profile (exactly 3 for `recorded`, exactly 4 for `erc8263-anchorproof`), rejecting crafted logs with a matching topic-0 but wrong shape.
20
+ - Optional `block_hash` handled as MUST-when-present against the receipt's `blockHash` (reorg detection).
21
+ - Rejection of unregistered extraction profiles and non-registry hash functions.
22
+ - Verified constants exported: `TOPIC0_RECORDED` (`0xdca60c2087041cbb12d9a57628c6cad28ecbd0437e47c7ab6c3aa6e162bf4497`), `TOPIC0_ERC8263_ANCHORPROOF` (`0x9fe832d83a52f83bd7d54181e4cc7ff8b4e227cc1d3a0144376894b5df6c23cc`), `ERC165_INTERFACE_ID` (`0xb5c645bd`).
23
+ - `httpProvider(rpcUrl)` convenience provider (global fetch, Node 18+) and injectable-provider design for multi-endpoint cross-checking or offline fixtures.
24
+ - Dual ESM/CommonJS entry points with zero runtime dependencies; Node.js >= 18.
25
+ - Conformance suite: ERC-8281 test vectors 1–21 plus the BLAKE2b-truncation negative companion (03b) as offline fixtures, hash self-tests, constant recomputation, EIP-55 unit vectors, and an authenticated-field mutation sweep. 26 tests.
26
+
27
+ ### Breaking changes from pre-release (`ocp/1.0`) tooling
28
+
29
+ - Event signature is `Recorded(bytes32,address)` — the v0 `Recorded(bytes32,address,uint256)` signature and its topic-0 are not supported.
30
+ - Envelope requires `receipt_log_position`; the v0 `timestamp` field is removed; version string is `erc8281/1`.
package/README.md CHANGED
@@ -1,377 +1,123 @@
1
- # Observation Commitment Protocol (OCP)
1
+ # ocp-verify
2
2
 
3
- If one byte changes, verification fails across any chain, any system.
3
+ Reference verifier for **ERC-8281Observation Commitment Protocol (OCP)**.
4
4
 
5
- A chain-agnostic primitive for independently verifying that a specific byte sequence was committed to a public ledger.
5
+ Independently confirm that a specific byte sequence was committed on-chain *recompute → compare → confirm inclusion* — using only an RPC endpoint or local node. No trusted SDK, gateway, or indexer.
6
6
 
7
- Minimal. Verifiable. System-independent.
7
+ - Implements the full 5-step ERC-8281 verification invariant (`erc8281/1`)
8
+ - Supports both registered extraction profiles: `recorded` (default) and `erc8263-anchorproof`
9
+ - All three registry hash functions — `sha2-256`, `keccak-256`, `blake2b-256` — implemented dependency-free and validated against known vectors at test time
10
+ - **Zero runtime dependencies.** Node.js 18+. ESM and CommonJS.
8
11
 
9
- ---
12
+ ## Installation
10
13
 
11
- ## ⚡ 30-Second Demo (start here)
12
-
13
- ```bash
14
- cd examples/oh-shit-demo
15
- ./run-demo.sh
16
- ```
17
-
18
- Expected:
19
-
20
- ```
21
- VALID
22
- INVALID
23
- ```
24
-
25
- If one byte changes, verification fails — across any system.
26
-
27
- ---
28
-
29
- ## 🔌 Integrate in 2 Minutes
30
-
31
- ### Install
32
-
33
- ```bash
34
- npm install -g ocp-verify
35
- ```
36
-
37
- Or use without installing:
38
-
39
- ```bash
40
- npx ocp-verify myfile.txt myfile.proof.json
41
- ```
42
-
43
- ### 1) Commit (produce a proof)
44
-
45
- ```bash
46
- npx ocp-commit report.txt
47
- ```
48
-
49
- This automatically creates:
50
-
51
- ```bash
52
- report.proof.json
53
- ```
54
-
55
- ### 2) Verify (anywhere, later)
56
-
57
- ```bash
58
- npx ocp-verify report.txt
59
- ```
60
-
61
- Expected:
62
-
63
- ```
64
- VALID
65
- ```
66
-
67
- If any byte changes:
68
-
69
- ```
70
- INVALID: hash mismatch
71
- ```
72
-
73
- ### 3) Test tampering (optional)
74
-
75
- ```bash
76
- npx ocp-verify tampered.txt report.proof.json
77
- ```
78
-
79
- ### 4) Use in your system
80
-
81
- - Save the file + proof together
82
- - Or store the proof alongside records/logs
83
- - Verification requires only the file and the proof
84
-
85
- No API. No platform dependency.
86
-
87
- ---
88
-
89
- ## The Problem
90
-
91
- Every AI system running today has the same problem.
92
-
93
- You can't verify what it did.
94
-
95
- Not really. You can ask the platform. You can trust the logs. You can hope the provider is telling the truth. But there is no independent, tamper-proof record of what an AI received, what it produced, and whether anything was changed in between.
96
-
97
- Most digital systems can prove things — but only **inside themselves**.
98
-
99
- Step outside the system, and verification depends on:
100
- - APIs
101
- - platforms
102
- - intermediaries
103
-
104
- OCP eliminates that dependency entirely.
105
-
106
- ---
107
-
108
- ## Where This Breaks Without OCP
109
-
110
- - AI outputs cannot be independently verified
111
- - Legal evidence depends on originating systems
112
- - APIs and platforms are non-permanent
113
- - Digital artifacts become disputable over time
114
-
115
- Without a system-independent verification boundary,
116
- "what actually happened" becomes ambiguous.
117
-
118
- ---
119
-
120
- ## Use Cases
121
-
122
- OCP can be used anywhere a digital artifact may need to be independently verified later:
123
-
124
- - AI outputs and execution traces
125
- - Legal evidence and filings
126
- - Audit logs and compliance records
127
- - Media provenance
128
- - File integrity
129
- - Institutional records
130
-
131
- ### Example: Verifying an AI Output
132
-
133
- An AI system generates a report:
134
-
135
- ```text
136
- AI Risk Assessment: MEDIUM_RISK
137
- Approved for internal review.
14
+ ```sh
15
+ npm install ocp-verify
138
16
  ```
139
17
 
140
- That output is committed using OCP.
18
+ ## Usage
141
19
 
142
- Later, the report is modified:
143
-
144
- ```text
145
- AI Risk Assessment: LOW_RISK
146
- Approved for internal review.
147
- ```
148
-
149
- Using the original proof:
150
-
151
- - the original output verifies as VALID
152
- - the modified output returns INVALID
153
-
154
- The difference is one word.
155
-
156
- Verification does not depend on the AI system, API, or platform.
157
-
158
- It depends only on the bytes.
159
-
160
- ---
161
-
162
- ## The Protocol
163
-
164
- An observation is any byte sequence.
165
-
166
- ```
167
- data → digest → public commitment
168
- ```
169
-
170
- Verification reduces to:
171
-
172
- ```
173
- recompute → compare → confirm inclusion
174
- ```
175
-
176
- A verifier:
177
- - recomputes the digest
178
- - compares it to the committed value
179
- - confirms that the digest exists in a referenced transaction
180
-
181
- No API. No platform dependency. No trust in the originating system.
182
-
183
- ---
184
-
185
- ## Proof Envelope
186
-
187
- OCP proofs are self-describing, chain-agnostic JSON artifacts. A valid proof envelope is verifiable against raw ledger data — no SDK, no RPC provider, no indexer required.
188
-
189
- ```json
190
- {
191
- "ocp": "1.0",
192
- "chain": {
193
- "id": "eip155:84532",
194
- "namespace": "evm"
195
- },
196
- "commitment": {
197
- "digest": "14cca453684a18c1ef3e1c0b9a7744cfa06942660719bba373ef5fc36208bf73",
198
- "hash_function": "sha2-256",
199
- "serialization": "raw-bytes"
200
- },
201
- "ledger_ref": {
202
- "transaction_id": "0xf2e1f6c085768b4e3d60463717d52bb2a338803a74a4cfd48aea5738d2595ddd",
203
- "block_height": 41658348,
204
- "block_hash": "0x...",
205
- "finality": {
206
- "depth": 3,
207
- "assertion_time_utc": "2026-05-17T12:00:00Z"
208
- }
209
- },
210
- "extraction": {
211
- "rule_id": "evm/event-log",
212
- "rule_version": "1.0.0"
213
- },
214
- "meta": {
215
- "created_utc": "2026-05-17T12:00:05Z",
216
- "envelope_version": "1.0"
217
- }
218
- }
219
- ```
220
-
221
- ---
222
-
223
- ## Reference Implementation — Live on Base Sepolia
224
-
225
- Contract: `0x0963Fd33DF80c94360F2DC22e5c09517AeE7ED5c`
226
-
227
- ```solidity
228
- contract ObservationCommitment {
229
- event Recorded(bytes32 indexed digest, address indexed recorder);
230
-
231
- function record(bytes32 digest) external {
232
- emit Recorded(digest, msg.sender);
233
- }
20
+ ```js
21
+ // ESM
22
+ import { verify, httpProvider } from 'ocp-verify';
23
+
24
+ // CommonJS
25
+ // const { verify, httpProvider } = require('ocp-verify');
26
+
27
+ const envelope = {
28
+ version: 'erc8281/1',
29
+ digest: '0x6f3a…', // hash of the observation bytes
30
+ hash_function: 'sha2-256',
31
+ chain_id: '42161',
32
+ contract: '0x0C0117AC70000000000000000000000000000001',
33
+ tx_hash: '0x9be1…',
34
+ block_number: '352800417',
35
+ receipt_log_position: '0',
36
+ committer: '0xc0Aa17dE0000000000000000000000000000beEf',
37
+ // optional:
38
+ // block_hash: '0x…', // MUST match the receipt's blockHash when present
39
+ // extraction_profile: 'recorded', // defaults to 'recorded' when absent
40
+ };
41
+
42
+ const observationBytes = new Uint8Array(/* the observed bytes, supplied out-of-band */);
43
+
44
+ const result = await verify(envelope, observationBytes, httpProvider('https://arb1.arbitrum.io/rpc'));
45
+
46
+ if (result.valid) {
47
+ // the observation bytes were committed on-chain at the referenced block
48
+ // by the declared committer
49
+ } else {
50
+ console.error('rejected:', result.reason); // e.g. 'digest_mismatch'
234
51
  }
235
52
  ```
236
53
 
237
- Live verification zero dependencies, Node.js stdlib only:
238
-
239
- ```
240
- hash MATCH 14cca453684a18c1ef3e1c0b9a7744cfa06942660719bba373ef5fc36208bf73
241
- chain eip155:84532
242
- rpc https://sepolia.base.org
243
- tx 0xf2e1f6c085768b4e3d60463717d52bb2a338803a74a4cfd48aea5738d2595ddd
244
- logs found 1 Recorded event(s)
245
- digest MATCH 14cca453684a18c1ef3e1c0b9a7744cfa06942660719bba373ef5fc36208bf73
246
-
247
- VALID
248
- ```
249
-
250
- ---
251
-
252
- ## What OCP Defines
253
-
254
- - A minimal verification model
255
- - A system-independent verification boundary
256
- - A portable, self-describing proof envelope (chain-agnostic)
257
- - A formal extraction rule registry (`evm/event-log`, `solana/instruction-data`)
258
-
259
- ---
260
-
261
- ## What OCP Does Not Define
262
-
263
- - Storage
264
- - Identity
265
- - Authorship
266
- - Canonical encoding
267
- - Application-layer semantics
268
- - Sanitization or preprocessing pipelines
54
+ The result is `{ valid: true }` or `{ valid: false, reason }`. Partial verification is never reported as success.
269
55
 
270
- ---
56
+ ### Custom providers
271
57
 
272
- ## In the Wild
58
+ `verify()` takes any object with `eth_chainId()` and `eth_getTransactionReceipt(txHash)`. Use this to cross-check multiple RPC endpoints, route through a light client, or run offline against fixtures (this is how the conformance suite works):
273
59
 
274
- OCP is being adopted as the Layer 3 commitment primitive in the ERC-8004 Universal AI Inference Verification Registry stack:
275
-
276
- ```
277
- L2 — input provenance: raw sanitize commit
278
- L3 — OCP: digest → on-chain → verify from raw block
279
- L4 — EIP-712 signed inference attestation
280
- L5 — registry routes to zkML / opML / TEE
281
- ```
282
-
283
- The identity pipeline sentinel hash has been confirmed between two independent implementations:
284
-
285
- ```
286
- 8116eec29078e8f57c07077d5e8080a35bde73036581df3abb93755d1b1a16ea
60
+ ```js
61
+ const provider = {
62
+ eth_chainId: async () => '0xa4b1',
63
+ eth_getTransactionReceipt: async (txHash) => myReceiptSource(txHash),
64
+ };
287
65
  ```
288
66
 
289
- The full stack is live in production. L3 tx on Base Sepolia, block 41731493:
290
- https://sepolia.basescan.org/tx/0xc3aeb16d0aef167e2ebc6d4afc9333fcd13a71b8c02e5485bc6be7491e393319
67
+ ## What verification proves and what it doesn't
291
68
 
292
- Thread: https://ethereum-magicians.org/t/draft-erc-universal-ai-inference-verification-registry/28083/20
69
+ A passing verification authenticates these envelope fields: `digest`, `hash_function`, `chain_id`, `contract`, `tx_hash`, `receipt_log_position`, `committer`, `block_number`, `block_hash` (when present), and `extraction_profile` (when present). It proves the supplied observation bytes hash to a digest that the named contract emitted in an event of the declared profile's shape, in the referenced transaction and block, by the declared committer.
293
70
 
294
- ---
71
+ It does **not** prove that the contract is a conforming ERC-8281 deployment (any contract can emit an event with the canonical signature — check ERC-165 interface ID `0xb5c645bd` or maintain a registry of trusted addresses), that the committer authored the observation, or anything about fields a profile doesn't extract (under `erc8263-anchorproof`, the `agentId` is **not** authenticated).
295
72
 
296
- ## Why It Matters
73
+ ## Envelope schema (`erc8281/1`)
297
74
 
298
- OCP separates **verification from systems**.
75
+ | Field | Required | Format |
76
+ |---|---|---|
77
+ | `version` | yes | exact string `erc8281/1` |
78
+ | `digest` | yes | 0x-prefixed lowercase hex, 32 bytes |
79
+ | `hash_function` | yes | `sha2-256` \| `keccak-256` \| `blake2b-256` |
80
+ | `chain_id` | yes | decimal string, EIP-155 chain ID |
81
+ | `contract` | yes | EIP-55 checksummed address (invalid checksums are rejected) |
82
+ | `tx_hash` | yes | 0x-prefixed lowercase hex, 32 bytes |
83
+ | `block_number` | yes | decimal string |
84
+ | `receipt_log_position` | yes | decimal string — array position within `receipt.logs`. **NOT the JSON-RPC `logIndex` field**, which is block-scoped |
85
+ | `committer` | yes | EIP-55 checksummed address |
86
+ | `block_hash` | no | 0x-prefixed lowercase hex, 32 bytes; when present, MUST equal the receipt's `blockHash` (reorg detection) |
87
+ | `extraction_profile` | no | registered profile identifier; defaults to `recorded` |
299
88
 
300
- A verifier does not ask what's true
301
- they compute it.
89
+ Unknown additional fields are ignored. All comparisons are over decoded bytes/integers, never raw strings. `blake2b-256` is the *parameterized* form (digest length in the BLAKE2b parameter block) — not a truncation of BLAKE2b-512.
302
90
 
303
- The network only confirms that a commitment exists.
91
+ ## Extraction profiles
304
92
 
305
- ---
93
+ | Profile | Event | Topics | Digest | Committer |
94
+ |---|---|---|---|---|
95
+ | `recorded` (default) | `Recorded(bytes32,address)` | exactly 3 | `topics[1]` | `topics[2]` |
96
+ | `erc8263-anchorproof` | `AnchorProof(uint8,bytes32,bytes32,address,bytes)` | exactly 4 | `topics[2]` (`proofHash`) | `topics[3]` (`operator`) |
306
97
 
307
- ## Start Here
98
+ Verified topic-0 constants:
308
99
 
309
- - 📄 Core Specification → `/docs/spec/ocp-v1.0.0.md`
310
- - 🗂️ Proof Envelope → `/docs/spec/ocp-proof-envelope-v1.0.0.md`
311
- - ⛓️ EVM Extraction Rule → `/docs/spec/appendix-evm-r.md`
312
- - 🔗 Solana Extraction Rule → `/docs/spec/appendix-solana-r.md`
313
- - 🤖 AI Inference Attestation → `/docs/spec/appendix-ai-inference-attestation.md`
314
- - 🧾 Proof Format → `/docs/spec/proof-format-v1.md`
315
- - 🔍 Examples → `/examples`
316
- - ✅ Conformance Suite → `/conformance/run-conformance.sh`
317
- - ⚙️ Contracts → `/contracts`
318
- - 🌐 Live Demo → https://observation-commitment-protocol.vercel.app/
100
+ - `recorded`: `0xdca60c2087041cbb12d9a57628c6cad28ecbd0437e47c7ab6c3aa6e162bf4497`
101
+ - `erc8263-anchorproof`: `0x9fe832d83a52f83bd7d54181e4cc7ff8b4e227cc1d3a0144376894b5df6c23cc`
319
102
 
320
- Reference implementation (VeraFile):
321
- https://github.com/damonzwicker/verafile
103
+ Profiles are a closed registry — envelopes cannot supply inline event signatures or topic indices, which would hand the prover control over what the verifier reads. Unregistered profile identifiers are rejected (`profile_not_registered`). The `erc8263-anchorproof` profile additionally enforces the ERC-8263 canonical-form guard `proofHash != bytes32(0)`.
322
104
 
323
- ---
105
+ ## Security notes
324
106
 
325
- ## Quick Verify
107
+ - **RPC trust.** A single RPC endpoint is a trusted party. `verify()` checks the endpoint's `eth_chainId` against the envelope before fetching, but an endpoint can still lie about receipts. For stronger guarantees, supply a provider that cross-checks independent endpoints or verifies receipts against light-client headers.
108
+ - **Finality.** A commitment is only as final as its block. Require finalized blocks or a confirmation depth appropriate to the chain and the value at risk; on L2s, understand the settlement tier you're getting. Include `block_hash` in envelopes to detect post-reorg block migration.
109
+ - **Hash allowlist.** Only the three registry functions are accepted; everything else is rejected (`hash_function_not_allowed`). This prevents a prover from declaring a weak hash and presenting a colliding observation.
110
+ - **Low-entropy observations.** The commitment is binding but not hiding — a digest of a predictable document is a dictionary-attack target. Salt low-entropy observations before hashing and supply the salt as part of the observation bytes.
111
+ - **Reverted transactions** carry no valid commitments; receipts with `status != 1` are rejected.
326
112
 
327
- ```bash
328
- npx ocp-verify examples/example-observation.txt
329
- ```
330
-
331
- Expected output:
332
-
333
- ```
334
- VALID
335
- ```
336
-
337
- ---
338
-
339
- ## Status
113
+ ## Conformance testing
340
114
 
341
- v1.0.0 — Cross-Chain Primitive
342
- Phase 1 complete — proof envelope schema
343
- Phase 2 complete — EVM reference implementation live
344
- Phase 3 complete — Solana devnet live, Gate 3 verified — same observation committed on EVM and Solana
345
- Phase 4 complete — ocp-verify published to npm, zero dependencies
346
- Phase 5 complete — conformance suite, 11/11 tests pass
347
- First external contribution merged — dinamic.eth / ERC-8004 (PR #1)
348
-
349
-
350
- ---
351
-
352
- ## Revocation Extension (v1.1.0)
353
-
354
- OCP now includes an optional revocation layer. Original commitments are never deleted or mutated — revocation is additive, represented as a new on-chain commitment referencing a prior digest.
355
-
356
- ```js
357
- const { verifyWithRevocation } = require('ocp-verify/reference-cli/revoke.js');
358
-
359
- const status = await verifyWithRevocation(
360
- digest,
361
- asOfTimestamp,
362
- 'eip155:84532'
363
- );
364
- // returns VALID | REVOKED | NOT_FOUND
115
+ ```sh
116
+ npm test
365
117
  ```
366
118
 
367
- - 📄 Revocation Spec `/docs/spec/appendix-revocation-r.md`
368
- - ⛓️ Deployed Contract → `0x2fa07c85439850ff6C5688d926bDa6DaEe62Db15` (Base Sepolia)
369
- - ✅ Revocation Conformance → `/conformance/revocation/run-revocation-conformance.sh`
370
- - 🔑 Event Topic → `0xc19951599a519bc320c0f352b2f92f315e8a2368bd0efb2e5dca3b1196e76112`
371
-
372
- ---
119
+ Runs the full ERC-8281 vector suite (vectors 1–21 plus the BLAKE2b negative companion 03b) against offline fixtures, validates all three hash implementations against known vectors, verifies the topic-0 and ERC-165 constants by recomputation, and runs a mutation sweep confirming that altering any authenticated field flips verification to rejection. No network access required.
373
120
 
374
- ## Status
121
+ ## License
375
122
 
376
- v1.1.0 — Revocation Extension
377
- Phase 6 complete — additive revocation primitive, 8/8 conformance tests pass
123
+ CC0-1.0
package/package.json CHANGED
@@ -1,41 +1,42 @@
1
1
  {
2
2
  "name": "ocp-verify",
3
- "version": "1.1.0",
4
- "description": "Zero-dependency verifier for the Observation Commitment Protocol independently verify that a file was committed to a public blockchain",
5
- "license": "MIT",
6
- "type": "commonjs",
7
- "engines": {
8
- "node": ">=18.0.0"
9
- },
10
- "bin": {
11
- "ocp-commit": "reference-cli/commit.js",
12
- "ocp-verify": "reference-cli/verify.js"
3
+ "version": "2.0.0",
4
+ "description": "ERC-8281 Observation Commitment Protocol (OCP) reference verifier: recompute compare confirm inclusion. Dependency-free, supports the recorded and erc8263-anchorproof extraction profiles.",
5
+ "license": "CC0-1.0",
6
+ "author": "Damon Zwicker <damon@ocp-labs.org>",
7
+ "homepage": "https://ocp-labs.org",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/damonzwicker/observation-commitment-protocol"
13
11
  },
14
- "files": [
15
- "reference-cli",
16
- "README.md",
17
- "LICENSE"
18
- ],
19
12
  "keywords": [
13
+ "erc-8281",
20
14
  "ocp",
21
- "observation-commitment-protocol",
22
- "blockchain",
15
+ "observation-commitment",
23
16
  "verification",
24
- "proof",
25
17
  "ethereum",
26
- "base",
27
- "solana",
28
- "ai-verification",
29
- "zero-dependency",
30
- "cryptography"
18
+ "proof",
19
+ "commitment",
20
+ "erc-8263"
31
21
  ],
32
- "author": "Damon Zwicker",
33
- "homepage": "https://github.com/damonzwicker/observation-commitment-protocol",
34
- "repository": {
35
- "type": "git",
36
- "url": "git+https://github.com/damonzwicker/observation-commitment-protocol.git"
22
+ "type": "commonjs",
23
+ "main": "./src/index.js",
24
+ "exports": {
25
+ ".": {
26
+ "import": "./src/index.mjs",
27
+ "require": "./src/index.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "src/",
32
+ "README.md",
33
+ "CHANGELOG.md"
34
+ ],
35
+ "engines": {
36
+ "node": ">=18"
37
+ },
38
+ "scripts": {
39
+ "test": "node --test"
37
40
  },
38
- "bugs": {
39
- "url": "https://github.com/damonzwicker/observation-commitment-protocol/issues"
40
- }
41
+ "dependencies": {}
41
42
  }