Developers
Standard wallet APIs. No new patterns.
Robeon implements EIP-1193 and EIP-6963. Integrate with the same provider interfaces your dApp already uses.
Live demo
Test the connection in your browser.
Detect Robeon, request an account, and walk through the same approval flow your users see.
Live demo
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
- Open the Robeon extension (popup or side panel).
- Go to Settings.
- Open Connected apps.
- 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' });Code examples
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 sessionProvider 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)],
});Integration flow
Detect, connect, sign. Three steps.
Use the wallet patterns you already rely on for Ethereum-compatible dApps.
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.
Request accounts
Call eth_requestAccounts. The user approves in the extension side panel before any account is shared.
Sign and send
Use personal_sign, eth_signTypedData_v4, and eth_sendTransaction: same patterns as MetaMask-compatible wallets.
Networks
Supported chains
| Network | Chain ID | Hex |
|---|---|---|
| Robinhood Mainnet | 4663 | 0x1237 |
| Robinhood Testnet | 46630 | 0xb636 |
| Ethereum | 1 | 0x1 |
| Arbitrum | 42161 | 0xa4b1 |
| Base | 8453 | 0x2105 |
| Polygon | 137 | 0x89 |
| Optimism | 10 | 0xa |
Provider API
Supported EIP-1193 methods
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.