That happened to me last year. I was all excited to deploy some contracts, but nope - no account, no action. Starknet's different from Ethereum. You can't just connect MetaMask and go. You gotta deploy an account contract first. It's like setting up your own little wallet on chain. Kinda weird at first, but once it's done? Smooth sailing.
So this guide's for you if you're staring at your terminal thinking, "How do I even start?" We'll go step by step, mostly using the easiest way - Starknet Foundry's sncast tool. It's CLI based, free, and dead simple. I'll throw in wallet options too, since some folks prefer browsers. And yeah, we'll hit testnets like Sepolia, 'cause mainnet costs real STRK.
In my experience, deployment fees run about 0.01-0.05 STRK on testnet right now. Super cheap. But prefund wrong, and it'll fail. We'll cover that.
Start with CLI. Trust me. Install Foundry first - it's like curl -L https://github.com/foundry rs/starknet foundry/releases | bash or whatever their latest says. Then foundryup. Boom, ready.
Don't blow testnet tokens learning. Fire up a local Starknet Devnet. It's free ETH/STRK forever.
Okay, open terminal. Run this:
starknet devnet --seed 0 Leave it running. Grabs port 5050. Now import a predeployed account - no deployment hassle.
sncast account import --url http://127.0.0.1:5050 --address 0x064b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691 --private 0x0000000000000000000000000000000071d7bb07b9a64f6f78ac4c816aff4da9 --type oz --add profile devnet --silentsncast --profile devnet balance --address 0x064b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691. Should show funds.Why devnet? Zero risk. Mess up? Restart with --seed 0 for same accounts. Sound familiar? It's like Ganache but for Starknet.
To prove it works. Assume you got a simple Cairo contract like HelloStarknet. Declare it:
sncast --profile devnet declare --contract name HelloStarknet
Grab the class hash from output, say 0x51e0d3b26fb79035afdc64d2214eb18291629b4f2ef132e79c3f3fbe1ba57c4.
Deploy: sncast --profile devnet deploy --class hash 0x51e0d3b26fb79035afdc64d2214eb18291629b4f2ef132e79c3f3fbe1ba57c4 --salt 0. Done. Interact with sncast invoke. Local party's over? Kill devnet, move to real nets.
Sepolia's the go to testnet. Free STRK from faucets. Here's the flow: create account info, prefund address, deploy. Takes 2 minutes if you don't screw funding.
First, create the account deets:
sncast account create --network sepolia --name mysepoliaaccount Output spits address like 0x123.. and says "prefund me!" Estimated fee? Around 0.02 STRK. Why prefund? Deployment tx charges from that address. No funds = fail.
Hit Starknet Sepolia faucet. Search "Starknet Sepolia faucet". Paste your new address. Get 0.1-1 STRK free. Wait 10 secs. Check balance on Voyager (sepolia.voyager.online).
Or bridge from Ethereum Sepolia if you're fancy. But faucet's easier. I usually grab 0.5 STRK - covers deploys forever.
Funded? Deploy:
sncast account deploy --network sepolia --name mysepoliaaccount
Tx hash pops. Wait 10-30 secs. Check Starkscan (sepolia.starkscan.co/tx/YOURHASH). Success? You're live.
| Common Fee Breakdown (Sepolia, approx) | Amount |
|---|---|
| Account Deploy | 0.01-0.03 STRK |
| Contract Declare | 0.005 STRK |
| Contract Deploy | 0.002 STRK |
| L2 Gas (per tx) | ~1e6 units @ 1e17 wei |
That table's from my runs last week. Fees fluctuate, but ballpark. Max fee too low? Tx reverts. Bump with --max fee 0x123...
Account not deploying? "Insufficient funds" - fund more. Double the estimate.
"Invalid signature" - wrong privkey. Recreate account.
Network busy? Sepolia sometimes lags. Wait or use devnet.
In my experience, 80% issues are funding. Check balance before deploy. Use sncast balance --network sepolia --address YOURADDR.
What's next? List accounts: sncast account list. Import old ones with sncast account import. Pro tip: Set default in ~/.snfoundry.toml.
Hate CLI? Remix IDE. Go remix.epsilon.xyz, Starknet tab.
10 seconds. But Remix handles less edge cases. CLI's king for scripts.
Wallet extensions? Install Braavos or ArgentX Chrome. Connect Remix, deploy account via their "Add Account" flow. Computes address, you fund, they deploy. Easier for mobile ish vibes.
Building dApp? Program it.
JavaScript example (Node):
const { Account, RpcProvider } = require('starknet');
const provider = new RpcProvider({ nodeUrl: 'https://sepolia.rpc.net' });
const privKey = '0xYOUR_PRIVKEY'; // Generate securely!
const pubKey = ec.starkCurve.getStarkKey(privKey);
const address = hash.calculateContractAddressFromHash(pubKey, OZCLASSHASH, [pubKey], 0);
// Fund address first!
const account = new Account(provider, address, privKey);
const { tx } = await account.deployAccount({ classHash: OZCLASSHASH, constructorCalldata: [pubKey] });
await provider.waitForTx(tx); OZCLASSHASH is OpenZeppelin v0.12.1: 0x05b4b537eaa2399e3aa99c4e2e0208ebd6c71bc1467938cd52c798c601e43564. Fund ~0.05 STRK.
Python? starknet.py. Similar: compute address, fund, Account.deployaccountv3(). Docs have full snippets. I scripted a batch deploy once - saved hours.
ArgentX class hash? 0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f. Braavos has custom funcs. Pick OpenZeppelin - most compatible.
OpenZeppelin (OZ): Basic, secure. Supports multisig later.
Argent/Braavos: Session keys, guardians. Fancier, but deployment class hashes differ.
To switch: sncast account create --type argentx --class hash 0x036... But stick OZ first.
Deployed? Check Voyager. Go contract tab, READ, getsigner. Matches your pubkey? Good.
Send tx: sncast --account mysepolia_account transfer --to 0xDEADBEEF.. --amount 1000000000000000000. Native STRK.
Mainnet same steps, --network mainnet. Fund with real STRK (bridge StarkGate). Fees 10x testnet, ~0.2 STRK deploy.
Batch txs? Use account.execute for multis. Paymasters for gasless (v0.13+).
Custom account? Fork OZ, tweak signer. Cairo skills needed.
Script it all: