Любой, кто купил DAO в течение последних двух недель этапа краудфандинга The DAO, заплатил более 1 эфира (ETH) за 100 токенов The DAO (DAO). Сумма ETH, превышающая 1 ETH на 100 DAO, хранилась в учетной записи ExtraBalance DAO . Баланс учетной записи extraBalance переведен в мультиподписной кошелек куратора.
Как описано в разделе «Как конвертировать токены The DAO в эфиры с помощью контракта на снятие средств после хардфорка?» , Владельцы токенов DAO в настоящее время могут конвертировать свои DAO в ETH по курсу 100 DAO = 1 ETH.
Как мне получить возмещение суммы, которую я заплатил сверх 1 эфира за 100 токенов The DAO?
Смотрите также:
Последние инструкции можно найти на сайте The DAO Refunds .
В блоке хард-форка #1,920,000 баланс ETH от DAO и его дочерних DAO (включая баланс со счета extraBalance) был переведен в контракт на вывод средств .
Сразу после хард-форка, в блоке # 1,920,090 , trusteeWithdraw()
в этой транзакции была вызвана функция контакта по снятию средств для перевода 463,798.08818109 ETH в мультиподписной кошелек TheDAOCurator .
См . раздел ExtraBalance в статье The DAO’s Edge Cases Multisig (Post Hard Fork) Гриффа Грина, чтобы узнать о планируемом процессе возмещения.
Вы сможете найти свою учетную запись, которая внесла вклад в учетную запись Extra Balance, на github.com/bokkypoobah/TheDAOData с более подробной информацией в разделе Какие учетные записи внесли вклад в учетную запись ExtraBalance DAO? :
Заметки:
Контракт на снятие средств с ExtraBalance будет профинансирован 15 сентября 2016 года. Контракт на снятие средств Griff Green
будет профинансирован кураторами 15 сентября 2016 года. Затем вы сможете вывести свои эфиры, используя методы, перечисленные ниже. Вы найдете более подробное руководство по выполнению контракта на снятие средств с использованием кошелька Ethereum (аналогично методу 2 ниже) в этой статье по ссылке. Убедитесь, что баланс ETH 0x755cdba6AE4F479f7164792B318b2a06c759833B отличен от нуля, прежде чем пытаться вывести средства.
Контракт на вывод был пополнен кураторами на 344 917,580854976758120496 ETH. Теперь вы можете выполнять свои выводы!
Ниже приведены 3 способа вывода средств:
geth
Обновление 07:00, 17 сентября 2016 г., UTC . От @tayvano
:
Пожалуйста, убедитесь, что средства были внесены, проверив, что контракт на вывод средств extraBalance имеет баланс перед попыткой вывода. Мы запустили этот прямой эфир, так как мы недоступны до ночи 17 сентября. Спасибо.
Запустите MyEtherWallet со страницы https://www.myetherwallet.com/#the-dao (будьте осторожны, так как в Интернете появляются поддельные фишинговые сайты MyEtherWallet с похожими URL-адресами с целью украсть ваши закрытые ключи.)
ОБНОВЛЕНИЕ, 05:22, 8 сентября 2016 г., UTC — Контракт ExtraBalWithdrawal был обновлен — замените старую версию, если вы ее уже настроили. Также обратите внимание, что контракт на вывод средств еще не заполнен.
ОБНОВЛЕНИЕ, 06:04, 9 сентября 2016 г. UTC — @ledgerwatch создал документ « Как отказаться от контракта на возврат дополнительного баланса» , который включает в себя некоторые шаги для защиты от повторного использования.
Убедитесь, что вы загрузили Ethereum Wallet 0.8.1 или более позднюю версию.
При первом запуске Ethereum Wallet 0.8.1 выберите «Да» на вопрос «Хотите ли вы активировать цепочку, в которой средства, связанные с эксплойтом, восстанавливаются в контракт, где они могут быть сняты держателями токенов The DAO?» . Теперь вы сделали выбор в пользу использования хард-форка Ethereum.
ExtraBalToken
контрактВ Ethereum Wallet выберите страницу КОНТРАКТЫ в верхнем меню. Нажмите ПОСМОТРЕТЬ КОНТРАКТ.
ExtraBalToken
0x5c40ef6f527f4fba68368774e6130ce6515123f2
[{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"seal","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"data","type":"uint256[]"}],"name":"fill","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"sealed","outputs":[{"name":"","type":"bool"}],"type":"function"},{"inputs":[],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]
ExtraBalWithdrawal
контрактВ Ethereum Wallet выберите страницу КОНТРАКТЫ в верхнем меню. Нажмите ПОСМОТРЕТЬ КОНТРАКТ.
ExtraBalWithdrawal
0x755cdba6ae4f479f7164792b318b2a06c759833b
[{"constant":false,"inputs":[],"name":"clawback","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"}]
ExtraBalToken.Approve
Это подтвердит перевод токенов с вашей учетной записи на ExtraBalWithdrawal
контракт. Убедитесь, что вы отправляете 0 эфиров, так как эта транзакция может быть воспроизведена в цепочке Ethereum Classic.
Выберите страницу КОНТРАКТЫ в верхнем меню. Нажмите на ЭКСТРАБАЛТОКЕН .
0x755cdba6ae4f479f7164792b318b2a06c759833b
адрес ExtraBalWithdrawal
контакта.ExtraBalWithdrawal.Withdraw
--- ПОКА НЕ ВЫПОЛНЯЙТЕ ЭТУ ИНСТРУКЦИЮ. Кураторы не заполнили extraBalWithdrawal
договор и исполнение не удастся. Этот пост будет обновлен, когда вы сможете выполнить этот скрипт ---
Это приведет к выводу ETH из ExtraBalWithdrawal
контракта на ваш счет. Убедитесь, что вы отправляете 0 эфиров, так как эта транзакция может быть воспроизведена в цепочке Ethereum Classic.
Выберите страницу КОНТРАКТЫ в верхнем меню. Нажмите на EXTRABALWITHDRAWAL . В правой части страницы в разделе ЗАПИСАТЬ КОНТРАКТ выберите функцию Снять . В разделе «Выполнить из » выберите свою учетную запись. Введите 0 в качестве количества ETH в поле «Отправить ETHER». Нажмите кнопку ВЫПОЛНИТЬ, введите свой пароль и подтвердите. Вот изображение экрана:
geth
ОБНОВЛЕНИЕ, 05:22, 8 сентября 2016 г., UTC. Контракт ExtraBalWithdrawal был обновлен, а приведенный ниже код протестирован. Обратите внимание на новый адрес и ABI в приведенном geth
ниже сценарии.
Убедитесь, что вы используете версию geth 1.4.10 или более позднюю. И запускайте свои команды geth с помощью --support-dao-fork option
, чтобы вы были на хард-форке блокчейна.
--- ПОКА НЕ ВЫПОЛНЯЙТЕ СЛЕДУЮЩИЕ КОМАНДЫ. Кураторы не заполнили extraBalWithdrawal
договор и исполнение не удастся. Этот пост будет обновлен, когда вы сможете выполнить этот скрипт ---
user@Kumquat:~$ geth --support-dao-fork console
// Allow chain to sync
var account = "{your account}".toLowerCase();
personal.unlockAccount(account, "{your 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;
var withdraw = extraBalWithdrawalContract.withdraw({from: account, value: 0});
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");
@ledgerwatch в thedao.slack.com/messages/extrabal_community развернул контракт ExtraBalToken по адресу 0x5c40ef6f527f4fba68368774e6130ce6515123f2 .
contract ExtraBalToken {
uint256 public totalSupply;
/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
/* This generates a public event on the blockchain that will notify clients */
event Transfer(address indexed from, address indexed to, uint256 value);
/* Send coins */
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough
if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
balanceOf[msg.sender] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place
}
/* Allow another contract to spend some tokens in your behalf */
function approve(address _spender, uint256 _value)
returns (bool success) {
allowance[msg.sender][_spender] = _value;
return true;
}
/* A contract attempts to get the coins */
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
if (balanceOf[_from] < _value) throw; // Check if the sender has enough
if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
if (_value > allowance[_from][msg.sender]) throw; // Check allowance
balanceOf[_from] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
allowance[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
}
/* This unnamed function is called whenever someone tries to send ether to it */
function () {
throw; // Prevents accidental sending of ether
}
uint constant D160 = 0x10000000000000000000000000000000000000000;
address public owner;
function ExtraBalToken() {
owner = msg.sender;
}
bool public sealed;
// The 160 LSB is the address of the balance
// The 96 MSB is the balance of that address.
function fill(uint[] data) {
if ((msg.sender != owner)||(sealed))
throw;
for (uint i=0; i<data.length; i++) {
address a = address( data[i] & (D160-1) );
uint amount = data[i] / D160;
if (balanceOf[a] == 0) { // In case it's filled two times, it only increments once
balanceOf[a] = amount;
totalSupply += amount;
}
}
}
function seal() {
if ((msg.sender != owner)||(sealed))
throw;
sealed= true;
}
}
Контракт ABI это: [{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"seal","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"data","type":"uint256[]"}],"name":"fill","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"sealed","outputs":[{"name":"","type":"bool"}],"type":"function"},{"inputs":[],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]
.
Затем fill(...)
@ledgerwatch отредактировал контракт ExtraBalToken со значениями extraBalance, сгенерированными из сценария, аналогичного моему сценарию getTheDAOCreatedTokenEventsWithNonZeroExtraBalance_v4 . Результаты моего скрипта можно найти в CreatedTokenEventsWithNonZeroExtraBalance_v4.txt или CreatedTokenEventsWithNonZeroExtraBalance_v4.xlsx .
Я протестировал контракт ExtraBalToken — см. сценарий сверки и отчет на github.com/bokkypoobah/TheDAOData/ExtraBalTokenValuesReconciliation .
Затем контракт был оформлен seal()
в блоке № 2 202 674 .
ExtraBalWithdrawal
ДоговорОБНОВЛЕНИЕ 05:22 8 сентября 2016 UTC ( ExtraBalWithdrawal
в WithdrawDAO
исходном коде) был обновлен и развернут по новому адресу. trusteeWithdraw(...)
был заменен на clawback()
.
@ledgerwatch развернул обновленный контракт на 0x755cdba6ae4f479f7164792b318b2a06c759833b .
// Refund contract for extraBalance
// Amounts to be paid are tokenized in another contract and allow using the same refund contract as for theDAO
// Though it may be misleading, the names 'DAO', 'mainDAO' are kept here for the ease of code review
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(0x5c40ef6f527f4fba68368774e6130ce6515123f2);
address constant public trustee = 0xda4a4626d3e16e094de3225a751aab7128e96526;
function withdraw(){
uint balance = mainDAO.balanceOf(msg.sender);
if (!mainDAO.transferFrom(msg.sender, this, balance) || !msg.sender.send(balance))
throw;
}
/**
* Return funds back to the curator.
*/
function clawback() external {
if (msg.sender != trustee) throw;
if (!trustee.send(this.balance)) throw;
}
}
Контракт ABI это: [{"constant":false,"inputs":[],"name":"clawback","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"}]
.
ПРИМЕЧАНИЕ . В этот контракт еще не добавлены эфиры для вывода держателями токенов DAO.
Люди, которые считают, что имеют право на дополнительный баланс, могут также проверить свой баланс в этих двух файловых результатах.
По состоянию на пятницу, 26 августа, два других файла от Arachnid и Bokkypoobah имеют небольшие проблемы с округлением при расчете ETH. (Bokkypoobah отличается всего на 0,000000000086360144 ETH, так что вы тоже можете доверять его результатам)
.plus(...)
— github.com/bokkypoobah/TheDAOETCTokenBalance/blob/master/… , но оставил свой ответ как есть, поскольку цифры достаточно хороши. Спасибо еще раз.
q9f
пользователь3541