智能合约从合约所有者处撤回

问题描述 投票:0回答:3

例如,我不想将 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;
        }
    
    }
solidity
3个回答
1
投票

智能合约无法从地址(将 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);

0
投票

如果您已经在每次用户存款时将资金转移给所有者,则没有必要,但如果您愿意无论如何都可以这样做,您有不同的选择,例如将金额作为参数传递,有默认值或最低金额等,但为了简单起见,提取所有资金只需在函数中添加这两行

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

0
投票

我有智能合约,想从中提取资金,但不了解流程。有人可以解释一下我该怎么做吗?

© www.soinside.com 2019 - 2024. All rights reserved.