The DAO Refunds

From The Ethereum Wiki
Revision as of 07:52, 24 December 2017 by BokkyPooBah (talk | contribs) (How Do I Withdraw The DAO ETC Refund Using Go Ethereum Classic?)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

There are 3 main types of The DAO refunds:

  • The DAO to ETH Refund
    All The DAO token holder with a non-zero token balance are entitled to this refund. There is no time limit to this refund, but execute your refunds as soon as possible.
  • The DAO To ETH ExtraBalance Refund
    Only The DAO token holders who purchased The DAO tokens in the last 2 weeks of the crowdfunding phase are entitled to this refund. There is no stated time limit to this refund, but execute your refunds as soon as possible. The curators can clawback the amount remaining in the contract at any time but have not announced any intentions to do so.
  • The DAO To ETC Refund
    All The DAO token holders with a non-zero token balance at block 1,919,999 on the Ethereum Classic (ETC) chain are entitled to this refund.
    Note that there is a time limit of Apr 15 2017 to execute your The DAO To ETC refunds Note that the time limit to withdraw your DAO to ETC refund has been extended to Jan 2018 - reference WHG withdraw contract extended


Check Your Refund Amounts

Check the refunds for your accounts at https://refunds.thedao.fund .


Assistance

You can contact either:


Background

  • The DAO contract raised about USD 150 million worth of ethers (ETH) during the 28 day crowdfunding creation period starting Apr 30 2016.
  • A hacker exploited a vulnerability in The DAO's code on Jun 17 2016 to drain ~ USD 50 million worth of ETH.
  • The Ethereum blockchain was hard-forked at block 1,920,000 to transfer all ETH from The DAO contracts and it's child contracts into a curator's account.
  • The Ethereum Classic blockchain was formed when some miners decided to keep running the old Ethereum client node program without the hard-fork code changes.
  • The curators on the ETH chain created two contracts to provide refunds to The DAO Token Holders (DTH) via:
  • The Robin Hood Group and the Whitehat Group retrieved the ethers (ETC) on the Ethereum Classic chain and created a contract to provide refunds to DTHs via:


Notes

  • You will need either your private key AND/OR your JSON file plus the password to be able to execute your refund. If you cannot remember your password, from How can I recover or reset a lost wallet password?, you can try using the pyethrecover tool from https://github.com/burjorjee/pyethrecover to brute force your password. You will need to provide some password hints for the application to attempt finding your password.
  • You will need some ethers in your ETH account to execute the DAO to ETH refund and the DAO ExtraBalance refund. You will need some ethers in your ETC account to execute the DAO to ETC refund.


How Much Will You Get Back?

  • The DAO to ETH Refund
    You will get back 1 ETH for every 100 DAO tokens you held at block 1,919,999 .
  • The DAO To ETH ExtraBalance Refund
    You will get back 1 ETH for every 1 ETH you contributed to The DAO ExtraBalance account and this is only if you bought DAO tokens in the last two weeks of the crowdfunding.
  • The DAO To ETC Refund
    You will get back 0.73152013260357357102 ETC for every 100 DAO tokens you held at block 1,919,999 .

In total, you will get a refund of about 103% (in ETH terms) of your original The DAO investment, made up of:

  • 100% of your investment on the ETH chain
  • 73.152013260357357102% (the proportion of ETCs recovered) x (ETC to ETH conversion rate)

The website https://refunds.thedao.fund will display the refunds if you enter your account and click Check.


How Much Is Remaining In The Funds To Be Refunded?

The DAO to ETH Refund

The WithdrawDAO contract has 499,758.849542373 Ether (USD 20,884,922.32) as of Mar 23 2017.


The DAO To ETH ExtraBalance Refund

The ExtraBalDaoWithdraw contract has 115,631.859273339 Ether (USD 4,831,099.08) as of Mar 23 2017.


The DAO To ETC Refund

The WhitehatWithdraw contract has 1995792.3594 ETC (USD 4,610,280.35) as of Mar 23 2017.

Note that there is a time limit of Apr 15 2017 to execute your The DAO To ETC refunds Note that the time limit to withdraw your DAO to ETC refund has been extended to Jan 2018 - reference WHG withdraw contract extended


Ethereum and Ethereum Classic Replay Issues

To avoid the transactions you execute on the ETH chain being replayed on the ETC chain and vice versa, upgrade to the latest node client software as these include the EIP155 Replay Protection.

  • On the ETH chain, geth 1.5.0 and above includes the EIP155 Replay Protection code changes.
  • On the ETC chain, geth 3.2.3 and above includes the EIP155 Replay Protection code changes.
  • MyEtherWallet also includes the EIP155 Replay Protection.
  • On the ETH and ETC chain, Parity 1.5.3 and above includes the EIP155 Replay Protection code changes.


How Do I Check If My Account Has Any Remaining The DAO Refund Due

Check The DAO to ETH Refund

  • Navigate to The DAO - Read Contract
  • Enter your account in the balanceOf field. If the balance result is non-zero, you have remaining The DAO to ETH refunds due
  • The following screenshot shows an account with a non-zero balance. To calculate your balance in ETH, divide the number by 10^18:
    TheDAOToETHBalanceNonZero.png
  • And the following screenshot shows an account with a zero balance:
    TheDAOToETHBalanceZero.png


Check The DAO To ETH ExtraBalance Refund

  • Navigate to The DAO ExtraBalToken - Read Contract
  • Enter your account in the balanceOf field. If the balance result is non-zero, you have remaining The DAO to ETH ExtraBalance refunds due
  • The following screenshot shows an account with a non-zero balance. To calculate your balance in ETH, divide the number by 10^18:
    TheDAOToETHExtraBalanceBalanceNonZero.png
  • And the following screenshot shows an account with a zero balance:
    TheDAOToETHExtraBalanceBalanceZero.png
  • Alternatively, you can check the list CreatedTokenEventsWithNonZeroExtraBalance_v4.xlsx, but this list shows your balance when the refund contract was first deployed. This list will not reflect your current balance if you have already executed your refund withdrawal.


Check The DAO To ETC Refund

As there are no decent blockchain explorers on the ETC chain, use the MyEtherWallet procedure below to check if you are due for a refund on the ETC chain.

You can check the list theDAOTokenBalance_20160819_155742UTC_balance.xlsx, but this list show your balance before you have executed any refund withdrawals.

Alternatively, install Ethereum Classic Geth 3.3.0.

Sync the chain and execute the following commands to check your amounts:

var whitehatWithdrawAddress = "0x9f5304da62a5408416ea58a17a92611019bd5ce3"; // New re-deployed address
var whitehatWithdrawABIFragment = [{"constant":true,"inputs":[{"name":"_dth","type":"address"}],"name":"calculateWithdraw","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getPaidOut","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_percentageWHG","type":"uint256"}],"name":"withdraw","outputs":[],"type":"function"}];
var whitehatWithdraw = eth.contract(whitehatWithdrawABIFragment).at(whitehatWithdrawAddress);    
 
var myAccount = "{your account}";
 
// Check paid out amount
var paidoutAmount = whitehatWithdraw.getPaidOut(myAccount);
console.log("So far you have been paid " + web3.fromWei(paidoutAmount, "ether") + " ETC");
 
// Check withdrawal amount
var withdrawalAmount = whitehatWithdraw.calculateWithdraw(myAccount);
console.log("You can withdraw " + web3.fromWei(withdrawalAmount, "ether") + " ETC");

Reference The DAO To ETC Refund


How Do I Withdraw The DAO Refunds?

Remember that you will need some ETH in your account to pay for the gas on the ETH chain, and some ETC in your account to pay for the gas in the ETC chain.

See also How to use the Withdraw Contract with Mist.

How Do I Withdraw The DAO Refunds Using MyEtherWallet?

From DAO Token Holders, Come Claim Your Money! Updated Jan 31,2017!:

  • Download dist-v3.3.7.zip from MyEtherWallet v3.3.7 to your computer drive
  • Unzip the dist-v3.3.7.zip file . It is important to keep all the files together in the same directory structure as in the .zip file.
  • Double click on index.html
  • Click on the Withdraw DAO at the bottom of the page
    MEWDeprecatedPage.png
  • Upload your Keystore File (UTC / JSON) and you will see the following screen (there are 0 refunds for the account shown):
    MEWTheDAORefund.png


How Do I Withdraw The DAO ETH Refund Using Go Ethereum?

Install the latest Go Ethereum client from https://github.com/ethereum/go-ethereum/releases .

Sync the chain. See Ethereum Wallet Syncing Problems if you have difficulty syncing your chain.

Execute the following commands (with response shown):

> var account = "{your account}";
undefined
 
> var password = "{your password}";
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
 
> personal.unlockAccount(account, password);
true 
 
> 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

// Unlock a second time as the first unlock may have expired 
> personal.unlockAccount(account, password);
true 
 
> 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

Following are just the commands:

var account = "{your account}";
var password = "{your password}";
var theDAOAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413";
var theDAOWithdrawalAddress = "0xbf4ed7b27f1d666546e30d74d50d173d20bca754";
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"}];
personal.unlockAccount(account, password);
var theDAO = web3.eth.contract(theDAOABIFragment).at(theDAOAddress);
var approve = theDAO.approve(theDAOWithdrawalAddress, theDAO.balanceOf(account), {from: account});
eth.getTransaction(approve);

// Wait a few blocks (~ 15 seconds each) for your approve transaction to get mined
 
var theDAOWithdrawalABIFragment = [{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"type":"function"}];
var theDAOWithdrawal = web3.eth.contract(theDAOWithdrawalABIFragment).at(theDAOWithdrawalAddress);
personal.unlockAccount(account, password);
var withdrawal = theDAOWithdrawal.withdraw({from: account});
eth.getTransaction(withdrawal);

Reference The DAO To ETH Refund.

How Do I Withdraw The DAO ETH ExtraBalance Refund Using Go Ethereum?

Install the latest Go Ethereum client from https://github.com/ethereum/go-ethereum/releases .

Sync the chain. See Ethereum Wallet Syncing Problems if you have difficulty syncing your chain.

Execute the following commands (with response shown):

> var account = "{your account}";
undefined
 
> var password = "{your password}";
undefined
 
// Unlock your account
> personal.unlockAccount(account, password)
true
 
> var extraBalTokenAddress = "0x5c40ef6f527f4fba68368774e6130ce6515123f2";
undefined
 
> var extraBalTokenABIFragment = [{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"}];
undefined
 
> var extraBalTokenContract = eth.contract(extraBalTokenABIFragment).at(extraBalTokenAddress);
undefined
 
> var extraBalWithdrawalAddress = "0x755cdba6ae4f479f7164792b318b2a06c759833b";
undefined
 
> var extraBalWithdrawalABIFragment = [{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"type":"function"}];
undefined
 
> var extraBalWithdrawalContract = eth.contract(extraBalWithdrawalABIFragment).at(extraBalWithdrawalAddress); 
undefined
 
> var balance = extraBalTokenContract.balanceOf(account);
undefined
 
> console.log("Your extraBalTokenContract.balance() for " + account + " is " + web3.fromWei(balance, "ether") + " ethers");
... 10 ethers
 
// Approve the transfer of your tokens from the extraBalToken contract
// to the extraBalWithdrawal contract
> var approve = extraBalTokenContract.approve(extraBalWithdrawalAddress, balance, {from: account, value: 0});
undefined
 
> console.log("approve() returned " + approve);
...
 
// Wait for approve() to be mined. Repeat checking using the following command until you get a non-null result.
> eth.getTransactionReceipt(approve).blockNumber;
...
 
// Unlock your account a second time as the first unlock may have expired
> personal.unlockAccount(account, password)
true
 
> var withdraw = extraBalWithdrawalContract.withdraw({from: account, value: 0});
undefined
 
> console.log("withdraw() returned " + withdraw);
...
 
// Wait for withdraw() to be mined. Repeat checking using the following command until you get a non-null result.
> eth.getTransactionReceipt(withdraw).blockNumber;
...
 
// Your withdrawal should now be complete. Check your account balance has received the withdrawal amount.
> web3.fromWei(eth.getBalance(account), "ether");
10

Following are just the commands:

var account = "{your account}";
var password = "{your password}";
personal.unlockAccount(account, password)
var extraBalTokenAddress = "0x5c40ef6f527f4fba68368774e6130ce6515123f2";
var extraBalTokenABIFragment = [{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"}];
var extraBalTokenContract = eth.contract(extraBalTokenABIFragment).at(extraBalTokenAddress);
var extraBalWithdrawalAddress = "0x755cdba6ae4f479f7164792b318b2a06c759833b";
var extraBalWithdrawalABIFragment = [{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"type":"function"}];
var extraBalWithdrawalContract = eth.contract(extraBalWithdrawalABIFragment).at(extraBalWithdrawalAddress); 
var balance = extraBalTokenContract.balanceOf(account);
console.log("Your extraBalTokenContract.balance() for " + account + " is " + web3.fromWei(balance, "ether") + " ethers");
 
// Approve the transfer of your tokens from the extraBalToken contract to the extraBalWithdrawal contract
var approve = extraBalTokenContract.approve(extraBalWithdrawalAddress, balance, {from: account, value: 0});
console.log("approve() returned " + approve);
 
// Wait for approve() to be mined. Repeat checking using the following command until you get a non-null result.
eth.getTransactionReceipt(approve).blockNumber;
 
// Unlock your account a second time as the first unlock may have expired
personal.unlockAccount(account, password)
var withdraw = extraBalWithdrawalContract.withdraw({from: account, value: 0});
console.log("withdraw() returned " + withdraw);

Reference The DAO ExtraBalance Refund.

How Do I Withdraw The DAO ETC Refund Using Go Ethereum Classic?

Install Ethereum Classic Geth 3.3.0 (or latest).

Sync the chain and execute the following commands to check your amounts:

var account = "{your account}";
var password = "{your password}";

// This is the amount in percentage you will be donating to the Whitehat group for their efforts in obtaining a refund on the ETC chain
var percentageWHGDonation = 10; // MINIMUM 0, MAX 100
 
var whitehatWithdrawAddress = "0x9f5304da62a5408416ea58a17a92611019bd5ce3"; // New re-deployed address
var whitehatWithdrawABIFragment = [{"constant":true,"inputs":[{"name":"_dth","type":"address"}],"name":"calculateWithdraw","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getPaidOut","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_percentageWHG","type":"uint256"}],"name":"withdraw","outputs":[],"type":"function"}];
var whitehatWithdraw = eth.contract(whitehatWithdrawABIFragment).at(whitehatWithdrawAddress);    
 
// Check paid out amount
var paidoutAmount = whitehatWithdraw.getPaidOut(account);
console.log("So far you have been paid " + web3.fromWei(paidoutAmount, "ether") + " ETC");
 
// Check withdrawal amount
var withdrawalAmount = whitehatWithdraw.calculateWithdraw(account);
console.log("You can withdraw " + web3.fromWei(withdrawalAmount, "ether") + " ETC");
 
// Unlock your account
personal.unlockAccount(account, password);
 
// Withdraw
var withdraw = whitehatWithdraw.withdraw(account, percentageWHGDonation, {from: account, value: 0, gas:200000});
console.log(withdraw);

Reference The DAO To ETC Refund.

How To Sync The Blockchain To Use The JavaScript Console

The Easiest Way To Sync To The Ethereum Chain With A JavaScript Console

Install the latest Parity client from https://parity.io/parity.html .

Install the latest Go Ethereum client from https://github.com/ethereum/go-ethereum/releases .

Execute the following command for Parity to download the Ethereum chain. Run this in one console window:

parity --warp --jsonrpc-apis "web3,eth,net,parity,traces,rpc,personal"

Wait until Parity is fully synced (it took a few hours for me). You can check the block numbers against http://etherscan.io/ .

In another console window, attach geth to the Parity node using the following command:

geth attach rpc:http://localhost:8545

You can now use this geth console to execute the commands listed above under:


The Easiest Way To Sync To The Classic Chain With A JavaScript Console

Install the latest Parity client from https://parity.io/parity.html .

Install the latest Go Ethereum client from https://github.com/ethereum/go-ethereum/releases .

Execute the following command for Parity to download the Classic chain (I don't think --warp made any difference). Run this in one console window:

parity --chain classic --warp --jsonrpc-apis "web3,eth,net,parity,traces,rpc,personal"

Wait until Parity is fully synced (it took a few hours for me). You can check the block numbers against http://gastracker.io/ .

In another console window, attach geth to the Parity node using the following command:

geth attach rpc:http://localhost:8545

You can now use this geth console to execute the commands listed above under:


How Do I Withdraw The DAO To ETC Refund If I Have A Contract Wallet?

Run Parity on the classic chain with the `--geth` flag to simulate `geth`. Wait until the warp sync is completed:

parity --chain classic  --warp --geth

Then run Ethereum Wallet and create a Watch Contract in Ethereum Wallet with the following details:

  • Name: WhitehatWithdraw
  • Address: 0x9f5304da62a5408416ea58a17a92611019bd5ce3
  • ABI:
[{"constant":true,"inputs":[{"name":"_dth","type":"address"}],"name":"calculateWithdraw","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getPaidOut","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_percentageWHG","type":"uint256"}],"name":"withdraw","outputs":[],"type":"function"}]

You can then execute the Withdraw function with your contract wallet. Set beneficiary to the account that your refunds is to be sent to. IMPORTANT: You may have to increase the gas to 200,000 for the transaction to execute successfully.

You may want to study the WhitehatWithdraw contract source code at https://github.com/BitySA/whetcwithdraw/blob/a63e3755dbbbbf40402e8938898cad11b74ba293/whetcwithdraw.sol

Run Parity on the classic chain with the `--geth` flag to simulate `geth`. Wait until the warp sync is completed:

Alternatively, you can run Parity and use the Parity web user interface at http://localhost:8080 to interact with the WhitehatWithdraw contract using the address and ABI above. The Parity command follows - you will have to wait until the sync is completed:

parity --chain classic  --warp

Then use your contract wallet to interact with the WhitehatWithdraw contract to execute the Withdraw function as described above, taking note of the gas required.


What Is The Easiest Way To Have A Client On The ETH and ETC Chain Without Using A Web Wallet?

parity --warp
  • To sync to the ETC chain:
parity --chain classic --warp
  • To access the wallet interface to both the ETH or ETC chain, navigate in your web browser http://localhost:8080 . You can view your accounts, transfer your funds and execute contract calls.


Reddit Posts On Refunds

See:


BokkyPooBah's Ether Refundable Prize

To incentivise The DAO token holders to withdraw their refunds before Apr 15 2017, the digital gift token backed by ethers BokkyPooBah's Ether Refundable Prize (BERP) tokens have been created to be distributed to people who have withdrawn their refunds.


Other Links

See: