@hwlt/era-connect 0.3.0 → 0.4.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.
Files changed (109) hide show
  1. package/README.md +5 -5
  2. package/cosmos/package.json +6 -0
  3. package/dist/{btc-DfQ0q79G.d.ts → btc-B8LfSEkv.d.ts} +11 -2
  4. package/dist/{btc-VyJKXq7d.js → btc-B_Nq2H4T.js} +16 -7
  5. package/dist/btc-B_Nq2H4T.js.map +1 -0
  6. package/dist/{btc-Fr6Jz4Fi.cjs → btc-ByzjzUKs.cjs} +19 -10
  7. package/dist/btc-ByzjzUKs.cjs.map +1 -0
  8. package/dist/{btc-Dn6_Y12c.d.cts → btc-C4dVkxHb.d.cts} +11 -2
  9. package/dist/btc.cjs +2 -2
  10. package/dist/btc.d.cts +1 -1
  11. package/dist/btc.d.ts +1 -1
  12. package/dist/btc.js +2 -2
  13. package/dist/{cardano-yuOygqwp.js → cardano-BCT55gwf.js} +3 -2
  14. package/dist/{cardano-yuOygqwp.js.map → cardano-BCT55gwf.js.map} +1 -1
  15. package/dist/{cardano-DP6U_K1J.cjs → cardano-CzYswGzK.cjs} +5 -4
  16. package/dist/{cardano-DP6U_K1J.cjs.map → cardano-CzYswGzK.cjs.map} +1 -1
  17. package/dist/cardano.cjs +2 -2
  18. package/dist/cardano.js +2 -2
  19. package/dist/cosmos-BYrhIqRk.d.cts +77 -0
  20. package/dist/cosmos-DDsgtUki.cjs +113 -0
  21. package/dist/cosmos-DDsgtUki.cjs.map +1 -0
  22. package/dist/cosmos-DqyjA6lg.d.ts +77 -0
  23. package/dist/cosmos-jUHNxgWC.js +102 -0
  24. package/dist/cosmos-jUHNxgWC.js.map +1 -0
  25. package/dist/cosmos.cjs +10 -0
  26. package/dist/cosmos.d.cts +3 -0
  27. package/dist/cosmos.d.ts +3 -0
  28. package/dist/cosmos.js +3 -0
  29. package/dist/{derive-CuILJRPT.cjs → derive-BayrpfJk.cjs} +14 -2
  30. package/dist/derive-BayrpfJk.cjs.map +1 -0
  31. package/dist/{derive-C4JdycUh.js → derive-CK9Nc9Jc.js} +9 -3
  32. package/dist/derive-CK9Nc9Jc.js.map +1 -0
  33. package/dist/{evm-kJb3-oiR.js → evm-CI1cuZsp.js} +3 -2
  34. package/dist/{evm-kJb3-oiR.js.map → evm-CI1cuZsp.js.map} +1 -1
  35. package/dist/{evm-BHj_2OTG.cjs → evm-yfKOc2dy.cjs} +6 -5
  36. package/dist/{evm-BHj_2OTG.cjs.map → evm-yfKOc2dy.cjs.map} +1 -1
  37. package/dist/evm.cjs +2 -2
  38. package/dist/evm.js +2 -2
  39. package/dist/index.cjs +79 -31
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +25 -3
  42. package/dist/index.d.ts +25 -3
  43. package/dist/index.js +51 -9
  44. package/dist/index.js.map +1 -1
  45. package/dist/keypath-Bvv_cfHt.js +75 -0
  46. package/dist/keypath-Bvv_cfHt.js.map +1 -0
  47. package/dist/keypath-pzm_YIfN.cjs +116 -0
  48. package/dist/keypath-pzm_YIfN.cjs.map +1 -0
  49. package/dist/{messages-BzcdWlg1.cjs → messages-BZXDY29v.cjs} +2 -2
  50. package/dist/{messages-BzcdWlg1.cjs.map → messages-BZXDY29v.cjs.map} +1 -1
  51. package/dist/{messages-17Oup0-Z.js → messages-DbnXy3dC.js} +2 -2
  52. package/dist/{messages-17Oup0-Z.js.map → messages-DbnXy3dC.js.map} +1 -1
  53. package/dist/{shared-B8Wc7ViU.js → shared-Bbgejrus.js} +2 -73
  54. package/dist/shared-Bbgejrus.js.map +1 -0
  55. package/dist/{shared-nISrEktU.cjs → shared-Cu2yynP9.cjs} +13 -114
  56. package/dist/shared-Cu2yynP9.cjs.map +1 -0
  57. package/dist/{solana-DdEn24X4.cjs → solana-BoQBy0hu.cjs} +6 -5
  58. package/dist/{solana-DdEn24X4.cjs.map → solana-BoQBy0hu.cjs.map} +1 -1
  59. package/dist/{solana-C7JQEAec.js → solana-BukH3AI3.js} +3 -2
  60. package/dist/{solana-C7JQEAec.js.map → solana-BukH3AI3.js.map} +1 -1
  61. package/dist/solana.cjs +2 -2
  62. package/dist/solana.js +2 -2
  63. package/dist/sui-6WX6VPlW.d.cts +49 -0
  64. package/dist/sui-BtbPG6Xt.js +71 -0
  65. package/dist/sui-BtbPG6Xt.js.map +1 -0
  66. package/dist/sui-CYRn331O.cjs +82 -0
  67. package/dist/sui-CYRn331O.cjs.map +1 -0
  68. package/dist/sui-DI0ruW7E.d.ts +49 -0
  69. package/dist/sui.cjs +10 -0
  70. package/dist/sui.d.cts +3 -0
  71. package/dist/sui.d.ts +3 -0
  72. package/dist/sui.js +3 -0
  73. package/dist/{ton-5Uvi5ifg.js → ton-BSPKU5B9.js} +3 -2
  74. package/dist/{ton-5Uvi5ifg.js.map → ton-BSPKU5B9.js.map} +1 -1
  75. package/dist/{ton-DUJGXdGa.cjs → ton-CI2s9puH.cjs} +6 -5
  76. package/dist/{ton-DUJGXdGa.cjs.map → ton-CI2s9puH.cjs.map} +1 -1
  77. package/dist/ton.cjs +2 -2
  78. package/dist/ton.js +2 -2
  79. package/dist/{tron-CQIEqjCA.cjs → tron-B9wXdzlA.cjs} +7 -6
  80. package/dist/{tron-CQIEqjCA.cjs.map → tron-B9wXdzlA.cjs.map} +1 -1
  81. package/dist/{tron-Bo9HnvVE.js → tron-fufBDNuQ.js} +4 -3
  82. package/dist/{tron-Bo9HnvVE.js.map → tron-fufBDNuQ.js.map} +1 -1
  83. package/dist/tron.cjs +3 -3
  84. package/dist/tron.js +3 -3
  85. package/dist/verify.cjs +192 -9
  86. package/dist/verify.cjs.map +1 -1
  87. package/dist/verify.d.cts +54 -1
  88. package/dist/verify.d.ts +54 -1
  89. package/dist/verify.js +189 -9
  90. package/dist/verify.js.map +1 -1
  91. package/dist/xrp-BXAeK4iH.d.cts +32 -0
  92. package/dist/xrp-BrHXUnX5.cjs +52 -0
  93. package/dist/xrp-BrHXUnX5.cjs.map +1 -0
  94. package/dist/xrp-C8LJO5b-.js +47 -0
  95. package/dist/xrp-C8LJO5b-.js.map +1 -0
  96. package/dist/xrp-DqCXGYEk.d.ts +32 -0
  97. package/dist/xrp.cjs +9 -0
  98. package/dist/xrp.d.cts +3 -0
  99. package/dist/xrp.d.ts +3 -0
  100. package/dist/xrp.js +3 -0
  101. package/package.json +37 -1
  102. package/sui/package.json +6 -0
  103. package/xrp/package.json +6 -0
  104. package/dist/btc-Fr6Jz4Fi.cjs.map +0 -1
  105. package/dist/btc-VyJKXq7d.js.map +0 -1
  106. package/dist/derive-C4JdycUh.js.map +0 -1
  107. package/dist/derive-CuILJRPT.cjs.map +0 -1
  108. package/dist/shared-B8Wc7ViU.js.map +0 -1
  109. package/dist/shared-nISrEktU.cjs.map +0 -1
@@ -0,0 +1,116 @@
1
+ const require_shared = require("./shared-Cu2yynP9.cjs");
2
+ //#region src/registry/keypath.ts
3
+ const PATH_LEVEL = /^(\d+)('?)$/;
4
+ const HARDENED_OFFSET = 2147483648;
5
+ /** Parse `m/44'/60'/0'/0/5` into levels. Throws `invalid-props` on anything else. */
6
+ function parsePath(path) {
7
+ if (!path.startsWith("m/")) throw new require_shared.EraSdkError("invalid-props", `derivation path must start with "m/": ${path}`);
8
+ const segments = path.slice(2).split("/");
9
+ const levels = [];
10
+ for (const segment of segments) {
11
+ const match = PATH_LEVEL.exec(segment);
12
+ if (!match) throw new require_shared.EraSdkError("invalid-props", `bad derivation path segment "${segment}"`);
13
+ const index = Number(match[1]);
14
+ if (!Number.isSafeInteger(index) || index >= HARDENED_OFFSET) throw new require_shared.EraSdkError("invalid-props", `derivation index out of range in "${segment}"`);
15
+ levels.push({
16
+ index,
17
+ hardened: match[2] === "'"
18
+ });
19
+ }
20
+ if (levels.length === 0) throw new require_shared.EraSdkError("invalid-props", "derivation path has no levels");
21
+ return levels;
22
+ }
23
+ function formatPath(levels) {
24
+ return `m/${levels.map((l) => `${l.index}${l.hardened ? "'" : ""}`).join("/")}`;
25
+ }
26
+ function pathEquals(a, b) {
27
+ if (a.length !== b.length) return false;
28
+ return a.every((l, i) => l.index === b[i].index && l.hardened === b[i].hardened);
29
+ }
30
+ /** Flat `[index, hardened, index, hardened, ...]` component list. */
31
+ function pathComponentsCbor(levels) {
32
+ const items = [];
33
+ for (const level of levels) items.push(require_shared.cbUint(level.index), require_shared.cbBool(level.hardened));
34
+ return require_shared.cbArray(items);
35
+ }
36
+ /** A `crypto-keypath` (tag 304): `{1: components, 2: xfp}` (key 2 omitted when no xfp). */
37
+ function keypath304(levels, xfp) {
38
+ const entries = [[1, pathComponentsCbor(levels)]];
39
+ if (xfp !== void 0) entries.push([2, require_shared.cbUint(xfp)]);
40
+ return require_shared.cbTag(304, require_shared.cbMap(entries));
41
+ }
42
+ /** Parse the flat component list of a `crypto-keypath` back into levels (null on malformed). */
43
+ function parsePathComponents(value) {
44
+ const items = require_shared.asArray(value);
45
+ if (!items || items.length % 2 !== 0) return null;
46
+ const levels = [];
47
+ for (let i = 0; i < items.length; i += 2) {
48
+ const index = require_shared.asUint(items[i]);
49
+ const hardened = require_shared.asBool(items[i + 1]);
50
+ if (index === void 0 || hardened === void 0 || index >= BigInt(HARDENED_OFFSET)) return null;
51
+ levels.push({
52
+ index: Number(index),
53
+ hardened
54
+ });
55
+ }
56
+ return levels;
57
+ }
58
+ /** Normalize an xfp given as a u32 int or an 8-hex string into a u32 number. */
59
+ function normalizeXfp(xfp) {
60
+ if (typeof xfp === "number") {
61
+ if (!Number.isSafeInteger(xfp) || xfp < 0 || xfp > 4294967295) throw new require_shared.EraSdkError("invalid-props", "xfp must be an unsigned 32-bit integer");
62
+ return xfp;
63
+ }
64
+ const hex = xfp.startsWith("0x") ? xfp.slice(2) : xfp;
65
+ if (!/^[0-9a-fA-F]{1,8}$/.test(hex)) throw new require_shared.EraSdkError("invalid-props", "xfp string must be up to 8 hex characters");
66
+ return Number.parseInt(hex, 16);
67
+ }
68
+ /** Lowercase 8-hex form of an xfp (the display / Tron wire form). */
69
+ function xfpToHex(xfp) {
70
+ return xfp.toString(16).padStart(8, "0");
71
+ }
72
+ //#endregion
73
+ Object.defineProperty(exports, "formatPath", {
74
+ enumerable: true,
75
+ get: function() {
76
+ return formatPath;
77
+ }
78
+ });
79
+ Object.defineProperty(exports, "keypath304", {
80
+ enumerable: true,
81
+ get: function() {
82
+ return keypath304;
83
+ }
84
+ });
85
+ Object.defineProperty(exports, "normalizeXfp", {
86
+ enumerable: true,
87
+ get: function() {
88
+ return normalizeXfp;
89
+ }
90
+ });
91
+ Object.defineProperty(exports, "parsePath", {
92
+ enumerable: true,
93
+ get: function() {
94
+ return parsePath;
95
+ }
96
+ });
97
+ Object.defineProperty(exports, "parsePathComponents", {
98
+ enumerable: true,
99
+ get: function() {
100
+ return parsePathComponents;
101
+ }
102
+ });
103
+ Object.defineProperty(exports, "pathEquals", {
104
+ enumerable: true,
105
+ get: function() {
106
+ return pathEquals;
107
+ }
108
+ });
109
+ Object.defineProperty(exports, "xfpToHex", {
110
+ enumerable: true,
111
+ get: function() {
112
+ return xfpToHex;
113
+ }
114
+ });
115
+
116
+ //# sourceMappingURL=keypath-pzm_YIfN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keypath-pzm_YIfN.cjs","names":["EraSdkError","cbUint","cbBool","cbArray","cbTag","cbMap","asArray","asUint","asBool"],"sources":["../src/registry/keypath.ts"],"sourcesContent":["import type { CborValue } from '../cbor/model';\nimport { asArray, asBool, asUint, cbArray, cbBool, cbMap, cbTag, cbUint } from '../cbor/model';\nimport { EraSdkError } from '../core/errors';\n\n/** One BIP-32 derivation level: child index plus the hardened flag (`'`). */\nexport interface PathLevel {\n readonly index: number;\n readonly hardened: boolean;\n}\n\nconst PATH_LEVEL = /^(\\d+)('?)$/;\nconst HARDENED_OFFSET = 0x80000000;\n\n/** Parse `m/44'/60'/0'/0/5` into levels. Throws `invalid-props` on anything else. */\nexport function parsePath(path: string): PathLevel[] {\n if (!path.startsWith('m/')) {\n throw new EraSdkError('invalid-props', `derivation path must start with \"m/\": ${path}`);\n }\n const segments = path.slice(2).split('/');\n const levels: PathLevel[] = [];\n for (const segment of segments) {\n const match = PATH_LEVEL.exec(segment);\n if (!match) {\n throw new EraSdkError('invalid-props', `bad derivation path segment \"${segment}\"`);\n }\n const index = Number(match[1]);\n if (!Number.isSafeInteger(index) || index >= HARDENED_OFFSET) {\n throw new EraSdkError('invalid-props', `derivation index out of range in \"${segment}\"`);\n }\n levels.push({ index, hardened: match[2] === \"'\" });\n }\n if (levels.length === 0) {\n throw new EraSdkError('invalid-props', 'derivation path has no levels');\n }\n return levels;\n}\n\nexport function formatPath(levels: readonly PathLevel[]): string {\n return `m/${levels.map((l) => `${l.index}${l.hardened ? \"'\" : ''}`).join('/')}`;\n}\n\nexport function pathEquals(a: readonly PathLevel[], b: readonly PathLevel[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((l, i) => l.index === b[i]!.index && l.hardened === b[i]!.hardened);\n}\n\n/** Flat `[index, hardened, index, hardened, ...]` component list. */\nexport function pathComponentsCbor(levels: readonly PathLevel[]): CborValue {\n const items: CborValue[] = [];\n for (const level of levels) {\n items.push(cbUint(level.index), cbBool(level.hardened));\n }\n return cbArray(items);\n}\n\n/** A `crypto-keypath` (tag 304): `{1: components, 2: xfp}` (key 2 omitted when no xfp). */\nexport function keypath304(levels: readonly PathLevel[], xfp?: number): CborValue {\n const entries: [number, CborValue][] = [[1, pathComponentsCbor(levels)]];\n if (xfp !== undefined) entries.push([2, cbUint(xfp)]);\n return cbTag(304, cbMap(entries));\n}\n\n/** Parse the flat component list of a `crypto-keypath` back into levels (null on malformed). */\nexport function parsePathComponents(value: CborValue | undefined): PathLevel[] | null {\n const items = asArray(value);\n if (!items || items.length % 2 !== 0) return null;\n const levels: PathLevel[] = [];\n for (let i = 0; i < items.length; i += 2) {\n const index = asUint(items[i]);\n const hardened = asBool(items[i + 1]);\n if (index === undefined || hardened === undefined || index >= BigInt(HARDENED_OFFSET)) {\n return null;\n }\n levels.push({ index: Number(index), hardened });\n }\n return levels;\n}\n\n/** Normalize an xfp given as a u32 int or an 8-hex string into a u32 number. */\nexport function normalizeXfp(xfp: number | string): number {\n if (typeof xfp === 'number') {\n if (!Number.isSafeInteger(xfp) || xfp < 0 || xfp > 0xffffffff) {\n throw new EraSdkError('invalid-props', 'xfp must be an unsigned 32-bit integer');\n }\n return xfp;\n }\n const hex = xfp.startsWith('0x') ? xfp.slice(2) : xfp;\n if (!/^[0-9a-fA-F]{1,8}$/.test(hex)) {\n throw new EraSdkError('invalid-props', 'xfp string must be up to 8 hex characters');\n }\n return Number.parseInt(hex, 16);\n}\n\n/** Lowercase 8-hex form of an xfp (the display / Tron wire form). */\nexport function xfpToHex(xfp: number): string {\n return xfp.toString(16).padStart(8, '0');\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const require_shared = require("./shared-nISrEktU.cjs");
1
+ const require_shared = require("./shared-Cu2yynP9.cjs");
2
2
  //#region src/tron-proto/wire.ts
3
3
  /**
4
4
  * Minimal protobuf wire codec for the Tron signing envelope. Varint and
@@ -240,4 +240,4 @@ Object.defineProperty(exports, "splitSignedTronTx", {
240
240
  }
241
241
  });
242
242
 
243
- //# sourceMappingURL=messages-BzcdWlg1.cjs.map
243
+ //# sourceMappingURL=messages-BZXDY29v.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages-BzcdWlg1.cjs","names":["utf8Encode","concatBytes","EraSdkError","EraSdkError","utf8Decode","hexToBytes"],"sources":["../src/tron-proto/wire.ts","../src/tron-proto/messages.ts"],"sourcesContent":["import { concatBytes, utf8Encode } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\n\n/**\n * Minimal protobuf wire codec for the Tron signing envelope. Varint and\n * length-delimited wire types only — the schema uses nothing else.\n *\n * Writer semantics mirror the reference implementation: EXPLICITLY SET fields\n * are written even when they hold default values (a `timestamp` of 0 is\n * `tag, 0x00` on the wire), and fields are emitted in ascending field-number\n * order. Byte-exactness against the golden fixtures depends on both.\n */\n\nexport class ProtoWriter {\n private readonly parts: Uint8Array[] = [];\n\n varintField(field: number, value: number | bigint): this {\n this.parts.push(tag(field, 0), varint(value));\n return this;\n }\n\n stringField(field: number, value: string): this {\n const bytes = utf8Encode(value);\n this.parts.push(tag(field, 2), varint(bytes.length), bytes);\n return this;\n }\n\n bytesField(field: number, value: Uint8Array): this {\n this.parts.push(tag(field, 2), varint(value.length), value);\n return this;\n }\n\n messageField(field: number, encoded: Uint8Array): this {\n this.parts.push(tag(field, 2), varint(encoded.length), encoded);\n return this;\n }\n\n finish(): Uint8Array {\n return concatBytes(...this.parts);\n }\n}\n\nfunction tag(field: number, wireType: number): Uint8Array {\n return varint((field << 3) | wireType);\n}\n\nexport function varint(value: number | bigint): Uint8Array {\n let v = typeof value === 'number' ? BigInt(value) : value;\n if (v < 0n) throw new EraSdkError('protobuf-error', 'negative varint');\n const out: number[] = [];\n do {\n let byte = Number(v & 0x7fn);\n v >>= 7n;\n if (v > 0n) byte |= 0x80;\n out.push(byte);\n } while (v > 0n);\n return new Uint8Array(out);\n}\n\nexport interface ProtoField {\n readonly field: number;\n readonly wireType: number;\n /** Set for wire type 0. */\n readonly value: bigint;\n /** Set for wire type 2 (verbatim slice of the input). */\n readonly bytes: Uint8Array;\n}\n\n/**\n * Hardened field reader: varint shift capped, lengths bounds-checked before\n * slicing, unknown fields skippable by wire type, group wire types refused.\n */\nexport function readFields(bytes: Uint8Array): ProtoField[] {\n const fields: ProtoField[] = [];\n let offset = 0;\n\n const readVarint = (): bigint => {\n let result = 0n;\n let shift = 0n;\n for (;;) {\n const byte = bytes[offset];\n if (byte === undefined) throw new EraSdkError('protobuf-error', 'truncated varint');\n offset += 1;\n result |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) return result;\n shift += 7n;\n if (shift > 63n) throw new EraSdkError('protobuf-error', 'varint exceeds 64 bits');\n }\n };\n\n while (offset < bytes.length) {\n const key = readVarint();\n const field = Number(key >> 3n);\n const wireType = Number(key & 7n);\n if (field === 0) throw new EraSdkError('protobuf-error', 'field number 0');\n switch (wireType) {\n case 0: {\n fields.push({ field, wireType, value: readVarint(), bytes: EMPTY });\n break;\n }\n case 1: {\n if (offset + 8 > bytes.length) throw new EraSdkError('protobuf-error', 'truncated fixed64');\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + 8) });\n offset += 8;\n break;\n }\n case 2: {\n const length = readVarint();\n if (length > BigInt(bytes.length - offset)) {\n throw new EraSdkError('protobuf-error', 'length-delimited field exceeds input');\n }\n const len = Number(length);\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + len) });\n offset += len;\n break;\n }\n case 5: {\n if (offset + 4 > bytes.length) throw new EraSdkError('protobuf-error', 'truncated fixed32');\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + 4) });\n offset += 4;\n break;\n }\n default:\n throw new EraSdkError('protobuf-error', `unsupported wire type ${wireType}`);\n }\n }\n return fields;\n}\n\nconst EMPTY = new Uint8Array(0);\n\n/** First occurrence of a length-delimited field, or null. */\nexport function firstBytes(fields: ProtoField[], field: number): Uint8Array | null {\n for (const f of fields) {\n if (f.field === field && f.wireType === 2) return f.bytes;\n }\n return null;\n}\n\n/** First occurrence of a varint field, or null. */\nexport function firstVarint(fields: ProtoField[], field: number): bigint | null {\n for (const f of fields) {\n if (f.field === field && f.wireType === 0) return f.value;\n }\n return null;\n}\n","import { hexToBytes, utf8Decode } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\nimport { firstBytes, ProtoWriter, readFields } from './wire';\n\n/**\n * The Tron signing envelope (\"QrCode Protocol\"):\n * `Base -> Payload -> SignTransaction -> TronTx`, gzip-compressed and wrapped\n * in a `keystone-sign-request` (6101) CBOR map. Schemas are vendored under\n * `proto/tron/`; this codec hand-writes the five messages the wallet side\n * speaks, with reference-exact field emission (explicitly-set defaults ARE\n * written; ascending field order).\n */\n\nexport interface TronLatestBlock {\n /** FULL 64-hex block id of a live now-block (the device slices ref_block_hash from it). */\n readonly hash: string;\n readonly number: number;\n readonly timestamp: number;\n}\n\nexport interface TronSignRequestProto {\n /** Lowercase, ZERO-PADDED 8-hex source fingerprint (the wire demands the string form). */\n readonly xfpHex: string;\n /** Hyphenated UUID string; echoed by the device as the only reply binding. */\n readonly signId: string;\n readonly hdPath: string;\n readonly timestamp: number;\n readonly decimals: number;\n readonly token: string;\n readonly contractAddress?: string | undefined;\n readonly from?: string | undefined;\n readonly to?: string | undefined;\n readonly memo?: string | undefined;\n readonly value?: string | undefined;\n readonly fee?: number | undefined;\n readonly latestBlock: TronLatestBlock;\n /** Serialized `Transaction.raw_data` — the signing source of truth. */\n readonly rawData: Uint8Array;\n}\n\nconst PAYLOAD_TYPE_SIGN_TX = 2;\n\nexport function encodeSignRequestProto(req: TronSignRequestProto): Uint8Array {\n if (req.fee !== undefined && (req.fee < 0 || req.fee > 0x7fffffff)) {\n throw new EraSdkError('invalid-props', 'tron fee must fit a positive int32');\n }\n const latestBlock = new ProtoWriter()\n .stringField(1, req.latestBlock.hash)\n .varintField(2, req.latestBlock.number)\n .varintField(3, req.latestBlock.timestamp)\n .finish();\n\n const tronTx = new ProtoWriter().stringField(1, req.token);\n if (req.contractAddress !== undefined) tronTx.stringField(2, req.contractAddress);\n if (req.from !== undefined) tronTx.stringField(3, req.from);\n if (req.to !== undefined) tronTx.stringField(4, req.to);\n if (req.memo !== undefined) tronTx.stringField(5, req.memo);\n if (req.value !== undefined) tronTx.stringField(6, req.value);\n tronTx.messageField(7, latestBlock);\n if (req.fee !== undefined) tronTx.varintField(9, req.fee);\n tronTx.bytesField(10, req.rawData);\n\n const signTx = new ProtoWriter()\n .stringField(1, 'TRON')\n .stringField(2, req.signId)\n .stringField(3, req.hdPath)\n .varintField(4, req.timestamp)\n .varintField(5, req.decimals)\n .messageField(8, tronTx.finish())\n .finish();\n\n const payload = new ProtoWriter()\n .varintField(1, PAYLOAD_TYPE_SIGN_TX)\n .stringField(2, req.xfpHex)\n .messageField(4, signTx)\n .finish();\n\n return new ProtoWriter()\n .varintField(1, 2) // Base.version\n .stringField(2, 'QrCode Protocol')\n .messageField(3, payload)\n .finish();\n}\n\nexport interface TronSignResultProto {\n readonly signId: string;\n readonly txId: string;\n readonly rawTx: string;\n}\n\n/** Parse a `keystone-sign-result` Base protobuf. Unknown fields are skipped. */\nexport function decodeSignResultProto(bytes: Uint8Array): TronSignResultProto {\n const base = readFields(bytes);\n const payloadBytes = firstBytes(base, 3);\n if (!payloadBytes) {\n throw new EraSdkError('malformed-reply', 'keystone-sign-result carries no payload');\n }\n const payload = readFields(payloadBytes);\n const resultBytes = firstBytes(payload, 7); // Payload.signTxResult\n if (!resultBytes) {\n return { signId: '', txId: '', rawTx: '' };\n }\n const result = readFields(resultBytes);\n return {\n signId: text(firstBytes(result, 1)),\n txId: text(firstBytes(result, 2)),\n rawTx: text(firstBytes(result, 3)),\n };\n}\n\nfunction text(bytes: Uint8Array | null): string {\n if (!bytes) return '';\n try {\n return utf8Decode(bytes);\n } catch {\n throw new EraSdkError('malformed-reply', 'protobuf string field is not valid UTF-8');\n }\n}\n\nexport interface SignedTronTx {\n /** Verbatim `raw_data` slice — the digest is sha256 over the device's own serialization. */\n readonly rawData: Uint8Array;\n readonly signatures: readonly Uint8Array[];\n}\n\n/**\n * Split a signed Tron network `Transaction` frame (`{1: raw_data, 2: signature*}`)\n * from the reply's `rawTx` hex. Top-level fields must be length-delimited —\n * anything else is not a transaction frame.\n */\nexport function splitSignedTronTx(rawTxHex: string): SignedTronTx {\n let frame: Uint8Array;\n try {\n frame = hexToBytes(rawTxHex);\n } catch {\n throw new EraSdkError('malformed-reply', 'signed Tron transaction is not hex');\n }\n const fields = readFields(frame);\n let rawData: Uint8Array | null = null;\n const signatures: Uint8Array[] = [];\n for (const f of fields) {\n if (f.wireType !== 2) {\n throw new EraSdkError('malformed-reply', 'unexpected wire type in signed Tron transaction');\n }\n if (f.field === 1 && rawData === null) rawData = f.bytes;\n if (f.field === 2) signatures.push(f.bytes);\n }\n if (rawData === null) {\n throw new EraSdkError('malformed-reply', 'signed Tron transaction carries no raw_data');\n }\n return { rawData, signatures };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"messages-BZXDY29v.cjs","names":["utf8Encode","concatBytes","EraSdkError","EraSdkError","utf8Decode","hexToBytes"],"sources":["../src/tron-proto/wire.ts","../src/tron-proto/messages.ts"],"sourcesContent":["import { concatBytes, utf8Encode } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\n\n/**\n * Minimal protobuf wire codec for the Tron signing envelope. Varint and\n * length-delimited wire types only — the schema uses nothing else.\n *\n * Writer semantics mirror the reference implementation: EXPLICITLY SET fields\n * are written even when they hold default values (a `timestamp` of 0 is\n * `tag, 0x00` on the wire), and fields are emitted in ascending field-number\n * order. Byte-exactness against the golden fixtures depends on both.\n */\n\nexport class ProtoWriter {\n private readonly parts: Uint8Array[] = [];\n\n varintField(field: number, value: number | bigint): this {\n this.parts.push(tag(field, 0), varint(value));\n return this;\n }\n\n stringField(field: number, value: string): this {\n const bytes = utf8Encode(value);\n this.parts.push(tag(field, 2), varint(bytes.length), bytes);\n return this;\n }\n\n bytesField(field: number, value: Uint8Array): this {\n this.parts.push(tag(field, 2), varint(value.length), value);\n return this;\n }\n\n messageField(field: number, encoded: Uint8Array): this {\n this.parts.push(tag(field, 2), varint(encoded.length), encoded);\n return this;\n }\n\n finish(): Uint8Array {\n return concatBytes(...this.parts);\n }\n}\n\nfunction tag(field: number, wireType: number): Uint8Array {\n return varint((field << 3) | wireType);\n}\n\nexport function varint(value: number | bigint): Uint8Array {\n let v = typeof value === 'number' ? BigInt(value) : value;\n if (v < 0n) throw new EraSdkError('protobuf-error', 'negative varint');\n const out: number[] = [];\n do {\n let byte = Number(v & 0x7fn);\n v >>= 7n;\n if (v > 0n) byte |= 0x80;\n out.push(byte);\n } while (v > 0n);\n return new Uint8Array(out);\n}\n\nexport interface ProtoField {\n readonly field: number;\n readonly wireType: number;\n /** Set for wire type 0. */\n readonly value: bigint;\n /** Set for wire type 2 (verbatim slice of the input). */\n readonly bytes: Uint8Array;\n}\n\n/**\n * Hardened field reader: varint shift capped, lengths bounds-checked before\n * slicing, unknown fields skippable by wire type, group wire types refused.\n */\nexport function readFields(bytes: Uint8Array): ProtoField[] {\n const fields: ProtoField[] = [];\n let offset = 0;\n\n const readVarint = (): bigint => {\n let result = 0n;\n let shift = 0n;\n for (;;) {\n const byte = bytes[offset];\n if (byte === undefined) throw new EraSdkError('protobuf-error', 'truncated varint');\n offset += 1;\n result |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) return result;\n shift += 7n;\n if (shift > 63n) throw new EraSdkError('protobuf-error', 'varint exceeds 64 bits');\n }\n };\n\n while (offset < bytes.length) {\n const key = readVarint();\n const field = Number(key >> 3n);\n const wireType = Number(key & 7n);\n if (field === 0) throw new EraSdkError('protobuf-error', 'field number 0');\n switch (wireType) {\n case 0: {\n fields.push({ field, wireType, value: readVarint(), bytes: EMPTY });\n break;\n }\n case 1: {\n if (offset + 8 > bytes.length) throw new EraSdkError('protobuf-error', 'truncated fixed64');\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + 8) });\n offset += 8;\n break;\n }\n case 2: {\n const length = readVarint();\n if (length > BigInt(bytes.length - offset)) {\n throw new EraSdkError('protobuf-error', 'length-delimited field exceeds input');\n }\n const len = Number(length);\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + len) });\n offset += len;\n break;\n }\n case 5: {\n if (offset + 4 > bytes.length) throw new EraSdkError('protobuf-error', 'truncated fixed32');\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + 4) });\n offset += 4;\n break;\n }\n default:\n throw new EraSdkError('protobuf-error', `unsupported wire type ${wireType}`);\n }\n }\n return fields;\n}\n\nconst EMPTY = new Uint8Array(0);\n\n/** First occurrence of a length-delimited field, or null. */\nexport function firstBytes(fields: ProtoField[], field: number): Uint8Array | null {\n for (const f of fields) {\n if (f.field === field && f.wireType === 2) return f.bytes;\n }\n return null;\n}\n\n/** First occurrence of a varint field, or null. */\nexport function firstVarint(fields: ProtoField[], field: number): bigint | null {\n for (const f of fields) {\n if (f.field === field && f.wireType === 0) return f.value;\n }\n return null;\n}\n","import { hexToBytes, utf8Decode } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\nimport { firstBytes, ProtoWriter, readFields } from './wire';\n\n/**\n * The Tron signing envelope (\"QrCode Protocol\"):\n * `Base -> Payload -> SignTransaction -> TronTx`, gzip-compressed and wrapped\n * in a `keystone-sign-request` (6101) CBOR map. Schemas are vendored under\n * `proto/tron/`; this codec hand-writes the five messages the wallet side\n * speaks, with reference-exact field emission (explicitly-set defaults ARE\n * written; ascending field order).\n */\n\nexport interface TronLatestBlock {\n /** FULL 64-hex block id of a live now-block (the device slices ref_block_hash from it). */\n readonly hash: string;\n readonly number: number;\n readonly timestamp: number;\n}\n\nexport interface TronSignRequestProto {\n /** Lowercase, ZERO-PADDED 8-hex source fingerprint (the wire demands the string form). */\n readonly xfpHex: string;\n /** Hyphenated UUID string; echoed by the device as the only reply binding. */\n readonly signId: string;\n readonly hdPath: string;\n readonly timestamp: number;\n readonly decimals: number;\n readonly token: string;\n readonly contractAddress?: string | undefined;\n readonly from?: string | undefined;\n readonly to?: string | undefined;\n readonly memo?: string | undefined;\n readonly value?: string | undefined;\n readonly fee?: number | undefined;\n readonly latestBlock: TronLatestBlock;\n /** Serialized `Transaction.raw_data` — the signing source of truth. */\n readonly rawData: Uint8Array;\n}\n\nconst PAYLOAD_TYPE_SIGN_TX = 2;\n\nexport function encodeSignRequestProto(req: TronSignRequestProto): Uint8Array {\n if (req.fee !== undefined && (req.fee < 0 || req.fee > 0x7fffffff)) {\n throw new EraSdkError('invalid-props', 'tron fee must fit a positive int32');\n }\n const latestBlock = new ProtoWriter()\n .stringField(1, req.latestBlock.hash)\n .varintField(2, req.latestBlock.number)\n .varintField(3, req.latestBlock.timestamp)\n .finish();\n\n const tronTx = new ProtoWriter().stringField(1, req.token);\n if (req.contractAddress !== undefined) tronTx.stringField(2, req.contractAddress);\n if (req.from !== undefined) tronTx.stringField(3, req.from);\n if (req.to !== undefined) tronTx.stringField(4, req.to);\n if (req.memo !== undefined) tronTx.stringField(5, req.memo);\n if (req.value !== undefined) tronTx.stringField(6, req.value);\n tronTx.messageField(7, latestBlock);\n if (req.fee !== undefined) tronTx.varintField(9, req.fee);\n tronTx.bytesField(10, req.rawData);\n\n const signTx = new ProtoWriter()\n .stringField(1, 'TRON')\n .stringField(2, req.signId)\n .stringField(3, req.hdPath)\n .varintField(4, req.timestamp)\n .varintField(5, req.decimals)\n .messageField(8, tronTx.finish())\n .finish();\n\n const payload = new ProtoWriter()\n .varintField(1, PAYLOAD_TYPE_SIGN_TX)\n .stringField(2, req.xfpHex)\n .messageField(4, signTx)\n .finish();\n\n return new ProtoWriter()\n .varintField(1, 2) // Base.version\n .stringField(2, 'QrCode Protocol')\n .messageField(3, payload)\n .finish();\n}\n\nexport interface TronSignResultProto {\n readonly signId: string;\n readonly txId: string;\n readonly rawTx: string;\n}\n\n/** Parse a `keystone-sign-result` Base protobuf. Unknown fields are skipped. */\nexport function decodeSignResultProto(bytes: Uint8Array): TronSignResultProto {\n const base = readFields(bytes);\n const payloadBytes = firstBytes(base, 3);\n if (!payloadBytes) {\n throw new EraSdkError('malformed-reply', 'keystone-sign-result carries no payload');\n }\n const payload = readFields(payloadBytes);\n const resultBytes = firstBytes(payload, 7); // Payload.signTxResult\n if (!resultBytes) {\n return { signId: '', txId: '', rawTx: '' };\n }\n const result = readFields(resultBytes);\n return {\n signId: text(firstBytes(result, 1)),\n txId: text(firstBytes(result, 2)),\n rawTx: text(firstBytes(result, 3)),\n };\n}\n\nfunction text(bytes: Uint8Array | null): string {\n if (!bytes) return '';\n try {\n return utf8Decode(bytes);\n } catch {\n throw new EraSdkError('malformed-reply', 'protobuf string field is not valid UTF-8');\n }\n}\n\nexport interface SignedTronTx {\n /** Verbatim `raw_data` slice — the digest is sha256 over the device's own serialization. */\n readonly rawData: Uint8Array;\n readonly signatures: readonly Uint8Array[];\n}\n\n/**\n * Split a signed Tron network `Transaction` frame (`{1: raw_data, 2: signature*}`)\n * from the reply's `rawTx` hex. Top-level fields must be length-delimited —\n * anything else is not a transaction frame.\n */\nexport function splitSignedTronTx(rawTxHex: string): SignedTronTx {\n let frame: Uint8Array;\n try {\n frame = hexToBytes(rawTxHex);\n } catch {\n throw new EraSdkError('malformed-reply', 'signed Tron transaction is not hex');\n }\n const fields = readFields(frame);\n let rawData: Uint8Array | null = null;\n const signatures: Uint8Array[] = [];\n for (const f of fields) {\n if (f.wireType !== 2) {\n throw new EraSdkError('malformed-reply', 'unexpected wire type in signed Tron transaction');\n }\n if (f.field === 1 && rawData === null) rawData = f.bytes;\n if (f.field === 2) signatures.push(f.bytes);\n }\n if (rawData === null) {\n throw new EraSdkError('malformed-reply', 'signed Tron transaction carries no raw_data');\n }\n return { rawData, signatures };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { A as utf8Encode, D as hexToBytes, T as concatBytes, Z as EraSdkError, k as utf8Decode } from "./shared-B8Wc7ViU.js";
1
+ import { A as utf8Encode, D as hexToBytes, K as EraSdkError, T as concatBytes, k as utf8Decode } from "./shared-Bbgejrus.js";
2
2
  //#region src/tron-proto/wire.ts
3
3
  /**
4
4
  * Minimal protobuf wire codec for the Tron signing envelope. Varint and
@@ -205,4 +205,4 @@ function splitSignedTronTx(rawTxHex) {
205
205
  //#endregion
206
206
  export { firstVarint as a, firstBytes as i, encodeSignRequestProto as n, readFields as o, splitSignedTronTx as r, decodeSignResultProto as t };
207
207
 
208
- //# sourceMappingURL=messages-17Oup0-Z.js.map
208
+ //# sourceMappingURL=messages-DbnXy3dC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages-17Oup0-Z.js","names":[],"sources":["../src/tron-proto/wire.ts","../src/tron-proto/messages.ts"],"sourcesContent":["import { concatBytes, utf8Encode } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\n\n/**\n * Minimal protobuf wire codec for the Tron signing envelope. Varint and\n * length-delimited wire types only — the schema uses nothing else.\n *\n * Writer semantics mirror the reference implementation: EXPLICITLY SET fields\n * are written even when they hold default values (a `timestamp` of 0 is\n * `tag, 0x00` on the wire), and fields are emitted in ascending field-number\n * order. Byte-exactness against the golden fixtures depends on both.\n */\n\nexport class ProtoWriter {\n private readonly parts: Uint8Array[] = [];\n\n varintField(field: number, value: number | bigint): this {\n this.parts.push(tag(field, 0), varint(value));\n return this;\n }\n\n stringField(field: number, value: string): this {\n const bytes = utf8Encode(value);\n this.parts.push(tag(field, 2), varint(bytes.length), bytes);\n return this;\n }\n\n bytesField(field: number, value: Uint8Array): this {\n this.parts.push(tag(field, 2), varint(value.length), value);\n return this;\n }\n\n messageField(field: number, encoded: Uint8Array): this {\n this.parts.push(tag(field, 2), varint(encoded.length), encoded);\n return this;\n }\n\n finish(): Uint8Array {\n return concatBytes(...this.parts);\n }\n}\n\nfunction tag(field: number, wireType: number): Uint8Array {\n return varint((field << 3) | wireType);\n}\n\nexport function varint(value: number | bigint): Uint8Array {\n let v = typeof value === 'number' ? BigInt(value) : value;\n if (v < 0n) throw new EraSdkError('protobuf-error', 'negative varint');\n const out: number[] = [];\n do {\n let byte = Number(v & 0x7fn);\n v >>= 7n;\n if (v > 0n) byte |= 0x80;\n out.push(byte);\n } while (v > 0n);\n return new Uint8Array(out);\n}\n\nexport interface ProtoField {\n readonly field: number;\n readonly wireType: number;\n /** Set for wire type 0. */\n readonly value: bigint;\n /** Set for wire type 2 (verbatim slice of the input). */\n readonly bytes: Uint8Array;\n}\n\n/**\n * Hardened field reader: varint shift capped, lengths bounds-checked before\n * slicing, unknown fields skippable by wire type, group wire types refused.\n */\nexport function readFields(bytes: Uint8Array): ProtoField[] {\n const fields: ProtoField[] = [];\n let offset = 0;\n\n const readVarint = (): bigint => {\n let result = 0n;\n let shift = 0n;\n for (;;) {\n const byte = bytes[offset];\n if (byte === undefined) throw new EraSdkError('protobuf-error', 'truncated varint');\n offset += 1;\n result |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) return result;\n shift += 7n;\n if (shift > 63n) throw new EraSdkError('protobuf-error', 'varint exceeds 64 bits');\n }\n };\n\n while (offset < bytes.length) {\n const key = readVarint();\n const field = Number(key >> 3n);\n const wireType = Number(key & 7n);\n if (field === 0) throw new EraSdkError('protobuf-error', 'field number 0');\n switch (wireType) {\n case 0: {\n fields.push({ field, wireType, value: readVarint(), bytes: EMPTY });\n break;\n }\n case 1: {\n if (offset + 8 > bytes.length) throw new EraSdkError('protobuf-error', 'truncated fixed64');\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + 8) });\n offset += 8;\n break;\n }\n case 2: {\n const length = readVarint();\n if (length > BigInt(bytes.length - offset)) {\n throw new EraSdkError('protobuf-error', 'length-delimited field exceeds input');\n }\n const len = Number(length);\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + len) });\n offset += len;\n break;\n }\n case 5: {\n if (offset + 4 > bytes.length) throw new EraSdkError('protobuf-error', 'truncated fixed32');\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + 4) });\n offset += 4;\n break;\n }\n default:\n throw new EraSdkError('protobuf-error', `unsupported wire type ${wireType}`);\n }\n }\n return fields;\n}\n\nconst EMPTY = new Uint8Array(0);\n\n/** First occurrence of a length-delimited field, or null. */\nexport function firstBytes(fields: ProtoField[], field: number): Uint8Array | null {\n for (const f of fields) {\n if (f.field === field && f.wireType === 2) return f.bytes;\n }\n return null;\n}\n\n/** First occurrence of a varint field, or null. */\nexport function firstVarint(fields: ProtoField[], field: number): bigint | null {\n for (const f of fields) {\n if (f.field === field && f.wireType === 0) return f.value;\n }\n return null;\n}\n","import { hexToBytes, utf8Decode } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\nimport { firstBytes, ProtoWriter, readFields } from './wire';\n\n/**\n * The Tron signing envelope (\"QrCode Protocol\"):\n * `Base -> Payload -> SignTransaction -> TronTx`, gzip-compressed and wrapped\n * in a `keystone-sign-request` (6101) CBOR map. Schemas are vendored under\n * `proto/tron/`; this codec hand-writes the five messages the wallet side\n * speaks, with reference-exact field emission (explicitly-set defaults ARE\n * written; ascending field order).\n */\n\nexport interface TronLatestBlock {\n /** FULL 64-hex block id of a live now-block (the device slices ref_block_hash from it). */\n readonly hash: string;\n readonly number: number;\n readonly timestamp: number;\n}\n\nexport interface TronSignRequestProto {\n /** Lowercase, ZERO-PADDED 8-hex source fingerprint (the wire demands the string form). */\n readonly xfpHex: string;\n /** Hyphenated UUID string; echoed by the device as the only reply binding. */\n readonly signId: string;\n readonly hdPath: string;\n readonly timestamp: number;\n readonly decimals: number;\n readonly token: string;\n readonly contractAddress?: string | undefined;\n readonly from?: string | undefined;\n readonly to?: string | undefined;\n readonly memo?: string | undefined;\n readonly value?: string | undefined;\n readonly fee?: number | undefined;\n readonly latestBlock: TronLatestBlock;\n /** Serialized `Transaction.raw_data` — the signing source of truth. */\n readonly rawData: Uint8Array;\n}\n\nconst PAYLOAD_TYPE_SIGN_TX = 2;\n\nexport function encodeSignRequestProto(req: TronSignRequestProto): Uint8Array {\n if (req.fee !== undefined && (req.fee < 0 || req.fee > 0x7fffffff)) {\n throw new EraSdkError('invalid-props', 'tron fee must fit a positive int32');\n }\n const latestBlock = new ProtoWriter()\n .stringField(1, req.latestBlock.hash)\n .varintField(2, req.latestBlock.number)\n .varintField(3, req.latestBlock.timestamp)\n .finish();\n\n const tronTx = new ProtoWriter().stringField(1, req.token);\n if (req.contractAddress !== undefined) tronTx.stringField(2, req.contractAddress);\n if (req.from !== undefined) tronTx.stringField(3, req.from);\n if (req.to !== undefined) tronTx.stringField(4, req.to);\n if (req.memo !== undefined) tronTx.stringField(5, req.memo);\n if (req.value !== undefined) tronTx.stringField(6, req.value);\n tronTx.messageField(7, latestBlock);\n if (req.fee !== undefined) tronTx.varintField(9, req.fee);\n tronTx.bytesField(10, req.rawData);\n\n const signTx = new ProtoWriter()\n .stringField(1, 'TRON')\n .stringField(2, req.signId)\n .stringField(3, req.hdPath)\n .varintField(4, req.timestamp)\n .varintField(5, req.decimals)\n .messageField(8, tronTx.finish())\n .finish();\n\n const payload = new ProtoWriter()\n .varintField(1, PAYLOAD_TYPE_SIGN_TX)\n .stringField(2, req.xfpHex)\n .messageField(4, signTx)\n .finish();\n\n return new ProtoWriter()\n .varintField(1, 2) // Base.version\n .stringField(2, 'QrCode Protocol')\n .messageField(3, payload)\n .finish();\n}\n\nexport interface TronSignResultProto {\n readonly signId: string;\n readonly txId: string;\n readonly rawTx: string;\n}\n\n/** Parse a `keystone-sign-result` Base protobuf. Unknown fields are skipped. */\nexport function decodeSignResultProto(bytes: Uint8Array): TronSignResultProto {\n const base = readFields(bytes);\n const payloadBytes = firstBytes(base, 3);\n if (!payloadBytes) {\n throw new EraSdkError('malformed-reply', 'keystone-sign-result carries no payload');\n }\n const payload = readFields(payloadBytes);\n const resultBytes = firstBytes(payload, 7); // Payload.signTxResult\n if (!resultBytes) {\n return { signId: '', txId: '', rawTx: '' };\n }\n const result = readFields(resultBytes);\n return {\n signId: text(firstBytes(result, 1)),\n txId: text(firstBytes(result, 2)),\n rawTx: text(firstBytes(result, 3)),\n };\n}\n\nfunction text(bytes: Uint8Array | null): string {\n if (!bytes) return '';\n try {\n return utf8Decode(bytes);\n } catch {\n throw new EraSdkError('malformed-reply', 'protobuf string field is not valid UTF-8');\n }\n}\n\nexport interface SignedTronTx {\n /** Verbatim `raw_data` slice — the digest is sha256 over the device's own serialization. */\n readonly rawData: Uint8Array;\n readonly signatures: readonly Uint8Array[];\n}\n\n/**\n * Split a signed Tron network `Transaction` frame (`{1: raw_data, 2: signature*}`)\n * from the reply's `rawTx` hex. Top-level fields must be length-delimited —\n * anything else is not a transaction frame.\n */\nexport function splitSignedTronTx(rawTxHex: string): SignedTronTx {\n let frame: Uint8Array;\n try {\n frame = hexToBytes(rawTxHex);\n } catch {\n throw new EraSdkError('malformed-reply', 'signed Tron transaction is not hex');\n }\n const fields = readFields(frame);\n let rawData: Uint8Array | null = null;\n const signatures: Uint8Array[] = [];\n for (const f of fields) {\n if (f.wireType !== 2) {\n throw new EraSdkError('malformed-reply', 'unexpected wire type in signed Tron transaction');\n }\n if (f.field === 1 && rawData === null) rawData = f.bytes;\n if (f.field === 2) signatures.push(f.bytes);\n }\n if (rawData === null) {\n throw new EraSdkError('malformed-reply', 'signed Tron transaction carries no raw_data');\n }\n return { rawData, signatures };\n}\n"],"mappings":";;;;;;;;;;;AAaA,IAAa,cAAb,MAAyB;;EACvB,KAAiB,QAAsB,CAAC;;CAExC,YAAY,OAAe,OAA8B;EACvD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,OAAO,KAAK,CAAC;EAC5C,OAAO;CACT;CAEA,YAAY,OAAe,OAAqB;EAC9C,MAAM,QAAQ,WAAW,KAAK;EAC9B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,OAAO,MAAM,MAAM,GAAG,KAAK;EAC1D,OAAO;CACT;CAEA,WAAW,OAAe,OAAyB;EACjD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,OAAO,MAAM,MAAM,GAAG,KAAK;EAC1D,OAAO;CACT;CAEA,aAAa,OAAe,SAA2B;EACrD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,OAAO,QAAQ,MAAM,GAAG,OAAO;EAC9D,OAAO;CACT;CAEA,SAAqB;EACnB,OAAO,YAAY,GAAG,KAAK,KAAK;CAClC;AACF;AAEA,SAAS,IAAI,OAAe,UAA8B;CACxD,OAAO,OAAQ,SAAS,IAAK,QAAQ;AACvC;AAEA,SAAgB,OAAO,OAAoC;CACzD,IAAI,IAAI,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;CACpD,IAAI,IAAI,IAAI,MAAM,IAAI,YAAY,kBAAkB,iBAAiB;CACrE,MAAM,MAAgB,CAAC;CACvB,GAAG;EACD,IAAI,OAAO,OAAO,IAAI,IAAK;EAC3B,MAAM;EACN,IAAI,IAAI,IAAI,QAAQ;EACpB,IAAI,KAAK,IAAI;CACf,SAAS,IAAI;CACb,OAAO,IAAI,WAAW,GAAG;AAC3B;;;;;AAeA,SAAgB,WAAW,OAAiC;CAC1D,MAAM,SAAuB,CAAC;CAC9B,IAAI,SAAS;CAEb,MAAM,mBAA2B;EAC/B,IAAI,SAAS;EACb,IAAI,QAAQ;EACZ,SAAS;GACP,MAAM,OAAO,MAAM;GACnB,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,YAAY,kBAAkB,kBAAkB;GAClF,UAAU;GACV,UAAU,OAAO,OAAO,GAAI,KAAK;GACjC,KAAK,OAAO,SAAU,GAAG,OAAO;GAChC,SAAS;GACT,IAAI,QAAQ,KAAK,MAAM,IAAI,YAAY,kBAAkB,wBAAwB;EACnF;CACF;CAEA,OAAO,SAAS,MAAM,QAAQ;EAC5B,MAAM,MAAM,WAAW;EACvB,MAAM,QAAQ,OAAO,OAAO,EAAE;EAC9B,MAAM,WAAW,OAAO,MAAM,EAAE;EAChC,IAAI,UAAU,GAAG,MAAM,IAAI,YAAY,kBAAkB,gBAAgB;EACzE,QAAQ,UAAR;GACE,KAAK;IACH,OAAO,KAAK;KAAE;KAAO;KAAU,OAAO,WAAW;KAAG,OAAO;IAAM,CAAC;IAClE;GAEF,KAAK;IACH,IAAI,SAAS,IAAI,MAAM,QAAQ,MAAM,IAAI,YAAY,kBAAkB,mBAAmB;IAC1F,OAAO,KAAK;KAAE;KAAO;KAAU,OAAO;KAAI,OAAO,MAAM,MAAM,QAAQ,SAAS,CAAC;IAAE,CAAC;IAClF,UAAU;IACV;GAEF,KAAK,GAAG;IACN,MAAM,SAAS,WAAW;IAC1B,IAAI,SAAS,OAAO,MAAM,SAAS,MAAM,GACvC,MAAM,IAAI,YAAY,kBAAkB,sCAAsC;IAEhF,MAAM,MAAM,OAAO,MAAM;IACzB,OAAO,KAAK;KAAE;KAAO;KAAU,OAAO;KAAI,OAAO,MAAM,MAAM,QAAQ,SAAS,GAAG;IAAE,CAAC;IACpF,UAAU;IACV;GACF;GACA,KAAK;IACH,IAAI,SAAS,IAAI,MAAM,QAAQ,MAAM,IAAI,YAAY,kBAAkB,mBAAmB;IAC1F,OAAO,KAAK;KAAE;KAAO;KAAU,OAAO;KAAI,OAAO,MAAM,MAAM,QAAQ,SAAS,CAAC;IAAE,CAAC;IAClF,UAAU;IACV;GAEF,SACE,MAAM,IAAI,YAAY,kBAAkB,yBAAyB,UAAU;EAC/E;CACF;CACA,OAAO;AACT;AAEA,MAAM,wBAAQ,IAAI,WAAW,CAAC;;AAG9B,SAAgB,WAAW,QAAsB,OAAkC;CACjF,KAAK,MAAM,KAAK,QACd,IAAI,EAAE,UAAU,SAAS,EAAE,aAAa,GAAG,OAAO,EAAE;CAEtD,OAAO;AACT;;AAGA,SAAgB,YAAY,QAAsB,OAA8B;CAC9E,KAAK,MAAM,KAAK,QACd,IAAI,EAAE,UAAU,SAAS,EAAE,aAAa,GAAG,OAAO,EAAE;CAEtD,OAAO;AACT;;;ACzGA,MAAM,uBAAuB;AAE7B,SAAgB,uBAAuB,KAAuC;CAC5E,IAAI,IAAI,QAAQ,KAAA,MAAc,IAAI,MAAM,KAAK,IAAI,MAAM,aACrD,MAAM,IAAI,YAAY,iBAAiB,oCAAoC;CAE7E,MAAM,cAAc,IAAI,YAAY,CAAC,CAClC,YAAY,GAAG,IAAI,YAAY,IAAI,CAAC,CACpC,YAAY,GAAG,IAAI,YAAY,MAAM,CAAC,CACtC,YAAY,GAAG,IAAI,YAAY,SAAS,CAAC,CACzC,OAAO;CAEV,MAAM,SAAS,IAAI,YAAY,CAAC,CAAC,YAAY,GAAG,IAAI,KAAK;CACzD,IAAI,IAAI,oBAAoB,KAAA,GAAW,OAAO,YAAY,GAAG,IAAI,eAAe;CAChF,IAAI,IAAI,SAAS,KAAA,GAAW,OAAO,YAAY,GAAG,IAAI,IAAI;CAC1D,IAAI,IAAI,OAAO,KAAA,GAAW,OAAO,YAAY,GAAG,IAAI,EAAE;CACtD,IAAI,IAAI,SAAS,KAAA,GAAW,OAAO,YAAY,GAAG,IAAI,IAAI;CAC1D,IAAI,IAAI,UAAU,KAAA,GAAW,OAAO,YAAY,GAAG,IAAI,KAAK;CAC5D,OAAO,aAAa,GAAG,WAAW;CAClC,IAAI,IAAI,QAAQ,KAAA,GAAW,OAAO,YAAY,GAAG,IAAI,GAAG;CACxD,OAAO,WAAW,IAAI,IAAI,OAAO;CAEjC,MAAM,SAAS,IAAI,YAAY,CAAC,CAC7B,YAAY,GAAG,MAAM,CAAC,CACtB,YAAY,GAAG,IAAI,MAAM,CAAC,CAC1B,YAAY,GAAG,IAAI,MAAM,CAAC,CAC1B,YAAY,GAAG,IAAI,SAAS,CAAC,CAC7B,YAAY,GAAG,IAAI,QAAQ,CAAC,CAC5B,aAAa,GAAG,OAAO,OAAO,CAAC,CAAC,CAChC,OAAO;CAEV,MAAM,UAAU,IAAI,YAAY,CAAC,CAC9B,YAAY,GAAG,oBAAoB,CAAC,CACpC,YAAY,GAAG,IAAI,MAAM,CAAC,CAC1B,aAAa,GAAG,MAAM,CAAC,CACvB,OAAO;CAEV,OAAO,IAAI,YAAY,CAAC,CACrB,YAAY,GAAG,CAAC,CAAC,CACjB,YAAY,GAAG,iBAAiB,CAAC,CACjC,aAAa,GAAG,OAAO,CAAC,CACxB,OAAO;AACZ;;AASA,SAAgB,sBAAsB,OAAwC;CAE5E,MAAM,eAAe,WADR,WAAW,KACQ,GAAM,CAAC;CACvC,IAAI,CAAC,cACH,MAAM,IAAI,YAAY,mBAAmB,yCAAyC;CAGpF,MAAM,cAAc,WADJ,WAAW,YACI,GAAS,CAAC;CACzC,IAAI,CAAC,aACH,OAAO;EAAE,QAAQ;EAAI,MAAM;EAAI,OAAO;CAAG;CAE3C,MAAM,SAAS,WAAW,WAAW;CACrC,OAAO;EACL,QAAQ,KAAK,WAAW,QAAQ,CAAC,CAAC;EAClC,MAAM,KAAK,WAAW,QAAQ,CAAC,CAAC;EAChC,OAAO,KAAK,WAAW,QAAQ,CAAC,CAAC;CACnC;AACF;AAEA,SAAS,KAAK,OAAkC;CAC9C,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI;EACF,OAAO,WAAW,KAAK;CACzB,QAAQ;EACN,MAAM,IAAI,YAAY,mBAAmB,0CAA0C;CACrF;AACF;;;;;;AAaA,SAAgB,kBAAkB,UAAgC;CAChE,IAAI;CACJ,IAAI;EACF,QAAQ,WAAW,QAAQ;CAC7B,QAAQ;EACN,MAAM,IAAI,YAAY,mBAAmB,oCAAoC;CAC/E;CACA,MAAM,SAAS,WAAW,KAAK;CAC/B,IAAI,UAA6B;CACjC,MAAM,aAA2B,CAAC;CAClC,KAAK,MAAM,KAAK,QAAQ;EACtB,IAAI,EAAE,aAAa,GACjB,MAAM,IAAI,YAAY,mBAAmB,iDAAiD;EAE5F,IAAI,EAAE,UAAU,KAAK,YAAY,MAAM,UAAU,EAAE;EACnD,IAAI,EAAE,UAAU,GAAG,WAAW,KAAK,EAAE,KAAK;CAC5C;CACA,IAAI,YAAY,MACd,MAAM,IAAI,YAAY,mBAAmB,6CAA6C;CAExF,OAAO;EAAE;EAAS;CAAW;AAC/B"}
1
+ {"version":3,"file":"messages-DbnXy3dC.js","names":[],"sources":["../src/tron-proto/wire.ts","../src/tron-proto/messages.ts"],"sourcesContent":["import { concatBytes, utf8Encode } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\n\n/**\n * Minimal protobuf wire codec for the Tron signing envelope. Varint and\n * length-delimited wire types only — the schema uses nothing else.\n *\n * Writer semantics mirror the reference implementation: EXPLICITLY SET fields\n * are written even when they hold default values (a `timestamp` of 0 is\n * `tag, 0x00` on the wire), and fields are emitted in ascending field-number\n * order. Byte-exactness against the golden fixtures depends on both.\n */\n\nexport class ProtoWriter {\n private readonly parts: Uint8Array[] = [];\n\n varintField(field: number, value: number | bigint): this {\n this.parts.push(tag(field, 0), varint(value));\n return this;\n }\n\n stringField(field: number, value: string): this {\n const bytes = utf8Encode(value);\n this.parts.push(tag(field, 2), varint(bytes.length), bytes);\n return this;\n }\n\n bytesField(field: number, value: Uint8Array): this {\n this.parts.push(tag(field, 2), varint(value.length), value);\n return this;\n }\n\n messageField(field: number, encoded: Uint8Array): this {\n this.parts.push(tag(field, 2), varint(encoded.length), encoded);\n return this;\n }\n\n finish(): Uint8Array {\n return concatBytes(...this.parts);\n }\n}\n\nfunction tag(field: number, wireType: number): Uint8Array {\n return varint((field << 3) | wireType);\n}\n\nexport function varint(value: number | bigint): Uint8Array {\n let v = typeof value === 'number' ? BigInt(value) : value;\n if (v < 0n) throw new EraSdkError('protobuf-error', 'negative varint');\n const out: number[] = [];\n do {\n let byte = Number(v & 0x7fn);\n v >>= 7n;\n if (v > 0n) byte |= 0x80;\n out.push(byte);\n } while (v > 0n);\n return new Uint8Array(out);\n}\n\nexport interface ProtoField {\n readonly field: number;\n readonly wireType: number;\n /** Set for wire type 0. */\n readonly value: bigint;\n /** Set for wire type 2 (verbatim slice of the input). */\n readonly bytes: Uint8Array;\n}\n\n/**\n * Hardened field reader: varint shift capped, lengths bounds-checked before\n * slicing, unknown fields skippable by wire type, group wire types refused.\n */\nexport function readFields(bytes: Uint8Array): ProtoField[] {\n const fields: ProtoField[] = [];\n let offset = 0;\n\n const readVarint = (): bigint => {\n let result = 0n;\n let shift = 0n;\n for (;;) {\n const byte = bytes[offset];\n if (byte === undefined) throw new EraSdkError('protobuf-error', 'truncated varint');\n offset += 1;\n result |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) return result;\n shift += 7n;\n if (shift > 63n) throw new EraSdkError('protobuf-error', 'varint exceeds 64 bits');\n }\n };\n\n while (offset < bytes.length) {\n const key = readVarint();\n const field = Number(key >> 3n);\n const wireType = Number(key & 7n);\n if (field === 0) throw new EraSdkError('protobuf-error', 'field number 0');\n switch (wireType) {\n case 0: {\n fields.push({ field, wireType, value: readVarint(), bytes: EMPTY });\n break;\n }\n case 1: {\n if (offset + 8 > bytes.length) throw new EraSdkError('protobuf-error', 'truncated fixed64');\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + 8) });\n offset += 8;\n break;\n }\n case 2: {\n const length = readVarint();\n if (length > BigInt(bytes.length - offset)) {\n throw new EraSdkError('protobuf-error', 'length-delimited field exceeds input');\n }\n const len = Number(length);\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + len) });\n offset += len;\n break;\n }\n case 5: {\n if (offset + 4 > bytes.length) throw new EraSdkError('protobuf-error', 'truncated fixed32');\n fields.push({ field, wireType, value: 0n, bytes: bytes.slice(offset, offset + 4) });\n offset += 4;\n break;\n }\n default:\n throw new EraSdkError('protobuf-error', `unsupported wire type ${wireType}`);\n }\n }\n return fields;\n}\n\nconst EMPTY = new Uint8Array(0);\n\n/** First occurrence of a length-delimited field, or null. */\nexport function firstBytes(fields: ProtoField[], field: number): Uint8Array | null {\n for (const f of fields) {\n if (f.field === field && f.wireType === 2) return f.bytes;\n }\n return null;\n}\n\n/** First occurrence of a varint field, or null. */\nexport function firstVarint(fields: ProtoField[], field: number): bigint | null {\n for (const f of fields) {\n if (f.field === field && f.wireType === 0) return f.value;\n }\n return null;\n}\n","import { hexToBytes, utf8Decode } from '../core/bytes';\nimport { EraSdkError } from '../core/errors';\nimport { firstBytes, ProtoWriter, readFields } from './wire';\n\n/**\n * The Tron signing envelope (\"QrCode Protocol\"):\n * `Base -> Payload -> SignTransaction -> TronTx`, gzip-compressed and wrapped\n * in a `keystone-sign-request` (6101) CBOR map. Schemas are vendored under\n * `proto/tron/`; this codec hand-writes the five messages the wallet side\n * speaks, with reference-exact field emission (explicitly-set defaults ARE\n * written; ascending field order).\n */\n\nexport interface TronLatestBlock {\n /** FULL 64-hex block id of a live now-block (the device slices ref_block_hash from it). */\n readonly hash: string;\n readonly number: number;\n readonly timestamp: number;\n}\n\nexport interface TronSignRequestProto {\n /** Lowercase, ZERO-PADDED 8-hex source fingerprint (the wire demands the string form). */\n readonly xfpHex: string;\n /** Hyphenated UUID string; echoed by the device as the only reply binding. */\n readonly signId: string;\n readonly hdPath: string;\n readonly timestamp: number;\n readonly decimals: number;\n readonly token: string;\n readonly contractAddress?: string | undefined;\n readonly from?: string | undefined;\n readonly to?: string | undefined;\n readonly memo?: string | undefined;\n readonly value?: string | undefined;\n readonly fee?: number | undefined;\n readonly latestBlock: TronLatestBlock;\n /** Serialized `Transaction.raw_data` — the signing source of truth. */\n readonly rawData: Uint8Array;\n}\n\nconst PAYLOAD_TYPE_SIGN_TX = 2;\n\nexport function encodeSignRequestProto(req: TronSignRequestProto): Uint8Array {\n if (req.fee !== undefined && (req.fee < 0 || req.fee > 0x7fffffff)) {\n throw new EraSdkError('invalid-props', 'tron fee must fit a positive int32');\n }\n const latestBlock = new ProtoWriter()\n .stringField(1, req.latestBlock.hash)\n .varintField(2, req.latestBlock.number)\n .varintField(3, req.latestBlock.timestamp)\n .finish();\n\n const tronTx = new ProtoWriter().stringField(1, req.token);\n if (req.contractAddress !== undefined) tronTx.stringField(2, req.contractAddress);\n if (req.from !== undefined) tronTx.stringField(3, req.from);\n if (req.to !== undefined) tronTx.stringField(4, req.to);\n if (req.memo !== undefined) tronTx.stringField(5, req.memo);\n if (req.value !== undefined) tronTx.stringField(6, req.value);\n tronTx.messageField(7, latestBlock);\n if (req.fee !== undefined) tronTx.varintField(9, req.fee);\n tronTx.bytesField(10, req.rawData);\n\n const signTx = new ProtoWriter()\n .stringField(1, 'TRON')\n .stringField(2, req.signId)\n .stringField(3, req.hdPath)\n .varintField(4, req.timestamp)\n .varintField(5, req.decimals)\n .messageField(8, tronTx.finish())\n .finish();\n\n const payload = new ProtoWriter()\n .varintField(1, PAYLOAD_TYPE_SIGN_TX)\n .stringField(2, req.xfpHex)\n .messageField(4, signTx)\n .finish();\n\n return new ProtoWriter()\n .varintField(1, 2) // Base.version\n .stringField(2, 'QrCode Protocol')\n .messageField(3, payload)\n .finish();\n}\n\nexport interface TronSignResultProto {\n readonly signId: string;\n readonly txId: string;\n readonly rawTx: string;\n}\n\n/** Parse a `keystone-sign-result` Base protobuf. Unknown fields are skipped. */\nexport function decodeSignResultProto(bytes: Uint8Array): TronSignResultProto {\n const base = readFields(bytes);\n const payloadBytes = firstBytes(base, 3);\n if (!payloadBytes) {\n throw new EraSdkError('malformed-reply', 'keystone-sign-result carries no payload');\n }\n const payload = readFields(payloadBytes);\n const resultBytes = firstBytes(payload, 7); // Payload.signTxResult\n if (!resultBytes) {\n return { signId: '', txId: '', rawTx: '' };\n }\n const result = readFields(resultBytes);\n return {\n signId: text(firstBytes(result, 1)),\n txId: text(firstBytes(result, 2)),\n rawTx: text(firstBytes(result, 3)),\n };\n}\n\nfunction text(bytes: Uint8Array | null): string {\n if (!bytes) return '';\n try {\n return utf8Decode(bytes);\n } catch {\n throw new EraSdkError('malformed-reply', 'protobuf string field is not valid UTF-8');\n }\n}\n\nexport interface SignedTronTx {\n /** Verbatim `raw_data` slice — the digest is sha256 over the device's own serialization. */\n readonly rawData: Uint8Array;\n readonly signatures: readonly Uint8Array[];\n}\n\n/**\n * Split a signed Tron network `Transaction` frame (`{1: raw_data, 2: signature*}`)\n * from the reply's `rawTx` hex. Top-level fields must be length-delimited —\n * anything else is not a transaction frame.\n */\nexport function splitSignedTronTx(rawTxHex: string): SignedTronTx {\n let frame: Uint8Array;\n try {\n frame = hexToBytes(rawTxHex);\n } catch {\n throw new EraSdkError('malformed-reply', 'signed Tron transaction is not hex');\n }\n const fields = readFields(frame);\n let rawData: Uint8Array | null = null;\n const signatures: Uint8Array[] = [];\n for (const f of fields) {\n if (f.wireType !== 2) {\n throw new EraSdkError('malformed-reply', 'unexpected wire type in signed Tron transaction');\n }\n if (f.field === 1 && rawData === null) rawData = f.bytes;\n if (f.field === 2) signatures.push(f.bytes);\n }\n if (rawData === null) {\n throw new EraSdkError('malformed-reply', 'signed Tron transaction carries no raw_data');\n }\n return { rawData, signatures };\n}\n"],"mappings":"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"}
@@ -88,77 +88,6 @@ function asBool(value) {
88
88
  return v.kind === "bool" ? v.value : void 0;
89
89
  }
90
90
  //#endregion
91
- //#region src/registry/keypath.ts
92
- const PATH_LEVEL = /^(\d+)('?)$/;
93
- const HARDENED_OFFSET = 2147483648;
94
- /** Parse `m/44'/60'/0'/0/5` into levels. Throws `invalid-props` on anything else. */
95
- function parsePath(path) {
96
- if (!path.startsWith("m/")) throw new EraSdkError("invalid-props", `derivation path must start with "m/": ${path}`);
97
- const segments = path.slice(2).split("/");
98
- const levels = [];
99
- for (const segment of segments) {
100
- const match = PATH_LEVEL.exec(segment);
101
- if (!match) throw new EraSdkError("invalid-props", `bad derivation path segment "${segment}"`);
102
- const index = Number(match[1]);
103
- if (!Number.isSafeInteger(index) || index >= HARDENED_OFFSET) throw new EraSdkError("invalid-props", `derivation index out of range in "${segment}"`);
104
- levels.push({
105
- index,
106
- hardened: match[2] === "'"
107
- });
108
- }
109
- if (levels.length === 0) throw new EraSdkError("invalid-props", "derivation path has no levels");
110
- return levels;
111
- }
112
- function formatPath(levels) {
113
- return `m/${levels.map((l) => `${l.index}${l.hardened ? "'" : ""}`).join("/")}`;
114
- }
115
- function pathEquals(a, b) {
116
- if (a.length !== b.length) return false;
117
- return a.every((l, i) => l.index === b[i].index && l.hardened === b[i].hardened);
118
- }
119
- /** Flat `[index, hardened, index, hardened, ...]` component list. */
120
- function pathComponentsCbor(levels) {
121
- const items = [];
122
- for (const level of levels) items.push(cbUint(level.index), cbBool(level.hardened));
123
- return cbArray(items);
124
- }
125
- /** A `crypto-keypath` (tag 304): `{1: components, 2: xfp}` (key 2 omitted when no xfp). */
126
- function keypath304(levels, xfp) {
127
- const entries = [[1, pathComponentsCbor(levels)]];
128
- if (xfp !== void 0) entries.push([2, cbUint(xfp)]);
129
- return cbTag(304, cbMap(entries));
130
- }
131
- /** Parse the flat component list of a `crypto-keypath` back into levels (null on malformed). */
132
- function parsePathComponents(value) {
133
- const items = asArray(value);
134
- if (!items || items.length % 2 !== 0) return null;
135
- const levels = [];
136
- for (let i = 0; i < items.length; i += 2) {
137
- const index = asUint(items[i]);
138
- const hardened = asBool(items[i + 1]);
139
- if (index === void 0 || hardened === void 0 || index >= BigInt(HARDENED_OFFSET)) return null;
140
- levels.push({
141
- index: Number(index),
142
- hardened
143
- });
144
- }
145
- return levels;
146
- }
147
- /** Normalize an xfp given as a u32 int or an 8-hex string into a u32 number. */
148
- function normalizeXfp(xfp) {
149
- if (typeof xfp === "number") {
150
- if (!Number.isSafeInteger(xfp) || xfp < 0 || xfp > 4294967295) throw new EraSdkError("invalid-props", "xfp must be an unsigned 32-bit integer");
151
- return xfp;
152
- }
153
- const hex = xfp.startsWith("0x") ? xfp.slice(2) : xfp;
154
- if (!/^[0-9a-fA-F]{1,8}$/.test(hex)) throw new EraSdkError("invalid-props", "xfp string must be up to 8 hex characters");
155
- return Number.parseInt(hex, 16);
156
- }
157
- /** Lowercase 8-hex form of an xfp (the display / Tron wire form). */
158
- function xfpToHex(xfp) {
159
- return xfp.toString(16).padStart(8, "0");
160
- }
161
- //#endregion
162
91
  //#region src/core/bytes.ts
163
92
  /** Byte helpers. `Uint8Array` end-to-end; no Buffer, no Node built-ins. */
164
93
  function concatBytes(...arrays) {
@@ -1467,6 +1396,6 @@ function requireSignatureBytes(value, what, min, max) {
1467
1396
  return v.value;
1468
1397
  }
1469
1398
  //#endregion
1470
- export { utf8Encode as A, asMap as B, bytesToBigint as C, hexToBytes as D, equalBytes as E, parsePathComponents as F, cbMap as G, asUint as H, pathEquals as I, cbUint as J, cbTag as K, xfpToHex as L, keypath304 as M, normalizeXfp as N, u32be as O, parsePath as P, asArray as R, asciiDecode as S, concatBytes as T, cbArray as U, asText as V, cbBytes as W, stripTags as X, mapGet as Y, EraSdkError as Z, Ur as _, requireSignatureBytes as a, cborDecode as b, resolveRequestId as c, UrScanner as d, AnimatedUr as f, uuidStringify as g, normalizeRequestId as h, requireRequestIdEcho as i, formatPath as j, utf8Decode as k, toUr as l, UrLimits as m, makeSignRequest as n, requireUrType as o, DEFAULT_FRAGMENT_LENGTH as p, cbText as q, requireReplyMap as r, resolveContext as s, DEFAULT_ORIGIN as t, TypedUrScanner as u, parseUrString as v, bytesToHex as w, cborEncode as x, crc32 as y, asBytes as z };
1399
+ export { utf8Encode as A, cbMap as B, bytesToBigint as C, hexToBytes as D, equalBytes as E, asText as F, stripTags as G, cbText as H, asUint as I, EraSdkError as K, cbArray as L, asBool as M, asBytes as N, u32be as O, asMap as P, cbBool as R, asciiDecode as S, concatBytes as T, cbUint as U, cbTag as V, mapGet as W, Ur as _, requireSignatureBytes as a, cborDecode as b, resolveRequestId as c, UrScanner as d, AnimatedUr as f, uuidStringify as g, normalizeRequestId as h, requireRequestIdEcho as i, asArray as j, utf8Decode as k, toUr as l, UrLimits as m, makeSignRequest as n, requireUrType as o, DEFAULT_FRAGMENT_LENGTH as p, requireReplyMap as r, resolveContext as s, DEFAULT_ORIGIN as t, TypedUrScanner as u, parseUrString as v, bytesToHex as w, cborEncode as x, crc32 as y, cbBytes as z };
1471
1400
 
1472
- //# sourceMappingURL=shared-B8Wc7ViU.js.map
1401
+ //# sourceMappingURL=shared-Bbgejrus.js.map