从合同所有者处提取智能合同



例如,我不想将ETH存储在智能合约上,而是存储给合约所有者。那么如何实现从合同所有人处撤出呢?

pragma solidity ^0.8.7;
contract WDfromContractOwner {

address public owner;

constructor() {
owner=msg.sender;
}

function deposit() external payable returns (bool) {     
payable(owner).transfer(msg.value);
return true;
}

function withdrawal() external returns (bool) {     

// Witdrawal from owner address....???
return true;
}

}

智能合约无法从地址(向合约发送ETH的地址除外(提取ETH。转账需要始终由发件人发起并签名(在您的情况下为owner(。


但是,它可以提取地址拥有的令牌。发送方(owner(首先需要approve()金额,并从其地址与令牌合约进行交互。然后,您的合约可以调用令牌的transferFrom()函数。

pragma solidity ^0.8;
interface IERC20 {
function transferFrom(address, address, uint256) external returns (bool);
}
contract WDfromContractOwner {
address public owner;
function withdrawToken() external {
// Only reachable from the mainnet.
// Transfers from other networks (such as Remix VM) will fail.
address mainnetUSDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
address receiver = msg.sender; // address of the user executing the `withdrawToken()`
uint256 amount = 5 * 1e6; // 5 USDT, 6 decimals
require(
// the `owner` needs to execute `approve()` on the token contract directly from the `owner` address
// so that the `WDfromContractOwner` contract can spend their tokens
IERC20(mainnetUSDT).transferFrom(owner, receiver, amount)
);
}
}

您可以使用web3.js:获得批准的金额

const USDTAddress = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
const ownerAddress = "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF";
// just the `balanceOf()` is sufficient in this case
const ABI = [
{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}
];
const USDTContract = new web3.eth.Contract(ABI, USDTAddress);
const approved = await USDTContract.methods.balanceOf(ownerAddress).call();
console.log(approved);

如果你已经在每次用户存款时将资金转移给所有者,那么这应该是不必要的,但如果你想的话,你无论如何都可以这样做,你有不同的选择,比如将金额作为参数传递,有默认金额或最低金额,等等,但为了简单起见,只需在函数中添加这两行即可提取所有资金

(bool result,)= payable(owner).call{value: address(this).balance }("");
return result

最新更新