@bze/bze-ui-kit 1.0.5 → 1.0.7

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.
package/dist/index.mjs CHANGED
@@ -303,6 +303,10 @@ var getChainExplorerURL = (chainName) => {
303
303
  var getLockerAddress = () => {
304
304
  return process.env.NEXT_PUBLIC_LOCKER_ADDRESS || "bze1pc5zjcvhx3e8l305zjl72grytfa30r5mdypmw4";
305
305
  };
306
+ var getGasMultiplier = () => {
307
+ const val = parseFloat(process.env.NEXT_PUBLIC_GAS_MULTIPLIER || "");
308
+ return isNaN(val) || val <= 0 ? 1.5 : val;
309
+ };
306
310
 
307
311
  // src/storage/storage.ts
308
312
  var TTL_NO_EXPIRY = 0;
@@ -1415,6 +1419,114 @@ var isPoolSupportedByValidator = (baseDenom, quoteDenom) => {
1415
1419
  return supportedDenoms.includes(baseDenom) || supportedDenoms.includes(quoteDenom);
1416
1420
  };
1417
1421
 
1422
+ // src/utils/ws_rpc_client.ts
1423
+ var socket = null;
1424
+ var activeUrl = "";
1425
+ var socketConnected = false;
1426
+ var connectingPromise = null;
1427
+ var msgId = 0;
1428
+ var reconnectAttempts = 0;
1429
+ var reconnectTimeout = null;
1430
+ var MAX_RECONNECT_ATTEMPTS = 10;
1431
+ var activeSubscriptions = /* @__PURE__ */ new Map();
1432
+ var handleMessage = (event) => {
1433
+ var _a2;
1434
+ try {
1435
+ const msg = JSON.parse(event.data);
1436
+ const id = String((_a2 = msg == null ? void 0 : msg.id) != null ? _a2 : "");
1437
+ if (id && activeSubscriptions.has(id) && msg.result && Object.keys(msg.result).length > 0) {
1438
+ activeSubscriptions.get(id).handler(msg.result);
1439
+ }
1440
+ } catch (e) {
1441
+ }
1442
+ };
1443
+ var resubscribeAll = () => {
1444
+ for (const [id, sub] of activeSubscriptions) {
1445
+ socket.send(JSON.stringify({
1446
+ jsonrpc: "2.0",
1447
+ method: "subscribe",
1448
+ id,
1449
+ params: { query: sub.query }
1450
+ }));
1451
+ }
1452
+ };
1453
+ var scheduleReconnect = () => {
1454
+ if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
1455
+ console.error("[WS] Max reconnect attempts reached");
1456
+ return;
1457
+ }
1458
+ reconnectAttempts++;
1459
+ const delay = Math.min(1e3 * Math.pow(2, reconnectAttempts - 1), 3e4);
1460
+ reconnectTimeout = setTimeout(async () => {
1461
+ try {
1462
+ await openSocket(activeUrl);
1463
+ resubscribeAll();
1464
+ reconnectAttempts = 0;
1465
+ } catch (e) {
1466
+ scheduleReconnect();
1467
+ }
1468
+ }, delay);
1469
+ };
1470
+ var openSocket = (url) => {
1471
+ return new Promise((resolve, reject) => {
1472
+ const ws = new WebSocket(url);
1473
+ ws.onopen = () => {
1474
+ socket = ws;
1475
+ socketConnected = true;
1476
+ resolve();
1477
+ };
1478
+ ws.onmessage = handleMessage;
1479
+ ws.onclose = () => {
1480
+ socketConnected = false;
1481
+ scheduleReconnect();
1482
+ };
1483
+ ws.onerror = (err) => {
1484
+ socketConnected = false;
1485
+ reject(err);
1486
+ };
1487
+ });
1488
+ };
1489
+ var getOrCreateSocket = async (rpcEndpoint) => {
1490
+ const url = rpcEndpoint.replace(/\/?$/, "") + "/websocket";
1491
+ if (socket && socketConnected && activeUrl === url) return;
1492
+ if (connectingPromise && activeUrl === url) {
1493
+ return connectingPromise;
1494
+ }
1495
+ if (socket) {
1496
+ socket.onclose = null;
1497
+ socket.close(1e3, "Endpoint changed");
1498
+ socket = null;
1499
+ socketConnected = false;
1500
+ if (reconnectTimeout) {
1501
+ clearTimeout(reconnectTimeout);
1502
+ reconnectTimeout = null;
1503
+ }
1504
+ reconnectAttempts = 0;
1505
+ }
1506
+ activeUrl = url;
1507
+ connectingPromise = openSocket(url).finally(() => {
1508
+ connectingPromise = null;
1509
+ });
1510
+ return connectingPromise;
1511
+ };
1512
+ var subscribeToBlockchainEvents = async (rpcEndpoint, query, handler) => {
1513
+ await getOrCreateSocket(rpcEndpoint);
1514
+ const id = String(++msgId);
1515
+ activeSubscriptions.set(id, { query, handler });
1516
+ socket.send(JSON.stringify({ jsonrpc: "2.0", method: "subscribe", id, params: { query } }));
1517
+ return () => {
1518
+ activeSubscriptions.delete(id);
1519
+ if ((socket == null ? void 0 : socket.readyState) === WebSocket.OPEN) {
1520
+ socket.send(JSON.stringify({
1521
+ jsonrpc: "2.0",
1522
+ method: "unsubscribe",
1523
+ id: String(++msgId),
1524
+ params: { query }
1525
+ }));
1526
+ }
1527
+ };
1528
+ };
1529
+
1418
1530
  // src/constants/market.ts
1419
1531
  var EXCLUDED_MARKETS = {
1420
1532
  "factory/bze1f0qgels0eu96ev6a67znu70q7rquy9eragn8nw/ucorey/factory/bze13gzq40che93tgfm9kzmkpjamah5nj0j73pyhqk/uvdl": true,
@@ -3913,8 +4025,7 @@ var useToast = () => {
3913
4025
  };
3914
4026
 
3915
4027
  // src/hooks/useTx.tsx
3916
- import { Tx, TxBody, AuthInfo, SignerInfo } from "@bze/bzejs/cosmos/tx/v1beta1/tx";
3917
- import { toBase64 } from "@interchainjs/encoding";
4028
+ import { TxBody, SignerInfo } from "@bze/bzejs/cosmos/tx/v1beta1/tx";
3918
4029
  import { useChain as useChain2 } from "@interchain-kit/react";
3919
4030
  import BigNumber13 from "bignumber.js";
3920
4031
  import { useCallback as useCallback11, useMemo as useMemo11, useState as useState3 } from "react";
@@ -3965,7 +4076,7 @@ var useTx = (chainName) => {
3965
4076
  return isSigningClientReady;
3966
4077
  }, [isSigningClientReady, signingClientError]);
3967
4078
  const simulateFee = useCallback11(async (messages, memo) => {
3968
- var _a2, _b2;
4079
+ var _a2;
3969
4080
  const gasPrice = 0.02;
3970
4081
  const nativeDenom = getChainNativeAssetDenom();
3971
4082
  const signer = signingClient;
@@ -3976,27 +4087,14 @@ var useTx = (chainName) => {
3976
4087
  return { typeUrl, value: encodedValue };
3977
4088
  });
3978
4089
  const txBody = TxBody.fromPartial({ messages: encodedMessages, memo: memo != null ? memo : "" });
3979
- const authInfo = AuthInfo.fromPartial({
3980
- signerInfos: [SignerInfo.fromPartial({ modeInfo: { single: { mode: 1 } }, sequence: BigInt(0) })],
3981
- fee: { amount: [], gasLimit: BigInt(0), payer: "", granter: "" }
3982
- });
3983
- const tx2 = Tx.fromPartial({ body: txBody, authInfo, signatures: [new Uint8Array(0)] });
3984
- const txBytes = Tx.encode(tx2).finish();
3985
- const restEndpoint = getSettings().endpoints.restEndpoint.replace(/\/$/, "");
3986
- const simResponse = await fetch(`${restEndpoint}/cosmos/tx/v1beta1/simulate`, {
3987
- method: "POST",
3988
- headers: { "Content-Type": "application/json" },
3989
- body: JSON.stringify({ tx_bytes: toBase64(txBytes) })
3990
- });
3991
- if (!simResponse.ok) {
3992
- throw new Error(`Simulation request failed with status ${simResponse.status}`);
3993
- }
3994
- const simData = await simResponse.json();
3995
- const gasEstimated = Number((_b2 = (_a2 = simData == null ? void 0 : simData.gas_info) == null ? void 0 : _a2.gas_used) != null ? _b2 : 0);
4090
+ const sequence = await signer.getSequence(address);
4091
+ const signerInfo = SignerInfo.fromPartial({ modeInfo: { single: { mode: 1 } }, sequence });
4092
+ const { gasInfo } = await signer.simulateByTxBody(txBody, [signerInfo]);
4093
+ const gasEstimated = Number((_a2 = gasInfo == null ? void 0 : gasInfo.gasUsed) != null ? _a2 : BigInt(0));
3996
4094
  if (gasEstimated === 0) {
3997
4095
  throw new Error("Gas simulation returned 0");
3998
4096
  }
3999
- const gasAmount = BigNumber13(gasEstimated).multipliedBy(1.5);
4097
+ const gasAmount = BigNumber13(gasEstimated).multipliedBy(getGasMultiplier());
4000
4098
  const gasPayment = gasAmount.multipliedBy(gasPrice);
4001
4099
  const nativeFee = {
4002
4100
  amount: coins(gasPayment.toFixed(0).toString(), nativeDenom),
@@ -5462,6 +5560,7 @@ export {
5462
5560
  shortNumberFormat,
5463
5561
  sleep,
5464
5562
  stringTruncateFromCenter,
5563
+ subscribeToBlockchainEvents,
5465
5564
  toBigNumber,
5466
5565
  toPercentage,
5467
5566
  truncateAddress,