@reclack/walletkit 0.0.0-stage → 0.1.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.
Files changed (170) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -2
  3. package/assets/backpack.webp +0 -0
  4. package/assets/berasig.webp +0 -0
  5. package/assets/bestwallet.webp +0 -0
  6. package/assets/bifrostwallet.webp +0 -0
  7. package/assets/binance.webp +0 -0
  8. package/assets/bitcoincom.webp +0 -0
  9. package/assets/bitget.webp +0 -0
  10. package/assets/bitpay.webp +0 -0
  11. package/assets/bitski.webp +0 -0
  12. package/assets/bitverse.webp +0 -0
  13. package/assets/blockchaincom.webp +0 -0
  14. package/assets/brave.webp +0 -0
  15. package/assets/bybit.webp +0 -0
  16. package/assets/clv.webp +0 -0
  17. package/assets/coin98.webp +0 -0
  18. package/assets/coinbase.webp +0 -0
  19. package/assets/compass.webp +0 -0
  20. package/assets/core.webp +0 -0
  21. package/assets/crypto_com.webp +0 -0
  22. package/assets/ctrl.webp +0 -0
  23. package/assets/dawn.webp +0 -0
  24. package/assets/desig.webp +0 -0
  25. package/assets/enkrypt.webp +0 -0
  26. package/assets/exodus.webp +0 -0
  27. package/assets/foxwallet.webp +0 -0
  28. package/assets/frame.webp +0 -0
  29. package/assets/frontier.webp +0 -0
  30. package/assets/gate.webp +0 -0
  31. package/assets/gemini.webp +0 -0
  32. package/assets/imtoken.webp +0 -0
  33. package/assets/iopay.webp +0 -0
  34. package/assets/kaia.webp +0 -0
  35. package/assets/kaikas.webp +0 -0
  36. package/assets/kraken.webp +0 -0
  37. package/assets/kresuswallet.webp +0 -0
  38. package/assets/ledger.webp +0 -0
  39. package/assets/magiceden.webp +0 -0
  40. package/assets/meco.webp +0 -0
  41. package/assets/metamask.webp +0 -0
  42. package/assets/mew.webp +0 -0
  43. package/assets/nest.webp +0 -0
  44. package/assets/nova.webp +0 -0
  45. package/assets/okto.webp +0 -0
  46. package/assets/okx.webp +0 -0
  47. package/assets/oneinch.webp +0 -0
  48. package/assets/onekey.webp +0 -0
  49. package/assets/phantom.webp +0 -0
  50. package/assets/rabby.webp +0 -0
  51. package/assets/rainbow.webp +0 -0
  52. package/assets/ramper.webp +0 -0
  53. package/assets/ready.webp +0 -0
  54. package/assets/ronin.webp +0 -0
  55. package/assets/safe.webp +0 -0
  56. package/assets/safepal.webp +0 -0
  57. package/assets/solflare.webp +0 -0
  58. package/assets/subwallet.webp +0 -0
  59. package/assets/taho.webp +0 -0
  60. package/assets/talisman.webp +0 -0
  61. package/assets/tokenary.webp +0 -0
  62. package/assets/tokenpocket.webp +0 -0
  63. package/assets/trust-wallet.webp +0 -0
  64. package/assets/uniswap.webp +0 -0
  65. package/assets/universalprofiles.webp +0 -0
  66. package/assets/valora.webp +0 -0
  67. package/assets/wigwam.webp +0 -0
  68. package/assets/xportal.webp +0 -0
  69. package/assets/zeal.webp +0 -0
  70. package/assets/zerion.webp +0 -0
  71. package/custom-elements.json +207 -0
  72. package/dist/abi.d.ts +21 -0
  73. package/dist/abi.d.ts.map +1 -0
  74. package/dist/abi.js +50 -0
  75. package/dist/abi.js.map +1 -0
  76. package/dist/address.d.ts +15 -0
  77. package/dist/address.d.ts.map +1 -0
  78. package/dist/address.js +25 -0
  79. package/dist/address.js.map +1 -0
  80. package/dist/balance.d.ts +78 -0
  81. package/dist/balance.d.ts.map +1 -0
  82. package/dist/balance.js +146 -0
  83. package/dist/balance.js.map +1 -0
  84. package/dist/base58.d.ts +15 -0
  85. package/dist/base58.d.ts.map +1 -0
  86. package/dist/base58.js +52 -0
  87. package/dist/base58.js.map +1 -0
  88. package/dist/catalog-fetch.d.ts +18 -0
  89. package/dist/catalog-fetch.d.ts.map +1 -0
  90. package/dist/catalog-fetch.js +85 -0
  91. package/dist/catalog-fetch.js.map +1 -0
  92. package/dist/catalog.d.ts +57 -0
  93. package/dist/catalog.d.ts.map +1 -0
  94. package/dist/catalog.js +80 -0
  95. package/dist/catalog.js.map +1 -0
  96. package/dist/chains.d.ts +32 -0
  97. package/dist/chains.d.ts.map +1 -0
  98. package/dist/chains.js +103 -0
  99. package/dist/chains.js.map +1 -0
  100. package/dist/config.d.ts +40 -0
  101. package/dist/config.d.ts.map +1 -0
  102. package/dist/config.js +44 -0
  103. package/dist/config.js.map +1 -0
  104. package/dist/deep-links.d.ts +22 -0
  105. package/dist/deep-links.d.ts.map +1 -0
  106. package/dist/deep-links.js +201 -0
  107. package/dist/deep-links.js.map +1 -0
  108. package/dist/device.d.ts +23 -0
  109. package/dist/device.d.ts.map +1 -0
  110. package/dist/device.js +59 -0
  111. package/dist/device.js.map +1 -0
  112. package/dist/element/attributes.d.ts +48 -0
  113. package/dist/element/element.d.ts +92 -0
  114. package/dist/element/index.d.ts +4 -0
  115. package/dist/element/props.d.ts +67 -0
  116. package/dist/element/ui/app.d.ts +22 -0
  117. package/dist/element/ui/assets.d.ts +7 -0
  118. package/dist/element/ui/qr.d.ts +16 -0
  119. package/dist/element/ui/use-handheld.d.ts +8 -0
  120. package/dist/element/ui/wallet-connect-panel.d.ts +26 -0
  121. package/dist/element/ui/wallet-dialog.d.ts +37 -0
  122. package/dist/element/ui/wallet-list.d.ts +26 -0
  123. package/dist/element/ui/wallet-mark.d.ts +15 -0
  124. package/dist/element.js +2079 -0
  125. package/dist/errors.d.ts +34 -0
  126. package/dist/errors.d.ts.map +1 -0
  127. package/dist/errors.js +64 -0
  128. package/dist/errors.js.map +1 -0
  129. package/dist/evm.d.ts +49 -0
  130. package/dist/evm.d.ts.map +1 -0
  131. package/dist/evm.js +217 -0
  132. package/dist/evm.js.map +1 -0
  133. package/dist/icons.d.ts +22 -0
  134. package/dist/icons.d.ts.map +1 -0
  135. package/dist/icons.js +98 -0
  136. package/dist/icons.js.map +1 -0
  137. package/dist/index.d.ts +39 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +43 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/intent.d.ts +60 -0
  142. package/dist/intent.d.ts.map +1 -0
  143. package/dist/intent.js +2 -0
  144. package/dist/intent.js.map +1 -0
  145. package/dist/kit.d.ts +124 -0
  146. package/dist/kit.d.ts.map +1 -0
  147. package/dist/kit.js +362 -0
  148. package/dist/kit.js.map +1 -0
  149. package/dist/svm.d.ts +45 -0
  150. package/dist/svm.d.ts.map +1 -0
  151. package/dist/svm.js +201 -0
  152. package/dist/svm.js.map +1 -0
  153. package/dist/theme.d.ts +101 -0
  154. package/dist/theme.d.ts.map +1 -0
  155. package/dist/theme.js +217 -0
  156. package/dist/theme.js.map +1 -0
  157. package/dist/types.d.ts +144 -0
  158. package/dist/types.d.ts.map +1 -0
  159. package/dist/types.js +2 -0
  160. package/dist/types.js.map +1 -0
  161. package/dist/wallet-standard.d.ts +77 -0
  162. package/dist/wallet-standard.d.ts.map +1 -0
  163. package/dist/wallet-standard.js +89 -0
  164. package/dist/wallet-standard.js.map +1 -0
  165. package/dist/walletconnect.d.ts +74 -0
  166. package/dist/walletconnect.d.ts.map +1 -0
  167. package/dist/walletconnect.js +133 -0
  168. package/dist/walletconnect.js.map +1 -0
  169. package/package.json +71 -3
  170. package/vscode.html-custom-data.json +55 -0
@@ -0,0 +1,60 @@
1
+ import type { Asset, Balance } from './balance.js';
2
+ import type { ChainFamily, Eip1193Provider } from './types.js';
3
+ /**
4
+ * What the caller wants out of connecting a wallet.
5
+ *
6
+ * A list rather than a mode, because these are not alternatives: a page may
7
+ * want an address and a balance from one connection, and a later one will
8
+ * want an authorization signed in the same breath. Each member says what the
9
+ * result must carry, and the picker itself is identical for all of them.
10
+ *
11
+ * `address` is the by-product of connecting at all, so it is always obtained;
12
+ * asking for it only says the caller wants it handed back.
13
+ *
14
+ * `balance` needs an asset to be a balance of. Asking for it without one is a
15
+ * programming error, not a runtime condition.
16
+ *
17
+ * `authorize` is the embedded checkout's signing step. Reserved here so the
18
+ * shape does not have to change when it arrives.
19
+ */
20
+ export type Intent = 'address' | 'balance' | 'authorize';
21
+ export interface ConnectRequest {
22
+ intent: Intent[];
23
+ /**
24
+ * Which family of wallets to offer. Omitted means both, which is right
25
+ * for a checkout that settles on either and wrong for a form whose
26
+ * address has to be one format.
27
+ */
28
+ family?: ChainFamily;
29
+ /**
30
+ * The EVM chain the wallet must end up on.
31
+ *
32
+ * Enforced only when given. A page collecting an address should leave it
33
+ * out: the same address receives on every EVM chain, and asking somebody
34
+ * to switch networks in their wallet to read an address back is theatre.
35
+ */
36
+ chainId?: number;
37
+ /** What to read a balance of. Required when `intent` includes 'balance'. */
38
+ assets?: Asset[];
39
+ /**
40
+ * Hold the connection open after the result is handed back, following
41
+ * account and chain changes.
42
+ *
43
+ * True for a checkout, which signs later. False for a form, which wanted
44
+ * a value and is done.
45
+ */
46
+ keepAlive?: boolean;
47
+ }
48
+ export interface ConnectResult {
49
+ walletId: string;
50
+ name: string;
51
+ icon?: string;
52
+ family: ChainFamily;
53
+ address: string;
54
+ /** The chain the wallet was on. EVM only; Solana has nothing to be on. */
55
+ chainId?: number;
56
+ /** Present when 'balance' was asked for, in the order the assets were given. */
57
+ balances?: Balance[];
58
+ /** Present only when `keepAlive` was set. */
59
+ provider?: Eip1193Provider;
60
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../src/intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE9D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAA;AAExD,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;IAChB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC1B"}
package/dist/intent.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.js","sourceRoot":"","sources":["../src/intent.ts"],"names":[],"mappings":""}
package/dist/kit.d.ts ADDED
@@ -0,0 +1,124 @@
1
+ import { type Asset, type Balance } from './balance.js';
2
+ import type { WalletEntry } from './catalog.js';
3
+ import { type ColorScheme, type WalletKitTheme } from './theme.js';
4
+ import type { ConnectRequest, ConnectResult } from './intent.js';
5
+ import type { ChainFamily, ConnectedEvmWallet, ConnectedSvmWallet, DetectedEvmWallet, DetectedSvmWallet } from './types.js';
6
+ import { type WalletConnectOptions } from './walletconnect.js';
7
+ export interface EvmState {
8
+ available: DetectedEvmWallet[];
9
+ connected?: ConnectedEvmWallet;
10
+ connecting: boolean;
11
+ switchingChain: boolean;
12
+ error: string;
13
+ }
14
+ export interface SvmState {
15
+ available: DetectedSvmWallet[];
16
+ connected?: ConnectedSvmWallet;
17
+ connecting: boolean;
18
+ error: string;
19
+ }
20
+ export interface WalletKitState {
21
+ catalog: WalletEntry[];
22
+ /** False until the catalogue has been asked for and answered, or failed. */
23
+ catalogLoaded: boolean;
24
+ handheld: boolean;
25
+ /** Where the wallet artwork is served from. */
26
+ assetBase: string;
27
+ /**
28
+ * The theme as the host set it, not as it resolved.
29
+ *
30
+ * Carried so a picker that was given no theme of its own can wear the
31
+ * one the page is wearing. A branded checkout sets it once, on the kit,
32
+ * and every picker on the page follows.
33
+ */
34
+ theme?: WalletKitTheme;
35
+ /** What the theme's mode resolved to, following the system when it says so. */
36
+ scheme: ColorScheme;
37
+ /** The theme as custom properties, ready to set on an element. */
38
+ variables: Record<string, string>;
39
+ evm: EvmState;
40
+ svm: SvmState;
41
+ }
42
+ /**
43
+ * Every option is an override, and a kit created with none of them works.
44
+ *
45
+ * What the kit needs to run is Reclack's own infrastructure, so it ships with
46
+ * it rather than asking each host to supply what it could not know. See
47
+ * config.ts. These exist for a sandbox, a private endpoint, or a partner
48
+ * running the kit under its own name.
49
+ */
50
+ export interface WalletKitOptions {
51
+ /** A different Reclack to talk to, such as a sandbox. */
52
+ apiUrl?: string;
53
+ /**
54
+ * The catalogue outright, skipping the round trip. What a host that
55
+ * renders on a server passes, having already fetched it there.
56
+ */
57
+ catalog?: WalletEntry[];
58
+ /** A different relay project, or different metadata on the approval screen. */
59
+ walletConnect?: WalletConnectOptions;
60
+ /**
61
+ * Where the host serves this package's `assets/` directory from.
62
+ *
63
+ * Served by the host rather than fetched from ours, so a page taking a
64
+ * payment still makes no third-party image request. A wallet's own
65
+ * EIP-6963 icon wins over these anyway, so getting it wrong costs the
66
+ * artwork of wallets that are not installed, not the ability to pay.
67
+ */
68
+ assetBase?: string;
69
+ /**
70
+ * Colours, corner radius, type and light or dark.
71
+ *
72
+ * Held here rather than passed to a renderer so that the resolved mode is
73
+ * part of the state every framework is already subscribed to: when the
74
+ * reader's system flips to dark, the picker follows without the host
75
+ * wiring up a second listener.
76
+ */
77
+ theme?: WalletKitTheme;
78
+ /**
79
+ * Read endpoints per EVM chain id, and one for Solana, for balances.
80
+ *
81
+ * The pinned public endpoints are used for any chain not named here.
82
+ * Worth overriding for anything heavier than a balance or two: they are
83
+ * shared and rate-limited.
84
+ */
85
+ rpcUrls?: Record<number, string>;
86
+ svmRpcUrl?: string;
87
+ }
88
+ export interface WalletKit {
89
+ getState(): WalletKitState;
90
+ /** Calls back on every change. Returns the unsubscribe. */
91
+ subscribe(listener: () => void): () => void;
92
+ connectEvm(wallet: DetectedEvmWallet): Promise<void>;
93
+ connectSvm(wallet: DetectedSvmWallet): Promise<void>;
94
+ /** Pairs with a wallet that injects nothing. `onUri` fires before approval. */
95
+ connectRemote(wallet: {
96
+ id: string;
97
+ name: string;
98
+ }, chainId: number, onUri: (uri: string) => void): Promise<void>;
99
+ disconnect(family?: ChainFamily): void;
100
+ ensureChain(chainId: number): Promise<boolean>;
101
+ /** Changes the theme after the fact, such as when a merchant's branding lands. */
102
+ setTheme(theme: WalletKitTheme | undefined): void;
103
+ /** Whether this kit can offer WalletConnect at all. */
104
+ canPairRemotely(): boolean;
105
+ /** Reads balances for an already-connected wallet. */
106
+ readBalances(family: ChainFamily, assets: Asset[]): Promise<Balance[]>;
107
+ /** Shapes a connected wallet into what a caller's intent asked for. */
108
+ resolveIntent(family: ChainFamily, request: ConnectRequest): Promise<ConnectResult>;
109
+ destroy(): void;
110
+ }
111
+ /**
112
+ * Everything a page needs to connect a wallet, with nothing on screen.
113
+ *
114
+ * A store with `getState` and `subscribe` rather than a hook, because this
115
+ * package renders nothing and belongs to no framework. That pair is the one
116
+ * shape every framework can consume: React reads it with useSyncExternalStore,
117
+ * Vue with a shallowRef, Svelte with a store contract, and plain JavaScript by
118
+ * calling it. A hook would have picked React for everybody.
119
+ *
120
+ * Nothing touches the window until the first subscriber arrives, so importing
121
+ * this on a server is safe and a host that renders on one does not have to
122
+ * guard every call site.
123
+ */
124
+ export declare function createWalletKit(options?: WalletKitOptions): WalletKit;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"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"}
package/dist/kit.js ADDED
@@ -0,0 +1,362 @@
1
+ import { readEvmBalance, readSvmBalance } from './balance.js';
2
+ import { fetchWalletCatalog, walletCatalogUrl } from './catalog-fetch.js';
3
+ import { DEFAULT_API_URL, DEFAULT_SVM_RPC_URL, DEFAULT_WALLETCONNECT_PROJECT_ID, defaultRpcUrl, } from './config.js';
4
+ import { subscribeHandheld } from './device.js';
5
+ import { DEFAULT_LOGO_BASE } from './icons.js';
6
+ import { resolveScheme, subscribeScheme, themeVariables, } from './theme.js';
7
+ import { connectEvmWallet, discoverEvmWallets, switchEvmChain, } from './evm.js';
8
+ import { walletErrorMessage } from './errors.js';
9
+ import { connectSvmWallet, disconnectSvmWallet, discoverSvmWallets } from './svm.js';
10
+ import { openWalletConnectSession, walletConnectReady, } from './walletconnect.js';
11
+ /**
12
+ * Everything a page needs to connect a wallet, with nothing on screen.
13
+ *
14
+ * A store with `getState` and `subscribe` rather than a hook, because this
15
+ * package renders nothing and belongs to no framework. That pair is the one
16
+ * shape every framework can consume: React reads it with useSyncExternalStore,
17
+ * Vue with a shallowRef, Svelte with a store contract, and plain JavaScript by
18
+ * calling it. A hook would have picked React for everybody.
19
+ *
20
+ * Nothing touches the window until the first subscriber arrives, so importing
21
+ * this on a server is safe and a host that renders on one does not have to
22
+ * guard every call site.
23
+ */
24
+ export function createWalletKit(options = {}) {
25
+ const initialScheme = resolveScheme(options.theme?.mode);
26
+ let state = {
27
+ catalog: options.catalog ?? [],
28
+ catalogLoaded: Boolean(options.catalog),
29
+ handheld: false,
30
+ assetBase: options.assetBase ?? DEFAULT_LOGO_BASE,
31
+ // Resolved up front rather than deferred to the first subscriber. An
32
+ // explicit mode needs no window to resolve, and a kit read before
33
+ // anything subscribes, which is every server render, would otherwise
34
+ // report light while the host had asked for dark. `system` still
35
+ // falls back to light where there is no window to ask.
36
+ theme: options.theme,
37
+ scheme: initialScheme,
38
+ variables: themeVariables(options.theme, initialScheme),
39
+ evm: {
40
+ available: [],
41
+ connecting: false,
42
+ switchingChain: false,
43
+ error: '',
44
+ },
45
+ svm: { available: [], connecting: false, error: '' },
46
+ };
47
+ const listeners = new Set();
48
+ const cleanups = [];
49
+ let theme = options.theme;
50
+ let stopScheme;
51
+ let started = false;
52
+ let destroyed = false;
53
+ // How to end a WalletConnect session, when the connection is one.
54
+ let closeRemote;
55
+ // One object replaced wholesale rather than mutated. Callers compare the
56
+ // reference to decide whether to re-render, and a mutated object is the
57
+ // same reference, so the render never happens.
58
+ function set(patch) {
59
+ if (destroyed) {
60
+ return;
61
+ }
62
+ state = { ...state, ...patch };
63
+ for (const listener of listeners) {
64
+ listener();
65
+ }
66
+ }
67
+ function setEvm(patch) {
68
+ set({ evm: { ...state.evm, ...patch } });
69
+ }
70
+ function setSvm(patch) {
71
+ set({ svm: { ...state.svm, ...patch } });
72
+ }
73
+ /**
74
+ * Begins discovery, once, when somebody is listening.
75
+ *
76
+ * Discovery is re-run when the catalogue lands: a wallet that announces
77
+ * itself is found without it, but one that only injects a global is found
78
+ * by a rule the catalogue carries, so the list is incomplete until then.
79
+ */
80
+ function start() {
81
+ if (started || typeof window === 'undefined') {
82
+ return;
83
+ }
84
+ started = true;
85
+ cleanups.push(subscribeHandheld((handheld) => set({ handheld })));
86
+ watchScheme();
87
+ restartDiscovery();
88
+ if (!state.catalogLoaded) {
89
+ const url = walletCatalogUrl(options.apiUrl ?? DEFAULT_API_URL);
90
+ void fetchWalletCatalog(url).then((catalog) => {
91
+ if (destroyed) {
92
+ return;
93
+ }
94
+ set({ catalog, catalogLoaded: true });
95
+ restartDiscovery();
96
+ });
97
+ }
98
+ }
99
+ function watchScheme() {
100
+ stopScheme?.();
101
+ stopScheme = subscribeScheme(theme?.mode, (scheme) => {
102
+ set({ theme, scheme, variables: themeVariables(theme, scheme) });
103
+ });
104
+ }
105
+ let stopDiscovery = [];
106
+ function restartDiscovery() {
107
+ for (const stop of stopDiscovery) {
108
+ stop();
109
+ }
110
+ stopDiscovery = [
111
+ discoverEvmWallets(state.catalog, (available) => setEvm({ available })),
112
+ discoverSvmWallets(state.catalog, (available) => setSvm({ available })),
113
+ ];
114
+ }
115
+ // The payer can switch account or network in the wallet at any time, and
116
+ // the page has to follow: showing one address while asking somebody to
117
+ // sign from another is how money goes to the wrong place.
118
+ let unwatch;
119
+ function watchEvm(connected) {
120
+ unwatch?.();
121
+ unwatch = undefined;
122
+ const provider = connected?.provider;
123
+ if (!provider?.on || !provider.removeListener) {
124
+ return;
125
+ }
126
+ const onAccounts = (...args) => {
127
+ const accounts = args[0];
128
+ const next = Array.isArray(accounts) ? accounts[0] : undefined;
129
+ if (typeof next !== 'string') {
130
+ setEvm({ connected: undefined });
131
+ return;
132
+ }
133
+ setEvm({
134
+ connected: state.evm.connected
135
+ ? { ...state.evm.connected, address: next }
136
+ : undefined,
137
+ });
138
+ };
139
+ const onChain = (...args) => {
140
+ const raw = args[0];
141
+ const chainId = typeof raw === 'string' ? Number.parseInt(raw, 16) : Number(raw);
142
+ setEvm({
143
+ connected: state.evm.connected
144
+ ? { ...state.evm.connected, chainId }
145
+ : undefined,
146
+ });
147
+ };
148
+ provider.on('accountsChanged', onAccounts);
149
+ provider.on('chainChanged', onChain);
150
+ unwatch = () => {
151
+ provider.removeListener?.('accountsChanged', onAccounts);
152
+ provider.removeListener?.('chainChanged', onChain);
153
+ };
154
+ }
155
+ /** The host's endpoint for a chain, or the pinned public one. */
156
+ function rpcFor(chainId) {
157
+ return options.rpcUrls?.[chainId] ?? defaultRpcUrl(chainId);
158
+ }
159
+ function walletConnectOptions() {
160
+ return (options.walletConnect
161
+ ?? { projectId: DEFAULT_WALLETCONNECT_PROJECT_ID });
162
+ }
163
+ const kit = {
164
+ getState: () => state,
165
+ subscribe(listener) {
166
+ listeners.add(listener);
167
+ start();
168
+ return () => {
169
+ listeners.delete(listener);
170
+ };
171
+ },
172
+ async connectEvm(wallet) {
173
+ setEvm({ connecting: true, error: '' });
174
+ try {
175
+ const connected = await connectEvmWallet(wallet);
176
+ setEvm({ connected });
177
+ watchEvm(connected);
178
+ }
179
+ catch (error) {
180
+ setEvm({
181
+ error: walletErrorMessage(error, 'Could not connect to your wallet.'),
182
+ });
183
+ }
184
+ finally {
185
+ setEvm({ connecting: false });
186
+ }
187
+ },
188
+ async connectSvm(wallet) {
189
+ setSvm({ connecting: true, error: '' });
190
+ try {
191
+ const { address, account } = await connectSvmWallet(wallet);
192
+ setSvm({
193
+ connected: {
194
+ walletId: wallet.id,
195
+ name: wallet.name,
196
+ icon: wallet.icon,
197
+ address,
198
+ account,
199
+ standard: wallet.standard,
200
+ provider: wallet.provider,
201
+ },
202
+ });
203
+ }
204
+ catch (error) {
205
+ setSvm({
206
+ error: walletErrorMessage(error, 'Could not connect to your wallet.'),
207
+ });
208
+ }
209
+ finally {
210
+ setSvm({ connecting: false });
211
+ }
212
+ },
213
+ async connectRemote(wallet, chainId, onUri) {
214
+ setEvm({ connecting: true, error: '' });
215
+ try {
216
+ const session = await openWalletConnectSession(walletConnectOptions(), chainId, onUri);
217
+ closeRemote = session.close;
218
+ const connected = {
219
+ walletId: wallet.id,
220
+ name: wallet.name,
221
+ address: session.address,
222
+ chainId: session.chainId,
223
+ provider: session.provider,
224
+ };
225
+ setEvm({ connected });
226
+ watchEvm(connected);
227
+ }
228
+ catch (error) {
229
+ setEvm({
230
+ error: walletErrorMessage(error, 'Could not connect to your wallet.'),
231
+ });
232
+ }
233
+ finally {
234
+ setEvm({ connecting: false });
235
+ }
236
+ },
237
+ disconnect(family) {
238
+ if (family !== 'svm') {
239
+ // A page cannot revoke an extension's permission; that only
240
+ // clears this side. A WalletConnect session is ours to end,
241
+ // though, and leaving it open would have the wallet showing
242
+ // this page as connected long after everyone has gone.
243
+ void closeRemote?.();
244
+ closeRemote = undefined;
245
+ unwatch?.();
246
+ unwatch = undefined;
247
+ setEvm({ connected: undefined, error: '' });
248
+ }
249
+ if (family !== 'evm') {
250
+ // Asked of the wallet as well, unlike the EVM side, because
251
+ // Solana wallets do expose it. Best effort: this side has let
252
+ // go either way.
253
+ if (state.svm.connected) {
254
+ void disconnectSvmWallet(state.svm.connected).catch(() => undefined);
255
+ }
256
+ setSvm({ connected: undefined, error: '' });
257
+ }
258
+ },
259
+ async ensureChain(chainId) {
260
+ const connected = state.evm.connected;
261
+ if (!connected) {
262
+ return false;
263
+ }
264
+ if (connected.chainId === chainId) {
265
+ return true;
266
+ }
267
+ setEvm({ error: '', switchingChain: true });
268
+ try {
269
+ // May prompt twice: once to add the network, once to select
270
+ // it, so the caller stays pending throughout.
271
+ await switchEvmChain(connected.provider, chainId);
272
+ return true;
273
+ }
274
+ catch (error) {
275
+ setEvm({ error: walletErrorMessage(error, 'Could not switch network.') });
276
+ return false;
277
+ }
278
+ finally {
279
+ setEvm({ switchingChain: false });
280
+ }
281
+ },
282
+ setTheme(next) {
283
+ theme = next;
284
+ if (started) {
285
+ // Re-subscribed rather than recomputed: the mode may have
286
+ // moved to or from `system`, which changes whether the
287
+ // reader's own setting is being followed at all.
288
+ watchScheme();
289
+ return;
290
+ }
291
+ // Nobody is listening yet, so there is nothing to follow; the
292
+ // mode still has to be resolved again, because it may have
293
+ // changed.
294
+ const scheme = resolveScheme(theme?.mode);
295
+ set({ theme, scheme, variables: themeVariables(theme, scheme) });
296
+ },
297
+ canPairRemotely: () => walletConnectReady(walletConnectOptions()),
298
+ async readBalances(family, assets) {
299
+ const connected = family === 'evm' ? state.evm.connected : state.svm.connected;
300
+ if (!connected) {
301
+ throw new Error('No wallet is connected.');
302
+ }
303
+ return Promise.all(assets.map(async (asset) => {
304
+ if (asset.family === 'svm') {
305
+ return readSvmBalance(options.svmRpcUrl ?? DEFAULT_SVM_RPC_URL, asset, connected.address);
306
+ }
307
+ // The endpoint when there is one, so reading a balance
308
+ // never drags a wallet onto another network. The wallet's
309
+ // own provider otherwise, which is the pre-flight case and
310
+ // does require it to be on that chain already.
311
+ const url = rpcFor(asset.chainId);
312
+ const source = url
313
+ ? { rpcUrl: url }
314
+ : { provider: connected.provider };
315
+ return readEvmBalance(source, asset, connected.address);
316
+ }));
317
+ },
318
+ async resolveIntent(family, request) {
319
+ // The request is checked before the connection, because an
320
+ // intent that asks for a balance of nothing is a mistake in the
321
+ // caller rather than a state somebody can get out of by
322
+ // connecting a wallet, and it should fail the same way either
323
+ // way.
324
+ if (request.intent.includes('balance') && !request.assets?.length) {
325
+ throw new Error("intent 'balance' needs at least one asset.");
326
+ }
327
+ const connected = family === 'evm' ? state.evm.connected : state.svm.connected;
328
+ if (!connected) {
329
+ throw new Error('No wallet is connected.');
330
+ }
331
+ const evm = family === 'evm' ? connected : undefined;
332
+ const result = {
333
+ walletId: connected.walletId,
334
+ name: connected.name,
335
+ icon: connected.icon,
336
+ family,
337
+ address: connected.address,
338
+ chainId: evm?.chainId,
339
+ };
340
+ if (request.intent.includes('balance')) {
341
+ result.balances = await kit.readBalances(family, request.assets ?? []);
342
+ }
343
+ if (request.keepAlive && evm) {
344
+ result.provider = evm.provider;
345
+ }
346
+ return result;
347
+ },
348
+ destroy() {
349
+ destroyed = true;
350
+ for (const stop of [...stopDiscovery, ...cleanups]) {
351
+ stop();
352
+ }
353
+ stopDiscovery = [];
354
+ stopScheme?.();
355
+ unwatch?.();
356
+ void closeRemote?.();
357
+ listeners.clear();
358
+ },
359
+ };
360
+ return kit;
361
+ }
362
+ //# sourceMappingURL=kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"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"}
package/dist/svm.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ import { type WalletEntry } from './catalog.js';
2
+ import { type StandardAccount } from './wallet-standard.js';
3
+ import type { ConnectedSvmWallet, DetectedSvmWallet } from './types.js';
4
+ /**
5
+ * Prompts the wallet for an account.
6
+ *
7
+ * Two routes because there are two kinds of wallet here. A registered one is
8
+ * asked through its connect feature and hands back accounts; an injected one
9
+ * is asked through its provider. The account object from the first is kept,
10
+ * because signing needs it back.
11
+ */
12
+ export declare function connectSvmWallet(wallet: DetectedSvmWallet): Promise<{
13
+ address: string;
14
+ account?: StandardAccount;
15
+ }>;
16
+ /** Ends the session where the wallet offers a way to. */
17
+ export declare function disconnectSvmWallet(wallet: ConnectedSvmWallet): Promise<void>;
18
+ /**
19
+ * Signs the prepared transaction and lets the wallet submit it.
20
+ *
21
+ * Nothing here builds or alters a transaction: the plan arrives built, in
22
+ * both the forms a wallet might want, and this picks the one its route takes.
23
+ * The payer still sees the wallet decode and display it before approving.
24
+ *
25
+ * Letting the wallet send it, rather than signing and sending separately,
26
+ * means one prompt and no RPC endpoint in this bundle.
27
+ */
28
+ export declare function signAndSendSvm(wallet: ConnectedSvmWallet, plan: {
29
+ message: string;
30
+ transaction: string;
31
+ chain: string;
32
+ }): Promise<string>;
33
+ /** Truncates a base58 address for display: 5e9y…xAQf. */
34
+ export declare function shortSvmAddress(address: string): string;
35
+ /**
36
+ * Finds the Solana wallets available in this browser.
37
+ *
38
+ * The Wallet Standard first: it is how wallets announce Solana support, it
39
+ * survives several being installed at once, and the wallet supplies its own
40
+ * name and icon. Sniffing globals is only a fallback for one that has not
41
+ * adopted it, and never overrides a registered wallet.
42
+ *
43
+ * Returns a cleanup function; callers must call it to drop the listener.
44
+ */
45
+ export declare function discoverSvmWallets(catalog: WalletEntry[], onChange: (wallets: DetectedSvmWallet[]) => void): () => void;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svm.d.ts","sourceRoot":"","sources":["../src/svm.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAE7E,OAAO,EAMN,KAAK,eAAe,EAEpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EACX,kBAAkB,EAClB,iBAAiB,EAEjB,MAAM,YAAY,CAAA;AAqBnB;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,iBAAiB,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CA4BzD;AAED,yDAAyD;AACzD,wBAAsB,mBAAmB,CACxC,MAAM,EAAE,kBAAkB,GACxB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CACnC,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,MAAM,CAAC,CAgDjB;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKxD;AAmBD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,GAC9C,MAAM,IAAI,CAuDZ"}