@babylonlabs-io/ts-sdk 1.0.0 → 1.2.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 (154) hide show
  1. package/dist/{signPsbtsWithFallback-DoRbHHua.js → PayoutManager-CHTOwj0E.js} +25 -25
  2. package/dist/PayoutManager-CHTOwj0E.js.map +1 -0
  3. package/dist/PayoutManager-CpfQjtL0.cjs +2 -0
  4. package/dist/PayoutManager-CpfQjtL0.cjs.map +1 -0
  5. package/dist/PeginManager-6tjlGd0t.cjs +2 -0
  6. package/dist/PeginManager-6tjlGd0t.cjs.map +1 -0
  7. package/dist/{PeginManager-BH_AKu4l.js → PeginManager-DEldv_Ro.js} +21 -20
  8. package/dist/PeginManager-DEldv_Ro.js.map +1 -0
  9. package/dist/buildAndBroadcastReclaim-BwT6Jxp5.cjs +2 -0
  10. package/dist/buildAndBroadcastReclaim-BwT6Jxp5.cjs.map +1 -0
  11. package/dist/buildAndBroadcastReclaim-CqO2DoP8.js +1919 -0
  12. package/dist/buildAndBroadcastReclaim-CqO2DoP8.js.map +1 -0
  13. package/dist/challengeAssert-Cp_GeRg8.js.map +1 -1
  14. package/dist/challengeAssert-Z7_YULBb.cjs.map +1 -1
  15. package/dist/deriveVaultRoot-BwbXmN0x.js +79 -0
  16. package/dist/{parseFundingOutpoints-BwC3foxS.cjs.map → deriveVaultRoot-BwbXmN0x.js.map} +1 -1
  17. package/dist/deriveVaultRoot-DvhkHzNb.cjs +2 -0
  18. package/dist/deriveVaultRoot-DvhkHzNb.cjs.map +1 -0
  19. package/dist/index.cjs +1 -1
  20. package/dist/index.js +286 -268
  21. package/dist/index.js.map +1 -1
  22. package/dist/noPayout-DAWBQ0eG.cjs.map +1 -1
  23. package/dist/noPayout-qBXWKwav.js.map +1 -1
  24. package/dist/onChainBtcPubkey-BXry_CM4.cjs +2 -0
  25. package/dist/onChainBtcPubkey-BXry_CM4.cjs.map +1 -0
  26. package/dist/onChainBtcPubkey-C1WqyxPM.js +159 -0
  27. package/dist/onChainBtcPubkey-C1WqyxPM.js.map +1 -0
  28. package/dist/parseFundingOutpoints-C_-PT9BT.cjs +2 -0
  29. package/dist/parseFundingOutpoints-C_-PT9BT.cjs.map +1 -0
  30. package/dist/parseFundingOutpoints-GSM-IaaK.js +17 -0
  31. package/dist/parseFundingOutpoints-GSM-IaaK.js.map +1 -0
  32. package/dist/{pegin-registration-client-pcczkzMg.js → pegin-registration-client-1sZ-74UC.js} +260 -383
  33. package/dist/pegin-registration-client-1sZ-74UC.js.map +1 -0
  34. package/dist/pegin-registration-client-BNV44jzw.cjs +2 -0
  35. package/dist/pegin-registration-client-BNV44jzw.cjs.map +1 -0
  36. package/dist/signing-3l5Aqd-H.cjs +2 -0
  37. package/dist/signing-3l5Aqd-H.cjs.map +1 -0
  38. package/dist/signing-Dhr2t0Z6.js +39 -0
  39. package/dist/signing-Dhr2t0Z6.js.map +1 -0
  40. package/dist/tbv/core/clients/eth/index.cjs +1 -1
  41. package/dist/tbv/core/clients/eth/index.js +8 -8
  42. package/dist/tbv/core/clients/index.cjs +1 -1
  43. package/dist/tbv/core/clients/index.js +8 -8
  44. package/dist/tbv/core/index.cjs +1 -1
  45. package/dist/tbv/core/index.js +284 -266
  46. package/dist/tbv/core/index.js.map +1 -1
  47. package/dist/tbv/core/managers/PayoutManager.d.ts +1 -1
  48. package/dist/tbv/core/managers/PeginManager.d.ts +1 -1
  49. package/dist/tbv/core/managers/index.cjs +1 -1
  50. package/dist/tbv/core/managers/index.js +2 -2
  51. package/dist/tbv/core/primitives/index.d.ts +1 -1
  52. package/dist/tbv/core/primitives/psbt/challengeAssert.d.ts +2 -2
  53. package/dist/tbv/core/primitives/psbt/challengeAssert.d.ts.map +1 -1
  54. package/dist/tbv/core/primitives/psbt/noPayout.d.ts +1 -1
  55. package/dist/tbv/core/primitives/psbt/noPayout.d.ts.map +1 -1
  56. package/dist/tbv/core/primitives/psbt/payout.d.ts +13 -7
  57. package/dist/tbv/core/primitives/psbt/payout.d.ts.map +1 -1
  58. package/dist/tbv/core/services/delegated-claim/__tests__/assembleWatchtowerArtifacts.test.d.ts +15 -0
  59. package/dist/tbv/core/services/delegated-claim/__tests__/assembleWatchtowerArtifacts.test.d.ts.map +1 -0
  60. package/dist/tbv/core/services/delegated-claim/__tests__/deriveClaimerWotsKeypair.test.d.ts +11 -0
  61. package/dist/tbv/core/services/delegated-claim/__tests__/deriveClaimerWotsKeypair.test.d.ts.map +1 -0
  62. package/dist/tbv/core/services/delegated-claim/__tests__/readWatchtowerArtifacts.test.d.ts +10 -0
  63. package/dist/tbv/core/services/delegated-claim/__tests__/readWatchtowerArtifacts.test.d.ts.map +1 -0
  64. package/dist/tbv/core/services/delegated-claim/__tests__/vaultIdBinding.test.d.ts +10 -0
  65. package/dist/tbv/core/services/delegated-claim/__tests__/vaultIdBinding.test.d.ts.map +1 -0
  66. package/dist/tbv/core/services/delegated-claim/__tests__/wotsKeypair.golden.test.d.ts +11 -0
  67. package/dist/tbv/core/services/delegated-claim/__tests__/wotsKeypair.golden.test.d.ts.map +1 -0
  68. package/dist/tbv/core/services/delegated-claim/assembleWatchtowerArtifacts.d.ts +46 -0
  69. package/dist/tbv/core/services/delegated-claim/assembleWatchtowerArtifacts.d.ts.map +1 -0
  70. package/dist/tbv/core/services/delegated-claim/challengerBinding.d.ts +72 -0
  71. package/dist/tbv/core/services/delegated-claim/challengerBinding.d.ts.map +1 -0
  72. package/dist/tbv/core/services/delegated-claim/deriveClaimerWotsKeypair.d.ts +63 -0
  73. package/dist/tbv/core/services/delegated-claim/deriveClaimerWotsKeypair.d.ts.map +1 -0
  74. package/dist/tbv/core/services/delegated-claim/index.d.ts +55 -0
  75. package/dist/tbv/core/services/delegated-claim/index.d.ts.map +1 -0
  76. package/dist/tbv/core/services/delegated-claim/payoutBinding.d.ts +65 -0
  77. package/dist/tbv/core/services/delegated-claim/payoutBinding.d.ts.map +1 -0
  78. package/dist/tbv/core/services/delegated-claim/readWatchtowerArtifacts.d.ts +70 -0
  79. package/dist/tbv/core/services/delegated-claim/readWatchtowerArtifacts.d.ts.map +1 -0
  80. package/dist/tbv/core/services/delegated-claim/types.d.ts +105 -0
  81. package/dist/tbv/core/services/delegated-claim/types.d.ts.map +1 -0
  82. package/dist/tbv/core/services/delegated-claim/vaultIdBinding.d.ts +44 -0
  83. package/dist/tbv/core/services/delegated-claim/vaultIdBinding.d.ts.map +1 -0
  84. package/dist/tbv/core/services/index.cjs +1 -1
  85. package/dist/tbv/core/services/index.d.ts +1 -0
  86. package/dist/tbv/core/services/index.d.ts.map +1 -1
  87. package/dist/tbv/core/services/index.js +73 -56
  88. package/dist/tbv/core/services/index.js.map +1 -1
  89. package/dist/tbv/core/utils/index.cjs +1 -1
  90. package/dist/tbv/core/utils/index.js +44 -43
  91. package/dist/tbv/core/utils/signing.d.ts +24 -0
  92. package/dist/tbv/core/utils/signing.d.ts.map +1 -1
  93. package/dist/tbv/core/vault-secrets/index.cjs +1 -1
  94. package/dist/tbv/core/vault-secrets/index.js +9 -8
  95. package/dist/tbv/core/vault-secrets/index.js.map +1 -1
  96. package/dist/tbv/core/wasm/index.cjs +1 -1
  97. package/dist/tbv/core/wasm/index.cjs.map +1 -1
  98. package/dist/tbv/core/wasm/index.d.ts +102 -5
  99. package/dist/tbv/core/wasm/index.d.ts.map +1 -1
  100. package/dist/tbv/core/wasm/index.js +170 -73
  101. package/dist/tbv/core/wasm/index.js.map +1 -1
  102. package/dist/tbv/index.cjs +1 -1
  103. package/dist/tbv/index.js +284 -266
  104. package/dist/tbv/index.js.map +1 -1
  105. package/dist/tbv/integrations/aave/clients/abis/AaveSpoke.abi.json.d.ts +18 -0
  106. package/dist/tbv/integrations/aave/clients/index.d.ts +1 -1
  107. package/dist/tbv/integrations/aave/clients/index.d.ts.map +1 -1
  108. package/dist/tbv/integrations/aave/clients/spoke.d.ts +17 -0
  109. package/dist/tbv/integrations/aave/clients/spoke.d.ts.map +1 -1
  110. package/dist/tbv/integrations/aave/constants.d.ts +8 -0
  111. package/dist/tbv/integrations/aave/constants.d.ts.map +1 -1
  112. package/dist/tbv/integrations/aave/index.cjs +1 -1
  113. package/dist/tbv/integrations/aave/index.cjs.map +1 -1
  114. package/dist/tbv/integrations/aave/index.d.ts +2 -2
  115. package/dist/tbv/integrations/aave/index.d.ts.map +1 -1
  116. package/dist/tbv/integrations/aave/index.js +119 -110
  117. package/dist/tbv/integrations/aave/index.js.map +1 -1
  118. package/dist/tbv/integrations/aave/types.d.ts +1 -1
  119. package/dist/toRefundInputs-BaN9XluU.cjs +2 -0
  120. package/dist/{toRefundInputs-DEPXcrgO.cjs.map → toRefundInputs-BaN9XluU.cjs.map} +1 -1
  121. package/dist/{toRefundInputs-BEulLgN_.js → toRefundInputs-mtuuYezp.js} +23 -22
  122. package/dist/{toRefundInputs-BEulLgN_.js.map → toRefundInputs-mtuuYezp.js.map} +1 -1
  123. package/dist/{types-B9YhlXe8.js → types-BdCEoANP.js} +2 -2
  124. package/dist/{types-B9YhlXe8.js.map → types-BdCEoANP.js.map} +1 -1
  125. package/dist/{types-C1tpDycc.cjs → types-BuxreSq4.cjs} +2 -2
  126. package/dist/{types-C1tpDycc.cjs.map → types-BuxreSq4.cjs.map} +1 -1
  127. package/dist/verifyScriptPathSchnorrSignature-BKZihCjk.cjs.map +1 -1
  128. package/dist/verifyScriptPathSchnorrSignature-CpjSTfMj.js.map +1 -1
  129. package/package.json +3 -3
  130. package/dist/PeginManager-BCJWwV05.cjs +0 -2
  131. package/dist/PeginManager-BCJWwV05.cjs.map +0 -1
  132. package/dist/PeginManager-BH_AKu4l.js.map +0 -1
  133. package/dist/buildAndBroadcastReclaim-DLsf5hjO.cjs +0 -2
  134. package/dist/buildAndBroadcastReclaim-DLsf5hjO.cjs.map +0 -1
  135. package/dist/buildAndBroadcastReclaim-OMvihzJg.js +0 -1545
  136. package/dist/buildAndBroadcastReclaim-OMvihzJg.js.map +0 -1
  137. package/dist/onChainBtcPubkey-BbxRrbvg.cjs +0 -2
  138. package/dist/onChainBtcPubkey-BbxRrbvg.cjs.map +0 -1
  139. package/dist/onChainBtcPubkey-C-6UWpD8.js +0 -34
  140. package/dist/onChainBtcPubkey-C-6UWpD8.js.map +0 -1
  141. package/dist/parseFundingOutpoints-BwC3foxS.cjs +0 -2
  142. package/dist/parseFundingOutpoints-CC4NKYz2.js +0 -93
  143. package/dist/parseFundingOutpoints-CC4NKYz2.js.map +0 -1
  144. package/dist/pegin-registration-client-CZgcU2_0.cjs +0 -2
  145. package/dist/pegin-registration-client-CZgcU2_0.cjs.map +0 -1
  146. package/dist/pegin-registration-client-pcczkzMg.js.map +0 -1
  147. package/dist/signPsbtsWithFallback-DoRbHHua.js.map +0 -1
  148. package/dist/signPsbtsWithFallback-FwrTYZS4.cjs +0 -2
  149. package/dist/signPsbtsWithFallback-FwrTYZS4.cjs.map +0 -1
  150. package/dist/signing-BJ3X66b-.cjs +0 -2
  151. package/dist/signing-BJ3X66b-.cjs.map +0 -1
  152. package/dist/signing-Cm-McVR2.js +0 -22
  153. package/dist/signing-Cm-McVR2.js.map +0 -1
  154. package/dist/toRefundInputs-DEPXcrgO.cjs +0 -2
@@ -0,0 +1,159 @@
1
+ import { s as x } from "./sha2-CLpQd0Rd.js";
2
+ import { isAddress as v, keccak256 as m, encodeAbiParameters as E } from "viem";
3
+ function y(r, t) {
4
+ const e = r.startsWith("0x") ? r.slice(2) : r;
5
+ if (e.length === 0 || e.length % 2 !== 0)
6
+ throw new Error(`${t} must be non-empty, even-length hex`);
7
+ if (!/^[0-9a-fA-F]+$/.test(e))
8
+ throw new Error(`${t} contains non-hex characters`);
9
+ const o = new Uint8Array(e.length / 2);
10
+ for (let s = 0; s < o.length; s++)
11
+ o[s] = Number.parseInt(e.slice(s * 2, s * 2 + 2), 16);
12
+ return o;
13
+ }
14
+ function C(r) {
15
+ return Array.from(r, (t) => t.toString(16).padStart(2, "0")).join(
16
+ ""
17
+ );
18
+ }
19
+ function I(r) {
20
+ const t = new Uint8Array(
21
+ r.reduce((o, s) => o + s.length, 0)
22
+ );
23
+ let e = 0;
24
+ for (const o of r)
25
+ t.set(o, e), e += o.length;
26
+ return t;
27
+ }
28
+ function B(r) {
29
+ let t = 0;
30
+ const e = (n, f) => {
31
+ if (!Number.isSafeInteger(n) || n < 0)
32
+ throw new Error(`Invalid ${f} length ${n}`);
33
+ if (t + n > r.length)
34
+ throw new Error(`Truncated Bitcoin transaction while reading ${f}`);
35
+ const c = r.slice(t, t + n);
36
+ return t += n, c;
37
+ }, o = (n, f) => {
38
+ const c = e(n, f);
39
+ let i = 0n;
40
+ for (let l = c.length - 1; l >= 0; l--)
41
+ i = i << 8n | BigInt(c[l]);
42
+ return i;
43
+ }, s = (n) => {
44
+ const f = t, c = e(1, n)[0];
45
+ let i;
46
+ if (c < 253)
47
+ i = BigInt(c);
48
+ else if (c === 253) {
49
+ if (i = o(2, n), i < 0xfdn) throw new Error(`Non-canonical ${n}`);
50
+ } else if (c === 254) {
51
+ if (i = o(4, n), i <= 0xffffn) throw new Error(`Non-canonical ${n}`);
52
+ } else if (i = o(8, n), i <= 0xffffffffn) throw new Error(`Non-canonical ${n}`);
53
+ if (i > BigInt(Number.MAX_SAFE_INTEGER))
54
+ throw new Error(`${n} exceeds JavaScript's safe integer range`);
55
+ return {
56
+ encoded: r.slice(f, t),
57
+ value: Number(i)
58
+ };
59
+ }, a = e(4, "version"), p = r[t] === 0 && r[t + 1] === 1;
60
+ p && (t += 2);
61
+ const h = s("input count"), d = [];
62
+ for (let n = 0; n < h.value; n++) {
63
+ const f = t;
64
+ e(32, `input ${n} previous transaction hash`), e(4, `input ${n} previous output index`);
65
+ const c = s(`input ${n} script length`);
66
+ e(c.value, `input ${n} script`), e(4, `input ${n} sequence`), d.push(r.slice(f, t));
67
+ }
68
+ const w = s("output count"), $ = [];
69
+ for (let n = 0; n < w.value; n++) {
70
+ const f = t;
71
+ e(8, `output ${n} value`);
72
+ const c = s(`output ${n} script length`);
73
+ e(c.value, `output ${n} script`), $.push(r.slice(f, t));
74
+ }
75
+ if (p) {
76
+ let n = !1;
77
+ for (let f = 0; f < h.value; f++) {
78
+ const c = s(`input ${f} witness item count`);
79
+ n || (n = c.value > 0);
80
+ for (let i = 0; i < c.value; i++) {
81
+ const l = s(
82
+ `input ${f} witness item ${i} length`
83
+ );
84
+ e(l.value, `input ${f} witness item ${i}`);
85
+ }
86
+ }
87
+ if (!n)
88
+ throw new Error("Bitcoin transaction has superfluous witness marker");
89
+ }
90
+ const g = e(4, "locktime");
91
+ if (t !== r.length)
92
+ throw new Error(
93
+ `Bitcoin transaction has ${r.length - t} trailing byte(s)`
94
+ );
95
+ return I([
96
+ a,
97
+ h.encoded,
98
+ ...d,
99
+ w.encoded,
100
+ ...$,
101
+ g
102
+ ]);
103
+ }
104
+ function W(r) {
105
+ const t = B(
106
+ y(r, "transactionHex")
107
+ ), e = x(x(t));
108
+ return e.reverse(), `0x${C(e)}`;
109
+ }
110
+ function L(r, t) {
111
+ const e = r.startsWith("0x") ? r : `0x${r}`;
112
+ if (!/^0x[0-9a-fA-F]{64}$/.test(e))
113
+ throw new Error("peginTxHash must be a 32-byte hex value");
114
+ const o = t.startsWith("0x") ? t : `0x${t}`;
115
+ if (!v(o, { strict: !0 }))
116
+ throw new Error(`Invalid depositor Ethereum address: ${t}`);
117
+ return m(
118
+ E(
119
+ [{ type: "bytes32" }, { type: "address" }],
120
+ [e, o]
121
+ )
122
+ ).slice(2);
123
+ }
124
+ const u = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn, k = 7n;
125
+ function A(r, t, e) {
126
+ let o = 1n, s = r % e, a = t;
127
+ for (; a > 0n; )
128
+ (a & 1n) === 1n && (o = o * s % e), s = s * s % e, a >>= 1n;
129
+ return o;
130
+ }
131
+ function S(r) {
132
+ const t = BigInt(`0x${r}`);
133
+ if (t >= u) return !1;
134
+ const o = (t * t % u * t % u + k) % u, s = A(
135
+ o,
136
+ u + 1n >> 2n,
137
+ u
138
+ );
139
+ return s * s % u === o;
140
+ }
141
+ function _(r, t) {
142
+ const e = r.toLowerCase();
143
+ if (!/^0x[0-9a-f]{64}$/.test(e))
144
+ throw new Error(
145
+ `${t} returned an unexpected value (length ${e.length}, prefix "${e.slice(0, 2)}")`
146
+ );
147
+ const o = e.slice(2);
148
+ if (!S(o))
149
+ throw new Error(
150
+ `${t} returned a value that is not on the secp256k1 curve`
151
+ );
152
+ return o;
153
+ }
154
+ export {
155
+ _ as a,
156
+ W as c,
157
+ L as d
158
+ };
159
+ //# sourceMappingURL=onChainBtcPubkey-C1WqyxPM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onChainBtcPubkey-C1WqyxPM.js","sources":["../src/tbv/core/clients/eth/pegin-transaction.ts","../src/tbv/core/clients/eth/onChainBtcPubkey.ts"],"sourcesContent":["/**\n * Dependency-free Bitcoin txid and vault-ID helpers for Ethereum-only clients.\n * Transaction hex and vault-ID inputs accept an optional `0x` prefix.\n * Depositor addresses use strict EIP-55 validation.\n * Txids use a `0x` prefix. Vault IDs use no prefix. Both use lowercase hex.\n */\n\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport {\n encodeAbiParameters,\n isAddress,\n keccak256,\n type Address,\n type Hex,\n} from \"viem\";\n\n/** Decode an optional-prefixed, even-length hex string. */\nfunction decodeHex(value: string, label: string): Uint8Array {\n const clean = value.startsWith(\"0x\") ? value.slice(2) : value;\n if (clean.length === 0 || clean.length % 2 !== 0) {\n throw new Error(`${label} must be non-empty, even-length hex`);\n }\n if (!/^[0-9a-fA-F]+$/.test(clean)) {\n throw new Error(`${label} contains non-hex characters`);\n }\n\n const bytes = new Uint8Array(clean.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/** Encode bytes as lowercase hex without a prefix. */\nfunction encodeHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n}\n\n/** Concatenate byte chunks without a buffer dependency. */\nfunction concatBytes(chunks: readonly Uint8Array[]): Uint8Array {\n const result = new Uint8Array(\n chunks.reduce((length, chunk) => length + chunk.length, 0),\n );\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n/**\n * Parse enough of Bitcoin's consensus transaction encoding to serialize the\n * no-witness form used for txid calculation. Every length is bounds-checked;\n * malformed/trailing data is rejected rather than hashed as an opaque blob.\n */\nfunction serializeWithoutWitness(transaction: Uint8Array): Uint8Array {\n let offset = 0;\n\n const take = (length: number, label: string): Uint8Array => {\n if (!Number.isSafeInteger(length) || length < 0) {\n throw new Error(`Invalid ${label} length ${length}`);\n }\n if (offset + length > transaction.length) {\n throw new Error(`Truncated Bitcoin transaction while reading ${label}`);\n }\n const value = transaction.slice(offset, offset + length);\n offset += length;\n return value;\n };\n\n const readLittleEndian = (length: number, label: string): bigint => {\n const bytes = take(length, label);\n let value = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) {\n value = (value << 8n) | BigInt(bytes[i]);\n }\n return value;\n };\n\n const readCompactSize = (\n label: string,\n ): { encoded: Uint8Array; value: number } => {\n const start = offset;\n const prefix = take(1, label)[0];\n let value: bigint;\n if (prefix < 0xfd) {\n value = BigInt(prefix);\n } else if (prefix === 0xfd) {\n value = readLittleEndian(2, label);\n if (value < 0xfdn) throw new Error(`Non-canonical ${label}`);\n } else if (prefix === 0xfe) {\n value = readLittleEndian(4, label);\n if (value <= 0xffffn) throw new Error(`Non-canonical ${label}`);\n } else {\n value = readLittleEndian(8, label);\n if (value <= 0xffffffffn) throw new Error(`Non-canonical ${label}`);\n }\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`${label} exceeds JavaScript's safe integer range`);\n }\n return {\n encoded: transaction.slice(start, offset),\n value: Number(value),\n };\n };\n\n const version = take(4, \"version\");\n const hasWitness =\n transaction[offset] === 0x00 && transaction[offset + 1] === 0x01;\n if (hasWitness) offset += 2;\n\n const inputCount = readCompactSize(\"input count\");\n const inputs: Uint8Array[] = [];\n for (let i = 0; i < inputCount.value; i++) {\n const start = offset;\n take(32, `input ${i} previous transaction hash`);\n take(4, `input ${i} previous output index`);\n const scriptLength = readCompactSize(`input ${i} script length`);\n take(scriptLength.value, `input ${i} script`);\n take(4, `input ${i} sequence`);\n inputs.push(transaction.slice(start, offset));\n }\n\n const outputCount = readCompactSize(\"output count\");\n const outputs: Uint8Array[] = [];\n for (let i = 0; i < outputCount.value; i++) {\n const start = offset;\n take(8, `output ${i} value`);\n const scriptLength = readCompactSize(`output ${i} script length`);\n take(scriptLength.value, `output ${i} script`);\n outputs.push(transaction.slice(start, offset));\n }\n\n if (hasWitness) {\n let hasWitnessData = false;\n for (let i = 0; i < inputCount.value; i++) {\n const itemCount = readCompactSize(`input ${i} witness item count`);\n hasWitnessData ||= itemCount.value > 0;\n for (let j = 0; j < itemCount.value; j++) {\n const itemLength = readCompactSize(\n `input ${i} witness item ${j} length`,\n );\n take(itemLength.value, `input ${i} witness item ${j}`);\n }\n }\n if (!hasWitnessData) {\n throw new Error(\"Bitcoin transaction has superfluous witness marker\");\n }\n }\n\n const locktime = take(4, \"locktime\");\n if (offset !== transaction.length) {\n throw new Error(\n `Bitcoin transaction has ${transaction.length - offset} trailing byte(s)`,\n );\n }\n\n return concatBytes([\n version,\n inputCount.encoded,\n ...inputs,\n outputCount.encoded,\n ...outputs,\n locktime,\n ]);\n}\n\n/** Calculate a Bitcoin txid without importing bitcoinjs-lib. */\nexport function calculateBtcTxHash(transactionHex: string): Hex {\n const serialized = serializeWithoutWitness(\n decodeHex(transactionHex, \"transactionHex\"),\n );\n const digest = sha256(sha256(serialized));\n digest.reverse();\n return `0x${encodeHex(digest)}`;\n}\n\n/**\n * Derive the Solidity vault ID without loading the Rust/WASM package.\n *\n * Inputs accept an optional `0x` prefix to match the current PeginManager\n * call sites. Address validation stays strict: lowercase and valid EIP-55\n * addresses pass, while uppercase and incorrectly checksummed mixed-case\n * addresses fail. The synchronous result is lowercase hex without a prefix,\n * matching the WASM helper that this function replaces.\n */\nexport function derivePeginVaultId(\n peginTxHash: string,\n depositor: string,\n): string {\n const normalizedPeginTxHash = peginTxHash.startsWith(\"0x\")\n ? peginTxHash\n : `0x${peginTxHash}`;\n if (!/^0x[0-9a-fA-F]{64}$/.test(normalizedPeginTxHash)) {\n throw new Error(\"peginTxHash must be a 32-byte hex value\");\n }\n const normalizedDepositor = depositor.startsWith(\"0x\")\n ? depositor\n : `0x${depositor}`;\n if (!isAddress(normalizedDepositor, { strict: true })) {\n throw new Error(`Invalid depositor Ethereum address: ${depositor}`);\n }\n return keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"address\" }],\n [normalizedPeginTxHash as Hex, normalizedDepositor as Address],\n ),\n ).slice(2);\n}\n","/**\n * The single validator that mints {@link OnChainBtcPubkey}.\n *\n * Extracted from `ViemVaultRegistryReader.getVaultProviderGenesisBtcPubKey` so that\n * RFC-006 operation-key resolution can produce branded keys through exactly\n * the same checks, rather than casting past the brand. Every producer of an\n * `OnChainBtcPubkey` must go through here.\n */\n\nimport type { Hex } from \"viem\";\n\nimport type { OnChainBtcPubkey } from \"./types\";\n\n/** secp256k1's base-field prime, `2^256 - 2^32 - 977`. */\nconst SECP256K1_FIELD_PRIME =\n 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn;\n\n/** secp256k1's curve coefficient `b`, from `y^2 = x^3 + b`. */\nconst SECP256K1_CURVE_B = 7n;\n\n/** Modular exponentiation without a crypto-library dependency. */\nfunction modPow(base: bigint, exponent: bigint, modulus: bigint): bigint {\n let result = 1n;\n let factor = base % modulus;\n let remaining = exponent;\n\n while (remaining > 0n) {\n if ((remaining & 1n) === 1n) {\n result = (result * factor) % modulus;\n }\n factor = (factor * factor) % modulus;\n remaining >>= 1n;\n }\n\n return result;\n}\n\n/**\n * secp256k1's field prime is congruent to 3 mod 4, so an x-coordinate is on\n * the curve iff `(x^3 + 7)^((p + 1) / 4)` squares back to `x^3 + 7` modulo\n * p. This is the same curve-membership condition used by x-only key parsers;\n * it deliberately does not merely validate length/range.\n * `x^3 + 7` cannot be zero because `-7` is not a cubic residue in this field,\n * so the zero square-root edge case is unreachable.\n */\nfunction isSecp256k1XCoordinate(value: string): boolean {\n const x = BigInt(`0x${value}`);\n if (x >= SECP256K1_FIELD_PRIME) return false;\n\n const xCubed =\n (((x * x) % SECP256K1_FIELD_PRIME) * x) % SECP256K1_FIELD_PRIME;\n const curveValue = (xCubed + SECP256K1_CURVE_B) % SECP256K1_FIELD_PRIME;\n const y = modPow(\n curveValue,\n (SECP256K1_FIELD_PRIME + 1n) >> 2n,\n SECP256K1_FIELD_PRIME,\n );\n\n return (y * y) % SECP256K1_FIELD_PRIME === curveValue;\n}\n\n/**\n * Validate a registry-returned `bytes32` as an x-only BTC pubkey and mint the\n * brand. Checks length, hex form, and secp256k1 curve membership. Returns\n * 64-char lowercase hex without the `0x` prefix.\n *\n * `label` identifies the read site in error messages (e.g.\n * `getOperationBtcKeyAtEpoch (vp=0x…, epoch=0)`), so a failure names which\n * participant and which getter produced it.\n *\n * A zero hash fails the curve check, so an unregistered operator or an epoch\n * with no bonded key surfaces as an error rather than a silent all-zero key.\n */\nexport function assertOnChainBtcPubkey(\n value: Hex,\n label: string,\n): OnChainBtcPubkey {\n const lowered = value.toLowerCase();\n if (!/^0x[0-9a-f]{64}$/.test(lowered)) {\n throw new Error(\n `${label} returned an unexpected value (length ${lowered.length}, prefix \"${lowered.slice(0, 2)}\")`,\n );\n }\n const stripped = lowered.slice(2);\n if (!isSecp256k1XCoordinate(stripped)) {\n throw new Error(\n `${label} returned a value that is not on the secp256k1 curve`,\n );\n }\n return stripped as OnChainBtcPubkey;\n}\n"],"names":["decodeHex","value","label","clean","bytes","i","encodeHex","byte","concatBytes","chunks","result","length","chunk","offset","serializeWithoutWitness","transaction","take","readLittleEndian","readCompactSize","start","prefix","version","hasWitness","inputCount","inputs","scriptLength","outputCount","outputs","hasWitnessData","itemCount","j","itemLength","locktime","calculateBtcTxHash","transactionHex","serialized","digest","sha256","derivePeginVaultId","peginTxHash","depositor","normalizedPeginTxHash","normalizedDepositor","isAddress","keccak256","encodeAbiParameters","SECP256K1_FIELD_PRIME","SECP256K1_CURVE_B","modPow","base","exponent","modulus","factor","remaining","isSecp256k1XCoordinate","x","curveValue","y","assertOnChainBtcPubkey","lowered","stripped"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const o=require("bitcoinjs-lib"),e=require("buffer");function s(r){if(!r)throw new Error("Pre-pegin transaction hex is empty");const i=r.startsWith("0x")?r.slice(2):r,t=o.Transaction.fromHex(i);if(t.ins.length===0)throw new Error("Pre-pegin transaction has no inputs");return t.ins.map(n=>({txid:Uint8Array.from(e.Buffer.from(n.hash).reverse()),vout:n.index}))}exports.parseFundingOutpointsFromTx=s;
2
+ //# sourceMappingURL=parseFundingOutpoints-C_-PT9BT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseFundingOutpoints-C_-PT9BT.cjs","sources":["../src/tbv/core/vault-secrets/parseFundingOutpoints.ts"],"sourcesContent":["/**\n * Parse a Pre-PegIn transaction's inputs into the vault-context\n * `fundingOutpoints` shape consumed by `deriveVaultRoot`. Reverses\n * the prev-txid bytes from wire-internal little-endian to display\n * order so the derivation is byte-for-byte identical to the\n * deposit-time computation.\n *\n * @module vault-secrets/parseFundingOutpoints\n */\n\nimport { Transaction } from \"bitcoinjs-lib\";\nimport { Buffer } from \"buffer\";\n\nimport type { FundingOutpoint } from \"./context\";\n\nexport function parseFundingOutpointsFromTx(\n unsignedTxHex: string,\n): FundingOutpoint[] {\n if (!unsignedTxHex) {\n throw new Error(\"Pre-pegin transaction hex is empty\");\n }\n const cleanHex = unsignedTxHex.startsWith(\"0x\")\n ? unsignedTxHex.slice(2)\n : unsignedTxHex;\n const tx = Transaction.fromHex(cleanHex);\n if (tx.ins.length === 0) {\n throw new Error(\"Pre-pegin transaction has no inputs\");\n }\n return tx.ins.map((input) => ({\n txid: Uint8Array.from(Buffer.from(input.hash).reverse()),\n vout: input.index,\n }));\n}\n"],"names":["parseFundingOutpointsFromTx","unsignedTxHex","cleanHex","tx","Transaction","input","Buffer"],"mappings":"kEAeO,SAASA,EACdC,EACmB,CACnB,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,oCAAoC,EAEtD,MAAMC,EAAWD,EAAc,WAAW,IAAI,EAC1CA,EAAc,MAAM,CAAC,EACrBA,EACEE,EAAKC,EAAAA,YAAY,QAAQF,CAAQ,EACvC,GAAIC,EAAG,IAAI,SAAW,EACpB,MAAM,IAAI,MAAM,qCAAqC,EAEvD,OAAOA,EAAG,IAAI,IAAKE,IAAW,CAC5B,KAAM,WAAW,KAAKC,EAAAA,OAAO,KAAKD,EAAM,IAAI,EAAE,SAAS,EACvD,KAAMA,EAAM,KAAA,EACZ,CACJ"}
@@ -0,0 +1,17 @@
1
+ import { Transaction as i } from "bitcoinjs-lib";
2
+ import { Buffer as e } from "buffer";
3
+ function f(r) {
4
+ if (!r)
5
+ throw new Error("Pre-pegin transaction hex is empty");
6
+ const n = r.startsWith("0x") ? r.slice(2) : r, t = i.fromHex(n);
7
+ if (t.ins.length === 0)
8
+ throw new Error("Pre-pegin transaction has no inputs");
9
+ return t.ins.map((o) => ({
10
+ txid: Uint8Array.from(e.from(o.hash).reverse()),
11
+ vout: o.index
12
+ }));
13
+ }
14
+ export {
15
+ f as p
16
+ };
17
+ //# sourceMappingURL=parseFundingOutpoints-GSM-IaaK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseFundingOutpoints-GSM-IaaK.js","sources":["../src/tbv/core/vault-secrets/parseFundingOutpoints.ts"],"sourcesContent":["/**\n * Parse a Pre-PegIn transaction's inputs into the vault-context\n * `fundingOutpoints` shape consumed by `deriveVaultRoot`. Reverses\n * the prev-txid bytes from wire-internal little-endian to display\n * order so the derivation is byte-for-byte identical to the\n * deposit-time computation.\n *\n * @module vault-secrets/parseFundingOutpoints\n */\n\nimport { Transaction } from \"bitcoinjs-lib\";\nimport { Buffer } from \"buffer\";\n\nimport type { FundingOutpoint } from \"./context\";\n\nexport function parseFundingOutpointsFromTx(\n unsignedTxHex: string,\n): FundingOutpoint[] {\n if (!unsignedTxHex) {\n throw new Error(\"Pre-pegin transaction hex is empty\");\n }\n const cleanHex = unsignedTxHex.startsWith(\"0x\")\n ? unsignedTxHex.slice(2)\n : unsignedTxHex;\n const tx = Transaction.fromHex(cleanHex);\n if (tx.ins.length === 0) {\n throw new Error(\"Pre-pegin transaction has no inputs\");\n }\n return tx.ins.map((input) => ({\n txid: Uint8Array.from(Buffer.from(input.hash).reverse()),\n vout: input.index,\n }));\n}\n"],"names":["parseFundingOutpointsFromTx","unsignedTxHex","cleanHex","tx","Transaction","input","Buffer"],"mappings":";;AAeO,SAASA,EACdC,GACmB;AACnB,MAAI,CAACA;AACH,UAAM,IAAI,MAAM,oCAAoC;AAEtD,QAAMC,IAAWD,EAAc,WAAW,IAAI,IAC1CA,EAAc,MAAM,CAAC,IACrBA,GACEE,IAAKC,EAAY,QAAQF,CAAQ;AACvC,MAAIC,EAAG,IAAI,WAAW;AACpB,UAAM,IAAI,MAAM,qCAAqC;AAEvD,SAAOA,EAAG,IAAI,IAAI,CAACE,OAAW;AAAA,IAC5B,MAAM,WAAW,KAAKC,EAAO,KAAKD,EAAM,IAAI,EAAE,SAAS;AAAA,IACvD,MAAMA,EAAM;AAAA,EAAA,EACZ;AACJ;"}