Update Mar 29 2017
The latest instructions can be found at The DAO Refunds.
Notes
- This Withdrawal contract only allows the conversion of The DAO tokens (DAO) into ethers (ETH) at the rate of 100 DAOs = 1 ETH.
- The way the Withdrawal contract has been coded means that you HAVE to approve the transfer of ALL DAOs in your account, as the Withdrawal contract will only transfer ALL of your DAOs in the one go. If you do not approve all of your DAOs to be transferred, the
withdraw()
function will throw an error, consuming all the gas specified with the transaction.
Anyone who bought DAOs in the last two weeks of The DAO crowdfunding phase paid more than 1 ETH per 100 DAOs. The amount in excess of 1 ETH per 100 DAOs was stored in The DAO's extraBalance account. The balance of the extraBalance account has now been transferred into the curator's multisig wallet.
There is a separate process for purchasers who paid more than 1 ETH per 100 DAOs to get refunded the extra amount paid (over the 1 ETH per 100 DAOs). This process is not covered in this answer, but rest assured that the developers are trying their best to fairly distribute the excess funds back to the original DAO buyers.
See How do I get a refund for the amount I paid in excess of 1 ether to 100 The DAO tokens which will be updated when further details are announced.
If you have executed a legitimate split from The DAO, your DAO balance has been moved to the child DAO and your DAO balance in The DAO is zeroed. As your DAO balance in The DAO is zero, you will not be able to convert your DAOs to ETHs using the procedure in this Q&A.
See How do I get a refund for my The DAO tokens that was split into a child DAO? as you will need to contact TheDAOCurator for them to arrange for your refund.
Wait for some time after the hard fork before attempting to convert your DAOs into ETHs. There is no deadline for the withdrawals. The safest thing to do is wait.
Update 06:33 Oct 26 2016 Some DAO -> ETH transactions are failing due to rounding errors. See Why Are My The DAO To ETH Refunds Failing?.
Withdrawal Method 1 - MyEtherWallet
Go to http://www.myetherwallet.com/#the-dao
Upload / Paste your Keystore file / Private Key to access your wallet.
Press big red button.
Confirm that you are sure you want to withdraw.
Wait a couple seconds and 2 transaction links will appear. Wait about 30 more seconds and check the balance of your account on Etherscan. You should have more ETH and 0 DAO. I (@tayvano) confirmed it worked @ 6:43AM PDT using the MyEtherWallet donation account: http://etherscan.io/address/0x7cb57b5a97eabe94205c07890be4c1ad31e486a8
Withdrawal Method 2 - Ethereum Wallet
The (circularly referenced) article How to use the Withdraw Contract with Mist by Griff Green provides a step-by-step screen printed guide similar to the instructions below.
Make sure that you have downloaded Ethereum Wallet 0.8.1 or later.
The first time you start Ethereum Wallet 0.8.1, select "Yes" to the question "Do you want to activate the chain in which funds linked to the exploit are restored to a contract where they can be withdrawn by The DAO token holders?". You have now made the choice to use the hard-forked Ethereum chain.
If Ethereum Wallet is freezing, see UPDATE 23 Jul 2016 in How to remove The DAO contract from Ethereum Wallet (Mist) watch list as it is freezing?.
If you have not already added a watch on The DAO contract, see The DAO - How to add and watch the DAO contract. This step will give you access to approve the transfer of DAOs to the Withdrawal contract.
If you cannot find the Approve function as required below, reload the JSON interface for The DAO contract using the steps immediately above.
If you have trouble using the Ethereum Wallet with a freezing display, try removing The DAO contract from the Ethereum Wallet (How to remove The DAO contract from Ethereum Wallet (Mist) watch list as it is freezing?), then watch The DAO contract again.
Add a watch on The DAO Withdrawal contract. Use the same procedure as in the link directly above, but set:
- Contract Name:
The DAO Withdrawal
- Contract Address:
0xbf4ed7b27f1d666546e30d74d50d173d20bca754
- JSON Interface:
[{"constant":false,"inputs":[],"name":"trusteeWithdraw","outputs":[],"type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"mainDAO","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"trustee","outputs":[{"name":"","type":"address"}],"type":"function"}]
23:47 20/07/2016 AEST - I have confirmed that the process below using the Ethereum Wallet works
Approve The Transfer Of Your DAOs To The Withdrawal Contract
Get the account address from which you want to convert your DAOs into ETHs
- Under the Wallet menu, select the account from which you want to convert DAOs into ETH.
- Double click on the account address and copy the address into your clipboard using Control-C in Linux or Windows, or Command-C on a MacBook.
Get the balance of the account from which you want to convert your DAOs into ETHs
- In the Contract menu, select The DAO contract.
- Scroll down to the Balance of function under the Read From Contract column on the left.
- Paste the address in your clipboard into the owner-address field.
- Double click on the Balance displayed and copy the balance into your clipboard using Control-C in Linux or Windows, or Command-C on a MacBook.
Approve the transfer of your account's DAO balance to the Withdrawal contract address
- In the Contract menu, select The DAO contract.
- Under the Write To Contract column on the right, select the Approve function.
- Paste the balance from your clipboard into the amount-256 bits unsigned integer field using Control-V in Linux or Windows, or Command-V on a MacBook.
- Enter the Withdrawal contract address
0xbf4ed7b27f1d666546e30d74d50d173d20bca754
in the spender-address field.
- Under the Execute from field, select the account from which you want to convert your DAOs into ETHs.
- Leave the Send ETHER field as 0.
- Click on Execute and enter your account password.
- You should get a transaction confirmation message.
Execute The Withdrawal Contract Function
Withdraw ETH from the Withdrawal contract
- In the Contract menu, select The DAO Withdrawal contract
- Under the Write To Contract column on the right, select the Withdraw function.
- Under the Execute from field, select the account from which you want to convert your DAOs into ETHs.
- Click on Execute and enter your account password.
- You should get a transaction confirmation message.
- Wait a short while and your ether balance should update. If not, restart Ethereum Wallet.
Withdrawal Method 3 - geth
Make sure that you are running geth
version 1.4.10 or later. And run your geth
commands with the --support-dao-fork
option so that you are on the hard-forked blockchain. For example:
geth --support-dao-fork console
The --support-dao-fork
setting is persisted between separate executions of geth
, so you only have to specify this parameter once.
Confirm your geth
version using
user@Kumquat:~$ geth version
Geth
Version: 1.4.10-stable
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.5.1
OS: linux
Here is the process using geth
to convert your DAOs into ETHs for your account {x}
.
00:14 21/07/2016 AEST - I have confirmed that the process below using geth
works
geth --support-dao-fork --unlock {your account} console
...
Unlocking account {your account}
Passhrase: {enter your passphrase}
// Allow your blockchain to sync
> var account = "{your account}";
undefined
> var theDAOAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413";
undefined
> var theDAOWithdrawalAddress = "0xbf4ed7b27f1d666546e30d74d50d173d20bca754";
undefined
> var theDAOABIFragment = [{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"}, {"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"}];
undefined
> var theDAO = web3.eth.contract(theDAOABIFragment).at(theDAOAddress);
undefined
> var approve = theDAO.approve(theDAOWithdrawalAddress, theDAO.balanceOf(account), {from: account});
undefined
> eth.getTransaction(approve);
// Repeat the command above until you see that blockNumber is not null
// Wait a few blocks (~ 15 seconds each) for your approve transaction to get mined
> var theDAOWithdrawalABIFragment = [{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"type":"function"}];
undefined
> var theDAOWithdrawal = web3.eth.contract(theDAOWithdrawalABIFragment).at(theDAOWithdrawalAddress);
undefined
> var withdrawal = theDAOWithdrawal.withdraw({from: account});
undefined
> eth.getTransaction(withdrawal);
// Repeat the command above until you see that blockNumber is not null
// Wait a few blocks (~15 second each) and check your new account balance
web3.fromWei(eth.getBalance(account), "ether")
11.023456789012345678
Withdrawal Method 4 - Ethereum Wallet In Mist Browser Mode
Make sure that you have downloaded Ethereum Wallet 0.8.1 or later.
The first time you start Ethereum Wallet 0.8.1, select "Yes" to the question "Do you want to activate the chain in which funds linked to the exploit are restored to a contract where they can be withdrawn by The DAO token holders?". You have now made the choice to use the hard-forked Ethereum chain. Exit from Ethereum Wallet.
Now run the Ethereum Wallet in the Mist browser mode using the following command from the subdirectory you installed the software in:
(Alternatively, you can download the Mist browser directly - see @johnmardlin
answer below).
Then:
- Make sure you've selected only the account which you used to purchase "The DAO" tokens.
- In Mist browse to https://slacknation.github.io/medium/12/12.html
- Click on "Approve", wait for one block
- Click on "Refund", wait for one block
(Added Method 4 as requested by @slacknation in https://www.reddit.com/r/ethereum/comments/4tx13d/how_do_i_withdraw_dao_tokens_eth_after_hf_update/)
Withdrawal Process Explanation
There is a two step process to convert your DAOs into ETHs.
a) Approve The Transfer Of DAOs From The DAO To The Withdrawal Contract
The first step is to approve the transfer of DAOs from The DAO into the Withdrawal contract. This is done by calling The DAO's approve(...)
function, listed below:
From The DAO's source code, here is the TokenInterface.approve() function definition:
/// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on
/// its behalf
/// @param _spender The address of the account able to transfer the tokens
/// @param _amount The amount of tokens to be approved for transfer
/// @return Whether the approval was successful or not
function approve(address _spender, uint256 _amount) returns (bool success);
Here is the Token.approve(...) function that implements the function defined above:
function approve(address _spender, uint256 _amount) returns (bool success) {
allowed[msg.sender][_spender] = _amount;
Approval(msg.sender, _spender, _amount);
return true;
}
Once you have called The DAO's approve(...) function, you have created an approval for the Withdrawal contract to transfer your DAOs into the Withdrawal contract.
b) Convert Your DAOs Into ETHs With The Withdrawal Contract
The second step is to call the Withdrawal contract's withdraw()
function to transfer DAOs from The DAO into the Withdrawal contract, and for the Withdrawal contract to send your account the equivalent amount in ETH.
Here is the source code for the withdraw()
function:
function withdraw(){
uint balance = mainDAO.balanceOf(msg.sender);
if (!mainDAO.transferFrom(msg.sender, this, balance) || !msg.sender.send(balance))
throw;
}
Source of information
User @lefteris in thedao.slack.com stated that The DAO Withdrawal contract can be found at 0xbf4ed7b27f1d666546e30d74d50d173d20bca754 and the process to convert DAOs into ETHs are the following:
a) call dao.approve("0xbf4ed7b27f1d666546e30d74d50d173d20bca754", dao.balanceOf(youraccount))
b) call withdrawContract.withdraw()
Withdrawal Contract Source Code And Address
The source code for the Withdrawal contract can be found at 0xbf4ed7b27f1d666546e30d74d50d173d20bca754 and is as follows:
contract DAO {
function balanceOf(address addr) returns (uint);
function transferFrom(address from, address to, uint balance) returns (bool);
uint public totalSupply;
}
contract WithdrawDAO {
DAO constant public mainDAO = DAO(0xbb9bc244d798123fde783fcc1c72d3bb8c189413);
address public trustee = 0xda4a4626d3e16e094de3225a751aab7128e96526;
function withdraw(){
uint balance = mainDAO.balanceOf(msg.sender);
if (!mainDAO.transferFrom(msg.sender, this, balance) || !msg.sender.send(balance))
throw;
}
function trusteeWithdraw() {
trustee.send((this.balance + mainDAO.balanceOf(this)) - mainDAO.totalSupply());
}
}
From The DAO's source code (referenced above), here is the Token.transferFrom(...)
function:
function transferFrom(
address _from,
address _to,
uint256 _amount
) noEther returns (bool success) {
if (balances[_from] >= _amount
&& allowed[_from][msg.sender] >= _amount
&& _amount > 0) {
balances[_to] += _amount;
balances[_from] -= _amount;
allowed[_from][msg.sender] -= _amount;
Transfer(_from, _to, _amount);
return true;
} else {
return false;
}
}
Some Further References
Summary
At the hard-fork block #1,920,000 , the ETH balance from The DAO and it's child DAOs (which includes the balance from the extraBalance account) were transferred into the Withdrawal contract.
Immediately after the hard-fork, at block #1,920,090, the Withdrawal contact's trusteeWithdraw()
function was called in this transaction to transfer 463,798.08818109 ETH into TheDAOCurator multisig wallet.
The current TheDAOCurator wallet balance is 463,859.030790534 ETH ($5,802,876.48).
If you have executed a legitimate split from The DAO, your DAO balance has been moved to the child DAO and your DAO balance in The DAO is zeroed. As your DAO balance in The DAO is zero, you will not be able to convert your DAOs to ETHs using the procedures described in How do I convert my The DAO tokens into ethers using the withdrawal contract after the hard fork?.
A proposal for refunding the child DAO splitters can be found at github.com/dsystems-io/childDaoRefund. And the first refund has taken place for an initial test.
See also The DAO’s Edge Cases Multisig (Post Hard Fork).
UPDATE 15:03 Aug 11 2016 UTC
A few split DAO refunds have occurred - 0x422fbb5913e5c5a2cbd731246b62d9fbba0aadffb4f3e91540b76bbb528ee19b. 5.001 ETH refunded from TheDAOCurator to 0x0e0e733dd24168d85ecb5a62bb13385d31edf761.
For a sample contract see Refund for proposal #52.
UPDATE 01:06 Aug 21 2016 UTC
@ledgerwatch has been working hard in #child_dao_community@thedao.slack.com on progressing split DAO refunds and has the following message If You Were in the DAO and split, and your childDao was affected by hardFork:
If you were in splits from one of these proposals: 7, 10, 20, 23, 26, 28, 31, 37, 54, 57, 61, 65, 66 (pre-attack), please send me a private message here ASAP, quoting the proposal number. I will respond with instruction on how to receive your Ether back.
If you were in splits from proposals 35, 36, 53, 62, 67, 68, 70, 71, 73, 76, 87, please watch out for my next post in this subreddit, in the next couple of days I will post what the plan is for returning Ether.
If you were in 69, 74, 78, 81, 94 (child DAOs containing contributions from reentrant splits), please watch out for my posts too, the post about those will come a bit later on, most probably in few days.
Lots of info gets published on slack, but I appreciate that a lot of people don't go there, so I will in touch with you here.
UPDATE 06:28 Aug 23 2016 UTC
Second message from @ledgerwatch If You Were in the DAO and split, and your childDAO was affected by HardFork (2):
If you were in splits from one of these proposals: 20, 26, 31, 37, 57, 61 (pre-attack), please follow the instructions here to perform a self test: https://docs.google.com/document/d/1kD-K-TAz2be8rI737zc_-xpfKdnFlWrcQbHJop1Zwzs/edit?usp=sharing When done, send me a private message, quoting the proposal number, and Ether will be send to your refund contract shortly.
If you were in splits from proposals 35, 36, 53, 62, 67, 68, 70, 71, 73, 76, 87, please follow the instructions in this document to check how much you will get back (and let me know in a private or public message if something looks incorrect): https://docs.google.com/document/d/1qIudT496M--pmavVXaQC4cVgJQG0XkDY-3crglPDjrI/edit?usp=sharing The checking needs to be carried out within the next 14 days, after that time, if no issues found, the 'Mass-Refund' contract described in the document, will be loaded with Ether and available for withdraw. Therefore, provisional date for loading is 6th of September.
If you were in 69, 74, 78, 81, 94 (child DAOs containing contributions from reentrant splits), please watch out for my posts in this subreddit, the post about those will come a bit later on, most probably in few days.
Lots of info gets published on slack (channel #child_dao_community), but I appreciate that many people don't go there, so I will in touch with you here.
Please contact him on reddit or slack if you are involved in one of the splits listed above!
UPDATE 21:55 Sep 5 2016 UTC
From @ledgerwatch on The latest on the childDAO and extraBalance refunds:
Disclaimer: Information below is the current plan, to the best of my knowledge, but this plan can change, and there might be changes or delays.
PRE-ATTACK childDAOs: Only 4 non-refunded childDAOs left: 20, 31, 37, 57. The total amount to be refunded is 87 ETH. If you have tokens in any of these childDAO, please send me a private message quoting the number
POST-ATTACK childDAOs without reentrancies: 35, 36, 53, 62, 67, 68, 70, 71, 73, 76, 87. The refund is currently planned for tomorrow. The refund contract is here: http://etherscan.io/address/0x3da71558a40f63b960196cc0679847ff50fad22b In order to use it, you need call 'withdraw' function, passing the address of your childDAO as argument. You can look up the address of your childDAO in the source code. The new feature of etherscan, on the tab 'Read contract', allows you to quickly lookup how much you would get back. The total amount to be sent to this contract is around 21'395 ETH
POST-ATTACK childDAOs with reentrancies: 69, 74, 78. There are only 5 addresses that qualify for the refund, those are the addresses that did not use reentrancy in their split. The owners of the 2 of them have already cryptographically confirmed that they are OK for the refund to be sent directly to these addresses (they are confident that these addresses are not vulnerable to any possible replays). The remaining 3 addresses are:
0x5b5d8c8eed6c85ac215661de026676823faa0a0c
0xab9acc3c451e43e18dd61ab11048c07b74c99eee
0xe1e278e5e6bbe00b2a41d49b60853bf6791ab614
If you control any of these 3 account, send me a private message and I will ask you for a confirmation. Currently there is no set date for these refunds, but they will be initiated very soon after the previous round of refunds, so soon after 6th of September.
You may want to transfer your ETHs after you have withdrawn them. To prevent the replaying of your ETH transfer transaction on the non-hard-forked Ethereum Classic chain, see How to conditionally send ethers to another account post-hard-fork to protect yourself from replay attacks.
Details
Quoting GrifffGreeen in reddit.com/r/ethereum - Curator Multisig: extraBalance & childDAO tokens announcement Early next week dated 21 July 2016:
Expect an update detailing how the people that sent ether to the extraBalance and childDAO token holders will be able to claim their ether early next week.
For the extraBalance: It will likely be a smart contract that will allow any one who paid into the extraBalance to claim the ether they sent to it, with or without DAO tokens.
The childDAO token holders can also join the #child_dao_community in The DAO's Slack to stay up to date on the developments.
So if you have executed a legitimate split from The DAO, join the #child_dao_community at thedao.slack.com and contact @griff
to provide details of your split including:
- Split DAO's you joined (proposal numbers).
- Address of your childDAO
- Addresses that you used to split.
- How many DAO tokens each address burned.
- Best way to contact you :slightly_smiling_face:
- Any other relevant info that will help (did you send ETH as a proposal deposit? Is there one address you want all of the ETH to be sent to?)
Source: @griff
in #child_dao_community at thedao.slack.com
UPDATE 06:56 06 Aug 2016 GMT
Here's an updated DRAFT refund proposal for refunding the child DAO splitters from github.com/dsystems-io/childDaoRefund:
childDaoWithdraw
A set of contracts to withdraw ETH from the childDAOs which split innocently from the main DAO contract. Based on these contracts the estimated ETH owed to innocent splitters (those who called splitDAO()
without reentry) is 112,164.96789251 ETH
Resources
5 Classes of childDAOs
- Safe Children: Splits that were able to execute proposals to withdraw their ETH prior to the hardfork at block 1920000. We don't need to worry about these as their ETH was successfully withdrawn.
- Trusted Token Children: Splits that occurred prior to the first reentry attack and were never joined via a reentry attack. We can therefore trust that their tokens represent 1:100 ETH/cDAO.
- Untrusted Token Ratio Children: Splits with tokens that can't be trusted to represent 1:100 ETH/cDAO. They each called
split()
after the reentry attack and therefore have a ratio < 1:100 ETH/cDAO. They were however NOT joined via reentry attack.
- Untrusted Token Ratio With Reentry Children: Splits with tokens that don't represent 1:00 ETH/cDAO but were also joined via reentry attacks.
- Invalid Token Children: childDAO tokens created entirely via reentry attacks and therefore have no ETH value.
Class 1 - Safe Children
We can safely assume Class 1 DAOs are safe and are not in need of a solution. This includes the following Splits:
Class 2 - Trusted Token Children
Since these splits have a consistent ETH/cDAO token ratio, we can simply whitelist these DAOs and withdraw the token holder's ETH appropriately, similar to the main DAO withdrawal contract.
Based on this contract, the included childDAOs are owed: 69,704.90047138669 ETH
trustedChildWithdraw.sol
Uses a whiteList of trusted childDAOs to withdraw ETH by destroying tokens in each child. These addresses were compiled by running getNewDAOAddress()
on the original DAO for proposals 1-300 and examining the transactions for each childDAO. Only childDAOs unable to execute Proposals to withdraw ETH before the hardfork were included. All calls to splitDAO()
were credited 1 ETH for destroying 100 DAO tokens.
WhiteList includes:
Class 3 - Untrusted Token Ratio Children
As these tokens are not consistent in their ETH/cDAO ratio, we can determine each individual childDAO's rightful cDAO/ETH ratio based on how many DAO tokens they initially destroyed when calling splitDAO()
. These childDAOs were not joined via any reentry attacks so their tokens are valid except for the ratio of ETH they represent.
Based on this contract, the childDAOs included are owed 14,973.629251125047 ETH.
untrustedChildWithdraw.sol
Based upon trustedChildWithdraw.sol with the added complication that each childDAO has an individualized token multiplier. This multiplier was determined using the following formula ( (DAO / 100) / ETH )
. Where DAO
is the number of DAO tokens burned to create the split and ETH
represents the amount of ETH sent to the childDAO as a result of the split, calculated to 9 decimal places. All subsequent splits in a childDAO have the same multiplier.
List of splits that need an individualized calculation of ETH based on DAO tokens burned when calling splitDAO()
:
Class 4 - Untrusted Token Ratio With Reentry Children
These childDAOs also have a an untrusted token ratio, and were further joined via a reentry attack. Here we attempt to withdraw ETH from these splits individually based on the amount of DAO tokens they burned.
The total value of ETH owed to the splitters in this contract is 27,486.438169998 ETH.
infiltratedChildWithdraw.sol
This contract compiles the list of innocent (no-reentry) splitters from childDAOs that were joined via other reentry splitters (black and white hats). It then withdraws each innocent account when sufficient ETH is sent from the curator address. The contact accomplishes this as follows:
- Whitelists the 7 addresses which split innocently in reentry-attacked DAOs using an array.
- Builds a corresponding array that associates the amount (in Wei) that each address is owed from burning DAO tokens in the
splitDAO()
process. Here we calculate 100 DAO burned = 1 ETH owed.
- Uses a single function
withdraw()
that iterates over the whiteList and sends each address the appropriate amount of ETH.
- After successfully calling
withdraw()
the contract state isWithdrawn
is changed permanently to true
so as to prevent an accidently duplication.
- Restricts the call of
withdraw()
to only the Curator multisig address and only if the amount sent is sufficient to pay ALL recipients. Otherwise the entire transaction will fail with throw
. Failure of any single send()
will also throw
.
The following is a list of infiltrated childDAOs and corresponding innocent splitDAO()
transactions within each of them that were used to build the contract:
** NOTE: The values the transactions in Proposal 78 have been summed within the contract because they all belong to the same address. **
Class 5 - Invalid Token Children
The following children have been explicitly excluded because all split transactions were reentry attacks and therefore all tokens are invalid.
If you notice any errors with these lists, please bring it to my attention. Any other feedback much appreciated.
Contributors
Could not have been possible without the help and validation of everyone over at the #child_dao_community channel in The DAO Slack
Further References
Best Answer
Summary
As of 22/06/2016 AEST, 5+ attacks are identified below:
# 1 The major 17 June 2016 attack #1 that pictured in ether.camp/dao-thief (info from user iamtrillion in the post DAOhub.org - [Workgroup] DAO White Hat Team).
#2 0xae8ad906948ef5ad5e95eed52990ff89312887d7 where you can see the recursive call transfers in 0x0f6994bd16df20f0d0992a607ab78e8be1a05cb07b411437fed2fec83be1bc9c, has netted 160.09485354 Ether ($1,807.47) in 0xfe24cdd8648121a43a7c86d289be4dd2951ed49f, and commenced at 6/19/2016 12:17:37 PM. This first attack was identified in reddit/r/ethereum - DAO is under attack again where 22 ETH was hacked at the time of writing. Proposal #74 used.
#4 0xf68d23ee23703a99d8374a71a92ec0678354498e where you can see the recursive call transfers in 0x27a52fd947e623d3393ca59f3e99c654938d387657bf7c12a04f736c27f45648, with a current balance of 269.80994743 Ether ($3,145.98) in 0xfe24cdd8648121a43a7c86d289be4dd2951ed49f and commenced at 6/21/2016 8:28:16 AM (same account as in attack #2). Lots of failed transaction, balance not necessarily all created by the recursive call vulnerability. Another test attack? These are spaced out over longer periods of time.
#5 0x2ed6dac2b01a2a27803d6fe4f8e9729e92a8dfcf is another test or small attack. These are spaced out over longer periods of time. And there is some accumulation happening in 0x4613f3bca5c44ea06337a9e439fbc6d42e501d0a, 11605 ETH currently.
Phew. Finally. White hat attack and Update on the White Hat attack. 0x2ba9d006c1d72e67a70b5526fc6b4b0c0fd6d334 where you can see the recursive call transfers in 0x60c58610f70682454d88483e289b7a374b274e546d4f28e76900b9520b40880d and destination account 0xb136707642a4ea12fb4bae820f03d2562ebff487 with balance 7,277,336.423038517 Ether ($96,934,121.15) that commenced in block 1745899 at 6/21/2016 5:44:27 PM. A small number of the Transfer events follow:
Update 11:54 22/06/2016 AEST
A new attack is in progress. Confirmed white hat - https://mobile.twitter.com/LefterisJP/status/745419842954530816. Balance now 0.14 ETH so no more attacks on the main account. All split proposals now cannot split.
About 266 kETH has been drained. 0x4f0daa112142ffc4ba1b9f3b76bcd238a094d65b with destination account 0x84ef4b2357079cd7a7c69fd7a37cd0609a679106 with current balance 266,897.915541427 Ether ($3,755,253.67). Transfers can be seen in 0x6f8c0d2751e7e18325e1a113019a9ae5372f306d5424722f79d2123a0eb7d598.
Update 22:03 22/06/2016
Details on the amounts drained are available in How many ethers have been drained through the recursive call attacks on The DAO?.
Update 27/06/2016
Here's an alternative analysis of the attacking accounts by https://medium.com/@oaeee by looking at the recursion depth, with data taken from http://pastebin.com/BZGNeXyR. There is a slight difference to the balances in How many ethers have been drained through the recursive call attacks on The DAO?:
Details
Copy the following script into
getTheDAOTransferEvents
:Set the executable bit of the file using
chmod 700 getTheDAOTransferEvents
.The script without any parameters will search for the Transfer events between blocks 1599207 (the first Transfer event appears in this block) and the latest block. This will take some time. You can specify one parameter that will be used as the first block to search. Or you can specify two parameters for the first and last block to search.
This script will only search for Transfer events where the
_to:
address is0x0000000000000000000000000000000000000000
as this is a characteristic of the recursive call vulnerability hack transfers. The many Transfer events from the same address will be located in the same block number.First run
geth console
in a terminal window.Then run the script in a separate terminal window to extract all Transfer events of interest using
Let's exclude the addresses of the 17 June attack - 0xf835a0247b0063c04ef22006ebe57c5f11977cc4 and 0xc0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89:
From the listing above, the candidates are:
Update 21/06/2016
A few more The DAO Transfer events that look suspicious, spaced apart over a few hours, either to test or to avoid detection:
Split Proposal Id
To find which split proposal was used to mount the attack, browse the account and search for the input data for the first non-internal transaction after the contract creation. For example, take account 0xae8ad906948ef5ad5e95eed52990ff89312887d7. The second last transaction on the page in block 1732364 with txid 0x8445ab0d5738a1ddb06b461b733280ed7df1ce8ff34495e165d4905029eca8b8 has the following input data:
The 0...004a in the third line is the proposal id in hex format - proposal #74.
Accounts
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 in the second line is The DAO account. 0x1bc31e2e4f1bcc0a7dd9d849dfc57e66e59896ab in the fourth line seems to be the splitDAO() created account that holds the ethers for 27 days.
The 17 June 2016 Attack Transfer Events
Here are a small part of the 14,112 17 June 2016 attack Transfer events (I just chose a small subset between blocks 1718497 and 1718504):