Transfer
如何將乙太幣從 msg.sender 發送到合約內的另一個地址
我是 Solidity 新手,目前正在試驗智能合約。如下程式碼所示(僅部分程式碼),我想寫一個讓你通過支付費用借錢的合約。我實施了借款,但暫時無法通過將 eth 從他的帳戶轉移到另一個地址來讓 msg.sender 支付費用。在此先感謝您的幫助。
pragma solidity 0.8.11; function borrow(uint256 _amountBorrow) public { uint256 fee = 0.001 ether; payable(msg.sender).transfer(_amountBorrow); }
程式碼有兩個問題:
- 您正在將資金發送回函式的呼叫者。msg.sender 是呼叫該函式的人。因此,如果您呼叫該函式, msg.sender 將擁有您的地址。要解決此問題,您可以提供另一個帶有目標地址的參數。
- 如果這是一個獨立的功能,您將必須使用 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");