Challenge - 5 Problems
Master of Accounts (EOA vs contract accounts)
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate2:00remaining
What is the output of this Solidity code snippet?
Consider the following Solidity code that checks if an address is a contract or an externally owned account (EOA). What will be the output when calling
checkAccountType with an EOA address?Blockchain / Solidity
pragma solidity ^0.8.0; contract AccountChecker { function isContract(address account) public view returns (bool) { uint32 size; assembly { size := extcodesize(account) } return (size > 0); } function checkAccountType(address account) public view returns (string memory) { if (isContract(account)) { return "Contract Account"; } else { return "Externally Owned Account"; } } }
Attempts:
2 left
💡 Hint
Remember that EOAs have no code, so extcodesize returns zero for them.
✗ Incorrect
The assembly instruction
extcodesize returns the size of the code at the given address. EOAs have no code, so the size is zero, making the function return false and the string "Externally Owned Account".🧠 Conceptual
intermediate1:30remaining
Which statement correctly describes EOAs and contract accounts?
Select the statement that accurately distinguishes between externally owned accounts (EOAs) and contract accounts in Ethereum.
Attempts:
2 left
💡 Hint
Think about who controls EOAs and what code means for contract accounts.
✗ Incorrect
EOAs are controlled by private keys and have no code. Contract accounts contain code and execute it when called. EOAs initiate transactions, contract accounts respond to them.
🔧 Debug
advanced2:30remaining
Why does this Solidity function always return false for contract addresses?
This Solidity function is intended to detect if an address is a contract. However, it always returns false even for contract addresses. Identify the reason.
Blockchain / Solidity
function isContract(address account) public view returns (bool) { uint size; assembly { size := extcodesize(account) } return (size == 0); }
Attempts:
2 left
💡 Hint
Check the return condition comparing size to zero.
✗ Incorrect
The function returns true when size == 0, meaning it returns true for EOAs and false for contracts. This is the opposite of the intended logic.
📝 Syntax
advanced2:30remaining
Which option correctly compiles and returns the number of contract accounts in an array?
Given an array of addresses, which code snippet correctly counts how many are contract accounts using extcodesize?
Blockchain / Solidity
address[] memory accounts = new address[](3); accounts[0] = 0x123...; accounts[1] = 0x456...; accounts[2] = 0x789...; uint count = 0; // Count contract accounts here
Attempts:
2 left
💡 Hint
Remember to use assembly correctly and check for size > 0.
✗ Incorrect
Option A uses assembly correctly, checks if size > 0, and increments count properly with semicolons. Option A is invalid because extcodesize is not a Solidity function. Option A counts EOAs instead of contracts. Option A misses a semicolon causing syntax error.
🚀 Application
expert3:00remaining
What is the value of
result after executing this Solidity code?Given the following Solidity contract, what is the value of
result after calling test()?Blockchain / Solidity
pragma solidity ^0.8.0; contract TestContract { address public eoa; address public contractAddr; constructor(address _eoa, address _contractAddr) { eoa = _eoa; contractAddr = _contractAddr; } function isContract(address account) internal view returns (bool) { uint size; assembly { size := extcodesize(account) } return size > 0; } function test() public view returns (string memory result) { if (isContract(eoa) && isContract(contractAddr)) { result = "Both are contracts"; } else if (isContract(eoa)) { result = "EOA is contract"; } else if (isContract(contractAddr)) { result = "Contract address is contract"; } else { result = "Neither is contract"; } } }
Attempts:
2 left
💡 Hint
EOAs have no code, contract addresses do.
✗ Incorrect
The
eoa address is an externally owned account with no code, so isContract(eoa) returns false. The contractAddr is a contract address, so isContract(contractAddr) returns true. Thus, the function returns "Contract address is contract".