📖 Scenario: You are creating a simple smart contract on the Ethereum blockchain. This contract will accept payments and keep track of the total amount of Ether received.
🎯 Goal: Build a Solidity contract with a payable function that allows users to send Ether to the contract and updates the total balance received.
📋 What You'll Learn
Create a contract named PaymentReceiver
Add a public state variable totalReceived of type uint to store total Ether received
Write a payable function named receivePayment that updates totalReceived by the amount of Ether sent
Add a function to get the current totalReceived value
Print the totalReceived value after a payment
💡 Why This Matters
🌍 Real World
Smart contracts often need to accept payments in Ether. Payable functions allow contracts to receive and handle these payments securely.
💼 Career
Understanding payable functions is essential for blockchain developers working with Ethereum smart contracts, enabling them to build decentralized applications that handle money.
Progress0 / 4 steps
1
Create the contract and state variable
Create a Solidity contract named PaymentReceiver and inside it declare a public uint variable called totalReceived initialized to 0.
Blockchain / Solidity
Hint
Use contract keyword to define the contract and declare totalReceived as public uint initialized to zero.
2
Add a payable function to receive Ether
Inside the PaymentReceiver contract, add a payable function named receivePayment with no parameters.
Blockchain / Solidity
Hint
Define a function with payable keyword so it can accept Ether.
3
Update totalReceived inside the payable function
Inside the receivePayment function, add code to increase totalReceived by msg.value.
Blockchain / Solidity
Hint
Use msg.value to get the amount of Ether sent with the transaction.
4
Add a function to get totalReceived and print it
Add a public view function named getTotalReceived that returns totalReceived. Then, write a line to print totalReceived after calling receivePayment (simulate printing by returning the value).
Blockchain / Solidity
Hint
Create a view function to read the totalReceived value without changing state.
Practice
(1/5)
1. What is the main purpose of a payable function in a blockchain smart contract?
easy
A. To allow the function to receive cryptocurrency along with the call
B. To make the function run faster
C. To restrict the function to only the contract owner
D. To prevent the function from modifying state variables
Solution
Step 1: Understand the role of payable
The payable keyword marks a function that can accept cryptocurrency (like Ether) when called.
Step 2: Compare other options
Options A, C, and D describe unrelated behaviors. Only To allow the function to receive cryptocurrency along with the call correctly describes the purpose of payable.
Final Answer:
To allow the function to receive cryptocurrency along with the call -> Option A
Quick Check:
Payable = Receive money [OK]
Hint: Payable means function can accept money sent [OK]
Common Mistakes:
Thinking payable makes function faster
Confusing payable with access control
Believing payable prevents state changes
2. Which of the following is the correct syntax to declare a payable function in Solidity?
easy
A. payable function deposit() public {}
B. function deposit() payable public {}
C. function payable deposit() public {}
D. function deposit() public payable {}
Solution
Step 1: Recall Solidity function declaration order
In Solidity, the visibility modifier (e.g., public) comes before payable keyword.
Step 2: Check each option
function deposit() public payable {} uses correct order: function deposit() public payable {}. Options A, B, and D have incorrect keyword order or syntax.
Final Answer:
function deposit() public payable {} -> Option D
Quick Check:
Correct order: visibility then payable [OK]
Hint: Visibility modifier before payable keyword [OK]
Common Mistakes:
Placing payable before function keyword
Switching order of public and payable
Using payable as a function name
3. What will be the output of the following Solidity function when called with 2 Ether?
contract Test {
uint public balance;
function deposit() public payable {
balance = msg.value;
}
}
medium
A. balance will be 2000000000000000000 (2 Ether in wei)
B. balance will be 2
C. Compilation error
D. balance will be 0
Solution
Step 1: Understand msg.value in Solidity
msg.value holds the amount of wei (smallest Ether unit) sent with the transaction. 2 Ether equals 2 * 10^18 wei = 2000000000000000000 wei.
Step 2: Analyze the assignment to balance
The function sets balance = msg.value, so balance stores the wei amount sent, which is 2000000000000000000.
Final Answer:
balance will be 2000000000000000000 (2 Ether in wei) -> Option A
Quick Check:
msg.value stores wei amount sent [OK]
Hint: msg.value is in wei, not Ether [OK]
Common Mistakes:
Assuming msg.value is in Ether
Expecting balance to be zero
Thinking function won't compile
4. Identify the error in this Solidity function that is intended to receive Ether:
function receiveFunds() public {
require(msg.value > 0, "Send some Ether");
}
medium
A. require condition is incorrect
B. Function must be marked payable to receive Ether
C. Function visibility should be private
D. msg.value cannot be used inside functions
Solution
Step 1: Check function declaration for payable
To receive Ether, a function must be declared with the payable keyword. This function lacks it.
Step 2: Validate other options
The require condition is valid, visibility can be public, and msg.value is accessible in payable functions.
Final Answer:
Function must be marked payable to receive Ether -> Option B
Quick Check:
Missing payable causes Ether rejection [OK]
Hint: Add payable to accept Ether in function [OK]
Common Mistakes:
Forgetting payable keyword
Misusing require condition
Changing visibility unnecessarily
5. You want to create a smart contract function that accepts Ether and updates the sender's balance only if at least 1 Ether is sent. Which of the following implementations correctly achieves this?
hard
A. function deposit() payable public {
if (msg.value > 1) {
balances[msg.sender] = msg.value;
}
}
B. function deposit() public {
require(msg.value >= 1 ether, "Minimum 1 Ether required");
balances[msg.sender] += msg.value;
}
C. function deposit() public payable {
require(msg.value >= 1 ether, "Minimum 1 Ether required");
balances[msg.sender] += msg.value;
}
D. function deposit() public payable {
if (msg.value >= 1) {
balances[msg.sender] += msg.value;
}
}
Solution
Step 1: Check for payable keyword and require condition
function deposit() public payable {
require(msg.value >= 1 ether, "Minimum 1 Ether required");
balances[msg.sender] += msg.value;
} correctly marks the function as payable and uses require(msg.value >= 1 ether) to enforce minimum Ether sent.
Step 2: Validate balance update and syntax
function deposit() public payable {
require(msg.value >= 1 ether, "Minimum 1 Ether required");
balances[msg.sender] += msg.value;
} updates balances[msg.sender] by adding msg.value. Other options either miss payable, use wrong comparison, or incorrect balance update.
Final Answer:
function deposit() public payable {
require(msg.value >= 1 ether, "Minimum 1 Ether required");
balances[msg.sender] += msg.value;
} -> Option C
Quick Check:
Payable + require with 1 ether check [OK]
Hint: Use require with 1 ether and payable function [OK]
Common Mistakes:
Omitting payable keyword
Using incorrect Ether comparison
Not updating balance correctly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.