@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 +23 -0
- package/dist/index.cjs +109 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +61 -6
- package/dist/index.d.ts +61 -6
- package/dist/index.js +105 -20
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
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
|
|
832
|
+
throw new WalletNotConnectedError();
|
|
766
833
|
}
|
|
767
834
|
if (provider === "okx") {
|
|
768
|
-
throw new
|
|
769
|
-
|
|
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
|
|
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
|
|
912
|
+
throw new WalletNotConnectedError();
|
|
841
913
|
}
|
|
842
914
|
if (provider === "okx") {
|
|
843
|
-
throw new
|
|
844
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|