Skip to content

About

Cross-chain payments with Simple UX

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Repository files navigation

Intent Pay

Rozo Intent Pay enables seamless crypto payments for your app. Onboard users from any chain, any coin into your app with one click and maximize your conversion.

Quickstart — Get your appId and run a payment

Every payment takes a required appId. You do not need to email anyone or wait for approval to get one — appId is a namespace string you choose to group your transactions in the Rozo dashboard.

There are two ways to get going:

1. Try it now with the public sandbox appId

Use the shared sandbox appId rozoSandbox to run the SDK end-to-end immediately, no signup required:

"use client";
import { RozoPayButton } from "@rozoai/intent-pay";

<RozoPayButton
  appId="rozoSandbox"          // public shared sandbox — testing only
  toChain={8453}               // Base
  toAddress="0xRecipient..."   // your receiving address
  toToken="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" // USDC on Base
  toUnits="1"                  // display amount, in USDC (string, not base units)
  intent="Pay"
  preferredSymbol={["USDC", "USDT"]}
  onPaymentCompleted={(e) => console.log("done", e.paymentId)}
/>

rozoSandbox is a shared, public sandbox namespace meant only for trying the SDK out. Do not use it in production — transactions under it are co-mingled with everyone else's test traffic and the namespace may be cleared at any time. Switch to your own appId (below) before you ship.

2. Get a production appId + API key (self-serve, no approval)

When you're ready for production — your own namespace, webhook events, branded checkout, and API-key auth — self-register through the Rozo merchant portal. It's a 2-minute, fully self-serve flow (email OTP → pick a slug → done). No human approval step:

  1. Open the Rozo Partners portal and enter your email; you'll get a 6-digit code.
  2. Choose "Wallet (Dapp developer)" as the account type (developers don't need to provide a settlement wallet — that's only for merchants).
  3. Pick a slug (e.g. coffee-studio). The portal derives your appId automatically: wallet_<slug> (or merchant_<slug> for merchant accounts).
  4. You're dropped into Settings → API Keys, where you issue your first rz_live_... API key (shown once — copy it). Pass it as the X-API-Key header when your appId uses a portal-issued prefix.

That's the whole loop — no email to support, no domain whitelisting request.

Minimal end-to-end (provider → button → result)

npm install @rozoai/intent-pay @rozoai/intent-common \
  @tanstack/react-query wagmi viem \
  @creit.tech/stellar-wallets-kit @stellar/stellar-sdk
// providers.tsx — wrap your app once (see docs/PROVIDER_SETUP.md for SSR details)
"use client";
import { getDefaultConfig, RozoPayProvider } from "@rozoai/intent-pay";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { useState } from "react";
import { createConfig, WagmiProvider } from "wagmi";

export function Providers({ children }: { children: React.ReactNode }) {
  const [config] = useState(() =>
    createConfig(getDefaultConfig({
      appName: "Your App",
      ssr: true,
      // Optional: Base builder code attribution (https://docs.base.org/apps/builder-codes)
      // dataSuffix: Attribution.toDataSuffix({ codes: [process.env.NEXT_PUBLIC_BASE_BUILDER_CODE] }),
    })));
  const [qc] = useState(() => new QueryClient());
  return (
    <WagmiProvider config={config}>
      <QueryClientProvider client={qc}>
        <RozoPayProvider>{children}</RozoPayProvider>
      </QueryClientProvider>
    </WagmiProvider>
  );
}

Then drop a <RozoPayButton appId="rozoSandbox" ... /> (snippet above) anywhere inside the provider and read the result from onPaymentCompleted, or poll with the useRozoPayStatus() hook / getPayment(id) on your backend.

Embedding inside a wallet's in-app browser (Base App, MetaMask, Phantom)? ssr: true alone does not eliminate the auto-connect flash on first load — you also need cookie-persisted initialState. See PROVIDER_SETUP.md § Minimizing the Wallet Reconnect Flash (required, not optional, for this use case).

Result truth lives on the backend. Treat onPaymentCompleted as a UI hint and confirm settlement server-side (webhook or getPayment) before fulfilling.

Native source tokens (ETH / BNB / POL / SOL / XLM)

Native gas tokens are payment sources, not native destination payouts. Your merchant appId must have that source chain's native asset enabled by Rozo (ETH@8453, BNB@56, POL@137, SOL@900); an unsupported or unavailable route stays hidden. XLM uses a separate backend policy. A native option also needs a nonzero wallet balance and a usable price. The deposit-address picker asks for the same merchant appId independently of wallet options.

preferredTokens is a hard allowlist: if you supply only USDC/USDT, native sources will not show even when available. Omit it to use SDK defaults, or include native source tokens explicitly:

import { baseETH, baseUSDC, solanaSOL } from "@rozoai/intent-common";

<RozoPayButton
  appId="your-opted-in-app-id"
  toChain={8453}
  toToken={baseUSDC.token}
  toAddress="0xRecipient..."
  toUnits="1"
  preferredTokens={[baseUSDC, baseETH, solanaSOL]}
/>

baseETH.token is common's zero-address native marker; the SDK matches it against the proxy's EVM 0xEeee… source sentinel. solanaSOL.token is the System Program (11111111111111111111111111111111), not wrapped SOL (So111…12). Token options remain subject to merchant opt-in and backend quote support; showing an option does not guarantee a route can settle. See native-token rollout plan for staging checks.

Features

  • 🌱 Cross-chain payments from 1000+ tokens in under 1 minute.
  • 💡 Single transaction — no multiple wallet steps.
  • ⚡️ Permissionless — we never hold funds.
  • 💱 Works with major wallets and exchanges.
  • 💨 Integrate in minutes, minimal code required.

Supported Infrastructure

Supported Wallets

EVM Wallets: MetaMask, Coinbase Wallet, Trust Wallet, Rainbow Wallet, Family Wallet, Zerion, OKX, Bitget

Solana Wallets: Phantom, Backpack, Solflare

Stellar Wallets: Albedo, Freighter, Hot Wallet, etc. (Refer to: https://stellarwalletskit.dev/#compatible-wallets)

Mobile Wallets: All above wallets with mobile app support and deep-linking

Supported Chains

For a complete list of supported tokens and chains, see the Supported Tokens and Chains documentation.

Documentation

You can find the full Rozo Pay documentation at docs.rozo.ai.

For in-repo SDK prop reference, see RozoPayButton Props.

For correct provider setup (Next.js App Router, Vite, SSR patterns), see Provider Setup Guide.

For analytics, telemetry opt-out, and what data is tracked, see Analytics & Telemetry.

Examples

Check out complete examples and code snippets at Complete Examples, including:

  • Framework-specific examples (Next.js, Vite/CRA)
  • Use case examples (E-commerce checkout, Donation component, Stellar payout)
  • Complete code examples ready to copy-paste

You can also check out the Next.js example app in this repository.

Demo

Check out our Demo Page at demo.rozo.ai

You can also try the intent-based bridge built with this SDK at intents.rozo.ai/bridge.

Local Development

Clone the repository and build the SDK in dev mode:

git clone https://github.com/RozoAI/intent-pay.git
cd intent-pay/packages/connectkit
pnpm i
pnpm run dev

The rollup bundler will now watch file changes in the background. Try using one of the examples for testing:

cd examples/nextjs-app
pnpm i
pnpm run dev

Any changes will be reflected on the Pay button in the example app.

Contracts

Daimo Pay is noncustodial and runs on open-source, audited contracts. See packages/contract.

Audits:

Support

Contact us if you'd like to integrate Rozo Pay.

License

See LICENSE for more information.

Credits

Rozo Intent Pay SDK is a fork of Daimo developed by Daimo. We're grateful to them for making cross chain payment fast, simple and open-source.

Daimo Pay SDK is a fork of Connectkit developed by Family. We're grateful to them for making Connectkit fast, beatiful and open-source.

Release

Prepare releases on a clean branch containing current origin/master, then merge the generated release commit through a pull request. Script runs lint/tests and updates version; stable releases also add a CHANGELOG.md entry. CI is sole npm publisher after a tag on merged master.

# Validate Git state, npm version, and release plan without changing files.
pnpm run publish:latest -- --dry-run

# Prepare latest release files for a release PR.
pnpm run publish:latest

# Prepare next beta (patch bump plus beta prerelease) for a release PR.
pnpm run publish:beta

# After release PR merges, update local master and tag it. CI publishes with latest or beta tag.
git switch master
git pull --ff-only origin master
git tag v<version>
git push --atomic origin v<version>

--dry-run performs only preflight. Script never commits, tags, pushes, or publishes. CI verifies tag matches package version and targets master before publishing; prereleases publish with npm beta tag. intent-common is published separately when its source/API changes; publish it before intent-pay and update intent-pay's dependency pin.

About

Cross-chain payments with Simple UX

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages