当合约被部署时,它有一个地址,我们可以通过地址(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.");