@secondlayer/stacks 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +92 -0
  2. package/dist/shared/stacks-02actsrx.cjs +17 -0
  3. package/dist/shared/stacks-02actsrx.cjs.map +10 -0
  4. package/dist/shared/stacks-1aqm7c2h.cjs +110 -0
  5. package/dist/shared/stacks-1aqm7c2h.cjs.map +11 -0
  6. package/dist/shared/stacks-24h5k94q.cjs +74 -0
  7. package/dist/shared/stacks-24h5k94q.cjs.map +11 -0
  8. package/dist/shared/stacks-2ar4prfz.cjs +328 -0
  9. package/dist/shared/stacks-2ar4prfz.cjs.map +11 -0
  10. package/dist/shared/stacks-4py5pm0r.cjs +237 -0
  11. package/dist/shared/stacks-4py5pm0r.cjs.map +10 -0
  12. package/dist/shared/stacks-5tprhns9.cjs +54 -0
  13. package/dist/shared/stacks-5tprhns9.cjs.map +11 -0
  14. package/dist/shared/stacks-61rvzkz1.cjs +132 -0
  15. package/dist/shared/stacks-61rvzkz1.cjs.map +17 -0
  16. package/dist/shared/stacks-709tra19.js +30 -0
  17. package/dist/shared/stacks-709tra19.js.map +10 -0
  18. package/dist/shared/stacks-74k8cxgb.cjs +567 -0
  19. package/dist/shared/stacks-74k8cxgb.cjs.map +13 -0
  20. package/dist/shared/stacks-8m9byk2j.js +7 -0
  21. package/dist/shared/stacks-8m9byk2j.js.map +9 -0
  22. package/dist/shared/stacks-8yykgdww.js +125 -0
  23. package/dist/shared/stacks-8yykgdww.js.map +11 -0
  24. package/dist/shared/stacks-9g0jhab3.cjs +40 -0
  25. package/dist/shared/stacks-9g0jhab3.cjs.map +10 -0
  26. package/dist/shared/stacks-an5k8n4t.cjs +291 -0
  27. package/dist/shared/stacks-an5k8n4t.cjs.map +23 -0
  28. package/dist/shared/stacks-b008c3w8.cjs +214 -0
  29. package/dist/shared/stacks-b008c3w8.cjs.map +11 -0
  30. package/dist/shared/stacks-bnvfmt7y.cjs +31 -0
  31. package/dist/shared/stacks-bnvfmt7y.cjs.map +9 -0
  32. package/dist/shared/stacks-bycy6t9k.js +22 -0
  33. package/dist/shared/stacks-bycy6t9k.js.map +10 -0
  34. package/dist/shared/stacks-d1fmkv3p.js +258 -0
  35. package/dist/shared/stacks-d1fmkv3p.js.map +13 -0
  36. package/dist/shared/stacks-dr5en54r.cjs +119 -0
  37. package/dist/shared/stacks-dr5en54r.cjs.map +10 -0
  38. package/dist/shared/stacks-dxhntr76.js +278 -0
  39. package/dist/shared/stacks-dxhntr76.js.map +10 -0
  40. package/dist/shared/stacks-evnzth1q.cjs +35 -0
  41. package/dist/shared/stacks-evnzth1q.cjs.map +10 -0
  42. package/dist/shared/stacks-f3tk2k5s.js +27 -0
  43. package/dist/shared/stacks-f3tk2k5s.js.map +9 -0
  44. package/dist/shared/stacks-f7wdrzs3.js +285 -0
  45. package/dist/shared/stacks-f7wdrzs3.js.map +11 -0
  46. package/dist/shared/stacks-fcaefc5b.cjs +16 -0
  47. package/dist/shared/stacks-fcaefc5b.cjs.map +10 -0
  48. package/dist/shared/stacks-g9mcjcqg.cjs +3 -0
  49. package/dist/shared/stacks-g9mcjcqg.cjs.map +9 -0
  50. package/dist/shared/stacks-gck1sq7h.cjs +28 -0
  51. package/dist/shared/stacks-gck1sq7h.cjs.map +10 -0
  52. package/dist/shared/stacks-gjvbq6w7.js +46 -0
  53. package/dist/shared/stacks-gjvbq6w7.js.map +10 -0
  54. package/dist/shared/stacks-j2cy7qtt.js +237 -0
  55. package/dist/shared/stacks-j2cy7qtt.js.map +11 -0
  56. package/dist/shared/stacks-k08tgzyp.cjs +232 -0
  57. package/dist/shared/stacks-k08tgzyp.cjs.map +13 -0
  58. package/dist/shared/stacks-k2p5tv6x.js +37 -0
  59. package/dist/shared/stacks-k2p5tv6x.js.map +10 -0
  60. package/dist/shared/stacks-k58k970n.js +234 -0
  61. package/dist/shared/stacks-k58k970n.js.map +10 -0
  62. package/dist/shared/stacks-n2g56wgg.js +338 -0
  63. package/dist/shared/stacks-n2g56wgg.js.map +23 -0
  64. package/dist/shared/stacks-nqytwfcc.js +243 -0
  65. package/dist/shared/stacks-nqytwfcc.js.map +11 -0
  66. package/dist/shared/stacks-qcae5852.js +19 -0
  67. package/dist/shared/stacks-qcae5852.js.map +10 -0
  68. package/dist/shared/stacks-qt8ehebn.js +76 -0
  69. package/dist/shared/stacks-qt8ehebn.js.map +11 -0
  70. package/dist/shared/stacks-qvg7c24g.cjs +232 -0
  71. package/dist/shared/stacks-qvg7c24g.cjs.map +10 -0
  72. package/dist/shared/stacks-r1t6g3c3.cjs +241 -0
  73. package/dist/shared/stacks-r1t6g3c3.cjs.map +11 -0
  74. package/dist/shared/stacks-tjxmrssa.js +282 -0
  75. package/dist/shared/stacks-tjxmrssa.js.map +11 -0
  76. package/dist/shared/stacks-v9jqcpd4.js +18 -0
  77. package/dist/shared/stacks-v9jqcpd4.js.map +10 -0
  78. package/dist/shared/stacks-vdfag81a.cjs +121 -0
  79. package/dist/shared/stacks-vdfag81a.cjs.map +10 -0
  80. package/dist/shared/stacks-vdfs3e5v.js +134 -0
  81. package/dist/shared/stacks-vdfs3e5v.js.map +10 -0
  82. package/dist/shared/stacks-y3dh7hv1.js +60 -0
  83. package/dist/shared/stacks-y3dh7hv1.js.map +11 -0
  84. package/dist/shared/stacks-ya3x01yd.cjs +16 -0
  85. package/dist/shared/stacks-ya3x01yd.cjs.map +10 -0
  86. package/dist/shared/stacks-yfgsm6ap.js +599 -0
  87. package/dist/shared/stacks-yfgsm6ap.js.map +13 -0
  88. package/dist/shared/stacks-yfveb68e.js +121 -0
  89. package/dist/shared/stacks-yfveb68e.js.map +10 -0
  90. package/dist/shared/stacks-zm0b3tgy.js +160 -0
  91. package/dist/shared/stacks-zm0b3tgy.js.map +17 -0
  92. package/dist/shared/stacks-zyv9qqme.cjs +249 -0
  93. package/dist/shared/stacks-zyv9qqme.cjs.map +11 -0
  94. package/dist/src/accounts/index.cjs +90 -0
  95. package/dist/src/accounts/index.cjs.map +12 -0
  96. package/dist/src/accounts/index.d.cts +47 -0
  97. package/dist/src/accounts/index.d.ts +47 -0
  98. package/dist/src/accounts/index.js +104 -0
  99. package/dist/src/accounts/index.js.map +12 -0
  100. package/dist/src/actions/index.cjs +36 -0
  101. package/dist/src/actions/index.cjs.map +9 -0
  102. package/dist/src/actions/index.d.cts +886 -0
  103. package/dist/src/actions/index.d.ts +886 -0
  104. package/dist/src/actions/index.js +81 -0
  105. package/dist/src/actions/index.js.map +9 -0
  106. package/dist/src/bns/index.cjs +590 -0
  107. package/dist/src/bns/index.cjs.map +15 -0
  108. package/dist/src/bns/index.d.cts +241 -0
  109. package/dist/src/bns/index.d.ts +241 -0
  110. package/dist/src/bns/index.js +611 -0
  111. package/dist/src/bns/index.js.map +15 -0
  112. package/dist/src/chains/index.cjs +13 -0
  113. package/dist/src/chains/index.cjs.map +9 -0
  114. package/dist/src/chains/index.d.cts +53 -0
  115. package/dist/src/chains/index.d.ts +53 -0
  116. package/dist/src/chains/index.js +18 -0
  117. package/dist/src/chains/index.js.map +9 -0
  118. package/dist/src/clarity/index.cjs +3 -0
  119. package/dist/src/clarity/index.cjs.map +9 -0
  120. package/dist/src/clarity/index.d.cts +821 -0
  121. package/dist/src/clarity/index.d.ts +821 -0
  122. package/dist/src/clarity/index.js +145 -0
  123. package/dist/src/clarity/index.js.map +9 -0
  124. package/dist/src/connect/index.cjs +480 -0
  125. package/dist/src/connect/index.cjs.map +19 -0
  126. package/dist/src/connect/index.d.cts +110 -0
  127. package/dist/src/connect/index.d.ts +110 -0
  128. package/dist/src/connect/index.js +448 -0
  129. package/dist/src/connect/index.js.map +19 -0
  130. package/dist/src/connect/walletconnect/index.cjs +1322 -0
  131. package/dist/src/connect/walletconnect/index.cjs.map +18 -0
  132. package/dist/src/connect/walletconnect/index.d.cts +132 -0
  133. package/dist/src/connect/walletconnect/index.d.ts +132 -0
  134. package/dist/src/connect/walletconnect/index.js +1290 -0
  135. package/dist/src/connect/walletconnect/index.js.map +18 -0
  136. package/dist/src/index.cjs +557 -0
  137. package/dist/src/index.cjs.map +21 -0
  138. package/dist/src/index.d.cts +847 -0
  139. package/dist/src/index.d.ts +847 -0
  140. package/dist/src/index.js +629 -0
  141. package/dist/src/index.js.map +21 -0
  142. package/dist/src/postconditions/index.cjs +3 -0
  143. package/dist/src/postconditions/index.cjs.map +9 -0
  144. package/dist/src/postconditions/index.d.cts +91 -0
  145. package/dist/src/postconditions/index.d.ts +91 -0
  146. package/dist/src/postconditions/index.js +12 -0
  147. package/dist/src/postconditions/index.js.map +9 -0
  148. package/dist/src/pox/index.cjs +860 -0
  149. package/dist/src/pox/index.cjs.map +15 -0
  150. package/dist/src/pox/index.d.cts +244 -0
  151. package/dist/src/pox/index.d.ts +244 -0
  152. package/dist/src/pox/index.js +877 -0
  153. package/dist/src/pox/index.js.map +15 -0
  154. package/dist/src/stackingdao/index.cjs +300 -0
  155. package/dist/src/stackingdao/index.cjs.map +13 -0
  156. package/dist/src/stackingdao/index.d.cts +179 -0
  157. package/dist/src/stackingdao/index.d.ts +179 -0
  158. package/dist/src/stackingdao/index.js +318 -0
  159. package/dist/src/stackingdao/index.js.map +13 -0
  160. package/dist/src/subscriptions/index.cjs +14 -0
  161. package/dist/src/subscriptions/index.cjs.map +9 -0
  162. package/dist/src/subscriptions/index.d.cts +250 -0
  163. package/dist/src/subscriptions/index.d.ts +250 -0
  164. package/dist/src/subscriptions/index.js +21 -0
  165. package/dist/src/subscriptions/index.js.map +9 -0
  166. package/dist/src/transactions/index.cjs +50 -0
  167. package/dist/src/transactions/index.cjs.map +9 -0
  168. package/dist/src/transactions/index.d.cts +412 -0
  169. package/dist/src/transactions/index.d.ts +412 -0
  170. package/dist/src/transactions/index.js +101 -0
  171. package/dist/src/transactions/index.js.map +9 -0
  172. package/dist/src/utils/index.cjs +168 -0
  173. package/dist/src/utils/index.cjs.map +11 -0
  174. package/dist/src/utils/index.d.cts +140 -0
  175. package/dist/src/utils/index.d.ts +140 -0
  176. package/dist/src/utils/index.js +222 -0
  177. package/dist/src/utils/index.js.map +11 -0
  178. package/package.json +105 -0
@@ -0,0 +1,557 @@
1
+ // src/index.ts
2
+ var exports_src = {};
3
+ __export(exports_src, {
4
+ webSocket: () => webSocket,
5
+ walletActions: () => walletActions,
6
+ testnet: () => testnet,
7
+ publicActions: () => publicActions,
8
+ providerToAccount: () => providerToAccount,
9
+ parseStx: () => parseStx,
10
+ multisigActions: () => multisigActions,
11
+ mocknet: () => mocknet,
12
+ mainnet: () => mainnet,
13
+ isValidAddress: () => isValidAddress,
14
+ isAddressEqual: () => isAddressEqual,
15
+ http: () => http,
16
+ getContractAddress: () => getContractAddress,
17
+ formatStx: () => formatStx,
18
+ fallback: () => fallback,
19
+ devnet: () => devnet,
20
+ defineChain: () => defineChain,
21
+ custom: () => custom,
22
+ createWalletClient: () => createWalletClient,
23
+ createPublicClient: () => createPublicClient,
24
+ createMultiSigClient: () => createMultiSigClient,
25
+ createClient: () => createClient,
26
+ ZERO_ADDRESS: () => ZERO_ADDRESS,
27
+ TESTNET_ZERO_ADDRESS: () => TESTNET_ZERO_ADDRESS,
28
+ MICROSTX_PER_STX: () => MICROSTX_PER_STX,
29
+ AddressVersion: () => AddressVersion
30
+ });
31
+ module.exports = __toCommonJS(exports_src);
32
+
33
+ // src/clients/createClient.ts
34
+ var BASE_KEYS = new Set(["chain", "account", "transport", "request", "extend"]);
35
+ function createClient(config) {
36
+ const transport = config.transport({ chain: config.chain });
37
+ const client = {
38
+ chain: config.chain,
39
+ account: config.account,
40
+ transport,
41
+ request: transport.request,
42
+ extend(fn) {
43
+ const extensions = fn(client);
44
+ const extended = { ...client };
45
+ for (const [key, value] of Object.entries(extensions)) {
46
+ if (BASE_KEYS.has(key))
47
+ continue;
48
+ extended[key] = value;
49
+ }
50
+ extended.extend = (nextFn) => {
51
+ const nextExtensions = nextFn(extended);
52
+ const next = { ...extended };
53
+ for (const [key, value] of Object.entries(nextExtensions)) {
54
+ if (BASE_KEYS.has(key))
55
+ continue;
56
+ next[key] = value;
57
+ }
58
+ next.extend = extended.extend;
59
+ return next;
60
+ };
61
+ return extended;
62
+ }
63
+ };
64
+ return client;
65
+ }
66
+ // src/clients/decorators/public.ts
67
+ function publicActions(client) {
68
+ return {
69
+ getNonce: (params) => getNonce(client, params),
70
+ getBalance: (params) => getBalance(client, params),
71
+ getAccountInfo: (params) => getAccountInfo(client, params),
72
+ getBlock: (params) => getBlock(client, params),
73
+ getBlockHeight: () => getBlockHeight(client),
74
+ readContract: (params) => readContract(client, params),
75
+ getContractAbi: (params) => getContractAbi(client, params),
76
+ getMapEntry: (params) => getMapEntry(client, params),
77
+ estimateFee: (params) => estimateFee(client, params),
78
+ multicall: (params) => multicall(client, params),
79
+ simulateCall: (params) => simulateCall(client, params),
80
+ simulateTransaction: (params) => simulateTransaction(client, params),
81
+ watchBlocks: (params) => watchBlocks(client, params),
82
+ watchMempool: (params) => watchMempool(client, params),
83
+ watchTransaction: (params) => watchTransaction(client, params),
84
+ watchAddress: (params) => watchAddress(client, params),
85
+ watchAddressBalance: (params) => watchAddressBalance(client, params),
86
+ watchNftEvent: (params) => watchNftEvent(client, params)
87
+ };
88
+ }
89
+
90
+ // src/clients/createPublicClient.ts
91
+ function createPublicClient(config) {
92
+ return createClient(config).extend(publicActions);
93
+ }
94
+ // src/clients/decorators/wallet.ts
95
+ function walletActions(client) {
96
+ return {
97
+ sendTransaction: (params) => sendTransaction(client, params),
98
+ signTransaction: (params) => signTransactionAction(client, params),
99
+ transferStx: (params) => transferStx(client, params),
100
+ callContract: (params) => callContract(client, params),
101
+ deployContract: (params) => deployContract(client, params),
102
+ signMessage: (params) => signMessage(client, params),
103
+ sponsorTransaction: (params) => sponsorTransaction(client, params)
104
+ };
105
+ }
106
+
107
+ // src/clients/createWalletClient.ts
108
+ function createWalletClient(config) {
109
+ return createClient(config).extend(walletActions);
110
+ }
111
+ // src/clients/decorators/multisig.ts
112
+ function multisigActions(client) {
113
+ const msConfig = client._multisigConfig;
114
+ if (!msConfig)
115
+ throw new Error("multisigActions requires a multi-sig client");
116
+ const { signers, requiredSignatures, hashMode } = msConfig;
117
+ async function resolveNonce(nonce) {
118
+ if (nonce !== undefined)
119
+ return nonce;
120
+ const { makeMultiSigAddress } = await import("../shared/stacks-g9mcjcqg.cjs");
121
+ const address = makeMultiSigAddress(signers, requiredSignatures, client.chain);
122
+ return getNonce(client, { address });
123
+ }
124
+ return {
125
+ async transferStx(params) {
126
+ const nonce = await resolveNonce(params.nonce);
127
+ const unsigned = buildTokenTransfer({
128
+ recipient: params.to,
129
+ amount: params.amount,
130
+ memo: params.memo,
131
+ fee: params.fee ?? 0n,
132
+ nonce,
133
+ publicKeys: signers,
134
+ signaturesRequired: requiredSignatures,
135
+ hashMode,
136
+ chain: client.chain,
137
+ postConditionMode: params.postConditionMode,
138
+ postConditions: params.postConditions
139
+ });
140
+ if (params.fee === undefined) {
141
+ const estimates = await estimateFee(client, { transaction: unsigned });
142
+ const mid = estimates[1] ?? estimates[0];
143
+ if (mid) {
144
+ unsigned.auth.spendingCondition.fee = BigInt(mid.fee);
145
+ }
146
+ }
147
+ return unsigned;
148
+ },
149
+ async callContract(params) {
150
+ const [contractAddress, contractName] = parseContractId(params.contract);
151
+ const nonce = await resolveNonce(params.nonce);
152
+ const unsigned = buildContractCall({
153
+ contractAddress,
154
+ contractName,
155
+ functionName: params.functionName,
156
+ functionArgs: params.functionArgs ?? [],
157
+ fee: params.fee ?? 0n,
158
+ nonce,
159
+ publicKeys: signers,
160
+ signaturesRequired: requiredSignatures,
161
+ hashMode,
162
+ chain: client.chain,
163
+ postConditionMode: params.postConditionMode,
164
+ postConditions: params.postConditions
165
+ });
166
+ if (params.fee === undefined) {
167
+ const estimates = await estimateFee(client, { transaction: unsigned });
168
+ const mid = estimates[1] ?? estimates[0];
169
+ if (mid) {
170
+ unsigned.auth.spendingCondition.fee = BigInt(mid.fee);
171
+ }
172
+ }
173
+ return unsigned;
174
+ },
175
+ async deployContract(params) {
176
+ const nonce = await resolveNonce(params.nonce);
177
+ const unsigned = buildContractDeploy({
178
+ contractName: params.contractName,
179
+ codeBody: params.codeBody,
180
+ clarityVersion: params.clarityVersion,
181
+ fee: params.fee ?? 0n,
182
+ nonce,
183
+ publicKeys: signers,
184
+ signaturesRequired: requiredSignatures,
185
+ hashMode,
186
+ chain: client.chain,
187
+ postConditionMode: params.postConditionMode,
188
+ postConditions: params.postConditions
189
+ });
190
+ if (params.fee === undefined) {
191
+ const estimates = await estimateFee(client, { transaction: unsigned });
192
+ const mid = estimates[1] ?? estimates[0];
193
+ if (mid) {
194
+ unsigned.auth.spendingCondition.fee = BigInt(mid.fee);
195
+ }
196
+ }
197
+ return unsigned;
198
+ },
199
+ async sendTransaction(params) {
200
+ const finalized = finalizeMultiSig(params.transaction, signers);
201
+ return sendTransaction(client, {
202
+ transaction: finalized,
203
+ attachment: params.attachment
204
+ });
205
+ }
206
+ };
207
+ }
208
+
209
+ // src/clients/createMultiSigClient.ts
210
+ function createMultiSigClient(config) {
211
+ const client = createClient(config);
212
+ client._multisigConfig = {
213
+ signers: config.signers,
214
+ requiredSignatures: config.requiredSignatures,
215
+ hashMode: config.hashMode
216
+ };
217
+ return client.extend(multisigActions);
218
+ }
219
+ // src/transports/createTransport.ts
220
+ function createTransport(type, config) {
221
+ return {
222
+ type,
223
+ request: config.request,
224
+ config
225
+ };
226
+ }
227
+ async function fetchWithRetry(url, options, retryCount, retryDelay, timeout) {
228
+ let lastError;
229
+ for (let attempt = 0;attempt <= retryCount; attempt++) {
230
+ try {
231
+ const controller = new AbortController;
232
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
233
+ const response = await fetch(url, {
234
+ ...options,
235
+ signal: controller.signal
236
+ });
237
+ clearTimeout(timeoutId);
238
+ if (response.ok || response.status < 500) {
239
+ return response;
240
+ }
241
+ lastError = new Error(`HTTP ${response.status}: ${response.statusText}`);
242
+ } catch (error) {
243
+ lastError = error instanceof Error ? error : new Error(String(error));
244
+ }
245
+ if (attempt < retryCount) {
246
+ await new Promise((r) => setTimeout(r, retryDelay * (attempt + 1)));
247
+ }
248
+ }
249
+ throw lastError ?? new Error("Request failed");
250
+ }
251
+ function buildRequestFn(baseUrl, config) {
252
+ const {
253
+ timeout = 30000,
254
+ retryCount = 3,
255
+ retryDelay = 150,
256
+ fetchOptions = {},
257
+ apiKey
258
+ } = config;
259
+ return async (path, options) => {
260
+ const url = `${baseUrl.replace(/\/$/, "")}${path}`;
261
+ const headers = {
262
+ "Content-Type": "application/json",
263
+ ...fetchOptions.headers,
264
+ ...options?.headers
265
+ };
266
+ if (apiKey) {
267
+ headers["x-api-key"] = apiKey;
268
+ }
269
+ const init = {
270
+ ...fetchOptions,
271
+ method: options?.method ?? "GET",
272
+ headers
273
+ };
274
+ if (options?.body !== undefined) {
275
+ init.body = JSON.stringify(options.body);
276
+ }
277
+ const response = await fetchWithRetry(url, init, retryCount, retryDelay, timeout);
278
+ const contentType = response.headers.get("content-type") ?? "";
279
+ if (contentType.includes("application/json")) {
280
+ return response.json();
281
+ }
282
+ return response.text();
283
+ };
284
+ }
285
+
286
+ // src/transports/http.ts
287
+ function http(url, config) {
288
+ return (params) => {
289
+ const resolvedUrl = url ?? params?.chain?.rpcUrls.default.http[0] ?? "http://localhost:3999";
290
+ const mergedConfig = {
291
+ ...config,
292
+ url: resolvedUrl
293
+ };
294
+ return createTransport("http", {
295
+ ...mergedConfig,
296
+ request: buildRequestFn(resolvedUrl, mergedConfig)
297
+ });
298
+ };
299
+ }
300
+ // src/transports/custom.ts
301
+ function custom(params) {
302
+ return () => createTransport("custom", { request: params.request });
303
+ }
304
+ // src/transports/fallback.ts
305
+ function fallback(transports) {
306
+ return (params) => {
307
+ const resolved = transports.map((t) => t(params));
308
+ return createTransport("fallback", {
309
+ request: async (path, options) => {
310
+ let lastError;
311
+ for (const transport of resolved) {
312
+ try {
313
+ return await transport.request(path, options);
314
+ } catch (error) {
315
+ lastError = error instanceof Error ? error : new Error(String(error));
316
+ }
317
+ }
318
+ throw lastError ?? new Error("All transports failed");
319
+ }
320
+ });
321
+ };
322
+ }
323
+ // src/transports/webSocket.ts
324
+ function subKey(params) {
325
+ const parts = [params.event];
326
+ if (params.tx_id)
327
+ parts.push(`tx_id:${params.tx_id}`);
328
+ if (params.address)
329
+ parts.push(`address:${params.address}`);
330
+ if (params.asset_identifier)
331
+ parts.push(`asset:${params.asset_identifier}`);
332
+ if (params.value)
333
+ parts.push(`value:${params.value}`);
334
+ return parts.join("|");
335
+ }
336
+
337
+ class WebSocketChannel {
338
+ ws = null;
339
+ url;
340
+ nextId = 1;
341
+ pending = new Map;
342
+ subs = new Map;
343
+ destroyed = false;
344
+ reconnecting = false;
345
+ reconnectAttempt = 0;
346
+ reconnectTimer = null;
347
+ reconnect;
348
+ reconnectMaxAttempts;
349
+ reconnectBaseDelay;
350
+ constructor(url, config) {
351
+ this.url = url;
352
+ this.reconnect = config?.reconnect ?? true;
353
+ this.reconnectMaxAttempts = config?.reconnectMaxAttempts ?? 10;
354
+ this.reconnectBaseDelay = config?.reconnectBaseDelay ?? 1000;
355
+ }
356
+ connect() {
357
+ if (this.ws?.readyState === WebSocket.OPEN)
358
+ return Promise.resolve();
359
+ if (this.ws?.readyState === WebSocket.CONNECTING) {
360
+ return new Promise((resolve, reject) => {
361
+ const onOpen = () => {
362
+ this.ws?.removeEventListener("error", onError);
363
+ resolve();
364
+ };
365
+ const onError = (e) => {
366
+ this.ws?.removeEventListener("open", onOpen);
367
+ reject(new WebSocketError("WebSocket connection failed", {
368
+ details: String(e)
369
+ }));
370
+ };
371
+ this.ws.addEventListener("open", onOpen, { once: true });
372
+ this.ws.addEventListener("error", onError, { once: true });
373
+ });
374
+ }
375
+ return new Promise((resolve, reject) => {
376
+ this.ws = new WebSocket(this.url);
377
+ this.ws.addEventListener("open", () => {
378
+ this.reconnectAttempt = 0;
379
+ this.reconnecting = false;
380
+ resolve();
381
+ }, { once: true });
382
+ this.ws.addEventListener("error", (e) => {
383
+ reject(new WebSocketError("WebSocket connection failed", {
384
+ details: String(e)
385
+ }));
386
+ }, { once: true });
387
+ this.ws.addEventListener("message", (event) => {
388
+ this.handleMessage(event.data);
389
+ });
390
+ this.ws.addEventListener("close", () => {
391
+ if (!this.destroyed)
392
+ this.handleDisconnect();
393
+ });
394
+ });
395
+ }
396
+ handleMessage(raw) {
397
+ const data = typeof raw === "string" ? raw : new TextDecoder().decode(raw);
398
+ let msg;
399
+ try {
400
+ msg = JSON.parse(data);
401
+ } catch {
402
+ return;
403
+ }
404
+ if ("id" in msg && msg.id != null) {
405
+ const rpc = msg;
406
+ const p = this.pending.get(rpc.id);
407
+ if (!p)
408
+ return;
409
+ this.pending.delete(rpc.id);
410
+ if (rpc.error) {
411
+ p.reject(new WebSocketError(rpc.error.message, {
412
+ details: `JSON-RPC error ${rpc.error.code}`
413
+ }));
414
+ } else {
415
+ p.resolve(rpc.result);
416
+ }
417
+ return;
418
+ }
419
+ const notif = msg;
420
+ if (!notif.method)
421
+ return;
422
+ for (const [, entry] of this.subs) {
423
+ if (entry.params.event === notif.method) {
424
+ for (const cb of entry.callbacks) {
425
+ try {
426
+ cb(notif.params);
427
+ } catch {}
428
+ }
429
+ }
430
+ }
431
+ }
432
+ handleDisconnect() {
433
+ this.ws = null;
434
+ for (const [, p] of this.pending) {
435
+ p.reject(new WebSocketError("WebSocket disconnected"));
436
+ }
437
+ this.pending.clear();
438
+ if (this.reconnect && this.subs.size > 0 && this.reconnectAttempt < this.reconnectMaxAttempts) {
439
+ this.scheduleReconnect();
440
+ }
441
+ }
442
+ scheduleReconnect() {
443
+ if (this.destroyed || this.reconnecting)
444
+ return;
445
+ this.reconnecting = true;
446
+ const delay = this.reconnectBaseDelay * 2 ** this.reconnectAttempt;
447
+ this.reconnectAttempt++;
448
+ this.reconnectTimer = setTimeout(async () => {
449
+ this.reconnecting = false;
450
+ try {
451
+ await this.connect();
452
+ await this.resubscribeAll();
453
+ } catch {
454
+ if (!this.destroyed && this.subs.size > 0) {
455
+ this.handleDisconnect();
456
+ }
457
+ }
458
+ }, delay);
459
+ }
460
+ async resubscribeAll() {
461
+ for (const [, entry] of this.subs) {
462
+ await this.sendRpc("subscribe", entry.params);
463
+ }
464
+ }
465
+ sendRpc(method, params) {
466
+ return new Promise((resolve, reject) => {
467
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
468
+ return reject(new WebSocketError("WebSocket not connected"));
469
+ }
470
+ const id = this.nextId++;
471
+ const msg = {
472
+ jsonrpc: "2.0",
473
+ id,
474
+ method,
475
+ params
476
+ };
477
+ this.pending.set(id, { resolve, reject });
478
+ this.ws.send(JSON.stringify(msg));
479
+ });
480
+ }
481
+ async subscribe(params, callback) {
482
+ if (this.destroyed) {
483
+ throw new WebSocketError("WebSocket channel has been destroyed");
484
+ }
485
+ await this.connect();
486
+ const key = subKey(params);
487
+ let entry = this.subs.get(key);
488
+ if (entry) {
489
+ entry.callbacks.add(callback);
490
+ } else {
491
+ entry = { params, callbacks: new Set([callback]) };
492
+ this.subs.set(key, entry);
493
+ await this.sendRpc("subscribe", params);
494
+ }
495
+ return {
496
+ unsubscribe: () => {
497
+ const e = this.subs.get(key);
498
+ if (!e)
499
+ return;
500
+ e.callbacks.delete(callback);
501
+ if (e.callbacks.size === 0) {
502
+ this.subs.delete(key);
503
+ if (this.ws?.readyState === WebSocket.OPEN) {
504
+ this.sendRpc("unsubscribe", params).catch(() => {});
505
+ }
506
+ if (this.subs.size === 0)
507
+ this.closeQuietly();
508
+ }
509
+ }
510
+ };
511
+ }
512
+ closeQuietly() {
513
+ if (this.ws) {
514
+ this.ws.close();
515
+ this.ws = null;
516
+ }
517
+ }
518
+ destroy() {
519
+ this.destroyed = true;
520
+ if (this.reconnectTimer)
521
+ clearTimeout(this.reconnectTimer);
522
+ for (const [, p] of this.pending) {
523
+ p.reject(new WebSocketError("WebSocket channel destroyed"));
524
+ }
525
+ this.pending.clear();
526
+ this.subs.clear();
527
+ if (this.ws) {
528
+ this.ws.close();
529
+ this.ws = null;
530
+ }
531
+ }
532
+ }
533
+ function deriveWsUrl(httpUrl) {
534
+ return httpUrl.replace(/^http/, "ws").replace(/\/$/, "") + "/extended/v1/ws";
535
+ }
536
+ function webSocket(url, config) {
537
+ return (params) => {
538
+ const httpUrl = config?.url ?? params?.chain?.rpcUrls.default.http[0] ?? "http://localhost:3999";
539
+ const wsUrl = url ?? params?.chain?.rpcUrls.default.ws?.[0] ?? deriveWsUrl(httpUrl);
540
+ const resolvedHttpConfig = {
541
+ ...config,
542
+ url: httpUrl
543
+ };
544
+ const channel = new WebSocketChannel(wsUrl, config);
545
+ const transport = {
546
+ type: "webSocket",
547
+ request: buildRequestFn(httpUrl, resolvedHttpConfig),
548
+ config: resolvedHttpConfig,
549
+ subscribe: (subParams, callback) => channel.subscribe(subParams, callback),
550
+ destroy: () => channel.destroy()
551
+ };
552
+ return transport;
553
+ };
554
+ }
555
+
556
+ //# debugId=2199EE0D4F7EBD2864756E2164756E21
557
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/clients/createClient.ts", "../src/clients/decorators/public.ts", "../src/clients/createPublicClient.ts", "../src/clients/decorators/wallet.ts", "../src/clients/createWalletClient.ts", "../src/clients/decorators/multisig.ts", "../src/clients/createMultiSigClient.ts", "../src/transports/createTransport.ts", "../src/transports/http.ts", "../src/transports/custom.ts", "../src/transports/fallback.ts", "../src/transports/webSocket.ts"],
4
+ "sourcesContent": [
5
+ "import type { Client, ClientConfig } from \"./types.ts\";\n\nconst BASE_KEYS = new Set([\"chain\", \"account\", \"transport\", \"request\", \"extend\"]);\n\n/**\n * Create a base client with transport and optional chain/account.\n * Use `.extend()` to compose action decorators (public, wallet, multisig).\n */\nexport function createClient<\n TExtended extends Record<string, unknown> = Record<string, unknown>,\n>(config: ClientConfig): Client<TExtended> {\n const transport = config.transport({ chain: config.chain });\n\n const client: Client = {\n chain: config.chain,\n account: config.account,\n transport,\n request: transport.request,\n extend(fn) {\n const extensions = fn(client);\n const extended = { ...client };\n\n for (const [key, value] of Object.entries(extensions)) {\n if (BASE_KEYS.has(key)) continue; // protect base properties\n (extended as any)[key] = value;\n }\n\n // re-bind extend so it chains\n extended.extend = (nextFn: any) => {\n const nextExtensions = nextFn(extended);\n const next = { ...extended };\n for (const [key, value] of Object.entries(nextExtensions)) {\n if (BASE_KEYS.has(key)) continue;\n (next as any)[key] = value;\n }\n next.extend = extended.extend;\n return next as any;\n };\n\n return extended as any;\n },\n };\n\n return client as Client<TExtended>;\n}\n",
6
+ "import type { Client } from \"../types.ts\";\nimport { getNonce, type GetNonceParams } from \"../../actions/public/getNonce.ts\";\nimport { getBalance, type GetBalanceParams } from \"../../actions/public/getBalance.ts\";\nimport { getAccountInfo, type GetAccountInfoParams, type AccountInfo } from \"../../actions/public/getAccountInfo.ts\";\nimport { getBlock, type GetBlockParams } from \"../../actions/public/getBlock.ts\";\nimport { getBlockHeight } from \"../../actions/public/getBlockHeight.ts\";\nimport { readContract, type ReadContractParams } from \"../../actions/public/readContract.ts\";\nimport { getContractAbi, type GetContractAbiParams } from \"../../actions/public/getContractAbi.ts\";\nimport { getMapEntry, type GetMapEntryParams } from \"../../actions/public/getMapEntry.ts\";\nimport { estimateFee, type EstimateFeeParams, type FeeEstimation } from \"../../actions/public/estimateFee.ts\";\nimport { multicall, type MulticallParams, type MulticallResult } from \"../../actions/public/multicall.ts\";\nimport { simulateCall, type SimulateCallParams, type SimulateCallResult } from \"../../actions/public/simulateCall.ts\";\nimport { simulateTransaction, type SimulateTransactionParams, type SimulateTransactionResult } from \"../../actions/public/simulateTransaction.ts\";\nimport type { ClarityValue } from \"../../clarity/types.ts\";\nimport type { Subscription } from \"../../subscriptions/types.ts\";\nimport {\n watchBlocks, type WatchBlocksParams,\n watchMempool, type WatchMempoolParams,\n watchTransaction, type WatchTransactionParams,\n watchAddress, type WatchAddressParams,\n watchAddressBalance, type WatchAddressBalanceParams,\n watchNftEvent, type WatchNftEventParams,\n} from \"../../subscriptions/actions.ts\";\n\n/** Read-only actions: balance queries, contract reads, block data, and event subscriptions. */\nexport type PublicActions = {\n getNonce: (params: GetNonceParams) => Promise<bigint>;\n getBalance: (params: GetBalanceParams) => Promise<bigint>;\n getAccountInfo: (params: GetAccountInfoParams) => Promise<AccountInfo>;\n getBlock: (params: GetBlockParams) => Promise<any>;\n getBlockHeight: () => Promise<number>;\n readContract: (params: ReadContractParams) => Promise<ClarityValue>;\n getContractAbi: (params: GetContractAbiParams) => Promise<any>;\n getMapEntry: (params: GetMapEntryParams) => Promise<ClarityValue>;\n estimateFee: (params: EstimateFeeParams) => Promise<FeeEstimation[]>;\n multicall: <T extends boolean = true>(params: MulticallParams<T>) => Promise<MulticallResult<T>>;\n simulateCall: (params: SimulateCallParams) => Promise<SimulateCallResult>;\n simulateTransaction: (params: SimulateTransactionParams) => Promise<SimulateTransactionResult>;\n watchBlocks: (params: WatchBlocksParams) => Promise<Subscription>;\n watchMempool: (params: WatchMempoolParams) => Promise<Subscription>;\n watchTransaction: (params: WatchTransactionParams) => Promise<Subscription>;\n watchAddress: (params: WatchAddressParams) => Promise<Subscription>;\n watchAddressBalance: (params: WatchAddressBalanceParams) => Promise<Subscription>;\n watchNftEvent: (params: WatchNftEventParams) => Promise<Subscription>;\n};\n\n/** Decorator that binds {@link PublicActions} to a client instance. */\nexport function publicActions(client: Client): PublicActions {\n return {\n getNonce: (params) => getNonce(client, params),\n getBalance: (params) => getBalance(client, params),\n getAccountInfo: (params) => getAccountInfo(client, params),\n getBlock: (params) => getBlock(client, params),\n getBlockHeight: () => getBlockHeight(client),\n readContract: (params) => readContract(client, params),\n getContractAbi: (params) => getContractAbi(client, params),\n getMapEntry: (params) => getMapEntry(client, params),\n estimateFee: (params) => estimateFee(client, params),\n multicall: (params) => multicall(client, params),\n simulateCall: (params) => simulateCall(client, params),\n simulateTransaction: (params) => simulateTransaction(client, params),\n watchBlocks: (params) => watchBlocks(client, params),\n watchMempool: (params) => watchMempool(client, params),\n watchTransaction: (params) => watchTransaction(client, params),\n watchAddress: (params) => watchAddress(client, params),\n watchAddressBalance: (params) => watchAddressBalance(client, params),\n watchNftEvent: (params) => watchNftEvent(client, params),\n };\n}\n",
7
+ "import type { ClientConfig, Client } from \"./types.ts\";\nimport { createClient } from \"./createClient.ts\";\nimport { publicActions, type PublicActions } from \"./decorators/public.ts\";\n\n/** Configuration for {@link createPublicClient} (no account needed). */\nexport type PublicClientConfig = Omit<ClientConfig, \"account\">;\n\n/**\n * Create a read-only client pre-extended with {@link PublicActions}.\n * Use for queries, contract reads, and event subscriptions.\n */\nexport function createPublicClient(\n config: PublicClientConfig\n): Client<PublicActions> & PublicActions {\n return createClient(config).extend(publicActions);\n}\n",
8
+ "import type { Client } from \"../types.ts\";\nimport { sendTransaction, type SendTransactionParams, type SendTransactionResult } from \"../../actions/wallet/sendTransaction.ts\";\nimport { signTransactionAction, type SignTransactionParams } from \"../../actions/wallet/signTransaction.ts\";\nimport { transferStx, type TransferStxParams } from \"../../actions/wallet/transferStx.ts\";\nimport { callContract, type CallContractParams } from \"../../actions/wallet/callContract.ts\";\nimport { deployContract, type DeployContractParams } from \"../../actions/wallet/deployContract.ts\";\nimport { signMessage, type SignMessageParams } from \"../../actions/wallet/signMessage.ts\";\nimport { sponsorTransaction, type SponsorTransactionParams } from \"../../actions/wallet/sponsorTransaction.ts\";\nimport type { StacksTransaction } from \"../../transactions/types.ts\";\n\n/** Signing actions: send transactions, transfer STX, call/deploy contracts, sign messages. */\nexport type WalletActions = {\n sendTransaction: (params: SendTransactionParams) => Promise<SendTransactionResult>;\n signTransaction: (params: SignTransactionParams) => Promise<StacksTransaction>;\n transferStx: (params: TransferStxParams) => Promise<string>;\n callContract: (params: CallContractParams) => Promise<string>;\n deployContract: (params: DeployContractParams) => Promise<string>;\n signMessage: (params: SignMessageParams) => Promise<string>;\n sponsorTransaction: (params: SponsorTransactionParams) => Promise<StacksTransaction>;\n};\n\n/** Decorator that binds {@link WalletActions} to a client instance. */\nexport function walletActions(client: Client): WalletActions {\n return {\n sendTransaction: (params) => sendTransaction(client, params),\n signTransaction: (params) => signTransactionAction(client, params),\n transferStx: (params) => transferStx(client, params),\n callContract: (params) => callContract(client, params),\n deployContract: (params) => deployContract(client, params),\n signMessage: (params) => signMessage(client, params),\n sponsorTransaction: (params) => sponsorTransaction(client, params),\n };\n}\n",
9
+ "import type { ClientConfig, Client, Account } from \"./types.ts\";\nimport { createClient } from \"./createClient.ts\";\nimport { walletActions, type WalletActions } from \"./decorators/wallet.ts\";\n\n/** Configuration for {@link createWalletClient} — requires an account for signing. */\nexport type WalletClientConfig = ClientConfig & {\n account: Account;\n};\n\n/**\n * Create a client pre-extended with {@link WalletActions} for signing and broadcasting transactions.\n */\nexport function createWalletClient(\n config: WalletClientConfig\n): Client<WalletActions> & WalletActions & { account: Account } {\n return createClient(config).extend(walletActions) as any;\n}\n",
10
+ "import type { Client } from \"../types.ts\";\nimport type { PostCondition } from \"../../postconditions/types.ts\";\nimport type { ClarityValue } from \"../../clarity/types.ts\";\nimport type { IntegerType } from \"../../utils/encoding.ts\";\nimport type { StacksTransaction, ClarityVersion, MultiSigHashMode } from \"../../transactions/types.ts\";\nimport { buildTokenTransfer, buildContractCall, buildContractDeploy } from \"../../transactions/build.ts\";\nimport { finalizeMultiSig, isNonSequential } from \"../../transactions/multisig.ts\";\nimport { sendTransaction, type SendTransactionResult } from \"../../actions/wallet/sendTransaction.ts\";\nimport { getNonce } from \"../../actions/public/getNonce.ts\";\nimport { estimateFee } from \"../../actions/public/estimateFee.ts\";\nimport { parseContractId } from \"../../utils/address.ts\";\n\nexport type MultiSigTransferStxParams = {\n to: string;\n amount: IntegerType;\n memo?: string;\n fee?: IntegerType;\n nonce?: IntegerType;\n postConditionMode?: \"allow\" | \"deny\";\n postConditions?: PostCondition[];\n};\n\nexport type MultiSigCallContractParams = {\n contract: string;\n functionName: string;\n functionArgs?: ClarityValue[];\n fee?: IntegerType;\n nonce?: IntegerType;\n postConditionMode?: \"allow\" | \"deny\";\n postConditions?: PostCondition[];\n};\n\nexport type MultiSigDeployContractParams = {\n contractName: string;\n codeBody: string;\n clarityVersion?: ClarityVersion;\n fee?: IntegerType;\n nonce?: IntegerType;\n postConditionMode?: \"allow\" | \"deny\";\n postConditions?: PostCondition[];\n};\n\nexport type MultiSigSendTransactionParams = {\n transaction: StacksTransaction;\n attachment?: Uint8Array | string;\n};\n\n/** Multi-sig transaction actions: build unsigned transactions and broadcast with auto-finalization. */\nexport type MultiSigActions = {\n transferStx: (params: MultiSigTransferStxParams) => Promise<StacksTransaction>;\n callContract: (params: MultiSigCallContractParams) => Promise<StacksTransaction>;\n deployContract: (params: MultiSigDeployContractParams) => Promise<StacksTransaction>;\n sendTransaction: (params: MultiSigSendTransactionParams) => Promise<SendTransactionResult>;\n};\n\n/** Decorator that binds {@link MultiSigActions} to a multi-sig client. */\nexport function multisigActions(client: Client): MultiSigActions {\n const msConfig = (client as any)._multisigConfig as {\n signers: string[];\n requiredSignatures: number;\n hashMode?: MultiSigHashMode;\n };\n\n if (!msConfig) throw new Error(\"multisigActions requires a multi-sig client\");\n\n const { signers, requiredSignatures, hashMode } = msConfig;\n\n /** Resolve nonce from the multi-sig address */\n async function resolveNonce(nonce?: IntegerType): Promise<IntegerType> {\n if (nonce !== undefined) return nonce;\n const { makeMultiSigAddress } = await import(\"../../transactions/multisig.ts\");\n const address = makeMultiSigAddress(signers, requiredSignatures, client.chain);\n return getNonce(client, { address });\n }\n\n return {\n async transferStx(params) {\n const nonce = await resolveNonce(params.nonce);\n\n const unsigned = buildTokenTransfer({\n recipient: params.to,\n amount: params.amount,\n memo: params.memo,\n fee: params.fee ?? 0n,\n nonce,\n publicKeys: signers,\n signaturesRequired: requiredSignatures,\n hashMode,\n chain: client.chain,\n postConditionMode: params.postConditionMode,\n postConditions: params.postConditions,\n });\n\n if (params.fee === undefined) {\n const estimates = await estimateFee(client, { transaction: unsigned });\n const mid = estimates[1] ?? estimates[0];\n if (mid) {\n (unsigned.auth.spendingCondition as any).fee = BigInt(mid.fee);\n }\n }\n\n return unsigned;\n },\n\n async callContract(params) {\n const [contractAddress, contractName] = parseContractId(params.contract);\n const nonce = await resolveNonce(params.nonce);\n\n const unsigned = buildContractCall({\n contractAddress,\n contractName,\n functionName: params.functionName,\n functionArgs: params.functionArgs ?? [],\n fee: params.fee ?? 0n,\n nonce,\n publicKeys: signers,\n signaturesRequired: requiredSignatures,\n hashMode,\n chain: client.chain,\n postConditionMode: params.postConditionMode,\n postConditions: params.postConditions,\n });\n\n if (params.fee === undefined) {\n const estimates = await estimateFee(client, { transaction: unsigned });\n const mid = estimates[1] ?? estimates[0];\n if (mid) {\n (unsigned.auth.spendingCondition as any).fee = BigInt(mid.fee);\n }\n }\n\n return unsigned;\n },\n\n async deployContract(params) {\n const nonce = await resolveNonce(params.nonce);\n\n const unsigned = buildContractDeploy({\n contractName: params.contractName,\n codeBody: params.codeBody,\n clarityVersion: params.clarityVersion,\n fee: params.fee ?? 0n,\n nonce,\n publicKeys: signers,\n signaturesRequired: requiredSignatures,\n hashMode,\n chain: client.chain,\n postConditionMode: params.postConditionMode,\n postConditions: params.postConditions,\n });\n\n if (params.fee === undefined) {\n const estimates = await estimateFee(client, { transaction: unsigned });\n const mid = estimates[1] ?? estimates[0];\n if (mid) {\n (unsigned.auth.spendingCondition as any).fee = BigInt(mid.fee);\n }\n }\n\n return unsigned;\n },\n\n async sendTransaction(params) {\n // Auto-finalize before broadcast\n const finalized = finalizeMultiSig(params.transaction, signers);\n return sendTransaction(client, {\n transaction: finalized,\n attachment: params.attachment,\n });\n },\n };\n}\n",
11
+ "import type { ClientConfig, Client } from \"./types.ts\";\nimport type { MultiSigHashMode } from \"../transactions/types.ts\";\nimport { createClient } from \"./createClient.ts\";\nimport { multisigActions, type MultiSigActions } from \"./decorators/multisig.ts\";\n\n/** Configuration for {@link createMultiSigClient} — requires signer public keys and threshold. */\nexport type MultiSigClientConfig = Omit<ClientConfig, \"account\"> & {\n signers: string[];\n requiredSignatures: number;\n hashMode?: MultiSigHashMode;\n};\n\n/** A client pre-extended with {@link MultiSigActions} for m-of-n signing workflows. */\nexport type MultiSigClient = Client<MultiSigActions> & MultiSigActions;\n\n/**\n * Create a client for multi-sig transaction workflows.\n * Builds unsigned transactions that can be signed by each party then broadcast.\n */\nexport function createMultiSigClient(config: MultiSigClientConfig): MultiSigClient {\n const client = createClient(config);\n\n // Attach multi-sig config for the decorator to read\n (client as any)._multisigConfig = {\n signers: config.signers,\n requiredSignatures: config.requiredSignatures,\n hashMode: config.hashMode,\n };\n\n return client.extend(multisigActions) as any;\n}\n",
12
+ "import type { TransportConfig, RequestFn, Transport, RequestOptions } from \"./types.ts\";\n\nexport function createTransport(\n type: string,\n config: TransportConfig & { request: RequestFn }\n): Transport {\n return {\n type,\n request: config.request,\n config,\n };\n}\n\nexport async function fetchWithRetry(\n url: string,\n options: RequestInit,\n retryCount: number,\n retryDelay: number,\n timeout: number\n): Promise<Response> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retryCount; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok || response.status < 500) {\n return response;\n }\n\n lastError = new Error(`HTTP ${response.status}: ${response.statusText}`);\n } catch (error) {\n lastError =\n error instanceof Error ? error : new Error(String(error));\n }\n\n if (attempt < retryCount) {\n await new Promise((r) => setTimeout(r, retryDelay * (attempt + 1)));\n }\n }\n\n throw lastError ?? new Error(\"Request failed\");\n}\n\nexport function buildRequestFn(\n baseUrl: string,\n config: TransportConfig\n): RequestFn {\n const {\n timeout = 30_000,\n retryCount = 3,\n retryDelay = 150,\n fetchOptions = {},\n apiKey,\n } = config;\n\n return async (path: string, options?: RequestOptions) => {\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(fetchOptions.headers as Record<string, string>),\n ...options?.headers,\n };\n\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey;\n }\n\n const init: RequestInit = {\n ...fetchOptions,\n method: options?.method ?? \"GET\",\n headers,\n };\n\n if (options?.body !== undefined) {\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetchWithRetry(\n url,\n init,\n retryCount,\n retryDelay,\n timeout\n );\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return response.json();\n }\n return response.text();\n };\n}\n",
13
+ "import type { StacksChain } from \"../chains/types.ts\";\nimport type { TransportConfig, TransportFactory } from \"./types.ts\";\nimport { buildRequestFn, createTransport } from \"./createTransport.ts\";\n\n/**\n * Create an HTTP transport for Stacks node RPC calls.\n * Falls back to the chain's default RPC URL, then `localhost:3999`.\n */\nexport function http(url?: string, config?: TransportConfig): TransportFactory {\n return (params) => {\n const resolvedUrl =\n url ?? params?.chain?.rpcUrls.default.http[0] ?? \"http://localhost:3999\";\n\n const mergedConfig: TransportConfig = {\n ...config,\n url: resolvedUrl,\n };\n\n return createTransport(\"http\", {\n ...mergedConfig,\n request: buildRequestFn(resolvedUrl, mergedConfig),\n });\n };\n}\n",
14
+ "import type { RequestFn, TransportFactory } from \"./types.ts\";\nimport { createTransport } from \"./createTransport.ts\";\n\n/** Create a transport backed by a user-provided request function. */\nexport function custom(params: { request: RequestFn }): TransportFactory {\n return () => createTransport(\"custom\", { request: params.request });\n}\n",
15
+ "import type { TransportFactory } from \"./types.ts\";\nimport { createTransport } from \"./createTransport.ts\";\n\n/** Create a transport that tries each transport in order until one succeeds. */\nexport function fallback(transports: TransportFactory[]): TransportFactory {\n return (params) => {\n const resolved = transports.map((t) => t(params));\n\n return createTransport(\"fallback\", {\n request: async (path, options) => {\n let lastError: Error | undefined;\n for (const transport of resolved) {\n try {\n return await transport.request(path, options);\n } catch (error) {\n lastError =\n error instanceof Error ? error : new Error(String(error));\n }\n }\n throw lastError ?? new Error(\"All transports failed\");\n },\n });\n };\n}\n",
16
+ "import type { StacksChain } from \"../chains/types.ts\";\nimport type { Transport, TransportConfig, TransportFactory } from \"./types.ts\";\nimport type { Subscription, WsSubscribeParams } from \"../subscriptions/types.ts\";\nimport { buildRequestFn } from \"./createTransport.ts\";\nimport { WebSocketError } from \"../errors/websocket.ts\";\n\n/** Configuration for the WebSocket transport, extending base {@link TransportConfig}. */\nexport type WebSocketTransportConfig = TransportConfig & {\n /** WebSocket URL (resolved from chain if omitted) */\n url?: string;\n /** Enable auto-reconnect (default: true) */\n reconnect?: boolean;\n /** Max reconnect attempts (default: 10) */\n reconnectMaxAttempts?: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n reconnectBaseDelay?: number;\n};\n\n/** Transport with WebSocket subscription capabilities and auto-reconnect. */\nexport type WebSocketTransport = Transport & {\n type: \"webSocket\";\n subscribe: (\n params: WsSubscribeParams,\n callback: (data: any) => void\n ) => Promise<Subscription>;\n destroy: () => void;\n};\n\ntype JsonRpcRequest = {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params: Record<string, unknown>;\n};\n\ntype JsonRpcResponse = {\n jsonrpc: \"2.0\";\n id: number;\n result?: unknown;\n error?: { code: number; message: string };\n};\n\ntype JsonRpcNotification = {\n jsonrpc: \"2.0\";\n method: string;\n params: unknown;\n};\n\ntype SubEntry = {\n params: WsSubscribeParams;\n callbacks: Set<(data: any) => void>;\n};\n\nfunction subKey(params: WsSubscribeParams): string {\n const parts: string[] = [params.event];\n if (params.tx_id) parts.push(`tx_id:${params.tx_id}`);\n if (params.address) parts.push(`address:${params.address}`);\n if (params.asset_identifier)\n parts.push(`asset:${params.asset_identifier}`);\n if (params.value) parts.push(`value:${params.value}`);\n return parts.join(\"|\");\n}\n\nexport class WebSocketChannel {\n private ws: WebSocket | null = null;\n private url: string;\n private nextId = 1;\n private pending = new Map<\n number,\n { resolve: (v: unknown) => void; reject: (e: Error) => void }\n >();\n private subs = new Map<string, SubEntry>();\n private destroyed = false;\n private reconnecting = false;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n private reconnect: boolean;\n private reconnectMaxAttempts: number;\n private reconnectBaseDelay: number;\n\n constructor(url: string, config?: WebSocketTransportConfig) {\n this.url = url;\n this.reconnect = config?.reconnect ?? true;\n this.reconnectMaxAttempts = config?.reconnectMaxAttempts ?? 10;\n this.reconnectBaseDelay = config?.reconnectBaseDelay ?? 1000;\n }\n\n private connect(): Promise<void> {\n if (this.ws?.readyState === WebSocket.OPEN) return Promise.resolve();\n if (this.ws?.readyState === WebSocket.CONNECTING) {\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n this.ws?.removeEventListener(\"error\", onError);\n resolve();\n };\n const onError = (e: Event) => {\n this.ws?.removeEventListener(\"open\", onOpen);\n reject(\n new WebSocketError(\"WebSocket connection failed\", {\n details: String(e),\n })\n );\n };\n this.ws!.addEventListener(\"open\", onOpen, { once: true });\n this.ws!.addEventListener(\"error\", onError, { once: true });\n });\n }\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.url);\n\n this.ws.addEventListener(\n \"open\",\n () => {\n this.reconnectAttempt = 0;\n this.reconnecting = false;\n resolve();\n },\n { once: true }\n );\n\n this.ws.addEventListener(\n \"error\",\n (e) => {\n reject(\n new WebSocketError(\"WebSocket connection failed\", {\n details: String(e),\n })\n );\n },\n { once: true }\n );\n\n this.ws.addEventListener(\"message\", (event) => {\n this.handleMessage(event.data);\n });\n\n this.ws.addEventListener(\"close\", () => {\n if (!this.destroyed) this.handleDisconnect();\n });\n });\n }\n\n private handleMessage(raw: string | ArrayBuffer | Blob) {\n const data =\n typeof raw === \"string\" ? raw : new TextDecoder().decode(raw as ArrayBuffer);\n\n let msg: JsonRpcResponse | JsonRpcNotification;\n try {\n msg = JSON.parse(data);\n } catch {\n return;\n }\n\n // RPC response\n if (\"id\" in msg && msg.id != null) {\n const rpc = msg as JsonRpcResponse;\n const p = this.pending.get(rpc.id);\n if (!p) return;\n this.pending.delete(rpc.id);\n if (rpc.error) {\n p.reject(\n new WebSocketError(rpc.error.message, {\n details: `JSON-RPC error ${rpc.error.code}`,\n })\n );\n } else {\n p.resolve(rpc.result);\n }\n return;\n }\n\n // Notification\n const notif = msg as JsonRpcNotification;\n if (!notif.method) return;\n\n for (const [, entry] of this.subs) {\n if (entry.params.event === notif.method) {\n for (const cb of entry.callbacks) {\n try {\n cb(notif.params);\n } catch {\n // subscriber error — don't crash channel\n }\n }\n }\n }\n }\n\n private handleDisconnect() {\n this.ws = null;\n\n // reject pending RPCs\n for (const [, p] of this.pending) {\n p.reject(new WebSocketError(\"WebSocket disconnected\"));\n }\n this.pending.clear();\n\n if (\n this.reconnect &&\n this.subs.size > 0 &&\n this.reconnectAttempt < this.reconnectMaxAttempts\n ) {\n this.scheduleReconnect();\n }\n }\n\n private scheduleReconnect() {\n if (this.destroyed || this.reconnecting) return;\n this.reconnecting = true;\n const delay = this.reconnectBaseDelay * 2 ** this.reconnectAttempt;\n this.reconnectAttempt++;\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnecting = false;\n try {\n await this.connect();\n await this.resubscribeAll();\n } catch {\n if (!this.destroyed && this.subs.size > 0) {\n this.handleDisconnect();\n }\n }\n }, delay);\n }\n\n private async resubscribeAll() {\n for (const [, entry] of this.subs) {\n await this.sendRpc(\"subscribe\", entry.params);\n }\n }\n\n private sendRpc(method: string, params: Record<string, unknown>): Promise<unknown> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return reject(new WebSocketError(\"WebSocket not connected\"));\n }\n\n const id = this.nextId++;\n const msg: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n };\n\n this.pending.set(id, { resolve, reject });\n this.ws.send(JSON.stringify(msg));\n });\n }\n\n async subscribe(\n params: WsSubscribeParams,\n callback: (data: any) => void\n ): Promise<Subscription> {\n if (this.destroyed) {\n throw new WebSocketError(\"WebSocket channel has been destroyed\");\n }\n\n await this.connect();\n\n const key = subKey(params);\n let entry = this.subs.get(key);\n\n if (entry) {\n // Dedup: reuse existing WS subscription\n entry.callbacks.add(callback);\n } else {\n // New WS subscription\n entry = { params, callbacks: new Set([callback]) };\n this.subs.set(key, entry);\n await this.sendRpc(\"subscribe\", params);\n }\n\n return {\n unsubscribe: () => {\n const e = this.subs.get(key);\n if (!e) return;\n e.callbacks.delete(callback);\n if (e.callbacks.size === 0) {\n this.subs.delete(key);\n // Best-effort unsubscribe RPC\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.sendRpc(\"unsubscribe\", params).catch(() => {});\n }\n // Auto-close when no subscribers remain\n if (this.subs.size === 0) this.closeQuietly();\n }\n },\n };\n }\n\n private closeQuietly() {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n destroy() {\n this.destroyed = true;\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n\n for (const [, p] of this.pending) {\n p.reject(new WebSocketError(\"WebSocket channel destroyed\"));\n }\n this.pending.clear();\n this.subs.clear();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n}\n\nfunction deriveWsUrl(httpUrl: string): string {\n return httpUrl.replace(/^http/, \"ws\").replace(/\\/$/, \"\") + \"/extended/v1/ws\";\n}\n\n/**\n * Create a WebSocket transport for real-time Stacks event subscriptions.\n * HTTP requests use the resolved RPC URL; subscriptions use the WS endpoint.\n */\nexport function webSocket(\n url?: string,\n config?: WebSocketTransportConfig\n): TransportFactory {\n return (params) => {\n const httpUrl =\n config?.url ??\n params?.chain?.rpcUrls.default.http[0] ??\n \"http://localhost:3999\";\n\n const wsUrl =\n url ??\n params?.chain?.rpcUrls.default.ws?.[0] ??\n deriveWsUrl(httpUrl);\n\n const resolvedHttpConfig: TransportConfig = {\n ...config,\n url: httpUrl,\n };\n\n const channel = new WebSocketChannel(wsUrl, config);\n\n const transport: WebSocketTransport = {\n type: \"webSocket\",\n request: buildRequestFn(httpUrl, resolvedHttpConfig),\n config: resolvedHttpConfig,\n subscribe: (subParams, callback) =>\n channel.subscribe(subParams, callback),\n destroy: () => channel.destroy(),\n };\n\n return transport;\n };\n}\n"
17
+ ],
18
+ "mappings": "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",
19
+ "debugId": "2199EE0D4F7EBD2864756E2164756E21",
20
+ "names": []
21
+ }