Standard wallet APIs. No new patterns.

Robeon implements EIP-1193 and EIP-6963. Integrate with the same provider interfaces your dApp already uses.

provider.ts
// EIP-1193 provider
const accounts = await window.robeon.request({
method: 'eth_requestAccounts'
});

Test the connection in your browser.

Detect Robeon, request an account, and walk through the same approval flow your users see.

Connect from this page

Requires the Robeon extension. Approvals open in the side panel: the same flow your users see when connecting a dApp.

Extension: Not installed

Wallets detected (EIP-6963): 0

How to remove a dApp connection

On this page

Tap Disconnect wallet above to revoke this site's permission. The next connect will ask for approval again in the side panel.

Inside Robeon Wallet

  1. Open the Robeon extension (popup or side panel).
  2. Go to Settings.
  3. Open Connected apps.
  4. Remove a site with the trash icon, or tap Revoke on individual permissions.

Only approve sites you trust. Revoke connections you no longer use: especially after testing on developer pages like this one.

Direct connect (EIP-1193)

// 1. Prefer dedicated Robeon provider (avoids MetaMask conflicts)
const provider = window.robeon;

if (!provider?.isRobeon) {
  throw new Error('Install Robeon Wallet extension');
}

// 2. Connect: user approves in the extension side panel
const accounts = await provider.request({
  method: 'eth_requestAccounts',
});

const chainId = await provider.request({ method: 'eth_chainId' });
console.log({ account: accounts[0], chainId });

Multi-wallet picker (EIP-6963)

const providers = new Map();

window.addEventListener('eip6963:announceProvider', (event) => {
  const { info, provider } = event.detail;
  providers.set(info.rdns, { info, provider });
});

window.dispatchEvent(new Event('eip6963:requestProvider'));

const robeon = providers.get('com.robeon.wallet');
await robeon.provider.request({ method: 'eth_requestAccounts' });

Connect, sign in, and listen for changes.

Copy-paste patterns for the wallet flows Robeon supports today.

Side panel best practice

Do not open the extension side panel manually before eth_requestAccounts or personal_sign. Let the provider request trigger approvals: Robeon opens the side panel automatically. Manual opens can race the approval router and skip the sign step after connect.

Sign-in flow (connect + personal_sign)

const provider = window.robeon;
if (!provider?.isRobeon) {
  throw new Error('Install Robeon Wallet extension');
}

// Step 1: connect (user approves in side panel)
const accounts = await provider.request({
  method: 'eth_requestAccounts',
});
const address = accounts[0];
if (!address) throw new Error('No account returned');

// Step 2: brief settle so connect approval resolves before sign
await new Promise((resolve) => setTimeout(resolve, 280));

// Step 3: verify ownership (second approval in same side panel)
const message = [
  'Sign in to Your App',
  '',
  `Domain: ${window.location.origin}`,
  `Account: ${address}`,
  `Timestamp: ${new Date().toISOString()}`,
].join('\n');

const signature = await provider.request({
  method: 'personal_sign',
  params: [message, address],
});

// Verify signature on your backend before creating a session

Provider events

const provider = window.robeon;

function onAccountsChanged(accounts) {
  console.log('Active account changed', accounts[0]);
}

function onChainChanged(chainId) {
  console.log('Network changed', chainId);
}

provider.on?.('accountsChanged', onAccountsChanged);
provider.on?.('chainChanged', onChainChanged);

// Clean up when your component unmounts
provider.removeListener?.('accountsChanged', onAccountsChanged);
provider.removeListener?.('chainChanged', onChainChanged);

Typed data (EIP-712)

const provider = window.robeon;
const address = (await provider.request({ method: 'eth_accounts' }))[0];

const typedData = {
  domain: {
    name: 'Your dApp',
    version: '1',
    chainId: 4663,
  },
  types: {
    Permit: [
      { name: 'owner', type: 'address' },
      { name: 'spender', type: 'address' },
      { name: 'value', type: 'uint256' },
    ],
  },
  primaryType: 'Permit',
  message: {
    owner: address,
    spender: '0x…',
    value: '1000000000000000000',
  },
};

const signature = await provider.request({
  method: 'eth_signTypedData_v4',
  params: [address, JSON.stringify(typedData)],
});

Detect, connect, sign. Three steps.

Use the wallet patterns you already rely on for Ethereum-compatible dApps.

01

Detect the provider

Content script injects window.robeon with isRobeon: true. For multi-wallet UIs, listen to EIP-6963 and filter by rdns com.robeon.wallet.

02

Request accounts

Call eth_requestAccounts. The user approves in the extension side panel before any account is shared.

03

Sign and send

Use personal_sign, eth_signTypedData_v4, and eth_sendTransaction: same patterns as MetaMask-compatible wallets.

Supported chains

NetworkChain IDHex
Robinhood Mainnet46630x1237
Robinhood Testnet466300xb636
Ethereum10x1
Arbitrum421610xa4b1
Base84530x2105
Polygon1370x89
Optimism100xa
SDK roadmap

Typed helpers coming soon.

An official Robeon SDK is planned for connection, signing, and Robinhood Chain utilities. Today, use EIP-1193 and EIP-6963 directly: no SDK required.