Skip to main content
@chipi-stack/starknet-connector is a starknet-react / get-starknet connector. A dApp adds one line and its users can connect with their Chipi wallet — a passkey smart-account that signs gasless through the paymaster. No browser extension, no WalletConnect; the same hosted-wallet model Argent/Ready’s “Web Wallet” and Cartridge Controller use.
This is how Starknet dApps actually connect — via the get-starknet / starknet-react connector interface, not WalletConnect (which is draft/unused on Starknet).

Install

npm install @chipi-stack/starknet-connector

Add the connector

import { StarknetConfig, publicProvider } from "@starknet-react/core";
import { mainnet } from "@starknet-react/chains";
import { ChipiConnector } from "@chipi-stack/starknet-connector";

const connectors = [
  new ChipiConnector(), // "Connect with Chipi"
  // ...argent(), braavos(), etc.
];

export function Providers({ children }) {
  return (
    <StarknetConfig chains={[mainnet]} provider={publicProvider()} connectors={connectors}>
      {children}
    </StarknetConfig>
  );
}
Your existing useConnect / useAccount flow now offers Connect with Chipi, and account.signMessage(...) / account.execute(...) route to the user’s Chipi wallet — gasless, signed with their passkey.

How it works

your dApp                          Chipi hosted wallet (connect.chipipay.com)
─────────                          ──────────────────────────────────────────
ChipiConnector.connect()
  ├─ opens a popup ──────────────►  /connect  (the user's authenticated wallet)
  └─ postMessage  ◄────────────►    approval UI (passkey + gasless paymaster)
account.execute(calls)
  └─ wallet_addInvokeTransaction ─►  user approves ─► sponsored tx ─► tx hash
  1. ChipiConnector is transport only — it opens the hosted wallet in a popup and forwards get-starknet wallet_* RPC calls over postMessage. It holds no keys and signs nothing itself.
  2. The hosted wallet (/connect) authenticates the user, renders a decoded approval for every connect / sign / execute, then runs the real passkey + paymaster path and posts the result back.
  3. connector.account(provider) wraps the channel in a starknet.js WalletAccount, so the dApp sees a standard AccountInterface.

The approval & security model

The hosted wallet — not the dApp — owns approval, and it decodes what’s being signed so the user is never blind-signing:
  • Connect shows the dApp’s origin + the address being shared, and the user must approve (never automatic).
  • Execute decodes calls against known tokens into human intent — “Approve spending 10 USDC to 0x…” with a loud UNLIMITED badge over the threshold, “Send 5 USDC to 0x…”, or an explicit “Unrecognized contract” warning (it never invents intent). Gas reads “Free · covered by Chipi”.
  • signTypedData decodes the SNIP-12 message into labeled fields and highlights spend-authorization keys (spender / amount / deadline). Typed data it can’t read is hard-blocked — the user can’t blind-sign it. (Research attributes 56.7% of 2024’s $494M in wallet drains to blind-signed permit-style typed data; this discipline closes that vector.)

Try the example

A runnable starknet-react example lives in the repo: examples/connect-with-chipi. It connects, signs typed data, and runs a gasless execute against a local Chipi wallet — the full round-trip.

Options

new ChipiConnector({
  walletUrl: "https://connect.chipipay.com", // hosted wallet base URL (default)
  id: "chipi",
  name: "Connect with Chipi",
  icon: "data:image/svg+xml;base64,...",
});

Compatibility & limits

  • @starknet-react/core >= 3 (peer) · starknet >= 8.1.2 (peer).
  • Starknet mainnet — pass a mainnet provider.
  • Popup-based (external dApps). An in-app-browser (“parent”) mode is in the transport but not yet exposed.
  • One approval at a time; a dApp that fires two prompts truly simultaneously has its second request rejected (most dApps serialize).