| name | dojo-wallets |
| description | Use when managing wallets and accounts in dojo.js games.
Triggers: burner wallet, useBurner, create wallet, connect wallet, BurnerProvider,
account management, predeployed, session wallet
|
Dojo.js Wallet & Account Management
When to Use
Use this skill when:
- Setting up burner wallets for development
- Managing player accounts
- Connecting external wallets
- Implementing account switching
BurnerProvider Setup
import { BurnerProvider, useBurner } from "@dojoengine/create-burner";
const burnerConfig = {
masterAddress: "0x...",
masterPrivateKey: "0x...",
accountClassHash: "0x...",
rpcUrl: "http://localhost:5050",
feeTokenAddress: "0x...",
};
function App() {
return (
<BurnerProvider initOptions={burnerConfig}>
<Game />
</BurnerProvider>
);
}
useBurner Hook
import { useBurner } from "@dojoengine/create-burner";
function AccountManager() {
const {
account,
isDeploying,
count,
create,
list,
select,
get,
clear,
listConnectors,
copyToClipboard,
applyFromClipboard,
generateAddressFromSeed,
} = useBurner();
return (
<div>
<p>Current: {account?.address}</p>
<button onClick={() => create()} disabled={isDeploying}>
{isDeploying ? "Creating..." : "New Burner"}
</button>
</div>
);
}
Creating Burners
const { create } = useBurner();
const newAccount = await create();
const deterministicAccount = await create({
secret: "my-secret-seed",
index: 0,
});
Listing & Selecting Burners
function BurnerSelector() {
const { list, select, account } = useBurner();
const burners = list();
return (
<select value={account?.address} onChange={(e) => select(e.target.value)}>
{burners.map((burner) => (
<option key={burner.address} value={burner.address}>
{burner.address.slice(0, 10)}...
</option>
))}
</select>
);
}
Starknet-React Integration
import { StarknetConfig, InjectedConnector } from "@starknet-react/core";
function Providers({ children }) {
const { listConnectors } = useBurner();
const connectors = [
new InjectedConnector({ options: { id: "argentX" } }),
new InjectedConnector({ options: { id: "braavos" } }),
...listConnectors(),
];
return <StarknetConfig connectors={connectors}>{children}</StarknetConfig>;
}
PredeployedConnector (Dev Mode)
For Katana predeployed accounts:
import {
PredeployedConnector,
usePredeployedAccounts,
} from "@dojoengine/predeployed-connector";
const predeployed = new PredeployedConnector({
rpcUrl: "http://localhost:5050",
accounts: [
{
address: "0x...",
privateKey: "0x...",
name: "Account 1",
},
],
});
Account Export/Import
Share burners between devices:
const { copyToClipboard, applyFromClipboard } = useBurner();
await copyToClipboard();
await applyFromClipboard();
Deterministic Addresses
Generate addresses without deploying:
const { generateAddressFromSeed } = useBurner();
const address = generateAddressFromSeed({
secret: "game-specific-seed",
index: playerIndex,
});
WithAccount HOC
Require account connection:
import { WithAccount } from "@dojoengine/sdk/react";
const ProtectedComponent = WithAccount(
({ account, address }) => <div>Connected: {address}</div>,
() => <div>Please connect wallet</div>,
);
Full Provider Hierarchy
function App() {
return (
<StarknetConfig connectors={connectors}>
<BurnerProvider initOptions={burnerConfig}>
<DojoSdkProvider sdk={sdk} dojoConfig={config}>
<Game />
</DojoSdkProvider>
</BurnerProvider>
</StarknetConfig>
);
}
Common Pitfalls
- Master account funding: Ensure master account has enough ETH to deploy burners
- Class hash mismatch: Use correct account class hash for your Starknet version
- Provider order: BurnerProvider should wrap DojoSdkProvider if using both
- Local storage: Burners persist in localStorage - clear for fresh start
- RPC URL mismatch: Ensure all configs point to same network