@satoshai/kit 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -317,6 +317,29 @@ All 6 wallets work with both headless (`connect('xverse')`) and modal (`connect(
317
317
  | WalletConnect | `wallet-connect` |
318
318
  | OKX | `okx` |
319
319
 
320
+ ### Wallet Support Matrix
321
+
322
+ | Hook | Xverse | Leather | Asigna | Fordefi | WalletConnect | OKX |
323
+ |------|--------|---------|--------|---------|---------------|-----|
324
+ | `useConnect` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
325
+ | `useSignMessage` | ✓ | ✓ | ? | ? | ~ | ✓ |
326
+ | `useSignStructuredMessage` | ✓ | ✓ | ? | ? | ~ | ✗ |
327
+ | `useSignTransaction` | ✓ | ✓ | ? | ? | ~ | ✗ |
328
+ | `useWriteContract` | ✓ | ✓ | ✓ | ✓ | ~ | ✓ |
329
+ | `useTransferSTX` | ✓ | ✓ | ✓ | ✓ | ~ | ✓ |
330
+
331
+ ✓ Confirmed supported | ✗ Unsupported (throws error) | ? Unverified | ~ Depends on the connected wallet
332
+
333
+ **Notes:**
334
+
335
+ - **OKX** uses a proprietary API (`window.okxwallet.stacks`) instead of the standard `@stacks/connect` RPC. `useSignStructuredMessage` and `useSignTransaction` are explicitly unsupported and will throw.
336
+ - **Asigna** is a multisig wallet. Transaction-based hooks (`useWriteContract`, `useTransferSTX`) work, but message signing hooks may be limited since there is no multisig message signature standard on Stacks.
337
+ - **Fordefi** supports transactions and contract calls on Stacks, but their [supported blockchains](https://docs.fordefi.com/docs/supported-blockchains) page does not list Stacks under message signing capabilities.
338
+ - **WalletConnect** is a relay protocol — all methods are forwarded, but actual support depends on the wallet on the other end.
339
+ - **Xverse** and **Leather** implement the full [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) interface.
340
+
341
+ This matrix was compiled from wallet documentation as of March 2026. Sources: [Xverse Sats Connect docs](https://docs.xverse.app/sats-connect/stacks-methods), [Leather developer docs](https://leather.gitbook.io/developers), [Asigna docs](https://asigna.gitbook.io/asigna), [Fordefi docs](https://docs.fordefi.com/docs/supported-blockchains), [@stacks/connect WalletConnect source](https://github.com/stx-labs/connect/tree/main/packages/connect/src/walletconnect).
342
+
320
343
  ## Peer Dependencies
321
344
 
322
345
  - `react` ^18 or ^19
package/dist/index.cjs CHANGED
@@ -6,6 +6,69 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var transactions = require('@stacks/transactions');
7
7
  var bnsV2Sdk = require('bns-v2-sdk');
8
8
 
9
+ // src/errors.ts
10
+ var BaseError = class extends Error {
11
+ name = "StacksKitError";
12
+ shortMessage;
13
+ constructor(shortMessage, options) {
14
+ const message = [
15
+ shortMessage,
16
+ options?.details && `Details: ${options.details}`
17
+ ].filter(Boolean).join("\n\n");
18
+ super(message, options?.cause ? { cause: options.cause } : void 0);
19
+ this.shortMessage = shortMessage;
20
+ }
21
+ walk(fn) {
22
+ return walk(this, fn);
23
+ }
24
+ };
25
+ function walk(err, fn) {
26
+ if (fn?.(err)) return err;
27
+ if (err && typeof err === "object" && "cause" in err) {
28
+ return walk(err.cause, fn);
29
+ }
30
+ return err;
31
+ }
32
+ var WalletNotConnectedError = class extends BaseError {
33
+ name = "WalletNotConnectedError";
34
+ constructor() {
35
+ super("Wallet is not connected");
36
+ }
37
+ };
38
+ var WalletNotFoundError = class extends BaseError {
39
+ name = "WalletNotFoundError";
40
+ wallet;
41
+ constructor({ wallet }) {
42
+ super(`${wallet} wallet not found`, {
43
+ details: "The wallet extension may not be installed."
44
+ });
45
+ this.wallet = wallet;
46
+ }
47
+ };
48
+ var UnsupportedMethodError = class extends BaseError {
49
+ name = "UnsupportedMethodError";
50
+ method;
51
+ wallet;
52
+ constructor({ method, wallet }) {
53
+ super(`${method} is not supported by ${wallet} wallet`);
54
+ this.method = method;
55
+ this.wallet = wallet;
56
+ }
57
+ };
58
+ var WalletRequestError = class extends BaseError {
59
+ name = "WalletRequestError";
60
+ method;
61
+ wallet;
62
+ constructor({ method, wallet, cause }) {
63
+ super(`${wallet} wallet request failed`, {
64
+ cause,
65
+ details: cause.message
66
+ });
67
+ this.method = method;
68
+ this.wallet = wallet;
69
+ }
70
+ };
71
+
9
72
  // src/constants/stacks-provider-mapping.ts
10
73
  var STACKS_TO_STACKS_CONNECT_PROVIDERS = {
11
74
  xverse: "XverseProviders.BitcoinProvider",
@@ -685,7 +748,7 @@ var useSignMessage = () => {
685
748
  const signMessageAsync = react.useCallback(
686
749
  async (variables) => {
687
750
  if (!isConnected) {
688
- throw new Error("Wallet is not connected");
751
+ throw new WalletNotConnectedError();
689
752
  }
690
753
  setStatus("pending");
691
754
  setError(null);
@@ -694,7 +757,7 @@ var useSignMessage = () => {
694
757
  let result;
695
758
  if (provider === "okx") {
696
759
  if (!window.okxwallet) {
697
- throw new Error("OKX wallet not found");
760
+ throw new WalletNotFoundError({ wallet: "OKX" });
698
761
  }
699
762
  result = await window.okxwallet.stacks.signMessage({
700
763
  message: variables.message
@@ -711,7 +774,11 @@ var useSignMessage = () => {
711
774
  setStatus("success");
712
775
  return result;
713
776
  } catch (err) {
714
- const error2 = err instanceof Error ? err : new Error(String(err));
777
+ const error2 = err instanceof BaseError ? err : new WalletRequestError({
778
+ method: "stx_signMessage",
779
+ wallet: provider ?? "unknown",
780
+ cause: err instanceof Error ? err : new Error(String(err))
781
+ });
715
782
  setError(error2);
716
783
  setStatus("error");
717
784
  throw error2;
@@ -762,12 +829,13 @@ var useSignStructuredMessage = () => {
762
829
  const signStructuredMessageAsync = react.useCallback(
763
830
  async (variables) => {
764
831
  if (!isConnected) {
765
- throw new Error("Wallet is not connected");
832
+ throw new WalletNotConnectedError();
766
833
  }
767
834
  if (provider === "okx") {
768
- throw new Error(
769
- "Structured message signing is not supported by OKX wallet"
770
- );
835
+ throw new UnsupportedMethodError({
836
+ method: "stx_signStructuredMessage",
837
+ wallet: "OKX"
838
+ });
771
839
  }
772
840
  setStatus("pending");
773
841
  setError(null);
@@ -781,7 +849,11 @@ var useSignStructuredMessage = () => {
781
849
  setStatus("success");
782
850
  return result;
783
851
  } catch (err) {
784
- const error2 = err instanceof Error ? err : new Error(String(err));
852
+ const error2 = err instanceof BaseError ? err : new WalletRequestError({
853
+ method: "stx_signStructuredMessage",
854
+ wallet: provider ?? "unknown",
855
+ cause: err instanceof Error ? err : new Error(String(err))
856
+ });
785
857
  setError(error2);
786
858
  setStatus("error");
787
859
  throw error2;
@@ -837,12 +909,13 @@ var useSignTransaction = () => {
837
909
  const signTransactionAsync = react.useCallback(
838
910
  async (variables) => {
839
911
  if (!isConnected) {
840
- throw new Error("Wallet is not connected");
912
+ throw new WalletNotConnectedError();
841
913
  }
842
914
  if (provider === "okx") {
843
- throw new Error(
844
- "Transaction signing is not supported by OKX wallet"
845
- );
915
+ throw new UnsupportedMethodError({
916
+ method: "stx_signTransaction",
917
+ wallet: "OKX"
918
+ });
846
919
  }
847
920
  setStatus("pending");
848
921
  setError(null);
@@ -858,7 +931,11 @@ var useSignTransaction = () => {
858
931
  setStatus("success");
859
932
  return result;
860
933
  } catch (err) {
861
- const error2 = err instanceof Error ? err : new Error(String(err));
934
+ const error2 = err instanceof BaseError ? err : new WalletRequestError({
935
+ method: "stx_signTransaction",
936
+ wallet: provider ?? "unknown",
937
+ cause: err instanceof Error ? err : new Error(String(err))
938
+ });
862
939
  setError(error2);
863
940
  setStatus("error");
864
941
  throw error2;
@@ -920,7 +997,7 @@ var useTransferSTX = () => {
920
997
  const transferSTXAsync = react.useCallback(
921
998
  async (variables) => {
922
999
  if (!isConnected || !address) {
923
- throw new Error("Wallet is not connected");
1000
+ throw new WalletNotConnectedError();
924
1001
  }
925
1002
  setStatus("pending");
926
1003
  setError(null);
@@ -928,7 +1005,7 @@ var useTransferSTX = () => {
928
1005
  try {
929
1006
  if (provider === "okx") {
930
1007
  if (!window.okxwallet) {
931
- throw new Error("OKX wallet not found");
1008
+ throw new WalletNotFoundError({ wallet: "OKX" });
932
1009
  }
933
1010
  const response2 = await window.okxwallet.stacks.signTransaction({
934
1011
  txType: "token_transfer",
@@ -963,7 +1040,11 @@ var useTransferSTX = () => {
963
1040
  setStatus("success");
964
1041
  return response.txid;
965
1042
  } catch (err) {
966
- const error2 = err instanceof Error ? err : new Error(String(err));
1043
+ const error2 = err instanceof BaseError ? err : new WalletRequestError({
1044
+ method: "stx_transferStx",
1045
+ wallet: provider ?? "unknown",
1046
+ cause: err instanceof Error ? err : new Error(String(err))
1047
+ });
967
1048
  setError(error2);
968
1049
  setStatus("error");
969
1050
  throw error2;
@@ -1151,7 +1232,7 @@ var useWriteContract = () => {
1151
1232
  const writeContractAsync = react.useCallback(
1152
1233
  async (variables) => {
1153
1234
  if (!isConnected || !address) {
1154
- throw new Error("Wallet is not connected");
1235
+ throw new WalletNotConnectedError();
1155
1236
  }
1156
1237
  setStatus("pending");
1157
1238
  setError(null);
@@ -1160,7 +1241,7 @@ var useWriteContract = () => {
1160
1241
  try {
1161
1242
  if (provider === "okx") {
1162
1243
  if (!window.okxwallet) {
1163
- throw new Error("OKX wallet not found");
1244
+ throw new WalletNotFoundError({ wallet: "OKX" });
1164
1245
  }
1165
1246
  const response2 = await window.okxwallet.stacks.signTransaction({
1166
1247
  contractAddress: variables.address,
@@ -1195,7 +1276,11 @@ var useWriteContract = () => {
1195
1276
  setStatus("success");
1196
1277
  return response.txid;
1197
1278
  } catch (err) {
1198
- const error2 = err instanceof Error ? err : new Error(String(err));
1279
+ const error2 = err instanceof BaseError ? err : new WalletRequestError({
1280
+ method: "stx_callContract",
1281
+ wallet: provider ?? "unknown",
1282
+ cause: err instanceof Error ? err : new Error(String(err))
1283
+ });
1199
1284
  setError(error2);
1200
1285
  setStatus("error");
1201
1286
  throw error2;
@@ -1280,8 +1365,13 @@ function createContractConfig(config) {
1280
1365
  return config;
1281
1366
  }
1282
1367
 
1368
+ exports.BaseError = BaseError;
1283
1369
  exports.SUPPORTED_STACKS_WALLETS = SUPPORTED_STACKS_WALLETS;
1284
1370
  exports.StacksWalletProvider = StacksWalletProvider;
1371
+ exports.UnsupportedMethodError = UnsupportedMethodError;
1372
+ exports.WalletNotConnectedError = WalletNotConnectedError;
1373
+ exports.WalletNotFoundError = WalletNotFoundError;
1374
+ exports.WalletRequestError = WalletRequestError;
1285
1375
  exports.createContractConfig = createContractConfig;
1286
1376
  exports.getLocalStorageWallet = getLocalStorageWallet;
1287
1377
  exports.getNetworkFromAddress = getNetworkFromAddress;