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 buy
funció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, buyPrice
deberí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?
Cuando dice que buyPrice
deberí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 buyPrice
en 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.value
por 1 ether
y 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;
}