Sign In

@ramp-kit/react

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ramp-kit/react

React onramp widget and hooks for LATAM ramps on Stellar: 3-step embeddable flow with live quote countdown, PIX/SPEI deposit instructions and order tracking to settlement, over any @ramp-kit/core provider

latest
Source
npmnpm
Version
0.1.5
Version published
Weekly downloads
25
-94.78%
Maintainers
1
Weekly downloads
 
Created
Source

@ramp-kit/react

Drop-in React UI for LATAM fiat on/off-ramps on Stellar. Embeds a complete onramp flow — live quote with countdown, PIX/SPEI deposit instructions, order tracking to settlement — on top of any @ramp-kit/core provider (Etherfuse, Manteca, or the built-in mock).

Install

npm install @ramp-kit/core @ramp-kit/react

React ≥ 18 is a peer dependency.

<RampWidget />

import { EtherfuseProvider } from "@ramp-kit/core";
import { RampWidget } from "@ramp-kit/react";

const provider = new EtherfuseProvider({ apiKey, environment: "sandbox" });

<RampWidget
  provider={provider}
  customerId={orgId}
  fiatCurrency="BRL"
  network="stellar"
  walletAddress={userWallet}
  assets={await provider.listAssets("stellar", { currency: "brl" })}
  onOrderCreated={(id) => console.log("order", id)}
  onSettled={(id) => console.log("funds delivered", id)}
/>;

The widget walks the user through a 3-step flow:

  • Amount — amount + asset selection, live quote with expiry countdown that re-quotes automatically when the provider's price expires.
  • Deposit — rail-aware instructions (PIX charge vs. SPEI CLABE) with a live status indicator polled until terminal state.
  • Done — conversion summary and on-chain transaction hash.

Props

PropTypeDescription
providerRampProviderAny @ramp-kit/core provider instance
customerIdstringProvider-side customer id (org UUID for Etherfuse, userAnyId for Manteca)
fiatCurrency"BRL" | "MXN" | …Fiat leg of the ramp
direction"onramp" | "offramp"Buy (default) or sell flow
networkNetworkSettlement network (default "stellar")
walletAddressstring?Destination wallet (onramp) / source wallet (offramp)
payoutDestination{ address: string }?Offramp fiat payout account (CBU/CLABE/IBAN/PIX key). Required for Manteca offramps
assetsRampAsset[]Assets to offer (from provider.listAssets())
signer(xdr, passphrase) => Promise<string>Wallet signing callback for offramps (Freighter, hardware, local key)
environment"testnet" | "mainnet" | "sandbox" | "production"Network the flow runs on. Derives stellarConfig, picks the explorer, and warns on a provider mismatch
stellarConfigStellarConfigExplicit signing network — overrides environment. Use stellarConfigFor(...)
theme"light" | "dark" | RampThemeColor/radius/font tokens (default "light")
size"sm" | "md"Compact or default spacing (default "md")
showStepperbooleanShow the numbered step header (default true)
classNamestring?Extra class on the root, alongside rk-widget
styleCSSProperties?Inline styles merged onto the root (wins over the theme)
labelsPartial<RampLabels>Override any visible copy (steps, statuses, buttons) — e.g. for i18n
localestringBCP-47 locale for amount formatting (default "en-US")
onOrderCreated(orderId) => voidFired when the order is accepted
onSettled(orderId) => voidFired when funds are delivered
onQuote(quote) => voidFired whenever a fresh quote arrives
onStepChange(step) => voidFired when the flow advances between steps
onError(error, context) => voidFired on any error, tagged "quote" | "order" | "sign"

Theming

Every color, radius and font is a --rk-* CSS variable. Pass a theme preset or a token set — set only what you want; the rest keep their defaults:

<RampWidget
  {...props}
  theme={{
    background: "#0b1e2d",
    surface: "#12293b",
    text: "#e6f1f7",
    primary: "#38bdf8",
    primaryText: "#04222f",
    accent: "#34d399",
    radius: 16,
  }}
/>;

theme="dark" ships a full dark palette. You can also override the --rk-* variables (or the rk-widget / rk-quote / rk-deposit / rk-done classes) from your own CSS. Translate the copy with labels:

<RampWidget
  {...props}
  locale="pt-BR"
  labels={{
    steps: { amount: "Valor", deposit: "Transferência", done: "Pronto" },
    youPay: "Você paga",
    youReceive: "Você recebe",
    continueButton: "Continuar",
  }}
/>;

Sell flow (offramp) with Freighter

import { signTransaction } from "@stellar/freighter-api";
import { stellarConfigFor } from "@ramp-kit/core";

<RampWidget
  provider={provider}
  customerId={orgId}
  direction="offramp"
  fiatCurrency="BRL"
  walletAddress={userAddress}
  assets={assets}
  signer={async (xdr, networkPassphrase) => {
    const res = await signTransaction(xdr, { networkPassphrase, address: userAddress });
    return res.signedTxXdr;
  }}
  stellarConfig={stellarConfigFor("sandbox")}
/>;

The widget renders an in-widget "Sign & send" step, recovers automatically from expired provider transactions (tx_too_late → regenerate → re-sign), and links the settlement transaction on Stellar Expert.

Styling: theme tokens via the theme prop or --rk-* CSS variables, plus rk- class hooks (rk-widget, rk-quote, rk-deposit, rk-done).

Going to production (testnet → mainnet)

Once you hold production credentials (see the checklist below), flipping to mainnet is a single value used in two places — the provider and the widget:

import { EtherfuseProvider } from "@ramp-kit/core";

// One flag drives everything. "production" and "mainnet" are equivalent here.
const environment = "production";

const provider = new EtherfuseProvider({
  apiKey: process.env.ETHERFUSE_API_KEY!, // production key
  environment,                            // flips the API base URL to mainnet
  baseUrl: "https://api.myapp.com/ramp/etherfuse", // your @ramp-kit/server
});

<RampWidget
  provider={provider}
  environment={environment}   // derives mainnet Horizon + passphrase + explorer
  customerId={realCustomerId}
  fiatCurrency="BRL"
  walletAddress={userWallet}
  assets={await provider.listAssets("stellar")}
/>;

Pass the same environment to the provider and the widget. If they differ, the widget logs a console warning so a testnet UI never signs against mainnet funds by accident. Omit environment and it stays on testnet (default).

The switch is code; it doesn't create the credentials. Working on mainnet also requires, per provider (one-time, outside the SDK):

  • Etherfuse: production KYB approval → api_prod_… key; real registered bank accounts (real CLABE/RFC/PIX); real end-user KYC (no sandbox auto-approve).
  • Manteca: commercial onboarding → production md-api-key, per-country permissions, real onboarded users.
  • Stellar: the wallet must be on the Public network with real XLM for fees and reserves. The kit already prices fees dynamically and fee-bumps under congestion, so mainnet submission is handled.

Full operational checklist: skills/ramp-kit/references/production.md in the repo.

Hooks (build your own UI)

import { useQuote, useOrder } from "@ramp-kit/react";

// Live quote that refreshes itself when it expires
const { quote, loading, error, secondsLeft, refresh } = useQuote(provider, {
  direction: "onramp",
  fiatCurrency: "BRL",
  assetIdentifier: usdc.identifier,
  network: "stellar",
  sourceAmount: "100",
  customerId,
});

// Order polling that stops at settled/failed/cancelled
const { order, polling } = useOrder(provider, orderId);

Instant development with the mock provider

import { MockProvider } from "@ramp-kit/core";

// Realistic lifecycle without credentials; auto-funds orders after 4s
const provider = new MockProvider({ autoFundMs: 4000 });

Two demo apps (a full sandbox demo on Stellar Testnet and a second minimal integration) live in the latam-ramp-kit repository.

AI tooling

Building this integration with an AI coding agent? Install the kit's agent skill (npx skills add https://github.com/armandocodecr/latam-ramp-kit/tree/main/skills/ramp-kit) and the @ramp-kit/mcp MCP server — the agent gets integration knowledge, verified troubleshooting, and live tools to quote and test orders against the sandbox.

MIT © Armando Cruz

Keywords

stellar

FAQs

Package last updated on 19 Aug 2026

Did you know?

Socket

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.

Install

Related posts