Bird
Raised Fist0
Blockchain / Solidityprogramming~3 mins

Why Payable functions in Blockchain / Solidity? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if your smart contract could instantly accept money without any extra steps?

The Scenario

Imagine you want to build a digital vending machine on the blockchain that accepts payments in cryptocurrency. Without a special way to receive money, your contract can't accept any funds, making it impossible to sell anything.

The Problem

Trying to accept payments without payable functions means your contract will reject any incoming cryptocurrency. You'd have to manually track and verify payments off-chain, which is slow, error-prone, and breaks the trustless nature of blockchain.

The Solution

Payable functions let your smart contract directly receive cryptocurrency when called. This makes it easy and secure to handle payments on-chain, ensuring your contract can sell digital goods or services seamlessly.

Before vs After
✗ Before
function buy() public { /* no way to accept funds */ }
✓ After
function buy() public payable { /* accepts payment with call */ }
What It Enables

Payable functions enable smart contracts to securely receive and manage cryptocurrency payments directly on the blockchain.

Real Life Example

A crowdfunding contract where supporters send Ether to fund a project; the payable function automatically accepts and records their contributions.

Key Takeaways

Without payable functions, contracts can't receive cryptocurrency.

Manual payment tracking is slow and unreliable.

Payable functions make on-chain payments easy and secure.

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

  1. Step 1: Understand the role of payable

    The payable keyword marks a function that can accept cryptocurrency (like Ether) when called.
  2. 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.
  3. Final Answer:

    To allow the function to receive cryptocurrency along with the call -> Option A
  4. 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

  1. Step 1: Recall Solidity function declaration order

    In Solidity, the visibility modifier (e.g., public) comes before payable keyword.
  2. 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.
  3. Final Answer:

    function deposit() public payable {} -> Option D
  4. 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

  1. 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.
  2. Step 2: Analyze the assignment to balance

    The function sets balance = msg.value, so balance stores the wei amount sent, which is 2000000000000000000.
  3. Final Answer:

    balance will be 2000000000000000000 (2 Ether in wei) -> Option A
  4. 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

  1. Step 1: Check function declaration for payable

    To receive Ether, a function must be declared with the payable keyword. This function lacks it.
  2. Step 2: Validate other options

    The require condition is valid, visibility can be public, and msg.value is accessible in payable functions.
  3. Final Answer:

    Function must be marked payable to receive Ether -> Option B
  4. 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

  1. 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.
  2. 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.
  3. Final Answer:

    function deposit() public payable { require(msg.value >= 1 ether, "Minimum 1 Ether required"); balances[msg.sender] += msg.value; } -> Option C
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard