@midnight-ntwrk/credential-compact 0.3.0-rc1 → 0.3.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
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.3.0 - 2026-10-01
|
|
6
|
+
|
|
7
|
+
- Keep the repository's pnpm requirement development-only so published Compact
|
|
8
|
+
consumers are not coupled to this monorepo's package manager.
|
|
9
|
+
- BREAKING: Make typed Compact payload decoding fail closed unless descriptor
|
|
10
|
+
re-encoding reproduces the exact payload, rejecting alternate zero-padded
|
|
11
|
+
chunk widths and lossy descriptor round trips while preserving untyped chunk
|
|
12
|
+
framing.
|
|
5
13
|
- Add the supported explicit-holder presentation-proof composition, including
|
|
6
14
|
credential-to-presentation holder equality, signer-reference and accepted-key
|
|
7
15
|
binding, internally derived body-root verification, and substitution-negative
|
package/README.md
CHANGED
|
@@ -8,6 +8,21 @@ Supported pre-1.0 package for reusable, family-neutral Compact VC/VP
|
|
|
8
8
|
semantics. This is a library include surface, not a deployable contract,
|
|
9
9
|
credential family, proof artifact, or registry authority.
|
|
10
10
|
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add -E @midnight-ntwrk/credential-compact@0.2.0
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`0.2.0` is the current stable release. To evaluate the current 0.3 release
|
|
18
|
+
candidate explicitly, install
|
|
19
|
+
`@midnight-ntwrk/credential-compact@0.3.0-rc1` and keep every package in the
|
|
20
|
+
VC graph on that same version. Confirm the moving `rc` tag before adopting it:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm view @midnight-ntwrk/credential-compact dist-tags --json
|
|
24
|
+
```
|
|
25
|
+
|
|
11
26
|
## Scope
|
|
12
27
|
|
|
13
28
|
The package contains generic VC/VP envelopes, schema references, issuer and
|
|
@@ -95,3 +110,34 @@ the repository's npm publication runbook.
|
|
|
95
110
|
Consumers must use the package name and explicit exports, never repository
|
|
96
111
|
relative includes or `src`/`managed` paths. Candidate tarball and clean-consumer
|
|
97
112
|
checks compile every advertised Compact entrypoint outside this repository.
|
|
113
|
+
|
|
114
|
+
## TypeScript value framing
|
|
115
|
+
|
|
116
|
+
The TypeScript export encodes and decodes canonical Compact runtime values for
|
|
117
|
+
transport or storage. Typed application payloads should use
|
|
118
|
+
`encodeCompactPayload` and `decodeCompactPayload` with the generated descriptor
|
|
119
|
+
for that type.
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
import {
|
|
123
|
+
decodeCompactValue,
|
|
124
|
+
encodeCompactValue,
|
|
125
|
+
} from "@midnight-ntwrk/credential-compact";
|
|
126
|
+
|
|
127
|
+
const encoded = encodeCompactValue([Uint8Array.of(1, 2, 3)]);
|
|
128
|
+
const decoded = decodeCompactValue(encoded);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Compatibility and support
|
|
132
|
+
|
|
133
|
+
- The TypeScript surface is ESM-only and supports Node.js 24 or newer.
|
|
134
|
+
- Compact consumers use compiler `0.31.1`, runtime `0.16.0`, and Ledger
|
|
135
|
+
`8.0.2`.
|
|
136
|
+
- During `0.x`, breaking API changes may ship in a minor release. Keep exact
|
|
137
|
+
versions pinned and read [`CHANGELOG.md`](./CHANGELOG.md) before upgrading.
|
|
138
|
+
- Release candidates are supported only until a newer candidate or stable
|
|
139
|
+
release in the same minor line is published.
|
|
140
|
+
|
|
141
|
+
Technical ownership belongs to `@midnightntwrk/ex-identus`. Release operations
|
|
142
|
+
belong to `@midnightntwrk/mn-sre`. Security reports follow the repository
|
|
143
|
+
[`SECURITY.md`](../../../SECURITY.md) process.
|
package/dist/compact-build.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"version": "0.16.0"
|
|
7
7
|
},
|
|
8
8
|
"sourceDigest": "3a2e6360bfce9c9d182bee43b852347ae5ec3395c5e2ec0726a39b3c137d03dd",
|
|
9
|
-
"artifactDigest": "
|
|
9
|
+
"artifactDigest": "ea1cda2a6f0c0c7b113d8f6caf72da6dd06611b6cfca8dbf934b501a69fbff0d",
|
|
10
10
|
"sourceFiles": [
|
|
11
11
|
"src/credentials/composable.compact",
|
|
12
12
|
"src/credentials/holder-bindings.compact",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact-value-codec.d.ts","sourceRoot":"","sources":["../src/compact-value-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAE1E,eAAO,MAAM,sBAAsB,EAAG,4BAAqC,CAAC;AAS5E,MAAM,MAAM,oBAAoB,GAAG,OAAO,sBAAsB,CAAC;AAEjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAgFF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,SAAS,UAAU,EAAE,KAC3B,UAiBF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,UAAU,KAAG,KAyBzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,OAAO,SAAS,UAAU,EAAE,KAC3B,mBAGD,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,SAAS,mBAAmB,KAAG,KAKjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,YAAY,WAAW,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,KACP,mBAAoE,CAAC;AAExE,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,YAAY,WAAW,CAAC,CAAC,CAAC,EAC1B,SAAS,mBAAmB,KAC3B,
|
|
1
|
+
{"version":3,"file":"compact-value-codec.d.ts","sourceRoot":"","sources":["../src/compact-value-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAE1E,eAAO,MAAM,sBAAsB,EAAG,4BAAqC,CAAC;AAS5E,MAAM,MAAM,oBAAoB,GAAG,OAAO,sBAAsB,CAAC;AAEjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAgFF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,SAAS,UAAU,EAAE,KAC3B,UAiBF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,UAAU,KAAG,KAyBzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,OAAO,SAAS,UAAU,EAAE,KAC3B,mBAGD,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,SAAS,mBAAmB,KAAG,KAKjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,YAAY,WAAW,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,KACP,mBAAoE,CAAC;AAExE,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,YAAY,WAAW,CAAC,CAAC,CAAC,EAC1B,SAAS,mBAAmB,KAC3B,CAYF,CAAC"}
|
|
@@ -130,6 +130,9 @@ export const decodeCompactPayload = (descriptor, encoded) => {
|
|
|
130
130
|
if (runtimeValue.length !== 0) {
|
|
131
131
|
throw new Error("Compact value payload contains trailing chunks for descriptor");
|
|
132
132
|
}
|
|
133
|
+
if (encodeCompactPayload(descriptor, decoded).payload !== encoded.payload) {
|
|
134
|
+
throw new Error("Compact value payload is not canonical for descriptor");
|
|
135
|
+
}
|
|
133
136
|
return decoded;
|
|
134
137
|
};
|
|
135
138
|
//# sourceMappingURL=compact-value-codec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact-value-codec.js","sourceRoot":"","sources":["../src/compact-value-codec.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CompactType, Value } from \"@midnight-ntwrk/compact-runtime\";\n\nexport const COMPACT_VALUE_ENCODING = \"compact-value-v1.base64url\" as const;\n\nconst MAGIC = new Uint8Array([0x4d, 0x43, 0x56, 0x31]); // MCV1\nconst HEADER_LENGTH = MAGIC.length + 4;\nconst CHUNK_LENGTH_BYTES = 4;\nconst BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BASE64URL_TEXT = /^[A-Za-z0-9_-]+$/u;\n\nexport type CompactValueEncoding = typeof COMPACT_VALUE_ENCODING;\n\nexport type EncodedCompactValue = {\n readonly encoding: CompactValueEncoding;\n readonly payload: string;\n};\n\nconst assertUint32 = (value: number, label: string): void => {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffffff) {\n throw new Error(`${label} must fit into uint32`);\n }\n};\n\nconst writeUint32 = (\n target: Uint8Array,\n offset: number,\n value: number,\n): void => {\n assertUint32(value, \"uint32 value\");\n target[offset] = (value >>> 24) & 0xff;\n target[offset + 1] = (value >>> 16) & 0xff;\n target[offset + 2] = (value >>> 8) & 0xff;\n target[offset + 3] = value & 0xff;\n};\n\nconst readUint32 = (source: Uint8Array, offset: number): number => {\n if (offset + CHUNK_LENGTH_BYTES > source.length) {\n throw new Error(\"Compact value payload ended before uint32 field\");\n }\n return (\n source[offset] * 0x1000000 +\n ((source[offset + 1] ?? 0) << 16) +\n ((source[offset + 2] ?? 0) << 8) +\n (source[offset + 3] ?? 0)\n );\n};\n\nconst toBase64Url = (bytes: Uint8Array): string => {\n let encoded = \"\";\n for (let offset = 0; offset < bytes.length; offset += 3) {\n const first = bytes[offset] ?? 0;\n const second = bytes[offset + 1] ?? 0;\n const third = bytes[offset + 2] ?? 0;\n const packed = (first << 16) | (second << 8) | third;\n encoded += BASE64URL_ALPHABET[(packed >>> 18) & 0x3f];\n encoded += BASE64URL_ALPHABET[(packed >>> 12) & 0x3f];\n if (offset + 1 < bytes.length) {\n encoded += BASE64URL_ALPHABET[(packed >>> 6) & 0x3f];\n }\n if (offset + 2 < bytes.length) {\n encoded += BASE64URL_ALPHABET[packed & 0x3f];\n }\n }\n return encoded;\n};\n\nconst fromBase64Url = (value: string): Uint8Array => {\n if (value.length === 0) {\n throw new Error(\"Compact value payload must not be empty\");\n }\n if (!BASE64URL_TEXT.test(value) || value.length % 4 === 1) {\n throw new Error(\"Compact value payload is not valid unpadded base64url\");\n }\n const decoded = new Uint8Array(Math.floor((value.length * 6) / 8));\n let accumulator = 0;\n let bitCount = 0;\n let outputOffset = 0;\n for (const character of value) {\n const index = BASE64URL_ALPHABET.indexOf(character);\n accumulator = (accumulator << 6) | index;\n bitCount += 6;\n if (bitCount >= 8) {\n bitCount -= 8;\n decoded[outputOffset] = (accumulator >>> bitCount) & 0xff;\n outputOffset += 1;\n }\n }\n if (toBase64Url(decoded) !== value) {\n throw new Error(\n \"Compact value payload is not canonical unpadded base64url\",\n );\n }\n return decoded;\n};\n\nexport const compactValueToBytes = (\n value: readonly Uint8Array[],\n): Uint8Array => {\n assertUint32(value.length, \"Compact value chunk count\");\n const bodyLength = value.reduce((total, chunk) => {\n assertUint32(chunk.length, \"Compact value chunk length\");\n return total + CHUNK_LENGTH_BYTES + chunk.length;\n }, 0);\n const result = new Uint8Array(HEADER_LENGTH + bodyLength);\n result.set(MAGIC, 0);\n writeUint32(result, MAGIC.length, value.length);\n let offset = HEADER_LENGTH;\n for (const chunk of value) {\n writeUint32(result, offset, chunk.length);\n offset += CHUNK_LENGTH_BYTES;\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n};\n\nexport const compactValueFromBytes = (bytes: Uint8Array): Value => {\n if (bytes.length < HEADER_LENGTH) {\n throw new Error(\"Compact value payload is shorter than the header\");\n }\n for (let i = 0; i < MAGIC.length; i += 1) {\n if (bytes[i] !== MAGIC[i]) {\n throw new Error(\"Compact value payload has an unexpected magic header\");\n }\n }\n const chunkCount = readUint32(bytes, MAGIC.length);\n const chunks: Uint8Array[] = [];\n let offset = HEADER_LENGTH;\n for (let i = 0; i < chunkCount; i += 1) {\n const length = readUint32(bytes, offset);\n offset += CHUNK_LENGTH_BYTES;\n if (offset + length > bytes.length) {\n throw new Error(\"Compact value chunk exceeds payload length\");\n }\n chunks.push(bytes.slice(offset, offset + length));\n offset += length;\n }\n if (offset !== bytes.length) {\n throw new Error(\"Compact value payload contains trailing bytes\");\n }\n return chunks;\n};\n\nexport const encodeCompactValue = (\n value: readonly Uint8Array[],\n): EncodedCompactValue => ({\n encoding: COMPACT_VALUE_ENCODING,\n payload: toBase64Url(compactValueToBytes(value)),\n});\n\nexport const decodeCompactValue = (encoded: EncodedCompactValue): Value => {\n if (encoded.encoding !== COMPACT_VALUE_ENCODING) {\n throw new Error(`Unsupported Compact value encoding \"${encoded.encoding}\"`);\n }\n return compactValueFromBytes(fromBase64Url(encoded.payload));\n};\n\nexport const encodeCompactPayload = <T>(\n descriptor: CompactType<T>,\n value: T,\n): EncodedCompactValue => encodeCompactValue(descriptor.toValue(value));\n\nexport const decodeCompactPayload = <T>(\n descriptor: CompactType<T>,\n encoded: EncodedCompactValue,\n): T => {\n const runtimeValue = decodeCompactValue(encoded);\n const decoded = descriptor.fromValue(runtimeValue);\n if (runtimeValue.length !== 0) {\n throw new Error(\n \"Compact value payload contains trailing chunks for descriptor\",\n );\n }\n return decoded;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"compact-value-codec.js","sourceRoot":"","sources":["../src/compact-value-codec.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CompactType, Value } from \"@midnight-ntwrk/compact-runtime\";\n\nexport const COMPACT_VALUE_ENCODING = \"compact-value-v1.base64url\" as const;\n\nconst MAGIC = new Uint8Array([0x4d, 0x43, 0x56, 0x31]); // MCV1\nconst HEADER_LENGTH = MAGIC.length + 4;\nconst CHUNK_LENGTH_BYTES = 4;\nconst BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BASE64URL_TEXT = /^[A-Za-z0-9_-]+$/u;\n\nexport type CompactValueEncoding = typeof COMPACT_VALUE_ENCODING;\n\nexport type EncodedCompactValue = {\n readonly encoding: CompactValueEncoding;\n readonly payload: string;\n};\n\nconst assertUint32 = (value: number, label: string): void => {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffffff) {\n throw new Error(`${label} must fit into uint32`);\n }\n};\n\nconst writeUint32 = (\n target: Uint8Array,\n offset: number,\n value: number,\n): void => {\n assertUint32(value, \"uint32 value\");\n target[offset] = (value >>> 24) & 0xff;\n target[offset + 1] = (value >>> 16) & 0xff;\n target[offset + 2] = (value >>> 8) & 0xff;\n target[offset + 3] = value & 0xff;\n};\n\nconst readUint32 = (source: Uint8Array, offset: number): number => {\n if (offset + CHUNK_LENGTH_BYTES > source.length) {\n throw new Error(\"Compact value payload ended before uint32 field\");\n }\n return (\n source[offset] * 0x1000000 +\n ((source[offset + 1] ?? 0) << 16) +\n ((source[offset + 2] ?? 0) << 8) +\n (source[offset + 3] ?? 0)\n );\n};\n\nconst toBase64Url = (bytes: Uint8Array): string => {\n let encoded = \"\";\n for (let offset = 0; offset < bytes.length; offset += 3) {\n const first = bytes[offset] ?? 0;\n const second = bytes[offset + 1] ?? 0;\n const third = bytes[offset + 2] ?? 0;\n const packed = (first << 16) | (second << 8) | third;\n encoded += BASE64URL_ALPHABET[(packed >>> 18) & 0x3f];\n encoded += BASE64URL_ALPHABET[(packed >>> 12) & 0x3f];\n if (offset + 1 < bytes.length) {\n encoded += BASE64URL_ALPHABET[(packed >>> 6) & 0x3f];\n }\n if (offset + 2 < bytes.length) {\n encoded += BASE64URL_ALPHABET[packed & 0x3f];\n }\n }\n return encoded;\n};\n\nconst fromBase64Url = (value: string): Uint8Array => {\n if (value.length === 0) {\n throw new Error(\"Compact value payload must not be empty\");\n }\n if (!BASE64URL_TEXT.test(value) || value.length % 4 === 1) {\n throw new Error(\"Compact value payload is not valid unpadded base64url\");\n }\n const decoded = new Uint8Array(Math.floor((value.length * 6) / 8));\n let accumulator = 0;\n let bitCount = 0;\n let outputOffset = 0;\n for (const character of value) {\n const index = BASE64URL_ALPHABET.indexOf(character);\n accumulator = (accumulator << 6) | index;\n bitCount += 6;\n if (bitCount >= 8) {\n bitCount -= 8;\n decoded[outputOffset] = (accumulator >>> bitCount) & 0xff;\n outputOffset += 1;\n }\n }\n if (toBase64Url(decoded) !== value) {\n throw new Error(\n \"Compact value payload is not canonical unpadded base64url\",\n );\n }\n return decoded;\n};\n\nexport const compactValueToBytes = (\n value: readonly Uint8Array[],\n): Uint8Array => {\n assertUint32(value.length, \"Compact value chunk count\");\n const bodyLength = value.reduce((total, chunk) => {\n assertUint32(chunk.length, \"Compact value chunk length\");\n return total + CHUNK_LENGTH_BYTES + chunk.length;\n }, 0);\n const result = new Uint8Array(HEADER_LENGTH + bodyLength);\n result.set(MAGIC, 0);\n writeUint32(result, MAGIC.length, value.length);\n let offset = HEADER_LENGTH;\n for (const chunk of value) {\n writeUint32(result, offset, chunk.length);\n offset += CHUNK_LENGTH_BYTES;\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n};\n\nexport const compactValueFromBytes = (bytes: Uint8Array): Value => {\n if (bytes.length < HEADER_LENGTH) {\n throw new Error(\"Compact value payload is shorter than the header\");\n }\n for (let i = 0; i < MAGIC.length; i += 1) {\n if (bytes[i] !== MAGIC[i]) {\n throw new Error(\"Compact value payload has an unexpected magic header\");\n }\n }\n const chunkCount = readUint32(bytes, MAGIC.length);\n const chunks: Uint8Array[] = [];\n let offset = HEADER_LENGTH;\n for (let i = 0; i < chunkCount; i += 1) {\n const length = readUint32(bytes, offset);\n offset += CHUNK_LENGTH_BYTES;\n if (offset + length > bytes.length) {\n throw new Error(\"Compact value chunk exceeds payload length\");\n }\n chunks.push(bytes.slice(offset, offset + length));\n offset += length;\n }\n if (offset !== bytes.length) {\n throw new Error(\"Compact value payload contains trailing bytes\");\n }\n return chunks;\n};\n\nexport const encodeCompactValue = (\n value: readonly Uint8Array[],\n): EncodedCompactValue => ({\n encoding: COMPACT_VALUE_ENCODING,\n payload: toBase64Url(compactValueToBytes(value)),\n});\n\nexport const decodeCompactValue = (encoded: EncodedCompactValue): Value => {\n if (encoded.encoding !== COMPACT_VALUE_ENCODING) {\n throw new Error(`Unsupported Compact value encoding \"${encoded.encoding}\"`);\n }\n return compactValueFromBytes(fromBase64Url(encoded.payload));\n};\n\nexport const encodeCompactPayload = <T>(\n descriptor: CompactType<T>,\n value: T,\n): EncodedCompactValue => encodeCompactValue(descriptor.toValue(value));\n\nexport const decodeCompactPayload = <T>(\n descriptor: CompactType<T>,\n encoded: EncodedCompactValue,\n): T => {\n const runtimeValue = decodeCompactValue(encoded);\n const decoded = descriptor.fromValue(runtimeValue);\n if (runtimeValue.length !== 0) {\n throw new Error(\n \"Compact value payload contains trailing chunks for descriptor\",\n );\n }\n if (encodeCompactPayload(descriptor, decoded).payload !== encoded.payload) {\n throw new Error(\"Compact value payload is not canonical for descriptor\");\n }\n return decoded;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@midnight-ntwrk/credential-compact",
|
|
3
|
-
"version": "0.3.0
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Family-neutral Compact VC and VP semantics",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"private": false,
|
|
@@ -24,8 +24,7 @@
|
|
|
24
24
|
],
|
|
25
25
|
"sideEffects": [],
|
|
26
26
|
"engines": {
|
|
27
|
-
"node": ">=24"
|
|
28
|
-
"pnpm": ">=10.34.5"
|
|
27
|
+
"node": ">=24"
|
|
29
28
|
},
|
|
30
29
|
"main": "dist/index.js",
|
|
31
30
|
"module": "dist/index.js",
|
|
@@ -42,6 +41,9 @@
|
|
|
42
41
|
"dependencies": {
|
|
43
42
|
"@midnight-ntwrk/compact-runtime": "0.16.0"
|
|
44
43
|
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"fast-check": "^4.10.2"
|
|
46
|
+
},
|
|
45
47
|
"files": [
|
|
46
48
|
"dist/**",
|
|
47
49
|
"README.md",
|