@monolythium/core-sdk 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -24
- package/dist/crypto/index.cjs +62 -12
- package/dist/crypto/index.cjs.map +1 -1
- package/dist/crypto/index.d.cts +4 -115
- package/dist/crypto/index.d.ts +4 -115
- package/dist/crypto/index.js +61 -13
- package/dist/crypto/index.js.map +1 -1
- package/dist/ethers/index.cjs +2116 -0
- package/dist/ethers/index.cjs.map +1 -0
- package/dist/ethers/index.d.cts +300 -0
- package/dist/ethers/index.d.ts +300 -0
- package/dist/ethers/index.js +2107 -0
- package/dist/ethers/index.js.map +1 -0
- package/dist/index.cjs +7465 -1551
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1582 -351
- package/dist/index.d.ts +1582 -351
- package/dist/index.js +7222 -1544
- package/dist/index.js.map +1 -1
- package/dist/native-events-BEkkGoak.d.cts +3708 -0
- package/dist/native-events-BEkkGoak.d.ts +3708 -0
- package/dist/network-BK2u9br2.d.cts +31 -0
- package/dist/network-BK2u9br2.d.ts +31 -0
- package/dist/submission-BrsftNSl.d.cts +131 -0
- package/dist/submission-CelGfDRQ.d.ts +131 -0
- package/package.json +8 -2
- package/dist/client-CpnpVkrR.d.cts +0 -2237
- package/dist/client-CpnpVkrR.d.ts +0 -2237
package/dist/crypto/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ml_dsa65 } from '@noble/post-quantum/ml-dsa.js';
|
|
2
|
+
import { blake3 } from '@noble/hashes/blake3.js';
|
|
2
3
|
import { keccak_256, shake256 } from '@noble/hashes/sha3.js';
|
|
3
4
|
import { entropyToMnemonic, mnemonicToEntropy } from '@scure/bip39';
|
|
4
5
|
import { wordlist } from '@scure/bip39/wordlists/english.js';
|
|
@@ -143,8 +144,7 @@ function encodeTransactionForHash(fields, tag) {
|
|
|
143
144
|
n.input,
|
|
144
145
|
new Uint8Array(4),
|
|
145
146
|
// access_list length
|
|
146
|
-
|
|
147
|
-
// extensions length
|
|
147
|
+
encodeExtensionsForHash(n.extensions)
|
|
148
148
|
);
|
|
149
149
|
}
|
|
150
150
|
function bincodeSignedTransaction(fields, signature, publicKey) {
|
|
@@ -161,7 +161,8 @@ function bincodeSignedTransaction(fields, signature, publicKey) {
|
|
|
161
161
|
w.rawBytes(uint256Le(n.value, "value"));
|
|
162
162
|
w.bytes(n.input);
|
|
163
163
|
w.u64(0n);
|
|
164
|
-
w.u64(
|
|
164
|
+
w.u64(BigInt(n.extensions.length));
|
|
165
|
+
for (const ext of n.extensions) bincodeTypedExtensionInto(w, ext);
|
|
165
166
|
bincodeMlDsa65OpaqueInto(w, sig);
|
|
166
167
|
bincodeMlDsa65OpaqueInto(w, pk);
|
|
167
168
|
return w.toBytes();
|
|
@@ -175,7 +176,8 @@ function normalizeTxFields(fields) {
|
|
|
175
176
|
gasLimit: parseBigint(fields.gasLimit, "gasLimit"),
|
|
176
177
|
to: normalizeTo(fields.to),
|
|
177
178
|
value: parseBigint(fields.value, "value"),
|
|
178
|
-
input: normalizeBytes(fields.input ?? new Uint8Array(0), "input")
|
|
179
|
+
input: normalizeBytes(fields.input ?? new Uint8Array(0), "input"),
|
|
180
|
+
extensions: normalizeExtensions(fields.extensions)
|
|
179
181
|
};
|
|
180
182
|
}
|
|
181
183
|
function normalizeTo(value) {
|
|
@@ -187,6 +189,30 @@ function normalizeBytes(value, label) {
|
|
|
187
189
|
if (typeof value === "string") return hexToBytes(value, label);
|
|
188
190
|
return value instanceof Uint8Array ? value : Uint8Array.from(value);
|
|
189
191
|
}
|
|
192
|
+
function normalizeExtensions(value) {
|
|
193
|
+
if (value === void 0) return [];
|
|
194
|
+
return value.map((ext, index) => {
|
|
195
|
+
if (!Number.isInteger(ext.kind) || ext.kind < 0 || ext.kind > 255) {
|
|
196
|
+
throw new Error(`extensions[${index}].kind out of u8 range`);
|
|
197
|
+
}
|
|
198
|
+
const body = normalizeBytes("bodyHex" in ext ? ext.bodyHex : ext.body, `extensions[${index}].body`);
|
|
199
|
+
if (body.length > 4294967295) {
|
|
200
|
+
throw new Error(`extensions[${index}].body exceeds u32 length`);
|
|
201
|
+
}
|
|
202
|
+
return { kind: ext.kind, body };
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
function encodeExtensionsForHash(extensions) {
|
|
206
|
+
const chunks = [bigintToBeBytes(BigInt(extensions.length), 4, "extensions.length")];
|
|
207
|
+
for (const ext of extensions) {
|
|
208
|
+
chunks.push(
|
|
209
|
+
Uint8Array.of(ext.kind),
|
|
210
|
+
bigintToBeBytes(BigInt(ext.body.length), 4, "extension.body.length"),
|
|
211
|
+
ext.body
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
return concatBytes(...chunks);
|
|
215
|
+
}
|
|
190
216
|
function uint256Le(value, label) {
|
|
191
217
|
if (value < 0n || value >= 1n << 256n) throw new Error(`${label} out of u256 range`);
|
|
192
218
|
const out = new Uint8Array(32);
|
|
@@ -202,6 +228,10 @@ function bincodeMlDsa65OpaqueInto(w, raw) {
|
|
|
202
228
|
w.u16(STANDARD_ALGO_NUMBER_ML_DSA_65);
|
|
203
229
|
w.bytes(raw);
|
|
204
230
|
}
|
|
231
|
+
function bincodeTypedExtensionInto(w, ext) {
|
|
232
|
+
w.u8(ext.kind);
|
|
233
|
+
w.bytes(ext.body);
|
|
234
|
+
}
|
|
205
235
|
|
|
206
236
|
// src/crypto/ml-dsa.ts
|
|
207
237
|
var ML_DSA_65_SEED_LEN = 32;
|
|
@@ -210,6 +240,8 @@ var ML_DSA_65_PUBLIC_KEY_LEN = 1952;
|
|
|
210
240
|
var ML_DSA_65_SIGNATURE_LEN = 3309;
|
|
211
241
|
var STANDARD_ALGO_NUMBER_ML_DSA_65 = 1001;
|
|
212
242
|
var ENUM_VARIANT_INDEX_ML_DSA_65 = 5;
|
|
243
|
+
var ADDRESS_DERIVATION_DOMAIN = "MONO_ADDRESS_BLAKE3_20_V1";
|
|
244
|
+
var ADDRESS_DERIVATION_DOMAIN_BYTES = new TextEncoder().encode(ADDRESS_DERIVATION_DOMAIN);
|
|
213
245
|
var MlDsa65Backend = class _MlDsa65Backend {
|
|
214
246
|
#secretKey;
|
|
215
247
|
#publicKey;
|
|
@@ -217,7 +249,7 @@ var MlDsa65Backend = class _MlDsa65Backend {
|
|
|
217
249
|
constructor(secretKey, publicKey) {
|
|
218
250
|
this.#secretKey = expectBytes(secretKey, ML_DSA_65_SIGNING_KEY_LEN, "ML-DSA-65 secret key").slice();
|
|
219
251
|
this.#publicKey = expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, "ML-DSA-65 public key").slice();
|
|
220
|
-
this.#addressBytes =
|
|
252
|
+
this.#addressBytes = mlDsa65AddressBytes(this.#publicKey);
|
|
221
253
|
}
|
|
222
254
|
static fromSeed(seed) {
|
|
223
255
|
const kp = ml_dsa65.keygen(expectBytes(seed, ML_DSA_65_SEED_LEN, "ML-DSA-65 seed"));
|
|
@@ -266,7 +298,15 @@ var MlDsa65Backend = class _MlDsa65Backend {
|
|
|
266
298
|
}
|
|
267
299
|
};
|
|
268
300
|
function mlDsa65AddressFromPublicKey(publicKey) {
|
|
269
|
-
return bytesToHex(
|
|
301
|
+
return bytesToHex(mlDsa65AddressBytes(publicKey));
|
|
302
|
+
}
|
|
303
|
+
function mlDsa65AddressBytes(publicKey) {
|
|
304
|
+
const bytes = expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, "ML-DSA-65 public key");
|
|
305
|
+
return blake3(concatBytes(
|
|
306
|
+
ADDRESS_DERIVATION_DOMAIN_BYTES,
|
|
307
|
+
bigintToBeBytes(BigInt(STANDARD_ALGO_NUMBER_ML_DSA_65), 2, "ML-DSA-65 algo id"),
|
|
308
|
+
bytes
|
|
309
|
+
)).slice(0, 20);
|
|
270
310
|
}
|
|
271
311
|
function encodeMlDsa65Opaque(raw) {
|
|
272
312
|
const bytes = raw instanceof Uint8Array ? raw : Uint8Array.from(raw);
|
|
@@ -385,6 +425,8 @@ var MempoolClass = {
|
|
|
385
425
|
PrivacyOp: 2,
|
|
386
426
|
CLOBOp: 3,
|
|
387
427
|
AgentOp: 4,
|
|
428
|
+
FoundationOp: 5,
|
|
429
|
+
/** @deprecated Use FoundationOp. */
|
|
388
430
|
GovernanceOp: 5,
|
|
389
431
|
RWAOp: 6
|
|
390
432
|
};
|
|
@@ -488,7 +530,6 @@ async function fetchEncryptionKey(client) {
|
|
|
488
530
|
};
|
|
489
531
|
}
|
|
490
532
|
async function buildEncryptedSubmission(args) {
|
|
491
|
-
const signed = args.backend.signEvmTx(args.tx);
|
|
492
533
|
const input = normalizeInput(args.tx.input);
|
|
493
534
|
const to = normalizeTo2(args.tx.to);
|
|
494
535
|
const nonceAad = {
|
|
@@ -496,10 +537,14 @@ async function buildEncryptedSubmission(args) {
|
|
|
496
537
|
nonce: parseBigint(args.tx.nonce, "nonce"),
|
|
497
538
|
chainId: parseBigint(args.tx.chainId, "chainId"),
|
|
498
539
|
class: args.class ?? (to !== null && input.length === 0 ? MempoolClass.Transfer : MempoolClass.ContractCall),
|
|
499
|
-
maxFeePerGas:
|
|
500
|
-
maxPriorityFeePerGas:
|
|
540
|
+
maxFeePerGas: u128Checked(parseBigint(args.tx.maxFeePerGas, "maxFeePerGas"), "maxFeePerGas"),
|
|
541
|
+
maxPriorityFeePerGas: u128Checked(
|
|
542
|
+
parseBigint(args.tx.maxPriorityFeePerGas, "maxPriorityFeePerGas"),
|
|
543
|
+
"maxPriorityFeePerGas"
|
|
544
|
+
),
|
|
501
545
|
gasLimit: parseBigint(args.tx.gasLimit, "gasLimit")
|
|
502
546
|
};
|
|
547
|
+
const signed = args.backend.signEvmTx(args.tx);
|
|
503
548
|
const decryptionHint = { epoch: args.encryptionKey.epoch, scheme: 0 };
|
|
504
549
|
const built = await buildEncryptedEnvelope({
|
|
505
550
|
signedInnerTxBincode: signed.wireBytes,
|
|
@@ -513,16 +558,19 @@ async function buildEncryptedSubmission(args) {
|
|
|
513
558
|
return {
|
|
514
559
|
envelopeWireHex: built.wireHex,
|
|
515
560
|
innerSighashHex: `0x${[...signed.sighash].map((b) => b.toString(16).padStart(2, "0")).join("")}`,
|
|
561
|
+
innerTxHashHex: bytesToHex(signed.txHash),
|
|
516
562
|
innerWireBytes: signed.wireBytes.length
|
|
517
563
|
};
|
|
518
564
|
}
|
|
519
565
|
async function submitEncryptedEnvelope(client, envelopeWireHex) {
|
|
520
566
|
return client.call("lyth_submitEncrypted", [envelopeWireHex]);
|
|
521
567
|
}
|
|
522
|
-
function
|
|
568
|
+
function u128Checked(value, field) {
|
|
523
569
|
const cap = (1n << 128n) - 1n;
|
|
524
|
-
if (value < 0n)
|
|
525
|
-
|
|
570
|
+
if (value < 0n || value > cap) {
|
|
571
|
+
throw new Error(`${field} must fit in u128 for encrypted nonce AAD`);
|
|
572
|
+
}
|
|
573
|
+
return value;
|
|
526
574
|
}
|
|
527
575
|
function normalizeTo2(value) {
|
|
528
576
|
if (value === null) return null;
|
|
@@ -537,6 +585,6 @@ function normalizeInput(value) {
|
|
|
537
585
|
return value instanceof Uint8Array ? value : Uint8Array.from(value);
|
|
538
586
|
}
|
|
539
587
|
|
|
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 };
|
|
588
|
+
export { ADDRESS_DERIVATION_DOMAIN, 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, mlDsa65AddressBytes, mlDsa65AddressFromPublicKey, outerSigDigest, parsePqm1Payload, pqm1MnemonicToAddress, pqm1MnemonicToMlDsa65Backend, pqm1MnemonicToMlDsa65Seed, pqm1MnemonicToPayload, pqm1PayloadToMnemonic, submitEncryptedEnvelope };
|
|
541
589
|
//# sourceMappingURL=index.js.map
|
|
542
590
|
//# sourceMappingURL=index.js.map
|
package/dist/crypto/index.js.map
CHANGED
|
@@ -1 +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"]}
|
|
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 extensions?: readonly NativeTxExtensionLike[];\n}\n\nexport interface NativeTxExtension {\n kind: number;\n body: Uint8Array | readonly number[] | string;\n}\n\nexport interface NativeTxExtensionDescriptor {\n kind: number;\n bodyHex: string;\n}\n\nexport type NativeTxExtensionLike = NativeTxExtension | NativeTxExtensionDescriptor;\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 encodeExtensionsForHash(n.extensions),\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(BigInt(n.extensions.length));\n for (const ext of n.extensions) bincodeTypedExtensionInto(w, ext);\n bincodeMlDsa65OpaqueInto(w, sig);\n bincodeMlDsa65OpaqueInto(w, pk);\n return w.toBytes();\n}\n\ninterface NormalizedNativeTxExtension {\n kind: number;\n body: Uint8Array;\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 extensions: NormalizedNativeTxExtension[];\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 extensions: normalizeExtensions(fields.extensions),\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 normalizeExtensions(value: NativeEvmTxFields[\"extensions\"]): NormalizedNativeTxExtension[] {\n if (value === undefined) return [];\n return value.map((ext, index) => {\n if (!Number.isInteger(ext.kind) || ext.kind < 0 || ext.kind > 0xff) {\n throw new Error(`extensions[${index}].kind out of u8 range`);\n }\n const body = normalizeBytes(\"bodyHex\" in ext ? ext.bodyHex : ext.body, `extensions[${index}].body`);\n if (body.length > 0xffff_ffff) {\n throw new Error(`extensions[${index}].body exceeds u32 length`);\n }\n return { kind: ext.kind, body };\n });\n}\n\nfunction encodeExtensionsForHash(extensions: readonly NormalizedNativeTxExtension[]): Uint8Array {\n const chunks: Uint8Array[] = [bigintToBeBytes(BigInt(extensions.length), 4, \"extensions.length\")];\n for (const ext of extensions) {\n chunks.push(\n Uint8Array.of(ext.kind),\n bigintToBeBytes(BigInt(ext.body.length), 4, \"extension.body.length\"),\n ext.body,\n );\n }\n return concatBytes(...chunks);\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\nfunction bincodeTypedExtensionInto(w: BincodeWriter, ext: NormalizedNativeTxExtension): void {\n w.u8(ext.kind);\n w.bytes(ext.body);\n}\n","import { ml_dsa65 } from \"@noble/post-quantum/ml-dsa.js\";\nimport { blake3 } from \"@noble/hashes/blake3.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;\nexport const ADDRESS_DERIVATION_DOMAIN = \"MONO_ADDRESS_BLAKE3_20_V1\";\n\nconst ADDRESS_DERIVATION_DOMAIN_BYTES = new TextEncoder().encode(ADDRESS_DERIVATION_DOMAIN);\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 = mlDsa65AddressBytes(this.#publicKey);\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(mlDsa65AddressBytes(publicKey));\n}\n\nexport function mlDsa65AddressBytes(publicKey: Uint8Array | readonly number[]): Uint8Array {\n const bytes = expectBytes(publicKey, ML_DSA_65_PUBLIC_KEY_LEN, \"ML-DSA-65 public key\");\n return blake3(concatBytes(\n ADDRESS_DERIVATION_DOMAIN_BYTES,\n bigintToBeBytes(BigInt(STANDARD_ALGO_NUMBER_ML_DSA_65), 2, \"ML-DSA-65 algo id\"),\n bytes,\n )).slice(0, 20);\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 FoundationOp: 5,\n /** @deprecated Use FoundationOp. */\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 account identifiers on the wire, but\n * user-facing surfaces display them as `mono1...` bech32m strings.\n */\n\nexport const ADDRESS_HRP = \"mono\" as const;\nexport const ADDRESS_KIND_HRPS = {\n user: \"mono\",\n smartAccount: \"monos\",\n contract: \"monoc\",\n cluster: \"monok\",\n multisig: \"monom\",\n systemModule: \"monox\",\n} as const;\nexport const RESERVED_ADDRESS_HRPS = [\"monor\", \"monop\", \"monoi\", \"monoa\"] as const;\n\nexport type AddressKind = keyof typeof ADDRESS_KIND_HRPS;\n\nexport interface TypedAddress {\n kind: AddressKind;\n address: string;\n bytes: Uint8Array;\n hex: string;\n}\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 return addressToTypedBech32(\"user\", address);\n}\n\nexport function addressToTypedBech32(\n kind: AddressKind,\n address: string | Uint8Array | readonly number[],\n): string {\n const bytes = typeof address === \"string\" ? hexToAddressBytes(address) : expectLength(address, 20, \"address\");\n return encodeBech32m(ADDRESS_KIND_HRPS[kind], bytes);\n}\n\nfunction encodeBech32m(hrp: string, bytes: Uint8Array): string {\n const words = convertBits([...bytes], 8, 5, true);\n const checksum = createChecksum(hrp, words);\n return `${hrp}1${[...words, ...checksum].map((v) => CHARSET[v]).join(\"\")}`;\n}\n\nexport function bech32ToAddressBytes(address: string): Uint8Array {\n return typedBech32ToAddress(address, \"user\").bytes;\n}\n\nexport function bech32ToAddress(address: string): string {\n return addressBytesToHex(bech32ToAddressBytes(address));\n}\n\nexport function typedBech32ToAddress(address: string, expectedKind?: AddressKind): TypedAddress {\n const parsed = decodeBech32m(address);\n if ((RESERVED_ADDRESS_HRPS as readonly string[]).includes(parsed.hrp)) {\n throw new AddressError(`reserved address hrp '${parsed.hrp}'`);\n }\n const kind = addressKindFromHrp(parsed.hrp);\n if (kind === undefined) {\n throw new AddressError(`unknown address hrp '${parsed.hrp}'`);\n }\n if (expectedKind !== undefined && kind !== expectedKind) {\n throw new AddressError(`unexpected hrp '${parsed.hrp}', expected '${ADDRESS_KIND_HRPS[expectedKind]}'`);\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 const out = Uint8Array.from(bytes);\n return { kind, address: address.toLowerCase(), bytes: out, hex: addressBytesToHex(out) };\n}\n\nexport function requireTypedAddress(\n address: string,\n expectedKind: AddressKind,\n label = \"address\",\n): string {\n if (address.startsWith(\"0x\") || address.startsWith(\"0X\")) {\n throw new AddressError(\n `${label} raw 0x addresses are retired; use typed ${ADDRESS_KIND_HRPS[expectedKind]} bech32m addresses`,\n );\n }\n try {\n return typedBech32ToAddress(address, expectedKind).address;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new AddressError(\n `${label} must be typed ${ADDRESS_KIND_HRPS[expectedKind]} bech32m address: ${message}`,\n );\n }\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\n/** Address-validation result for non-throwing callers (UI forms, search). */\nexport type AddressValidation =\n | {\n valid: true;\n /** Lower-case bech32m representation; matches what the wire format expects. */\n normalized: string;\n /** Bech32m kind when the input is a typed bech32m address, otherwise null. */\n kind: AddressKind | null;\n /** Which surface the input came from. */\n format: \"hex\" | \"bech32m\";\n /** Raw 20-byte payload, useful for client-side bytes-derived lookups. */\n bytes: Uint8Array;\n }\n | { valid: false; reason: string };\n\n/**\n * Validate an address string without throwing. Accepts both raw hex and\n * typed bech32m. On success returns the canonical bech32m form along with\n * the kind/format/bytes; on failure returns a short reason string.\n */\nexport function validateAddress(address: string): AddressValidation {\n if (typeof address !== \"string\" || address.length === 0) {\n return { valid: false, reason: \"address cannot be empty\" };\n }\n const trimmed = address.trim();\n if (trimmed.length === 0) {\n return { valid: false, reason: \"address cannot be empty\" };\n }\n if (trimmed.startsWith(\"0x\") || trimmed.startsWith(\"0X\")) {\n try {\n const bytes = hexToAddressBytes(trimmed);\n return {\n valid: true,\n normalized: addressToBech32(bytes),\n kind: null,\n format: \"hex\",\n bytes,\n };\n } catch (err) {\n return { valid: false, reason: err instanceof Error ? err.message : String(err) };\n }\n }\n try {\n const typed = typedBech32ToAddress(trimmed);\n return {\n valid: true,\n normalized: typed.address,\n kind: typed.kind,\n format: \"bech32m\",\n bytes: typed.bytes,\n };\n } catch (err) {\n return { valid: false, reason: err instanceof Error ? err.message : String(err) };\n }\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 addressKindFromHrp(hrp: string): AddressKind | undefined {\n for (const [kind, kindHrp] of Object.entries(ADDRESS_KIND_HRPS) as Array<[AddressKind, string]>) {\n if (kindHrp === hrp) return kind;\n }\n return undefined;\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 { bytesToHex, 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 innerTxHashHex: 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 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: u128Checked(parseBigint(args.tx.maxFeePerGas, \"maxFeePerGas\"), \"maxFeePerGas\"),\n maxPriorityFeePerGas: u128Checked(\n parseBigint(args.tx.maxPriorityFeePerGas, \"maxPriorityFeePerGas\"),\n \"maxPriorityFeePerGas\",\n ),\n gasLimit: parseBigint(args.tx.gasLimit, \"gasLimit\"),\n };\n const signed = args.backend.signEvmTx(args.tx);\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 innerTxHashHex: bytesToHex(signed.txHash),\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 u128Checked(value: bigint, field: string): bigint {\n const cap = (1n << 128n) - 1n;\n if (value < 0n || value > cap) {\n throw new Error(`${field} must fit in u128 for encrypted nonce AAD`);\n }\n return 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"]}
|