diff --git a/docs/pages/onramp/smart-routing-address/react-ui.mdx b/docs/pages/onramp/smart-routing-address/react-ui.mdx new file mode 100644 index 0000000..d204855 --- /dev/null +++ b/docs/pages/onramp/smart-routing-address/react-ui.mdx @@ -0,0 +1,128 @@ +# Smart Routing Address React UI + +`@zerodev/smart-routing-address-react-ui` is a drop-in deposit UI for +[Smart Routing Address](/onramp/smart-routing-address): a provider that creates +and caches the routing address, a prebuilt deposit screen, and hooks that +connect the screen to your app. To build your own deposit UI instead, use the +[SDK](/onramp/smart-routing-address/quickstart). + +## Installation + +Install the package alongside its peer dependencies: + +:::code-group + +```bash [npm] +npm i @zerodev/smart-routing-address-react-ui viem +``` + +```bash [yarn] +yarn add @zerodev/smart-routing-address-react-ui viem +``` + +```bash [pnpm] +pnpm add @zerodev/smart-routing-address-react-ui viem +``` + +```bash [bun] +bun add @zerodev/smart-routing-address-react-ui viem +``` + +::: + +`@zerodev/smart-routing-address` ships with the package — add it as a direct +dependency only if you import from it, such as `createCall` for custom +`actions`. + +Import the stylesheet once at your app entry: + +```tsx +import '@zerodev/smart-routing-address-react-ui/styles.css' +``` + +## Usage + +Wrap the subtree with `SmartRoutingAddressProvider` and render +`` where the deposit UI should appear. On mount it +creates the routing address for `recipient` and shows the deposit screen — +the address with a QR code, the supported source tokens with fee estimates, +and the deposits as they arrive. Past deposits and per-deposit transaction +details are built-in steps. + +```tsx +import { + SmartRoutingAddress, + SmartRoutingAddressProvider, +} from '@zerodev/smart-routing-address-react-ui' +import { arbitrum } from 'viem/chains' + +function DepositModal({ userAddress, onClose }) { + return ( + + + + ) +} +``` + +The provider holds the config and the lazily created address; the screen is +rendered inline by you, so it fits any surface — a modal, a drawer, or a page. + +## Config + +`SmartRoutingAddressProvider` takes a single `config`: + +| Option | Type | Description | +| --- | --- | --- | +| `targetChainId` | `number` | Chain id where funds settle. Required. | +| `projectId` | `string` | ZeroDev project id; when non-empty it is appended to the server URL for every request. | +| `version` | `SmartRoutingAddressVersion` | Smart routing address version. Defaults to the latest stable. | +| `actions` | `CreateSmartRoutingAddressParams['actions']` | Destination actions per token type. When omitted, funds are simply transferred to the recipient. | +| `slippage` | `number` | Max slippage in basis points (`50` = 0.5%). | +| `baseUrl` | `string` | Override the smart routing address server root URL; the `projectId` is appended to it. | + +## Props + +| Prop | Type | Description | +| --- | --- | --- | +| `recipient` | `Address` | Recipient the routing address is created for. Required. | +| `onClose` | `() => void` | Called when the top-right × button is clicked. Required. | +| `size` | `'sm' \| 'md' \| 'lg'` | Card size. | +| `className` | `string` | Extra classes for the card. | + +## Hooks + +The hooks connect your app to the prebuilt screen: read the state it shows, +or create the address before it opens. Both read from +`SmartRoutingAddressProvider`. For a fully custom deposit UI, use the +[SDK](/onramp/smart-routing-address/quickstart) directly instead. + +### useSmartRoutingAddress + +Read the screen's state from anywhere inside the provider: + +```tsx +const { addressState, activeRoute } = useSmartRoutingAddress() +``` + +- `addressState` — `idle`, `loading`, `success` (with the `address` and fee + estimates), or `error`. +- `activeRoute` — the source token, chain, and estimated fee the deposit UI + currently shows; `null` until a selection exists. The screen's token picker + owns the selection — use `activeRoute` to mirror it elsewhere, such as + analytics. + +### useCreateSmartRoutingAddress + +Get the deposit address, creating it when it doesn't exist yet — call it +early, before the deposit UI is opened, and the screen opens with the +address already there: + +```tsx +const { getOrCreateAddress } = useCreateSmartRoutingAddress() +const address = await getOrCreateAddress(recipient) +``` + +Repeat and concurrent calls for the same recipient share one request, so +calling it on hover or on page entry is safe. The promise rejects when +creation fails; the same failure also lands in `addressState`. diff --git a/vocs.config.tsx b/vocs.config.tsx index ad3cd42..df8136e 100644 --- a/vocs.config.tsx +++ b/vocs.config.tsx @@ -308,6 +308,10 @@ export default defineConfig({ text: "Quickstart", link: "/onramp/smart-routing-address/quickstart", }, + { + text: "React UI", + link: "/onramp/smart-routing-address/react-ui", + }, { text: "Fetching Status", link: "/onramp/smart-routing-address/fetching-status",