What is a payable function in blockchain smart contracts?
A payable function is a special type of function in smart contracts that can receive cryptocurrency (like Ether) when called. It allows the contract to accept and handle payments.
Click to reveal answer
beginner
Why do we need to mark a function as payable?
Marking a function as payable tells the blockchain that this function can accept money. Without it, sending money to the function will cause the transaction to fail.
Click to reveal answer
beginner
What happens if you send Ether to a non-payable function?
The transaction will be rejected and the Ether will not be transferred. The contract will not accept the payment because the function is not marked as payable.
Click to reveal answer
intermediate
How can you access the amount of Ether sent to a payable function?
Inside a payable function, you can use msg.value to get the amount of Ether (in wei) sent with the transaction.
Click to reveal answer
beginner
Show a simple example of a payable function in Solidity.
Example:<br><pre>function deposit() public payable {
// Function can receive Ether
balance[msg.sender] += msg.value;
}</pre>This function accepts Ether and updates the sender's balance.
Click to reveal answer
What keyword must a Solidity function have to accept Ether?
Apayable
Bexternal
Cview
Dpure
✗ Incorrect
Only functions marked as payable can receive Ether.
What does msg.value represent inside a payable function?
AThe block timestamp
BThe sender's address
CThe gas price
DThe amount of Ether sent with the transaction
✗ Incorrect
msg.value holds the amount of Ether (in wei) sent to the function.
What happens if you send Ether to a function NOT marked payable?
ATransaction fails and reverts
BEther is accepted anyway
CFunction runs but ignores Ether
DEther is sent back automatically
✗ Incorrect
The transaction will fail because the function is not payable.
Which of these is a correct way to declare a payable function in Solidity?
Afunction buy() public {}
Bfunction buy() public payable {}
Cfunction buy() payable {}
Dfunction buy() external view payable {}
✗ Incorrect
The correct syntax is to add payable after visibility like public payable.
Can a constructor be payable in Solidity?
ANo, constructors cannot be payable
BOnly if marked external
CYes, constructors can be payable
DOnly in older Solidity versions
✗ Incorrect
Constructors can be marked payable to accept Ether during contract creation.
Explain what a payable function is and why it is important in smart contracts.
Think about how contracts get money from users.
You got /3 concepts.
Describe how to access the amount of Ether sent to a payable function and give a simple example.
Look inside the function for the special variable.
You got /3 concepts.
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.