@babylonlabs-io/ts-sdk 0.16.2 → 0.17.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 (138) hide show
  1. package/dist/challengeAssert-D_k_ADgP.cjs +2 -0
  2. package/dist/challengeAssert-D_k_ADgP.cjs.map +1 -0
  3. package/dist/challengeAssert-k5_LWUtO.js +362 -0
  4. package/dist/challengeAssert-k5_LWUtO.js.map +1 -0
  5. package/dist/constants-EiyZkXce.cjs +2 -0
  6. package/dist/constants-EiyZkXce.cjs.map +1 -0
  7. package/dist/constants-Q7v2O7Ps.js +155 -0
  8. package/dist/constants-Q7v2O7Ps.js.map +1 -0
  9. package/dist/errors-DKLboMnq.cjs +2 -0
  10. package/dist/errors-DKLboMnq.cjs.map +1 -0
  11. package/dist/errors-KY63mgWT.js +1510 -0
  12. package/dist/errors-KY63mgWT.js.map +1 -0
  13. package/dist/fundPeginTransaction-DpwnDslW.js +50 -0
  14. package/dist/fundPeginTransaction-DpwnDslW.js.map +1 -0
  15. package/dist/fundPeginTransaction-EbrZzlrh.cjs +2 -0
  16. package/dist/fundPeginTransaction-EbrZzlrh.cjs.map +1 -0
  17. package/dist/index-D3z3SZAj.cjs +2 -0
  18. package/dist/index-D3z3SZAj.cjs.map +1 -0
  19. package/dist/index-Dw7FAwne.js +913 -0
  20. package/dist/index-Dw7FAwne.js.map +1 -0
  21. package/dist/index.cjs +1 -1
  22. package/dist/index.js +98 -74
  23. package/dist/index.js.map +1 -1
  24. package/dist/payout-Ce9vSs9e.js +164 -0
  25. package/dist/payout-Ce9vSs9e.js.map +1 -0
  26. package/dist/payout-CfsDnjKI.cjs +2 -0
  27. package/dist/payout-CfsDnjKI.cjs.map +1 -0
  28. package/dist/psbtInputFields-C0nKn_GD.cjs +2 -0
  29. package/dist/psbtInputFields-C0nKn_GD.cjs.map +1 -0
  30. package/dist/psbtInputFields-DO0ELwiv.js +116 -0
  31. package/dist/psbtInputFields-DO0ELwiv.js.map +1 -0
  32. package/dist/signAndSubmitPayouts-CAOEAQp9.js +490 -0
  33. package/dist/signAndSubmitPayouts-CAOEAQp9.js.map +1 -0
  34. package/dist/signAndSubmitPayouts-CSJmcPQN.cjs +2 -0
  35. package/dist/signAndSubmitPayouts-CSJmcPQN.cjs.map +1 -0
  36. package/dist/signing-Deg5lCoC.cjs +2 -0
  37. package/dist/signing-Deg5lCoC.cjs.map +1 -0
  38. package/dist/signing-Drwr3bXB.js +16 -0
  39. package/dist/signing-Drwr3bXB.js.map +1 -0
  40. package/dist/tbv/core/clients/eth/__tests__/vault-registry-reader.test.d.ts +2 -0
  41. package/dist/tbv/core/clients/eth/__tests__/vault-registry-reader.test.d.ts.map +1 -0
  42. package/dist/tbv/core/clients/eth/index.d.ts +3 -0
  43. package/dist/tbv/core/clients/eth/index.d.ts.map +1 -0
  44. package/dist/tbv/core/clients/eth/types.d.ts +37 -0
  45. package/dist/tbv/core/clients/eth/types.d.ts.map +1 -0
  46. package/dist/tbv/core/clients/eth/vault-registry-reader.d.ts +20 -0
  47. package/dist/tbv/core/clients/eth/vault-registry-reader.d.ts.map +1 -0
  48. package/dist/tbv/core/clients/index.cjs +2 -0
  49. package/dist/tbv/core/clients/index.cjs.map +1 -0
  50. package/dist/tbv/core/clients/index.d.ts +2 -0
  51. package/dist/tbv/core/clients/index.d.ts.map +1 -1
  52. package/dist/tbv/core/clients/index.js +26 -0
  53. package/dist/tbv/core/clients/index.js.map +1 -0
  54. package/dist/tbv/core/clients/vault-provider/__tests__/json-rpc-client.test.d.ts +2 -0
  55. package/dist/tbv/core/clients/vault-provider/__tests__/json-rpc-client.test.d.ts.map +1 -0
  56. package/dist/tbv/core/clients/vault-provider/__tests__/validators.test.d.ts +2 -0
  57. package/dist/tbv/core/clients/vault-provider/__tests__/validators.test.d.ts.map +1 -0
  58. package/dist/tbv/core/clients/vault-provider/api.d.ts +53 -0
  59. package/dist/tbv/core/clients/vault-provider/api.d.ts.map +1 -0
  60. package/dist/tbv/core/clients/vault-provider/index.d.ts +7 -0
  61. package/dist/tbv/core/clients/vault-provider/index.d.ts.map +1 -0
  62. package/dist/tbv/core/clients/vault-provider/json-rpc-client.d.ts +90 -0
  63. package/dist/tbv/core/clients/vault-provider/json-rpc-client.d.ts.map +1 -0
  64. package/dist/tbv/core/clients/vault-provider/types.d.ts +256 -0
  65. package/dist/tbv/core/clients/vault-provider/types.d.ts.map +1 -0
  66. package/dist/tbv/core/clients/vault-provider/validators.d.ts +30 -0
  67. package/dist/tbv/core/clients/vault-provider/validators.d.ts.map +1 -0
  68. package/dist/tbv/core/index.cjs +1 -1
  69. package/dist/tbv/core/index.d.ts +1 -0
  70. package/dist/tbv/core/index.d.ts.map +1 -1
  71. package/dist/tbv/core/index.js +97 -73
  72. package/dist/tbv/core/index.js.map +1 -1
  73. package/dist/tbv/core/primitives/index.cjs +1 -1
  74. package/dist/tbv/core/primitives/index.d.ts +8 -0
  75. package/dist/tbv/core/primitives/index.d.ts.map +1 -1
  76. package/dist/tbv/core/primitives/index.js +26 -24
  77. package/dist/tbv/core/primitives/index.js.map +1 -1
  78. package/dist/tbv/core/services/deposit/__tests__/submitWotsPublicKey.test.d.ts +2 -0
  79. package/dist/tbv/core/services/deposit/__tests__/submitWotsPublicKey.test.d.ts.map +1 -0
  80. package/dist/tbv/core/services/deposit/__tests__/waitForPeginStatus.test.d.ts +2 -0
  81. package/dist/tbv/core/services/deposit/__tests__/waitForPeginStatus.test.d.ts.map +1 -0
  82. package/dist/tbv/core/services/deposit/index.d.ts +10 -0
  83. package/dist/tbv/core/services/deposit/index.d.ts.map +1 -0
  84. package/dist/tbv/core/services/deposit/interfaces.d.ts +21 -0
  85. package/dist/tbv/core/services/deposit/interfaces.d.ts.map +1 -0
  86. package/dist/tbv/core/services/deposit/signAndSubmitPayouts.d.ts +55 -0
  87. package/dist/tbv/core/services/deposit/signAndSubmitPayouts.d.ts.map +1 -0
  88. package/dist/tbv/core/services/deposit/signDepositorGraph.d.ts +21 -0
  89. package/dist/tbv/core/services/deposit/signDepositorGraph.d.ts.map +1 -0
  90. package/dist/tbv/core/services/deposit/submitWotsPublicKey.d.ts +25 -0
  91. package/dist/tbv/core/services/deposit/submitWotsPublicKey.d.ts.map +1 -0
  92. package/dist/tbv/core/services/deposit/waitForPeginStatus.d.ts +24 -0
  93. package/dist/tbv/core/services/deposit/waitForPeginStatus.d.ts.map +1 -0
  94. package/dist/tbv/core/services/index.cjs +2 -0
  95. package/dist/tbv/core/services/index.cjs.map +1 -0
  96. package/dist/tbv/core/services/index.d.ts +10 -0
  97. package/dist/tbv/core/services/index.d.ts.map +1 -0
  98. package/dist/tbv/core/services/index.js +8 -0
  99. package/dist/tbv/core/services/index.js.map +1 -0
  100. package/dist/tbv/core/utils/index.cjs +2 -0
  101. package/dist/tbv/core/utils/index.cjs.map +1 -0
  102. package/dist/tbv/core/utils/index.js +30 -0
  103. package/dist/tbv/core/utils/index.js.map +1 -0
  104. package/dist/tbv/index.cjs +1 -1
  105. package/dist/tbv/index.js +97 -73
  106. package/dist/tbv/index.js.map +1 -1
  107. package/dist/tbv/integrations/aave/clients/abis/AaveSpoke.abi.json.d.ts +28 -18
  108. package/dist/tbv/integrations/aave/clients/spoke.d.ts +2 -2
  109. package/dist/tbv/integrations/aave/clients/spoke.d.ts.map +1 -1
  110. package/dist/tbv/integrations/aave/constants.d.ts +7 -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 +124 -120
  117. package/dist/tbv/integrations/aave/index.js.map +1 -1
  118. package/dist/tbv/integrations/aave/types.d.ts +4 -6
  119. package/dist/tbv/integrations/aave/types.d.ts.map +1 -1
  120. package/dist/tbv/integrations/aave/utils/aaveConversions.d.ts +10 -1
  121. package/dist/tbv/integrations/aave/utils/aaveConversions.d.ts.map +1 -1
  122. package/dist/tbv/integrations/aave/utils/debtUtils.d.ts +0 -1
  123. package/dist/tbv/integrations/aave/utils/debtUtils.d.ts.map +1 -1
  124. package/dist/tbv/integrations/aave/utils/index.d.ts +1 -1
  125. package/dist/tbv/integrations/aave/utils/index.d.ts.map +1 -1
  126. package/dist/types-D1rYwwCu.js +235 -0
  127. package/dist/types-D1rYwwCu.js.map +1 -0
  128. package/dist/types-DEWiqXYp.cjs +2 -0
  129. package/dist/types-DEWiqXYp.cjs.map +1 -0
  130. package/package.json +11 -1
  131. package/dist/challengeAssert-CTajvPAY.cjs +0 -2
  132. package/dist/challengeAssert-CTajvPAY.cjs.map +0 -1
  133. package/dist/challengeAssert-DtrQLG0c.js +0 -711
  134. package/dist/challengeAssert-DtrQLG0c.js.map +0 -1
  135. package/dist/errors-BeFfs5_J.js +0 -2250
  136. package/dist/errors-BeFfs5_J.js.map +0 -1
  137. package/dist/errors-CAFiRPYI.cjs +0 -2
  138. package/dist/errors-CAFiRPYI.cjs.map +0 -1
@@ -0,0 +1,235 @@
1
+ var h = Object.defineProperty;
2
+ var l = (e, t, r) => t in e ? h(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
+ var R = (e, t, r) => l(e, typeof t != "symbol" ? t + "" : t, r);
4
+ class T extends Error {
5
+ constructor(t, r) {
6
+ super(r), this.code = t, this.name = "JsonRpcError";
7
+ }
8
+ }
9
+ const A = {
10
+ TIMEOUT: -32e3,
11
+ NETWORK: -32001,
12
+ /** VP proxy: request timed out at proxy level */
13
+ PROXY_TIMEOUT: -32002,
14
+ /** VP proxy: VP unreachable / DNS failure / response too large */
15
+ PROXY_UNAVAILABLE: -32003,
16
+ /** SDK client: response missing "result" field (malformed JSON-RPC) */
17
+ INVALID_RESPONSE: -32700
18
+ }, d = "2.0", w = 3, b = 1e3, y = /* @__PURE__ */ new Set([
19
+ 408,
20
+ // Request Timeout
21
+ 429,
22
+ // Too Many Requests
23
+ 500,
24
+ // Internal Server Error
25
+ 502,
26
+ // Bad Gateway
27
+ 503,
28
+ // Service Unavailable
29
+ 504
30
+ // Gateway Timeout
31
+ ]), g = /* @__PURE__ */ new Set([
32
+ "vaultProvider_getPeginStatus",
33
+ "vaultProvider_getPegoutStatus",
34
+ "vaultProvider_requestDepositorPresignTransactions"
35
+ ]);
36
+ function D(e) {
37
+ return g.has(e);
38
+ }
39
+ class m {
40
+ constructor(t) {
41
+ R(this, "baseUrl");
42
+ R(this, "timeout");
43
+ R(this, "headers");
44
+ R(this, "requestId", 0);
45
+ R(this, "retries");
46
+ R(this, "retryDelay");
47
+ R(this, "retryableFor");
48
+ this.baseUrl = t.baseUrl.replace(/\/$/, ""), this.timeout = t.timeout, this.headers = {
49
+ "Content-Type": "application/json",
50
+ ...t.headers
51
+ }, this.retries = t.retries ?? w, this.retryDelay = t.retryDelay ?? b, this.retryableFor = t.retryableFor ?? D;
52
+ }
53
+ /**
54
+ * Make a JSON-RPC request with optional retry for safe methods.
55
+ *
56
+ * @param method - The RPC method name
57
+ * @param params - The method parameters
58
+ * @param signal - Optional AbortSignal for caller-controlled cancellation
59
+ * @returns The result from the RPC method
60
+ * @throws JsonRpcError if the RPC call fails
61
+ */
62
+ async call(t, r, n) {
63
+ const i = await this.fetchWithRetry(t, r, n);
64
+ let s;
65
+ try {
66
+ s = await i.json();
67
+ } catch {
68
+ throw new T(
69
+ A.INVALID_RESPONSE,
70
+ "Invalid JSON-RPC response: body is not valid JSON"
71
+ );
72
+ }
73
+ if (s === null || typeof s != "object" || Array.isArray(s))
74
+ throw new T(
75
+ A.INVALID_RESPONSE,
76
+ `Invalid JSON-RPC response: expected an object, got ${typeof s}`
77
+ );
78
+ const a = s;
79
+ if ("error" in a && a.error != null) {
80
+ const I = a.error;
81
+ throw new T(
82
+ I.code ?? A.INVALID_RESPONSE,
83
+ I.message ?? "Unknown RPC error"
84
+ );
85
+ }
86
+ if (!("result" in a))
87
+ throw new T(
88
+ A.INVALID_RESPONSE,
89
+ 'Invalid JSON-RPC response: missing "result" field'
90
+ );
91
+ return a.result;
92
+ }
93
+ /**
94
+ * Make a JSON-RPC request returning the raw Response (unparsed body).
95
+ */
96
+ async callRaw(t, r, n) {
97
+ return this.fetchWithRetry(t, r, n);
98
+ }
99
+ async fetchWithRetry(t, r, n) {
100
+ const i = ++this.requestId, s = this.retryableFor(t) ? this.retries : 0, I = JSON.stringify({
101
+ jsonrpc: d,
102
+ method: t,
103
+ params: [r],
104
+ id: i
105
+ });
106
+ let u = null;
107
+ for (let E = 0; E <= s; E++) {
108
+ const N = new AbortController(), O = setTimeout(
109
+ () => N.abort(),
110
+ this.timeout
111
+ ), P = n ? L(n, N.signal) : null, S = P ? P.signal : N.signal;
112
+ try {
113
+ const o = await fetch(this.baseUrl, {
114
+ method: "POST",
115
+ headers: this.headers,
116
+ body: I,
117
+ signal: S
118
+ });
119
+ if (clearTimeout(O), P == null || P.cleanup(), !o.ok) {
120
+ if (E < s && y.has(o.status)) {
121
+ const c = this.retryDelay * Math.pow(2, E);
122
+ await this.sleep(c, n);
123
+ continue;
124
+ }
125
+ throw new Error(
126
+ `HTTP error: ${o.status} ${o.statusText}`
127
+ );
128
+ }
129
+ return o;
130
+ } catch (o) {
131
+ if (clearTimeout(O), P == null || P.cleanup(), u = o instanceof Error ? o : new Error(String(o)), n != null && n.aborted)
132
+ throw new Error("Request aborted");
133
+ if (o instanceof Error && o.name === "AbortError") {
134
+ if (E < s) {
135
+ const _ = this.retryDelay * Math.pow(2, E);
136
+ await this.sleep(_, n);
137
+ continue;
138
+ }
139
+ throw new T(
140
+ A.TIMEOUT,
141
+ `Request timeout after ${this.timeout}ms (${s + 1} attempts)`
142
+ );
143
+ }
144
+ if (o instanceof TypeError) {
145
+ if (E < s) {
146
+ const _ = this.retryDelay * Math.pow(2, E);
147
+ await this.sleep(_, n);
148
+ continue;
149
+ }
150
+ throw new T(
151
+ A.NETWORK,
152
+ `Network error: ${o.message} (${s + 1} attempts)`
153
+ );
154
+ }
155
+ throw o;
156
+ }
157
+ }
158
+ throw u || new Error("Unknown error after retries");
159
+ }
160
+ sleep(t, r) {
161
+ return new Promise((n, i) => {
162
+ if (r != null && r.aborted) {
163
+ i(new Error("Request aborted"));
164
+ return;
165
+ }
166
+ const s = setTimeout(() => {
167
+ r == null || r.removeEventListener("abort", a), n();
168
+ }, t), a = () => {
169
+ clearTimeout(s), i(new Error("Request aborted"));
170
+ };
171
+ r == null || r.addEventListener("abort", a, { once: !0 });
172
+ });
173
+ }
174
+ getBaseUrl() {
175
+ return this.baseUrl;
176
+ }
177
+ }
178
+ function L(e, t) {
179
+ if (e.aborted) return { signal: e, cleanup: () => {
180
+ } };
181
+ if (t.aborted) return { signal: t, cleanup: () => {
182
+ } };
183
+ const r = new AbortController(), n = () => {
184
+ t.removeEventListener("abort", i), r.abort();
185
+ }, i = () => {
186
+ e.removeEventListener("abort", n), r.abort();
187
+ };
188
+ e.addEventListener("abort", n, { once: !0 }), t.addEventListener("abort", i, { once: !0 });
189
+ const s = () => {
190
+ e.removeEventListener("abort", n), t.removeEventListener("abort", i);
191
+ };
192
+ return { signal: r.signal, cleanup: s };
193
+ }
194
+ var p = /* @__PURE__ */ ((e) => (e.PENDING_INGESTION = "PendingIngestion", e.PENDING_DEPOSITOR_WOTS_PK = "PendingDepositorWotsPK", e.PENDING_BABE_SETUP = "PendingBabeSetup", e.PENDING_CHALLENGER_PRESIGNING = "PendingChallengerPresigning", e.PENDING_PEGIN_SIGS_AVAILABILITY = "PendingPeginSigsAvailability", e.PENDING_PRE_PEGIN_CONFIRMATIONS = "PendingPrePegInConfirmations", e.PENDING_DEPOSITOR_SIGNATURES = "PendingDepositorSignatures", e.PENDING_ACKS = "PendingACKs", e.PENDING_ACTIVATION = "PendingActivation", e.ACTIVATED = "Activated", e.EXPIRED = "Expired", e.CLAIM_POSTED = "ClaimPosted", e.PEGGED_OUT = "PeggedOut", e))(p || {});
195
+ const V = [
196
+ "PendingIngestion",
197
+ "PendingBabeSetup",
198
+ "PendingChallengerPresigning",
199
+ "PendingPeginSigsAvailability",
200
+ "PendingPrePegInConfirmations"
201
+ /* PENDING_PRE_PEGIN_CONFIRMATIONS */
202
+ ], v = [
203
+ "PendingACKs",
204
+ "PendingActivation",
205
+ "Activated"
206
+ /* ACTIVATED */
207
+ ], f = /* @__PURE__ */ new Set([
208
+ "PendingBabeSetup",
209
+ "PendingChallengerPresigning",
210
+ "PendingPeginSigsAvailability",
211
+ "PendingPrePegInConfirmations",
212
+ ...v
213
+ ]), C = /* @__PURE__ */ new Set([
214
+ "Expired",
215
+ "ClaimPosted",
216
+ "PeggedOut"
217
+ /* PEGGED_OUT */
218
+ ]), B = /* @__PURE__ */ new Set([
219
+ ...f,
220
+ "PendingDepositorSignatures"
221
+ /* PENDING_DEPOSITOR_SIGNATURES */
222
+ ]);
223
+ var U = /* @__PURE__ */ ((e) => (e[e.DATABASE_ERROR = -32005] = "DATABASE_ERROR", e[e.PRESIGN_ERROR = -32006] = "PRESIGN_ERROR", e[e.JSON_SERIALIZATION_ERROR = -32007] = "JSON_SERIALIZATION_ERROR", e[e.TX_GRAPH_ERROR = -32008] = "TX_GRAPH_ERROR", e[e.INVALID_GRAPH = -32009] = "INVALID_GRAPH", e[e.VALIDATION_ERROR = -32010] = "VALIDATION_ERROR", e[e.NOT_FOUND = -32011] = "NOT_FOUND", e[e.INTERNAL_ERROR = -32603] = "INTERNAL_ERROR", e))(U || {});
224
+ export {
225
+ p as D,
226
+ m as J,
227
+ V as P,
228
+ U as R,
229
+ f as V,
230
+ T as a,
231
+ A as b,
232
+ C as c,
233
+ B as d
234
+ };
235
+ //# sourceMappingURL=types-D1rYwwCu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-D1rYwwCu.js","sources":["../src/tbv/core/clients/vault-provider/json-rpc-client.ts","../src/tbv/core/clients/vault-provider/types.ts"],"sourcesContent":["/**\n * Generic JSON-RPC 2.0 HTTP Client\n *\n * Framework-agnostic client using `fetch()` — works in browsers and Node.js 18+.\n * Includes configurable retry policy and AbortSignal passthrough.\n */\n\nexport interface JsonRpcRequest<T = unknown> {\n jsonrpc: \"2.0\";\n method: string;\n params: T;\n id: number | string;\n}\n\nexport interface JsonRpcSuccessResponse<T = unknown> {\n jsonrpc: \"2.0\";\n result: T;\n id: number | string;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n id: number | string;\n}\n\nexport type JsonRpcResponse<T = unknown> =\n | JsonRpcSuccessResponse<T>\n | JsonRpcErrorResponse;\n\nexport interface JsonRpcClientConfig {\n /** Base URL of the RPC service */\n baseUrl: string;\n /** Timeout in milliseconds per request attempt */\n timeout: number;\n /** Optional custom headers */\n headers?: Record<string, string>;\n /** Number of retry attempts for transient errors (default: 3) */\n retries?: number;\n /** Initial retry delay in milliseconds (default: 1000) */\n retryDelay?: number;\n /**\n * Predicate to determine if a method is safe to retry.\n * Default: only retry `vaultProvider_getPeginStatus` and `vaultProvider_getPegoutStatus`.\n * Write/mutating methods are NOT retried by default.\n */\n retryableFor?: (method: string) => boolean;\n}\n\nexport class JsonRpcError extends Error {\n constructor(\n public code: number,\n message: string,\n ) {\n super(message);\n this.name = \"JsonRpcError\";\n }\n}\n\nexport const JSON_RPC_ERROR_CODES = {\n TIMEOUT: -32000,\n NETWORK: -32001,\n /** VP proxy: request timed out at proxy level */\n PROXY_TIMEOUT: -32002,\n /** VP proxy: VP unreachable / DNS failure / response too large */\n PROXY_UNAVAILABLE: -32003,\n /** SDK client: response missing \"result\" field (malformed JSON-RPC) */\n INVALID_RESPONSE: -32700,\n} as const;\n\n/** JSON-RPC protocol version */\nconst JSON_RPC_VERSION = \"2.0\" as const;\n\n/** Default number of retry attempts for transient errors */\nconst DEFAULT_RETRY_ATTEMPTS = 3;\n\n/** Default initial retry delay in milliseconds */\nconst DEFAULT_RETRY_DELAY_MS = 1000;\n\n/** HTTP status codes that indicate transient server errors and are safe to retry */\nconst RETRYABLE_HTTP_STATUS_CODES: ReadonlySet<number> = new Set([\n 408, // Request Timeout\n 429, // Too Many Requests\n 500, // Internal Server Error\n 502, // Bad Gateway\n 503, // Service Unavailable\n 504, // Gateway Timeout\n]);\n\n/** Default retry predicate: only retry read-only / idempotent methods */\nconst DEFAULT_RETRYABLE_METHODS: ReadonlySet<string> = new Set([\n \"vaultProvider_getPeginStatus\",\n \"vaultProvider_getPegoutStatus\",\n \"vaultProvider_requestDepositorPresignTransactions\",\n]);\n\nfunction defaultRetryableFor(method: string): boolean {\n return DEFAULT_RETRYABLE_METHODS.has(method);\n}\n\n/**\n * Generic JSON-RPC 2.0 HTTP client with safe retry policy.\n */\nexport class JsonRpcClient {\n private baseUrl: string;\n private timeout: number;\n private headers: Record<string, string>;\n private requestId = 0;\n private retries: number;\n private retryDelay: number;\n private retryableFor: (method: string) => boolean;\n\n constructor(config: JsonRpcClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.timeout = config.timeout;\n this.headers = {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n };\n this.retries = config.retries ?? DEFAULT_RETRY_ATTEMPTS;\n this.retryDelay = config.retryDelay ?? DEFAULT_RETRY_DELAY_MS;\n this.retryableFor = config.retryableFor ?? defaultRetryableFor;\n }\n\n /**\n * Make a JSON-RPC request with optional retry for safe methods.\n *\n * @param method - The RPC method name\n * @param params - The method parameters\n * @param signal - Optional AbortSignal for caller-controlled cancellation\n * @returns The result from the RPC method\n * @throws JsonRpcError if the RPC call fails\n */\n async call<TParams, TResult>(\n method: string,\n params: TParams,\n signal?: AbortSignal,\n ): Promise<TResult> {\n const response = await this.fetchWithRetry(method, params, signal);\n\n let jsonResponse: unknown;\n try {\n jsonResponse = await response.json();\n } catch {\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n \"Invalid JSON-RPC response: body is not valid JSON\",\n );\n }\n\n if (\n jsonResponse === null ||\n typeof jsonResponse !== \"object\" ||\n Array.isArray(jsonResponse)\n ) {\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n `Invalid JSON-RPC response: expected an object, got ${typeof jsonResponse}`,\n );\n }\n\n const rpcResponse = jsonResponse as Record<string, unknown>;\n\n if (\"error\" in rpcResponse && rpcResponse.error != null) {\n const err = rpcResponse.error as { code?: number; message?: string };\n throw new JsonRpcError(\n err.code ?? JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n err.message ?? \"Unknown RPC error\",\n );\n }\n\n if (!(\"result\" in rpcResponse)) {\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n `Invalid JSON-RPC response: missing \"result\" field`,\n );\n }\n\n return rpcResponse.result as TResult;\n }\n\n /**\n * Make a JSON-RPC request returning the raw Response (unparsed body).\n */\n async callRaw<TParams>(\n method: string,\n params: TParams,\n signal?: AbortSignal,\n ): Promise<Response> {\n return this.fetchWithRetry(method, params, signal);\n }\n\n private async fetchWithRetry<TParams>(\n method: string,\n params: TParams,\n callerSignal?: AbortSignal,\n ): Promise<Response> {\n const requestId = ++this.requestId;\n const maxRetries = this.retryableFor(method) ? this.retries : 0;\n\n // jsonrpsee (Rust backend) expects params as an array (positional parameters)\n const request: JsonRpcRequest<TParams[]> = {\n jsonrpc: JSON_RPC_VERSION,\n method,\n params: [params],\n id: requestId,\n };\n\n const body = JSON.stringify(request);\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // Merge caller signal with per-request timeout signal\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(\n () => timeoutController.abort(),\n this.timeout,\n );\n\n const merged = callerSignal\n ? mergeAbortSignals(callerSignal, timeoutController.signal)\n : null;\n const signal = merged ? merged.signal : timeoutController.signal;\n\n try {\n const response = await fetch(this.baseUrl, {\n method: \"POST\",\n headers: this.headers,\n body,\n signal,\n });\n\n clearTimeout(timeoutId);\n merged?.cleanup();\n\n if (!response.ok) {\n const shouldRetry =\n attempt < maxRetries &&\n RETRYABLE_HTTP_STATUS_CODES.has(response.status);\n\n if (shouldRetry) {\n const delay = this.retryDelay * Math.pow(2, attempt);\n await this.sleep(delay, callerSignal);\n continue;\n }\n\n throw new Error(\n `HTTP error: ${response.status} ${response.statusText}`,\n );\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n merged?.cleanup();\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if caller aborted (not our timeout)\n if (callerSignal?.aborted) {\n throw new Error(\"Request aborted\");\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n if (attempt < maxRetries) {\n const delay = this.retryDelay * Math.pow(2, attempt);\n await this.sleep(delay, callerSignal);\n continue;\n }\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.TIMEOUT,\n `Request timeout after ${this.timeout}ms (${maxRetries + 1} attempts)`,\n );\n }\n\n // Handle network errors (CORS, connection refused, etc.)\n if (error instanceof TypeError) {\n if (attempt < maxRetries) {\n const delay = this.retryDelay * Math.pow(2, attempt);\n await this.sleep(delay, callerSignal);\n continue;\n }\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.NETWORK,\n `Network error: ${error.message} (${maxRetries + 1} attempts)`,\n );\n }\n\n // Don't retry JSON-RPC errors (business logic errors)\n throw error;\n }\n }\n\n throw lastError || new Error(\"Unknown error after retries\");\n }\n\n private sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error(\"Request aborted\"));\n return;\n }\n const timeoutId = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timeoutId);\n reject(new Error(\"Request aborted\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n}\n\ninterface MergedSignal {\n signal: AbortSignal;\n /** Remove listeners from the source signals. Call after the request completes. */\n cleanup: () => void;\n}\n\n/**\n * Merge two AbortSignals — the returned signal aborts if either input aborts.\n * Returns a cleanup function to remove listeners when the request completes\n * normally, preventing listener accumulation in long-lived polling flows.\n */\nfunction mergeAbortSignals(\n a: AbortSignal,\n b: AbortSignal,\n): MergedSignal {\n if (a.aborted) return { signal: a, cleanup: () => {} };\n if (b.aborted) return { signal: b, cleanup: () => {} };\n\n const controller = new AbortController();\n const onAbortA = () => {\n b.removeEventListener(\"abort\", onAbortB);\n controller.abort();\n };\n const onAbortB = () => {\n a.removeEventListener(\"abort\", onAbortA);\n controller.abort();\n };\n a.addEventListener(\"abort\", onAbortA, { once: true });\n b.addEventListener(\"abort\", onAbortB, { once: true });\n\n const cleanup = () => {\n a.removeEventListener(\"abort\", onAbortA);\n b.removeEventListener(\"abort\", onAbortB);\n };\n\n return { signal: controller.signal, cleanup };\n}\n","/**\n * Type definitions for Vault Provider JSON-RPC API.\n *\n * These types match the `vaultProvider_*` RPC namespace defined by the\n * btc-vault daemon. They are the SDK's canonical copy of the VP protocol\n * contract, independent of any frontend framework.\n *\n * @see https://github.com/babylonlabs-io/btc-vault/blob/main/docs/pegin.md\n */\n\n// ============================================================================\n// Daemon Status\n// ============================================================================\n\n/**\n * Backend daemon status (vault provider database).\n * Source: btc-vault crates/vaultd/src/workers/claimer/mod.rs PegInStatus enum\n *\n * State flow (happy path):\n * PendingIngestion -> PendingDepositorWotsPK -> PendingBabeSetup -> PendingChallengerPresigning\n * -> PendingPeginSigsAvailability -> PendingPrePegInConfirmations\n * -> PendingDepositorSignatures -> PendingACKs -> PendingActivation -> Activated\n *\n * Terminal / branching states:\n * - Expired: vault timed out before activation\n * - ClaimPosted: claim transaction posted on-chain\n * - PeggedOut: BTC has been returned to the depositor\n */\nexport enum DaemonStatus {\n PENDING_INGESTION = \"PendingIngestion\",\n PENDING_DEPOSITOR_WOTS_PK = \"PendingDepositorWotsPK\",\n PENDING_BABE_SETUP = \"PendingBabeSetup\",\n PENDING_CHALLENGER_PRESIGNING = \"PendingChallengerPresigning\",\n PENDING_PEGIN_SIGS_AVAILABILITY = \"PendingPeginSigsAvailability\",\n PENDING_PRE_PEGIN_CONFIRMATIONS = \"PendingPrePegInConfirmations\",\n PENDING_DEPOSITOR_SIGNATURES = \"PendingDepositorSignatures\",\n PENDING_ACKS = \"PendingACKs\",\n PENDING_ACTIVATION = \"PendingActivation\",\n ACTIVATED = \"Activated\",\n EXPIRED = \"Expired\",\n CLAIM_POSTED = \"ClaimPosted\",\n PEGGED_OUT = \"PeggedOut\",\n}\n\n// ============================================================================\n// Status Groups\n// ============================================================================\n\n/**\n * States where the VP is still processing (no depositor action needed).\n * Excludes PENDING_DEPOSITOR_WOTS_PK (requires depositor action).\n */\nexport const PRE_DEPOSITOR_SIGNATURES_STATES: readonly DaemonStatus[] = [\n DaemonStatus.PENDING_INGESTION,\n DaemonStatus.PENDING_BABE_SETUP,\n DaemonStatus.PENDING_CHALLENGER_PRESIGNING,\n DaemonStatus.PENDING_PEGIN_SIGS_AVAILABILITY,\n DaemonStatus.PENDING_PRE_PEGIN_CONFIRMATIONS,\n];\n\n/** States after PendingDepositorSignatures where the depositor has no action. */\nconst POST_PAYOUT_SIGNATURE_STATUSES: readonly DaemonStatus[] = [\n DaemonStatus.PENDING_ACKS,\n DaemonStatus.PENDING_ACTIVATION,\n DaemonStatus.ACTIVATED,\n];\n\n/**\n * Statuses where no depositor action is needed (VP processing or already past\n * depositor interaction). Excludes PENDING_INGESTION and PENDING_DEPOSITOR_WOTS_PK.\n */\nexport const VP_TRANSIENT_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n DaemonStatus.PENDING_BABE_SETUP,\n DaemonStatus.PENDING_CHALLENGER_PRESIGNING,\n DaemonStatus.PENDING_PEGIN_SIGS_AVAILABILITY,\n DaemonStatus.PENDING_PRE_PEGIN_CONFIRMATIONS,\n ...POST_PAYOUT_SIGNATURE_STATUSES,\n]);\n\n/**\n * Terminal VP statuses where no further progress is possible.\n * If the VP reaches one of these states while polling, polling should\n * stop immediately with an error rather than waiting for timeout.\n */\nexport const VP_TERMINAL_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n DaemonStatus.EXPIRED,\n DaemonStatus.CLAIM_POSTED,\n DaemonStatus.PEGGED_OUT,\n]);\n\n/**\n * Statuses that come after WOTS key submission.\n * If the VP is already in one of these states, the WOTS key was already\n * submitted and we can skip.\n */\nexport const POST_WOTS_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n ...VP_TRANSIENT_STATUSES,\n DaemonStatus.PENDING_DEPOSITOR_SIGNATURES,\n]);\n\n// ============================================================================\n// WOTS Types (needed by SubmitDepositorWotsKeyParams)\n// ============================================================================\n\n/**\n * WOTS configuration for a single block.\n * Matches Rust `babe::wots::Config` serde format.\n */\nexport interface WotsConfig {\n /** Digit bit-width (e.g. 4 → base-16 digits). */\n d: number;\n /** Number of message digits in this block. */\n n: number;\n /** Radix used for the checksum computation. */\n checksum_radix: number;\n}\n\n/**\n * A single block of WOTS public keys.\n * Chain values are arrays of byte values (matching Rust `[u8; 20]`).\n */\nexport interface WotsBlockPublicKey {\n config: WotsConfig;\n message_terminals: number[][];\n checksum_major_terminal: number[];\n checksum_minor_terminal: number[];\n}\n\n// ============================================================================\n// Request Parameter Types\n// ============================================================================\n\n/** Params for requesting the payout/claim/assert transactions to pre-sign. */\nexport interface RequestDepositorPresignTransactionsParams {\n pegin_txid: string;\n depositor_pk: string;\n}\n\n/** Params for submitting the depositor's WOTS public key to the VP. */\nexport interface SubmitDepositorWotsKeyParams {\n pegin_txid: string;\n depositor_pk: string;\n wots_public_keys: WotsBlockPublicKey[];\n}\n\n/** Per-challenger signatures for the depositor-as-claimer flow. */\nexport interface DepositorPreSigsPerChallenger {\n nopayout_signature: string;\n}\n\n/** Depositor-as-claimer pre-signatures (payout + per-challenger). */\nexport interface DepositorAsClaimerPresignatures {\n payout_signatures: ClaimerSignatures;\n per_challenger: Record<string, DepositorPreSigsPerChallenger>;\n}\n\n/** Params for submitting depositor pre-signatures including claimer presignatures. */\nexport interface SubmitDepositorPresignaturesParams {\n pegin_txid: string;\n depositor_pk: string;\n signatures: Record<string, ClaimerSignatures>;\n depositor_claimer_presignatures: DepositorAsClaimerPresignatures;\n}\n\n/** Payout signatures per claimer. */\nexport interface ClaimerSignatures {\n payout_signature: string;\n}\n\n/** Params for requesting BaBe DecryptorArtifacts from the VP. */\nexport interface RequestDepositorClaimerArtifactsParams {\n pegin_txid: string;\n depositor_pk: string;\n}\n\n/** Params for querying pegin status. Either pegin_txid or vault_id must be provided. */\nexport type GetPeginStatusParams =\n | { pegin_txid: string; vault_id?: never }\n | { vault_id: string; pegin_txid?: never };\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/** A raw Bitcoin transaction with its hex encoding. */\nexport interface TransactionData {\n tx_hex: string;\n}\n\n/** Set of transactions the depositor must pre-sign for a single claimer. */\nexport interface ClaimerTransactions {\n claimer_pubkey: string;\n claim_tx: TransactionData;\n assert_tx: TransactionData;\n payout_tx: TransactionData;\n payout_psbt: string;\n}\n\n/** Per-segment connector data for ChallengeAssert inputs. */\nexport interface ChallengeAssertConnectorData {\n wots_pks_json: string;\n gc_wots_keys_json: string;\n}\n\n/** Challenger-specific transactions and signing data for the depositor graph. */\nexport interface PresignDataPerChallenger {\n challenger_pubkey: string;\n challenge_assert_x_tx: TransactionData;\n challenge_assert_y_tx: TransactionData;\n nopayout_tx: TransactionData;\n nopayout_psbt: string;\n challenge_assert_connectors: ChallengeAssertConnectorData[];\n output_label_hashes: string[];\n}\n\n/** Depositor-as-claimer TxGraph transactions. */\nexport interface DepositorGraphTransactions {\n claim_tx: TransactionData;\n assert_tx: TransactionData;\n payout_tx: TransactionData;\n payout_psbt: string;\n challenger_presign_data: PresignDataPerChallenger[];\n offchain_params_version: number;\n}\n\n/** Response from `requestDepositorPresignTransactions`. */\nexport interface RequestDepositorPresignTransactionsResponse {\n txs: ClaimerTransactions[];\n depositor_graph: DepositorGraphTransactions;\n}\n\n/** BaBe garbled-circuit session data for a single challenger. */\nexport interface BaBeSessionData {\n decryptor_artifacts_hex: string;\n}\n\n/** Response from `requestDepositorClaimerArtifacts`. */\nexport interface RequestDepositorClaimerArtifactsResponse {\n tx_graph_json: string;\n verifying_key_hex: string;\n babe_sessions: Record<string, BaBeSessionData>;\n}\n\n/** Progress tracker for a multi-challenger operation. */\nexport interface ChallengerProgress {\n total_challengers: number;\n completed_challengers: number;\n completed_challenger_pubkeys: string[];\n pending_challenger_pubkeys: string[];\n}\n\nexport type GcDataProgress = ChallengerProgress;\nexport type AckCollectionProgress = ChallengerProgress;\n\n/** Extended presigning progress with all 3 concurrent phases. */\nexport interface PresigningProgress extends ChallengerProgress {\n depositor_graph_created?: boolean;\n vk_challenger_presigning_completed?: number;\n vk_challenger_presigning_total?: number;\n}\n\n/** Detailed progress breakdown for an in-progress pegin. */\nexport interface PeginProgressDetails {\n gc_data?: GcDataProgress;\n presigning?: PresigningProgress;\n ack_collection?: AckCollectionProgress;\n claimer_graphs?: ClaimerGraphStatus[];\n}\n\n/** Per-claimer graph status (challenger perspective). */\nexport interface ClaimerGraphStatus {\n claimer_pubkey: string;\n presigned: boolean;\n}\n\n/** Response from `getPeginStatus`. */\nexport interface GetPeginStatusResponse {\n pegin_txid: string;\n status: string;\n progress: PeginProgressDetails;\n health_info: string;\n last_error?: string;\n}\n\n// ============================================================================\n// Pegout Types\n// ============================================================================\n\n/** Params for querying pegout status from the VP daemon. */\nexport interface GetPegoutStatusParams {\n pegin_txid: string;\n}\n\n/** Claimer-side pegout progress. */\nexport interface ClaimerPegoutStatus {\n status: string;\n failed: boolean;\n claim_txid?: string;\n claimer_pubkey?: string;\n challenger_pubkey?: string;\n created_at?: string;\n updated_at?: string;\n}\n\n/** Challenger-side pegout progress. */\nexport interface ChallengerPegoutStatus {\n status: string;\n claim_txid?: string;\n claimer_pubkey?: string;\n assert_txid?: string;\n challenge_assert_txid?: string;\n nopayout_txid?: string;\n created_at?: string;\n updated_at?: string;\n}\n\n/** Response from `getPegoutStatus`. */\nexport interface GetPegoutStatusResponse {\n pegin_txid: string;\n found: boolean;\n claimer?: ClaimerPegoutStatus;\n challenger?: ChallengerPegoutStatus;\n}\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\n/** JSON-RPC error codes returned by the vault provider. */\nexport enum RpcErrorCode {\n DATABASE_ERROR = -32005,\n PRESIGN_ERROR = -32006,\n JSON_SERIALIZATION_ERROR = -32007,\n TX_GRAPH_ERROR = -32008,\n INVALID_GRAPH = -32009,\n VALIDATION_ERROR = -32010,\n NOT_FOUND = -32011,\n INTERNAL_ERROR = -32603,\n}\n"],"names":["JsonRpcError","code","message","JSON_RPC_ERROR_CODES","JSON_RPC_VERSION","DEFAULT_RETRY_ATTEMPTS","DEFAULT_RETRY_DELAY_MS","RETRYABLE_HTTP_STATUS_CODES","DEFAULT_RETRYABLE_METHODS","defaultRetryableFor","method","JsonRpcClient","config","__publicField","params","signal","response","jsonResponse","rpcResponse","err","callerSignal","requestId","maxRetries","body","lastError","attempt","timeoutController","timeoutId","merged","mergeAbortSignals","delay","error","ms","resolve","reject","onAbort","a","b","controller","onAbortA","onAbortB","cleanup","DaemonStatus","PRE_DEPOSITOR_SIGNATURES_STATES","POST_PAYOUT_SIGNATURE_STATUSES","VP_TRANSIENT_STATUSES","VP_TERMINAL_STATUSES","POST_WOTS_STATUSES","RpcErrorCode"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var w=Object.defineProperty;var y=(e,t,r)=>t in e?w(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var T=(e,t,r)=>y(e,typeof t!="symbol"?t+"":t,r);class a extends Error{constructor(t,r){super(r),this.code=t,this.name="JsonRpcError"}}const _={TIMEOUT:-32e3,NETWORK:-32001,PROXY_TIMEOUT:-32002,PROXY_UNAVAILABLE:-32003,INVALID_RESPONSE:-32700},b="2.0",g=3,D=1e3,L=new Set([408,429,500,502,503,504]),p=new Set(["vaultProvider_getPeginStatus","vaultProvider_getPegoutStatus","vaultProvider_requestDepositorPresignTransactions"]);function v(e){return p.has(e)}class U{constructor(t){T(this,"baseUrl");T(this,"timeout");T(this,"headers");T(this,"requestId",0);T(this,"retries");T(this,"retryDelay");T(this,"retryableFor");this.baseUrl=t.baseUrl.replace(/\/$/,""),this.timeout=t.timeout,this.headers={"Content-Type":"application/json",...t.headers},this.retries=t.retries??g,this.retryDelay=t.retryDelay??D,this.retryableFor=t.retryableFor??v}async call(t,r,n){const i=await this.fetchWithRetry(t,r,n);let s;try{s=await i.json()}catch{throw new a(_.INVALID_RESPONSE,"Invalid JSON-RPC response: body is not valid JSON")}if(s===null||typeof s!="object"||Array.isArray(s))throw new a(_.INVALID_RESPONSE,`Invalid JSON-RPC response: expected an object, got ${typeof s}`);const E=s;if("error"in E&&E.error!=null){const A=E.error;throw new a(A.code??_.INVALID_RESPONSE,A.message??"Unknown RPC error")}if(!("result"in E))throw new a(_.INVALID_RESPONSE,'Invalid JSON-RPC response: missing "result" field');return E.result}async callRaw(t,r,n){return this.fetchWithRetry(t,r,n)}async fetchWithRetry(t,r,n){const i=++this.requestId,s=this.retryableFor(t)?this.retries:0,A=JSON.stringify({jsonrpc:b,method:t,params:[r],id:i});let N=null;for(let P=0;P<=s;P++){const I=new AbortController,O=setTimeout(()=>I.abort(),this.timeout),R=n?f(n,I.signal):null,l=R?R.signal:I.signal;try{const o=await fetch(this.baseUrl,{method:"POST",headers:this.headers,body:A,signal:l});if(clearTimeout(O),R==null||R.cleanup(),!o.ok){if(P<s&&L.has(o.status)){const d=this.retryDelay*Math.pow(2,P);await this.sleep(d,n);continue}throw new Error(`HTTP error: ${o.status} ${o.statusText}`)}return o}catch(o){if(clearTimeout(O),R==null||R.cleanup(),N=o instanceof Error?o:new Error(String(o)),n!=null&&n.aborted)throw new Error("Request aborted");if(o instanceof Error&&o.name==="AbortError"){if(P<s){const S=this.retryDelay*Math.pow(2,P);await this.sleep(S,n);continue}throw new a(_.TIMEOUT,`Request timeout after ${this.timeout}ms (${s+1} attempts)`)}if(o instanceof TypeError){if(P<s){const S=this.retryDelay*Math.pow(2,P);await this.sleep(S,n);continue}throw new a(_.NETWORK,`Network error: ${o.message} (${s+1} attempts)`)}throw o}}throw N||new Error("Unknown error after retries")}sleep(t,r){return new Promise((n,i)=>{if(r!=null&&r.aborted){i(new Error("Request aborted"));return}const s=setTimeout(()=>{r==null||r.removeEventListener("abort",E),n()},t),E=()=>{clearTimeout(s),i(new Error("Request aborted"))};r==null||r.addEventListener("abort",E,{once:!0})})}getBaseUrl(){return this.baseUrl}}function f(e,t){if(e.aborted)return{signal:e,cleanup:()=>{}};if(t.aborted)return{signal:t,cleanup:()=>{}};const r=new AbortController,n=()=>{t.removeEventListener("abort",i),r.abort()},i=()=>{e.removeEventListener("abort",n),r.abort()};e.addEventListener("abort",n,{once:!0}),t.addEventListener("abort",i,{once:!0});const s=()=>{e.removeEventListener("abort",n),t.removeEventListener("abort",i)};return{signal:r.signal,cleanup:s}}var u=(e=>(e.PENDING_INGESTION="PendingIngestion",e.PENDING_DEPOSITOR_WOTS_PK="PendingDepositorWotsPK",e.PENDING_BABE_SETUP="PendingBabeSetup",e.PENDING_CHALLENGER_PRESIGNING="PendingChallengerPresigning",e.PENDING_PEGIN_SIGS_AVAILABILITY="PendingPeginSigsAvailability",e.PENDING_PRE_PEGIN_CONFIRMATIONS="PendingPrePegInConfirmations",e.PENDING_DEPOSITOR_SIGNATURES="PendingDepositorSignatures",e.PENDING_ACKS="PendingACKs",e.PENDING_ACTIVATION="PendingActivation",e.ACTIVATED="Activated",e.EXPIRED="Expired",e.CLAIM_POSTED="ClaimPosted",e.PEGGED_OUT="PeggedOut",e))(u||{});const G=["PendingIngestion","PendingBabeSetup","PendingChallengerPresigning","PendingPeginSigsAvailability","PendingPrePegInConfirmations"],m=["PendingACKs","PendingActivation","Activated"],c=new Set(["PendingBabeSetup","PendingChallengerPresigning","PendingPeginSigsAvailability","PendingPrePegInConfirmations",...m]),C=new Set(["Expired","ClaimPosted","PeggedOut"]),V=new Set([...c,"PendingDepositorSignatures"]);var h=(e=>(e[e.DATABASE_ERROR=-32005]="DATABASE_ERROR",e[e.PRESIGN_ERROR=-32006]="PRESIGN_ERROR",e[e.JSON_SERIALIZATION_ERROR=-32007]="JSON_SERIALIZATION_ERROR",e[e.TX_GRAPH_ERROR=-32008]="TX_GRAPH_ERROR",e[e.INVALID_GRAPH=-32009]="INVALID_GRAPH",e[e.VALIDATION_ERROR=-32010]="VALIDATION_ERROR",e[e.NOT_FOUND=-32011]="NOT_FOUND",e[e.INTERNAL_ERROR=-32603]="INTERNAL_ERROR",e))(h||{});exports.DaemonStatus=u;exports.JSON_RPC_ERROR_CODES=_;exports.JsonRpcClient=U;exports.JsonRpcError=a;exports.POST_WOTS_STATUSES=V;exports.PRE_DEPOSITOR_SIGNATURES_STATES=G;exports.RpcErrorCode=h;exports.VP_TERMINAL_STATUSES=C;exports.VP_TRANSIENT_STATUSES=c;
2
+ //# sourceMappingURL=types-DEWiqXYp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DEWiqXYp.cjs","sources":["../src/tbv/core/clients/vault-provider/json-rpc-client.ts","../src/tbv/core/clients/vault-provider/types.ts"],"sourcesContent":["/**\n * Generic JSON-RPC 2.0 HTTP Client\n *\n * Framework-agnostic client using `fetch()` — works in browsers and Node.js 18+.\n * Includes configurable retry policy and AbortSignal passthrough.\n */\n\nexport interface JsonRpcRequest<T = unknown> {\n jsonrpc: \"2.0\";\n method: string;\n params: T;\n id: number | string;\n}\n\nexport interface JsonRpcSuccessResponse<T = unknown> {\n jsonrpc: \"2.0\";\n result: T;\n id: number | string;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n id: number | string;\n}\n\nexport type JsonRpcResponse<T = unknown> =\n | JsonRpcSuccessResponse<T>\n | JsonRpcErrorResponse;\n\nexport interface JsonRpcClientConfig {\n /** Base URL of the RPC service */\n baseUrl: string;\n /** Timeout in milliseconds per request attempt */\n timeout: number;\n /** Optional custom headers */\n headers?: Record<string, string>;\n /** Number of retry attempts for transient errors (default: 3) */\n retries?: number;\n /** Initial retry delay in milliseconds (default: 1000) */\n retryDelay?: number;\n /**\n * Predicate to determine if a method is safe to retry.\n * Default: only retry `vaultProvider_getPeginStatus` and `vaultProvider_getPegoutStatus`.\n * Write/mutating methods are NOT retried by default.\n */\n retryableFor?: (method: string) => boolean;\n}\n\nexport class JsonRpcError extends Error {\n constructor(\n public code: number,\n message: string,\n ) {\n super(message);\n this.name = \"JsonRpcError\";\n }\n}\n\nexport const JSON_RPC_ERROR_CODES = {\n TIMEOUT: -32000,\n NETWORK: -32001,\n /** VP proxy: request timed out at proxy level */\n PROXY_TIMEOUT: -32002,\n /** VP proxy: VP unreachable / DNS failure / response too large */\n PROXY_UNAVAILABLE: -32003,\n /** SDK client: response missing \"result\" field (malformed JSON-RPC) */\n INVALID_RESPONSE: -32700,\n} as const;\n\n/** JSON-RPC protocol version */\nconst JSON_RPC_VERSION = \"2.0\" as const;\n\n/** Default number of retry attempts for transient errors */\nconst DEFAULT_RETRY_ATTEMPTS = 3;\n\n/** Default initial retry delay in milliseconds */\nconst DEFAULT_RETRY_DELAY_MS = 1000;\n\n/** HTTP status codes that indicate transient server errors and are safe to retry */\nconst RETRYABLE_HTTP_STATUS_CODES: ReadonlySet<number> = new Set([\n 408, // Request Timeout\n 429, // Too Many Requests\n 500, // Internal Server Error\n 502, // Bad Gateway\n 503, // Service Unavailable\n 504, // Gateway Timeout\n]);\n\n/** Default retry predicate: only retry read-only / idempotent methods */\nconst DEFAULT_RETRYABLE_METHODS: ReadonlySet<string> = new Set([\n \"vaultProvider_getPeginStatus\",\n \"vaultProvider_getPegoutStatus\",\n \"vaultProvider_requestDepositorPresignTransactions\",\n]);\n\nfunction defaultRetryableFor(method: string): boolean {\n return DEFAULT_RETRYABLE_METHODS.has(method);\n}\n\n/**\n * Generic JSON-RPC 2.0 HTTP client with safe retry policy.\n */\nexport class JsonRpcClient {\n private baseUrl: string;\n private timeout: number;\n private headers: Record<string, string>;\n private requestId = 0;\n private retries: number;\n private retryDelay: number;\n private retryableFor: (method: string) => boolean;\n\n constructor(config: JsonRpcClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.timeout = config.timeout;\n this.headers = {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n };\n this.retries = config.retries ?? DEFAULT_RETRY_ATTEMPTS;\n this.retryDelay = config.retryDelay ?? DEFAULT_RETRY_DELAY_MS;\n this.retryableFor = config.retryableFor ?? defaultRetryableFor;\n }\n\n /**\n * Make a JSON-RPC request with optional retry for safe methods.\n *\n * @param method - The RPC method name\n * @param params - The method parameters\n * @param signal - Optional AbortSignal for caller-controlled cancellation\n * @returns The result from the RPC method\n * @throws JsonRpcError if the RPC call fails\n */\n async call<TParams, TResult>(\n method: string,\n params: TParams,\n signal?: AbortSignal,\n ): Promise<TResult> {\n const response = await this.fetchWithRetry(method, params, signal);\n\n let jsonResponse: unknown;\n try {\n jsonResponse = await response.json();\n } catch {\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n \"Invalid JSON-RPC response: body is not valid JSON\",\n );\n }\n\n if (\n jsonResponse === null ||\n typeof jsonResponse !== \"object\" ||\n Array.isArray(jsonResponse)\n ) {\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n `Invalid JSON-RPC response: expected an object, got ${typeof jsonResponse}`,\n );\n }\n\n const rpcResponse = jsonResponse as Record<string, unknown>;\n\n if (\"error\" in rpcResponse && rpcResponse.error != null) {\n const err = rpcResponse.error as { code?: number; message?: string };\n throw new JsonRpcError(\n err.code ?? JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n err.message ?? \"Unknown RPC error\",\n );\n }\n\n if (!(\"result\" in rpcResponse)) {\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.INVALID_RESPONSE,\n `Invalid JSON-RPC response: missing \"result\" field`,\n );\n }\n\n return rpcResponse.result as TResult;\n }\n\n /**\n * Make a JSON-RPC request returning the raw Response (unparsed body).\n */\n async callRaw<TParams>(\n method: string,\n params: TParams,\n signal?: AbortSignal,\n ): Promise<Response> {\n return this.fetchWithRetry(method, params, signal);\n }\n\n private async fetchWithRetry<TParams>(\n method: string,\n params: TParams,\n callerSignal?: AbortSignal,\n ): Promise<Response> {\n const requestId = ++this.requestId;\n const maxRetries = this.retryableFor(method) ? this.retries : 0;\n\n // jsonrpsee (Rust backend) expects params as an array (positional parameters)\n const request: JsonRpcRequest<TParams[]> = {\n jsonrpc: JSON_RPC_VERSION,\n method,\n params: [params],\n id: requestId,\n };\n\n const body = JSON.stringify(request);\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // Merge caller signal with per-request timeout signal\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(\n () => timeoutController.abort(),\n this.timeout,\n );\n\n const merged = callerSignal\n ? mergeAbortSignals(callerSignal, timeoutController.signal)\n : null;\n const signal = merged ? merged.signal : timeoutController.signal;\n\n try {\n const response = await fetch(this.baseUrl, {\n method: \"POST\",\n headers: this.headers,\n body,\n signal,\n });\n\n clearTimeout(timeoutId);\n merged?.cleanup();\n\n if (!response.ok) {\n const shouldRetry =\n attempt < maxRetries &&\n RETRYABLE_HTTP_STATUS_CODES.has(response.status);\n\n if (shouldRetry) {\n const delay = this.retryDelay * Math.pow(2, attempt);\n await this.sleep(delay, callerSignal);\n continue;\n }\n\n throw new Error(\n `HTTP error: ${response.status} ${response.statusText}`,\n );\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n merged?.cleanup();\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if caller aborted (not our timeout)\n if (callerSignal?.aborted) {\n throw new Error(\"Request aborted\");\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n if (attempt < maxRetries) {\n const delay = this.retryDelay * Math.pow(2, attempt);\n await this.sleep(delay, callerSignal);\n continue;\n }\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.TIMEOUT,\n `Request timeout after ${this.timeout}ms (${maxRetries + 1} attempts)`,\n );\n }\n\n // Handle network errors (CORS, connection refused, etc.)\n if (error instanceof TypeError) {\n if (attempt < maxRetries) {\n const delay = this.retryDelay * Math.pow(2, attempt);\n await this.sleep(delay, callerSignal);\n continue;\n }\n throw new JsonRpcError(\n JSON_RPC_ERROR_CODES.NETWORK,\n `Network error: ${error.message} (${maxRetries + 1} attempts)`,\n );\n }\n\n // Don't retry JSON-RPC errors (business logic errors)\n throw error;\n }\n }\n\n throw lastError || new Error(\"Unknown error after retries\");\n }\n\n private sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error(\"Request aborted\"));\n return;\n }\n const timeoutId = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timeoutId);\n reject(new Error(\"Request aborted\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n}\n\ninterface MergedSignal {\n signal: AbortSignal;\n /** Remove listeners from the source signals. Call after the request completes. */\n cleanup: () => void;\n}\n\n/**\n * Merge two AbortSignals — the returned signal aborts if either input aborts.\n * Returns a cleanup function to remove listeners when the request completes\n * normally, preventing listener accumulation in long-lived polling flows.\n */\nfunction mergeAbortSignals(\n a: AbortSignal,\n b: AbortSignal,\n): MergedSignal {\n if (a.aborted) return { signal: a, cleanup: () => {} };\n if (b.aborted) return { signal: b, cleanup: () => {} };\n\n const controller = new AbortController();\n const onAbortA = () => {\n b.removeEventListener(\"abort\", onAbortB);\n controller.abort();\n };\n const onAbortB = () => {\n a.removeEventListener(\"abort\", onAbortA);\n controller.abort();\n };\n a.addEventListener(\"abort\", onAbortA, { once: true });\n b.addEventListener(\"abort\", onAbortB, { once: true });\n\n const cleanup = () => {\n a.removeEventListener(\"abort\", onAbortA);\n b.removeEventListener(\"abort\", onAbortB);\n };\n\n return { signal: controller.signal, cleanup };\n}\n","/**\n * Type definitions for Vault Provider JSON-RPC API.\n *\n * These types match the `vaultProvider_*` RPC namespace defined by the\n * btc-vault daemon. They are the SDK's canonical copy of the VP protocol\n * contract, independent of any frontend framework.\n *\n * @see https://github.com/babylonlabs-io/btc-vault/blob/main/docs/pegin.md\n */\n\n// ============================================================================\n// Daemon Status\n// ============================================================================\n\n/**\n * Backend daemon status (vault provider database).\n * Source: btc-vault crates/vaultd/src/workers/claimer/mod.rs PegInStatus enum\n *\n * State flow (happy path):\n * PendingIngestion -> PendingDepositorWotsPK -> PendingBabeSetup -> PendingChallengerPresigning\n * -> PendingPeginSigsAvailability -> PendingPrePegInConfirmations\n * -> PendingDepositorSignatures -> PendingACKs -> PendingActivation -> Activated\n *\n * Terminal / branching states:\n * - Expired: vault timed out before activation\n * - ClaimPosted: claim transaction posted on-chain\n * - PeggedOut: BTC has been returned to the depositor\n */\nexport enum DaemonStatus {\n PENDING_INGESTION = \"PendingIngestion\",\n PENDING_DEPOSITOR_WOTS_PK = \"PendingDepositorWotsPK\",\n PENDING_BABE_SETUP = \"PendingBabeSetup\",\n PENDING_CHALLENGER_PRESIGNING = \"PendingChallengerPresigning\",\n PENDING_PEGIN_SIGS_AVAILABILITY = \"PendingPeginSigsAvailability\",\n PENDING_PRE_PEGIN_CONFIRMATIONS = \"PendingPrePegInConfirmations\",\n PENDING_DEPOSITOR_SIGNATURES = \"PendingDepositorSignatures\",\n PENDING_ACKS = \"PendingACKs\",\n PENDING_ACTIVATION = \"PendingActivation\",\n ACTIVATED = \"Activated\",\n EXPIRED = \"Expired\",\n CLAIM_POSTED = \"ClaimPosted\",\n PEGGED_OUT = \"PeggedOut\",\n}\n\n// ============================================================================\n// Status Groups\n// ============================================================================\n\n/**\n * States where the VP is still processing (no depositor action needed).\n * Excludes PENDING_DEPOSITOR_WOTS_PK (requires depositor action).\n */\nexport const PRE_DEPOSITOR_SIGNATURES_STATES: readonly DaemonStatus[] = [\n DaemonStatus.PENDING_INGESTION,\n DaemonStatus.PENDING_BABE_SETUP,\n DaemonStatus.PENDING_CHALLENGER_PRESIGNING,\n DaemonStatus.PENDING_PEGIN_SIGS_AVAILABILITY,\n DaemonStatus.PENDING_PRE_PEGIN_CONFIRMATIONS,\n];\n\n/** States after PendingDepositorSignatures where the depositor has no action. */\nconst POST_PAYOUT_SIGNATURE_STATUSES: readonly DaemonStatus[] = [\n DaemonStatus.PENDING_ACKS,\n DaemonStatus.PENDING_ACTIVATION,\n DaemonStatus.ACTIVATED,\n];\n\n/**\n * Statuses where no depositor action is needed (VP processing or already past\n * depositor interaction). Excludes PENDING_INGESTION and PENDING_DEPOSITOR_WOTS_PK.\n */\nexport const VP_TRANSIENT_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n DaemonStatus.PENDING_BABE_SETUP,\n DaemonStatus.PENDING_CHALLENGER_PRESIGNING,\n DaemonStatus.PENDING_PEGIN_SIGS_AVAILABILITY,\n DaemonStatus.PENDING_PRE_PEGIN_CONFIRMATIONS,\n ...POST_PAYOUT_SIGNATURE_STATUSES,\n]);\n\n/**\n * Terminal VP statuses where no further progress is possible.\n * If the VP reaches one of these states while polling, polling should\n * stop immediately with an error rather than waiting for timeout.\n */\nexport const VP_TERMINAL_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n DaemonStatus.EXPIRED,\n DaemonStatus.CLAIM_POSTED,\n DaemonStatus.PEGGED_OUT,\n]);\n\n/**\n * Statuses that come after WOTS key submission.\n * If the VP is already in one of these states, the WOTS key was already\n * submitted and we can skip.\n */\nexport const POST_WOTS_STATUSES: ReadonlySet<DaemonStatus> = new Set([\n ...VP_TRANSIENT_STATUSES,\n DaemonStatus.PENDING_DEPOSITOR_SIGNATURES,\n]);\n\n// ============================================================================\n// WOTS Types (needed by SubmitDepositorWotsKeyParams)\n// ============================================================================\n\n/**\n * WOTS configuration for a single block.\n * Matches Rust `babe::wots::Config` serde format.\n */\nexport interface WotsConfig {\n /** Digit bit-width (e.g. 4 → base-16 digits). */\n d: number;\n /** Number of message digits in this block. */\n n: number;\n /** Radix used for the checksum computation. */\n checksum_radix: number;\n}\n\n/**\n * A single block of WOTS public keys.\n * Chain values are arrays of byte values (matching Rust `[u8; 20]`).\n */\nexport interface WotsBlockPublicKey {\n config: WotsConfig;\n message_terminals: number[][];\n checksum_major_terminal: number[];\n checksum_minor_terminal: number[];\n}\n\n// ============================================================================\n// Request Parameter Types\n// ============================================================================\n\n/** Params for requesting the payout/claim/assert transactions to pre-sign. */\nexport interface RequestDepositorPresignTransactionsParams {\n pegin_txid: string;\n depositor_pk: string;\n}\n\n/** Params for submitting the depositor's WOTS public key to the VP. */\nexport interface SubmitDepositorWotsKeyParams {\n pegin_txid: string;\n depositor_pk: string;\n wots_public_keys: WotsBlockPublicKey[];\n}\n\n/** Per-challenger signatures for the depositor-as-claimer flow. */\nexport interface DepositorPreSigsPerChallenger {\n nopayout_signature: string;\n}\n\n/** Depositor-as-claimer pre-signatures (payout + per-challenger). */\nexport interface DepositorAsClaimerPresignatures {\n payout_signatures: ClaimerSignatures;\n per_challenger: Record<string, DepositorPreSigsPerChallenger>;\n}\n\n/** Params for submitting depositor pre-signatures including claimer presignatures. */\nexport interface SubmitDepositorPresignaturesParams {\n pegin_txid: string;\n depositor_pk: string;\n signatures: Record<string, ClaimerSignatures>;\n depositor_claimer_presignatures: DepositorAsClaimerPresignatures;\n}\n\n/** Payout signatures per claimer. */\nexport interface ClaimerSignatures {\n payout_signature: string;\n}\n\n/** Params for requesting BaBe DecryptorArtifacts from the VP. */\nexport interface RequestDepositorClaimerArtifactsParams {\n pegin_txid: string;\n depositor_pk: string;\n}\n\n/** Params for querying pegin status. Either pegin_txid or vault_id must be provided. */\nexport type GetPeginStatusParams =\n | { pegin_txid: string; vault_id?: never }\n | { vault_id: string; pegin_txid?: never };\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/** A raw Bitcoin transaction with its hex encoding. */\nexport interface TransactionData {\n tx_hex: string;\n}\n\n/** Set of transactions the depositor must pre-sign for a single claimer. */\nexport interface ClaimerTransactions {\n claimer_pubkey: string;\n claim_tx: TransactionData;\n assert_tx: TransactionData;\n payout_tx: TransactionData;\n payout_psbt: string;\n}\n\n/** Per-segment connector data for ChallengeAssert inputs. */\nexport interface ChallengeAssertConnectorData {\n wots_pks_json: string;\n gc_wots_keys_json: string;\n}\n\n/** Challenger-specific transactions and signing data for the depositor graph. */\nexport interface PresignDataPerChallenger {\n challenger_pubkey: string;\n challenge_assert_x_tx: TransactionData;\n challenge_assert_y_tx: TransactionData;\n nopayout_tx: TransactionData;\n nopayout_psbt: string;\n challenge_assert_connectors: ChallengeAssertConnectorData[];\n output_label_hashes: string[];\n}\n\n/** Depositor-as-claimer TxGraph transactions. */\nexport interface DepositorGraphTransactions {\n claim_tx: TransactionData;\n assert_tx: TransactionData;\n payout_tx: TransactionData;\n payout_psbt: string;\n challenger_presign_data: PresignDataPerChallenger[];\n offchain_params_version: number;\n}\n\n/** Response from `requestDepositorPresignTransactions`. */\nexport interface RequestDepositorPresignTransactionsResponse {\n txs: ClaimerTransactions[];\n depositor_graph: DepositorGraphTransactions;\n}\n\n/** BaBe garbled-circuit session data for a single challenger. */\nexport interface BaBeSessionData {\n decryptor_artifacts_hex: string;\n}\n\n/** Response from `requestDepositorClaimerArtifacts`. */\nexport interface RequestDepositorClaimerArtifactsResponse {\n tx_graph_json: string;\n verifying_key_hex: string;\n babe_sessions: Record<string, BaBeSessionData>;\n}\n\n/** Progress tracker for a multi-challenger operation. */\nexport interface ChallengerProgress {\n total_challengers: number;\n completed_challengers: number;\n completed_challenger_pubkeys: string[];\n pending_challenger_pubkeys: string[];\n}\n\nexport type GcDataProgress = ChallengerProgress;\nexport type AckCollectionProgress = ChallengerProgress;\n\n/** Extended presigning progress with all 3 concurrent phases. */\nexport interface PresigningProgress extends ChallengerProgress {\n depositor_graph_created?: boolean;\n vk_challenger_presigning_completed?: number;\n vk_challenger_presigning_total?: number;\n}\n\n/** Detailed progress breakdown for an in-progress pegin. */\nexport interface PeginProgressDetails {\n gc_data?: GcDataProgress;\n presigning?: PresigningProgress;\n ack_collection?: AckCollectionProgress;\n claimer_graphs?: ClaimerGraphStatus[];\n}\n\n/** Per-claimer graph status (challenger perspective). */\nexport interface ClaimerGraphStatus {\n claimer_pubkey: string;\n presigned: boolean;\n}\n\n/** Response from `getPeginStatus`. */\nexport interface GetPeginStatusResponse {\n pegin_txid: string;\n status: string;\n progress: PeginProgressDetails;\n health_info: string;\n last_error?: string;\n}\n\n// ============================================================================\n// Pegout Types\n// ============================================================================\n\n/** Params for querying pegout status from the VP daemon. */\nexport interface GetPegoutStatusParams {\n pegin_txid: string;\n}\n\n/** Claimer-side pegout progress. */\nexport interface ClaimerPegoutStatus {\n status: string;\n failed: boolean;\n claim_txid?: string;\n claimer_pubkey?: string;\n challenger_pubkey?: string;\n created_at?: string;\n updated_at?: string;\n}\n\n/** Challenger-side pegout progress. */\nexport interface ChallengerPegoutStatus {\n status: string;\n claim_txid?: string;\n claimer_pubkey?: string;\n assert_txid?: string;\n challenge_assert_txid?: string;\n nopayout_txid?: string;\n created_at?: string;\n updated_at?: string;\n}\n\n/** Response from `getPegoutStatus`. */\nexport interface GetPegoutStatusResponse {\n pegin_txid: string;\n found: boolean;\n claimer?: ClaimerPegoutStatus;\n challenger?: ChallengerPegoutStatus;\n}\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\n/** JSON-RPC error codes returned by the vault provider. */\nexport enum RpcErrorCode {\n DATABASE_ERROR = -32005,\n PRESIGN_ERROR = -32006,\n JSON_SERIALIZATION_ERROR = -32007,\n TX_GRAPH_ERROR = -32008,\n INVALID_GRAPH = -32009,\n VALIDATION_ERROR = -32010,\n NOT_FOUND = -32011,\n INTERNAL_ERROR = -32603,\n}\n"],"names":["JsonRpcError","code","message","JSON_RPC_ERROR_CODES","JSON_RPC_VERSION","DEFAULT_RETRY_ATTEMPTS","DEFAULT_RETRY_DELAY_MS","RETRYABLE_HTTP_STATUS_CODES","DEFAULT_RETRYABLE_METHODS","defaultRetryableFor","method","JsonRpcClient","config","__publicField","params","signal","response","jsonResponse","rpcResponse","err","callerSignal","requestId","maxRetries","body","lastError","attempt","timeoutController","timeoutId","merged","mergeAbortSignals","delay","error","ms","resolve","reject","onAbort","a","b","controller","onAbortA","onAbortB","cleanup","DaemonStatus","PRE_DEPOSITOR_SIGNATURES_STATES","POST_PAYOUT_SIGNATURE_STATUSES","VP_TRANSIENT_STATUSES","VP_TERMINAL_STATUSES","POST_WOTS_STATUSES","RpcErrorCode"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonlabs-io/ts-sdk",
3
- "version": "0.16.2",
3
+ "version": "0.17.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -30,6 +30,16 @@
30
30
  "require": "./dist/tbv/core/utils/index.cjs",
31
31
  "import": "./dist/tbv/core/utils/index.js"
32
32
  },
33
+ "./tbv/core/clients": {
34
+ "types": "./dist/tbv/core/clients/index.d.ts",
35
+ "require": "./dist/tbv/core/clients/index.cjs",
36
+ "import": "./dist/tbv/core/clients/index.js"
37
+ },
38
+ "./tbv/core/services": {
39
+ "types": "./dist/tbv/core/services/index.d.ts",
40
+ "require": "./dist/tbv/core/services/index.cjs",
41
+ "import": "./dist/tbv/core/services/index.js"
42
+ },
33
43
  "./tbv/integrations/aave": {
34
44
  "types": "./dist/tbv/integrations/aave/index.d.ts",
35
45
  "require": "./dist/tbv/integrations/aave/index.cjs",
@@ -1,2 +0,0 @@
1
- "use strict";const y=require("@babylonlabs-io/babylon-tbv-rust-wasm"),p=require("bitcoinjs-lib"),a=require("buffer");function q(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const C=q(p),T=192;function g(e){return e.startsWith("0x")?e.slice(2):e}function D(e){return e.startsWith("0x")?e:`0x${e}`}function P(e){const t=g(e);if(!B(t))throw new Error(`Invalid hex string: ${e}`);const n=new Uint8Array(t.length/2);for(let r=0;r<t.length;r+=2)n[r/2]=parseInt(t.slice(r,r+2),16);return n}function k(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}function U(e){return e.length===32?e:e.slice(1,33)}function B(e){return/^[0-9a-fA-F]*$/.test(e)&&e.length%2===0}function m(e){const t=g(e);if(!B(t))throw new Error(`Invalid hex characters in public key: ${e}`);if(t.length===64)return t;if(t.length!==66&&t.length!==130)throw new Error(`Invalid public key length: ${t.length} (expected 64, 66, or 130 hex chars)`);const n=P(t);return k(U(n))}function z(e){const t=g(e);return B(t)}function M(e,t){const n=m(e),r=t??n;if(n.toLowerCase()!==r.toLowerCase())throw new Error(`Wallet public key does not match vault depositor. Expected: ${r}, Got: ${n}. Please connect the wallet that was used to create this vault.`);return{walletPubkeyRaw:e,walletPubkeyXOnly:n,depositorPubkey:r}}function X(){try{p.payments.p2tr({internalPubkey:a.Buffer.alloc(32,1)})}catch(e){if(e instanceof Error&&e.message.includes("No ECC Library provided"))throw new Error('ECC library not initialized. You must call initEccLib(ecc) from "bitcoinjs-lib" before using the SDK. See the ts-sdk README for setup instructions.')}}function A(e){switch(e){case"bitcoin":return p.networks.bitcoin;case"testnet":case"signet":return p.networks.testnet;case"regtest":return p.networks.regtest;default:throw new Error(`Unknown network: ${e}`)}}function $(e,t){X();const n=P(m(e)),{address:r}=p.payments.p2tr({internalPubkey:a.Buffer.from(n),network:A(t)});if(!r)throw new Error("Failed to derive taproot address from public key");return r}function R(e,t){const n=g(e);if(n.length!==66)throw new Error(`Native SegWit requires a compressed public key (66 hex chars), got ${n.length}`);const{address:r}=p.payments.p2wpkh({pubkey:a.Buffer.from(P(n)),network:A(t)});if(!r)throw new Error("Failed to derive native segwit address from public key");return r}function Y(e,t,n){const r=g(t);try{if(e===$(r,n))return!0}catch{}const o=[];r.length===66?o.push(r):r.length===64&&o.push(`02${r}`,`03${r}`);for(const i of o)try{if(e===R(i,n))return!0}catch{}return!1}function I(e){return m(e).toLowerCase()}function G(e,t,n){const r=new Set;r.add(I(e));for(const o of t)r.add(I(o));return r.delete(I(n)),r.size}const j=58,Z=43,Q=11,O=546,F=BigInt(O),N=30,K=2,J=1.1;function ee(e){return e<=K?N:0}const V=1;function te(e){return e+V}const ne=5;function H(e){const n=e.substring(8,12)==="0001"?12:8,r=parseInt(e.substring(n,n+2),16),o=parseInt(e.substring(n+2,n+4),16);if(r!==0)throw new Error(`Expected 0 inputs from WASM, got ${r}`);if(o===0)throw new Error("Expected at least 1 output from WASM, got 0");const i=a.Buffer.from(e.substring(0,8),"hex").readUInt32LE(0),c=a.Buffer.from(e.substring(e.length-8),"hex").readUInt32LE(0),u=[];let s=n+4;for(let f=0;f<o;f++){const l=e.substring(s,s+16),d=Number(a.Buffer.from(l,"hex").readBigUInt64LE(0));s+=16;const h=parseInt(e.substring(s,s+2),16);s+=2;const x=e.substring(s,s+h*2),b=a.Buffer.from(x,"hex");s+=h*2,u.push({value:d,script:b})}return{version:i,locktime:c,outputs:u}}function re(e){const{unfundedTxHex:t,selectedUTXOs:n,changeAddress:r,changeAmount:o,network:i}=e,{version:c,locktime:u,outputs:s}=H(t),f=new C.Transaction;f.version=c,f.locktime=u;for(const l of n){const d=a.Buffer.from(l.txid,"hex").reverse();f.addInput(d,l.vout)}for(const l of s)f.addOutput(l.script,l.value);if(o>F){const l=C.address.toOutputScript(r,i);f.addOutput(l,Number(o))}return f.toHex()}async function oe(e){const t=await y.createPrePeginTransaction({depositorPubkey:e.depositorPubkey,vaultProviderPubkey:e.vaultProviderPubkey,vaultKeeperPubkeys:e.vaultKeeperPubkeys,universalChallengerPubkeys:e.universalChallengerPubkeys,hashlocks:[...e.hashlocks],timelockRefund:e.timelockRefund,pegInAmounts:[...e.pegInAmounts],feeRate:e.feeRate,numLocalChallengers:e.numLocalChallengers,councilQuorum:e.councilQuorum,councilSize:e.councilSize,network:e.network}),r=H(t.txHex).outputs.reduce((o,i)=>o+BigInt(i.value),0n);return{psbtHex:t.txHex,totalOutputValue:r,htlcValues:t.htlcValues,htlcScriptPubKeys:t.htlcScriptPubKeys,htlcAddresses:t.htlcAddresses,peginAmounts:t.peginAmounts,depositorClaimValue:t.depositorClaimValue}}async function ie(e){const t=await y.buildPeginTxFromPrePegin({depositorPubkey:e.prePeginParams.depositorPubkey,vaultProviderPubkey:e.prePeginParams.vaultProviderPubkey,vaultKeeperPubkeys:e.prePeginParams.vaultKeeperPubkeys,universalChallengerPubkeys:e.prePeginParams.universalChallengerPubkeys,hashlocks:[...e.prePeginParams.hashlocks],timelockRefund:e.prePeginParams.timelockRefund,pegInAmounts:[...e.prePeginParams.pegInAmounts],feeRate:e.prePeginParams.feeRate,numLocalChallengers:e.prePeginParams.numLocalChallengers,councilQuorum:e.prePeginParams.councilQuorum,councilSize:e.prePeginParams.councilSize,network:e.prePeginParams.network},e.timelockPegin,e.fundedPrePeginTxHex,e.htlcVout);return{txHex:t.txHex,txid:t.txid,vaultScriptPubKey:t.vaultScriptPubKey,vaultValue:t.vaultValue}}async function se(e){const t=g(e.peginTxHex),n=g(e.fundedPrePeginTxHex),r=await y.getPrePeginHtlcConnectorInfo({depositorPubkey:e.depositorPubkey,vaultProviderPubkey:e.vaultProviderPubkey,vaultKeeperPubkeys:e.vaultKeeperPubkeys,universalChallengerPubkeys:e.universalChallengerPubkeys,hashlock:e.hashlock,timelockRefund:e.timelockRefund,network:e.network}),o=p.Transaction.fromHex(t),i=p.Transaction.fromHex(n);if(o.ins.length!==1)throw new Error(`PegIn transaction must have exactly 1 input, got ${o.ins.length}`);const c=o.ins[0],u=i.getId(),s=k(new Uint8Array(c.hash).slice().reverse());if(s!==u)throw new Error(`PegIn input does not reference the Pre-PegIn transaction. Expected ${u}, got ${s}`);const f=i.outs[c.index];if(!f)throw new Error(`Pre-PegIn output ${c.index} not found (Pre-PegIn has ${i.outs.length} outputs)`);const l=P(r.hashlockScript),d=P(r.hashlockControlBlock),h=new p.Psbt;h.setVersion(o.version),h.setLocktime(o.locktime),h.addInput({hash:c.hash,index:c.index,sequence:c.sequence,witnessUtxo:{script:f.script,value:f.value},tapLeafScript:[{leafVersion:T,script:a.Buffer.from(l),controlBlock:a.Buffer.from(d)}],tapInternalKey:a.Buffer.from(y.tapInternalPubkey)});for(const x of o.outs)h.addOutput({script:x.script,value:x.value});return{psbtHex:h.toHex()}}function ue(e,t){const r=p.Psbt.fromHex(e).data.inputs[0];if(!r)throw new Error("PegIn PSBT has no inputs");if(r.tapScriptSig&&r.tapScriptSig.length>0){const o=a.Buffer.from(P(t));for(const i of r.tapScriptSig)if(i.pubkey.equals(o))return ae(i.signature);throw new Error(`No PegIn input signature found for depositor pubkey: ${t}`)}throw r.finalScriptWitness&&r.finalScriptWitness.length>0?new Error("PegIn input PSBT is already finalized. Cannot reliably extract the depositor signature from the witness stack. Ensure the wallet returns a non-finalized PSBT with tapScriptSig entries."):new Error("No tapScriptSig or finalScriptWitness found in signed PegIn input PSBT")}function ce(e){const t=p.Psbt.fromHex(e);try{t.finalizeAllInputs()}catch(n){if(!t.data.inputs.every(o=>o.finalScriptWitness||o.finalScriptSig))throw new Error(`PSBT finalization failed and wallet did not auto-finalize: ${n}`)}return t.extractTransaction().toHex()}function ae(e){if(e.length===64)return k(new Uint8Array(e));if(e.length===65)return k(new Uint8Array(e.subarray(0,64)));throw new Error(`Unexpected PegIn input signature length: ${e.length}`)}async function le(e){await y.initWasm();const{prePeginParams:t,fundedPrePeginTxHex:n,htlcVout:r,refundFee:o,hashlock:i}=e,c=new y.WasmPrePeginTx(t.depositorPubkey,t.vaultProviderPubkey,t.vaultKeeperPubkeys,t.universalChallengerPubkeys,[...t.hashlocks],new BigUint64Array(t.pegInAmounts),t.timelockRefund,t.feeRate,t.numLocalChallengers,t.councilQuorum,t.councilSize,t.network);let u=null;try{u=c.fromFundedTransaction(n);const s=u.buildRefundTx(o,r),f=await y.getPrePeginHtlcConnectorInfo({depositorPubkey:t.depositorPubkey,vaultProviderPubkey:t.vaultProviderPubkey,vaultKeeperPubkeys:t.vaultKeeperPubkeys,universalChallengerPubkeys:t.universalChallengerPubkeys,hashlock:i,timelockRefund:t.timelockRefund,network:t.network}),l=n.startsWith("0x")?n.slice(2):n,d=p.Transaction.fromHex(l),h=d.outs[r];if(!h)throw new Error(`HTLC output at vout ${r} not found in funded Pre-PegIn tx (tx has ${d.outs.length} outputs)`);const x=p.Transaction.fromHex(s);if(x.ins.length!==1)throw new Error(`Refund transaction must have exactly 1 input, got ${x.ins.length}`);const b=x.ins[0],w=d.getId(),E=k(new Uint8Array(b.hash).slice().reverse());if(E!==w)throw new Error(`Refund input does not reference the Pre-PegIn transaction. Expected ${w}, got ${E}`);if(b.index!==r)throw new Error(`Refund input index ${b.index} does not match expected htlcVout ${r}`);const v=new p.Psbt;v.setVersion(x.version),v.setLocktime(x.locktime),v.addInput({hash:b.hash,index:b.index,sequence:b.sequence,witnessUtxo:{script:h.script,value:h.value},tapLeafScript:[{leafVersion:T,script:a.Buffer.from(P(f.refundScript)),controlBlock:a.Buffer.from(P(f.refundControlBlock))}],tapInternalKey:a.Buffer.from(y.tapInternalPubkey)});for(const S of x.outs)v.addOutput({script:S.script,value:S.value});return{psbtHex:v.toHex()}}finally{u==null||u.free(),c.free()}}async function W(e){const t=await y.createPayoutConnector({depositor:e.depositor,vaultProvider:e.vaultProvider,vaultKeepers:e.vaultKeepers,universalChallengers:e.universalChallengers,timelockPegin:e.timelockPegin},e.network);return{payoutScript:t.payoutScript,taprootScriptHash:t.taprootScriptHash,scriptPubKey:t.scriptPubKey,address:t.address,payoutControlBlock:t.payoutControlBlock}}async function fe(e){const t=g(e.payoutTxHex),n=g(e.peginTxHex),r=g(e.assertTxHex),o=await W({depositor:e.depositorBtcPubkey,vaultProvider:e.vaultProviderBtcPubkey,vaultKeepers:e.vaultKeeperBtcPubkeys,universalChallengers:e.universalChallengerBtcPubkeys,timelockPegin:e.timelockPegin,network:e.network}),i=P(o.payoutScript),c=P(o.payoutControlBlock),u=p.Transaction.fromHex(t),s=p.Transaction.fromHex(n),f=p.Transaction.fromHex(r),l=new p.Psbt;if(l.setVersion(u.version),l.setLocktime(u.locktime),u.ins.length!==2)throw new Error(`Payout transaction must have exactly 2 inputs, got ${u.ins.length}`);const d=u.ins[0],h=u.ins[1],x=k(new Uint8Array(d.hash).slice().reverse()),b=s.getId();if(x!==b)throw new Error(`Input 0 does not reference pegin transaction. Expected ${b}, got ${x}`);const w=k(new Uint8Array(h.hash).slice().reverse()),E=f.getId();if(w!==E)throw new Error(`Input 1 does not reference assert transaction. Expected ${E}, got ${w}`);const v=s.outs[d.index];if(!v)throw new Error(`Previous output not found for input 0 (txid: ${x}, index: ${d.index})`);const S=f.outs[h.index];if(!S)throw new Error(`Previous output not found for input 1 (txid: ${w}, index: ${h.index})`);l.addInput({hash:d.hash,index:d.index,sequence:d.sequence,witnessUtxo:{script:v.script,value:v.value},tapLeafScript:[{leafVersion:T,script:a.Buffer.from(i),controlBlock:a.Buffer.from(c)}],tapInternalKey:a.Buffer.from(y.tapInternalPubkey)}),l.addInput({hash:h.hash,index:h.index,sequence:h.sequence,witnessUtxo:{script:S.script,value:S.value}});for(const _ of u.outs)l.addOutput({script:_.script,value:_.value});return{psbtHex:l.toHex()}}function pe(e,t,n=0){const r=p.Psbt.fromHex(e);if(n>=r.data.inputs.length)throw new Error(`Input index ${n} out of range (${r.data.inputs.length} inputs)`);const o=r.data.inputs[n];if(o.tapScriptSig&&o.tapScriptSig.length>0){const i=P(t);for(const c of o.tapScriptSig)if(c.pubkey.equals(a.Buffer.from(i)))return L(c.signature,n);throw new Error(`No signature found for depositor pubkey: ${t} at input ${n}`)}if(o.finalScriptWitness&&o.finalScriptWitness.length>0){const i=de(o.finalScriptWitness);if(i.length>=1)return L(i[0],n)}throw new Error(`No tapScriptSig or finalScriptWitness found in signed PSBT at input ${n}`)}function L(e,t){if(e.length===64)return k(new Uint8Array(e));if(e.length===65){const n=e[64];if(n!==p.Transaction.SIGHASH_ALL)throw new Error(`Unexpected sighash type 0x${n.toString(16).padStart(2,"0")} at input ${t}. Expected SIGHASH_ALL (0x01).`);return k(new Uint8Array(e.subarray(0,64)))}throw new Error(`Unexpected signature length at input ${t}: ${e.length}`)}function de(e){const t=[];let n=0;const r=()=>{const i=e[n++];if(i<253)return i;if(i===253){const c=e[n]|e[n+1]<<8;return n+=2,c}if(i===254){const c=e[n]|e[n+1]<<8|e[n+2]<<16|e[n+3]<<24;return n+=4,c}return n+=8,0},o=r();for(let i=0;i<o;i++){const c=r();t.push(e.subarray(n,n+c)),n+=c}return t}async function Pe(e){const t=g(e.payoutTxHex),n=p.Transaction.fromHex(t),{payoutScript:r,payoutControlBlock:o}=await y.getPeginPayoutScriptInfo(e.connectorParams),i=P(r),c=P(o),u=new p.Psbt;u.setVersion(n.version),u.setLocktime(n.locktime);for(let s=0;s<n.ins.length;s++){const f=n.ins[s],l=e.prevouts[s];if(!l)throw new Error(`Missing prevout data for input ${s}`);const d={hash:f.hash,index:f.index,sequence:f.sequence,witnessUtxo:{script:a.Buffer.from(P(g(l.script_pubkey))),value:l.value}};s===0&&(d.tapLeafScript=[{leafVersion:T,script:a.Buffer.from(i),controlBlock:a.Buffer.from(c)}],d.tapInternalKey=a.Buffer.from(y.tapInternalPubkey)),u.addInput(d)}for(const s of n.outs)u.addOutput({script:s.script,value:s.value});return u.toHex()}async function he(e){const t=g(e.noPayoutTxHex),n=p.Transaction.fromHex(t),{noPayoutScript:r,noPayoutControlBlock:o}=await y.getAssertNoPayoutScriptInfo(e.connectorParams,e.challengerPubkey),i=P(r),c=P(o),u=new p.Psbt;u.setVersion(n.version),u.setLocktime(n.locktime);for(let s=0;s<n.ins.length;s++){const f=n.ins[s],l=e.prevouts[s];if(!l)throw new Error(`Missing prevout data for input ${s}`);const d={hash:f.hash,index:f.index,sequence:f.sequence,witnessUtxo:{script:a.Buffer.from(P(g(l.script_pubkey))),value:l.value}};s===0&&(d.tapLeafScript=[{leafVersion:T,script:a.Buffer.from(i),controlBlock:a.Buffer.from(c)}],d.tapInternalKey=a.Buffer.from(y.tapInternalPubkey)),u.addInput(d)}for(const s of n.outs)u.addOutput({script:s.script,value:s.value});return u.toHex()}async function ge(e){const t=g(e.challengeAssertTxHex),n=p.Transaction.fromHex(t);if(e.connectorParamsPerInput.length!==n.ins.length)throw new Error(`Expected ${n.ins.length} connector params, got ${e.connectorParamsPerInput.length}`);const r=await Promise.all(e.connectorParamsPerInput.map(i=>y.getChallengeAssertScriptInfo(i))),o=new p.Psbt;o.setVersion(n.version),o.setLocktime(n.locktime);for(let i=0;i<n.ins.length;i++){const c=n.ins[i],u=e.prevouts[i];if(!u)throw new Error(`Missing prevout data for input ${i}`);const{script:s,controlBlock:f}=r[i],l=P(s),d=P(f);o.addInput({hash:c.hash,index:c.index,sequence:c.sequence,witnessUtxo:{script:a.Buffer.from(P(g(u.script_pubkey))),value:u.value},tapLeafScript:[{leafVersion:T,script:a.Buffer.from(l),controlBlock:a.Buffer.from(d)}],tapInternalKey:a.Buffer.from(y.tapInternalPubkey)})}for(const i of n.outs)o.addOutput({script:i.script,value:i.value});return o.toHex()}exports.BTC_DUST_SAT=O;exports.DUST_THRESHOLD=F;exports.FEE_SAFETY_MARGIN=J;exports.LOW_RATE_ESTIMATION_ACCURACY_BUFFER=N;exports.MAX_NON_LEGACY_OUTPUT_SIZE=Z;exports.P2TR_INPUT_SIZE=j;exports.PEGIN_FIXED_OUTPUTS=V;exports.SPLIT_TX_FEE_SAFETY_MULTIPLIER=ne;exports.TX_BUFFER_SIZE_OVERHEAD=Q;exports.WALLET_RELAY_FEE_RATE_THRESHOLD=K;exports.buildChallengeAssertPsbt=ge;exports.buildDepositorPayoutPsbt=Pe;exports.buildNoPayoutPsbt=he;exports.buildPayoutPsbt=fe;exports.buildPeginInputPsbt=se;exports.buildPeginTxFromFundedPrePegin=ie;exports.buildPrePeginPsbt=oe;exports.buildRefundPsbt=le;exports.computeNumLocalChallengers=G;exports.createPayoutScript=W;exports.deriveNativeSegwitAddress=R;exports.deriveTaprootAddress=$;exports.ensureHexPrefix=D;exports.extractPayoutSignature=pe;exports.extractPeginInputSignature=ue;exports.finalizePeginInputPsbt=ce;exports.fundPeginTransaction=re;exports.getNetwork=A;exports.hexToUint8Array=P;exports.isAddressFromPublicKey=Y;exports.isValidHex=z;exports.parseUnfundedWasmTransaction=H;exports.peginOutputCount=te;exports.processPublicKeyToXOnly=m;exports.rateBasedTxBufferFee=ee;exports.stripHexPrefix=g;exports.toXOnly=U;exports.uint8ArrayToHex=k;exports.validateWalletPubkey=M;
2
- //# sourceMappingURL=challengeAssert-CTajvPAY.cjs.map