Hi guys,
I made a smart contract, uploaded it to ganache and I am testing a withdraw function that withdraws all the funds of the contract to the owner of the contract. I tried several things but nothing seems to work.
My smart contract looks as follows:
Contract Test is Ownable, Pausable
{
function withdraw1() public onlyOwner
{
(bool success, ) = msg.sender.call{value: address(this).balance}("");
}
function withdraw2() public onlyOwner
{
require(owner.send(address(this).balance));
}
}
None of these withdrawal functions work. The second withdrawal function doesn’t even compile. I get the following error message:
“TypeError: “send” and “transfer” are only available for objects of type “address payable”, not “address”.”
There is not much I can do with this because I can’t make the addess payable.
The first withdrawal function compiles but when I run my tests I don’t see funds moving from the contract to the owner.
At this moment I am basically stuck. Do I need to inherit from another Openzeppelin contract in order to withdraw ?
By the way, I am working on solidity version 0.8.0.
You can cast to address payable with payable(owner())
, like this:
payable(owner()).send(address(this).balance);
owner
is a function that you need to call btw.
Thanks for the reply. It compiles. But I get the same error during my mocha test as with my first withdraw function:
“Error: Returned error: VM Exception while processing transaction: invalid opcode”
My test function is as follows:
instance = await Contract.deployed();
user1 = accounts[0];
await instance.withdraw({from:user1});
I guess the error means I am calling my withdraw function wrong but I don’t think I am. This is currently my withdraw function:
function withdraw() public onlyOwner
{
payable(owner()).transfer(address(this).balance);
}
Please use triple backticks to surround your code in order to get proper formatting.
```
code here
```
This error depends on many factors. What is the value of owner()
?
Thanks, I didn’t know about the tripple backticks.
owner()
correctly returns the address of the owner of the contract.
And the address is an account with a private key, or is it a contract?
The address is an account with a private key.
Is user1
the owner?
Otherwise, I don’t know what could be the problem. If you can put together a repository where I can reproduce the issue and test it I’ll be able to figure out why it’s not working.
Hey Frangio,
Sorry for the late reply but I was on holiday. Here is the repository:
The file testfile.js contains a test that throws the error. If you comment the withdraw function call, the test runs fine. If you uncomment it, the withdraw function call throws an error:
Error: Returned error: VM Exception while processing transaction: invalid opcode
The test works fine for me in the repository you shared. There was no commented line in the tests.
Really ? Strange … Then I have no clue why it doesn’t work here Thanks for letting me know that it works fine for you.