@hwlt/era-connect 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -9
- package/bch/package.json +6 -0
- package/dist/bch-CK6dKGQA.d.ts +74 -0
- package/dist/bch-CpLACx0j.cjs +139 -0
- package/dist/bch-CpLACx0j.cjs.map +1 -0
- package/dist/bch-DHsIVJqK.d.cts +74 -0
- package/dist/bch-dMESlQfv.js +134 -0
- package/dist/bch-dMESlQfv.js.map +1 -0
- package/dist/bch.cjs +13 -0
- package/dist/bch.d.cts +26 -0
- package/dist/bch.d.ts +26 -0
- package/dist/bch.js +4 -0
- package/dist/{btc-B_Nq2H4T.js → btc-BmVgvvBd.js} +2 -2
- package/dist/btc-BmVgvvBd.js.map +1 -0
- package/dist/{btc-ByzjzUKs.cjs → btc-BxNww6kW.cjs} +2 -2
- package/dist/btc-BxNww6kW.cjs.map +1 -0
- package/dist/{btc-B8LfSEkv.d.ts → btc-uzt0uC-Q.d.ts} +6 -4
- package/dist/{btc-C4dVkxHb.d.cts → btc-wogJ4INA.d.cts} +6 -4
- package/dist/btc.cjs +1 -1
- package/dist/btc.d.cts +1 -1
- package/dist/btc.d.ts +1 -1
- package/dist/btc.js +1 -1
- package/dist/cashaddr-BIzawizX.js +134 -0
- package/dist/cashaddr-BIzawizX.js.map +1 -0
- package/dist/cashaddr-Ci0_8ITN.cjs +151 -0
- package/dist/cashaddr-Ci0_8ITN.cjs.map +1 -0
- package/dist/{derive-CK9Nc9Jc.js → derive-00JUOkmn.js} +7 -2
- package/dist/derive-00JUOkmn.js.map +1 -0
- package/dist/{derive-BayrpfJk.cjs → derive-BuNsfWlg.cjs} +12 -1
- package/dist/derive-BuNsfWlg.cjs.map +1 -0
- package/dist/gzip-CLzDX7AZ.cjs +79 -0
- package/dist/gzip-CLzDX7AZ.cjs.map +1 -0
- package/dist/gzip-DyZLtgJJ.js +68 -0
- package/dist/gzip-DyZLtgJJ.js.map +1 -0
- package/dist/index.cjs +44 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -3
- package/dist/index.d.ts +28 -3
- package/dist/index.js +43 -4
- package/dist/index.js.map +1 -1
- package/dist/{messages-DbnXy3dC.js → messages--XbVef_k.js} +38 -2
- package/dist/messages--XbVef_k.js.map +1 -0
- package/dist/{messages-BZXDY29v.cjs → messages-orAQ52CI.cjs} +43 -1
- package/dist/messages-orAQ52CI.cjs.map +1 -0
- package/dist/{tron-fufBDNuQ.js → tron-BpUEYTPT.js} +4 -67
- package/dist/tron-BpUEYTPT.js.map +1 -0
- package/dist/{tron-B9wXdzlA.cjs → tron-DYPOg5cm.cjs} +5 -68
- package/dist/{tron-fufBDNuQ.js.map → tron-DYPOg5cm.cjs.map} +1 -1
- package/dist/tron.cjs +2 -2
- package/dist/tron.js +2 -2
- package/dist/verify.cjs +224 -17
- package/dist/verify.cjs.map +1 -1
- package/dist/verify.d.cts +67 -1
- package/dist/verify.d.ts +67 -1
- package/dist/verify.js +222 -18
- package/dist/verify.js.map +1 -1
- package/package.json +13 -1
- package/dist/btc-B_Nq2H4T.js.map +0 -1
- package/dist/btc-ByzjzUKs.cjs.map +0 -1
- package/dist/derive-BayrpfJk.cjs.map +0 -1
- package/dist/derive-CK9Nc9Jc.js.map +0 -1
- package/dist/messages-BZXDY29v.cjs.map +0 -1
- package/dist/messages-DbnXy3dC.js.map +0 -1
- package/dist/tron-B9wXdzlA.cjs.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const require_shared = require("./shared-Cu2yynP9.cjs");
|
|
2
|
+
let fflate = require("fflate");
|
|
3
|
+
//#region src/tron-proto/gzip.ts
|
|
4
|
+
/** Smallest possible gzip stream: 10-byte header + 8-byte trailer. */
|
|
5
|
+
const MIN_GZIP_BYTES = 18;
|
|
6
|
+
/** Bytes fed to the inflater per step; bounds the overshoot past the cap. */
|
|
7
|
+
const SLICE_BYTES = 1024;
|
|
8
|
+
/** Deterministic gzip (fixed level, zeroed mtime) for reproducible request bytes. */
|
|
9
|
+
function gzipCompress(data) {
|
|
10
|
+
return (0, fflate.gzipSync)(data, {
|
|
11
|
+
level: 9,
|
|
12
|
+
mtime: 0
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Inflate with a hard output ceiling.
|
|
17
|
+
*
|
|
18
|
+
* A one-shot gunzip allocates the entire output before anyone can refuse it —
|
|
19
|
+
* gzip reaches ~1000:1 in practice, so a few hundred scanned bytes could ask
|
|
20
|
+
* for an arbitrary allocation. The decoder is therefore driven in slices and
|
|
21
|
+
* the output counted as it arrives; the moment the total would pass the cap,
|
|
22
|
+
* feeding stops and the reply is refused.
|
|
23
|
+
*
|
|
24
|
+
* The trailer's ISIZE (declared inflated length) is used twice: as a cheap
|
|
25
|
+
* refusal of honest bombs before any work, and as a truncation check at the
|
|
26
|
+
* end — an inflater hands back a partial buffer for a truncated stream
|
|
27
|
+
* without erroring, and a genuine device reply always declares honestly.
|
|
28
|
+
*/
|
|
29
|
+
function gunzipCapped(data, maxOutputBytes) {
|
|
30
|
+
if (data.length < MIN_GZIP_BYTES) throw new require_shared.EraSdkError("gzip-error", "compressed payload is too short to be a gzip stream");
|
|
31
|
+
if (data[0] !== 31 || data[1] !== 139) throw new require_shared.EraSdkError("gzip-error", "compressed payload is not a gzip stream");
|
|
32
|
+
const n = data.length;
|
|
33
|
+
const isize = (data[n - 4] | data[n - 3] << 8 | data[n - 2] << 16 | data[n - 1] << 24) >>> 0;
|
|
34
|
+
if (isize > maxOutputBytes) throw new require_shared.EraSdkError("gzip-error", `compressed payload declares ${isize} bytes, over the ${maxOutputBytes} byte ceiling`);
|
|
35
|
+
const chunks = [];
|
|
36
|
+
let total = 0;
|
|
37
|
+
let overflowed = false;
|
|
38
|
+
let malformed = null;
|
|
39
|
+
const gunzip = new fflate.Gunzip((chunk) => {
|
|
40
|
+
if (overflowed) return;
|
|
41
|
+
if (total + chunk.length > maxOutputBytes) {
|
|
42
|
+
overflowed = true;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
chunks.push(chunk);
|
|
46
|
+
total += chunk.length;
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
for (let offset = 0; offset < n && !overflowed; offset += SLICE_BYTES) {
|
|
50
|
+
const end = Math.min(offset + SLICE_BYTES, n);
|
|
51
|
+
const isLast = end === n;
|
|
52
|
+
gunzip.push(data.slice(offset, end), isLast);
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
malformed = e.message ?? "inflate error";
|
|
56
|
+
}
|
|
57
|
+
if (overflowed) throw new require_shared.EraSdkError("gzip-error", `compressed payload inflates past the ${maxOutputBytes} byte ceiling`);
|
|
58
|
+
if (malformed !== null) throw new require_shared.EraSdkError("gzip-error", `compressed payload is malformed: ${malformed}`);
|
|
59
|
+
const out = require_shared.concatBytes(...chunks);
|
|
60
|
+
if (out.length !== isize) throw new require_shared.EraSdkError("gzip-error", `compressed payload inflated to ${out.length} bytes but declares ${isize} — truncated or malformed`);
|
|
61
|
+
const declaredCrc = (data[n - 8] | data[n - 7] << 8 | data[n - 6] << 16 | data[n - 5] << 24) >>> 0;
|
|
62
|
+
if (require_shared.crc32(out) !== declaredCrc) throw new require_shared.EraSdkError("gzip-error", "compressed payload is malformed: CRC mismatch");
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
Object.defineProperty(exports, "gunzipCapped", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function() {
|
|
69
|
+
return gunzipCapped;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
Object.defineProperty(exports, "gzipCompress", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
get: function() {
|
|
75
|
+
return gzipCompress;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=gzip-CLzDX7AZ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gzip-CLzDX7AZ.cjs","names":["gzipSync","EraSdkError","Gunzip","concatBytes","crc32"],"sources":["../src/tron-proto/gzip.ts"],"sourcesContent":["import { Gunzip, gzipSync } from 'fflate';\nimport { concatBytes } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\nimport { crc32 } from '../ur/crc32';\n\n/** Smallest possible gzip stream: 10-byte header + 8-byte trailer. */\nconst MIN_GZIP_BYTES = 18;\n\n/** Bytes fed to the inflater per step; bounds the overshoot past the cap. */\nconst SLICE_BYTES = 1024;\n\n/** Deterministic gzip (fixed level, zeroed mtime) for reproducible request bytes. */\nexport function gzipCompress(data: Uint8Array): Uint8Array {\n return gzipSync(data, { level: 9, mtime: 0 });\n}\n\n/**\n * Inflate with a hard output ceiling.\n *\n * A one-shot gunzip allocates the entire output before anyone can refuse it —\n * gzip reaches ~1000:1 in practice, so a few hundred scanned bytes could ask\n * for an arbitrary allocation. The decoder is therefore driven in slices and\n * the output counted as it arrives; the moment the total would pass the cap,\n * feeding stops and the reply is refused.\n *\n * The trailer's ISIZE (declared inflated length) is used twice: as a cheap\n * refusal of honest bombs before any work, and as a truncation check at the\n * end — an inflater hands back a partial buffer for a truncated stream\n * without erroring, and a genuine device reply always declares honestly.\n */\nexport function gunzipCapped(data: Uint8Array, maxOutputBytes: number): Uint8Array {\n if (data.length < MIN_GZIP_BYTES) {\n throw new EraSdkError('gzip-error', 'compressed payload is too short to be a gzip stream');\n }\n if (data[0] !== 0x1f || data[1] !== 0x8b) {\n throw new EraSdkError('gzip-error', 'compressed payload is not a gzip stream');\n }\n const n = data.length;\n const isize =\n (data[n - 4]! | (data[n - 3]! << 8) | (data[n - 2]! << 16) | (data[n - 1]! << 24)) >>> 0;\n if (isize > maxOutputBytes) {\n throw new EraSdkError(\n 'gzip-error',\n `compressed payload declares ${isize} bytes, over the ${maxOutputBytes} byte ceiling`,\n );\n }\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n let overflowed = false;\n let malformed: string | null = null;\n\n const gunzip = new Gunzip((chunk) => {\n if (overflowed) return;\n if (total + chunk.length > maxOutputBytes) {\n overflowed = true;\n return;\n }\n chunks.push(chunk);\n total += chunk.length;\n });\n\n try {\n for (let offset = 0; offset < n && !overflowed; offset += SLICE_BYTES) {\n const end = Math.min(offset + SLICE_BYTES, n);\n const isLast = end === n;\n gunzip.push(data.slice(offset, end), isLast);\n }\n } catch (e) {\n malformed = (e as Error).message ?? 'inflate error';\n }\n\n if (overflowed) {\n throw new EraSdkError(\n 'gzip-error',\n `compressed payload inflates past the ${maxOutputBytes} byte ceiling`,\n );\n }\n if (malformed !== null) {\n throw new EraSdkError('gzip-error', `compressed payload is malformed: ${malformed}`);\n }\n const out = concatBytes(...chunks);\n if (out.length !== isize) {\n throw new EraSdkError(\n 'gzip-error',\n `compressed payload inflated to ${out.length} bytes but declares ${isize} — truncated or malformed`,\n );\n }\n // The trailer CRC32 (little-endian, bytes n-8..n-5) must cover the inflated\n // output. The streaming inflater does not verify it, and the reference\n // implementation's native decoder does — without this check a corrupted\n // stream, or a CONCATENATED multi-member stream (whose final member's CRC\n // cannot cover the whole output), would be accepted here and refused there.\n const declaredCrc =\n (data[n - 8]! | (data[n - 7]! << 8) | (data[n - 6]! << 16) | (data[n - 5]! << 24)) >>> 0;\n if (crc32(out) !== declaredCrc) {\n throw new EraSdkError('gzip-error', 'compressed payload is malformed: CRC mismatch');\n }\n return out;\n}\n"],"mappings":";;;;AAMA,MAAM,iBAAiB;;AAGvB,MAAM,cAAc;;AAGpB,SAAgB,aAAa,MAA8B;CACzD,QAAA,GAAOA,OAAAA,SAAAA,CAAS,MAAM;EAAE,OAAO;EAAG,OAAO;CAAE,CAAC;AAC9C;;;;;;;;;;;;;;;AAgBA,SAAgB,aAAa,MAAkB,gBAAoC;CACjF,IAAI,KAAK,SAAS,gBAChB,MAAM,IAAIC,eAAAA,YAAY,cAAc,qDAAqD;CAE3F,IAAI,KAAK,OAAO,MAAQ,KAAK,OAAO,KAClC,MAAM,IAAIA,eAAAA,YAAY,cAAc,yCAAyC;CAE/E,MAAM,IAAI,KAAK;CACf,MAAM,SACH,KAAK,IAAI,KAAO,KAAK,IAAI,MAAO,IAAM,KAAK,IAAI,MAAO,KAAO,KAAK,IAAI,MAAO,QAAS;CACzF,IAAI,QAAQ,gBACV,MAAM,IAAIA,eAAAA,YACR,cACA,+BAA+B,MAAM,mBAAmB,eAAe,cACzE;CAGF,MAAM,SAAuB,CAAC;CAC9B,IAAI,QAAQ;CACZ,IAAI,aAAa;CACjB,IAAI,YAA2B;CAE/B,MAAM,SAAS,IAAIC,OAAAA,QAAQ,UAAU;EACnC,IAAI,YAAY;EAChB,IAAI,QAAQ,MAAM,SAAS,gBAAgB;GACzC,aAAa;GACb;EACF;EACA,OAAO,KAAK,KAAK;EACjB,SAAS,MAAM;CACjB,CAAC;CAED,IAAI;EACF,KAAK,IAAI,SAAS,GAAG,SAAS,KAAK,CAAC,YAAY,UAAU,aAAa;GACrE,MAAM,MAAM,KAAK,IAAI,SAAS,aAAa,CAAC;GAC5C,MAAM,SAAS,QAAQ;GACvB,OAAO,KAAK,KAAK,MAAM,QAAQ,GAAG,GAAG,MAAM;EAC7C;CACF,SAAS,GAAG;EACV,YAAa,EAAY,WAAW;CACtC;CAEA,IAAI,YACF,MAAM,IAAID,eAAAA,YACR,cACA,wCAAwC,eAAe,cACzD;CAEF,IAAI,cAAc,MAChB,MAAM,IAAIA,eAAAA,YAAY,cAAc,oCAAoC,WAAW;CAErF,MAAM,MAAME,eAAAA,YAAY,GAAG,MAAM;CACjC,IAAI,IAAI,WAAW,OACjB,MAAM,IAAIF,eAAAA,YACR,cACA,kCAAkC,IAAI,OAAO,sBAAsB,MAAM,0BAC3E;CAOF,MAAM,eACH,KAAK,IAAI,KAAO,KAAK,IAAI,MAAO,IAAM,KAAK,IAAI,MAAO,KAAO,KAAK,IAAI,MAAO,QAAS;CACzF,IAAIG,eAAAA,MAAM,GAAG,MAAM,aACjB,MAAM,IAAIH,eAAAA,YAAY,cAAc,+CAA+C;CAErF,OAAO;AACT"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { K as EraSdkError, T as concatBytes, y as crc32 } from "./shared-Bbgejrus.js";
|
|
2
|
+
import { Gunzip, gzipSync } from "fflate";
|
|
3
|
+
//#region src/tron-proto/gzip.ts
|
|
4
|
+
/** Smallest possible gzip stream: 10-byte header + 8-byte trailer. */
|
|
5
|
+
const MIN_GZIP_BYTES = 18;
|
|
6
|
+
/** Bytes fed to the inflater per step; bounds the overshoot past the cap. */
|
|
7
|
+
const SLICE_BYTES = 1024;
|
|
8
|
+
/** Deterministic gzip (fixed level, zeroed mtime) for reproducible request bytes. */
|
|
9
|
+
function gzipCompress(data) {
|
|
10
|
+
return gzipSync(data, {
|
|
11
|
+
level: 9,
|
|
12
|
+
mtime: 0
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Inflate with a hard output ceiling.
|
|
17
|
+
*
|
|
18
|
+
* A one-shot gunzip allocates the entire output before anyone can refuse it —
|
|
19
|
+
* gzip reaches ~1000:1 in practice, so a few hundred scanned bytes could ask
|
|
20
|
+
* for an arbitrary allocation. The decoder is therefore driven in slices and
|
|
21
|
+
* the output counted as it arrives; the moment the total would pass the cap,
|
|
22
|
+
* feeding stops and the reply is refused.
|
|
23
|
+
*
|
|
24
|
+
* The trailer's ISIZE (declared inflated length) is used twice: as a cheap
|
|
25
|
+
* refusal of honest bombs before any work, and as a truncation check at the
|
|
26
|
+
* end — an inflater hands back a partial buffer for a truncated stream
|
|
27
|
+
* without erroring, and a genuine device reply always declares honestly.
|
|
28
|
+
*/
|
|
29
|
+
function gunzipCapped(data, maxOutputBytes) {
|
|
30
|
+
if (data.length < MIN_GZIP_BYTES) throw new EraSdkError("gzip-error", "compressed payload is too short to be a gzip stream");
|
|
31
|
+
if (data[0] !== 31 || data[1] !== 139) throw new EraSdkError("gzip-error", "compressed payload is not a gzip stream");
|
|
32
|
+
const n = data.length;
|
|
33
|
+
const isize = (data[n - 4] | data[n - 3] << 8 | data[n - 2] << 16 | data[n - 1] << 24) >>> 0;
|
|
34
|
+
if (isize > maxOutputBytes) throw new EraSdkError("gzip-error", `compressed payload declares ${isize} bytes, over the ${maxOutputBytes} byte ceiling`);
|
|
35
|
+
const chunks = [];
|
|
36
|
+
let total = 0;
|
|
37
|
+
let overflowed = false;
|
|
38
|
+
let malformed = null;
|
|
39
|
+
const gunzip = new Gunzip((chunk) => {
|
|
40
|
+
if (overflowed) return;
|
|
41
|
+
if (total + chunk.length > maxOutputBytes) {
|
|
42
|
+
overflowed = true;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
chunks.push(chunk);
|
|
46
|
+
total += chunk.length;
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
for (let offset = 0; offset < n && !overflowed; offset += SLICE_BYTES) {
|
|
50
|
+
const end = Math.min(offset + SLICE_BYTES, n);
|
|
51
|
+
const isLast = end === n;
|
|
52
|
+
gunzip.push(data.slice(offset, end), isLast);
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
malformed = e.message ?? "inflate error";
|
|
56
|
+
}
|
|
57
|
+
if (overflowed) throw new EraSdkError("gzip-error", `compressed payload inflates past the ${maxOutputBytes} byte ceiling`);
|
|
58
|
+
if (malformed !== null) throw new EraSdkError("gzip-error", `compressed payload is malformed: ${malformed}`);
|
|
59
|
+
const out = concatBytes(...chunks);
|
|
60
|
+
if (out.length !== isize) throw new EraSdkError("gzip-error", `compressed payload inflated to ${out.length} bytes but declares ${isize} — truncated or malformed`);
|
|
61
|
+
const declaredCrc = (data[n - 8] | data[n - 7] << 8 | data[n - 6] << 16 | data[n - 5] << 24) >>> 0;
|
|
62
|
+
if (crc32(out) !== declaredCrc) throw new EraSdkError("gzip-error", "compressed payload is malformed: CRC mismatch");
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { gzipCompress as n, gunzipCapped as t };
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=gzip-DyZLtgJJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gzip-DyZLtgJJ.js","names":[],"sources":["../src/tron-proto/gzip.ts"],"sourcesContent":["import { Gunzip, gzipSync } from 'fflate';\nimport { concatBytes } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\nimport { crc32 } from '../ur/crc32';\n\n/** Smallest possible gzip stream: 10-byte header + 8-byte trailer. */\nconst MIN_GZIP_BYTES = 18;\n\n/** Bytes fed to the inflater per step; bounds the overshoot past the cap. */\nconst SLICE_BYTES = 1024;\n\n/** Deterministic gzip (fixed level, zeroed mtime) for reproducible request bytes. */\nexport function gzipCompress(data: Uint8Array): Uint8Array {\n return gzipSync(data, { level: 9, mtime: 0 });\n}\n\n/**\n * Inflate with a hard output ceiling.\n *\n * A one-shot gunzip allocates the entire output before anyone can refuse it —\n * gzip reaches ~1000:1 in practice, so a few hundred scanned bytes could ask\n * for an arbitrary allocation. The decoder is therefore driven in slices and\n * the output counted as it arrives; the moment the total would pass the cap,\n * feeding stops and the reply is refused.\n *\n * The trailer's ISIZE (declared inflated length) is used twice: as a cheap\n * refusal of honest bombs before any work, and as a truncation check at the\n * end — an inflater hands back a partial buffer for a truncated stream\n * without erroring, and a genuine device reply always declares honestly.\n */\nexport function gunzipCapped(data: Uint8Array, maxOutputBytes: number): Uint8Array {\n if (data.length < MIN_GZIP_BYTES) {\n throw new EraSdkError('gzip-error', 'compressed payload is too short to be a gzip stream');\n }\n if (data[0] !== 0x1f || data[1] !== 0x8b) {\n throw new EraSdkError('gzip-error', 'compressed payload is not a gzip stream');\n }\n const n = data.length;\n const isize =\n (data[n - 4]! | (data[n - 3]! << 8) | (data[n - 2]! << 16) | (data[n - 1]! << 24)) >>> 0;\n if (isize > maxOutputBytes) {\n throw new EraSdkError(\n 'gzip-error',\n `compressed payload declares ${isize} bytes, over the ${maxOutputBytes} byte ceiling`,\n );\n }\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n let overflowed = false;\n let malformed: string | null = null;\n\n const gunzip = new Gunzip((chunk) => {\n if (overflowed) return;\n if (total + chunk.length > maxOutputBytes) {\n overflowed = true;\n return;\n }\n chunks.push(chunk);\n total += chunk.length;\n });\n\n try {\n for (let offset = 0; offset < n && !overflowed; offset += SLICE_BYTES) {\n const end = Math.min(offset + SLICE_BYTES, n);\n const isLast = end === n;\n gunzip.push(data.slice(offset, end), isLast);\n }\n } catch (e) {\n malformed = (e as Error).message ?? 'inflate error';\n }\n\n if (overflowed) {\n throw new EraSdkError(\n 'gzip-error',\n `compressed payload inflates past the ${maxOutputBytes} byte ceiling`,\n );\n }\n if (malformed !== null) {\n throw new EraSdkError('gzip-error', `compressed payload is malformed: ${malformed}`);\n }\n const out = concatBytes(...chunks);\n if (out.length !== isize) {\n throw new EraSdkError(\n 'gzip-error',\n `compressed payload inflated to ${out.length} bytes but declares ${isize} — truncated or malformed`,\n );\n }\n // The trailer CRC32 (little-endian, bytes n-8..n-5) must cover the inflated\n // output. The streaming inflater does not verify it, and the reference\n // implementation's native decoder does — without this check a corrupted\n // stream, or a CONCATENATED multi-member stream (whose final member's CRC\n // cannot cover the whole output), would be accepted here and refused there.\n const declaredCrc =\n (data[n - 8]! | (data[n - 7]! << 8) | (data[n - 6]! << 16) | (data[n - 5]! << 24)) >>> 0;\n if (crc32(out) !== declaredCrc) {\n throw new EraSdkError('gzip-error', 'compressed payload is malformed: CRC mismatch');\n }\n return out;\n}\n"],"mappings":";;;;AAMA,MAAM,iBAAiB;;AAGvB,MAAM,cAAc;;AAGpB,SAAgB,aAAa,MAA8B;CACzD,OAAO,SAAS,MAAM;EAAE,OAAO;EAAG,OAAO;CAAE,CAAC;AAC9C;;;;;;;;;;;;;;;AAgBA,SAAgB,aAAa,MAAkB,gBAAoC;CACjF,IAAI,KAAK,SAAS,gBAChB,MAAM,IAAI,YAAY,cAAc,qDAAqD;CAE3F,IAAI,KAAK,OAAO,MAAQ,KAAK,OAAO,KAClC,MAAM,IAAI,YAAY,cAAc,yCAAyC;CAE/E,MAAM,IAAI,KAAK;CACf,MAAM,SACH,KAAK,IAAI,KAAO,KAAK,IAAI,MAAO,IAAM,KAAK,IAAI,MAAO,KAAO,KAAK,IAAI,MAAO,QAAS;CACzF,IAAI,QAAQ,gBACV,MAAM,IAAI,YACR,cACA,+BAA+B,MAAM,mBAAmB,eAAe,cACzE;CAGF,MAAM,SAAuB,CAAC;CAC9B,IAAI,QAAQ;CACZ,IAAI,aAAa;CACjB,IAAI,YAA2B;CAE/B,MAAM,SAAS,IAAI,QAAQ,UAAU;EACnC,IAAI,YAAY;EAChB,IAAI,QAAQ,MAAM,SAAS,gBAAgB;GACzC,aAAa;GACb;EACF;EACA,OAAO,KAAK,KAAK;EACjB,SAAS,MAAM;CACjB,CAAC;CAED,IAAI;EACF,KAAK,IAAI,SAAS,GAAG,SAAS,KAAK,CAAC,YAAY,UAAU,aAAa;GACrE,MAAM,MAAM,KAAK,IAAI,SAAS,aAAa,CAAC;GAC5C,MAAM,SAAS,QAAQ;GACvB,OAAO,KAAK,KAAK,MAAM,QAAQ,GAAG,GAAG,MAAM;EAC7C;CACF,SAAS,GAAG;EACV,YAAa,EAAY,WAAW;CACtC;CAEA,IAAI,YACF,MAAM,IAAI,YACR,cACA,wCAAwC,eAAe,cACzD;CAEF,IAAI,cAAc,MAChB,MAAM,IAAI,YAAY,cAAc,oCAAoC,WAAW;CAErF,MAAM,MAAM,YAAY,GAAG,MAAM;CACjC,IAAI,IAAI,WAAW,OACjB,MAAM,IAAI,YACR,cACA,kCAAkC,IAAI,OAAO,sBAAsB,MAAM,0BAC3E;CAOF,MAAM,eACH,KAAK,IAAI,KAAO,KAAK,IAAI,MAAO,IAAM,KAAK,IAAI,MAAO,KAAO,KAAK,IAAI,MAAO,QAAS;CACzF,IAAI,MAAM,GAAG,MAAM,aACjB,MAAM,IAAI,YAAY,cAAc,+CAA+C;CAErF,OAAO;AACT"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_shared = require("./shared-Cu2yynP9.cjs");
|
|
3
3
|
const require_keypath = require("./keypath-pzm_YIfN.cjs");
|
|
4
|
-
const require_derive = require("./derive-
|
|
5
|
-
const require_btc = require("./btc-
|
|
4
|
+
const require_derive = require("./derive-BuNsfWlg.cjs");
|
|
5
|
+
const require_btc = require("./btc-BxNww6kW.cjs");
|
|
6
6
|
const require_cardano = require("./cardano-CzYswGzK.cjs");
|
|
7
|
+
const require_bch = require("./bch-CpLACx0j.cjs");
|
|
7
8
|
const require_cosmos = require("./cosmos-DDsgtUki.cjs");
|
|
8
9
|
const require_evm = require("./evm-yfKOc2dy.cjs");
|
|
9
10
|
const require_solana = require("./solana-BoQBy0hu.cjs");
|
|
10
11
|
const require_sui = require("./sui-CYRn331O.cjs");
|
|
11
12
|
const require_ton = require("./ton-CI2s9puH.cjs");
|
|
12
|
-
const require_tron = require("./tron-
|
|
13
|
+
const require_tron = require("./tron-DYPOg5cm.cjs");
|
|
13
14
|
const require_xrp = require("./xrp-BrHXUnX5.cjs");
|
|
14
15
|
//#region src/registry/multi-accounts.ts
|
|
15
16
|
/** UR types a device links a watch-only wallet with. */
|
|
@@ -106,6 +107,7 @@ function classify(path) {
|
|
|
106
107
|
if (!p0 || !p1 || !p0.hardened || !p1.hardened) return "unknown";
|
|
107
108
|
if (p0.index === 44 && p1.index === 60) return "evm";
|
|
108
109
|
if (p1.index === 0 && (p0.index === 84 || p0.index === 49 || p0.index === 44 || p0.index === 86)) return "btc";
|
|
110
|
+
if (p0.index === 44 && p1.index === 145) return "bch";
|
|
109
111
|
if (p0.index === 44 && p1.index === 501) return "solana";
|
|
110
112
|
if (p0.index === 44 && p1.index === 195) return "tron";
|
|
111
113
|
if (p0.index === 44 && p1.index === 607) return "ton";
|
|
@@ -209,6 +211,33 @@ var TronAccountView = class {
|
|
|
209
211
|
return require_derive.tronAddressFromPublicKey(require_derive.derivePublicKey(requireKey(this.entry, 33), withChainCode(this.entry), 0, index));
|
|
210
212
|
}
|
|
211
213
|
};
|
|
214
|
+
/** Bitcoin Cash view: `m/44'/145'/0'`, CashAddr P2PKH addresses. */
|
|
215
|
+
var BchAccountView = class {
|
|
216
|
+
constructor(entry, resolvedXfp) {
|
|
217
|
+
this.entry = entry;
|
|
218
|
+
this.resolvedXfp = resolvedXfp;
|
|
219
|
+
}
|
|
220
|
+
get xfp() {
|
|
221
|
+
return require_keypath.xfpToHex(this.resolvedXfp);
|
|
222
|
+
}
|
|
223
|
+
get accountPath() {
|
|
224
|
+
return require_keypath.formatPath([...this.entry.path]);
|
|
225
|
+
}
|
|
226
|
+
receivePath(index) {
|
|
227
|
+
return `${this.accountPath}/0/${index}`;
|
|
228
|
+
}
|
|
229
|
+
changePath(index) {
|
|
230
|
+
return `${this.accountPath}/1/${index}`;
|
|
231
|
+
}
|
|
232
|
+
/** The compressed public key at receive/change `index` — what a sign request's input names. */
|
|
233
|
+
derivePublicKey(index, options) {
|
|
234
|
+
return require_derive.derivePublicKey(requireKey(this.entry, 33), withChainCode(this.entry), options?.change ? 1 : 0, index);
|
|
235
|
+
}
|
|
236
|
+
/** Bare CashAddr by default; `{ withPrefix: true }` for `bitcoincash:...`. */
|
|
237
|
+
deriveAddress(index, options) {
|
|
238
|
+
return require_derive.bchAddressFromPublicKey(this.derivePublicKey(index, options), { withPrefix: options?.withPrefix ?? false });
|
|
239
|
+
}
|
|
240
|
+
};
|
|
212
241
|
/**
|
|
213
242
|
* TON view: one Ed25519 key per account (`m/44'/607'/0'`), shared by the
|
|
214
243
|
* V4R2 and V5R1 wallet contracts — the contract version affects only the
|
|
@@ -396,6 +425,11 @@ var EraAccounts = class EraAccounts {
|
|
|
396
425
|
const entry = this.raw.entries.find((e) => classify(e.path) === "tron");
|
|
397
426
|
return entry ? new TronAccountView(entry, this.resolveXfp(entry)) : void 0;
|
|
398
427
|
}
|
|
428
|
+
/** The Bitcoin Cash account (`m/44'/145'/0'`), if the export carries one. */
|
|
429
|
+
bch() {
|
|
430
|
+
const entry = this.raw.entries.find((e) => classify(e.path) === "bch");
|
|
431
|
+
return entry ? new BchAccountView(entry, this.resolveXfp(entry)) : void 0;
|
|
432
|
+
}
|
|
399
433
|
/** The TON account (linked via the Tonkeeper-style `crypto-hdkey` export). */
|
|
400
434
|
ton() {
|
|
401
435
|
const entry = this.raw.entries.find((e) => classify(e.path) === "ton" && e.publicKey?.length === 32);
|
|
@@ -533,6 +567,11 @@ var EraConnect = class {
|
|
|
533
567
|
this._tron ?? (this._tron = new require_tron.TronChain(this.context));
|
|
534
568
|
return this._tron;
|
|
535
569
|
}
|
|
570
|
+
/** Bitcoin Cash — the structured keystone envelope (see `@hwlt/era-connect/bch`). */
|
|
571
|
+
get bch() {
|
|
572
|
+
this._bch ?? (this._bch = new require_bch.BchChain(this.context));
|
|
573
|
+
return this._bch;
|
|
574
|
+
}
|
|
536
575
|
get ton() {
|
|
537
576
|
this._ton ?? (this._ton = new require_ton.TonChain(this.context));
|
|
538
577
|
return this._ton;
|
|
@@ -580,6 +619,8 @@ var EraConnect = class {
|
|
|
580
619
|
};
|
|
581
620
|
//#endregion
|
|
582
621
|
exports.AnimatedUr = require_shared.AnimatedUr;
|
|
622
|
+
exports.BchAccountView = BchAccountView;
|
|
623
|
+
exports.BchChain = require_bch.BchChain;
|
|
583
624
|
exports.BtcAccountView = BtcAccountView;
|
|
584
625
|
exports.BtcChain = require_btc.BtcChain;
|
|
585
626
|
exports.CardanoAccountView = CardanoAccountView;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["parseUrString","EraSdkError","cborDecode","asMap","asUint","mapGet","asArray","asText","parsePathComponents","asBytes","EraSdkError","formatPath","xfpToHex","evmAddressFromPublicKey","derivePublicKey","btcP2wpkhAddressFromPublicKey","btcP2pkhAddressFromPublicKey","btcNestedSegwitAddressFromPublicKey","ZPUB_VERSION","tronAddressFromPublicKey","cardanoSoftDerivePath","suiAddressFromPublicKey","solanaAddressFromPublicKey","serializeExtendedPublicKey","parsePath","pathEquals","EraSdkError","parsePath","keypath304","cbUint","cbText","cbTag","cbMap","cbArray","UrValue","cborEncode","AnimatedUr","TypedUrScanner","EraAccountsClass","UrValue","toUr","AnimatedUr","resolveContext","EvmChain","BtcChain","SolanaChain","TronChain","TonChain","CardanoChain","SuiChain","CosmosChain","XrpChain","UrScanner"],"sources":["../src/registry/multi-accounts.ts","../src/accounts/accounts.ts","../src/hardware-call/key-derivation.ts","../src/raw.ts","../src/index.ts"],"sourcesContent":["import { cborDecode } from '../cbor/decode';\nimport type { CborValue } from '../cbor/model';\nimport { asArray, asBytes, asMap, asText, asUint, mapGet } from '../cbor/model';\nimport { EraSdkError } from '../core/errors';\nimport { parseUrString, type Ur } from '../ur/ur';\nimport type { PathLevel } from './keypath';\nimport { parsePathComponents } from './keypath';\n\n/**\n * Raw account entry parsed from a `crypto-multi-accounts` (1103) export.\n *\n * `xfp` is the entry's ORIGIN source fingerprint (`crypto-keypath` key 2) —\n * the value a `*-sign-request` keypath must carry. It is NOT the top-level\n * master fingerprint, although the two often coincide.\n */\nexport interface RawAccountEntry {\n readonly path: readonly PathLevel[];\n /**\n * The origin's source fingerprint, when the export carries one. Cardano\n * entries deliberately ship a path-only origin — resolve against the\n * wrapper's master fingerprint in that case.\n */\n readonly xfp: number | null;\n /**\n * Nullable and length-unconstrained, as in the reference implementation: an\n * entry without a usable key still resolves its xfp for signing — only the\n * address-derivation views require the 33/32-byte forms.\n */\n readonly publicKey: Uint8Array | null;\n readonly chainCode: Uint8Array | null;\n readonly parentFingerprint: number | null;\n readonly name: string | null;\n /** A label string (`account.standard`, ...) — NEVER chain metadata. */\n readonly note: string | null;\n}\n\nexport interface RawMultiAccounts {\n readonly masterFingerprint: number;\n readonly deviceName: string | null;\n readonly deviceId: string | null;\n readonly deviceVersion: string | null;\n readonly entries: readonly RawAccountEntry[];\n}\n\n/** UR types a device links a watch-only wallet with. */\nexport const WALLET_UR_TYPES: ReadonlySet<string> = new Set([\n 'crypto-multi-accounts',\n 'crypto-account',\n 'crypto-hdkey',\n]);\n\n/**\n * Parse a wallet-export UR.\n *\n * Of the three admitted link types only the `crypto-multi-accounts` shape\n * yields derivable accounts; an export that yields none is refused rather\n * than stored as an unusable wallet. Malformed entries are skipped\n * individually so one foreign item does not abort the rest.\n */\nexport function parseMultiAccountsUr(input: Ur | string): RawMultiAccounts {\n let type: string;\n let cbor: Uint8Array;\n if (typeof input === 'string') {\n const parsed = parseUrString(input);\n if (parsed.seq !== null) {\n throw new EraSdkError(\n 'invalid-props',\n 'multi-part UR string: assemble it with a UrScanner first',\n );\n }\n type = parsed.type;\n cbor = parsed.payload;\n } else {\n type = input.type;\n cbor = input.cbor;\n }\n\n if (!WALLET_UR_TYPES.has(type)) {\n // The type is attacker-sized (the UR grammar allows an unbounded letter\n // run) — truncate before it reaches a message or error data.\n const shown = type.length > 32 ? `${type.slice(0, 32)}…` : type;\n throw new EraSdkError(\n 'wrong-ur-type',\n `\"${shown}\" is not a wallet export; expected one of ${[...WALLET_UR_TYPES].join(', ')}`,\n { received: shown },\n );\n }\n\n let decoded: CborValue;\n try {\n decoded = cborDecode(cbor);\n } catch (e) {\n throw new EraSdkError('malformed-cbor', `cannot decode wallet UR: ${(e as Error).message}`);\n }\n const root = asMap(decoded);\n if (!root) {\n throw new EraSdkError('malformed-cbor', 'wallet UR is not a CBOR map');\n }\n\n // A standalone `crypto-hdkey` export (the single-account link some wallet\n // profiles use — e.g. the TON one: `{3: key, 6: keypath, 10: name}`) IS the\n // entry map itself: no master-fingerprint/list wrapper. The entry's origin\n // fingerprint doubles as the master fingerprint.\n if (type === 'crypto-hdkey') {\n const entry = tryParseEntry(decoded);\n if (!entry) {\n throw new EraSdkError(\n 'malformed-reply',\n 'crypto-hdkey export carries no derivable account (missing origin keypath)',\n );\n }\n return {\n masterFingerprint: entry.xfp ?? 0,\n deviceName: null,\n deviceId: null,\n deviceVersion: null,\n entries: [entry],\n };\n }\n\n const master = asUint(mapGet(root, 1));\n const list = asArray(mapGet(root, 2));\n if (master === undefined || !list) {\n throw new EraSdkError(\n 'malformed-reply',\n 'wallet UR missing master fingerprint (key 1) or accounts (key 2)',\n );\n }\n\n const entries: RawAccountEntry[] = [];\n for (const item of list) {\n const entry = tryParseEntry(item);\n if (entry) entries.push(entry);\n }\n if (entries.length === 0) {\n throw new EraSdkError(\n 'malformed-reply',\n 'wallet UR carries no account this SDK can derive an address from',\n );\n }\n\n return {\n masterFingerprint: Number(master & 0xffffffffn),\n deviceName: asText(mapGet(root, 3)) ?? null,\n deviceId: asText(mapGet(root, 4)) ?? null,\n deviceVersion: asText(mapGet(root, 5)) ?? null,\n entries,\n };\n}\n\nfunction tryParseEntry(item: CborValue): RawAccountEntry | null {\n const map = asMap(item);\n if (!map) return null;\n const origin = asMap(mapGet(map, 6));\n if (!origin) return null;\n\n const path = parsePathComponents(mapGet(origin, 1));\n if (!path || path.length === 0) return null;\n const xfpValue = asUint(mapGet(origin, 2));\n const xfp = xfpValue !== undefined && xfpValue <= 0xffffffffn ? Number(xfpValue) : null;\n\n const parentFp = asUint(mapGet(map, 8));\n return {\n path,\n xfp,\n publicKey: asBytes(mapGet(map, 3)) ?? null,\n chainCode: asBytes(mapGet(map, 4)) ?? null,\n parentFingerprint: parentFp !== undefined && parentFp <= 0xffffffffn ? Number(parentFp) : null,\n name: asText(mapGet(map, 9)) ?? null,\n note: asText(mapGet(map, 10)) ?? null,\n };\n}\n","import { EraSdkError } from '../core/errors';\nimport type { PathLevel } from '../registry/keypath';\nimport { formatPath, parsePath, pathEquals, xfpToHex } from '../registry/keypath';\nimport type { RawAccountEntry, RawMultiAccounts } from '../registry/multi-accounts';\nimport { parseMultiAccountsUr } from '../registry/multi-accounts';\nimport type { Ur } from '../ur/ur';\nimport {\n btcNestedSegwitAddressFromPublicKey,\n btcP2pkhAddressFromPublicKey,\n btcP2wpkhAddressFromPublicKey,\n cardanoSoftDerivePath,\n derivePublicKey,\n evmAddressFromPublicKey,\n serializeExtendedPublicKey,\n solanaAddressFromPublicKey,\n suiAddressFromPublicKey,\n tronAddressFromPublicKey,\n ZPUB_VERSION,\n} from './derive';\n\n/** Chain family of an exported account, matched by its derivation path — never by the note label. */\nexport type AccountChain =\n | 'evm'\n | 'btc'\n | 'solana'\n | 'tron'\n | 'ton'\n | 'cardano'\n | 'sui'\n | 'cosmos'\n | 'unknown';\n\nexport interface AccountKey {\n readonly chain: AccountChain;\n /** Account-level derivation path, e.g. `m/44'/60'/0'`. */\n readonly path: string;\n /**\n * The source fingerprint a `*-sign-request` keypath must carry for this\n * account (lowercase 8-hex). NOT necessarily the master fingerprint.\n */\n readonly xfp: string;\n /** 33-byte compressed secp256k1, or 32-byte Ed25519 (Solana); absent when the export omitted it. */\n readonly publicKey: Uint8Array | undefined;\n readonly chainCode: Uint8Array | undefined;\n readonly name: string | undefined;\n /** Derivation-scheme label (`account.standard`, ...) — display only. */\n readonly note: string | undefined;\n}\n\nexport interface DeviceInfo {\n readonly name: string | undefined;\n readonly id: string | undefined;\n readonly firmwareVersion: string | undefined;\n}\n\nfunction classify(path: readonly PathLevel[]): AccountChain {\n const p0 = path[0];\n const p1 = path[1];\n if (!p0 || !p1 || !p0.hardened || !p1.hardened) return 'unknown';\n if (p0.index === 44 && p1.index === 60) return 'evm';\n if (\n p1.index === 0 &&\n (p0.index === 84 || p0.index === 49 || p0.index === 44 || p0.index === 86)\n ) {\n return 'btc';\n }\n if (p0.index === 44 && p1.index === 501) return 'solana';\n if (p0.index === 44 && p1.index === 195) return 'tron';\n if (p0.index === 44 && p1.index === 607) return 'ton';\n if (p0.index === 1852 && p1.index === 1815) return 'cardano';\n if (p0.index === 44 && p1.index === 784) return 'sui';\n if (p0.index === 44 && p1.index === 118) return 'cosmos';\n return 'unknown';\n}\n\nfunction withChainCode(entry: RawAccountEntry): Uint8Array {\n if (!entry.chainCode) {\n throw new EraSdkError(\n 'account-not-found',\n `account ${formatPath([...entry.path])} carries no chain code; cannot derive children`,\n );\n }\n return entry.chainCode;\n}\n\n/** The entry's key at the required length, or a typed refusal (derivation only). */\nfunction requireKey(entry: RawAccountEntry, length: number): Uint8Array {\n if (!entry.publicKey || entry.publicKey.length !== length) {\n throw new EraSdkError(\n 'invalid-props',\n `account ${formatPath([...entry.path])} carries no ${length}-byte public key; ` +\n 'xfp lookup still works, address derivation does not',\n );\n }\n return entry.publicKey;\n}\n\n/** EVM view over the linked wallet: one account xpub, addresses derived at `0/index`. */\nexport class EvmAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n /** Signing path for address `index`: `<account>/0/<index>`. */\n pathFor(index: number): string {\n return `${this.accountPath}/0/${index}`;\n }\n\n deriveAddress(index: number): `0x${string}` {\n return evmAddressFromPublicKey(\n derivePublicKey(requireKey(this.entry, 33), withChainCode(this.entry), 0, index),\n );\n }\n\n xpub(): string {\n return extendedKeyOf(this.entry);\n }\n}\n\nexport type BtcPurpose = 44 | 49 | 84 | 86;\n\n/**\n * Bitcoin view over one exported account. The default is the BIP-84\n * native-segwit account; pass `purpose` to reach the other script types the\n * device exports (44 = legacy P2PKH — the kind the device signs MESSAGES for,\n * 49 = nested segwit, 86 = taproot).\n */\nexport class BtcAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly testnet: boolean,\n readonly purpose: BtcPurpose,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n receivePath(index: number): string {\n return `${this.accountPath}/0/${index}`;\n }\n\n changePath(index: number): string {\n return `${this.accountPath}/1/${index}`;\n }\n\n deriveAddress(index: number, options?: { change?: boolean }): string {\n const change = options?.change ? 1 : 0;\n const child = derivePublicKey(\n requireKey(this.entry, 33),\n withChainCode(this.entry),\n change,\n index,\n );\n switch (this.purpose) {\n case 84:\n return btcP2wpkhAddressFromPublicKey(child, this.testnet ? 'tb' : 'bc');\n case 44:\n return btcP2pkhAddressFromPublicKey(child, this.testnet);\n case 49:\n return btcNestedSegwitAddressFromPublicKey(child, this.testnet);\n case 86:\n throw new EraSdkError(\n 'invalid-props',\n 'taproot addresses need the BIP-341 output-key tweak; derive them from xpub() with your Bitcoin library',\n );\n }\n }\n\n xpub(): string {\n return extendedKeyOf(this.entry);\n }\n\n /** SLIP-132 zpub form of the BIP-84 key, for tools that require it. */\n zpub(): string {\n if (this.purpose !== 84) {\n throw new EraSdkError(\n 'invalid-props',\n 'zpub is the SLIP-132 form of the BIP-84 account only',\n );\n }\n return extendedKeyOf(this.entry, ZPUB_VERSION);\n }\n}\n\n/** Tron view: addresses derived at `0/index`. */\nexport class TronAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n pathFor(index: number): string {\n return `${this.accountPath}/0/${index}`;\n }\n\n deriveAddress(index: number): string {\n return tronAddressFromPublicKey(\n derivePublicKey(requireKey(this.entry, 33), withChainCode(this.entry), 0, index),\n );\n }\n}\n\n/**\n * TON view: one Ed25519 key per account (`m/44'/607'/0'`), shared by the\n * V4R2 and V5R1 wallet contracts — the contract version affects only the\n * ADDRESS, which this SDK leaves to TON tooling (derive it from `publicKey`\n * with @ton/core or equivalent).\n */\nexport class TonAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n /** 32-byte Ed25519 public key — the signer for both wallet-contract versions. */\n get publicKey(): Uint8Array {\n return requireKey(this.entry, 32);\n }\n\n get name(): string | undefined {\n return this.entry.name ?? this.entry.note ?? undefined;\n }\n}\n\n/**\n * Cardano view (CIP-1852): the exported account key supports SOFT public\n * derivation (BIP32-Ed25519), so payment (`0/i`), change (`1/i`) and stake\n * (`2/0`) verification keys derive locally. Bech32 ADDRESS assembly is left\n * to Cardano tooling — `deriveKey` hands you the raw vkeys it needs.\n */\nexport class CardanoAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n /** The account-level extended public key material. */\n get publicKey(): Uint8Array {\n return requireKey(this.entry, 32);\n }\n\n get chainCode(): Uint8Array {\n return withChainCode(this.entry);\n }\n\n /** Signing path for `role/index`, e.g. `pathFor(0, 0)` → `.../0/0`. */\n pathFor(role: number, index: number): string {\n return `${this.accountPath}/${role}/${index}`;\n }\n\n /** Soft-derived 32-byte verification key at `role/index` (0 payment, 1 change, 2 stake). */\n deriveKey(role: number, index: number): Uint8Array {\n return cardanoSoftDerivePath(requireKey(this.entry, 32), withChainCode(this.entry), [\n role,\n index,\n ]);\n }\n}\n\n/** Sui view: like Solana, each fully-hardened exported entry IS a signer. */\nexport class SuiAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get path(): string {\n return formatPath([...this.entry.path]);\n }\n\n get publicKey(): Uint8Array {\n return requireKey(this.entry, 32);\n }\n\n /** `0x` Sui address: BLAKE2b-256 of `0x00 || publicKey`. */\n get address(): string {\n return suiAddressFromPublicKey(requireKey(this.entry, 32));\n }\n}\n\n/**\n * Solana view: Ed25519 has no public child derivation, so the device\n * pre-derives hardened accounts (`m/44'/501'/idx'`) and each entry IS a\n * signer. The public key, base58, IS the address.\n */\nexport class SolanaAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get path(): string {\n return formatPath([...this.entry.path]);\n }\n\n /** The hardened account index (third path level). */\n get index(): number {\n return this.entry.path[2]?.index ?? 0;\n }\n\n get publicKey(): Uint8Array {\n return requireKey(this.entry, 32);\n }\n\n get address(): string {\n return solanaAddressFromPublicKey(requireKey(this.entry, 32));\n }\n}\n\nfunction extendedKeyOf(entry: RawAccountEntry, version?: number): string {\n const chainCode = withChainCode(entry);\n const publicKey = requireKey(entry, 33);\n const last = entry.path[entry.path.length - 1]!;\n const args = {\n depth: entry.path.length,\n parentFingerprint: entry.parentFingerprint ?? 0,\n childNumber: last.hardened ? last.index + 0x80000000 : last.index,\n chainCode,\n publicKey,\n };\n return version === undefined\n ? serializeExtendedPublicKey(args)\n : serializeExtendedPublicKey({ ...args, version });\n}\n\n/**\n * The linked wallet: everything a software wallet extracts from the device's\n * `crypto-multi-accounts` QR. Parse once, store the source UR string, derive\n * addresses locally — the device is not needed again until signing.\n */\nexport class EraAccounts {\n private constructor(\n private readonly raw: RawMultiAccounts,\n readonly sourceUr: string | undefined,\n ) {}\n\n static fromUr(input: Ur | string): EraAccounts {\n const raw = parseMultiAccountsUr(input);\n return new EraAccounts(raw, typeof input === 'string' ? input : input.toString());\n }\n\n /** Master fingerprint, lowercase 8-hex. */\n get masterFingerprint(): string {\n return xfpToHex(this.raw.masterFingerprint);\n }\n\n get device(): DeviceInfo {\n return {\n name: this.raw.deviceName ?? undefined,\n id: this.raw.deviceId ?? undefined,\n firmwareVersion: this.raw.deviceVersion ?? undefined,\n };\n }\n\n get keys(): AccountKey[] {\n return this.raw.entries.map((entry) => ({\n chain: classify(entry.path),\n path: formatPath([...entry.path]),\n xfp: xfpToHex(entry.xfp ?? this.raw.masterFingerprint),\n publicKey: entry.publicKey ?? undefined,\n chainCode: entry.chainCode ?? undefined,\n name: entry.name ?? undefined,\n note: entry.note ?? undefined,\n }));\n }\n\n /**\n * The xfp a sign request must carry for the account whose path exactly\n * equals `accountPath`. Throws `account-not-found` — never a silent zero.\n */\n xfpFor(accountPath: string): string {\n return xfpToHex(this.resolveXfp(this.entryFor(accountPath)));\n }\n\n /** Entry xfp, falling back to the wrapper's master fingerprint (Cardano-style path-only origins). */\n private resolveXfp(entry: RawAccountEntry): number {\n return entry.xfp ?? this.raw.masterFingerprint;\n }\n\n /** The EVM account (standard `m/44'/60'/...` scheme), if the export carries one. */\n evm(): EvmAccountView | undefined {\n const entry =\n this.raw.entries.find(\n (e) => classify(e.path) === 'evm' && (e.note === null || e.note === 'account.standard'),\n ) ?? this.raw.entries.find((e) => classify(e.path) === 'evm');\n return entry ? new EvmAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /**\n * A Bitcoin account view. Defaults to the BIP-84 native-segwit account;\n * pass `purpose: 44` for the legacy P2PKH account (message signing), 49 for\n * nested segwit, 86 for taproot — if the export carries them.\n */\n btc(options?: { testnet?: boolean; purpose?: BtcPurpose }): BtcAccountView | undefined {\n const purpose = options?.purpose ?? 84;\n const entry = this.raw.entries.find(\n (e) => classify(e.path) === 'btc' && e.path[0]?.index === purpose,\n );\n return entry\n ? new BtcAccountView(entry, options?.testnet ?? false, purpose, this.resolveXfp(entry))\n : undefined;\n }\n\n tron(): TronAccountView | undefined {\n const entry = this.raw.entries.find((e) => classify(e.path) === 'tron');\n return entry ? new TronAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /** The TON account (linked via the Tonkeeper-style `crypto-hdkey` export). */\n ton(): TonAccountView | undefined {\n const entry = this.raw.entries.find(\n (e) => classify(e.path) === 'ton' && e.publicKey?.length === 32,\n );\n return entry ? new TonAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /** All exported Sui signers (fully hardened SLIP-10 entries). */\n sui(): SuiAccountView[] {\n return this.raw.entries\n .filter((e) => classify(e.path) === 'sui' && e.publicKey?.length === 32)\n .map((e) => new SuiAccountView(e, this.resolveXfp(e)));\n }\n\n /** The Cardano account (CIP-1852 Icarus export), if the export carries one. */\n cardano(): CardanoAccountView | undefined {\n const entry = this.raw.entries.find(\n (e) => classify(e.path) === 'cardano' && e.publicKey?.length === 32,\n );\n return entry ? new CardanoAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /** All pre-derived Solana signers (usually `m/44'/501'/0'..9'`). */\n solana(): SolanaAccountView[] {\n return this.raw.entries\n .filter((e) => classify(e.path) === 'solana' && e.publicKey?.length === 32)\n .map((e) => new SolanaAccountView(e, this.resolveXfp(e)));\n }\n\n private entryFor(accountPath: string): RawAccountEntry {\n const levels = parsePath(accountPath);\n const entry = this.raw.entries.find((e) => pathEquals(e.path, levels));\n if (!entry) {\n throw new EraSdkError(\n 'account-not-found',\n `the linked wallet carries no account at ${accountPath}`,\n { path: accountPath },\n );\n }\n return entry;\n }\n}\n","import type { EraAccounts } from '../accounts/accounts';\nimport { EraAccounts as EraAccountsClass } from '../accounts/accounts';\nimport { cborEncode } from '../cbor/encode';\nimport type { CborValue } from '../cbor/model';\nimport { cbArray, cbMap, cbTag, cbText, cbUint } from '../cbor/model';\nimport type { ChainContext } from '../chains/shared';\nimport { EraSdkError } from '../core/errors';\nimport type { AnimatedUrOptions } from '../qr/animated-ur';\nimport { AnimatedUr } from '../qr/animated-ur';\nimport { keypath304, parsePath } from '../registry/keypath';\nimport { WALLET_UR_TYPES } from '../registry/multi-accounts';\nimport { TypedUrScanner } from '../scan/ur-scanner';\nimport type { Ur } from '../ur/ur';\nimport { Ur as UrValue } from '../ur/ur';\n\nexport type DerivationCurve = 'secp256k1' | 'ed25519';\nexport type DerivationAlgorithm = 'slip10' | 'bip32ed25519';\n\nexport interface KeyDerivationSchema {\n /** The derivation path to request, e.g. `m/44'/60'/0'`. */\n readonly path: string;\n /** Defaults to `secp256k1`. */\n readonly curve?: DerivationCurve;\n /** Defaults to `slip10`. */\n readonly algo?: DerivationAlgorithm;\n /** Optional chain hint shown by the device. */\n readonly chainType?: string;\n}\n\nexport interface KeyDerivationCallProps {\n readonly schemas: readonly KeyDerivationSchema[];\n readonly origin?: string;\n}\n\n/** The pull-model linking request: display it, then scan the device's account export back. */\nexport interface HardwareCallRequest {\n readonly ur: Ur;\n readonly replyTypes: readonly string[];\n toAnimated(options?: AnimatedUrOptions): AnimatedUr;\n scanner(): TypedUrScanner<EraAccounts>;\n}\n\nconst CURVES: Record<DerivationCurve, number> = { secp256k1: 0, ed25519: 1 };\nconst ALGOS: Record<DerivationAlgorithm, number> = { slip10: 0, bip32ed25519: 1 };\n\n/**\n * Build a `qr-hardware-call` (1201) wrapping a `key-derivation-call` (1301):\n * the WALLET asks the device for specific derivation paths, curves and\n * algorithms instead of accepting whatever the device's sync screen\n * volunteers. The device answers with a `crypto-multi-accounts` export, which\n * closes the loop through `parseAccounts`.\n *\n * Registry shape (Keystone-standard):\n * `1201({1: type=0, 2: 1301({1: [1302({1: 304(keypath), 2: curve, 3: algo, 4?: chainType})...]}), 3?: origin})`.\n */\nexport function generateKeyDerivationCall(\n context: ChainContext,\n props: KeyDerivationCallProps,\n): HardwareCallRequest {\n if (props.schemas.length === 0) {\n throw new EraSdkError('invalid-props', 'at least one derivation schema is required');\n }\n const schemas: CborValue[] = props.schemas.map((schema) => {\n const levels = parsePath(schema.path);\n const entries: [number, CborValue][] = [\n [1, keypath304(levels)],\n [2, cbUint(CURVES[schema.curve ?? 'secp256k1'])],\n [3, cbUint(ALGOS[schema.algo ?? 'slip10'])],\n ];\n if (schema.chainType !== undefined) entries.push([4, cbText(schema.chainType)]);\n return cbTag(1302, cbMap(entries));\n });\n\n const call = cbTag(1301, cbMap([[1, cbArray(schemas)]]));\n const root = cbMap([\n [1, cbUint(0)], // type: KeyDerivation\n [2, call],\n [3, cbText(props.origin ?? context.origin)],\n ]);\n\n const ur = new UrValue('qr-hardware-call', cborEncode(root));\n const replyTypes = [...WALLET_UR_TYPES];\n return {\n ur,\n replyTypes,\n toAnimated: (options?: AnimatedUrOptions) =>\n new AnimatedUr(ur, {\n maxFragmentLength: options?.maxFragmentLength ?? context.maxFragmentLength,\n }),\n scanner: () =>\n new TypedUrScanner<EraAccounts>({ expectedTypes: replyTypes }, (reply) =>\n EraAccountsClass.fromUr(reply),\n ),\n };\n}\n","import type { ChainContext } from './chains/shared';\nimport { toUr } from './chains/shared';\nimport type { AnimatedUrOptions } from './qr/animated-ur';\nimport { AnimatedUr } from './qr/animated-ur';\nimport type { Ur } from './ur/ur';\nimport { Ur as UrValue } from './ur/ur';\n\n/**\n * Escape hatch for UR types this SDK has no dedicated module for (future\n * chains, custom registry items). You bring the CBOR; the SDK brings the UR\n * plumbing, fountain frames and the hardened scanner\n * (`EraConnect.scanner({expectedTypes})`).\n */\nexport class RawModule {\n constructor(private readonly context: ChainContext) {}\n\n /** Wrap raw CBOR bytes in a UR of the given registry type. */\n ur(type: string, cbor: Uint8Array): Ur {\n return new UrValue(type, cbor);\n }\n\n /** Parse a single-part `ur:` string into a Ur. */\n parse(text: string): Ur {\n return toUr(text);\n }\n\n /** Fragment + animate any UR. */\n animate(ur: Ur, options?: AnimatedUrOptions): AnimatedUr {\n return new AnimatedUr(ur, {\n maxFragmentLength: options?.maxFragmentLength ?? this.context.maxFragmentLength,\n });\n }\n}\n","/**\n * ERA Connect SDK — air-gapped UR/QR linking and signing for the ERA\n * hardware wallet.\n *\n * Headless by design: you render the QR codes and own the camera; the SDK\n * owns every byte of the protocol. No network I/O, no Node built-ins,\n * `Uint8Array` end-to-end.\n */\n\nimport type { EraAccounts as EraAccountsType } from './accounts/accounts';\nimport { EraAccounts } from './accounts/accounts';\nimport { BtcChain } from './chains/btc';\nimport { CardanoChain } from './chains/cardano';\n\nexport type {\n CosmosSignatureResult,\n CosmosSignRequestProps,\n EthermintSignRequestProps,\n} from './chains/cosmos';\nexport type {\n SuiSignatureResult,\n SuiSignHashRequestProps,\n SuiSignRequestProps,\n} from './chains/sui';\nexport type { XrpSignatureResult, XrpSignRequestProps } from './chains/xrp';\n\nimport { CosmosChain } from './chains/cosmos';\nimport { EvmChain } from './chains/evm';\nimport type { ChainContext, EraConnectConfig } from './chains/shared';\nimport { resolveContext } from './chains/shared';\nimport { SolanaChain } from './chains/solana';\nimport { SuiChain } from './chains/sui';\nimport { TonChain } from './chains/ton';\nimport { TronChain } from './chains/tron';\nimport { XrpChain } from './chains/xrp';\nimport type { HardwareCallRequest, KeyDerivationCallProps } from './hardware-call/key-derivation';\nimport { generateKeyDerivationCall } from './hardware-call/key-derivation';\nimport { RawModule } from './raw';\nimport type { UrScannerOptions } from './scan/ur-scanner';\nimport { UrScanner } from './scan/ur-scanner';\nimport type { Ur } from './ur/ur';\n\n/** Timing/size constants of the device's own QR pipeline, for progress UI and timeouts. */\nexport const DeviceProfile = {\n /** What the phone displays to the device: ~200 wire bytes per frame at 8 fps. */\n phoneToDevice: { fragmentBytesOnWire: 200, payloadBytes: 180, frameIntervalMs: 125 },\n /**\n * What the device displays back: 150-byte fragments at 2.5 fps. Receiving\n * is SLOWER than sending — budget scan timeouts accordingly.\n */\n deviceToPhone: { fragmentBytesOnWire: 150, frameIntervalMs: 400 },\n} as const;\n\n/** The SDK facade. Cheap to construct; chain modules are created lazily. */\nexport class EraConnect {\n private readonly context: ChainContext;\n private _evm: EvmChain | undefined;\n private _btc: BtcChain | undefined;\n private _solana: SolanaChain | undefined;\n private _tron: TronChain | undefined;\n private _ton: TonChain | undefined;\n private _cardano: CardanoChain | undefined;\n private _sui: SuiChain | undefined;\n private _cosmos: CosmosChain | undefined;\n private _xrp: XrpChain | undefined;\n private _raw: RawModule | undefined;\n\n constructor(config?: EraConnectConfig) {\n this.context = resolveContext(config);\n }\n\n get evm(): EvmChain {\n this._evm ??= new EvmChain(this.context);\n return this._evm;\n }\n\n get btc(): BtcChain {\n this._btc ??= new BtcChain(this.context);\n return this._btc;\n }\n\n get solana(): SolanaChain {\n this._solana ??= new SolanaChain(this.context);\n return this._solana;\n }\n\n get tron(): TronChain {\n this._tron ??= new TronChain(this.context);\n return this._tron;\n }\n\n get ton(): TonChain {\n this._ton ??= new TonChain(this.context);\n return this._ton;\n }\n\n get cardano(): CardanoChain {\n this._cardano ??= new CardanoChain(this.context);\n return this._cardano;\n }\n\n get sui(): SuiChain {\n this._sui ??= new SuiChain(this.context);\n return this._sui;\n }\n\n get cosmos(): CosmosChain {\n this._cosmos ??= new CosmosChain(this.context);\n return this._cosmos;\n }\n\n get xrp(): XrpChain {\n this._xrp ??= new XrpChain(this.context);\n return this._xrp;\n }\n\n /** Escape hatch for UR types without a dedicated module. */\n get raw(): RawModule {\n this._raw ??= new RawModule(this.context);\n return this._raw;\n }\n\n /**\n * Linking: parse the device's `crypto-multi-accounts` export (a `Ur` from a\n * scanner, or a single-part `ur:` string).\n */\n parseAccounts(input: Ur | string): EraAccountsType {\n return EraAccounts.fromUr(input);\n }\n\n /**\n * Pull-model linking: ask the device for SPECIFIC derivations\n * (`qr-hardware-call` 1201). The device answers with a\n * `crypto-multi-accounts` export.\n */\n generateKeyDerivationCall(props: KeyDerivationCallProps): HardwareCallRequest {\n return generateKeyDerivationCall(this.context, props);\n }\n\n /** A type-agnostic hardened scanner (linking flows, raw flows). */\n scanner(options?: UrScannerOptions): UrScanner {\n return new UrScanner(options);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public types & modules\n// ---------------------------------------------------------------------------\n\nexport type { AccountChain, AccountKey, BtcPurpose, DeviceInfo } from './accounts/accounts';\nexport {\n BtcAccountView,\n CardanoAccountView,\n EraAccounts,\n EvmAccountView,\n SolanaAccountView,\n SuiAccountView,\n TonAccountView,\n TronAccountView,\n} from './accounts/accounts';\nexport type {\n BtcMessageSignatureResult,\n BtcMessageSignRequestProps,\n BtcPsbtResult,\n BtcPsbtSignRequestProps,\n} from './chains/btc';\nexport { BtcChain } from './chains/btc';\nexport type {\n CardanoCertKeyRef,\n CardanoSignatureResult,\n CardanoSignRequestProps,\n CardanoUtxoRef,\n CardanoWitness,\n} from './chains/cardano';\nexport { CardanoChain, parseWitnessSet } from './chains/cardano';\nexport { CosmosChain, CosmosDataType } from './chains/cosmos';\nexport type { EvmSignatureResult, EvmSignRequestProps } from './chains/evm';\nexport { EvmChain, EvmDataType } from './chains/evm';\nexport type {\n ChainContext,\n EraConnectConfig,\n ExpectedReply,\n SignRequest,\n} from './chains/shared';\nexport { DEFAULT_ORIGIN } from './chains/shared';\nexport type { SolSignatureResult, SolSignRequestProps } from './chains/solana';\nexport { SolanaChain, SolSignType } from './chains/solana';\nexport { SuiChain, suiIntentDigest } from './chains/sui';\nexport type { TonSignatureResult, TonSignRequestProps } from './chains/ton';\nexport { TonChain, TonDataType } from './chains/ton';\nexport type { TronLatestBlock, TronSignatureResult, TronSignRequestProps } from './chains/tron';\nexport { TronChain } from './chains/tron';\nexport { XrpChain } from './chains/xrp';\n// UTF-8 helpers that work on every Hermes version (TextEncoder does not):\nexport { utf8Decode, utf8Encode } from './core/bytes';\nexport type { EraErrorCode } from './core/errors';\nexport { EraSdkError } from './core/errors';\nexport type { RandomBytesFn } from './core/rand';\nexport type {\n DerivationAlgorithm,\n DerivationCurve,\n HardwareCallRequest,\n KeyDerivationCallProps,\n KeyDerivationSchema,\n} from './hardware-call/key-derivation';\nexport type { AnimatedUrOptions } from './qr/animated-ur';\nexport { AnimatedUr, DEFAULT_FRAGMENT_LENGTH } from './qr/animated-ur';\nexport { RawModule } from './raw';\nexport type { ScanFeedResult, ScanRejection, UrScannerOptions } from './scan/ur-scanner';\nexport { TypedUrScanner, UrScanner } from './scan/ur-scanner';\nexport { UrLimits } from './ur/limits';\nexport { Ur } from './ur/ur';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["parseUrString","EraSdkError","cborDecode","asMap","asUint","mapGet","asArray","asText","parsePathComponents","asBytes","EraSdkError","formatPath","xfpToHex","evmAddressFromPublicKey","derivePublicKey","btcP2wpkhAddressFromPublicKey","btcP2pkhAddressFromPublicKey","btcNestedSegwitAddressFromPublicKey","ZPUB_VERSION","tronAddressFromPublicKey","bchAddressFromPublicKey","cardanoSoftDerivePath","suiAddressFromPublicKey","solanaAddressFromPublicKey","serializeExtendedPublicKey","parsePath","pathEquals","EraSdkError","parsePath","keypath304","cbUint","cbText","cbTag","cbMap","cbArray","UrValue","cborEncode","AnimatedUr","TypedUrScanner","EraAccountsClass","UrValue","toUr","AnimatedUr","resolveContext","EvmChain","BtcChain","SolanaChain","TronChain","BchChain","TonChain","CardanoChain","SuiChain","CosmosChain","XrpChain","UrScanner"],"sources":["../src/registry/multi-accounts.ts","../src/accounts/accounts.ts","../src/hardware-call/key-derivation.ts","../src/raw.ts","../src/index.ts"],"sourcesContent":["import { cborDecode } from '../cbor/decode';\nimport type { CborValue } from '../cbor/model';\nimport { asArray, asBytes, asMap, asText, asUint, mapGet } from '../cbor/model';\nimport { EraSdkError } from '../core/errors';\nimport { parseUrString, type Ur } from '../ur/ur';\nimport type { PathLevel } from './keypath';\nimport { parsePathComponents } from './keypath';\n\n/**\n * Raw account entry parsed from a `crypto-multi-accounts` (1103) export.\n *\n * `xfp` is the entry's ORIGIN source fingerprint (`crypto-keypath` key 2) —\n * the value a `*-sign-request` keypath must carry. It is NOT the top-level\n * master fingerprint, although the two often coincide.\n */\nexport interface RawAccountEntry {\n readonly path: readonly PathLevel[];\n /**\n * The origin's source fingerprint, when the export carries one. Cardano\n * entries deliberately ship a path-only origin — resolve against the\n * wrapper's master fingerprint in that case.\n */\n readonly xfp: number | null;\n /**\n * Nullable and length-unconstrained, as in the reference implementation: an\n * entry without a usable key still resolves its xfp for signing — only the\n * address-derivation views require the 33/32-byte forms.\n */\n readonly publicKey: Uint8Array | null;\n readonly chainCode: Uint8Array | null;\n readonly parentFingerprint: number | null;\n readonly name: string | null;\n /** A label string (`account.standard`, ...) — NEVER chain metadata. */\n readonly note: string | null;\n}\n\nexport interface RawMultiAccounts {\n readonly masterFingerprint: number;\n readonly deviceName: string | null;\n readonly deviceId: string | null;\n readonly deviceVersion: string | null;\n readonly entries: readonly RawAccountEntry[];\n}\n\n/** UR types a device links a watch-only wallet with. */\nexport const WALLET_UR_TYPES: ReadonlySet<string> = new Set([\n 'crypto-multi-accounts',\n 'crypto-account',\n 'crypto-hdkey',\n]);\n\n/**\n * Parse a wallet-export UR.\n *\n * Of the three admitted link types only the `crypto-multi-accounts` shape\n * yields derivable accounts; an export that yields none is refused rather\n * than stored as an unusable wallet. Malformed entries are skipped\n * individually so one foreign item does not abort the rest.\n */\nexport function parseMultiAccountsUr(input: Ur | string): RawMultiAccounts {\n let type: string;\n let cbor: Uint8Array;\n if (typeof input === 'string') {\n const parsed = parseUrString(input);\n if (parsed.seq !== null) {\n throw new EraSdkError(\n 'invalid-props',\n 'multi-part UR string: assemble it with a UrScanner first',\n );\n }\n type = parsed.type;\n cbor = parsed.payload;\n } else {\n type = input.type;\n cbor = input.cbor;\n }\n\n if (!WALLET_UR_TYPES.has(type)) {\n // The type is attacker-sized (the UR grammar allows an unbounded letter\n // run) — truncate before it reaches a message or error data.\n const shown = type.length > 32 ? `${type.slice(0, 32)}…` : type;\n throw new EraSdkError(\n 'wrong-ur-type',\n `\"${shown}\" is not a wallet export; expected one of ${[...WALLET_UR_TYPES].join(', ')}`,\n { received: shown },\n );\n }\n\n let decoded: CborValue;\n try {\n decoded = cborDecode(cbor);\n } catch (e) {\n throw new EraSdkError('malformed-cbor', `cannot decode wallet UR: ${(e as Error).message}`);\n }\n const root = asMap(decoded);\n if (!root) {\n throw new EraSdkError('malformed-cbor', 'wallet UR is not a CBOR map');\n }\n\n // A standalone `crypto-hdkey` export (the single-account link some wallet\n // profiles use — e.g. the TON one: `{3: key, 6: keypath, 10: name}`) IS the\n // entry map itself: no master-fingerprint/list wrapper. The entry's origin\n // fingerprint doubles as the master fingerprint.\n if (type === 'crypto-hdkey') {\n const entry = tryParseEntry(decoded);\n if (!entry) {\n throw new EraSdkError(\n 'malformed-reply',\n 'crypto-hdkey export carries no derivable account (missing origin keypath)',\n );\n }\n return {\n masterFingerprint: entry.xfp ?? 0,\n deviceName: null,\n deviceId: null,\n deviceVersion: null,\n entries: [entry],\n };\n }\n\n const master = asUint(mapGet(root, 1));\n const list = asArray(mapGet(root, 2));\n if (master === undefined || !list) {\n throw new EraSdkError(\n 'malformed-reply',\n 'wallet UR missing master fingerprint (key 1) or accounts (key 2)',\n );\n }\n\n const entries: RawAccountEntry[] = [];\n for (const item of list) {\n const entry = tryParseEntry(item);\n if (entry) entries.push(entry);\n }\n if (entries.length === 0) {\n throw new EraSdkError(\n 'malformed-reply',\n 'wallet UR carries no account this SDK can derive an address from',\n );\n }\n\n return {\n masterFingerprint: Number(master & 0xffffffffn),\n deviceName: asText(mapGet(root, 3)) ?? null,\n deviceId: asText(mapGet(root, 4)) ?? null,\n deviceVersion: asText(mapGet(root, 5)) ?? null,\n entries,\n };\n}\n\nfunction tryParseEntry(item: CborValue): RawAccountEntry | null {\n const map = asMap(item);\n if (!map) return null;\n const origin = asMap(mapGet(map, 6));\n if (!origin) return null;\n\n const path = parsePathComponents(mapGet(origin, 1));\n if (!path || path.length === 0) return null;\n const xfpValue = asUint(mapGet(origin, 2));\n const xfp = xfpValue !== undefined && xfpValue <= 0xffffffffn ? Number(xfpValue) : null;\n\n const parentFp = asUint(mapGet(map, 8));\n return {\n path,\n xfp,\n publicKey: asBytes(mapGet(map, 3)) ?? null,\n chainCode: asBytes(mapGet(map, 4)) ?? null,\n parentFingerprint: parentFp !== undefined && parentFp <= 0xffffffffn ? Number(parentFp) : null,\n name: asText(mapGet(map, 9)) ?? null,\n note: asText(mapGet(map, 10)) ?? null,\n };\n}\n","import { EraSdkError } from '../core/errors';\nimport type { PathLevel } from '../registry/keypath';\nimport { formatPath, parsePath, pathEquals, xfpToHex } from '../registry/keypath';\nimport type { RawAccountEntry, RawMultiAccounts } from '../registry/multi-accounts';\nimport { parseMultiAccountsUr } from '../registry/multi-accounts';\nimport type { Ur } from '../ur/ur';\nimport {\n bchAddressFromPublicKey,\n btcNestedSegwitAddressFromPublicKey,\n btcP2pkhAddressFromPublicKey,\n btcP2wpkhAddressFromPublicKey,\n cardanoSoftDerivePath,\n derivePublicKey,\n evmAddressFromPublicKey,\n serializeExtendedPublicKey,\n solanaAddressFromPublicKey,\n suiAddressFromPublicKey,\n tronAddressFromPublicKey,\n ZPUB_VERSION,\n} from './derive';\n\n/** Chain family of an exported account, matched by its derivation path — never by the note label. */\nexport type AccountChain =\n | 'evm'\n | 'btc'\n | 'bch'\n | 'solana'\n | 'tron'\n | 'ton'\n | 'cardano'\n | 'sui'\n | 'cosmos'\n | 'unknown';\n\nexport interface AccountKey {\n readonly chain: AccountChain;\n /** Account-level derivation path, e.g. `m/44'/60'/0'`. */\n readonly path: string;\n /**\n * The source fingerprint a `*-sign-request` keypath must carry for this\n * account (lowercase 8-hex). NOT necessarily the master fingerprint.\n */\n readonly xfp: string;\n /** 33-byte compressed secp256k1, or 32-byte Ed25519 (Solana); absent when the export omitted it. */\n readonly publicKey: Uint8Array | undefined;\n readonly chainCode: Uint8Array | undefined;\n readonly name: string | undefined;\n /** Derivation-scheme label (`account.standard`, ...) — display only. */\n readonly note: string | undefined;\n}\n\nexport interface DeviceInfo {\n readonly name: string | undefined;\n readonly id: string | undefined;\n readonly firmwareVersion: string | undefined;\n}\n\nfunction classify(path: readonly PathLevel[]): AccountChain {\n const p0 = path[0];\n const p1 = path[1];\n if (!p0 || !p1 || !p0.hardened || !p1.hardened) return 'unknown';\n if (p0.index === 44 && p1.index === 60) return 'evm';\n if (\n p1.index === 0 &&\n (p0.index === 84 || p0.index === 49 || p0.index === 44 || p0.index === 86)\n ) {\n return 'btc';\n }\n if (p0.index === 44 && p1.index === 145) return 'bch';\n if (p0.index === 44 && p1.index === 501) return 'solana';\n if (p0.index === 44 && p1.index === 195) return 'tron';\n if (p0.index === 44 && p1.index === 607) return 'ton';\n if (p0.index === 1852 && p1.index === 1815) return 'cardano';\n if (p0.index === 44 && p1.index === 784) return 'sui';\n if (p0.index === 44 && p1.index === 118) return 'cosmos';\n return 'unknown';\n}\n\nfunction withChainCode(entry: RawAccountEntry): Uint8Array {\n if (!entry.chainCode) {\n throw new EraSdkError(\n 'account-not-found',\n `account ${formatPath([...entry.path])} carries no chain code; cannot derive children`,\n );\n }\n return entry.chainCode;\n}\n\n/** The entry's key at the required length, or a typed refusal (derivation only). */\nfunction requireKey(entry: RawAccountEntry, length: number): Uint8Array {\n if (!entry.publicKey || entry.publicKey.length !== length) {\n throw new EraSdkError(\n 'invalid-props',\n `account ${formatPath([...entry.path])} carries no ${length}-byte public key; ` +\n 'xfp lookup still works, address derivation does not',\n );\n }\n return entry.publicKey;\n}\n\n/** EVM view over the linked wallet: one account xpub, addresses derived at `0/index`. */\nexport class EvmAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n /** Signing path for address `index`: `<account>/0/<index>`. */\n pathFor(index: number): string {\n return `${this.accountPath}/0/${index}`;\n }\n\n deriveAddress(index: number): `0x${string}` {\n return evmAddressFromPublicKey(\n derivePublicKey(requireKey(this.entry, 33), withChainCode(this.entry), 0, index),\n );\n }\n\n xpub(): string {\n return extendedKeyOf(this.entry);\n }\n}\n\nexport type BtcPurpose = 44 | 49 | 84 | 86;\n\n/**\n * Bitcoin view over one exported account. The default is the BIP-84\n * native-segwit account; pass `purpose` to reach the other script types the\n * device exports (44 = legacy P2PKH — the kind the device signs MESSAGES for,\n * 49 = nested segwit, 86 = taproot).\n */\nexport class BtcAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly testnet: boolean,\n readonly purpose: BtcPurpose,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n receivePath(index: number): string {\n return `${this.accountPath}/0/${index}`;\n }\n\n changePath(index: number): string {\n return `${this.accountPath}/1/${index}`;\n }\n\n deriveAddress(index: number, options?: { change?: boolean }): string {\n const change = options?.change ? 1 : 0;\n const child = derivePublicKey(\n requireKey(this.entry, 33),\n withChainCode(this.entry),\n change,\n index,\n );\n switch (this.purpose) {\n case 84:\n return btcP2wpkhAddressFromPublicKey(child, this.testnet ? 'tb' : 'bc');\n case 44:\n return btcP2pkhAddressFromPublicKey(child, this.testnet);\n case 49:\n return btcNestedSegwitAddressFromPublicKey(child, this.testnet);\n case 86:\n throw new EraSdkError(\n 'invalid-props',\n 'taproot addresses need the BIP-341 output-key tweak; derive them from xpub() with your Bitcoin library',\n );\n }\n }\n\n xpub(): string {\n return extendedKeyOf(this.entry);\n }\n\n /** SLIP-132 zpub form of the BIP-84 key, for tools that require it. */\n zpub(): string {\n if (this.purpose !== 84) {\n throw new EraSdkError(\n 'invalid-props',\n 'zpub is the SLIP-132 form of the BIP-84 account only',\n );\n }\n return extendedKeyOf(this.entry, ZPUB_VERSION);\n }\n}\n\n/** Tron view: addresses derived at `0/index`. */\nexport class TronAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n pathFor(index: number): string {\n return `${this.accountPath}/0/${index}`;\n }\n\n deriveAddress(index: number): string {\n return tronAddressFromPublicKey(\n derivePublicKey(requireKey(this.entry, 33), withChainCode(this.entry), 0, index),\n );\n }\n}\n\n/** Bitcoin Cash view: `m/44'/145'/0'`, CashAddr P2PKH addresses. */\nexport class BchAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n receivePath(index: number): string {\n return `${this.accountPath}/0/${index}`;\n }\n\n changePath(index: number): string {\n return `${this.accountPath}/1/${index}`;\n }\n\n /** The compressed public key at receive/change `index` — what a sign request's input names. */\n derivePublicKey(index: number, options?: { change?: boolean }): Uint8Array {\n return derivePublicKey(\n requireKey(this.entry, 33),\n withChainCode(this.entry),\n options?.change ? 1 : 0,\n index,\n );\n }\n\n /** Bare CashAddr by default; `{ withPrefix: true }` for `bitcoincash:...`. */\n deriveAddress(index: number, options?: { change?: boolean; withPrefix?: boolean }): string {\n return bchAddressFromPublicKey(this.derivePublicKey(index, options), {\n withPrefix: options?.withPrefix ?? false,\n });\n }\n}\n\n/**\n * TON view: one Ed25519 key per account (`m/44'/607'/0'`), shared by the\n * V4R2 and V5R1 wallet contracts — the contract version affects only the\n * ADDRESS, which this SDK leaves to TON tooling (derive it from `publicKey`\n * with @ton/core or equivalent).\n */\nexport class TonAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n /** 32-byte Ed25519 public key — the signer for both wallet-contract versions. */\n get publicKey(): Uint8Array {\n return requireKey(this.entry, 32);\n }\n\n get name(): string | undefined {\n return this.entry.name ?? this.entry.note ?? undefined;\n }\n}\n\n/**\n * Cardano view (CIP-1852): the exported account key supports SOFT public\n * derivation (BIP32-Ed25519), so payment (`0/i`), change (`1/i`) and stake\n * (`2/0`) verification keys derive locally. Bech32 ADDRESS assembly is left\n * to Cardano tooling — `deriveKey` hands you the raw vkeys it needs.\n */\nexport class CardanoAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get accountPath(): string {\n return formatPath([...this.entry.path]);\n }\n\n /** The account-level extended public key material. */\n get publicKey(): Uint8Array {\n return requireKey(this.entry, 32);\n }\n\n get chainCode(): Uint8Array {\n return withChainCode(this.entry);\n }\n\n /** Signing path for `role/index`, e.g. `pathFor(0, 0)` → `.../0/0`. */\n pathFor(role: number, index: number): string {\n return `${this.accountPath}/${role}/${index}`;\n }\n\n /** Soft-derived 32-byte verification key at `role/index` (0 payment, 1 change, 2 stake). */\n deriveKey(role: number, index: number): Uint8Array {\n return cardanoSoftDerivePath(requireKey(this.entry, 32), withChainCode(this.entry), [\n role,\n index,\n ]);\n }\n}\n\n/** Sui view: like Solana, each fully-hardened exported entry IS a signer. */\nexport class SuiAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get path(): string {\n return formatPath([...this.entry.path]);\n }\n\n get publicKey(): Uint8Array {\n return requireKey(this.entry, 32);\n }\n\n /** `0x` Sui address: BLAKE2b-256 of `0x00 || publicKey`. */\n get address(): string {\n return suiAddressFromPublicKey(requireKey(this.entry, 32));\n }\n}\n\n/**\n * Solana view: Ed25519 has no public child derivation, so the device\n * pre-derives hardened accounts (`m/44'/501'/idx'`) and each entry IS a\n * signer. The public key, base58, IS the address.\n */\nexport class SolanaAccountView {\n constructor(\n private readonly entry: RawAccountEntry,\n private readonly resolvedXfp: number,\n ) {}\n\n get xfp(): string {\n return xfpToHex(this.resolvedXfp);\n }\n\n get path(): string {\n return formatPath([...this.entry.path]);\n }\n\n /** The hardened account index (third path level). */\n get index(): number {\n return this.entry.path[2]?.index ?? 0;\n }\n\n get publicKey(): Uint8Array {\n return requireKey(this.entry, 32);\n }\n\n get address(): string {\n return solanaAddressFromPublicKey(requireKey(this.entry, 32));\n }\n}\n\nfunction extendedKeyOf(entry: RawAccountEntry, version?: number): string {\n const chainCode = withChainCode(entry);\n const publicKey = requireKey(entry, 33);\n const last = entry.path[entry.path.length - 1]!;\n const args = {\n depth: entry.path.length,\n parentFingerprint: entry.parentFingerprint ?? 0,\n childNumber: last.hardened ? last.index + 0x80000000 : last.index,\n chainCode,\n publicKey,\n };\n return version === undefined\n ? serializeExtendedPublicKey(args)\n : serializeExtendedPublicKey({ ...args, version });\n}\n\n/**\n * The linked wallet: everything a software wallet extracts from the device's\n * `crypto-multi-accounts` QR. Parse once, store the source UR string, derive\n * addresses locally — the device is not needed again until signing.\n */\nexport class EraAccounts {\n private constructor(\n private readonly raw: RawMultiAccounts,\n readonly sourceUr: string | undefined,\n ) {}\n\n static fromUr(input: Ur | string): EraAccounts {\n const raw = parseMultiAccountsUr(input);\n return new EraAccounts(raw, typeof input === 'string' ? input : input.toString());\n }\n\n /** Master fingerprint, lowercase 8-hex. */\n get masterFingerprint(): string {\n return xfpToHex(this.raw.masterFingerprint);\n }\n\n get device(): DeviceInfo {\n return {\n name: this.raw.deviceName ?? undefined,\n id: this.raw.deviceId ?? undefined,\n firmwareVersion: this.raw.deviceVersion ?? undefined,\n };\n }\n\n get keys(): AccountKey[] {\n return this.raw.entries.map((entry) => ({\n chain: classify(entry.path),\n path: formatPath([...entry.path]),\n xfp: xfpToHex(entry.xfp ?? this.raw.masterFingerprint),\n publicKey: entry.publicKey ?? undefined,\n chainCode: entry.chainCode ?? undefined,\n name: entry.name ?? undefined,\n note: entry.note ?? undefined,\n }));\n }\n\n /**\n * The xfp a sign request must carry for the account whose path exactly\n * equals `accountPath`. Throws `account-not-found` — never a silent zero.\n */\n xfpFor(accountPath: string): string {\n return xfpToHex(this.resolveXfp(this.entryFor(accountPath)));\n }\n\n /** Entry xfp, falling back to the wrapper's master fingerprint (Cardano-style path-only origins). */\n private resolveXfp(entry: RawAccountEntry): number {\n return entry.xfp ?? this.raw.masterFingerprint;\n }\n\n /** The EVM account (standard `m/44'/60'/...` scheme), if the export carries one. */\n evm(): EvmAccountView | undefined {\n const entry =\n this.raw.entries.find(\n (e) => classify(e.path) === 'evm' && (e.note === null || e.note === 'account.standard'),\n ) ?? this.raw.entries.find((e) => classify(e.path) === 'evm');\n return entry ? new EvmAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /**\n * A Bitcoin account view. Defaults to the BIP-84 native-segwit account;\n * pass `purpose: 44` for the legacy P2PKH account (message signing), 49 for\n * nested segwit, 86 for taproot — if the export carries them.\n */\n btc(options?: { testnet?: boolean; purpose?: BtcPurpose }): BtcAccountView | undefined {\n const purpose = options?.purpose ?? 84;\n const entry = this.raw.entries.find(\n (e) => classify(e.path) === 'btc' && e.path[0]?.index === purpose,\n );\n return entry\n ? new BtcAccountView(entry, options?.testnet ?? false, purpose, this.resolveXfp(entry))\n : undefined;\n }\n\n tron(): TronAccountView | undefined {\n const entry = this.raw.entries.find((e) => classify(e.path) === 'tron');\n return entry ? new TronAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /** The Bitcoin Cash account (`m/44'/145'/0'`), if the export carries one. */\n bch(): BchAccountView | undefined {\n const entry = this.raw.entries.find((e) => classify(e.path) === 'bch');\n return entry ? new BchAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /** The TON account (linked via the Tonkeeper-style `crypto-hdkey` export). */\n ton(): TonAccountView | undefined {\n const entry = this.raw.entries.find(\n (e) => classify(e.path) === 'ton' && e.publicKey?.length === 32,\n );\n return entry ? new TonAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /** All exported Sui signers (fully hardened SLIP-10 entries). */\n sui(): SuiAccountView[] {\n return this.raw.entries\n .filter((e) => classify(e.path) === 'sui' && e.publicKey?.length === 32)\n .map((e) => new SuiAccountView(e, this.resolveXfp(e)));\n }\n\n /** The Cardano account (CIP-1852 Icarus export), if the export carries one. */\n cardano(): CardanoAccountView | undefined {\n const entry = this.raw.entries.find(\n (e) => classify(e.path) === 'cardano' && e.publicKey?.length === 32,\n );\n return entry ? new CardanoAccountView(entry, this.resolveXfp(entry)) : undefined;\n }\n\n /** All pre-derived Solana signers (usually `m/44'/501'/0'..9'`). */\n solana(): SolanaAccountView[] {\n return this.raw.entries\n .filter((e) => classify(e.path) === 'solana' && e.publicKey?.length === 32)\n .map((e) => new SolanaAccountView(e, this.resolveXfp(e)));\n }\n\n private entryFor(accountPath: string): RawAccountEntry {\n const levels = parsePath(accountPath);\n const entry = this.raw.entries.find((e) => pathEquals(e.path, levels));\n if (!entry) {\n throw new EraSdkError(\n 'account-not-found',\n `the linked wallet carries no account at ${accountPath}`,\n { path: accountPath },\n );\n }\n return entry;\n }\n}\n","import type { EraAccounts } from '../accounts/accounts';\nimport { EraAccounts as EraAccountsClass } from '../accounts/accounts';\nimport { cborEncode } from '../cbor/encode';\nimport type { CborValue } from '../cbor/model';\nimport { cbArray, cbMap, cbTag, cbText, cbUint } from '../cbor/model';\nimport type { ChainContext } from '../chains/shared';\nimport { EraSdkError } from '../core/errors';\nimport type { AnimatedUrOptions } from '../qr/animated-ur';\nimport { AnimatedUr } from '../qr/animated-ur';\nimport { keypath304, parsePath } from '../registry/keypath';\nimport { WALLET_UR_TYPES } from '../registry/multi-accounts';\nimport { TypedUrScanner } from '../scan/ur-scanner';\nimport type { Ur } from '../ur/ur';\nimport { Ur as UrValue } from '../ur/ur';\n\nexport type DerivationCurve = 'secp256k1' | 'ed25519';\nexport type DerivationAlgorithm = 'slip10' | 'bip32ed25519';\n\nexport interface KeyDerivationSchema {\n /** The derivation path to request, e.g. `m/44'/60'/0'`. */\n readonly path: string;\n /** Defaults to `secp256k1`. */\n readonly curve?: DerivationCurve;\n /** Defaults to `slip10`. */\n readonly algo?: DerivationAlgorithm;\n /** Optional chain hint shown by the device. */\n readonly chainType?: string;\n}\n\nexport interface KeyDerivationCallProps {\n readonly schemas: readonly KeyDerivationSchema[];\n readonly origin?: string;\n}\n\n/** The pull-model linking request: display it, then scan the device's account export back. */\nexport interface HardwareCallRequest {\n readonly ur: Ur;\n readonly replyTypes: readonly string[];\n toAnimated(options?: AnimatedUrOptions): AnimatedUr;\n scanner(): TypedUrScanner<EraAccounts>;\n}\n\nconst CURVES: Record<DerivationCurve, number> = { secp256k1: 0, ed25519: 1 };\nconst ALGOS: Record<DerivationAlgorithm, number> = { slip10: 0, bip32ed25519: 1 };\n\n/**\n * Build a `qr-hardware-call` (1201) wrapping a `key-derivation-call` (1301):\n * the WALLET asks the device for specific derivation paths, curves and\n * algorithms instead of accepting whatever the device's sync screen\n * volunteers. The device answers with a `crypto-multi-accounts` export, which\n * closes the loop through `parseAccounts`.\n *\n * Registry shape (Keystone-standard):\n * `1201({1: type=0, 2: 1301({1: [1302({1: 304(keypath), 2: curve, 3: algo, 4?: chainType})...]}), 3?: origin})`.\n */\nexport function generateKeyDerivationCall(\n context: ChainContext,\n props: KeyDerivationCallProps,\n): HardwareCallRequest {\n if (props.schemas.length === 0) {\n throw new EraSdkError('invalid-props', 'at least one derivation schema is required');\n }\n const schemas: CborValue[] = props.schemas.map((schema) => {\n const levels = parsePath(schema.path);\n const entries: [number, CborValue][] = [\n [1, keypath304(levels)],\n [2, cbUint(CURVES[schema.curve ?? 'secp256k1'])],\n [3, cbUint(ALGOS[schema.algo ?? 'slip10'])],\n ];\n if (schema.chainType !== undefined) entries.push([4, cbText(schema.chainType)]);\n return cbTag(1302, cbMap(entries));\n });\n\n const call = cbTag(1301, cbMap([[1, cbArray(schemas)]]));\n const root = cbMap([\n [1, cbUint(0)], // type: KeyDerivation\n [2, call],\n [3, cbText(props.origin ?? context.origin)],\n ]);\n\n const ur = new UrValue('qr-hardware-call', cborEncode(root));\n const replyTypes = [...WALLET_UR_TYPES];\n return {\n ur,\n replyTypes,\n toAnimated: (options?: AnimatedUrOptions) =>\n new AnimatedUr(ur, {\n maxFragmentLength: options?.maxFragmentLength ?? context.maxFragmentLength,\n }),\n scanner: () =>\n new TypedUrScanner<EraAccounts>({ expectedTypes: replyTypes }, (reply) =>\n EraAccountsClass.fromUr(reply),\n ),\n };\n}\n","import type { ChainContext } from './chains/shared';\nimport { toUr } from './chains/shared';\nimport type { AnimatedUrOptions } from './qr/animated-ur';\nimport { AnimatedUr } from './qr/animated-ur';\nimport type { Ur } from './ur/ur';\nimport { Ur as UrValue } from './ur/ur';\n\n/**\n * Escape hatch for UR types this SDK has no dedicated module for (future\n * chains, custom registry items). You bring the CBOR; the SDK brings the UR\n * plumbing, fountain frames and the hardened scanner\n * (`EraConnect.scanner({expectedTypes})`).\n */\nexport class RawModule {\n constructor(private readonly context: ChainContext) {}\n\n /** Wrap raw CBOR bytes in a UR of the given registry type. */\n ur(type: string, cbor: Uint8Array): Ur {\n return new UrValue(type, cbor);\n }\n\n /** Parse a single-part `ur:` string into a Ur. */\n parse(text: string): Ur {\n return toUr(text);\n }\n\n /** Fragment + animate any UR. */\n animate(ur: Ur, options?: AnimatedUrOptions): AnimatedUr {\n return new AnimatedUr(ur, {\n maxFragmentLength: options?.maxFragmentLength ?? this.context.maxFragmentLength,\n });\n }\n}\n","/**\n * ERA Connect SDK — air-gapped UR/QR linking and signing for the ERA\n * hardware wallet.\n *\n * Headless by design: you render the QR codes and own the camera; the SDK\n * owns every byte of the protocol. No network I/O, no Node built-ins,\n * `Uint8Array` end-to-end.\n */\n\nimport type { EraAccounts as EraAccountsType } from './accounts/accounts';\nimport { EraAccounts } from './accounts/accounts';\nimport { BtcChain } from './chains/btc';\nimport { CardanoChain } from './chains/cardano';\n\nexport type {\n CosmosSignatureResult,\n CosmosSignRequestProps,\n EthermintSignRequestProps,\n} from './chains/cosmos';\nexport type {\n SuiSignatureResult,\n SuiSignHashRequestProps,\n SuiSignRequestProps,\n} from './chains/sui';\nexport type { XrpSignatureResult, XrpSignRequestProps } from './chains/xrp';\n\nimport { BchChain } from './chains/bch';\nimport { CosmosChain } from './chains/cosmos';\nimport { EvmChain } from './chains/evm';\nimport type { ChainContext, EraConnectConfig } from './chains/shared';\nimport { resolveContext } from './chains/shared';\nimport { SolanaChain } from './chains/solana';\nimport { SuiChain } from './chains/sui';\nimport { TonChain } from './chains/ton';\nimport { TronChain } from './chains/tron';\nimport { XrpChain } from './chains/xrp';\nimport type { HardwareCallRequest, KeyDerivationCallProps } from './hardware-call/key-derivation';\nimport { generateKeyDerivationCall } from './hardware-call/key-derivation';\nimport { RawModule } from './raw';\nimport type { UrScannerOptions } from './scan/ur-scanner';\nimport { UrScanner } from './scan/ur-scanner';\nimport type { Ur } from './ur/ur';\n\n/** Timing/size constants of the device's own QR pipeline, for progress UI and timeouts. */\nexport const DeviceProfile = {\n /** What the phone displays to the device: ~200 wire bytes per frame at 8 fps. */\n phoneToDevice: { fragmentBytesOnWire: 200, payloadBytes: 180, frameIntervalMs: 125 },\n /**\n * What the device displays back: 150-byte fragments at 2.5 fps. Receiving\n * is SLOWER than sending — budget scan timeouts accordingly.\n */\n deviceToPhone: { fragmentBytesOnWire: 150, frameIntervalMs: 400 },\n} as const;\n\n/** The SDK facade. Cheap to construct; chain modules are created lazily. */\nexport class EraConnect {\n private readonly context: ChainContext;\n private _evm: EvmChain | undefined;\n private _btc: BtcChain | undefined;\n private _solana: SolanaChain | undefined;\n private _tron: TronChain | undefined;\n private _bch: BchChain | undefined;\n private _ton: TonChain | undefined;\n private _cardano: CardanoChain | undefined;\n private _sui: SuiChain | undefined;\n private _cosmos: CosmosChain | undefined;\n private _xrp: XrpChain | undefined;\n private _raw: RawModule | undefined;\n\n constructor(config?: EraConnectConfig) {\n this.context = resolveContext(config);\n }\n\n get evm(): EvmChain {\n this._evm ??= new EvmChain(this.context);\n return this._evm;\n }\n\n get btc(): BtcChain {\n this._btc ??= new BtcChain(this.context);\n return this._btc;\n }\n\n get solana(): SolanaChain {\n this._solana ??= new SolanaChain(this.context);\n return this._solana;\n }\n\n get tron(): TronChain {\n this._tron ??= new TronChain(this.context);\n return this._tron;\n }\n\n /** Bitcoin Cash — the structured keystone envelope (see `@hwlt/era-connect/bch`). */\n get bch(): BchChain {\n this._bch ??= new BchChain(this.context);\n return this._bch;\n }\n\n get ton(): TonChain {\n this._ton ??= new TonChain(this.context);\n return this._ton;\n }\n\n get cardano(): CardanoChain {\n this._cardano ??= new CardanoChain(this.context);\n return this._cardano;\n }\n\n get sui(): SuiChain {\n this._sui ??= new SuiChain(this.context);\n return this._sui;\n }\n\n get cosmos(): CosmosChain {\n this._cosmos ??= new CosmosChain(this.context);\n return this._cosmos;\n }\n\n get xrp(): XrpChain {\n this._xrp ??= new XrpChain(this.context);\n return this._xrp;\n }\n\n /** Escape hatch for UR types without a dedicated module. */\n get raw(): RawModule {\n this._raw ??= new RawModule(this.context);\n return this._raw;\n }\n\n /**\n * Linking: parse the device's `crypto-multi-accounts` export (a `Ur` from a\n * scanner, or a single-part `ur:` string).\n */\n parseAccounts(input: Ur | string): EraAccountsType {\n return EraAccounts.fromUr(input);\n }\n\n /**\n * Pull-model linking: ask the device for SPECIFIC derivations\n * (`qr-hardware-call` 1201). The device answers with a\n * `crypto-multi-accounts` export.\n */\n generateKeyDerivationCall(props: KeyDerivationCallProps): HardwareCallRequest {\n return generateKeyDerivationCall(this.context, props);\n }\n\n /** A type-agnostic hardened scanner (linking flows, raw flows). */\n scanner(options?: UrScannerOptions): UrScanner {\n return new UrScanner(options);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public types & modules\n// ---------------------------------------------------------------------------\n\nexport type { AccountChain, AccountKey, BtcPurpose, DeviceInfo } from './accounts/accounts';\nexport {\n BchAccountView,\n BtcAccountView,\n CardanoAccountView,\n EraAccounts,\n EvmAccountView,\n SolanaAccountView,\n SuiAccountView,\n TonAccountView,\n TronAccountView,\n} from './accounts/accounts';\nexport type {\n BchSignatureResult,\n BchSignRequestProps,\n BchTxInput,\n BchTxOutput,\n} from './chains/bch';\nexport { BchChain } from './chains/bch';\nexport type {\n BtcMessageSignatureResult,\n BtcMessageSignRequestProps,\n BtcPsbtResult,\n BtcPsbtSignRequestProps,\n} from './chains/btc';\nexport { BtcChain } from './chains/btc';\nexport type {\n CardanoCertKeyRef,\n CardanoSignatureResult,\n CardanoSignRequestProps,\n CardanoUtxoRef,\n CardanoWitness,\n} from './chains/cardano';\nexport { CardanoChain, parseWitnessSet } from './chains/cardano';\nexport { CosmosChain, CosmosDataType } from './chains/cosmos';\nexport type { EvmSignatureResult, EvmSignRequestProps } from './chains/evm';\nexport { EvmChain, EvmDataType } from './chains/evm';\nexport type {\n ChainContext,\n EraConnectConfig,\n ExpectedReply,\n SignRequest,\n} from './chains/shared';\nexport { DEFAULT_ORIGIN } from './chains/shared';\nexport type { SolSignatureResult, SolSignRequestProps } from './chains/solana';\nexport { SolanaChain, SolSignType } from './chains/solana';\nexport { SuiChain, suiIntentDigest } from './chains/sui';\nexport type { TonSignatureResult, TonSignRequestProps } from './chains/ton';\nexport { TonChain, TonDataType } from './chains/ton';\nexport type { TronLatestBlock, TronSignatureResult, TronSignRequestProps } from './chains/tron';\nexport { TronChain } from './chains/tron';\nexport { XrpChain } from './chains/xrp';\n// UTF-8 helpers that work on every Hermes version (TextEncoder does not):\nexport { utf8Decode, utf8Encode } from './core/bytes';\nexport type { EraErrorCode } from './core/errors';\nexport { EraSdkError } from './core/errors';\nexport type { RandomBytesFn } from './core/rand';\nexport type {\n DerivationAlgorithm,\n DerivationCurve,\n HardwareCallRequest,\n KeyDerivationCallProps,\n KeyDerivationSchema,\n} from './hardware-call/key-derivation';\nexport type { AnimatedUrOptions } from './qr/animated-ur';\nexport { AnimatedUr, DEFAULT_FRAGMENT_LENGTH } from './qr/animated-ur';\nexport { RawModule } from './raw';\nexport type { ScanFeedResult, ScanRejection, UrScannerOptions } from './scan/ur-scanner';\nexport { TypedUrScanner, UrScanner } from './scan/ur-scanner';\nexport { UrLimits } from './ur/limits';\nexport { Ur } from './ur/ur';\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { _ as Ur, a as SignRequest, c as TypedUrScanner, d as EraErrorCode, f as EraSdkError, g as RandomBytesFn, h as DEFAULT_FRAGMENT_LENGTH, i as ExpectedReply, l as UrScanner, m as AnimatedUrOptions, n as DEFAULT_ORIGIN, o as ScanFeedResult, p as AnimatedUr, r as EraConnectConfig, s as ScanRejection, t as ChainContext, u as UrScannerOptions } from "./shared-CI8zhQiE.cjs";
|
|
2
|
-
import { a as
|
|
2
|
+
import { a as BchTxOutput, i as BchTxInput, n as BchSignRequestProps, r as BchSignatureResult, t as BchChain } from "./bch-DHsIVJqK.cjs";
|
|
3
|
+
import { a as BtcPsbtSignRequestProps, i as BtcPsbtResult, n as BtcMessageSignRequestProps, r as BtcMessageSignatureResult, t as BtcChain } from "./btc-wogJ4INA.cjs";
|
|
3
4
|
import { a as CardanoUtxoRef, i as CardanoSignatureResult, n as CardanoChain, o as CardanoWitness, r as CardanoSignRequestProps, s as parseWitnessSet, t as CardanoCertKeyRef } from "./cardano-Do1ahUlK.cjs";
|
|
4
5
|
import { a as EthermintSignRequestProps, i as CosmosSignatureResult, n as CosmosDataType, r as CosmosSignRequestProps, t as CosmosChain } from "./cosmos-BYrhIqRk.cjs";
|
|
5
6
|
import { i as EvmSignatureResult, n as EvmDataType, r as EvmSignRequestProps, t as EvmChain } from "./evm-DJxGGAbD.cjs";
|
|
@@ -47,7 +48,7 @@ interface RawAccountEntry {
|
|
|
47
48
|
//#endregion
|
|
48
49
|
//#region src/accounts/accounts.d.ts
|
|
49
50
|
/** Chain family of an exported account, matched by its derivation path — never by the note label. */
|
|
50
|
-
type AccountChain = 'evm' | 'btc' | 'solana' | 'tron' | 'ton' | 'cardano' | 'sui' | 'cosmos' | 'unknown';
|
|
51
|
+
type AccountChain = 'evm' | 'btc' | 'bch' | 'solana' | 'tron' | 'ton' | 'cardano' | 'sui' | 'cosmos' | 'unknown';
|
|
51
52
|
interface AccountKey {
|
|
52
53
|
readonly chain: AccountChain;
|
|
53
54
|
/** Account-level derivation path, e.g. `m/44'/60'/0'`. */
|
|
@@ -115,6 +116,25 @@ declare class TronAccountView {
|
|
|
115
116
|
pathFor(index: number): string;
|
|
116
117
|
deriveAddress(index: number): string;
|
|
117
118
|
}
|
|
119
|
+
/** Bitcoin Cash view: `m/44'/145'/0'`, CashAddr P2PKH addresses. */
|
|
120
|
+
declare class BchAccountView {
|
|
121
|
+
private readonly entry;
|
|
122
|
+
private readonly resolvedXfp;
|
|
123
|
+
constructor(entry: RawAccountEntry, resolvedXfp: number);
|
|
124
|
+
get xfp(): string;
|
|
125
|
+
get accountPath(): string;
|
|
126
|
+
receivePath(index: number): string;
|
|
127
|
+
changePath(index: number): string;
|
|
128
|
+
/** The compressed public key at receive/change `index` — what a sign request's input names. */
|
|
129
|
+
derivePublicKey(index: number, options?: {
|
|
130
|
+
change?: boolean;
|
|
131
|
+
}): Uint8Array;
|
|
132
|
+
/** Bare CashAddr by default; `{ withPrefix: true }` for `bitcoincash:...`. */
|
|
133
|
+
deriveAddress(index: number, options?: {
|
|
134
|
+
change?: boolean;
|
|
135
|
+
withPrefix?: boolean;
|
|
136
|
+
}): string;
|
|
137
|
+
}
|
|
118
138
|
/**
|
|
119
139
|
* TON view: one Ed25519 key per account (`m/44'/607'/0'`), shared by the
|
|
120
140
|
* V4R2 and V5R1 wallet contracts — the contract version affects only the
|
|
@@ -211,6 +231,8 @@ declare class EraAccounts {
|
|
|
211
231
|
purpose?: BtcPurpose;
|
|
212
232
|
}): BtcAccountView | undefined;
|
|
213
233
|
tron(): TronAccountView | undefined;
|
|
234
|
+
/** The Bitcoin Cash account (`m/44'/145'/0'`), if the export carries one. */
|
|
235
|
+
bch(): BchAccountView | undefined;
|
|
214
236
|
/** The TON account (linked via the Tonkeeper-style `crypto-hdkey` export). */
|
|
215
237
|
ton(): TonAccountView | undefined;
|
|
216
238
|
/** All exported Sui signers (fully hardened SLIP-10 entries). */
|
|
@@ -327,6 +349,7 @@ declare class EraConnect {
|
|
|
327
349
|
private _btc;
|
|
328
350
|
private _solana;
|
|
329
351
|
private _tron;
|
|
352
|
+
private _bch;
|
|
330
353
|
private _ton;
|
|
331
354
|
private _cardano;
|
|
332
355
|
private _sui;
|
|
@@ -338,6 +361,8 @@ declare class EraConnect {
|
|
|
338
361
|
get btc(): BtcChain;
|
|
339
362
|
get solana(): SolanaChain;
|
|
340
363
|
get tron(): TronChain;
|
|
364
|
+
/** Bitcoin Cash — the structured keystone envelope (see `@hwlt/era-connect/bch`). */
|
|
365
|
+
get bch(): BchChain;
|
|
341
366
|
get ton(): TonChain;
|
|
342
367
|
get cardano(): CardanoChain;
|
|
343
368
|
get sui(): SuiChain;
|
|
@@ -360,5 +385,5 @@ declare class EraConnect {
|
|
|
360
385
|
scanner(options?: UrScannerOptions): UrScanner;
|
|
361
386
|
}
|
|
362
387
|
//#endregion
|
|
363
|
-
export { type AccountChain, type AccountKey, AnimatedUr, type AnimatedUrOptions, BtcAccountView, BtcChain, type BtcMessageSignRequestProps, type BtcMessageSignatureResult, type BtcPsbtResult, type BtcPsbtSignRequestProps, type BtcPurpose, CardanoAccountView, type CardanoCertKeyRef, CardanoChain, type CardanoSignRequestProps, type CardanoSignatureResult, type CardanoUtxoRef, type CardanoWitness, type ChainContext, CosmosChain, CosmosDataType, type CosmosSignRequestProps, type CosmosSignatureResult, DEFAULT_FRAGMENT_LENGTH, DEFAULT_ORIGIN, type DerivationAlgorithm, type DerivationCurve, type DeviceInfo, DeviceProfile, EraAccounts, EraConnect, type EraConnectConfig, type EraErrorCode, EraSdkError, type EthermintSignRequestProps, EvmAccountView, EvmChain, EvmDataType, type EvmSignRequestProps, type EvmSignatureResult, type ExpectedReply, type HardwareCallRequest, type KeyDerivationCallProps, type KeyDerivationSchema, type RandomBytesFn, RawModule, type ScanFeedResult, type ScanRejection, type SignRequest, type SolSignRequestProps, SolSignType, type SolSignatureResult, SolanaAccountView, SolanaChain, SuiAccountView, SuiChain, type SuiSignHashRequestProps, type SuiSignRequestProps, type SuiSignatureResult, TonAccountView, TonChain, TonDataType, type TonSignRequestProps, type TonSignatureResult, TronAccountView, TronChain, type TronLatestBlock, type TronSignRequestProps, type TronSignatureResult, TypedUrScanner, Ur, UrLimits, UrScanner, type UrScannerOptions, XrpChain, type XrpSignRequestProps, type XrpSignatureResult, parseWitnessSet, suiIntentDigest, utf8Decode, utf8Encode };
|
|
388
|
+
export { type AccountChain, type AccountKey, AnimatedUr, type AnimatedUrOptions, BchAccountView, BchChain, type BchSignRequestProps, type BchSignatureResult, type BchTxInput, type BchTxOutput, BtcAccountView, BtcChain, type BtcMessageSignRequestProps, type BtcMessageSignatureResult, type BtcPsbtResult, type BtcPsbtSignRequestProps, type BtcPurpose, CardanoAccountView, type CardanoCertKeyRef, CardanoChain, type CardanoSignRequestProps, type CardanoSignatureResult, type CardanoUtxoRef, type CardanoWitness, type ChainContext, CosmosChain, CosmosDataType, type CosmosSignRequestProps, type CosmosSignatureResult, DEFAULT_FRAGMENT_LENGTH, DEFAULT_ORIGIN, type DerivationAlgorithm, type DerivationCurve, type DeviceInfo, DeviceProfile, EraAccounts, EraConnect, type EraConnectConfig, type EraErrorCode, EraSdkError, type EthermintSignRequestProps, EvmAccountView, EvmChain, EvmDataType, type EvmSignRequestProps, type EvmSignatureResult, type ExpectedReply, type HardwareCallRequest, type KeyDerivationCallProps, type KeyDerivationSchema, type RandomBytesFn, RawModule, type ScanFeedResult, type ScanRejection, type SignRequest, type SolSignRequestProps, SolSignType, type SolSignatureResult, SolanaAccountView, SolanaChain, SuiAccountView, SuiChain, type SuiSignHashRequestProps, type SuiSignRequestProps, type SuiSignatureResult, TonAccountView, TonChain, TonDataType, type TonSignRequestProps, type TonSignatureResult, TronAccountView, TronChain, type TronLatestBlock, type TronSignRequestProps, type TronSignatureResult, TypedUrScanner, Ur, UrLimits, UrScanner, type UrScannerOptions, XrpChain, type XrpSignRequestProps, type XrpSignatureResult, parseWitnessSet, suiIntentDigest, utf8Decode, utf8Encode };
|
|
364
389
|
//# sourceMappingURL=index.d.cts.map
|