Bird
Raised Fist0
Blockchain / Solidityprogramming~7 mins

Sending Ether (transfer, send, call) in Blockchain / Solidity

Choose your learning style10 modes available
Introduction

Sending Ether means moving money from one account to another on the blockchain. It is important to know how to do this safely and correctly.

You want to pay someone for a service using a smart contract.
You want to send a refund to a user from your contract.
You want to split payments between multiple addresses.
You want to forward received Ether to another contract or wallet.
Syntax
Blockchain / Solidity
address payable recipient = payable(address);  

// Using transfer
recipient.transfer(amount);

// Using send
bool sent = recipient.send(amount);
require(sent, "Send failed");

// Using call
(bool success, ) = recipient.call{value: amount}("");
require(success, "Call failed");

transfer sends Ether and reverts on failure automatically.

send sends Ether but returns false on failure, so you must check it.

call is the recommended way now; it returns success and allows sending gas.

Examples
This sends 1 Ether to the recipient using transfer. It will stop if it fails.
Blockchain / Solidity
address payable recipient = payable(0x123...);
recipient.transfer(1 ether);
This sends 1 Ether using send. You must check if it worked.
Blockchain / Solidity
address payable recipient = payable(0x123...);
bool sent = recipient.send(1 ether);
require(sent, "Send failed");
This sends 1 Ether using call. It is the safest and most flexible way.
Blockchain / Solidity
address payable recipient = payable(0x123...);
(bool success, ) = recipient.call{value: 1 ether}("");
require(success, "Call failed");
Sample Program

This contract shows three ways to send Ether to a recipient address. You can call each function with some Ether to send it.

Blockchain / Solidity
pragma solidity ^0.8.20;

contract SendEtherExample {
    address payable public recipient;

    constructor(address payable _recipient) {
        recipient = _recipient;
    }

    // Function to receive Ether
    receive() external payable {}

    // Send Ether using transfer
    function sendUsingTransfer() public payable {
        require(msg.value > 0, "Send some Ether");
        recipient.transfer(msg.value);
    }

    // Send Ether using send
    function sendUsingSend() public payable {
        require(msg.value > 0, "Send some Ether");
        bool sent = recipient.send(msg.value);
        require(sent, "Send failed");
    }

    // Send Ether using call
    function sendUsingCall() public payable {
        require(msg.value > 0, "Send some Ether");
        (bool success, ) = recipient.call{value: msg.value}("");
        require(success, "Call failed");
    }
}
OutputSuccess
Important Notes

transfer forwards 2300 gas and reverts on failure.

send forwards 2300 gas and returns false on failure; you must handle it.

call forwards all gas by default and returns success status; it is now recommended.

Summary

Use transfer for simple sending with automatic revert on failure.

Use send if you want to handle failure manually.

Use call for the most control and safety in sending Ether.

Practice

(1/5)
1.

Which Solidity function automatically reverts the transaction if sending Ether fails?

easy
A. approve
B. send
C. call
D. transfer

Solution

  1. Step 1: Understand transfer behavior

    transfer sends Ether and automatically reverts if the transfer fails.
  2. Step 2: Compare with other methods

    send returns false on failure without reverting; call requires manual check; approve is unrelated to sending Ether.
  3. Final Answer:

    transfer -> Option D
  4. Quick Check:

    Automatic revert on failure = transfer [OK]
Hint: transfer always reverts on failure, no manual check needed [OK]
Common Mistakes:
  • Confusing send with transfer behavior
  • Thinking call auto-reverts on failure
  • Mixing approve with Ether sending
2.

Which of the following is the correct syntax to send 1 Ether using send in Solidity?

recipient.?{value: 1 ether}();
easy
A. send
B. transfer
C. call
D. approve

Solution

  1. Step 1: Recall send syntax

    send is called as recipient.send{value: amount}() in Solidity 0.6+.
  2. Step 2: Match syntax with options

    Only send matches send method usage for sending Ether.
  3. Final Answer:

    send -> Option A
  4. Quick Check:

    send syntax = recipient.send{value: 1 ether}() [OK]
Hint: send uses .send{value: amount}() syntax [OK]
Common Mistakes:
  • Using transfer syntax with send
  • Confusing call syntax with send
  • Using approve which is unrelated
3.

What will be the output of the following Solidity code snippet?

bool success = recipient.send{value: 1 ether}();
if (!success) {
    revert("Send failed");
}
medium
A. Transaction reverts if send fails
B. Transaction always succeeds without revert
C. Compilation error due to syntax
D. Transaction succeeds but ignores failure

Solution

  1. Step 1: Analyze send return value

    send returns false if sending Ether fails, but does not revert automatically.
  2. Step 2: Check revert condition

    The code checks !success and calls revert manually, so transaction reverts on failure.
  3. Final Answer:

    Transaction reverts if send fails -> Option A
  4. Quick Check:

    send returns false + manual revert = revert on failure [OK]
Hint: send returns bool; revert manually on false [OK]
Common Mistakes:
  • Assuming send auto-reverts
  • Ignoring manual revert check
  • Thinking code always succeeds
4.

Identify the error in this Solidity code snippet that uses call to send Ether:

(bool sent, ) = recipient.call{value: 1 ether}();
require(sent, "Failed to send Ether");
medium
A. Missing gas parameter in call
B. Incorrect syntax for call
C. No error; code is correct
D. Should use send instead of call

Solution

  1. Step 1: Review call syntax

    The syntax recipient.call{value: 1 ether}() is correct for sending Ether with call.
  2. Step 2: Check error handling

    The code checks sent boolean and reverts if false, which is proper error handling.
  3. Final Answer:

    No error; code is correct -> Option C
  4. Quick Check:

    call with value + require check = correct usage [OK]
Hint: call needs manual success check; this code does it [OK]
Common Mistakes:
  • Thinking gas parameter is mandatory
  • Confusing call syntax with send or transfer
  • Ignoring manual success check
5.

You want to send Ether to a contract that might consume more than 2300 gas on fallback. Which method should you use to ensure the transfer succeeds?

hard
A. transfer
B. call
C. approve
D. send

Solution

  1. Step 1: Understand gas limits of transfer and send

    transfer and send forward only 2300 gas, which may be insufficient for complex fallback functions.
  2. Step 2: Use call for flexible gas forwarding

    call allows forwarding all available gas, ensuring the receiving contract can execute complex logic.
  3. Final Answer:

    call -> Option B
  4. Quick Check:

    call forwards all gas, suitable for complex fallback [OK]
Hint: Use call to forward all gas for complex fallback [OK]
Common Mistakes:
  • Using transfer or send which limit gas to 2300
  • Confusing approve with sending Ether
  • Ignoring fallback gas requirements
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