Siblearn Academy siblearn academy

Sending Ether (transfer, send, call)

می توانید اتر را به قراردادهای دیگر ارسال کنید

  • انتقال (گاز 2300 خطای پرتاب)
  • ارسال (بنزین 2300، قرقره برگشتی)
  • زنگ زدن (تمام گاز یا گاز تنظیم شده را فوروارد کنید، بول را برمی گرداند)

یک قرارداد دریافت کننده اتر باید حداقل یکی از عملکردهای زیر را داشته باشد

  • دریافت () خارجی قابل پرداخت
  • fallback() خارجی قابل پرداخت

دريافت كردن() اگر نامیده می شود msg.data خالی است وگرنه بازگشتی () نامیده میشود.

زنگ زدن در ترکیب با گارد ورود مجدد، روش توصیه شده برای استفاده پس از دسامبر 2019 است.

از ورود مجدد توسط

  • انجام تمام تغییرات حالت قبل از فراخوانی قراردادهای دیگر
  • با استفاده از اصلاح کننده گارد ورود مجدد

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract ReceiveEther {
    /*
    Which function is called, fallback() or receive()?

           send Ether
               |
         msg.data is empty?
              / \
            yes  no
            /     \
    receive() exists?  fallback()
         /   \
        yes   no
        /      \
    receive()   fallback()
    */

    // Function to receive Ether. msg.data must be empty
    receive() external payable {}

    // Fallback function is called when msg.data is not empty
    fallback() external payable {}

    function getBalance() public view returns (uint256) {
        return address(this).balance;
    }
}

contract SendEther {
    function sendViaTransfer(address payable _to) public payable {
        // This function is no longer recommended for sending Ether.
        _to.transfer(msg.value);
    }

    function sendViaSend(address payable _to) public payable {
        // Send returns a boolean value indicating success or failure.
        // This function is not recommended for sending Ether.
        bool sent = _to.send(msg.value);
        require(sent, "Failed to send Ether");
    }

    function sendViaCall(address payable _to) public payable {
        // Call returns a boolean value indicating success or failure.
        // This is the current recommended method to use.
        (bool sent, bytes memory data) = _to.call{value: msg.value}("");
        require(sent, "Failed to send Ether");
    }
}

روی محیط توسعه ی Remix امتحان بکنید

  • SendingEther.sol
  • بازگشت به لیست