@sidhujag/sysweb3-keyring 2.1.12 → 2.1.14

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.
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonRpcReadClient = exports.RpcReadError = void 0;
4
+ const rpc_transport_1 = require("./rpc-transport");
5
+ class RpcBatchRefused extends Error {
6
+ }
7
+ class RpcPayloadTooLarge extends Error {
8
+ }
9
+ class RpcBatchLimit extends Error {
10
+ }
11
+ const aborted = (signal) => {
12
+ if (signal.reason instanceof Error)
13
+ return signal.reason;
14
+ return Object.assign(new Error('RPC read aborted'), { name: 'AbortError' });
15
+ };
16
+ const check = (signal) => {
17
+ if (signal.aborted)
18
+ throw aborted(signal);
19
+ };
20
+ const byteLength = (value) => new TextEncoder().encode(value).byteLength;
21
+ const boundedInteger = (value, maximum, name) => {
22
+ if (!Number.isSafeInteger(value) || value < 1 || value > maximum)
23
+ throw new Error(`Invalid RPC ${name}`);
24
+ return value;
25
+ };
26
+ class RpcReadError extends Error {
27
+ constructor(value) {
28
+ super(value.message);
29
+ this.name = 'RpcReadError';
30
+ this.code = value.code;
31
+ this.data = value.data;
32
+ }
33
+ }
34
+ exports.RpcReadError = RpcReadError;
35
+ const batchFailure = (value) => {
36
+ if (!value || typeof value !== 'object' || Array.isArray(value))
37
+ return undefined;
38
+ const { jsonrpc, result, error, id } = value;
39
+ if (jsonrpc !== '2.0' ||
40
+ result !== undefined ||
41
+ (id !== null && id !== undefined) ||
42
+ !error ||
43
+ !Number.isSafeInteger(error.code) ||
44
+ typeof error.message !== 'string')
45
+ return undefined;
46
+ if ((error.code === -32600 || error.code === -32005) &&
47
+ /batch|array/i.test(error.message)) {
48
+ if (/too (?:large|many)|more than|limit|maximum|max(?:imum)? size/i.test(error.message))
49
+ return new RpcBatchLimit();
50
+ if (/unsupported|not support|not allowed|invalid (?:request|batch|array)/i.test(error.message))
51
+ return new RpcBatchRefused();
52
+ }
53
+ return undefined;
54
+ };
55
+ async function responseText(response, maximum, signal) {
56
+ const declared = response.headers.get('content-length');
57
+ if (declared !== null &&
58
+ (!/^\d+$/.test(declared) || Number(declared) > maximum)) {
59
+ void response.body?.cancel().catch(() => undefined);
60
+ throw new rpc_transport_1.RpcResponseIntegrityError('RPC response exceeded size limit', false);
61
+ }
62
+ if (!response.body?.getReader) {
63
+ const text = await response.text();
64
+ check(signal);
65
+ if (byteLength(text) > maximum)
66
+ throw new rpc_transport_1.RpcResponseIntegrityError('RPC response exceeded size limit', false);
67
+ return text;
68
+ }
69
+ const reader = response.body.getReader();
70
+ const decoder = new TextDecoder('utf-8', { fatal: true });
71
+ let size = 0;
72
+ let text = '';
73
+ try {
74
+ let complete = false;
75
+ while (!complete) {
76
+ check(signal);
77
+ const part = await reader.read();
78
+ if (part.done) {
79
+ complete = true;
80
+ continue;
81
+ }
82
+ size += part.value.byteLength;
83
+ if (size > maximum)
84
+ throw new rpc_transport_1.RpcResponseIntegrityError('RPC response exceeded size limit', false);
85
+ text += decoder.decode(part.value, { stream: true });
86
+ }
87
+ return text + decoder.decode();
88
+ }
89
+ finally {
90
+ void reader.cancel().catch(() => undefined);
91
+ }
92
+ }
93
+ /** Bounded, read-only JSON-RPC transport. Each instance belongs to one endpoint generation. */
94
+ class JsonRpcReadClient {
95
+ constructor(url, options = {}) {
96
+ this.lifetime = new AbortController();
97
+ this.queue = [];
98
+ this.active = 0;
99
+ this.chainGeneration = 0;
100
+ this.endpoint = url;
101
+ const endpoint = new URL(url);
102
+ if (!['https:', 'http:'].includes(endpoint.protocol))
103
+ throw new Error('Invalid RPC URL');
104
+ this.fetcher =
105
+ options.fetch ??
106
+ ((address, init) => fetch(address, init));
107
+ this.options = {
108
+ requestInit: options.requestInit ?? {},
109
+ recoverResponse: options.recoverResponse ?? true,
110
+ maxBatchItems: boundedInteger(options.maxBatchItems ?? 40, 128, 'batch size'),
111
+ maxRequestBytes: boundedInteger(options.maxRequestBytes ?? 256 * 1024, 2 * 1024 * 1024, 'request size'),
112
+ maxResponseBytes: boundedInteger(options.maxResponseBytes ?? 2 * 1024 * 1024, 8 * 1024 * 1024, 'response size'),
113
+ maxConcurrency: boundedInteger(options.maxConcurrency ?? 4, 16, 'concurrency'),
114
+ timeoutMs: boundedInteger(options.timeoutMs ?? 12000, 30000, 'timeout'),
115
+ };
116
+ this.batchLimit = this.options.maxBatchItems;
117
+ if (options.signal?.aborted)
118
+ this.destroy();
119
+ else
120
+ options.signal?.addEventListener('abort', () => this.destroy(), {
121
+ once: true,
122
+ });
123
+ }
124
+ get url() {
125
+ return this.endpoint;
126
+ }
127
+ destroy() {
128
+ this.chainGeneration++;
129
+ this.chainCache = undefined;
130
+ this.chainRequest?.controller.abort();
131
+ this.lifetime.abort();
132
+ }
133
+ async slot(signal, work) {
134
+ check(signal);
135
+ await new Promise((resolve, reject) => {
136
+ const waiter = {
137
+ run: () => {
138
+ signal.removeEventListener('abort', waiter.cancel);
139
+ this.active++;
140
+ resolve();
141
+ },
142
+ cancel: () => {
143
+ const i = this.queue.indexOf(waiter);
144
+ if (i >= 0)
145
+ this.queue.splice(i, 1);
146
+ reject(aborted(signal));
147
+ },
148
+ };
149
+ if (this.active < this.options.maxConcurrency)
150
+ waiter.run();
151
+ else {
152
+ this.queue.push(waiter);
153
+ signal.addEventListener('abort', waiter.cancel, { once: true });
154
+ }
155
+ });
156
+ try {
157
+ check(signal);
158
+ return await work();
159
+ }
160
+ finally {
161
+ this.active--;
162
+ this.queue.shift()?.run();
163
+ }
164
+ }
165
+ async readMany(inputs, options = {}) {
166
+ if (!Array.isArray(inputs) ||
167
+ inputs.length > 1024 ||
168
+ inputs.some((input) => !input ||
169
+ !(0, rpc_transport_1.isReadOnlyRpcMethod)(input.method) ||
170
+ !Array.isArray(input.params)))
171
+ throw new Error('Invalid read-only RPC requests');
172
+ // Snapshot before any await so caller mutations cannot change dispatched reads.
173
+ const serialized = JSON.stringify(inputs);
174
+ if (byteLength(serialized) > this.options.maxRequestBytes * 16)
175
+ throw new Error('RPC read work exceeded request budget');
176
+ const snapshot = JSON.parse(serialized);
177
+ if (!Array.isArray(snapshot) ||
178
+ snapshot.length > 1024 ||
179
+ snapshot.some((input) => !input ||
180
+ !(0, rpc_transport_1.isReadOnlyRpcMethod)(input.method) ||
181
+ !Array.isArray(input.params)))
182
+ throw new Error('Invalid read-only RPC requests');
183
+ const timeout = boundedInteger(options.timeoutMs ?? this.options.timeoutMs, 30000, 'timeout');
184
+ const maximum = boundedInteger(options.maxResponseBytes ?? this.options.maxResponseBytes, 8 * 1024 * 1024, 'response size');
185
+ const controller = new AbortController();
186
+ const abort = () => controller.abort(options.signal?.reason ?? this.lifetime.signal.reason);
187
+ const sources = [options.signal, this.lifetime.signal].filter((value) => !!value);
188
+ sources.forEach((source) => source.addEventListener('abort', abort, { once: true }));
189
+ if (sources.some((source) => source.aborted))
190
+ abort();
191
+ const timer = setTimeout(() => controller.abort(Object.assign(new Error('RPC read deadline exceeded'), {
192
+ name: 'AbortError',
193
+ })), timeout);
194
+ const signal = controller.signal;
195
+ let attempts = 0;
196
+ const request = (rows, batch) => (0, rpc_transport_1.requestJsonRpc)(this.url, rows, batch, signal, async (url, body) => {
197
+ if (++attempts > 2048)
198
+ throw new Error('RPC attempt limit exceeded');
199
+ if (byteLength(body) > this.options.maxRequestBytes)
200
+ throw new RpcPayloadTooLarge();
201
+ return this.slot(signal, async () => {
202
+ const headers = new Headers(this.options.requestInit.headers);
203
+ headers.set('Content-Type', 'application/json');
204
+ headers.set('Accept', 'application/json');
205
+ const response = await this.fetcher(url, {
206
+ ...this.options.requestInit,
207
+ method: 'POST',
208
+ headers,
209
+ body,
210
+ signal,
211
+ });
212
+ check(signal);
213
+ if (response.status === 413) {
214
+ void response.body?.cancel().catch(() => undefined);
215
+ throw new RpcPayloadTooLarge();
216
+ }
217
+ const contentType = response.headers.get('content-type');
218
+ if (contentType &&
219
+ !/^(application\/json|application\/[a-z0-9!#$&^_.+-]+\+json)(?:\s*;|$)/i.test(contentType)) {
220
+ void response.body?.cancel().catch(() => undefined);
221
+ throw new rpc_transport_1.RpcResponseIntegrityError('Invalid JSON-RPC content type', false);
222
+ }
223
+ const text = await responseText(response, maximum, signal);
224
+ let json;
225
+ try {
226
+ json = JSON.parse(text);
227
+ }
228
+ catch {
229
+ throw new rpc_transport_1.RpcResponseIntegrityError('Invalid JSON-RPC JSON response', false);
230
+ }
231
+ const batchError = batch ? batchFailure(json) : undefined;
232
+ if (batchError)
233
+ throw batchError;
234
+ if (!response.ok || response.status !== 200)
235
+ throw Object.assign(new Error(`RPC HTTP ${response.status}`), {
236
+ status: response.status,
237
+ });
238
+ return json;
239
+ });
240
+ }, this.options.recoverResponse);
241
+ const execute = async (rows) => {
242
+ check(signal);
243
+ try {
244
+ const responses = await request(rows, rows.length > 1);
245
+ return responses.map((response) => {
246
+ if (response.error)
247
+ return {
248
+ status: 'rejected',
249
+ reason: new RpcReadError(response.error),
250
+ };
251
+ return { status: 'fulfilled', value: response.result };
252
+ });
253
+ }
254
+ catch (error) {
255
+ check(signal);
256
+ if (rows.length > 1 &&
257
+ (error instanceof RpcBatchRefused ||
258
+ error instanceof RpcPayloadTooLarge ||
259
+ error instanceof RpcBatchLimit)) {
260
+ this.batchLimit =
261
+ error instanceof RpcBatchRefused
262
+ ? 1
263
+ : Math.min(this.batchLimit, Math.ceil(rows.length / 2));
264
+ const results = [];
265
+ let offset = 0;
266
+ while (offset < rows.length) {
267
+ const next = Math.min(rows.length, offset + this.batchLimit);
268
+ const chunk = rows.slice(offset, next);
269
+ offset = next;
270
+ results.push(...(await execute(chunk)));
271
+ }
272
+ return results;
273
+ }
274
+ return rows.map(() => ({ status: 'rejected', reason: error }));
275
+ }
276
+ };
277
+ try {
278
+ check(signal);
279
+ const batches = [];
280
+ for (let i = 0; i < snapshot.length; i += this.batchLimit)
281
+ batches.push(snapshot.slice(i, i + this.batchLimit));
282
+ let next = 0;
283
+ const results = new Array(batches.length);
284
+ const workers = Array.from({ length: Math.min(batches.length, this.options.maxConcurrency) }, async () => {
285
+ while (next < batches.length) {
286
+ const index = next++;
287
+ results[index] = await execute(batches[index]);
288
+ }
289
+ });
290
+ const work = Promise.all(workers).then(() => results.flat());
291
+ return await new Promise((resolve, reject) => {
292
+ const cancelled = () => reject(aborted(signal));
293
+ signal.addEventListener('abort', cancelled, { once: true });
294
+ work
295
+ .then(resolve, reject)
296
+ .finally(() => signal.removeEventListener('abort', cancelled));
297
+ });
298
+ }
299
+ finally {
300
+ clearTimeout(timer);
301
+ sources.forEach((source) => source.removeEventListener('abort', abort));
302
+ }
303
+ }
304
+ async read(method, params, options) {
305
+ const [result] = await this.readMany([{ method, params }], options);
306
+ if (result.status === 'rejected')
307
+ throw result.reason;
308
+ return result.value;
309
+ }
310
+ getChainId(options = {}) {
311
+ const timeout = boundedInteger(options.timeoutMs ?? this.options.timeoutMs, 30000, 'timeout');
312
+ const maxResponseBytes = boundedInteger(options.maxResponseBytes ?? this.options.maxResponseBytes, 8 * 1024 * 1024, 'response size');
313
+ if (options.signal?.aborted)
314
+ return Promise.reject(aborted(options.signal));
315
+ if (this.lifetime.signal.aborted)
316
+ return Promise.reject(aborted(this.lifetime.signal));
317
+ if (!options.fresh &&
318
+ this.chainCache &&
319
+ this.chainCache.expires > Date.now())
320
+ return Promise.resolve(this.chainCache.value);
321
+ if (options.fresh) {
322
+ this.chainRequest = undefined;
323
+ this.chainCache = undefined;
324
+ }
325
+ let request = !options.fresh && this.chainRequest?.maxResponseBytes === maxResponseBytes
326
+ ? this.chainRequest
327
+ : undefined;
328
+ if (!request) {
329
+ const controller = new AbortController();
330
+ const generation = ++this.chainGeneration;
331
+ // Each subscriber owns its deadline. A short first subscriber must not
332
+ // impose that deadline on later subscribers sharing the wire response.
333
+ const promise = this.read('eth_chainId', [], {
334
+ signal: controller.signal,
335
+ timeoutMs: 30000,
336
+ maxResponseBytes,
337
+ }).then((value) => {
338
+ if (typeof value !== 'string' ||
339
+ !/^0x(?:0|[1-9a-f][0-9a-f]*)$/i.test(value))
340
+ throw new rpc_transport_1.RpcResponseIntegrityError('Invalid chain ID', false);
341
+ if (generation === this.chainGeneration && !controller.signal.aborted)
342
+ this.chainCache = { value, expires: Date.now() + 30000 };
343
+ return value;
344
+ });
345
+ request = {
346
+ promise,
347
+ controller,
348
+ maxResponseBytes,
349
+ subscribers: 0,
350
+ settled: false,
351
+ };
352
+ const captured = request;
353
+ void promise
354
+ .finally(() => {
355
+ captured.settled = true;
356
+ if (this.chainRequest === captured)
357
+ this.chainRequest = undefined;
358
+ })
359
+ .catch(() => undefined);
360
+ if (!options.fresh)
361
+ this.chainRequest = request;
362
+ }
363
+ const subscribed = request;
364
+ subscribed.subscribers++;
365
+ return new Promise((resolve, reject) => {
366
+ let finished = false;
367
+ const finish = (error, value) => {
368
+ if (finished)
369
+ return;
370
+ finished = true;
371
+ clearTimeout(timer);
372
+ options.signal?.removeEventListener('abort', cancel);
373
+ subscribed.subscribers--;
374
+ if (!subscribed.subscribers && !subscribed.settled) {
375
+ if (this.chainRequest === subscribed)
376
+ this.chainRequest = undefined;
377
+ subscribed.controller.abort();
378
+ }
379
+ if (error !== undefined)
380
+ reject(error);
381
+ else
382
+ resolve(value);
383
+ };
384
+ const cancel = () => finish(aborted(options.signal));
385
+ options.signal?.addEventListener('abort', cancel, { once: true });
386
+ const timer = setTimeout(() => finish(Object.assign(new Error('RPC read deadline exceeded'), {
387
+ name: 'AbortError',
388
+ })), timeout);
389
+ subscribed.promise.then((value) => finish(undefined, value), (error) => finish(error));
390
+ });
391
+ }
392
+ }
393
+ exports.JsonRpcReadClient = JsonRpcReadClient;
394
+ //# sourceMappingURL=rpc-read-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-read-client.js","sourceRoot":"","sources":["../../src/rpc-read-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isReadOnlyRpcMethod = exports.RpcResponseIntegrityError = void 0;
4
+ exports.requestJsonRpc = requestJsonRpc;
5
+ // A stale response must never be interpreted as the result of another RPC.
6
+ // Keep the sentinel in the message for callers that serialize errors as text.
7
+ class RpcResponseIntegrityError extends Error {
8
+ constructor(message = 'JSON-RPC response does not match its request', retryable = true) {
9
+ super(`[SYSWEB3_RPC_RESPONSE_INVALID] ${message}`);
10
+ this.retryable = retryable;
11
+ this.code = 'SYSWEB3_RPC_RESPONSE_INVALID';
12
+ this.name = 'RpcResponseIntegrityError';
13
+ }
14
+ }
15
+ exports.RpcResponseIntegrityError = RpcResponseIntegrityError;
16
+ // Only these standard, side-effect-free reads may recover from a stale cache
17
+ // entry. Never infer retry eligibility from an RPC method prefix.
18
+ const RECOVERABLE_READ_METHODS = new Set([
19
+ 'eth_chainId',
20
+ 'net_version',
21
+ 'web3_clientVersion',
22
+ 'eth_blockNumber',
23
+ 'eth_syncing',
24
+ 'eth_getBalance',
25
+ 'eth_getTransactionCount',
26
+ 'eth_getCode',
27
+ 'eth_getStorageAt',
28
+ 'eth_getProof',
29
+ 'eth_call',
30
+ 'eth_estimateGas',
31
+ 'eth_createAccessList',
32
+ 'eth_gasPrice',
33
+ 'eth_maxPriorityFeePerGas',
34
+ 'eth_feeHistory',
35
+ 'eth_getBlockByNumber',
36
+ 'eth_getBlockByHash',
37
+ 'eth_getBlockTransactionCountByNumber',
38
+ 'eth_getBlockTransactionCountByHash',
39
+ 'eth_getTransactionByHash',
40
+ 'eth_getTransactionByBlockNumberAndIndex',
41
+ 'eth_getTransactionByBlockHashAndIndex',
42
+ 'eth_getTransactionReceipt',
43
+ 'eth_getLogs',
44
+ ]);
45
+ const isReadOnlyRpcMethod = (method) => RECOVERABLE_READ_METHODS.has(method);
46
+ exports.isReadOnlyRpcMethod = isReadOnlyRpcMethod;
47
+ let rpcRecoveryNonce = 0;
48
+ // Shared across provider instances and seeded anew on process restart. These
49
+ // numeric correlation IDs are not authorization tokens.
50
+ let nextRpcWireId = Math.floor(Math.random() * 2 ** 51);
51
+ const reserveRpcWireId = () => {
52
+ const id = ++nextRpcWireId;
53
+ if (!Number.isSafeInteger(id)) {
54
+ throw new RpcResponseIntegrityError('RPC request ID range exhausted', false);
55
+ }
56
+ return id;
57
+ };
58
+ const recoveryUrl = (original) => {
59
+ const url = new URL(original);
60
+ const token = `${Date.now()}-${++rpcRecoveryNonce}-${Math.random()
61
+ .toString(36)
62
+ .slice(2)}`;
63
+ // Append without reserializing existing query values (including auth data).
64
+ url.search += `${url.search ? '&' : '?'}sysweb3_rpc_request=${token}`;
65
+ return url.toString();
66
+ };
67
+ function validateRpcResponses(json, requests, batch) {
68
+ if (batch ? !Array.isArray(json) : Array.isArray(json)) {
69
+ throw new RpcResponseIntegrityError();
70
+ }
71
+ const responses = batch ? json : [json];
72
+ if (responses.length !== requests.length) {
73
+ throw new RpcResponseIntegrityError();
74
+ }
75
+ const expectedIds = new Set(requests.map((request) => request.id));
76
+ const byId = new Map();
77
+ for (const response of responses) {
78
+ if (!response ||
79
+ typeof response !== 'object' ||
80
+ Array.isArray(response) ||
81
+ typeof response.id !== 'number' ||
82
+ !expectedIds.has(response.id) ||
83
+ byId.has(response.id)) {
84
+ throw new RpcResponseIntegrityError();
85
+ }
86
+ const hasResult = Object.prototype.hasOwnProperty.call(response, 'result');
87
+ const hasError = Object.prototype.hasOwnProperty.call(response, 'error');
88
+ if (response.jsonrpc !== '2.0' ||
89
+ hasResult === hasError ||
90
+ (hasError &&
91
+ (!response.error ||
92
+ typeof response.error.message !== 'string' ||
93
+ !Number.isSafeInteger(response.error.code)))) {
94
+ throw new RpcResponseIntegrityError('Invalid JSON-RPC response envelope', false);
95
+ }
96
+ byId.set(response.id, response);
97
+ }
98
+ return requests.map((request) => byId.get(request.id));
99
+ }
100
+ /** Correlate exact wire responses and recover one stale read response. */
101
+ async function requestJsonRpc(url, inputs, batch, signal, transport, recoverResponse = true) {
102
+ const canRecover = recoverResponse &&
103
+ inputs.every(({ method }) => RECOVERABLE_READ_METHODS.has(method));
104
+ const serialized = JSON.stringify(inputs);
105
+ for (let attempt = 0; attempt < 2; attempt++) {
106
+ if (signal.aborted)
107
+ throw signal.reason || new Error('RPC request aborted');
108
+ const source = JSON.parse(serialized);
109
+ const requests = source.map(({ method, params }) => ({
110
+ jsonrpc: '2.0',
111
+ method,
112
+ params,
113
+ id: reserveRpcWireId(),
114
+ }));
115
+ const json = await transport(attempt === 0 ? url : recoveryUrl(url), JSON.stringify(batch ? requests : requests[0]), signal).catch((error) => {
116
+ if (attempt === 0 ||
117
+ error instanceof RpcResponseIntegrityError ||
118
+ signal.aborted ||
119
+ error?.name === 'AbortError')
120
+ throw error;
121
+ throw new RpcResponseIntegrityError('JSON-RPC response recovery failed', false);
122
+ });
123
+ try {
124
+ return validateRpcResponses(json, requests, batch);
125
+ }
126
+ catch (error) {
127
+ if (!(error instanceof RpcResponseIntegrityError) ||
128
+ !error.retryable ||
129
+ attempt !== 0 ||
130
+ !canRecover)
131
+ throw error;
132
+ }
133
+ }
134
+ throw new RpcResponseIntegrityError();
135
+ }
136
+ //# sourceMappingURL=rpc-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-transport.js","sourceRoot":"","sources":["../../src/rpc-transport.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,7 @@ const excluded_utxos_1 = require("../utils/excluded-utxos");
46
46
  const owned_blockbook_account_1 = require("../utils/owned-blockbook-account");
47
47
  const psbt_1 = require("../utils/psbt");
48
48
  const psbt_account_scope_1 = require("../utils/psbt-account-scope");
49
+ const utxo_fee_rate_1 = require("../utils/utxo-fee-rate");
49
50
  const createHardwareSignerUnavailableError = (hardware) => Object.assign(new Error(`${hardware} signer is unavailable in this host`), {
50
51
  code: 'HARDWARE_SIGNER_UNAVAILABLE',
51
52
  });
@@ -641,7 +642,7 @@ class SyscoinTransactionsCore {
641
642
  // Blockbook returns coins per kB; after division by 1024, some testnets
642
643
  // can yield < 1 sat/vB (e.g., 0.9765625). Round up and clamp to 1 to
643
644
  // avoid zero-fee transactions due to truncation when converting to BN.
644
- const satPerByte = Math.max(1, Math.ceil(actualFeeRate * 1e8));
645
+ const satPerByte = (0, utxo_fee_rate_1.utxoFeeRateUnits)(actualFeeRate);
645
646
  const feeRateBN = new syscoinjs.utils.BN(satPerByte);
646
647
  // Step 2: Create unsigned PSBT
647
648
  const result = await this.createUnsignedPSBT({