Hi @m_Robbie,
You have added all of the additional lines of code needed to solve the problem with the withdraw function 
Your code compiles, but youâve also added some extra code which is superfluous, and which makes it extremely likely that the function will be called with input parameters that cause the transaction to revert. Iâve explained why, belowâŚ
This is whichever address we select from the dropdown in the Account field (in the Deploy & Run Transactions panel). We are simulating banking transactions, and this withdrawal function is for account holders, who already have an account balance of ETH (resulting from either their own deposits or transfers from other account holders), to withdraw ETH from their bank account to their external wallet address.
I think where you may be getting confused is the fact that when ETH is deposited (by any bank account holder), it is transferred to the contract address. Therefore, the ETH balance of the Bank contract address is effectively a âpoolâ of all the ETH deposited by individual account holders (less any withdrawals).
- Deposits from external wallet addresses, decrease the ETH balance of the callerâs wallet address, and increase the ETH balance of the contractâs address by the same amount.
- Withdrawals to external wallet addresses have the exact opposite effect.
- Transfers do not involve any ETH entering or leaving the âpoolâ of ETH held by the contract address. They simply perform internal +/- accounting adjustments to the individual balances recorded for each account holder. These individual balances reflect each account holderâs share of the total contract balance (the pooled funds).
So you need to clearly distinguish between (i) actual movements of ETH between external wallet addresses and the contract address, and (ii) internal accounting adjustments which donât actually involve movements of ETH, but adjust the apportionment of the total contract balance between individual bank account holders.
You should now be able to see that the caller (msg.sender) of the withdraw() function is also the address receiving the ETH (the recipient). The transaction that is executed moves ETH from the contract address to the callerâs wallet address. The âinbuiltâ transfer() function is what actually performs this operation, transferring an amount of wei (the argument passed in) from the contract balance to the address the function is called on (appended to).
Hopefully you can now see that your recipient
parameter and 2nd require statement should be removed â which will also make your code less verbose 
With your current code, if an account holder wants to successfully withdraw funds, then they have to input a recipient address that is different from their own, otherwise your 2nd require statement will fail. This is counterintuitive, and just doesnât make any sense.
You are right to includeâŚ
⌠because this is the accounting adjustment which ensures the callerâs share of the total contract balance is reduced by the same amount as the reduction in the total pooled funds.
Also, have a look at this post which explains an important security modification that should be made to the order of the statements within your withdraw function body.
The function can still operate effectively without returning a value. Itâs not mandatory to include. But asâ returns(uint)
âwas included in the function header, you are right to also include the return statement in your function body.
I donât really understand what you mean, here. But hopefully, my other explanations go some way towards clarifying this as well 
Let us know if anything is unclear, or if you have any further questions.