例如,我不想将 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
我有智能合约,想从中提取资金,但不了解流程。有人可以解释一下我该怎么做吗?