@tuwaio/sdk 0.1.14 → 0.2.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
@@ -1,322 +1,125 @@
1
1
  # @tuwaio/sdk
2
2
 
3
3
  [![NPM Version](https://img.shields.io/npm/v/@tuwaio/sdk.svg)](https://www.npmjs.com/package/@tuwaio/sdk)
4
- [![License](https://img.shields.io/npm/l/@tuwaio/sdk.svg)](./LICENSE)
4
+ [![License](https://img.shields.io/npm/l/@tuwaio/sdk.svg)](https://github.com/TuwaIO/sdk/blob/main/packages/sdk/LICENSE)
5
5
 
6
- The **Layer 8 (L8)** Core Umbrella SDK for the TUWA Ecosystem. It provides a unified entry point bundling `Orbit`, `Pulsar`, `Satellite`, and `Nova UI` core layers into modular subpath entrypoints, minimizing boilerplate while ensuring maximum type safety.
6
+ `@tuwaio/sdk` is the Layer 8 (L8) package of the **TUWA SDK**: one package for React apps that re-exports the client packages of the TUWA projects under subpaths — Orbit Utils, Pulsar (transaction tracking), Satellite Connect (wallet connection), SIWX (sign-in with a wallet) and Nova UI Kit (connect and transaction components) — with the Nova stylesheets. Chain support comes from its two add-ons, [`@tuwaio/evm-sdk`](https://sdk.docs.tuwa.io/packages/evm-sdk) and [`@tuwaio/solana-sdk`](https://sdk.docs.tuwa.io/packages/solana-sdk); none of the subpaths below loads EVM or Solana code.
7
7
 
8
8
  ---
9
9
 
10
- ## 🏛️ What is `@tuwaio/sdk`?
10
+ ## 🏛️ Core Capabilities
11
11
 
12
- `@tuwaio/sdk` is **Layer 8 (L8)** of the TUWA ecosystem architecture — the all-in-one UI and Logic foundation. Instead of manually resolving versions and importing from a dozen decoupled packages (`@tuwaio/pulsar-core`, `@tuwaio/nova-connect`, etc.), you install this single SDK and access clean, modular subpath exports.
13
-
14
- It abstracts away complex dependency management (automatically handling `zustand`, `framer-motion`, `radix-ui`, etc.) and lets you focus on building your application.
15
-
16
- ---
17
-
18
- ## ✨ Key Features
19
-
20
- - **📦 Zero-Config Integration**: Combines Orbit (adapters), Pulsar (tracking), Satellite (connections), Nova (UI), and SIWX (CAIP-122 Auth) out of the box.
21
- - **⚡ Modular Subpath Imports**: Clean exports for each domain (e.g. `@tuwaio/sdk/pulsar`, `@tuwaio/sdk/satellite`, `@tuwaio/sdk/siwx`, `@tuwaio/sdk/nova-connect`).
22
- - **🔐 Headless SIWX (CAIP-122) Auth**: Off-chain authentication across EVM and Solana with session management (`@tuwaio/sdk/siwx` and `@tuwaio/sdk/siwx/server`).
23
- - **🎨 Includes Nova UI & Styles**: Access beautifully styled wallet connection modals and transaction toasts with simple CSS imports (`@import '@tuwaio/sdk/styles/all.css'`).
24
- - **🛡️ Strict Singleton Contexts**: Uses intelligent peer dependencies to ensure you never run into multiple instances of React or Web3 singletons.
25
-
26
- > [!WARNING]
27
- > **SIWX Migration Notice**: Legacy SIWE authorization flows in Satellite are **deprecated**. Use `@tuwaio/sdk/siwx` and `@tuwaio/sdk/siwx/server` for multi-chain CAIP-122 authentication.
12
+ - **One version to install:** the TUWA packages and the libraries they share (`zustand`, `immer`, `framer-motion`, Radix UI, `react-toastify`, `dayjs`) are dependencies of `@tuwaio/sdk`, so a release of the SDK pins a set of TUWA versions that work together. `react` and `react-dom` are peer dependencies: the app keeps one copy of React.
13
+ - **Subpaths:** every subpath re-exports one entry point of a TUWA package, unchanged (see [Subpaths](#-subpaths)). Its reference is on the site of that package.
14
+ - **Stylesheets:** `@tuwaio/sdk/styles/*.css` are copies of the compiled stylesheets of Nova Core, Nova Connect and Nova Transactions. The app does not need Tailwind CSS.
28
15
 
29
16
  ---
30
17
 
31
18
  ## 💾 Installation
32
19
 
33
- To install the core SDK, simply run:
34
-
35
20
  ```bash
36
21
  pnpm add @tuwaio/sdk react react-dom
37
22
  ```
38
23
 
39
- _Note: For network-specific capabilities, you must also install either `@tuwaio/evm-sdk` or `@tuwaio/solana-sdk`._
24
+ Then add the chains of your app:
40
25
 
41
- ---
26
+ ```bash
27
+ # EVM
28
+ pnpm add @tuwaio/evm-sdk @wagmi/core viem
42
29
 
43
- ## 🎨 Styles Configuration
30
+ # Solana
31
+ pnpm add @tuwaio/solana-sdk @solana/kit @wallet-standard/react @wallet-standard/app @wallet-standard/base @wallet-standard/features @wallet-standard/ui @wallet-standard/ui-registry
32
+ ```
33
+
34
+ Do not install the re-exported TUWA packages separately at other versions: two copies of a package with a store or a React context, such as `@tuwaio/satellite-react` or `@tuwaio/nova-connect`, do not share their state or their types.
44
35
 
45
- Import the bundled CSS styles into your global CSS file (e.g., `globals.css`):
36
+ Import the stylesheets once, for example in the global CSS file of the app:
46
37
 
47
38
  ```css
48
- /* Import all Nova UI styles at once */
49
39
  @import '@tuwaio/sdk/styles/all.css';
50
-
51
- /* Optional: if your dApp uses Tailwind CSS v4 */
52
- @import 'tailwindcss';
53
-
54
- /* Or import individually if needed */
55
- /* @import '@tuwaio/sdk/styles/nova-core.css'; */
56
- /* @import '@tuwaio/sdk/styles/nova-connect.css'; */
57
- /* @import '@tuwaio/sdk/styles/nova-transactions.css'; */
58
40
  ```
59
41
 
60
- > **Note**: Nova UI components include fully compiled, self-contained styles inside `@tuwaio/sdk/styles/all.css`. Tailwind CSS is **optional** — we use Tailwind utility classes in our documentation layout examples for convenience, but you can use any styling solution (CSS Modules, Styled Components, Vanilla CSS) for your dApp layout. If you do use Tailwind CSS v4 in your project, include `@import 'tailwindcss';` in your global CSS file.
42
+ `all.css` joins `nova-core.css` (the `--tuwa-*` theme variables), `nova-connect.css` and `nova-transactions.css`; import them one by one to leave one out.
61
43
 
62
44
  ---
63
45
 
64
- ## 🚀 Quick Start (Multi-Chain Integration)
65
-
66
- The true power of the TUWA Umbrella SDKs is composability. Below is a complete production-grade architectural guide showing how to compose **EVM**, **Solana**, headless transaction state, and Nova UI layers effortlessly.
67
-
68
- > **Note:** This example uses standard client-side state. If you are building a Quasar-powered app (with cloud syncing, history, and pagination), please refer to the `@tuwaio/quasar-sdk` documentation.
69
-
70
- ### 1. Define Your Transaction Types (`types.ts`)
71
-
72
- First, define the strict union of all possible transactions your app supports.
73
-
74
- ```ts
75
- // src/types.ts
76
- import type { Transaction } from '@tuwaio/sdk/pulsar';
77
-
78
- export enum AppTxType {
79
- SWAP = 'SWAP',
80
- }
81
-
82
- export type SwapTx = Transaction & {
83
- type: AppTxType.SWAP;
84
- payload: { tokenIn: string; tokenOut: string; amount: number };
85
- };
86
-
87
- export type TransactionUnion = SwapTx;
88
- ```
89
-
90
- ### 2. Multi-Chain Tracking Store (`usePulsarStore.ts`)
91
-
92
- Configure the headless tracking store with both EVM and Solana adapters.
93
-
94
- ```ts
95
- // src/hooks/usePulsarStore.ts
96
- 'use client';
97
-
98
- import { createPulsarStore, createBoundedUseStore } from '@tuwaio/sdk/pulsar';
99
- import { pulsarEvmAdapter } from '@tuwaio/evm-sdk/pulsar';
100
- import { pulsarSolanaAdapter } from '@tuwaio/solana-sdk/pulsar';
101
-
102
- import { wagmiConfig, appEVMChains, solanaRPCUrls } from '@/configs/appConfig';
103
- import { TransactionUnion } from '@/types';
104
-
105
- // Create the headless tracking store with BOTH EVM and Solana adapters
106
- const initialStore = createPulsarStore<TransactionUnion>({
107
- name: 'tuwa-transactions-multi',
108
- adapter: [pulsarEvmAdapter(wagmiConfig, appEVMChains), pulsarSolanaAdapter({ rpcUrls: solanaRPCUrls })],
109
- });
110
-
111
- export const usePulsarStore = createBoundedUseStore(initialStore);
112
- ```
113
-
114
- ### 3. Nova Transactions Provider (`NovaTransactionsProvider.tsx`)
46
+ ## 🧭 Subpaths
47
+
48
+ | Import path | Re-exports | Reference |
49
+ | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
50
+ | `@tuwaio/sdk/orbit` | `@tuwaio/orbit-core` | [orbit.docs.tuwa.io](https://orbit.docs.tuwa.io/packages/orbit-core) |
51
+ | `@tuwaio/sdk/pulsar` | `@tuwaio/pulsar-core` and `@tuwaio/pulsar-react` | [pulsar-core](https://pulsar.docs.tuwa.io/packages/pulsar-core), [pulsar-react](https://pulsar.docs.tuwa.io/packages/pulsar-react) |
52
+ | `@tuwaio/sdk/satellite` | `@tuwaio/satellite-core` and `@tuwaio/satellite-react` (its `Connector` type as `SatelliteReactConnector`) | [satellite-core](https://satellite.docs.tuwa.io/packages/satellite-core), [satellite-react](https://satellite.docs.tuwa.io/packages/satellite-react/react) |
53
+ | `@tuwaio/sdk/siwx` | `@tuwaio/siwx-react` | [siwx.docs.tuwa.io](https://siwx.docs.tuwa.io/packages/siwx-react) |
54
+ | `@tuwaio/sdk/siwx/core` | `@tuwaio/siwx-core` | [siwx.docs.tuwa.io](https://siwx.docs.tuwa.io/packages/siwx-core) |
55
+ | `@tuwaio/sdk/siwx/server` | `@tuwaio/siwx-server` | [siwx.docs.tuwa.io](https://siwx.docs.tuwa.io/packages/siwx-server/server) |
56
+ | `@tuwaio/sdk/siwx/server-next` | `@tuwaio/siwx-server/next` | [siwx.docs.tuwa.io](https://siwx.docs.tuwa.io/packages/siwx-server/next) |
57
+ | `@tuwaio/sdk/nova-core` | `@tuwaio/nova-core` | [Storybook](https://stories.tuwa.io/?path=/docs/packages-nova-core-overview--docs) |
58
+ | `@tuwaio/sdk/nova-connect` | `@tuwaio/nova-connect` | [Storybook](https://stories.tuwa.io/?path=/docs/packages-nova-connect-connect-overview--docs) |
59
+ | `@tuwaio/sdk/nova-connect/components` | `@tuwaio/nova-connect/components` | [Storybook](https://stories.tuwa.io/?path=/docs/packages-nova-connect-components-overview--docs) |
60
+ | `@tuwaio/sdk/nova-connect/hooks` | `@tuwaio/nova-connect/hooks` | [Storybook](https://stories.tuwa.io/?path=/docs/packages-nova-connect-hooks-overview--docs) |
61
+ | `@tuwaio/sdk/nova-connect/i18n` | `@tuwaio/nova-connect/i18n` | [Storybook](https://stories.tuwa.io/?path=/docs/packages-nova-connect-i18n-overview--docs) |
62
+ | `@tuwaio/sdk/nova-connect/satellite` | `@tuwaio/nova-connect/satellite` | [Storybook](https://stories.tuwa.io/?path=/docs/packages-nova-connect-satellite-overview--docs) |
63
+ | `@tuwaio/sdk/nova-transactions` | `@tuwaio/nova-transactions` | [Storybook](https://stories.tuwa.io/?path=/docs/packages-nova-transactions-transactions-overview--docs) |
64
+ | `@tuwaio/sdk/nova-transactions/providers` | `@tuwaio/nova-transactions/providers` | [Storybook](https://stories.tuwa.io/?path=/docs/packages-nova-transactions-providers-overview--docs) |
65
+ | `@tuwaio/sdk/styles/*.css` | `dist/index.css` of the three Nova packages | `all.css`, `nova-core.css`, `nova-connect.css`, `nova-transactions.css` |
66
+
67
+ `@tuwaio/sdk/nova-connect/evm` and `@tuwaio/sdk/nova-connect/solana` re-export the chain entry points of Nova Connect for the add-ons; import them as `@tuwaio/evm-sdk/nova-connect` and `@tuwaio/solana-sdk/nova-connect`. They need the chain packages that the add-ons install, and going through `@tuwaio/sdk` makes their chain registration and types apply to the same copy of Nova Connect and Satellite React as the other subpaths.
115
68
 
116
- Binds the React UI elements to the headless transaction state.
117
-
118
- ```tsx
119
- // src/providers/NovaTransactionsProvider.tsx
120
- 'use client';
121
-
122
- import { useSatelliteConnectStore } from '@tuwaio/sdk/satellite';
123
- import { useInitializeTransactionsPool } from '@tuwaio/sdk/pulsar';
124
- import { getAdapterFromConnectorType } from '@tuwaio/sdk/orbit';
125
- import { NovaTransactionsProvider as NTP } from '@tuwaio/sdk/nova-transactions/providers';
126
- import { usePulsarStore } from '@/hooks/usePulsarStore';
127
-
128
- export function NovaTransactionsProvider() {
129
- const initialTx = usePulsarStore((s) => s.initialTx);
130
- const closeTxTrackedModal = usePulsarStore((s) => s.closeTxTrackedModal);
131
- const executeTxAction = usePulsarStore((s) => s.executeTxAction);
132
- const initializeTransactionsPool = usePulsarStore((s) => s.initializeTransactionsPool);
133
- const getAdapter = usePulsarStore((s) => s.getAdapter);
134
- const transactionsPool = usePulsarStore((s) => s.transactionsPool);
135
-
136
- const activeConnection = useSatelliteConnectStore((s) => s.activeConnection);
137
-
138
- useInitializeTransactionsPool({ initializeTransactionsPool });
139
-
140
- return (
141
- <NTP
142
- transactionsPool={transactionsPool}
143
- initialTx={initialTx}
144
- closeTxTrackedModal={closeTxTrackedModal}
145
- executeTxAction={executeTxAction}
146
- connectedWalletAddress={activeConnection?.isConnected ? activeConnection.address : undefined}
147
- connectedAdapterType={getAdapterFromConnectorType(activeConnection?.connectorType ?? 'evm:')}
148
- adapter={getAdapter()}
149
- />
150
- );
151
- }
152
- ```
69
+ ---
153
70
 
154
- ### 4. App Providers Layout (`AppProviders.tsx`)
71
+ ## 🚀 Usage
155
72
 
156
- Assembling the complete multi-chain ecosystem layout. Notice how both `EVMConnectorsWatcher` and `SolanaConnectorsWatcher` operate simultaneously in the background.
73
+ The providers of an EVM app with a connect button:
157
74
 
158
75
  ```tsx
159
- // src/providers/AppProviders.tsx
160
76
  'use client';
161
77
 
162
- import { SatelliteConnectProvider } from '@tuwaio/sdk/satellite';
163
- import { NovaConnectProvider } from '@tuwaio/sdk/nova-connect';
164
- import { satelliteEVMAdapter } from '@tuwaio/evm-sdk/satellite';
165
78
  import { EVMConnectorsWatcher } from '@tuwaio/evm-sdk/nova-connect';
166
- import { satelliteSolanaAdapter } from '@tuwaio/solana-sdk/satellite';
167
- import { SolanaConnectorsWatcher } from '@tuwaio/solana-sdk/nova-connect';
168
- import { useSiwxSession } from '@tuwaio/sdk/siwx';
169
-
170
- import { appEVMChains, solanaRPCUrls, wagmiConfig } from '@/configs/appConfig';
171
- import { usePulsarStore } from '@/hooks/usePulsarStore';
172
- import { NovaTransactionsProvider } from '@/providers/NovaTransactionsProvider';
173
-
174
- export function AppProviders({ children }: { children: React.ReactNode }) {
175
- const getAdapter = usePulsarStore((state) => state.getAdapter);
176
- const transactionsPool = usePulsarStore((state) => state.transactionsPool);
79
+ import { satelliteEVMAdapter } from '@tuwaio/evm-sdk/satellite';
80
+ import { NovaConnectProvider } from '@tuwaio/sdk/nova-connect';
81
+ import { ConnectButton } from '@tuwaio/sdk/nova-connect/components';
82
+ import { SatelliteConnectProvider } from '@tuwaio/sdk/satellite';
83
+ import { createConfig, http, injected } from '@wagmi/core';
84
+ import type { ReactNode } from 'react';
85
+ import { mainnet } from 'viem/chains';
177
86
 
178
- const siwxSession = useSiwxSession();
87
+ const appChains = [mainnet] as const;
88
+ const wagmiConfig = createConfig({ chains: appChains, connectors: [injected()], transports: { [mainnet.id]: http() } });
89
+ const adapter = satelliteEVMAdapter(wagmiConfig, appChains);
179
90
 
91
+ export function Providers({ children }: { children: ReactNode }) {
180
92
  return (
181
- <SatelliteConnectProvider
182
- adapter={[satelliteEVMAdapter(wagmiConfig, appEVMChains), satelliteSolanaAdapter({ rpcUrls: solanaRPCUrls })]}
183
- autoConnect={true}
184
- >
185
- <EVMConnectorsWatcher wagmiConfig={wagmiConfig} siwx={siwxSession} />
186
- <SolanaConnectorsWatcher siwx={siwxSession} />
187
-
188
- <NovaTransactionsProvider />
189
-
190
- <NovaConnectProvider
191
- appChains={appEVMChains}
192
- solanaRPCUrls={solanaRPCUrls}
193
- transactionPool={transactionsPool}
194
- pulsarAdapter={getAdapter()}
195
- withImpersonated
196
- withBalance
197
- withChain
198
- siwx={{
199
- verifier: async (payload) => {
200
- const res = await fetch('/api/siwx/verify', {
201
- method: 'POST',
202
- headers: { 'Content-Type': 'application/json' },
203
- body: JSON.stringify(payload),
204
- });
205
- return res.ok ? res.json() : null;
206
- },
207
- destroyer: async () => {
208
- await fetch('/api/siwx/logout', { method: 'POST' });
209
- },
210
- }}
211
- >
212
- {children}
213
- </NovaConnectProvider>
93
+ <SatelliteConnectProvider adapter={adapter} autoConnect>
94
+ <EVMConnectorsWatcher wagmiConfig={wagmiConfig} />
95
+ <NovaConnectProvider appChains={appChains}>{children}</NovaConnectProvider>
214
96
  </SatelliteConnectProvider>
215
97
  );
216
98
  }
217
- ```
218
-
219
- ### 5. Creating a Multi-Chain Transaction (Usage)
220
-
221
- Now you can safely execute strictly-typed, cross-chain transactions anywhere in your app. The store automatically routes the transaction to the correct adapter.
222
-
223
- ```tsx
224
- // src/components/SwapButton.tsx
225
- 'use client';
226
99
 
227
- import { getAdapterFromConnectorType, OrbitAdapter } from '@tuwaio/sdk/orbit';
228
- import { useSatelliteConnectStore } from '@tuwaio/sdk/satellite';
229
- import { TxActionButton } from '@tuwaio/sdk/nova-transactions';
230
- import { usePulsarStore } from '@/hooks/usePulsarStore';
231
- import { AppTxType } from '@/types';
232
-
233
- export function SwapButton() {
234
- const executeTxAction = usePulsarStore((s) => s.executeTxAction);
235
- const getLastTxKey = usePulsarStore((s) => s.getLastTxKey);
236
- const transactionsPool = usePulsarStore((s) => s.transactionsPool);
237
- const activeConnection = useSatelliteConnectStore((s) => s.activeConnection);
238
-
239
- const handleSwapAction = async () => {
240
- const adapterType = activeConnection?.connectorType
241
- ? getAdapterFromConnectorType(activeConnection.connectorType)
242
- : OrbitAdapter.EVM;
243
- const isEvm = adapterType === OrbitAdapter.EVM;
244
-
245
- await executeTxAction({
246
- actionFunction: async () => {
247
- // Execute smart contract call (e.g. writeContract via Viem/Wagmi or signAndSendSolanaTx via @solana/kit)
248
- /* return await swapTokensContractCall(); */
249
- },
250
- onSuccess: (tx) => {
251
- console.log('Swap transaction completed successfully:', tx);
252
- },
253
- params: {
254
- type: AppTxType.SWAP,
255
- adapter: adapterType,
256
- desiredChainID: isEvm ? 1 : 'mainnet',
257
- rpcUrl: isEvm ? undefined : activeConnection?.rpcURL,
258
- title: ['Swapping Tokens', 'Tokens Swapped', 'Error During Swap', 'Swap Transaction Replaced'],
259
- description: [
260
- `Swapping 100 USDC for ${isEvm ? 'ETH' : 'SOL'}...`,
261
- `Success! Swapped 100 USDC for ${isEvm ? 'ETH' : 'SOL'}.`,
262
- 'Something went wrong during token swap.',
263
- 'Transaction was replaced in wallet.',
264
- ],
265
- payload: {
266
- tokenIn: 'USDC',
267
- tokenOut: isEvm ? 'ETH' : 'SOL',
268
- amount: 100,
269
- },
270
- withTrackedModal: true,
271
- requiredConfirmations: isEvm ? 3 : undefined,
272
- },
273
- });
274
- };
275
-
276
- return (
277
- <TxActionButton
278
- action={handleSwapAction}
279
- getLastTxKey={getLastTxKey}
280
- transactionsPool={transactionsPool}
281
- walletAddress={activeConnection?.address}
282
- >
283
- Cross-Chain Swap
284
- </TxActionButton>
285
- );
100
+ export function Header() {
101
+ return <ConnectButton />;
286
102
  }
287
103
  ```
288
104
 
105
+ The full setup — EVM and Solana, transaction tracking with Pulsar and Nova Transactions, SIWX sign-in and Quasar sync — is the **[Full-Stack React guide](https://docs.tuwa.io/guides/full-stack-react)**. Ready-made apps are in the [starter templates](https://docs.tuwa.io/guides/starter-templates).
106
+
289
107
  ---
290
108
 
291
- ## 📦 Available Subpath Exports
292
-
293
- This package provides direct subpath entry points for clean, tree-shakeable imports:
294
-
295
- - **`@tuwaio/sdk/pulsar`** — State machine & tracking stores (`createPulsarStore`, `createTxInMemoryStore`, `useInitializeTransactionsPool`).
296
- - **`@tuwaio/sdk/satellite`** — Wallet state & react hooks (`useSatelliteConnectStore`, `SatelliteConnectProvider`, `useAccount`).
297
- - **`@tuwaio/sdk/siwx`** — Client-side SIWX (CAIP-122) auto-authentication hooks.
298
- - **`@tuwaio/sdk/siwx/core`** — SIWX core types, error handling, and message building logic.
299
- - **`@tuwaio/sdk/siwx/server`** — Server-side SIWX session handlers.
300
- - **`@tuwaio/sdk/nova-connect`** — Connect UI main entry (`ConnectButton`, `NovaConnectProvider`).
301
- - **`@tuwaio/sdk/nova-connect/components`** — Standalone UI components (`ConnectButton`, Modals, Customization interfaces).
302
- - **`@tuwaio/sdk/nova-connect/hooks`** — Helper hooks (`useGetWalletNameAndAvatar`, `useWalletChainsList`).
303
- - **`@tuwaio/sdk/nova-connect/i18n`** — Internationalization and label providers (`NovaConnectLabelsProvider`).
304
- - **`@tuwaio/sdk/nova-transactions`** — Transaction UI components (`TxActionButton`).
305
- - **`@tuwaio/sdk/nova-transactions/providers`** — Transaction UI provider (`NovaTransactionsProvider`).
306
- - **`@tuwaio/sdk/nova-core`** — UI Core variables, base components, and utilities.
307
- - **`@tuwaio/sdk/orbit`** — Core multi-chain types and adapters (`OrbitAdapter`, `getAdapterFromConnectorType`).
308
- - **`@tuwaio/sdk/styles/all.css`** — Complete bundled stylesheet for Nova UI components.
109
+ ## 🗄️ Browser Storage
309
110
 
310
- ---
111
+ `@tuwaio/sdk` saves nothing itself. The re-exported packages use these `localStorage` keys; each page lists when they are written:
311
112
 
312
- ## 🤝 Contributing & Support
113
+ - `orbit-core:lastConnectedConnector`, `orbit-core:recentlyConnectedConnectorsListHelpers` and `satellite-connect:impersonatedAddress`: the last connection, the recent wallets and the impersonated address ([`@tuwaio/satellite-core`](https://satellite.docs.tuwa.io/packages/satellite-core), read by Nova Connect);
114
+ - the `name` passed to `createPulsarStore`: the tracked transactions ([`@tuwaio/pulsar-core`](https://pulsar.docs.tuwa.io/packages/pulsar-core));
115
+ - `siwx-react:session`: the SIWX session shown in the UI ([`@tuwaio/siwx-react`](https://siwx.docs.tuwa.io/packages/siwx-react)).
313
116
 
314
- Contributions are welcome! Please read our main **[Contribution Guidelines](https://github.com/TuwaIO/workflows/blob/main/CONTRIBUTING.md)**.
117
+ ## 🌐 External Services
315
118
 
316
- If you find this library useful, please consider supporting its development. Every contribution helps!
119
+ `@tuwaio/sdk` sends no requests itself. Of the packages it re-exports, only `@tuwaio/nova-core` does: it loads network and wallet icons that `@web3icons/common` does not have from `raw.githubusercontent.com` ([details](https://stories.tuwa.io/?path=/docs/packages-nova-core-overview--docs)). The chain requests (RPC endpoints, ENS, SNS, Pimlico, Safe Transaction Service) come from the chain packages of the add-ons: see [`@tuwaio/evm-sdk`](https://sdk.docs.tuwa.io/packages/evm-sdk) and [`@tuwaio/solana-sdk`](https://sdk.docs.tuwa.io/packages/solana-sdk). The SIWX endpoints are those of your server.
317
120
 
318
- [**➡️ View Support Options**](https://github.com/TuwaIO/workflows/blob/main/Donation.md)
121
+ ---
319
122
 
320
123
  ## 📄 License
321
124
 
322
- This project is licensed under the **Apache-2.0 License** - see the [LICENSE](./LICENSE) file for details.
125
+ Licensed under the **Apache-2.0 License**. See the [LICENSE](https://github.com/TuwaIO/sdk/blob/main/packages/sdk/LICENSE) file for details.
@@ -1,7 +1,9 @@
1
1
  export * from '@tuwaio/nova-connect/components';
2
+ import '@tuwaio/nova-connect/evm';
2
3
  import '@tuwaio/nova-connect/hooks';
3
4
  import '@tuwaio/nova-connect/i18n';
4
5
  import '@tuwaio/nova-connect/satellite';
6
+ import '@tuwaio/nova-connect/solana';
5
7
  import '@tuwaio/nova-connect';
6
8
  import '@tuwaio/nova-core';
7
9
  import '@tuwaio/nova-transactions/providers';
@@ -1,7 +1,9 @@
1
1
  export * from '@tuwaio/nova-connect/components';
2
+ import '@tuwaio/nova-connect/evm';
2
3
  import '@tuwaio/nova-connect/hooks';
3
4
  import '@tuwaio/nova-connect/i18n';
4
5
  import '@tuwaio/nova-connect/satellite';
6
+ import '@tuwaio/nova-connect/solana';
5
7
  import '@tuwaio/nova-connect';
6
8
  import '@tuwaio/nova-core';
7
9
  import '@tuwaio/nova-transactions/providers';
@@ -0,0 +1 @@
1
+ 'use strict';var evm=require('@tuwaio/nova-connect/evm');Object.keys(evm).forEach(function(k){if(k!=='default'&&!Object.prototype.hasOwnProperty.call(exports,k))Object.defineProperty(exports,k,{enumerable:true,get:function(){return evm[k]}})});
@@ -0,0 +1 @@
1
+ export * from '@tuwaio/nova-connect/evm';
@@ -0,0 +1 @@
1
+ export * from '@tuwaio/nova-connect/evm';
@@ -0,0 +1 @@
1
+ export*from'@tuwaio/nova-connect/evm';
@@ -0,0 +1 @@
1
+ 'use strict';var solana=require('@tuwaio/nova-connect/solana');Object.keys(solana).forEach(function(k){if(k!=='default'&&!Object.prototype.hasOwnProperty.call(exports,k))Object.defineProperty(exports,k,{enumerable:true,get:function(){return solana[k]}})});
@@ -0,0 +1 @@
1
+ export * from '@tuwaio/nova-connect/solana';
@@ -0,0 +1 @@
1
+ export * from '@tuwaio/nova-connect/solana';
@@ -0,0 +1 @@
1
+ export*from'@tuwaio/nova-connect/solana';
@@ -1,2 +1,2 @@
1
1
  export * from '@tuwaio/satellite-core';
2
- export { AllConnections, AllConnectors, Connection, SatelliteConnectProvider, SatelliteConnectProviderProps, Connector as SatelliteReactConnector, SatelliteStoreContext, useInitializeAutoConnect, useSatelliteConnectStore } from '@tuwaio/satellite-react';
2
+ export { AllConnections, AllConnectors, Connection, InitializeAutoConnectProps, SatelliteConnectProvider, SatelliteConnectProviderProps, SatelliteContextType, Connector as SatelliteReactConnector, SatelliteStoreContext, useInitializeAutoConnect, useSatelliteConnectStore } from '@tuwaio/satellite-react';
@@ -1,2 +1,2 @@
1
1
  export * from '@tuwaio/satellite-core';
2
- export { AllConnections, AllConnectors, Connection, SatelliteConnectProvider, SatelliteConnectProviderProps, Connector as SatelliteReactConnector, SatelliteStoreContext, useInitializeAutoConnect, useSatelliteConnectStore } from '@tuwaio/satellite-react';
2
+ export { AllConnections, AllConnectors, Connection, InitializeAutoConnectProps, SatelliteConnectProvider, SatelliteConnectProviderProps, SatelliteContextType, Connector as SatelliteReactConnector, SatelliteStoreContext, useInitializeAutoConnect, useSatelliteConnectStore } from '@tuwaio/satellite-react';
@@ -723,9 +723,6 @@ html {
723
723
  .novatx\:max-w-\[55\%\] {
724
724
  max-width: 55%;
725
725
  }
726
- .novatx\:max-w-\[200px\] {
727
- max-width: 200px;
728
- }
729
726
  .novatx\:min-w-0 {
730
727
  min-width: 0px;
731
728
  }
@@ -1666,7 +1663,6 @@ html {
1666
1663
  --novacon-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
1667
1664
  monospace;
1668
1665
  --novacon-color-red-500: oklch(63.7% 0.237 25.331);
1669
- --novacon-color-red-600: oklch(57.7% 0.245 27.325);
1670
1666
  --novacon-color-green-600: oklch(62.7% 0.194 149.214);
1671
1667
  --novacon-color-blue-500: oklch(62.3% 0.214 259.815);
1672
1668
  --novacon-color-white: #fff;
@@ -2119,9 +2115,6 @@ html {
2119
2115
  --tw-pan-x: pan-x;
2120
2116
  touch-action: var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,);
2121
2117
  }
2122
- .novacon\:scrollbar-thin {
2123
- scrollbar-width: thin;
2124
- }
2125
2118
  .novacon\:flex-col {
2126
2119
  flex-direction: column;
2127
2120
  }
@@ -2313,19 +2306,12 @@ html {
2313
2306
  .novacon\:bg-\[var\(--tuwa-warning-bg\)\] {
2314
2307
  background-color: var(--tuwa-warning-bg);
2315
2308
  }
2316
- .novacon\:bg-blue-500 {
2317
- background-color: var(--novacon-color-blue-500);
2318
- }
2319
2309
  .novacon\:bg-red-500 {
2320
2310
  background-color: var(--novacon-color-red-500);
2321
2311
  }
2322
2312
  .novacon\:bg-transparent {
2323
2313
  background-color: transparent;
2324
2314
  }
2325
- .novacon\:bg-gradient-to-b {
2326
- --tw-gradient-position: to bottom in oklab;
2327
- background-image: linear-gradient(var(--tw-gradient-stops));
2328
- }
2329
2315
  .novacon\:bg-gradient-to-r {
2330
2316
  --tw-gradient-position: to right in oklab;
2331
2317
  background-image: linear-gradient(var(--tw-gradient-stops));
@@ -2551,14 +2537,6 @@ html {
2551
2537
  .novacon\:opacity-100 {
2552
2538
  opacity: 100%;
2553
2539
  }
2554
- .novacon\:shadow-2xl {
2555
- --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
2556
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2557
- }
2558
- .novacon\:shadow-lg {
2559
- --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
2560
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2561
- }
2562
2540
  .novacon\:shadow-sm {
2563
2541
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
2564
2542
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -2757,9 +2735,6 @@ html {
2757
2735
  .novacon\:hover\:bg-\[var\(--tuwa-text-accent\)\]:hover {
2758
2736
  background-color: var(--tuwa-text-accent);
2759
2737
  }
2760
- .novacon\:hover\:bg-red-600:hover {
2761
- background-color: var(--novacon-color-red-600);
2762
- }
2763
2738
  .novacon\:hover\:text-\[var\(--tuwa-error-text\)\]:hover {
2764
2739
  color: var(--tuwa-error-text);
2765
2740
  }
@@ -6,7 +6,6 @@
6
6
  --novacon-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
7
7
  monospace;
8
8
  --novacon-color-red-500: oklch(63.7% 0.237 25.331);
9
- --novacon-color-red-600: oklch(57.7% 0.245 27.325);
10
9
  --novacon-color-green-600: oklch(62.7% 0.194 149.214);
11
10
  --novacon-color-blue-500: oklch(62.3% 0.214 259.815);
12
11
  --novacon-color-white: #fff;
@@ -459,9 +458,6 @@
459
458
  --tw-pan-x: pan-x;
460
459
  touch-action: var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,);
461
460
  }
462
- .novacon\:scrollbar-thin {
463
- scrollbar-width: thin;
464
- }
465
461
  .novacon\:flex-col {
466
462
  flex-direction: column;
467
463
  }
@@ -653,19 +649,12 @@
653
649
  .novacon\:bg-\[var\(--tuwa-warning-bg\)\] {
654
650
  background-color: var(--tuwa-warning-bg);
655
651
  }
656
- .novacon\:bg-blue-500 {
657
- background-color: var(--novacon-color-blue-500);
658
- }
659
652
  .novacon\:bg-red-500 {
660
653
  background-color: var(--novacon-color-red-500);
661
654
  }
662
655
  .novacon\:bg-transparent {
663
656
  background-color: transparent;
664
657
  }
665
- .novacon\:bg-gradient-to-b {
666
- --tw-gradient-position: to bottom in oklab;
667
- background-image: linear-gradient(var(--tw-gradient-stops));
668
- }
669
658
  .novacon\:bg-gradient-to-r {
670
659
  --tw-gradient-position: to right in oklab;
671
660
  background-image: linear-gradient(var(--tw-gradient-stops));
@@ -891,14 +880,6 @@
891
880
  .novacon\:opacity-100 {
892
881
  opacity: 100%;
893
882
  }
894
- .novacon\:shadow-2xl {
895
- --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
896
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
897
- }
898
- .novacon\:shadow-lg {
899
- --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
900
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
901
- }
902
883
  .novacon\:shadow-sm {
903
884
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
904
885
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -1097,9 +1078,6 @@
1097
1078
  .novacon\:hover\:bg-\[var\(--tuwa-text-accent\)\]:hover {
1098
1079
  background-color: var(--tuwa-text-accent);
1099
1080
  }
1100
- .novacon\:hover\:bg-red-600:hover {
1101
- background-color: var(--novacon-color-red-600);
1102
- }
1103
1081
  .novacon\:hover\:text-\[var\(--tuwa-error-text\)\]:hover {
1104
1082
  color: var(--tuwa-error-text);
1105
1083
  }
@@ -184,9 +184,6 @@
184
184
  .novatx\:max-w-\[55\%\] {
185
185
  max-width: 55%;
186
186
  }
187
- .novatx\:max-w-\[200px\] {
188
- max-width: 200px;
189
- }
190
187
  .novatx\:min-w-0 {
191
188
  min-width: 0px;
192
189
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@tuwaio/sdk",
3
- "version": "0.1.14",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
5
  "author": "Oleksandr Tkach",
6
6
  "license": "Apache-2.0",
7
- "description": "Layer 8 (L8) of the TUWA Ecosystem. The Core SDK bundling logic and Nova UI components into clean subpath entrypoints.",
7
+ "description": "Layer 8 (L8) of the TUWA Ecosystem. One package for React apps: re-exports Orbit, Pulsar, Satellite Connect, SIWX and Nova UI Kit under subpaths, with their stylesheets. Add @tuwaio/evm-sdk or @tuwaio/solana-sdk for the chains.",
8
8
  "type": "module",
9
9
  "exports": {
10
10
  "./pulsar": {
@@ -42,6 +42,16 @@
42
42
  "import": "./dist/nova-connect-i18n.js",
43
43
  "require": "./dist/nova-connect-i18n.cjs"
44
44
  },
45
+ "./nova-connect/evm": {
46
+ "types": "./dist/nova-connect-evm.d.ts",
47
+ "import": "./dist/nova-connect-evm.js",
48
+ "require": "./dist/nova-connect-evm.cjs"
49
+ },
50
+ "./nova-connect/solana": {
51
+ "types": "./dist/nova-connect-solana.d.ts",
52
+ "import": "./dist/nova-connect-solana.js",
53
+ "require": "./dist/nova-connect-solana.cjs"
54
+ },
45
55
  "./nova-transactions": {
46
56
  "types": "./dist/nova-transactions.d.ts",
47
57
  "import": "./dist/nova-transactions.js",
@@ -127,12 +137,7 @@
127
137
  "i18n",
128
138
  "modal",
129
139
  "toast",
130
- "quasar",
131
- "cloud",
132
140
  "sdk",
133
- "cosmos",
134
- "playground",
135
- "cli",
136
141
  "siwx"
137
142
  ],
138
143
  "repository": {
@@ -151,41 +156,77 @@
151
156
  }
152
157
  ],
153
158
  "dependencies": {
154
- "@emotion/is-prop-valid": "^1.4.0",
155
159
  "@heroicons/react": "^2.2.0",
156
160
  "@radix-ui/react-dialog": "^1.1.23",
157
161
  "@radix-ui/react-select": "^2.3.7",
158
- "@tuwaio/nova-connect": "^0.6.0",
159
- "@tuwaio/nova-core": "^0.6.0",
160
- "@tuwaio/nova-transactions": "^0.6.0",
161
- "@tuwaio/orbit-core": "^0.3.0",
162
- "@tuwaio/pulsar-core": "^0.7.0",
163
- "@tuwaio/pulsar-react": "^0.5.0",
164
- "@tuwaio/satellite-core": "^0.5.0",
165
- "@tuwaio/satellite-react": "^0.5.0",
166
- "@tuwaio/siwx-core": "^0.3.0",
167
- "@tuwaio/siwx-react": "^0.3.0",
168
- "@tuwaio/siwx-server": "^0.3.0",
169
- "@web3icons/common": "^0.11.50",
170
- "@web3icons/react": "^4.1.21",
162
+ "@tuwaio/nova-connect": "^0.7.2",
163
+ "@tuwaio/nova-core": "^0.7.1",
164
+ "@tuwaio/nova-transactions": "^0.7.2",
165
+ "@tuwaio/orbit-core": "^0.3.1",
166
+ "@tuwaio/pulsar-core": "^0.8.2",
167
+ "@tuwaio/pulsar-react": "^0.6.1",
168
+ "@tuwaio/satellite-core": "^0.6.2",
169
+ "@tuwaio/satellite-react": "^0.6.2",
170
+ "@tuwaio/siwx-core": "^0.4.0",
171
+ "@tuwaio/siwx-react": "^0.4.0",
172
+ "@tuwaio/siwx-server": "^0.4.1",
173
+ "@web3icons/common": "^0.11.51",
174
+ "@web3icons/react": "^4.1.22",
171
175
  "clsx": "^2.1.1",
172
176
  "dayjs": "^1.11.23",
173
177
  "ethereum-blockies-base64": "^1.0.2",
174
- "framer-motion": "^13.2.0",
178
+ "framer-motion": "^13.4.6",
175
179
  "immer": "^11.1.18",
176
180
  "react-toastify": "^11.1.0",
177
- "tailwind-merge": "^3.6.0",
181
+ "tailwind-merge": "^3.7.0",
178
182
  "zustand": "^5.0.15"
179
183
  },
180
184
  "peerDependencies": {
181
185
  "react": ">=19.2.3",
182
- "react-dom": ">=19.2.3"
186
+ "react-dom": ">=19.2.3",
187
+ "@tuwaio/orbit-evm": ">=0.3",
188
+ "@tuwaio/orbit-solana": ">=0.3",
189
+ "@tuwaio/satellite-evm": ">=0.6",
190
+ "@tuwaio/satellite-solana": ">=0.6",
191
+ "@wagmi/core": "3.x.x",
192
+ "@wallet-standard/react": "1.x.x",
193
+ "viem": "2.x.x"
194
+ },
195
+ "peerDependenciesMeta": {
196
+ "@tuwaio/orbit-evm": {
197
+ "optional": true
198
+ },
199
+ "@tuwaio/orbit-solana": {
200
+ "optional": true
201
+ },
202
+ "@tuwaio/satellite-evm": {
203
+ "optional": true
204
+ },
205
+ "@tuwaio/satellite-solana": {
206
+ "optional": true
207
+ },
208
+ "@wagmi/core": {
209
+ "optional": true
210
+ },
211
+ "@wallet-standard/react": {
212
+ "optional": true
213
+ },
214
+ "viem": {
215
+ "optional": true
216
+ }
183
217
  },
184
218
  "devDependencies": {
185
- "react": "^19.2.8",
186
- "react-dom": "^19.2.8",
219
+ "@tuwaio/orbit-evm": "^0.3.2",
220
+ "@tuwaio/orbit-solana": "^0.3.3",
221
+ "@tuwaio/satellite-evm": "^0.6.1",
222
+ "@tuwaio/satellite-solana": "^0.6.1",
223
+ "@wagmi/core": "^3.6.5",
224
+ "@wallet-standard/react": "^1.0.3",
225
+ "react": "^19.3.0",
226
+ "react-dom": "^19.3.0",
187
227
  "tsup": "^8.5.1",
188
- "typescript": "6.0.3"
228
+ "typescript": "6.0.3",
229
+ "viem": "^2.57.1"
189
230
  },
190
231
  "scripts": {
191
232
  "start": "tsup --watch",