¿Cómo obtengo un reembolso por el monto que pagué en exceso de 1 ether a 100 tokens The DAO?

Cualquiera que haya comprado DAO en las últimas dos semanas de la fase de financiación colectiva de The DAO pagó más de 1 ether (ETH) por cada 100 tokens de The DAO (DAO). La cantidad de ETH superior a 1 ETH por cada 100 DAO se almacenó en la cuenta extraBalance de la DAO . El saldo de la cuenta extraBalance ahora se ha transferido a la billetera multisig del curador.

Como se describe en ¿Cómo convierto mis tokens The DAO en éteres usando el contrato de retiro después de la bifurcación dura? , Los titulares de tokens DAO actualmente pueden convertir sus DAO en ETH a una tasa de 100 DAO = 1 ETH.

¿Cómo obtengo un reembolso por el monto que pagué en exceso de 1 ether a 100 tokens The DAO?



Los reembolsos de DAO



Ver también:

Intente agregar más de una etiqueta en el futuro. Agregué algunos apropiados. :-)
¿Hay algún peligro de dejar mis tokens dao sin convertir hasta que los desarrolladores decidan una manera fácil de reembolsar a las personas que pagaron más de 1ETH: 100DAO?

Respuestas (2)

Actualización 29 de marzo de 2017

Las instrucciones más recientes se pueden encontrar en The DAO Refunds .



En el bloque de bifurcación dura #1,920,000, el saldo ETH de The DAO y sus DAO secundarios (que incluye el saldo de la cuenta extraBalance) se transfirieron al contrato de retiro .

Inmediatamente después de la bifurcación dura, en el bloque n.º 1.920.090trusteeWithdraw() , se llamó a la función del contacto de retiro en esta transacción para transferir 463.798,08818109 ETH a la billetera multigrado TheDAOCurator .

Consulte la sección ExtraBalance en The DAO's Edge Cases Multisig (Post Hard Fork) de Griff Green para conocer el proceso de reembolso que se está planificando.

Debería poder encontrar su cuenta que contribuyó a la cuenta Extra Balance en github.com/bokkypoobah/TheDAOData con más detalles en ¿Qué cuentas contribuyeron a la cuenta extraBalance de The DAO? :

Notas:

Actualización 08:07 13 de septiembre de 2016 UTC

Desde ExtraBalance Withdraw Contract to be Funded on September 15th by Griff Green, el contrato de retiro será financiado por los curadores el 15 de septiembre de 2016. Luego podrá retirar sus éteres utilizando los métodos que se enumeran a continuación. Encontrará una guía más detallada para ejecutar el contrato de Retiro utilizando Ethereum Wallet (similar al Método 2 a continuación) en este artículo vinculado. Verifique que el saldo ETH de 0x755cdba6AE4F479f7164792B318b2a06c759833B no sea cero antes de intentar ejecutar su retiro.

Actualización 14:08 17 de septiembre de 2016 UTC

El contrato de retiro ha sido completado por los curadores con 344,917.580854976758120496 ETH. ¡Ya puedes ejecutar tus retiros!


Los siguientes son 3 métodos para retirar sus fondos:

  • Método 1 - MyEtherWallet
  • Método 2 - La billetera Ethereum
  • Método 3 -geth



Método 1 - Retiro usando MyEtherWallet

Actualización 07:00 17 de septiembre de 2016 UTC De @tayvano:

Asegúrese de que los fondos se hayan depositado comprobando que el contrato de retiro extraBalance tenga saldo antes de intentar retirarlo. Hemos empujado este en vivo ya que no estamos disponibles hasta la noche del 17 de septiembre. Gracias.

Ejecute MyEtherWallet desde https://www.myetherwallet.com/#the-dao (tenga cuidado, ya que hay sitios falsos de phishing de MyEtherWallet con URL similares que aparecen en Internet con el objetivo de robar sus claves privadas).ingrese la descripción de la imagen aquí



Método 2 - Retiro usando la billetera Ethereum

ACTUALIZACIÓN 05:22 8 de septiembre de 2016 UTC: el contrato ExtraBalWithdrawal se actualizó; reemplace su versión anterior si ya la configuró. También tenga en cuenta que el contrato de retiro aún no se ha completado.

ACTUALIZACIÓN 06:04 9 de septiembre de 2016 UTC - @ledgerwatch ha creado el documento Cómo retirarse del contrato de reembolso extraBalance que incluye algunos pasos para la protección de reproducción.

Asegúrese de haber descargado Ethereum Wallet 0.8.1 o posterior.

La primera vez que inicie Ethereum Wallet 0.8.1, seleccione "Sí" a la pregunta "¿Desea activar la cadena en la que los fondos vinculados al exploit se restauran a un contrato donde los titulares de tokens DAO pueden retirarlos?" . Ahora ha tomado la decisión de utilizar la cadena Ethereum bifurcada.

Método 2 - Paso 1 - ExtraBalTokenContrato de vigilancia

En Ethereum Wallet, seleccione la página de CONTRATOS en el menú superior. Haga clic en VER CONTRATO.

  • Introduzca un NOMBRE DE CONTRATO deExtraBalToken
  • Introduzca una DIRECCIÓN DE CONTRATO de0x5c40ef6f527f4fba68368774e6130ce6515123f2
  • Ingrese en el campo INTERFAZ JSON el siguiente texto:[{"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"}]
  • Haga clic en Aceptar. Su contrato de reloj debería verse así:ingrese la descripción de la imagen aquí

Método 2 - Paso 2 - ExtraBalWithdrawalContrato de vigilancia

En Ethereum Wallet, seleccione la página de CONTRATOS en el menú superior. Haga clic en VER CONTRATO.

  • Introduzca un NOMBRE DE CONTRATO deExtraBalWithdrawal
  • Introduzca una DIRECCIÓN DE CONTRATO de0x755cdba6ae4f479f7164792b318b2a06c759833b
  • Ingrese en el campo INTERFAZ JSON el siguiente texto:[{"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"}]
  • Haga clic en Aceptar. Su contrato de reloj debería verse así:ingrese la descripción de la imagen aquí

Método 2 - Paso 3 - EjecutarExtraBalToken.Approve

Esto aprobará la transferencia de los tokens de su cuenta al ExtraBalWithdrawalcontrato. Asegúrese de enviar 0 éteres, ya que esta transacción puede reproducirse en la cadena Ethereum Classic.

Seleccione la página CONTRATOS en el menú superior. Haga clic en EXTRABALTOKEN .

  • En el campo Saldo de en el lado izquierdo de la página bajo LEER DEL CONTACTO, ingrese la dirección de su cuenta, TODO EN MINÚSCULAS . Su saldo de retiro en wei debe mostrarse debajo de su dirección.
    • Copie esta cifra de saldo
  • En el lado derecho de la página debajo de ESCRIBIR PARA CONTRATAR
    • Seleccione la función Aprobar .
    • En gastador , ingrese 0x755cdba6ae4f479f7164792b318b2a06c759833b, la dirección del ExtraBalWithdrawalcontacto.
    • Copie el valor en el Saldo del resultado del lado izquierdo de la página y pegue esta cifra en el campo de valor .
    • En Ejecutar desde , seleccione su cuenta.
    • Ingrese 0 como el número de ETH en el campo Enviar ETHER.
    • Haga clic en el botón EJECUTAR, ingrese su contraseña y confirme.

Aquí hay una imagen de pantalla:ingrese la descripción de la imagen aquí

Método 2 - Paso 4 - EjecutarExtraBalWithdrawal.Withdraw

--- NO EJECUTE ESTA INSTRUCCIÓN TODAVÍA. Los curadores no han cumplido el extraBalWithdrawalcontrato y la ejecución fracasará. Esta publicación se actualizará cuando pueda ejecutar este script ---

Esto retirará ETH del ExtraBalWithdrawalcontrato a su cuenta. Asegúrese de enviar 0 éteres, ya que esta transacción puede reproducirse en la cadena Ethereum Classic.

Seleccione la página CONTRATOS en el menú superior. Haga clic en RETIRO EXTRABAL . En el lado derecho de la página, debajo de ESCRIBIR PARA CONTRATAR, seleccione la función Retirar . En Ejecutar desde , seleccione su cuenta. Ingrese 0 como el número de ETH en el campo Enviar ETHER. Haga clic en el botón EJECUTAR, ingrese su contraseña y confirme. Aquí hay una imagen de pantalla:

ingrese la descripción de la imagen aquí



Método 3 - Retiro usandogeth

ACTUALIZACIÓN 05:22 8 de septiembre de 2016 UTC: el contrato ExtraBalWithdrawal se actualizó y se probó el siguiente código. Tenga en cuenta la nueva dirección y ABI en el gethsiguiente script.

Asegúrese de estar ejecutando la versión 1.4.10 o posterior de geth. Y ejecute sus comandos geth con el --support-dao-fork optionpara que esté en la cadena de bloques bifurcada.

--- NO EJECUTE LOS SIGUIENTES COMANDOS TODAVÍA. Los curadores no han cumplido el extraBalWithdrawalcontrato y la ejecución fracasará. Esta publicación se actualizará cuando pueda ejecutar este script ---

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");



Contrato ExtraBalToken

@ledgerwatch en thedao.slack.com/messages/extrabal_community implementó el contrato ExtraBalToken en 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;
    }    
}

El contrato ABI es: [{"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"}].

@ledgerwatch luego fill(...)editó el contrato ExtraBalToken con los valores extraBalance generados a partir de un script similar a mi script getTheDAOCreatedTokenEventsWithNonZeroExtraBalance_v4 . Los resultados de mi secuencia de comandos se pueden encontrar en CreatedTokenEventsWithNonZeroExtraBalance_v4.txt o CreatedTokenEventsWithNonZeroExtraBalance_v4.xlsx .

He probado el contrato de ExtraBalToken; vea el script de reconciliación y el informe en github.com/bokkypoobah/TheDAOData/ExtraBalTokenValuesReconciliation .

Luego, el contrato se editó seal()en el bloque #2,202,674 .



ExtraBalWithdrawalContrato

ACTUALIZACIÓN 05:22 8 de septiembre de 2016 UTCExtraBalWithdrawal ( en el WithdrawDAOcódigo fuente) se actualizó y se implementó en una nueva dirección. trusteeWithdraw(...)ha sido reemplazado por clawback().

@ledgerwatch implementó el contrato actualizado a 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;
    }
}

El contrato ABI es: [{"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"}].

NOTA Este contrato aún no ha agregado los éteres para que los titulares de tokens de DAO puedan retirar.



Referencias adicionales

Estoy publicando lo siguiente como ejemplo para verificar si estoy usando el enfoque correcto para verificar cuántos éteres puedo recibir. Al revisar mis transacciones en Etherscan, creo que pagué 100 éter en The DAO durante la fase final (a 1,5 eth por 100 DAO). Eso se repartió en un total de 7 transacciones pagadas desde la misma dirección única de ether. Al buscar en los cálculos de reembolso de Arachnid, puedo ver mi dirección en la siguiente lista. [ "mi dirección", "33000000000000001049" ], no estoy seguro de lo que significa el número largo. Supongo que significa
Confirmó que tiene 33 ETH en la cuenta ExtraBalance en la hoja de cálculo _v3.xls.
Y es seguro, de todo lo que no puedo entender, ¿cuándo obtengo mi ETH del saldo extra? esa es mi billetera 0x5ed61b8839E823884B68Cefb915BfC0846272b6c
¿Puedes revisar el mío? Debería obtener un reembolso de 5 a 6 ETH ya que traje DAO en el último momento. Mi dirección ETH: 0x70aD044822570A44F2addf89f0B1c16A70FF44dB. También vi mi dirección en la hoja de cálculo.
@Volodka, su contribución extraBalance es 36.666666667 ETH. @ Desconocido, su contribución extraBalance es de 5,5 ETH. Cualquier otro, simplemente verifique su saldo y, si es correcto, todo lo que tiene que hacer es esperar hasta que los fideicomisarios estén listos para reembolsar los montos. Actualmente están ocupados reembolsando los DAO divididos (más complicados). Si sus cantidades no aparecen correctamente en la hoja de cálculo en la columna TokenOwner, dígamelo.
Noté en la hoja de cálculo que algunas de las billeteras indican "Proxy" mientras que otras indican "Propietario". En mi caso, la billetera dice "Proxy", aunque soy dueño de la billetera ETH en cuestión (puedo acceder a ella ahora mismo en myetherwallet.com). ¿No emitirán un sonido de saldo adicional para los titulares de billeteras "Proxy"?
Mi transacción de retiro se atasca de alguna manera, mientras que mi aprobación tiene éxito. EtherScan
@PaulduLong, los curadores aún no han recargado el contrato extraBalWithdraw. Lo anunciaré como una actualización en esta sesión de preguntas y respuestas cuando los curadores decidan hacer esto (o cualquier método alternativo). Solo revisa periódicamente.
Todas estas instrucciones realmente excelentes, suponga que sus tokens DAO se compraron de su CONTRATO DE CUENTA PRINCIPAL, y no de su contrato WALLET ... ¿Cómo se pueden usar las siguientes instrucciones (especialmente las más simples más cerca de la parte superior) si uno compró los tokens dao de su billetera: theethereum.wiki/w/index.php/The_DAO_Refunds Todas las instrucciones requieren que ingrese una dirección de cuenta base, que si lo hace, muestra que posee CERO tokens doa, puede verificar el saldo de su billetera, pero no puede reembolsar Saldo adicional, eth normal, etc.

Las personas que creen que tienen derecho al extraBalance pueden consultar su saldo también en estos dos archivos de resultados

A partir del viernes 26 de agosto, los otros 2 archivos de Arachnid y Bokkypoobah tienen pequeños problemas de redondeo en su cálculo de ETH. (Bokkypoobah solo tiene un error de 0.000000000086360144 ETH, por lo que también puede confiar en sus resultados)

Hola @b25, gracias por proporcionar otro cheque. Más tarde descubrí cómo resolver los problemas de redondeo sumando los números del token DAO usando BigNumber y .plus(...)- github.com/bokkypoobah/TheDAOETCTokenBalance/blob/master/… pero dejé mi respuesta tal como está, ya que las cifras son lo suficientemente buenas. Gracias de nuevo.