Blockchain Developer question bank
100 questions. Filter by level and skill, track what you've solved, and see how many people get each one right.
- What gas measures
- Changing deployed code
- Keys and addresses
- Letting a contract spend tokens
- storage, memory, calldata
- Why emit events
- Standard for unique tokens
- What msg.sender is
- What links one block to the next
- The account nonce
- EOA vs contract account
- Wei and ether
- view vs pure
- Sending ETH to a function
- receive vs fallback
- Reading a missing mapping key
- What revert undoes
- What a modifier does
- Private variables are public data
- constant vs immutable
- One contract, many token types
- Token decimals
- Integer division result
- Verifying a contract on Etherscan
- Where to try a deployment
- Sharing a seed phrase
- When a block is final
- Foundry's local node
- Why use OpenZeppelin
- Properties of keccak256
- What a rollup does
- Function selector
- Running out of gas
- external vs internal
- Spot the reentrancy bug
- Using tx.origin for auth
- Packing storage variables
- Custom errors
- Upgrading a proxy safely
- Front-running a swap
- Fuzz tests in Foundry
- Overflow in Solidity 0.8
- Base fee and priority fee
- Predicting a CREATE2 address
- Refunding outbid bidders
- Safer ownership transfer
- Tokens that return nothing
- Fee-on-transfer token deposits
- EIP-712 domain separator
- Approving with a signature
- Unchecked ecrecover
- expectRevert in the wrong place
- Testing against real protocols
- Invariant tests
- What Slither is good for
- Transient storage locks
- Blobs and rollup fees
- Reading vs writing with viem
- When to show "payment received"
- Showing a user's history
- Chain ID in transactions
- Reset that does not reset
- UUPS vs transparent proxy
- Constructors behind a proxy
- Unlimited token approvals
- Random winners on chain
- SELFDESTRUCT after Dencun
- Roles instead of one owner
- Lending protocol price oracle
- Replaying a signed message
- First depositor in a vault
- Reentrancy through a view function
- Rollup withdrawal times
- Paying everyone in a loop
- delegatecall to user input
- Account abstraction
- Reentrancy through safeMint
- EIP-7702 and "only EOAs" checks
- Namespaced storage layout
- Using a signature as a nonce
- Domain separator after a chain split
- Hash collision with encodePacked
- msg.value inside a multicall
- Which way to round in a vault
- Constant product swap output
- Trade-offs of a TWAP oracle
- Checking a Chainlink price
- Flash-loaned voting power
- Return data gas griefing
- Relayer forwards too little gas
- Indexer shows phantom deposits
- Using block.number for time on L2
- Deployment fails on one chain
- Trusting a cross-chain message
- Why transparent proxies split callers
- A fee that rounds to zero
- Commit-reveal that can be copied
- Missing account checks on Solana
- Why ZK rollups still post data
- Expensive loop over storage