¿Cómo pasar valor fraccional en buyPrice?

Estoy implementando un token erc-20 con 18 decimales. Y quiero que si alguien llama a la función de compra con 1 ETH, el contrato debería devolver 1500 tokens a msg.sender. La buyfunción se implementa como:

function buy() public payable returns (uint){
       require(msg.sender != address(0));
       require(msg.value >= 0);
       uint amount = msg.value.div(buyPrice);
       require(balances[this] >= amount);
       uint oldBalance = balances[this].add(balances[msg.sender]);
       balances[this] = balances[this].sub(amount);
       balances[msg.sender] = balances[msg.sender].add(amount);
       uint newBalance = balances[this].add(balances[msg.sender]);
       assert(newBalance == oldBalance);
       Transfer(this, msg.sender, amount);
       return amount;   
  }

Según la implementación de este método, buyPricedebería ser 1/1500. Pero como buyPrice es uint, no puedo pasar valores decimales a esta variable.

¿Hay algún trabajo alrededor? ¿Necesito cambiar la función de compra estándar para que se adapte a mi caso?

Respuestas (2)

Cuando dice que buyPricedebería ser 1/1500, ¿quiere decir que por cada 1 eth el usuario debería recibir 1500 del token? Si ese es el caso, entonces buyPriceen realidad debería ser 1500, y renombrado a algo como tokensToEth, y la cantidad asignada debería seruint amount = msg.value.mul(tokensToEth);

Publicando la solución a mi propia pregunta. Como pensé, tenía que hacer cambios en la función de compra estándar.

Cambio 1: la cantidad se multiplicó por 1 éter, es decir, 10 ^ 18, por lo que el precio de compra en mi caso se convirtió en 10 ^ 18/1500. Ahora buyPrice se establece en Wei.

Cambio 2: Primero multiplica msg.valuepor 1 ethery luego divide por buyPrice. No inviertas el orden ya que dividir primero un valor muy pequeño puede dar como resultado un valor cero y luego multiplicarlo no tendrá ningún efecto.

Cambio 3: verifique si la cantidad es mayor que cero antes de continuar usandorequire(amount > 0);

La función de compra final se convirtió en:

function buy() public payable returns (uint){
       require(msg.sender != address(0));
       require(msg.value >= 0);
       uint amount = msg.value.mul(1 ether).div(buyPrice);
       require(amount > 0);
       require(balances[this] >= amount);
       uint oldBalance = balances[this].add(balances[msg.sender]);
       balances[this] = balances[this].sub(amount);
       balances[msg.sender] = balances[msg.sender].add(amount);
       uint newBalance = balances[this].add(balances[msg.sender]);
       assert(newBalance == oldBalance);
       Transfer(this, msg.sender, amount);
       return amount;    
  }