Transfer

如何將乙太幣從 msg.sender 發送到合約內的另一個地址

  • January 12, 2022

我是 Solidity 新手,目前正在試驗智能合約。如下程式碼所示(僅部分程式碼),我想寫一個讓你通過支付費用借錢的合約。我實施了借款,但暫時無法通過將 eth 從他的帳戶轉移到另一個地址來讓 msg.sender 支付費用。在此先感謝您的幫助。

pragma solidity 0.8.11;

function borrow(uint256 _amountBorrow) public {
   uint256 fee = 0.001 ether;

   payable(msg.sender).transfer(_amountBorrow);
}

程式碼有兩個問題:

  1. 您正在將資金發送回函式的呼叫者。msg.sender 是呼叫該函式的人。因此,如果您呼叫該函式, msg.sender 將擁有您的地址。要解決此問題,您可以提供另一個帶有目標地址的參數。
  2. 如果這是一個獨立的功能,您將必須使用 msg.value 將 Ether 發送到目標地址。
pragma solidity 0.8.11;
contract Borrow {
  function borrow(uint256 _amountBorrow, address destination) public payable {
      uint256 fee = 0.001 ether;

      payable(destination).transfer(msg.value);
  }
}

因此,這個想法是從合約中藉用乙太幣。為了借款,使用者必須支付費用。

為了從合約中藉用 Ether,以下程式碼有幫助:

pragma solidity 0.8.11;
contract Borrow {
  function borrow(uint256 _amountBorrow) public payable {
      payable(msg.sender).transfer(_amountBorrow);
  }
}

現在我們將添加費用的支付。要求是費用來自發件人的帳戶。這意味著,發送者必須在交易的 value 欄位中發送一些 Ether。在合約中,我們可以使用該msg.value欄位來檢查發送者附加到交易中的乙太幣數量。

contract Borrow {
  function borrow(uint256 _amountBorrow) public payable {
      uint256 fee = 0.001 ether;
      require(msg.value == fee, 'Insufficient to cover fees');
      payable(msg.sender).transfer(_amountBorrow);
  }
}

我建議使用call以下類型的函式address

(bool _sent, bytes memory _data) = msg.sender.call{value: _amountBorrow}("");
require(_sent, "Failed to send ether");

引用自:https://ethereum.stackexchange.com/questions/118687