@shogun-sdk/swap 0.0.2-test.36 → 0.0.2-test.38

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/core.cjs CHANGED
@@ -974,18 +974,42 @@ async function getOrders({
974
974
  evmAddress,
975
975
  solAddress
976
976
  }) {
977
- if (!evmAddress && !solAddress) {
977
+ const wallets = [evmAddress, solAddress].filter(
978
+ (wallet) => Boolean(wallet)
979
+ );
980
+ if (wallets.length === 0) {
978
981
  throw new Error("At least one wallet address (EVM, Solana) must be provided.");
979
982
  }
980
- const orders = await (0, import_intents_sdk13.fetchUserOrders)(evmAddress, solAddress);
981
- return orders;
983
+ const results = await Promise.all(
984
+ wallets.map((wallet) => (0, import_intents_sdk13.fetchUserOrders)({ wallet }))
985
+ );
986
+ return results.reduce(
987
+ (merged, orders) => {
988
+ merged.singleChainLimitOrders.push(...orders.singleChainLimitOrders);
989
+ merged.crossChainLimitOrders.push(...orders.crossChainLimitOrders);
990
+ return merged;
991
+ },
992
+ { singleChainLimitOrders: [], crossChainLimitOrders: [] }
993
+ );
982
994
  }
983
995
 
984
996
  // src/core/orders/cancelOrder.ts
985
997
  var import_intents_sdk14 = require("@shogun-sdk/intents-sdk");
986
998
  var import_web32 = require("@solana/web3.js");
987
999
  var import_viem8 = require("viem");
988
- async function cancelIntentsOrder({
1000
+ var inFlightCancels = /* @__PURE__ */ new Map();
1001
+ function cancelIntentsOrder(args) {
1002
+ const srcChain = "srcChainId" in args.order ? args.order.srcChainId : args.order.chainId;
1003
+ const key = `${srcChain}:${args.order.orderId}`;
1004
+ const existing = inFlightCancels.get(key);
1005
+ if (existing) return existing;
1006
+ const pending = performCancel(args).finally(() => {
1007
+ inFlightCancels.delete(key);
1008
+ });
1009
+ inFlightCancels.set(key, pending);
1010
+ return pending;
1011
+ }
1012
+ async function performCancel({
989
1013
  order,
990
1014
  wallet,
991
1015
  sol_rpc
package/dist/core.js CHANGED
@@ -954,11 +954,23 @@ async function getOrders({
954
954
  evmAddress,
955
955
  solAddress
956
956
  }) {
957
- if (!evmAddress && !solAddress) {
957
+ const wallets = [evmAddress, solAddress].filter(
958
+ (wallet) => Boolean(wallet)
959
+ );
960
+ if (wallets.length === 0) {
958
961
  throw new Error("At least one wallet address (EVM, Solana) must be provided.");
959
962
  }
960
- const orders = await fetchUserOrders(evmAddress, solAddress);
961
- return orders;
963
+ const results = await Promise.all(
964
+ wallets.map((wallet) => fetchUserOrders({ wallet }))
965
+ );
966
+ return results.reduce(
967
+ (merged, orders) => {
968
+ merged.singleChainLimitOrders.push(...orders.singleChainLimitOrders);
969
+ merged.crossChainLimitOrders.push(...orders.crossChainLimitOrders);
970
+ return merged;
971
+ },
972
+ { singleChainLimitOrders: [], crossChainLimitOrders: [] }
973
+ );
962
974
  }
963
975
 
964
976
  // src/core/orders/cancelOrder.ts
@@ -975,7 +987,19 @@ import {
975
987
  VersionedTransaction as VersionedTransaction2
976
988
  } from "@solana/web3.js";
977
989
  import { encodeFunctionData as encodeFunctionData3 } from "viem";
978
- async function cancelIntentsOrder({
990
+ var inFlightCancels = /* @__PURE__ */ new Map();
991
+ function cancelIntentsOrder(args) {
992
+ const srcChain = "srcChainId" in args.order ? args.order.srcChainId : args.order.chainId;
993
+ const key = `${srcChain}:${args.order.orderId}`;
994
+ const existing = inFlightCancels.get(key);
995
+ if (existing) return existing;
996
+ const pending = performCancel(args).finally(() => {
997
+ inFlightCancels.delete(key);
998
+ });
999
+ inFlightCancels.set(key, pending);
1000
+ return pending;
1001
+ }
1002
+ async function performCancel({
979
1003
  order,
980
1004
  wallet,
981
1005
  sol_rpc
package/dist/index.cjs CHANGED
@@ -974,18 +974,42 @@ async function getOrders({
974
974
  evmAddress,
975
975
  solAddress
976
976
  }) {
977
- if (!evmAddress && !solAddress) {
977
+ const wallets = [evmAddress, solAddress].filter(
978
+ (wallet) => Boolean(wallet)
979
+ );
980
+ if (wallets.length === 0) {
978
981
  throw new Error("At least one wallet address (EVM, Solana) must be provided.");
979
982
  }
980
- const orders = await (0, import_intents_sdk13.fetchUserOrders)(evmAddress, solAddress);
981
- return orders;
983
+ const results = await Promise.all(
984
+ wallets.map((wallet) => (0, import_intents_sdk13.fetchUserOrders)({ wallet }))
985
+ );
986
+ return results.reduce(
987
+ (merged, orders) => {
988
+ merged.singleChainLimitOrders.push(...orders.singleChainLimitOrders);
989
+ merged.crossChainLimitOrders.push(...orders.crossChainLimitOrders);
990
+ return merged;
991
+ },
992
+ { singleChainLimitOrders: [], crossChainLimitOrders: [] }
993
+ );
982
994
  }
983
995
 
984
996
  // src/core/orders/cancelOrder.ts
985
997
  var import_intents_sdk14 = require("@shogun-sdk/intents-sdk");
986
998
  var import_web32 = require("@solana/web3.js");
987
999
  var import_viem8 = require("viem");
988
- async function cancelIntentsOrder({
1000
+ var inFlightCancels = /* @__PURE__ */ new Map();
1001
+ function cancelIntentsOrder(args) {
1002
+ const srcChain = "srcChainId" in args.order ? args.order.srcChainId : args.order.chainId;
1003
+ const key = `${srcChain}:${args.order.orderId}`;
1004
+ const existing = inFlightCancels.get(key);
1005
+ if (existing) return existing;
1006
+ const pending = performCancel(args).finally(() => {
1007
+ inFlightCancels.delete(key);
1008
+ });
1009
+ inFlightCancels.set(key, pending);
1010
+ return pending;
1011
+ }
1012
+ async function performCancel({
989
1013
  order,
990
1014
  wallet,
991
1015
  sol_rpc
package/dist/index.js CHANGED
@@ -954,11 +954,23 @@ async function getOrders({
954
954
  evmAddress,
955
955
  solAddress
956
956
  }) {
957
- if (!evmAddress && !solAddress) {
957
+ const wallets = [evmAddress, solAddress].filter(
958
+ (wallet) => Boolean(wallet)
959
+ );
960
+ if (wallets.length === 0) {
958
961
  throw new Error("At least one wallet address (EVM, Solana) must be provided.");
959
962
  }
960
- const orders = await fetchUserOrders(evmAddress, solAddress);
961
- return orders;
963
+ const results = await Promise.all(
964
+ wallets.map((wallet) => fetchUserOrders({ wallet }))
965
+ );
966
+ return results.reduce(
967
+ (merged, orders) => {
968
+ merged.singleChainLimitOrders.push(...orders.singleChainLimitOrders);
969
+ merged.crossChainLimitOrders.push(...orders.crossChainLimitOrders);
970
+ return merged;
971
+ },
972
+ { singleChainLimitOrders: [], crossChainLimitOrders: [] }
973
+ );
962
974
  }
963
975
 
964
976
  // src/core/orders/cancelOrder.ts
@@ -975,7 +987,19 @@ import {
975
987
  VersionedTransaction as VersionedTransaction2
976
988
  } from "@solana/web3.js";
977
989
  import { encodeFunctionData as encodeFunctionData3 } from "viem";
978
- async function cancelIntentsOrder({
990
+ var inFlightCancels = /* @__PURE__ */ new Map();
991
+ function cancelIntentsOrder(args) {
992
+ const srcChain = "srcChainId" in args.order ? args.order.srcChainId : args.order.chainId;
993
+ const key = `${srcChain}:${args.order.orderId}`;
994
+ const existing = inFlightCancels.get(key);
995
+ if (existing) return existing;
996
+ const pending = performCancel(args).finally(() => {
997
+ inFlightCancels.delete(key);
998
+ });
999
+ inFlightCancels.set(key, pending);
1000
+ return pending;
1001
+ }
1002
+ async function performCancel({
979
1003
  order,
980
1004
  wallet,
981
1005
  sol_rpc
package/dist/react.cjs CHANGED
@@ -995,18 +995,42 @@ async function getOrders({
995
995
  evmAddress,
996
996
  solAddress
997
997
  }) {
998
- if (!evmAddress && !solAddress) {
998
+ const wallets = [evmAddress, solAddress].filter(
999
+ (wallet) => Boolean(wallet)
1000
+ );
1001
+ if (wallets.length === 0) {
999
1002
  throw new Error("At least one wallet address (EVM, Solana) must be provided.");
1000
1003
  }
1001
- const orders = await (0, import_intents_sdk13.fetchUserOrders)(evmAddress, solAddress);
1002
- return orders;
1004
+ const results = await Promise.all(
1005
+ wallets.map((wallet) => (0, import_intents_sdk13.fetchUserOrders)({ wallet }))
1006
+ );
1007
+ return results.reduce(
1008
+ (merged, orders) => {
1009
+ merged.singleChainLimitOrders.push(...orders.singleChainLimitOrders);
1010
+ merged.crossChainLimitOrders.push(...orders.crossChainLimitOrders);
1011
+ return merged;
1012
+ },
1013
+ { singleChainLimitOrders: [], crossChainLimitOrders: [] }
1014
+ );
1003
1015
  }
1004
1016
 
1005
1017
  // src/core/orders/cancelOrder.ts
1006
1018
  var import_intents_sdk14 = require("@shogun-sdk/intents-sdk");
1007
1019
  var import_web32 = require("@solana/web3.js");
1008
1020
  var import_viem8 = require("viem");
1009
- async function cancelIntentsOrder({
1021
+ var inFlightCancels = /* @__PURE__ */ new Map();
1022
+ function cancelIntentsOrder(args) {
1023
+ const srcChain = "srcChainId" in args.order ? args.order.srcChainId : args.order.chainId;
1024
+ const key = `${srcChain}:${args.order.orderId}`;
1025
+ const existing = inFlightCancels.get(key);
1026
+ if (existing) return existing;
1027
+ const pending = performCancel(args).finally(() => {
1028
+ inFlightCancels.delete(key);
1029
+ });
1030
+ inFlightCancels.set(key, pending);
1031
+ return pending;
1032
+ }
1033
+ async function performCancel({
1010
1034
  order,
1011
1035
  wallet,
1012
1036
  sol_rpc
@@ -1566,6 +1590,7 @@ var BALANCE_KEY = "balances-global";
1566
1590
  function useBalances(initialParams, options) {
1567
1591
  const sdk = useSwap();
1568
1592
  const abortRef = (0, import_react3.useRef)(null);
1593
+ const lastDataRef = (0, import_react3.useRef)(null);
1569
1594
  const paramsRef = globalThis.__BALANCES_PARAMS_REF__ ?? (globalThis.__BALANCES_PARAMS_REF__ = { current: initialParams ?? null });
1570
1595
  const fetcher = (0, import_react3.useCallback)(async () => {
1571
1596
  const activeParams = paramsRef.current;
@@ -1574,9 +1599,11 @@ function useBalances(initialParams, options) {
1574
1599
  const controller = new AbortController();
1575
1600
  abortRef.current = controller;
1576
1601
  try {
1577
- return await sdk.getBalances(activeParams, { signal: controller.signal });
1602
+ const balances = await sdk.getBalances(activeParams, { signal: controller.signal });
1603
+ lastDataRef.current = balances;
1604
+ return balances;
1578
1605
  } catch (err) {
1579
- if (err instanceof DOMException && err.name === "AbortError") return null;
1606
+ if (err instanceof DOMException && err.name === "AbortError") return lastDataRef.current;
1580
1607
  if (err instanceof Error) throw err;
1581
1608
  throw new Error(String(err));
1582
1609
  }
@@ -1584,7 +1611,10 @@ function useBalances(initialParams, options) {
1584
1611
  const {
1585
1612
  data,
1586
1613
  error,
1587
- isValidating: loading,
1614
+ // `isLoading` is only true on the initial fetch (no data yet), so background
1615
+ // refreshes on `refreshInterval` don't toggle it and flicker the UI.
1616
+ isLoading: loading,
1617
+ isValidating,
1588
1618
  mutate: mutateBalances
1589
1619
  } = (0, import_swr2.default)(BALANCE_KEY, fetcher, {
1590
1620
  revalidateOnFocus: false,
@@ -1614,6 +1644,9 @@ function useBalances(initialParams, options) {
1614
1644
  () => ({
1615
1645
  data,
1616
1646
  loading,
1647
+ // True during background revalidation (e.g. `refreshInterval` polls) while
1648
+ // previous `data` stays visible — use for a subtle refresh indicator.
1649
+ isValidating,
1617
1650
  error: error instanceof Error ? error : null,
1618
1651
  refetch,
1619
1652
  setParams,
@@ -1621,7 +1654,7 @@ function useBalances(initialParams, options) {
1621
1654
  return paramsRef.current;
1622
1655
  }
1623
1656
  }),
1624
- [data, loading, error, refetch, setParams, paramsRef]
1657
+ [data, loading, isValidating, error, refetch, setParams, paramsRef]
1625
1658
  );
1626
1659
  }
1627
1660
 
package/dist/react.d.cts CHANGED
@@ -202,6 +202,7 @@ declare function useBalances(initialParams?: BalanceRequestParams | null, option
202
202
  }): {
203
203
  data: BalanceResponse | null | undefined;
204
204
  loading: boolean;
205
+ isValidating: boolean;
205
206
  error: Error | null;
206
207
  refetch: () => Promise<void>;
207
208
  setParams: (next: BalanceRequestParams | null) => void;
package/dist/react.d.ts CHANGED
@@ -202,6 +202,7 @@ declare function useBalances(initialParams?: BalanceRequestParams | null, option
202
202
  }): {
203
203
  data: BalanceResponse | null | undefined;
204
204
  loading: boolean;
205
+ isValidating: boolean;
205
206
  error: Error | null;
206
207
  refetch: () => Promise<void>;
207
208
  setParams: (next: BalanceRequestParams | null) => void;
package/dist/react.js CHANGED
@@ -957,11 +957,23 @@ async function getOrders({
957
957
  evmAddress,
958
958
  solAddress
959
959
  }) {
960
- if (!evmAddress && !solAddress) {
960
+ const wallets = [evmAddress, solAddress].filter(
961
+ (wallet) => Boolean(wallet)
962
+ );
963
+ if (wallets.length === 0) {
961
964
  throw new Error("At least one wallet address (EVM, Solana) must be provided.");
962
965
  }
963
- const orders = await fetchUserOrders(evmAddress, solAddress);
964
- return orders;
966
+ const results = await Promise.all(
967
+ wallets.map((wallet) => fetchUserOrders({ wallet }))
968
+ );
969
+ return results.reduce(
970
+ (merged, orders) => {
971
+ merged.singleChainLimitOrders.push(...orders.singleChainLimitOrders);
972
+ merged.crossChainLimitOrders.push(...orders.crossChainLimitOrders);
973
+ return merged;
974
+ },
975
+ { singleChainLimitOrders: [], crossChainLimitOrders: [] }
976
+ );
965
977
  }
966
978
 
967
979
  // src/core/orders/cancelOrder.ts
@@ -978,7 +990,19 @@ import {
978
990
  VersionedTransaction as VersionedTransaction2
979
991
  } from "@solana/web3.js";
980
992
  import { encodeFunctionData as encodeFunctionData3 } from "viem";
981
- async function cancelIntentsOrder({
993
+ var inFlightCancels = /* @__PURE__ */ new Map();
994
+ function cancelIntentsOrder(args) {
995
+ const srcChain = "srcChainId" in args.order ? args.order.srcChainId : args.order.chainId;
996
+ const key = `${srcChain}:${args.order.orderId}`;
997
+ const existing = inFlightCancels.get(key);
998
+ if (existing) return existing;
999
+ const pending = performCancel(args).finally(() => {
1000
+ inFlightCancels.delete(key);
1001
+ });
1002
+ inFlightCancels.set(key, pending);
1003
+ return pending;
1004
+ }
1005
+ async function performCancel({
982
1006
  order,
983
1007
  wallet,
984
1008
  sol_rpc
@@ -1538,6 +1562,7 @@ var BALANCE_KEY = "balances-global";
1538
1562
  function useBalances(initialParams, options) {
1539
1563
  const sdk = useSwap();
1540
1564
  const abortRef = useRef2(null);
1565
+ const lastDataRef = useRef2(null);
1541
1566
  const paramsRef = globalThis.__BALANCES_PARAMS_REF__ ?? (globalThis.__BALANCES_PARAMS_REF__ = { current: initialParams ?? null });
1542
1567
  const fetcher = useCallback2(async () => {
1543
1568
  const activeParams = paramsRef.current;
@@ -1546,9 +1571,11 @@ function useBalances(initialParams, options) {
1546
1571
  const controller = new AbortController();
1547
1572
  abortRef.current = controller;
1548
1573
  try {
1549
- return await sdk.getBalances(activeParams, { signal: controller.signal });
1574
+ const balances = await sdk.getBalances(activeParams, { signal: controller.signal });
1575
+ lastDataRef.current = balances;
1576
+ return balances;
1550
1577
  } catch (err) {
1551
- if (err instanceof DOMException && err.name === "AbortError") return null;
1578
+ if (err instanceof DOMException && err.name === "AbortError") return lastDataRef.current;
1552
1579
  if (err instanceof Error) throw err;
1553
1580
  throw new Error(String(err));
1554
1581
  }
@@ -1556,7 +1583,10 @@ function useBalances(initialParams, options) {
1556
1583
  const {
1557
1584
  data,
1558
1585
  error,
1559
- isValidating: loading,
1586
+ // `isLoading` is only true on the initial fetch (no data yet), so background
1587
+ // refreshes on `refreshInterval` don't toggle it and flicker the UI.
1588
+ isLoading: loading,
1589
+ isValidating,
1560
1590
  mutate: mutateBalances
1561
1591
  } = useSWR2(BALANCE_KEY, fetcher, {
1562
1592
  revalidateOnFocus: false,
@@ -1586,6 +1616,9 @@ function useBalances(initialParams, options) {
1586
1616
  () => ({
1587
1617
  data,
1588
1618
  loading,
1619
+ // True during background revalidation (e.g. `refreshInterval` polls) while
1620
+ // previous `data` stays visible — use for a subtle refresh indicator.
1621
+ isValidating,
1589
1622
  error: error instanceof Error ? error : null,
1590
1623
  refetch,
1591
1624
  setParams,
@@ -1593,7 +1626,7 @@ function useBalances(initialParams, options) {
1593
1626
  return paramsRef.current;
1594
1627
  }
1595
1628
  }),
1596
- [data, loading, error, refetch, setParams, paramsRef]
1629
+ [data, loading, isValidating, error, refetch, setParams, paramsRef]
1597
1630
  );
1598
1631
  }
1599
1632
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shogun-sdk/swap",
3
- "version": "0.0.2-test.36",
3
+ "version": "0.0.2-test.38",
4
4
  "type": "module",
5
5
  "description": "Shogun Network Swap utilities and helpers",
6
6
  "author": "Shogun Network",
@@ -45,7 +45,7 @@
45
45
  "sideEffects": false,
46
46
  "dependencies": {
47
47
  "@solana/web3.js": "^1.98.4",
48
- "@shogun-sdk/intents-sdk": "1.4.0"
48
+ "@shogun-sdk/intents-sdk": "1.4.1"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@ethersproject/abstract-signer": "^5.7.0",