La billetera Ethereum no permite la transacción incluso después de las condiciones adecuadas

Ethereum Wallet muestra "Parece que esta transacción fallará..." a pesar de que he usado if/else dentro de los contratos para asegurar que el valor de la transferencia no supere el saldo del contrato.

  function mySales( address a) constant public canWithdraw returns (uint){
    return totalSales[a];
}

function topSalesPerson() constant public returns ( address ){
    return topsales;
}

event bonusDepleted(string);

function submitSales() public payable canWithdraw{

    uint amount = msg.value;
    uint bonus_temp;
    if (this.balance >0){
        if(amount > 50000000000000000000){
            bonus_temp = amount/10; // 10% bonus
        }
        if(bonus_temp > 20000000000000000000){
            bonus_temp = 20000000000000000000;  // max bonus = 20 ether
        }

        if (this.balance > bonus_temp){
             msg.sender.transfer(bonus_temp);  // transfer bonus in case of enough balance
        }
       else{
            msg.sender.transfer(this.balance); // else transfer remaining amount as Bonus 
       }
        owner.transfer(amount);

        Bonus[msg.sender] += bonus_temp;
        totalSales[msg.sender] += msg.value;

        if( totalSales[topsales] < totalSales[msg.sender]){
            topsales = msg.sender;
        }
    }

    if(this.balance == 0){
        bonusDepleted("Bonus has reached its limit and no bonus will be provided for future sales");
    }
}`

Entonces, si el contrato tiene 3 éteres, entonces por 50 éteres permite txn, pero por 60 muestra una advertencia y un error "gas intrínseco demasiado bajo", donde debería haber reembolsado los últimos 3 éteres.

También para funciones de solo lectura como "mySales", cómo invocarlas desde "ethereum -wallet" ya que no devuelve nada al ingresar la dirección en esta función en "Leer de la sección de contrato". Puedo usarlo desde la línea de comandos.

Respuestas (1)

Creo que el problema está aquí:

if (this.balance > bonus_temp){
    msg.sender.transfer(bonus_temp);  // transfer bonus in case of enough balance
}
else {
    msg.sender.transfer(this.balance); // else transfer remaining amount as Bonus 
}
owner.transfer(amount);

No hay garantía de que haya fondos suficientes para transferel owner. En particular, cualquier tiempo amountes positivo y procesas la elsecláusula, el saldo del contrato será entonces cero, y la línea posterior revertirá la transacción.

Una solución razonable podría ser hacerlo transferantes owner de calcular la bonificación, pero realmente depende del comportamiento que desee.