
Security News
Feross on the 10 Minutes or Less Podcast: Nobody Reads the Code
Socket CEO Feross Aboukhadijeh joins 10 Minutes or Less, a podcast by Ali Rohde, to discuss the recent surge in open source supply chain attacks.
@tetherto/wdk-uikit-react-native
Advanced tools
A set of reusable, stateless components for the WDK UI Kit.
A set of reusable, stateless components anyone can use to ship production-quality wallet or wallet-enabled apps fast.
To see it in action, please check the Wallet WDK React Native Starter, a complete wallet application built with WDK and WDK UI Kit.
This repository is part of the WDK (Wallet Development Kit) project, which empowers developers to build secure, non-custodial wallets with unified blockchain access, stateless architecture, and complete user control.
For detailed documentation about the complete WDK ecosystem, visit docs.wallet.tether.io.
ThemeProvider and useTheme APIcomponentVariants or fine-tune with componentOverridesnpm install @tetherto/wdk-uikit-react-native
Wrap your app with the theme and render a list.
import { ThemeProvider, lightTheme, TransactionList } from '@tetherto/wdk-uikit-react-native'
export default function App() {
const transactions = [{ id: '1', token: 'USDT', amount: '10.00', fiatAmount: '10.00', fiatCurrency: 'USD', network: 'Ethereum', type: 'received' }]
return (
<ThemeProvider initialTheme={lightTheme}>
<TransactionList transactions={transactions} />
</ThemeProvider>
)
}
Wire data from WDK into these UI components.
import * as React from 'react'
import WDK from '@tetherto/wdk'
import WalletManagerEvm from '@tetherto/wdk-wallet-evm'
import WalletManagerBtc from '@tetherto/wdk-wallet-btc'
import { ThemeProvider, lightTheme, Balance, CryptoAddressInput, AmountInput } from '@tetherto/wdk-uikit-react-native'
export function WalletScreen() {
const [balance, setBalance] = React.useState<number | null>(null)
const [error, setError] = React.useState<string | null>(null)
React.useEffect(() => {
async function bootstrap() {
try {
const wdkWithWallets = new WDK('your seed phrase')
.registerWallet('bitcoin', WalletManagerBtc, { provider: 'https://blockstream.info/api' })
const accounts = await wdkWithWallets.getAccount('bitcoin', 0)
const address = await accounts.getAddress()
const balance = await accounts.getBalance()
setBalance(balance)
} catch (e: any) {
setError(e?.message ?? 'Unknown error')
}
}
bootstrap()
}, [])
return (
<ThemeProvider initialTheme={lightTheme}>
<CryptoAddressInput onQRScan={() => {/** do something */}} />
<AmountInput
label="Enter Amount"
tokenSymbol="BTC"
value={amount}
onChangeText={setAmount}
tokenBalance={balance ?? '0'}
inputMode={'token'}
onUseMax={() => setAmount(balance ?? 0)}
/>
<Balance value={balance ?? 0} currency="BTC" />
</ThemeProvider>
)
}
| Component | Description |
|---|---|
AmountInput | Numeric input with token/fiat toggle, balance helper and Max action. |
AssetSelector | Token search & pick list with recent items and empty states. |
NetworkSelector | Network picker with gas level indicators and colors. |
Balance | Displays a balance value with optional masking and custom loader. |
CryptoAddressInput | Address input with QR scan and paste helpers, validation state. |
QRCode | QR renderer for addresses/payment requests with labeling and styling. |
TransactionItem | Single transaction row (sent/received) with token, amounts, network. |
TransactionList | Virtualized list of transactions using TransactionItem. |
SeedPhrase | Grid of seed words with optional editing and loading states. |
Each component exposes a typed, minimal API designed to work with WDK data models. Below are the primary props. For example usage, see the Quick Start and the Template Wallet.
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| label | string | no | 'Enter Amount' | Field label |
| value | string | yes | — | Amount text |
| onChangeText | (text: string) => void | yes | — | Called when text changes |
| tokenSymbol | string | yes | — | Token code, e.g. 'ETH' |
| tokenBalance | string | yes | — | Token balance (e.g. '1.23') |
| tokenBalanceUSD | string | yes | — | Balance in fiat (e.g. '$4200.00') |
| inputMode | 'token' | 'fiat' | yes | — |
| onToggleInputMode | () => void | yes | — | Switch token/fiat |
| onUseMax | () => void | yes | — | Fill with max amount |
| error | string | no | — | Error message |
| editable | boolean | no | true | Disable input when false |
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| tokens | Token[] | yes | — | Full list of tokens to display/filter |
| recentTokens | string[] | yes | — | Array of recent token names to show in the Recent row |
| onSelectToken | (t: Token) => void | yes | — | Called when user picks a token; disabled when hasBalance is false |
Token type:
type Token = {
id: string
symbol: string
name: string
balance: string
balanceUSD: string
icon: ImageSourcePropType
color: string
network?: string
hasBalance: boolean
}
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| value | number | no | 0 | Balance number |
| isLoading | boolean | no | false | Show loader state |
| Loader | React.ComponentType | no | — | Custom loader component |
| showHide | boolean | no | true | Toggle hide/show balance |
| currency | string | no | 'USD' | Currency label |
| EyeOpenIcon | React.ComponentType | no | default | Shown when hidden |
| EyeClosedIcon | React.ComponentType | no | default | Shown when visible |
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| label | string | no | 'Recipient Address' | Field label |
| value | string | yes | — | Address text |
| onChangeText | (text: string) => void | yes | — | Called when text changes |
| placeholder | string | no | 'T08p3BGPIuh1l934IIflu....Kc2GXhKc' | Hint text |
| onPaste | () => void | no | — | Paste action handler |
| onQRScan | () => void | no | — | Open QR scanner |
| editable | boolean | no | true | Disable input when false |
| error | string | no | — | Error message |
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| value | string | yes | — | Data to encode |
| size | number | no | 200 | QR side in px |
| color | string | no | theme.primary | Dot color |
| backgroundColor | string | no | 'transparent' | Background behind QR |
| label | string | no | — | Optional title above QR |
| containerStyle | ViewStyle | no | — | Wrapper style |
| labelStyle | any | no | — | Style for label |
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| transaction | { id: string; token: string; amount: string; fiatAmount: string; fiatCurrency: string; network: string; type: 'sent' | 'received' } | yes | — |
| onPress | () => void | no | — | Row press handler |
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| transactions | Transaction[] | yes | — | List of transactions |
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| networks | { id: string; name: string; gasLevel: 'High' | 'Normal' | 'Low'; gasColor: string; icon: string | any; color: string }[] |
| onSelectNetwork | (network: Network) => void | yes | — | Called when a network is chosen |
| Prop | Type | Required | Default | Notes |
|---|---|---|---|---|
| words | string[] | yes | — | Seed words list (12/24, etc.) |
| editable | boolean | no | false | Allow editing inputs |
| onWordChange | (index: number, word: string) => void | no | — | Called on word edit |
| onKeyPress | (index: number, key: string) => void | no | — | Handle key press (e.g. Backspace navigation) |
| isLoading | boolean | no | false | Show generating/loading state |
Use a built-in theme or create one from your brand. The theming system is lightweight and flexible:
lightTheme/darkTheme, or generate from brand colors via createThemeFromBranduseThemecomponentVariants and surgically with componentOverridesSee full guidance in THEME_USAGE.md.
import { ThemeProvider, darkTheme, createThemeFromBrand } from '@tetherto/wdk-uikit-react-native'
const brandTheme = createThemeFromBrand({
primaryColor: '#0F62FE',
secondaryColor: '#6F6F6F',
fontFamily: { regular: 'System', bold: 'System' },
}, 'light')
export function Root() {
return (
<ThemeProvider initialTheme={brandTheme /* or darkTheme */}>
{/* your UI */}
</ThemeProvider>
)
}
Key types: Theme, ThemeMode, ColorPalette, Typography, Spacing, BorderRadius, ComponentVariant, ComponentOverrides, BrandConfig.
Theme shape:
type Theme = {
mode: 'light' | 'dark' | 'auto'
colors: ColorPalette
typography: Typography
spacing: Spacing
borderRadius: BorderRadius
componentVariants?: ComponentVariant
componentOverrides?: ComponentOverrides
}
BrandConfig for createThemeFromBrand:
type BrandConfig = {
primaryColor: string
secondaryColor?: string
fontFamily?: {
regular?: string
medium?: string
semiBold?: string
bold?: string
}
}
Notes:
mode can be 'light', 'dark', or 'auto' (follows system settings).componentVariants sets default variants/styles per component key (e.g., AmountInput.default, TransactionItem.compact).componentOverrides enables targeted overrides for specific component parts (e.g., paddings, font sizes, colors).Key theme pieces at a glance:
| Token | Purpose |
|---|---|
colors | Brand palette and semantic UI colors. |
typography | Font families, sizes, weights. |
spacing | Consistent spacing scale for paddings/margins. |
borderRadius | Rounded corners scale. |
componentVariants | Default visual variants by component. |
componentOverrides | Fine-grained style overrides by component part. |
Check the WDK React Native Starter Wallet, a complete wallet application built with WDK and WDK UI Kit.
npm install
npm run lint
npm test
This project is licensed under the Apache-2.0 - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
For support, please open an issue on the GitHub repository.
FAQs
A set of reusable, stateless components for the WDK UI Kit.
The npm package @tetherto/wdk-uikit-react-native receives a total of 20 weekly downloads. As such, @tetherto/wdk-uikit-react-native popularity was classified as not popular.
We found that @tetherto/wdk-uikit-react-native demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh joins 10 Minutes or Less, a podcast by Ali Rohde, to discuss the recent surge in open source supply chain attacks.

Research
/Security News
Campaign of 108 extensions harvests identities, steals sessions, and adds backdoors to browsers, all tied to the same C2 infrastructure.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.