如何将()或()从合同地址发送到可靠的帐户地址(我的意思是从地址(此)中扣除余额)



当合约被部署时,它有一个地址,我们可以通过地址(this)调用它。我的合同是从一个地址收取的,这意味着我可以发送()或转移()到这个合同中,但如果我想从这个实际合同转移到任何账户,我该怎么做?

示例代码:

function submitTransaction(address _to,uint _value,string memory _desc) public 
onlyOwner 
{
require(_value <= address(this).balance,"This wallet does not have enough balace to send");
if(!_to.send(_value)){
revert("doposit fail");
}
}

但是我如何从地址(this)中扣除余额呢?

你可以看到这个智能合约代码示例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Bank {
address owner;

constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "You're not the smart contract owner!");
_;
}
event Deposited(address from, uint amount);
function depositMoney() public payable {
emit Deposited(msg.sender, msg.value);
}
// Use transfer method to withdraw an amount of money and for updating automatically the balance
function withdrawMoney(address _to, uint _value) public onlyOwner {
payable(_to).transfer(_value);
}
// Getter smart contract Balance
function getSmartContractBalance() external view returns(uint) {
return address(this).balance;
}
}

在这种情况下,如果您只想使用transfer或send,我建议您使用transfer()方法而不是send(),因为如果transfer不起作用,它会抛出失败。我推荐阅读这篇文章。相反,为了避免重入攻击,您必须使用call方法传输以太网。

如果没有很好的理由,不要使用safe,而是使用transfer。当transfer在失败的情况下抛出一个错误时,safe方法将只返回false,这意味着下一行代码仍然会被执行,如果你不处理这个错误,事务将不会被恢复。

function submitTransaction(address _to,uint _value,string memory _desc) public 
onlyOwner 
{
require(_value <= address(this).balance,"This wallet does not have enough balace to send");
_to.transfer(_value);
}
(bool success, ) = addressToTransfer.call{value: address(this).balance}("");
require(success, "Transfer failed.");

相关内容

最新更新