Payable

如何將乙太幣從智能合約地址發送到另一個地址?

  • April 4, 2022

我有一份合約,我可以使用一個fallback函式來存入乙太幣。問題是,我想將這個智能合約中的乙太幣發送到另一個隨機地址。我不是要求將乙太幣從一個地址發送到另一個地址。我要求將本契約中的乙太幣發送到另一個地址。或者換句話說,同樣的問題:我如何將這個智能合約中的乙太幣發送到我想要的任何地址(不使用selfdestruct)。

函式 foo 正在將乙太幣從函式呼叫者地址發送到目標地址 ( _to)。那不是我想要的。我想將這個合約中的乙太幣發送到目標地址(_to)。你知道怎麼做嗎?

//SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.7;

contract TestCall {

   fallback() external payable{}

   function foo(address payable _to) external payable{
       (bool success, ) = _to.call{value: msg.value}("");
       require(success, "transaction failed");
   }

   function getBalance() external view returns(uint){
       return address(this).balance;
   }

}

看起來不錯的 IMO,但我會這樣做:

//SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.7;

contract TestCall {

   fallback() external payable{}

   function foo(address payable _to, uint256 amount) external payable{
       (bool success, ) = _to.call{value: amount}("");
       require(success, "transaction failed");
   }

   function getBalance() external view returns(uint){
       return address(this).balance;
   }
}

使用 msg.value,您需要在發送到合約的交易中包含一個,然後該值將發送到您設置的地址。這不是你想要做的。

這是將全部合約餘額提取到任何地址的通用功能。

function withDraw(address payable to) public payable OnlyOwner {
       uint Balance = address(this).balance;
       require(Balance > 0 wei, "Error! No Balance to withdraw"); 
       to.transfer(Balance);
   }

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