@monolythium/core-sdk 0.1.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.
@@ -0,0 +1,542 @@
1
+ import { ml_dsa65 } from '@noble/post-quantum/ml-dsa.js';
2
+ import { keccak_256, shake256 } from '@noble/hashes/sha3.js';
3
+ import { entropyToMnemonic, mnemonicToEntropy } from '@scure/bip39';
4
+ import { wordlist } from '@scure/bip39/wordlists/english.js';
5
+ import { ml_kem768 } from '@noble/post-quantum/ml-kem.js';
6
+ import { chacha20poly1305 } from '@noble/ciphers/chacha.js';
7
+ import { randomBytes } from '@noble/hashes/utils.js';
8
+
9
+ // src/crypto/bincode.ts
10
+ var BincodeWriter = class {
11
+ #chunks = [];
12
+ u8(value) {
13
+ this.#int(value, 1);
14
+ }
15
+ u16(value) {
16
+ this.#int(value, 2);
17
+ }
18
+ u32(value) {
19
+ this.#int(value, 4);
20
+ }
21
+ u64(value) {
22
+ this.#big(value, 8);
23
+ }
24
+ u128(value) {
25
+ this.#big(value, 16);
26
+ }
27
+ enumVariant(value) {
28
+ this.u32(value);
29
+ }
30
+ rawBytes(bytes) {
31
+ for (const b of bytes) this.#chunks.push(b);
32
+ }
33
+ bytes(bytes) {
34
+ this.u64(BigInt(bytes.length));
35
+ this.rawBytes(bytes);
36
+ }
37
+ optionBytes(bytes) {
38
+ if (bytes === null) {
39
+ this.u8(0);
40
+ return;
41
+ }
42
+ this.u8(1);
43
+ this.rawBytes(bytes);
44
+ }
45
+ toBytes() {
46
+ return Uint8Array.from(this.#chunks);
47
+ }
48
+ #int(value, bytes) {
49
+ if (!Number.isSafeInteger(value) || value < 0 || value >= 2 ** (bytes * 8)) {
50
+ throw new Error(`integer out of u${bytes * 8} range`);
51
+ }
52
+ for (let i = 0; i < bytes; i++) {
53
+ this.#chunks.push(value >> 8 * i & 255);
54
+ }
55
+ }
56
+ #big(value, bytes) {
57
+ let v = typeof value === "bigint" ? value : BigInt(value);
58
+ if (v < 0n || v >= 1n << BigInt(bytes * 8)) {
59
+ throw new Error(`integer out of u${bytes * 8} range`);
60
+ }
61
+ for (let i = 0; i < bytes; i++) {
62
+ this.#chunks.push(Number(v & 0xffn));
63
+ v >>= 8n;
64
+ }
65
+ }
66
+ };
67
+
68
+ // src/crypto/bytes.ts
69
+ function concatBytes(...chunks) {
70
+ const len = chunks.reduce((n, c) => n + c.length, 0);
71
+ const out = new Uint8Array(len);
72
+ let off = 0;
73
+ for (const chunk of chunks) {
74
+ out.set(chunk, off);
75
+ off += chunk.length;
76
+ }
77
+ return out;
78
+ }
79
+ function bytesToHex(bytes) {
80
+ let out = "0x";
81
+ for (let i = 0; i < bytes.length; i++) {
82
+ out += bytes[i].toString(16).padStart(2, "0");
83
+ }
84
+ return out;
85
+ }
86
+ function hexToBytes(hex, label = "hex") {
87
+ const stripped = hex.startsWith("0x") || hex.startsWith("0X") ? hex.slice(2) : hex;
88
+ if (stripped.length % 2 !== 0) {
89
+ throw new Error(`${label} must have even length`);
90
+ }
91
+ const out = new Uint8Array(stripped.length / 2);
92
+ for (let i = 0; i < out.length; i++) {
93
+ const b = Number.parseInt(stripped.slice(i * 2, i * 2 + 2), 16);
94
+ if (Number.isNaN(b)) {
95
+ throw new Error(`${label} contains invalid hex`);
96
+ }
97
+ out[i] = b;
98
+ }
99
+ return out;
100
+ }
101
+ function expectBytes(value, len, label) {
102
+ if (value.length !== len) {
103
+ throw new Error(`${label} must be ${len} bytes, got ${value.length}`);
104
+ }
105
+ return value instanceof Uint8Array ? value : Uint8Array.from(value);
106
+ }
107
+ function bigintToBeBytes(value, bytes, label) {
108
+ if (value < 0n || value >= 1n << BigInt(bytes * 8)) {
109
+ throw new Error(`${label} out of ${bytes * 8}-bit range`);
110
+ }
111
+ const out = new Uint8Array(bytes);
112
+ let v = value;
113
+ for (let i = bytes - 1; i >= 0; i--) {
114
+ out[i] = Number(v & 0xffn);
115
+ v >>= 8n;
116
+ }
117
+ return out;
118
+ }
119
+ function parseBigint(value, label) {
120
+ if (value === void 0) throw new Error(`${label} missing`);
121
+ if (typeof value === "bigint") return value;
122
+ if (typeof value === "number") {
123
+ if (!Number.isSafeInteger(value) || value < 0) throw new Error(`${label} must be a non-negative safe integer`);
124
+ return BigInt(value);
125
+ }
126
+ if (value.startsWith("0x") || value.startsWith("0X")) return BigInt(value);
127
+ return BigInt(value);
128
+ }
129
+
130
+ // src/crypto/tx.ts
131
+ function encodeTransactionForHash(fields, tag) {
132
+ const n = normalizeTxFields(fields);
133
+ return concatBytes(
134
+ Uint8Array.of(tag),
135
+ bigintToBeBytes(n.chainId, 8, "chainId"),
136
+ bigintToBeBytes(n.nonce, 8, "nonce"),
137
+ bigintToBeBytes(n.maxPriorityFeePerGas, 32, "maxPriorityFeePerGas"),
138
+ bigintToBeBytes(n.maxFeePerGas, 32, "maxFeePerGas"),
139
+ bigintToBeBytes(n.gasLimit, 8, "gasLimit"),
140
+ n.to === null ? Uint8Array.of(0) : concatBytes(Uint8Array.of(1), n.to),
141
+ bigintToBeBytes(n.value, 32, "value"),
142
+ bigintToBeBytes(BigInt(n.input.length), 4, "input.length"),
143
+ n.input,
144
+ new Uint8Array(4),
145
+ // access_list length
146
+ new Uint8Array(4)
147
+ // extensions length
148
+ );
149
+ }
150
+ function bincodeSignedTransaction(fields, signature, publicKey) {
151
+ const n = normalizeTxFields(fields);
152
+ const sig = expectBytes(signature, ML_DSA_65_SIGNATURE_LEN, "ML-DSA-65 signature");
153
+ const pk = expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, "ML-DSA-65 public key");
154
+ const w = new BincodeWriter();
155
+ w.u64(n.chainId);
156
+ w.u64(n.nonce);
157
+ w.rawBytes(uint256Le(n.maxPriorityFeePerGas, "maxPriorityFeePerGas"));
158
+ w.rawBytes(uint256Le(n.maxFeePerGas, "maxFeePerGas"));
159
+ w.u64(n.gasLimit);
160
+ w.optionBytes(n.to);
161
+ w.rawBytes(uint256Le(n.value, "value"));
162
+ w.bytes(n.input);
163
+ w.u64(0n);
164
+ w.u64(0n);
165
+ bincodeMlDsa65OpaqueInto(w, sig);
166
+ bincodeMlDsa65OpaqueInto(w, pk);
167
+ return w.toBytes();
168
+ }
169
+ function normalizeTxFields(fields) {
170
+ return {
171
+ chainId: parseBigint(fields.chainId, "chainId"),
172
+ nonce: parseBigint(fields.nonce, "nonce"),
173
+ maxPriorityFeePerGas: parseBigint(fields.maxPriorityFeePerGas, "maxPriorityFeePerGas"),
174
+ maxFeePerGas: parseBigint(fields.maxFeePerGas, "maxFeePerGas"),
175
+ gasLimit: parseBigint(fields.gasLimit, "gasLimit"),
176
+ to: normalizeTo(fields.to),
177
+ value: parseBigint(fields.value, "value"),
178
+ input: normalizeBytes(fields.input ?? new Uint8Array(0), "input")
179
+ };
180
+ }
181
+ function normalizeTo(value) {
182
+ if (value === null) return null;
183
+ const bytes = normalizeBytes(value, "to");
184
+ return expectBytes(bytes, 20, "to");
185
+ }
186
+ function normalizeBytes(value, label) {
187
+ if (typeof value === "string") return hexToBytes(value, label);
188
+ return value instanceof Uint8Array ? value : Uint8Array.from(value);
189
+ }
190
+ function uint256Le(value, label) {
191
+ if (value < 0n || value >= 1n << 256n) throw new Error(`${label} out of u256 range`);
192
+ const out = new Uint8Array(32);
193
+ let v = value;
194
+ for (let i = 0; i < 32; i++) {
195
+ out[i] = Number(v & 0xffn);
196
+ v >>= 8n;
197
+ }
198
+ return out;
199
+ }
200
+ function bincodeMlDsa65OpaqueInto(w, raw) {
201
+ w.enumVariant(ENUM_VARIANT_INDEX_ML_DSA_65);
202
+ w.u16(STANDARD_ALGO_NUMBER_ML_DSA_65);
203
+ w.bytes(raw);
204
+ }
205
+
206
+ // src/crypto/ml-dsa.ts
207
+ var ML_DSA_65_SEED_LEN = 32;
208
+ var ML_DSA_65_SIGNING_KEY_LEN = 4032;
209
+ var ML_DSA_65_PUBLIC_KEY_LEN = 1952;
210
+ var ML_DSA_65_SIGNATURE_LEN = 3309;
211
+ var STANDARD_ALGO_NUMBER_ML_DSA_65 = 1001;
212
+ var ENUM_VARIANT_INDEX_ML_DSA_65 = 5;
213
+ var MlDsa65Backend = class _MlDsa65Backend {
214
+ #secretKey;
215
+ #publicKey;
216
+ #addressBytes;
217
+ constructor(secretKey, publicKey) {
218
+ this.#secretKey = expectBytes(secretKey, ML_DSA_65_SIGNING_KEY_LEN, "ML-DSA-65 secret key").slice();
219
+ this.#publicKey = expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, "ML-DSA-65 public key").slice();
220
+ this.#addressBytes = keccak_256(this.#publicKey).slice(12);
221
+ }
222
+ static fromSeed(seed) {
223
+ const kp = ml_dsa65.keygen(expectBytes(seed, ML_DSA_65_SEED_LEN, "ML-DSA-65 seed"));
224
+ return new _MlDsa65Backend(kp.secretKey, kp.publicKey);
225
+ }
226
+ publicKey() {
227
+ return this.#publicKey.slice();
228
+ }
229
+ addressBytes() {
230
+ return this.#addressBytes.slice();
231
+ }
232
+ getAddress() {
233
+ return bytesToHex(this.#addressBytes);
234
+ }
235
+ sign(message) {
236
+ return ml_dsa65.sign(message, this.#secretKey, { extraEntropy: false });
237
+ }
238
+ signPrehash(digest) {
239
+ return this.sign(expectBytes(digest, 32, "prehash"));
240
+ }
241
+ verify(message, signature) {
242
+ return ml_dsa65.verify(
243
+ expectBytes(signature, ML_DSA_65_SIGNATURE_LEN, "ML-DSA-65 signature"),
244
+ message,
245
+ this.#publicKey
246
+ );
247
+ }
248
+ signEvmTx(fields) {
249
+ const txHashPreimage = encodeTransactionForHash(fields, 1);
250
+ const sighash = keccak_256(txHashPreimage);
251
+ const signature = this.sign(sighash);
252
+ const wireBytes = bincodeSignedTransaction(fields, signature, this.#publicKey);
253
+ const txHash = keccak_256(
254
+ concatBytes(
255
+ encodeTransactionForHash(fields, 2),
256
+ signature,
257
+ this.#publicKey
258
+ )
259
+ );
260
+ return {
261
+ wireHex: bytesToHex(wireBytes).slice(2),
262
+ wireBytes,
263
+ sighash,
264
+ txHash
265
+ };
266
+ }
267
+ };
268
+ function mlDsa65AddressFromPublicKey(publicKey) {
269
+ return bytesToHex(keccak_256(expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, "ML-DSA-65 public key")).slice(12));
270
+ }
271
+ function encodeMlDsa65Opaque(raw) {
272
+ const bytes = raw instanceof Uint8Array ? raw : Uint8Array.from(raw);
273
+ const len = bytes.length === ML_DSA_65_PUBLIC_KEY_LEN ? ML_DSA_65_PUBLIC_KEY_LEN : ML_DSA_65_SIGNATURE_LEN;
274
+ expectBytes(bytes, len, "ML-DSA-65 opaque bytes");
275
+ const out = new Uint8Array(4 + 2 + 8 + bytes.length);
276
+ const dv = new DataView(out.buffer);
277
+ dv.setUint32(0, ENUM_VARIANT_INDEX_ML_DSA_65, true);
278
+ dv.setUint16(4, STANDARD_ALGO_NUMBER_ML_DSA_65, true);
279
+ dv.setBigUint64(6, BigInt(bytes.length), true);
280
+ out.set(bytes, 14);
281
+ return out;
282
+ }
283
+ var PQM1_ALGO_TAG_MLDSA65 = 1;
284
+ var PQM1_ALGO_TAG_MLDSA87_RESERVED = 2;
285
+ var PQM1_ALGO_TAG_SLHDSA128S_RESERVED = 3;
286
+ var PQM1_ALGO_TAG_FALCON512_RESERVED = 4;
287
+ var PQM1_VERSION_V1 = 1;
288
+ var PQM1_PAYLOAD_LEN = 32;
289
+ var PQM1_ENTROPY_LEN = 30;
290
+ var PQM1_V1_MNEMONIC_WORDS = 24;
291
+ var PQM1_V1_MLDSA65_DOMAIN_TAG = "monolythium.pqm1.v1.mldsa65";
292
+ var Pqm1Error = class extends Error {
293
+ constructor(kind, message) {
294
+ super(message);
295
+ this.kind = kind;
296
+ this.name = "Pqm1Error";
297
+ }
298
+ kind;
299
+ };
300
+ var DOMAIN_BYTES = new TextEncoder().encode(PQM1_V1_MLDSA65_DOMAIN_TAG);
301
+ function normalizeMnemonic(mnemonic) {
302
+ return mnemonic.trim().toLowerCase().replace(/\s+/g, " ");
303
+ }
304
+ function ensureSupportedPayload(bytes) {
305
+ if (bytes.length !== PQM1_PAYLOAD_LEN) {
306
+ throw new Pqm1Error("badPayloadLength", `PQM-1 payload must be ${PQM1_PAYLOAD_LEN} bytes, got ${bytes.length}`);
307
+ }
308
+ if (bytes[0] !== PQM1_ALGO_TAG_MLDSA65) {
309
+ throw new Pqm1Error("unsupportedAlgorithm", `unsupported PQM-1 algorithm tag 0x${bytes[0].toString(16).padStart(2, "0")}`);
310
+ }
311
+ if (bytes[1] !== PQM1_VERSION_V1) {
312
+ throw new Pqm1Error("unsupportedVersion", `unsupported PQM-1 version 0x${bytes[1].toString(16).padStart(2, "0")}`);
313
+ }
314
+ }
315
+ function defaultRandomFill(bytes) {
316
+ const cryptoObj = globalThis.crypto;
317
+ if (!cryptoObj?.getRandomValues) {
318
+ throw new Pqm1Error("missingRandom", "globalThis.crypto.getRandomValues is unavailable");
319
+ }
320
+ cryptoObj.getRandomValues(bytes);
321
+ }
322
+ function assemblePqm1Payload(entropy) {
323
+ const ent = expectBytes(entropy, PQM1_ENTROPY_LEN, "PQM-1 entropy");
324
+ const payload = new Uint8Array(PQM1_PAYLOAD_LEN);
325
+ payload[0] = PQM1_ALGO_TAG_MLDSA65;
326
+ payload[1] = PQM1_VERSION_V1;
327
+ payload.set(ent, 2);
328
+ return payload;
329
+ }
330
+ function parsePqm1Payload(payload) {
331
+ const bytes = expectBytes(payload, PQM1_PAYLOAD_LEN, "PQM-1 payload").slice();
332
+ ensureSupportedPayload(bytes);
333
+ return {
334
+ algoTag: PQM1_ALGO_TAG_MLDSA65,
335
+ version: PQM1_VERSION_V1,
336
+ entropy: bytes.slice(2),
337
+ bytes
338
+ };
339
+ }
340
+ function pqm1PayloadToMnemonic(payload) {
341
+ const parsed = parsePqm1Payload(payload);
342
+ return entropyToMnemonic(parsed.bytes, wordlist);
343
+ }
344
+ function pqm1MnemonicToPayload(mnemonic) {
345
+ const normalized = normalizeMnemonic(mnemonic);
346
+ const words = normalized.length === 0 ? [] : normalized.split(" ");
347
+ if (words.length !== PQM1_V1_MNEMONIC_WORDS) {
348
+ throw new Pqm1Error("badWordCount", `PQM-1 mnemonic must be ${PQM1_V1_MNEMONIC_WORDS} words, got ${words.length}`);
349
+ }
350
+ let payload;
351
+ try {
352
+ payload = mnemonicToEntropy(normalized, wordlist);
353
+ } catch (e) {
354
+ throw new Pqm1Error("bip39Decode", `invalid PQM-1 mnemonic: ${e.message}`);
355
+ }
356
+ return parsePqm1Payload(payload);
357
+ }
358
+ function derivePqm1MlDsa65SeedFromPayload(payload) {
359
+ const parsed = parsePqm1Payload(payload);
360
+ return shake256(concatBytes(DOMAIN_BYTES, parsed.bytes), { dkLen: ML_DSA_65_SEED_LEN });
361
+ }
362
+ function pqm1MnemonicToMlDsa65Seed(mnemonic) {
363
+ return derivePqm1MlDsa65SeedFromPayload(pqm1MnemonicToPayload(mnemonic).bytes);
364
+ }
365
+ function pqm1MnemonicToMlDsa65Backend(mnemonic) {
366
+ return MlDsa65Backend.fromSeed(pqm1MnemonicToMlDsa65Seed(mnemonic));
367
+ }
368
+ function pqm1MnemonicToAddress(mnemonic) {
369
+ return pqm1MnemonicToMlDsa65Backend(mnemonic).getAddress();
370
+ }
371
+ function generatePqm1Mnemonic(rng = defaultRandomFill) {
372
+ const entropy = new Uint8Array(PQM1_ENTROPY_LEN);
373
+ rng(entropy);
374
+ return pqm1PayloadToMnemonic(assemblePqm1Payload(entropy));
375
+ }
376
+ var DKG_AEAD_DOMAIN_TAG = new TextEncoder().encode("protocore/v2/mempool/dkg-mlkem768/1");
377
+ var ML_KEM_768_CIPHERTEXT_LEN = 1088;
378
+ var ML_KEM_768_ENCAPSULATION_KEY_LEN = 1184;
379
+ var ML_KEM_768_SHARED_SECRET_LEN = 32;
380
+ var DKG_NONCE_LEN = 12;
381
+ var DKG_AEAD_TAG_LEN = 16;
382
+ var MempoolClass = {
383
+ Transfer: 0,
384
+ ContractCall: 1,
385
+ PrivacyOp: 2,
386
+ CLOBOp: 3,
387
+ AgentOp: 4,
388
+ GovernanceOp: 5,
389
+ RWAOp: 6
390
+ };
391
+ function bincodeNonceAad(aad) {
392
+ const w = new BincodeWriter();
393
+ w.bytes(expectBytes(aad.sender, 20, "NonceAad.sender"));
394
+ w.u64(aad.nonce);
395
+ w.u64(aad.chainId);
396
+ w.enumVariant(aad.class);
397
+ w.u128(aad.maxFeePerGas);
398
+ w.u128(aad.maxPriorityFeePerGas);
399
+ w.u64(aad.gasLimit);
400
+ return w.toBytes();
401
+ }
402
+ function bincodeDecryptHint(hint) {
403
+ const w = new BincodeWriter();
404
+ w.u64(hint.epoch);
405
+ w.u16(hint.scheme);
406
+ return w.toBytes();
407
+ }
408
+ function bincodeEncryptedEnvelope(env) {
409
+ const w = new BincodeWriter();
410
+ w.rawBytes(bincodeNonceAad(env.nonceAad));
411
+ w.bytes(env.ciphertext);
412
+ w.rawBytes(bincodeDecryptHint(env.decryptionHint));
413
+ bincodeMlDsa65OpaqueInto2(w, expectBytes(env.senderPubkey, ML_DSA_65_PUBLIC_KEY_LEN, "senderPubkey"));
414
+ bincodeMlDsa65OpaqueInto2(w, expectBytes(env.outerSignature, ML_DSA_65_SIGNATURE_LEN, "outerSignature"));
415
+ w.bytes(expectBytes(env.sender, 20, "sender"));
416
+ return w.toBytes();
417
+ }
418
+ function encryptInnerTx(signedInnerTxBincode, nonceAad, kemEncapsulationKey) {
419
+ expectBytes(kemEncapsulationKey, ML_KEM_768_ENCAPSULATION_KEY_LEN, "kemEncapsulationKey");
420
+ const { cipherText: kemCt, sharedSecret } = ml_kem768.encapsulate(kemEncapsulationKey);
421
+ const nonce = randomBytes(DKG_NONCE_LEN);
422
+ const cipher = chacha20poly1305(sharedSecret, nonce, aadFor(nonceAad));
423
+ const aeadCt = cipher.encrypt(signedInnerTxBincode);
424
+ sharedSecret.fill(0);
425
+ return concatBytes(kemCt, nonce, aeadCt);
426
+ }
427
+ function outerSigDigest(nonceAad, ciphertext, decryptionHint, senderPubkey) {
428
+ const aad = bincodeNonceAad(nonceAad);
429
+ const hint = bincodeDecryptHint(decryptionHint);
430
+ return keccak_256(concatBytes(aad, ciphertext, hint, expectBytes(senderPubkey, ML_DSA_65_PUBLIC_KEY_LEN, "senderPubkey")));
431
+ }
432
+ async function buildEncryptedEnvelope(args) {
433
+ const ciphertext = encryptInnerTx(args.signedInnerTxBincode, args.nonceAad, args.kemEncapsulationKey);
434
+ const digest = outerSigDigest(args.nonceAad, ciphertext, args.decryptionHint, args.senderPubkey);
435
+ const outerSignature = await args.signOuterDigest(digest);
436
+ const envelope = {
437
+ nonceAad: args.nonceAad,
438
+ ciphertext,
439
+ decryptionHint: args.decryptionHint,
440
+ senderPubkey: expectBytes(args.senderPubkey, ML_DSA_65_PUBLIC_KEY_LEN, "senderPubkey"),
441
+ outerSignature: expectBytes(outerSignature, ML_DSA_65_SIGNATURE_LEN, "outerSignature"),
442
+ sender: expectBytes(args.senderAddress, 20, "senderAddress")
443
+ };
444
+ const wireBytes = bincodeEncryptedEnvelope(envelope);
445
+ return { envelope, wireBytes, wireHex: bytesToHex(wireBytes) };
446
+ }
447
+ function aadFor(aad) {
448
+ return concatBytes(DKG_AEAD_DOMAIN_TAG, bincodeNonceAad(aad));
449
+ }
450
+ function bincodeMlDsa65OpaqueInto2(w, raw) {
451
+ w.enumVariant(ENUM_VARIANT_INDEX_ML_DSA_65);
452
+ w.u16(STANDARD_ALGO_NUMBER_ML_DSA_65);
453
+ w.bytes(raw);
454
+ }
455
+
456
+ // src/address.ts
457
+ var CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
458
+ new Map([...CHARSET].map((c, i) => [c, i]));
459
+ var HEX_20_BYTE_RE = /^0x[0-9a-fA-F]{40}$/;
460
+ var AddressError = class extends Error {
461
+ constructor(message) {
462
+ super(message);
463
+ this.name = "AddressError";
464
+ }
465
+ };
466
+ function hexToAddressBytes(address) {
467
+ if (!HEX_20_BYTE_RE.test(address)) {
468
+ throw new AddressError("expected 0x-prefixed 20-byte hex address");
469
+ }
470
+ const out = new Uint8Array(20);
471
+ const body = address.slice(2);
472
+ for (let i = 0; i < 20; i++) {
473
+ out[i] = Number.parseInt(body.slice(i * 2, i * 2 + 2), 16);
474
+ }
475
+ return out;
476
+ }
477
+
478
+ // src/crypto/submission.ts
479
+ async function fetchEncryptionKey(client) {
480
+ const result = await client.call(
481
+ "lyth_getEncryptionKey",
482
+ []
483
+ );
484
+ return {
485
+ algo: result.algo ?? "ml-kem-768",
486
+ epoch: typeof result.epoch === "string" ? BigInt(result.epoch) : BigInt(result.epoch),
487
+ encapsulationKey: hexToBytes(result.encapsulationKey, "encapsulationKey")
488
+ };
489
+ }
490
+ async function buildEncryptedSubmission(args) {
491
+ const signed = args.backend.signEvmTx(args.tx);
492
+ const input = normalizeInput(args.tx.input);
493
+ const to = normalizeTo2(args.tx.to);
494
+ const nonceAad = {
495
+ sender: args.backend.addressBytes(),
496
+ nonce: parseBigint(args.tx.nonce, "nonce"),
497
+ chainId: parseBigint(args.tx.chainId, "chainId"),
498
+ class: args.class ?? (to !== null && input.length === 0 ? MempoolClass.Transfer : MempoolClass.ContractCall),
499
+ maxFeePerGas: u128Saturate(parseBigint(args.tx.maxFeePerGas, "maxFeePerGas")),
500
+ maxPriorityFeePerGas: u128Saturate(parseBigint(args.tx.maxPriorityFeePerGas, "maxPriorityFeePerGas")),
501
+ gasLimit: parseBigint(args.tx.gasLimit, "gasLimit")
502
+ };
503
+ const decryptionHint = { epoch: args.encryptionKey.epoch, scheme: 0 };
504
+ const built = await buildEncryptedEnvelope({
505
+ signedInnerTxBincode: signed.wireBytes,
506
+ nonceAad,
507
+ decryptionHint,
508
+ kemEncapsulationKey: args.encryptionKey.encapsulationKey,
509
+ senderAddress: args.backend.addressBytes(),
510
+ senderPubkey: args.backend.publicKey(),
511
+ signOuterDigest: (digest) => args.backend.signPrehash(digest)
512
+ });
513
+ return {
514
+ envelopeWireHex: built.wireHex,
515
+ innerSighashHex: `0x${[...signed.sighash].map((b) => b.toString(16).padStart(2, "0")).join("")}`,
516
+ innerWireBytes: signed.wireBytes.length
517
+ };
518
+ }
519
+ async function submitEncryptedEnvelope(client, envelopeWireHex) {
520
+ return client.call("lyth_submitEncrypted", [envelopeWireHex]);
521
+ }
522
+ function u128Saturate(value) {
523
+ const cap = (1n << 128n) - 1n;
524
+ if (value < 0n) return 0n;
525
+ return value > cap ? cap : value;
526
+ }
527
+ function normalizeTo2(value) {
528
+ if (value === null) return null;
529
+ if (typeof value === "string") return hexToAddressBytes(value);
530
+ const bytes = value instanceof Uint8Array ? value : Uint8Array.from(value);
531
+ if (bytes.length !== 20) throw new Error("to must be 20 bytes");
532
+ return bytes;
533
+ }
534
+ function normalizeInput(value) {
535
+ if (value === void 0) return new Uint8Array(0);
536
+ if (typeof value === "string") return hexToBytes(value, "input");
537
+ return value instanceof Uint8Array ? value : Uint8Array.from(value);
538
+ }
539
+
540
+ export { BincodeWriter, DKG_AEAD_TAG_LEN, DKG_NONCE_LEN, ENUM_VARIANT_INDEX_ML_DSA_65, ML_DSA_65_PUBLIC_KEY_LEN, ML_DSA_65_SEED_LEN, ML_DSA_65_SIGNATURE_LEN, ML_DSA_65_SIGNING_KEY_LEN, ML_KEM_768_CIPHERTEXT_LEN, ML_KEM_768_ENCAPSULATION_KEY_LEN, ML_KEM_768_SHARED_SECRET_LEN, MempoolClass, MlDsa65Backend, PQM1_ALGO_TAG_FALCON512_RESERVED, PQM1_ALGO_TAG_MLDSA65, PQM1_ALGO_TAG_MLDSA87_RESERVED, PQM1_ALGO_TAG_SLHDSA128S_RESERVED, PQM1_ENTROPY_LEN, PQM1_PAYLOAD_LEN, PQM1_V1_MLDSA65_DOMAIN_TAG, PQM1_V1_MNEMONIC_WORDS, PQM1_VERSION_V1, Pqm1Error, STANDARD_ALGO_NUMBER_ML_DSA_65, assemblePqm1Payload, bincodeDecryptHint, bincodeEncryptedEnvelope, bincodeNonceAad, bincodeSignedTransaction, buildEncryptedEnvelope, buildEncryptedSubmission, bytesToHex, concatBytes, derivePqm1MlDsa65SeedFromPayload, encodeMlDsa65Opaque, encodeTransactionForHash, encryptInnerTx, expectBytes, fetchEncryptionKey, generatePqm1Mnemonic, hexToBytes, mlDsa65AddressFromPublicKey, outerSigDigest, parsePqm1Payload, pqm1MnemonicToAddress, pqm1MnemonicToMlDsa65Backend, pqm1MnemonicToMlDsa65Seed, pqm1MnemonicToPayload, pqm1PayloadToMnemonic, submitEncryptedEnvelope };
541
+ //# sourceMappingURL=index.js.map
542
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/crypto/bincode.ts","../../src/crypto/bytes.ts","../../src/crypto/tx.ts","../../src/crypto/ml-dsa.ts","../../src/crypto/pqm1.ts","../../src/crypto/envelope.ts","../../src/address.ts","../../src/crypto/submission.ts"],"names":["bincodeMlDsa65OpaqueInto","keccak_256","normalizeTo"],"mappings":"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","file":"index.js","sourcesContent":["export class BincodeWriter {\n #chunks: number[] = [];\n\n u8(value: number): void {\n this.#int(value, 1);\n }\n\n u16(value: number): void {\n this.#int(value, 2);\n }\n\n u32(value: number): void {\n this.#int(value, 4);\n }\n\n u64(value: bigint | number): void {\n this.#big(value, 8);\n }\n\n u128(value: bigint | number): void {\n this.#big(value, 16);\n }\n\n enumVariant(value: number): void {\n this.u32(value);\n }\n\n rawBytes(bytes: Uint8Array): void {\n for (const b of bytes) this.#chunks.push(b);\n }\n\n bytes(bytes: Uint8Array): void {\n this.u64(BigInt(bytes.length));\n this.rawBytes(bytes);\n }\n\n optionBytes(bytes: Uint8Array | null): void {\n if (bytes === null) {\n this.u8(0);\n return;\n }\n this.u8(1);\n this.rawBytes(bytes);\n }\n\n toBytes(): Uint8Array {\n return Uint8Array.from(this.#chunks);\n }\n\n #int(value: number, bytes: number): void {\n if (!Number.isSafeInteger(value) || value < 0 || value >= 2 ** (bytes * 8)) {\n throw new Error(`integer out of u${bytes * 8} range`);\n }\n for (let i = 0; i < bytes; i++) {\n this.#chunks.push((value >> (8 * i)) & 0xff);\n }\n }\n\n #big(value: bigint | number, bytes: number): void {\n let v = typeof value === \"bigint\" ? value : BigInt(value);\n if (v < 0n || v >= (1n << BigInt(bytes * 8))) {\n throw new Error(`integer out of u${bytes * 8} range`);\n }\n for (let i = 0; i < bytes; i++) {\n this.#chunks.push(Number(v & 0xffn));\n v >>= 8n;\n }\n }\n}\n","export function concatBytes(...chunks: Uint8Array[]): Uint8Array {\n const len = chunks.reduce((n, c) => n + c.length, 0);\n const out = new Uint8Array(len);\n let off = 0;\n for (const chunk of chunks) {\n out.set(chunk, off);\n off += chunk.length;\n }\n return out;\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n let out = \"0x\";\n for (let i = 0; i < bytes.length; i++) {\n out += bytes[i]!.toString(16).padStart(2, \"0\");\n }\n return out;\n}\n\nexport function hexToBytes(hex: string, label = \"hex\"): Uint8Array {\n const stripped = hex.startsWith(\"0x\") || hex.startsWith(\"0X\") ? hex.slice(2) : hex;\n if (stripped.length % 2 !== 0) {\n throw new Error(`${label} must have even length`);\n }\n const out = new Uint8Array(stripped.length / 2);\n for (let i = 0; i < out.length; i++) {\n const b = Number.parseInt(stripped.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(b)) {\n throw new Error(`${label} contains invalid hex`);\n }\n out[i] = b;\n }\n return out;\n}\n\nexport function expectBytes(value: Uint8Array | readonly number[], len: number, label: string): Uint8Array {\n if (value.length !== len) {\n throw new Error(`${label} must be ${len} bytes, got ${value.length}`);\n }\n return value instanceof Uint8Array ? value : Uint8Array.from(value);\n}\n\nexport function bigintToBeBytes(value: bigint, bytes: number, label: string): Uint8Array {\n if (value < 0n || value >= (1n << BigInt(bytes * 8))) {\n throw new Error(`${label} out of ${bytes * 8}-bit range`);\n }\n const out = new Uint8Array(bytes);\n let v = value;\n for (let i = bytes - 1; i >= 0; i--) {\n out[i] = Number(v & 0xffn);\n v >>= 8n;\n }\n return out;\n}\n\nexport function parseBigint(value: bigint | number | string | undefined, label: string): bigint {\n if (value === undefined) throw new Error(`${label} missing`);\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value < 0) throw new Error(`${label} must be a non-negative safe integer`);\n return BigInt(value);\n }\n if (value.startsWith(\"0x\") || value.startsWith(\"0X\")) return BigInt(value);\n return BigInt(value);\n}\n","import { BincodeWriter } from \"./bincode.js\";\nimport { bigintToBeBytes, concatBytes, expectBytes, hexToBytes, parseBigint } from \"./bytes.js\";\nimport {\n ENUM_VARIANT_INDEX_ML_DSA_65,\n ML_DSA_65_PUBLIC_KEY_LEN,\n ML_DSA_65_SIGNATURE_LEN,\n STANDARD_ALGO_NUMBER_ML_DSA_65,\n} from \"./ml-dsa.js\";\n\nexport interface NativeEvmTxFields {\n chainId: bigint | number | string;\n nonce: bigint | number | string;\n maxPriorityFeePerGas: bigint | number | string;\n maxFeePerGas: bigint | number | string;\n gasLimit: bigint | number | string;\n to: Uint8Array | readonly number[] | string | null;\n value: bigint | number | string;\n input?: Uint8Array | readonly number[] | string;\n}\n\nexport function encodeTransactionForHash(fields: NativeEvmTxFields, tag: 0x01 | 0x02): Uint8Array {\n const n = normalizeTxFields(fields);\n return concatBytes(\n Uint8Array.of(tag),\n bigintToBeBytes(n.chainId, 8, \"chainId\"),\n bigintToBeBytes(n.nonce, 8, \"nonce\"),\n bigintToBeBytes(n.maxPriorityFeePerGas, 32, \"maxPriorityFeePerGas\"),\n bigintToBeBytes(n.maxFeePerGas, 32, \"maxFeePerGas\"),\n bigintToBeBytes(n.gasLimit, 8, \"gasLimit\"),\n n.to === null ? Uint8Array.of(0) : concatBytes(Uint8Array.of(1), n.to),\n bigintToBeBytes(n.value, 32, \"value\"),\n bigintToBeBytes(BigInt(n.input.length), 4, \"input.length\"),\n n.input,\n new Uint8Array(4), // access_list length\n new Uint8Array(4), // extensions length\n );\n}\n\nexport function bincodeSignedTransaction(\n fields: NativeEvmTxFields,\n signature: Uint8Array | readonly number[],\n publicKey: Uint8Array | readonly number[],\n): Uint8Array {\n const n = normalizeTxFields(fields);\n const sig = expectBytes(signature, ML_DSA_65_SIGNATURE_LEN, \"ML-DSA-65 signature\");\n const pk = expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, \"ML-DSA-65 public key\");\n const w = new BincodeWriter();\n w.u64(n.chainId);\n w.u64(n.nonce);\n w.rawBytes(uint256Le(n.maxPriorityFeePerGas, \"maxPriorityFeePerGas\"));\n w.rawBytes(uint256Le(n.maxFeePerGas, \"maxFeePerGas\"));\n w.u64(n.gasLimit);\n w.optionBytes(n.to);\n w.rawBytes(uint256Le(n.value, \"value\"));\n w.bytes(n.input);\n w.u64(0n); // access_list length\n w.u64(0n); // extensions length\n bincodeMlDsa65OpaqueInto(w, sig);\n bincodeMlDsa65OpaqueInto(w, pk);\n return w.toBytes();\n}\n\ninterface NormalizedNativeEvmTxFields {\n chainId: bigint;\n nonce: bigint;\n maxPriorityFeePerGas: bigint;\n maxFeePerGas: bigint;\n gasLimit: bigint;\n to: Uint8Array | null;\n value: bigint;\n input: Uint8Array;\n}\n\nfunction normalizeTxFields(fields: NativeEvmTxFields): NormalizedNativeEvmTxFields {\n return {\n chainId: parseBigint(fields.chainId, \"chainId\"),\n nonce: parseBigint(fields.nonce, \"nonce\"),\n maxPriorityFeePerGas: parseBigint(fields.maxPriorityFeePerGas, \"maxPriorityFeePerGas\"),\n maxFeePerGas: parseBigint(fields.maxFeePerGas, \"maxFeePerGas\"),\n gasLimit: parseBigint(fields.gasLimit, \"gasLimit\"),\n to: normalizeTo(fields.to),\n value: parseBigint(fields.value, \"value\"),\n input: normalizeBytes(fields.input ?? new Uint8Array(0), \"input\"),\n };\n}\n\nfunction normalizeTo(value: NativeEvmTxFields[\"to\"]): Uint8Array | null {\n if (value === null) return null;\n const bytes = normalizeBytes(value, \"to\");\n return expectBytes(bytes, 20, \"to\");\n}\n\nfunction normalizeBytes(value: Uint8Array | readonly number[] | string, label: string): Uint8Array {\n if (typeof value === \"string\") return hexToBytes(value, label);\n return value instanceof Uint8Array ? value : Uint8Array.from(value);\n}\n\nfunction uint256Le(value: bigint, label: string): Uint8Array {\n if (value < 0n || value >= 1n << 256n) throw new Error(`${label} out of u256 range`);\n const out = new Uint8Array(32);\n let v = value;\n for (let i = 0; i < 32; i++) {\n out[i] = Number(v & 0xffn);\n v >>= 8n;\n }\n return out;\n}\n\nfunction bincodeMlDsa65OpaqueInto(w: BincodeWriter, raw: Uint8Array): void {\n w.enumVariant(ENUM_VARIANT_INDEX_ML_DSA_65);\n w.u16(STANDARD_ALGO_NUMBER_ML_DSA_65);\n w.bytes(raw);\n}\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\nimport { keccak_256 } from \"@noble/hashes/sha3.js\";\nimport { bigintToBeBytes, bytesToHex, concatBytes, expectBytes } from \"./bytes.js\";\nimport { bincodeSignedTransaction, encodeTransactionForHash, type NativeEvmTxFields } from \"./tx.js\";\n\nexport const ML_DSA_65_SEED_LEN = 32;\nexport const ML_DSA_65_SIGNING_KEY_LEN = 4032;\nexport const ML_DSA_65_PUBLIC_KEY_LEN = 1952;\nexport const ML_DSA_65_SIGNATURE_LEN = 3309;\nexport const STANDARD_ALGO_NUMBER_ML_DSA_65 = 1001;\nexport const ENUM_VARIANT_INDEX_ML_DSA_65 = 5;\n\nexport class MlDsa65Backend {\n readonly #secretKey: Uint8Array;\n readonly #publicKey: Uint8Array;\n readonly #addressBytes: Uint8Array;\n\n private constructor(secretKey: Uint8Array, publicKey: Uint8Array) {\n this.#secretKey = expectBytes(secretKey, ML_DSA_65_SIGNING_KEY_LEN, \"ML-DSA-65 secret key\").slice();\n this.#publicKey = expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, \"ML-DSA-65 public key\").slice();\n this.#addressBytes = keccak_256(this.#publicKey).slice(12);\n }\n\n static fromSeed(seed: Uint8Array | readonly number[]): MlDsa65Backend {\n const kp = ml_dsa65.keygen(expectBytes(seed, ML_DSA_65_SEED_LEN, \"ML-DSA-65 seed\"));\n return new MlDsa65Backend(kp.secretKey, kp.publicKey);\n }\n\n publicKey(): Uint8Array {\n return this.#publicKey.slice();\n }\n\n addressBytes(): Uint8Array {\n return this.#addressBytes.slice();\n }\n\n getAddress(): string {\n return bytesToHex(this.#addressBytes);\n }\n\n sign(message: Uint8Array): Uint8Array {\n return ml_dsa65.sign(message, this.#secretKey, { extraEntropy: false });\n }\n\n signPrehash(digest: Uint8Array): Uint8Array {\n return this.sign(expectBytes(digest, 32, \"prehash\"));\n }\n\n verify(message: Uint8Array, signature: Uint8Array): boolean {\n return ml_dsa65.verify(\n expectBytes(signature, ML_DSA_65_SIGNATURE_LEN, \"ML-DSA-65 signature\"),\n message,\n this.#publicKey,\n );\n }\n\n signEvmTx(fields: NativeEvmTxFields): {\n wireHex: string;\n wireBytes: Uint8Array;\n sighash: Uint8Array;\n txHash: Uint8Array;\n } {\n const txHashPreimage = encodeTransactionForHash(fields, 0x01);\n const sighash = keccak_256(txHashPreimage);\n const signature = this.sign(sighash);\n const wireBytes = bincodeSignedTransaction(fields, signature, this.#publicKey);\n const txHash = keccak_256(\n concatBytes(\n encodeTransactionForHash(fields, 0x02),\n signature,\n this.#publicKey,\n ),\n );\n return {\n wireHex: bytesToHex(wireBytes).slice(2),\n wireBytes,\n sighash,\n txHash,\n };\n }\n}\n\nexport function mlDsa65AddressFromPublicKey(publicKey: Uint8Array | readonly number[]): string {\n return bytesToHex(keccak_256(expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, \"ML-DSA-65 public key\")).slice(12));\n}\n\nexport function encodeMlDsa65Opaque(raw: Uint8Array | readonly number[]): Uint8Array {\n const bytes = raw instanceof Uint8Array ? raw : Uint8Array.from(raw);\n const len = bytes.length === ML_DSA_65_PUBLIC_KEY_LEN ? ML_DSA_65_PUBLIC_KEY_LEN : ML_DSA_65_SIGNATURE_LEN;\n expectBytes(bytes, len, \"ML-DSA-65 opaque bytes\");\n const out = new Uint8Array(4 + 2 + 8 + bytes.length);\n const dv = new DataView(out.buffer);\n dv.setUint32(0, ENUM_VARIANT_INDEX_ML_DSA_65, true);\n dv.setUint16(4, STANDARD_ALGO_NUMBER_ML_DSA_65, true);\n dv.setBigUint64(6, BigInt(bytes.length), true);\n out.set(bytes, 14);\n return out;\n}\n\nexport function uint256Bytes(value: bigint | number | string, label: string): Uint8Array {\n const v = typeof value === \"bigint\" ? value : typeof value === \"number\" ? BigInt(value) : BigInt(value);\n return bigintToBeBytes(v, 32, label);\n}\n","import { shake256 } from \"@noble/hashes/sha3.js\";\nimport { entropyToMnemonic, mnemonicToEntropy } from \"@scure/bip39\";\nimport { wordlist } from \"@scure/bip39/wordlists/english.js\";\nimport { concatBytes, expectBytes } from \"./bytes.js\";\nimport { ML_DSA_65_SEED_LEN, MlDsa65Backend } from \"./ml-dsa.js\";\n\nexport const PQM1_ALGO_TAG_MLDSA65 = 0x01;\nexport const PQM1_ALGO_TAG_MLDSA87_RESERVED = 0x02;\nexport const PQM1_ALGO_TAG_SLHDSA128S_RESERVED = 0x03;\nexport const PQM1_ALGO_TAG_FALCON512_RESERVED = 0x04;\nexport const PQM1_VERSION_V1 = 0x01;\nexport const PQM1_PAYLOAD_LEN = 32;\nexport const PQM1_ENTROPY_LEN = 30;\nexport const PQM1_V1_MNEMONIC_WORDS = 24;\nexport const PQM1_V1_MLDSA65_DOMAIN_TAG = \"monolythium.pqm1.v1.mldsa65\";\n\nexport type Pqm1ErrorKind =\n | \"badWordCount\"\n | \"bip39Decode\"\n | \"badPayloadLength\"\n | \"unsupportedAlgorithm\"\n | \"unsupportedVersion\"\n | \"missingRandom\";\n\nexport class Pqm1Error extends Error {\n constructor(\n readonly kind: Pqm1ErrorKind,\n message: string,\n ) {\n super(message);\n this.name = \"Pqm1Error\";\n }\n}\n\nexport interface Pqm1Payload {\n algoTag: typeof PQM1_ALGO_TAG_MLDSA65;\n version: typeof PQM1_VERSION_V1;\n entropy: Uint8Array;\n bytes: Uint8Array;\n}\n\nexport type Pqm1Rng = (bytes: Uint8Array) => void;\n\nconst DOMAIN_BYTES = new TextEncoder().encode(PQM1_V1_MLDSA65_DOMAIN_TAG);\n\nfunction normalizeMnemonic(mnemonic: string): string {\n return mnemonic.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction ensureSupportedPayload(bytes: Uint8Array): void {\n if (bytes.length !== PQM1_PAYLOAD_LEN) {\n throw new Pqm1Error(\"badPayloadLength\", `PQM-1 payload must be ${PQM1_PAYLOAD_LEN} bytes, got ${bytes.length}`);\n }\n if (bytes[0] !== PQM1_ALGO_TAG_MLDSA65) {\n throw new Pqm1Error(\"unsupportedAlgorithm\", `unsupported PQM-1 algorithm tag 0x${bytes[0]!.toString(16).padStart(2, \"0\")}`);\n }\n if (bytes[1] !== PQM1_VERSION_V1) {\n throw new Pqm1Error(\"unsupportedVersion\", `unsupported PQM-1 version 0x${bytes[1]!.toString(16).padStart(2, \"0\")}`);\n }\n}\n\nfunction defaultRandomFill(bytes: Uint8Array): void {\n const cryptoObj = globalThis.crypto;\n if (!cryptoObj?.getRandomValues) {\n throw new Pqm1Error(\"missingRandom\", \"globalThis.crypto.getRandomValues is unavailable\");\n }\n cryptoObj.getRandomValues(bytes);\n}\n\nexport function assemblePqm1Payload(entropy: Uint8Array | readonly number[]): Uint8Array {\n const ent = expectBytes(entropy, PQM1_ENTROPY_LEN, \"PQM-1 entropy\");\n const payload = new Uint8Array(PQM1_PAYLOAD_LEN);\n payload[0] = PQM1_ALGO_TAG_MLDSA65;\n payload[1] = PQM1_VERSION_V1;\n payload.set(ent, 2);\n return payload;\n}\n\nexport function parsePqm1Payload(payload: Uint8Array | readonly number[]): Pqm1Payload {\n const bytes = expectBytes(payload, PQM1_PAYLOAD_LEN, \"PQM-1 payload\").slice();\n ensureSupportedPayload(bytes);\n return {\n algoTag: PQM1_ALGO_TAG_MLDSA65,\n version: PQM1_VERSION_V1,\n entropy: bytes.slice(2),\n bytes,\n };\n}\n\nexport function pqm1PayloadToMnemonic(payload: Uint8Array | readonly number[]): string {\n const parsed = parsePqm1Payload(payload);\n return entropyToMnemonic(parsed.bytes, wordlist);\n}\n\nexport function pqm1MnemonicToPayload(mnemonic: string): Pqm1Payload {\n const normalized = normalizeMnemonic(mnemonic);\n const words = normalized.length === 0 ? [] : normalized.split(\" \");\n if (words.length !== PQM1_V1_MNEMONIC_WORDS) {\n throw new Pqm1Error(\"badWordCount\", `PQM-1 mnemonic must be ${PQM1_V1_MNEMONIC_WORDS} words, got ${words.length}`);\n }\n let payload: Uint8Array;\n try {\n payload = mnemonicToEntropy(normalized, wordlist);\n } catch (e) {\n throw new Pqm1Error(\"bip39Decode\", `invalid PQM-1 mnemonic: ${(e as Error).message}`);\n }\n return parsePqm1Payload(payload);\n}\n\nexport function derivePqm1MlDsa65SeedFromPayload(payload: Uint8Array | readonly number[]): Uint8Array {\n const parsed = parsePqm1Payload(payload);\n return shake256(concatBytes(DOMAIN_BYTES, parsed.bytes), { dkLen: ML_DSA_65_SEED_LEN });\n}\n\nexport function pqm1MnemonicToMlDsa65Seed(mnemonic: string): Uint8Array {\n return derivePqm1MlDsa65SeedFromPayload(pqm1MnemonicToPayload(mnemonic).bytes);\n}\n\nexport function pqm1MnemonicToMlDsa65Backend(mnemonic: string): MlDsa65Backend {\n return MlDsa65Backend.fromSeed(pqm1MnemonicToMlDsa65Seed(mnemonic));\n}\n\nexport function pqm1MnemonicToAddress(mnemonic: string): string {\n return pqm1MnemonicToMlDsa65Backend(mnemonic).getAddress();\n}\n\nexport function generatePqm1Mnemonic(rng: Pqm1Rng = defaultRandomFill): string {\n const entropy = new Uint8Array(PQM1_ENTROPY_LEN);\n rng(entropy);\n return pqm1PayloadToMnemonic(assemblePqm1Payload(entropy));\n}\n","import { ml_kem768 } from \"@noble/post-quantum/ml-kem.js\";\nimport { chacha20poly1305 } from \"@noble/ciphers/chacha.js\";\nimport { keccak_256 } from \"@noble/hashes/sha3.js\";\nimport { randomBytes } from \"@noble/hashes/utils.js\";\nimport { BincodeWriter } from \"./bincode.js\";\nimport { bytesToHex, concatBytes, expectBytes } from \"./bytes.js\";\nimport {\n ENUM_VARIANT_INDEX_ML_DSA_65,\n ML_DSA_65_PUBLIC_KEY_LEN,\n ML_DSA_65_SIGNATURE_LEN,\n STANDARD_ALGO_NUMBER_ML_DSA_65,\n} from \"./ml-dsa.js\";\n\nconst DKG_AEAD_DOMAIN_TAG = new TextEncoder().encode(\"protocore/v2/mempool/dkg-mlkem768/1\");\n\nexport const ML_KEM_768_CIPHERTEXT_LEN = 1088;\nexport const ML_KEM_768_ENCAPSULATION_KEY_LEN = 1184;\nexport const ML_KEM_768_SHARED_SECRET_LEN = 32;\nexport const DKG_NONCE_LEN = 12;\nexport const DKG_AEAD_TAG_LEN = 16;\n\nexport const MempoolClass = {\n Transfer: 0,\n ContractCall: 1,\n PrivacyOp: 2,\n CLOBOp: 3,\n AgentOp: 4,\n GovernanceOp: 5,\n RWAOp: 6,\n} as const;\nexport type MempoolClass = (typeof MempoolClass)[keyof typeof MempoolClass];\n\nexport interface NonceAad {\n sender: Uint8Array;\n nonce: bigint;\n chainId: bigint;\n class: MempoolClass;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n gasLimit: bigint;\n}\n\nexport interface DecryptHint {\n epoch: bigint;\n scheme: number;\n}\n\nexport interface EncryptedEnvelope {\n nonceAad: NonceAad;\n ciphertext: Uint8Array;\n decryptionHint: DecryptHint;\n senderPubkey: Uint8Array;\n outerSignature: Uint8Array;\n sender: Uint8Array;\n}\n\nexport function bincodeNonceAad(aad: NonceAad): Uint8Array {\n const w = new BincodeWriter();\n w.bytes(expectBytes(aad.sender, 20, \"NonceAad.sender\"));\n w.u64(aad.nonce);\n w.u64(aad.chainId);\n w.enumVariant(aad.class);\n w.u128(aad.maxFeePerGas);\n w.u128(aad.maxPriorityFeePerGas);\n w.u64(aad.gasLimit);\n return w.toBytes();\n}\n\nexport function bincodeDecryptHint(hint: DecryptHint): Uint8Array {\n const w = new BincodeWriter();\n w.u64(hint.epoch);\n w.u16(hint.scheme);\n return w.toBytes();\n}\n\nexport function bincodeEncryptedEnvelope(env: EncryptedEnvelope): Uint8Array {\n const w = new BincodeWriter();\n w.rawBytes(bincodeNonceAad(env.nonceAad));\n w.bytes(env.ciphertext);\n w.rawBytes(bincodeDecryptHint(env.decryptionHint));\n bincodeMlDsa65OpaqueInto(w, expectBytes(env.senderPubkey, ML_DSA_65_PUBLIC_KEY_LEN, \"senderPubkey\"));\n bincodeMlDsa65OpaqueInto(w, expectBytes(env.outerSignature, ML_DSA_65_SIGNATURE_LEN, \"outerSignature\"));\n w.bytes(expectBytes(env.sender, 20, \"sender\"));\n return w.toBytes();\n}\n\nexport function encryptInnerTx(\n signedInnerTxBincode: Uint8Array,\n nonceAad: NonceAad,\n kemEncapsulationKey: Uint8Array,\n): Uint8Array {\n expectBytes(kemEncapsulationKey, ML_KEM_768_ENCAPSULATION_KEY_LEN, \"kemEncapsulationKey\");\n const { cipherText: kemCt, sharedSecret } = ml_kem768.encapsulate(kemEncapsulationKey);\n const nonce = randomBytes(DKG_NONCE_LEN);\n const cipher = chacha20poly1305(sharedSecret, nonce, aadFor(nonceAad));\n const aeadCt = cipher.encrypt(signedInnerTxBincode);\n sharedSecret.fill(0);\n return concatBytes(kemCt, nonce, aeadCt);\n}\n\nexport function outerSigDigest(\n nonceAad: NonceAad,\n ciphertext: Uint8Array,\n decryptionHint: DecryptHint,\n senderPubkey: Uint8Array,\n): Uint8Array {\n const aad = bincodeNonceAad(nonceAad);\n const hint = bincodeDecryptHint(decryptionHint);\n return keccak_256(concatBytes(aad, ciphertext, hint, expectBytes(senderPubkey, ML_DSA_65_PUBLIC_KEY_LEN, \"senderPubkey\")));\n}\n\nexport async function buildEncryptedEnvelope(args: {\n signedInnerTxBincode: Uint8Array;\n nonceAad: NonceAad;\n decryptionHint: DecryptHint;\n kemEncapsulationKey: Uint8Array;\n senderAddress: Uint8Array;\n senderPubkey: Uint8Array;\n signOuterDigest: (digest: Uint8Array) => Promise<Uint8Array> | Uint8Array;\n}): Promise<{ envelope: EncryptedEnvelope; wireBytes: Uint8Array; wireHex: string }> {\n const ciphertext = encryptInnerTx(args.signedInnerTxBincode, args.nonceAad, args.kemEncapsulationKey);\n const digest = outerSigDigest(args.nonceAad, ciphertext, args.decryptionHint, args.senderPubkey);\n const outerSignature = await args.signOuterDigest(digest);\n const envelope: EncryptedEnvelope = {\n nonceAad: args.nonceAad,\n ciphertext,\n decryptionHint: args.decryptionHint,\n senderPubkey: expectBytes(args.senderPubkey, ML_DSA_65_PUBLIC_KEY_LEN, \"senderPubkey\"),\n outerSignature: expectBytes(outerSignature, ML_DSA_65_SIGNATURE_LEN, \"outerSignature\"),\n sender: expectBytes(args.senderAddress, 20, \"senderAddress\"),\n };\n const wireBytes = bincodeEncryptedEnvelope(envelope);\n return { envelope, wireBytes, wireHex: bytesToHex(wireBytes) };\n}\n\nfunction aadFor(aad: NonceAad): Uint8Array {\n return concatBytes(DKG_AEAD_DOMAIN_TAG, bincodeNonceAad(aad));\n}\n\nfunction bincodeMlDsa65OpaqueInto(w: BincodeWriter, raw: Uint8Array): void {\n w.enumVariant(ENUM_VARIANT_INDEX_ML_DSA_65);\n w.u16(STANDARD_ALGO_NUMBER_ML_DSA_65);\n w.bytes(raw);\n}\n","/**\n * Address display helpers.\n *\n * Monolythium keeps 20-byte EVM-compatible addresses on the wire, but\n * user-facing surfaces display them as `mono1...` bech32m strings.\n */\n\nexport const ADDRESS_HRP = \"mono\" as const;\n\nconst CHARSET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\nconst CHARSET_MAP = new Map([...CHARSET].map((c, i) => [c, i]));\nconst BECH32M_CONST = 0x2bc830a3;\nconst HEX_20_BYTE_RE = /^0x[0-9a-fA-F]{40}$/;\n\nexport class AddressError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AddressError\";\n }\n}\n\nexport function hexToAddressBytes(address: string): Uint8Array {\n if (!HEX_20_BYTE_RE.test(address)) {\n throw new AddressError(\"expected 0x-prefixed 20-byte hex address\");\n }\n const out = new Uint8Array(20);\n const body = address.slice(2);\n for (let i = 0; i < 20; i++) {\n out[i] = Number.parseInt(body.slice(i * 2, i * 2 + 2), 16);\n }\n return out;\n}\n\nexport function addressBytesToHex(address: Uint8Array | readonly number[]): string {\n const bytes = expectLength(address, 20, \"address\");\n return `0x${[...bytes].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nexport function addressToBech32(address: string | Uint8Array | readonly number[]): string {\n const bytes = typeof address === \"string\" ? hexToAddressBytes(address) : expectLength(address, 20, \"address\");\n const words = convertBits([...bytes], 8, 5, true);\n const checksum = createChecksum(ADDRESS_HRP, words);\n return `${ADDRESS_HRP}1${[...words, ...checksum].map((v) => CHARSET[v]).join(\"\")}`;\n}\n\nexport function bech32ToAddressBytes(address: string): Uint8Array {\n const parsed = decodeBech32m(address);\n if (parsed.hrp !== ADDRESS_HRP) {\n throw new AddressError(`unexpected hrp '${parsed.hrp}', expected '${ADDRESS_HRP}'`);\n }\n const bytes = convertBits(parsed.data, 5, 8, false);\n if (bytes.length !== 20) {\n throw new AddressError(`expected 20-byte payload, got ${bytes.length} bytes`);\n }\n return Uint8Array.from(bytes);\n}\n\nexport function bech32ToAddress(address: string): string {\n return addressBytesToHex(bech32ToAddressBytes(address));\n}\n\nexport function parseAddress(address: string): Uint8Array {\n if (address.startsWith(\"0x\") || address.startsWith(\"0X\")) {\n return hexToAddressBytes(address);\n }\n return bech32ToAddressBytes(address);\n}\n\nexport function normalizeAddressHex(address: string): string {\n return addressBytesToHex(parseAddress(address));\n}\n\nfunction decodeBech32m(input: string): { hrp: string; data: number[] } {\n if (input.length < 8) {\n throw new AddressError(\"bech32m address is too short\");\n }\n const hasLower = input !== input.toUpperCase();\n const hasUpper = input !== input.toLowerCase();\n if (hasLower && hasUpper) {\n throw new AddressError(\"bech32m address cannot mix upper and lower case\");\n }\n const s = input.toLowerCase();\n const sep = s.lastIndexOf(\"1\");\n if (sep <= 0 || sep + 7 > s.length) {\n throw new AddressError(\"bech32m separator/checksum shape is invalid\");\n }\n const hrp = s.slice(0, sep);\n const values: number[] = [];\n for (const c of s.slice(sep + 1)) {\n const v = CHARSET_MAP.get(c);\n if (v === undefined) {\n throw new AddressError(`invalid bech32m character '${c}'`);\n }\n values.push(v);\n }\n if (!verifyChecksum(hrp, values)) {\n throw new AddressError(\"bech32m checksum mismatch\");\n }\n return { hrp, data: values.slice(0, -6) };\n}\n\nfunction hrpExpand(hrp: string): number[] {\n const high = [...hrp].map((c) => c.charCodeAt(0) >> 5);\n const low = [...hrp].map((c) => c.charCodeAt(0) & 31);\n return [...high, 0, ...low];\n}\n\nfunction polymod(values: number[]): number {\n const generators = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\n let chk = 1;\n for (const value of values) {\n const top = chk >> 25;\n chk = ((chk & 0x1ffffff) << 5) ^ value;\n for (let i = 0; i < 5; i++) {\n if (((top >> i) & 1) === 1) {\n chk ^= generators[i];\n }\n }\n }\n return chk >>> 0;\n}\n\nfunction createChecksum(hrp: string, data: number[]): number[] {\n const values = [...hrpExpand(hrp), ...data, 0, 0, 0, 0, 0, 0];\n const mod = polymod(values) ^ BECH32M_CONST;\n const out: number[] = [];\n for (let p = 0; p < 6; p++) {\n out.push((mod >> (5 * (5 - p))) & 31);\n }\n return out;\n}\n\nfunction verifyChecksum(hrp: string, values: number[]): boolean {\n return polymod([...hrpExpand(hrp), ...values]) === BECH32M_CONST;\n}\n\nfunction convertBits(data: readonly number[], fromBits: number, toBits: number, pad: boolean): number[] {\n let acc = 0;\n let bits = 0;\n const ret: number[] = [];\n const maxv = (1 << toBits) - 1;\n const maxAcc = (1 << (fromBits + toBits - 1)) - 1;\n for (const value of data) {\n if (value < 0 || value >> fromBits !== 0) {\n throw new AddressError(\"invalid address payload value\");\n }\n acc = ((acc << fromBits) | value) & maxAcc;\n bits += fromBits;\n while (bits >= toBits) {\n bits -= toBits;\n ret.push((acc >> bits) & maxv);\n }\n }\n if (pad) {\n if (bits > 0) {\n ret.push((acc << (toBits - bits)) & maxv);\n }\n } else if (bits >= fromBits || ((acc << (toBits - bits)) & maxv) !== 0) {\n throw new AddressError(\"invalid bech32m padding\");\n }\n return ret;\n}\n\nfunction expectLength(value: Uint8Array | readonly number[], len: number, name: string): Uint8Array {\n if (value.length !== len) {\n throw new AddressError(`${name} must be ${len} bytes`);\n }\n return value instanceof Uint8Array ? value : Uint8Array.from(value);\n}\n","import { RpcClient } from \"../client.js\";\nimport { hexToAddressBytes } from \"../address.js\";\nimport { hexToBytes, parseBigint } from \"./bytes.js\";\nimport { buildEncryptedEnvelope, MempoolClass, type DecryptHint, type NonceAad } from \"./envelope.js\";\nimport type { MlDsa65Backend } from \"./ml-dsa.js\";\nimport type { NativeEvmTxFields } from \"./tx.js\";\n\nexport interface EncryptionKey {\n algo: string;\n epoch: bigint;\n encapsulationKey: Uint8Array;\n}\n\nexport interface EncryptedSubmission {\n envelopeWireHex: string;\n innerSighashHex: string;\n innerWireBytes: number;\n}\n\nexport async function fetchEncryptionKey(client: RpcClient): Promise<EncryptionKey> {\n const result = await client.call<{ algo?: string; epoch: number | string; encapsulationKey: string }>(\n \"lyth_getEncryptionKey\",\n [],\n );\n return {\n algo: result.algo ?? \"ml-kem-768\",\n epoch: typeof result.epoch === \"string\" ? BigInt(result.epoch) : BigInt(result.epoch),\n encapsulationKey: hexToBytes(result.encapsulationKey, \"encapsulationKey\"),\n };\n}\n\nexport async function buildEncryptedSubmission(args: {\n backend: MlDsa65Backend;\n tx: NativeEvmTxFields;\n encryptionKey: EncryptionKey;\n class?: MempoolClass;\n}): Promise<EncryptedSubmission> {\n const signed = args.backend.signEvmTx(args.tx);\n const input = normalizeInput(args.tx.input);\n const to = normalizeTo(args.tx.to);\n const nonceAad: NonceAad = {\n sender: args.backend.addressBytes(),\n nonce: parseBigint(args.tx.nonce, \"nonce\"),\n chainId: parseBigint(args.tx.chainId, \"chainId\"),\n class: args.class ?? (to !== null && input.length === 0 ? MempoolClass.Transfer : MempoolClass.ContractCall),\n maxFeePerGas: u128Saturate(parseBigint(args.tx.maxFeePerGas, \"maxFeePerGas\")),\n maxPriorityFeePerGas: u128Saturate(parseBigint(args.tx.maxPriorityFeePerGas, \"maxPriorityFeePerGas\")),\n gasLimit: parseBigint(args.tx.gasLimit, \"gasLimit\"),\n };\n const decryptionHint: DecryptHint = { epoch: args.encryptionKey.epoch, scheme: 0 };\n const built = await buildEncryptedEnvelope({\n signedInnerTxBincode: signed.wireBytes,\n nonceAad,\n decryptionHint,\n kemEncapsulationKey: args.encryptionKey.encapsulationKey,\n senderAddress: args.backend.addressBytes(),\n senderPubkey: args.backend.publicKey(),\n signOuterDigest: (digest) => args.backend.signPrehash(digest),\n });\n return {\n envelopeWireHex: built.wireHex,\n innerSighashHex: `0x${[...signed.sighash].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")}`,\n innerWireBytes: signed.wireBytes.length,\n };\n}\n\nexport async function submitEncryptedEnvelope(client: RpcClient, envelopeWireHex: string): Promise<string> {\n return client.call(\"lyth_submitEncrypted\", [envelopeWireHex]);\n}\n\nfunction u128Saturate(value: bigint): bigint {\n const cap = (1n << 128n) - 1n;\n if (value < 0n) return 0n;\n return value > cap ? cap : value;\n}\n\nfunction normalizeTo(value: NativeEvmTxFields[\"to\"]): Uint8Array | null {\n if (value === null) return null;\n if (typeof value === \"string\") return hexToAddressBytes(value);\n const bytes = value instanceof Uint8Array ? value : Uint8Array.from(value);\n if (bytes.length !== 20) throw new Error(\"to must be 20 bytes\");\n return bytes;\n}\n\nfunction normalizeInput(value: NativeEvmTxFields[\"input\"]): Uint8Array {\n if (value === undefined) return new Uint8Array(0);\n if (typeof value === \"string\") return hexToBytes(value, \"input\");\n return value instanceof Uint8Array ? value : Uint8Array.from(value);\n}\n"]}