La función Buy() no actúa como se esperaba

Estoy experimentando con el MyAdvancedTokencódigo en: https://www.ethereum.org/token

    function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner public {
        sellPrice = newSellPrice;
        buyPrice = newBuyPrice;
    }

    function buy() payable public {
        uint amount = msg.value / buyPrice;               // calculates the amount
        _transfer(this, msg.sender, amount);              // makes the transfers
    }

Si el amount purchased = msg.value/buyPrice, ¿cómo es posible comprar un token que valga menos de 1ETH? buyPriceno puede ser un decimal menor que 1. En otras palabras, lo quiero para que una persona pueda enviar 1 ETH y recibir 10 tokens. Esta matemática no permite eso ( buyPriceno puede ser 0.1).

Parte de la documentación dice eso valuey buyPricedebe estar en wei, no en ETH. En ese caso, podría hacer que las matemáticas funcionaran. Sin embargo, en las pruebas con MyEtherWallet y la aplicación Ethereum Wallet, veo que msg.valueaparece como ETH. Si envío 1 ETH, con buyPrice = 10, el usuario termina comprando 0.1 tokens.

¿Hay algún truco para que sea msg.valuewei en lugar de ETH?

Gracias.

Respuestas (1)

Dentro de un contrato, msg.valuesiempre está en Wei. Las aplicaciones front-end a veces mostrarán valores en Eth como una "conveniencia" para el usuario, pero dentro de la transacción siempre es Wei.

Tenga en cuenta que algo similar es cierto para los valores de los tokens dentro de los contratos. Por ejemplo, este MyAdvancedTokentoken se ha decimalsestablecido en 18 (lo mismo que Ether). Cuando compra 0.1 tokens, internamente en realidad está comprando 10 17 tokens. Una interfaz de usuario puede usar el decimalsparámetro para traducir esto a 0.1 para su visualización.


[Para ampliar esto ahora que ya no estoy en el móvil.]

Tanto para Ether como para tokens, tienes dos cosas en marcha:

  1. La representación interna, que siempre es un número entero. Para Ether, esto es Wei.
  2. La representación de la interfaz de usuario, que puede ser diferente. Las IU saben que 1 Eth = 10^18 Wei (es decir, 18 decimales). Los tokens ERC20 le indican a la interfaz de usuario cuántas unidades internas componen un token completo a través del decimalsparámetro. Suele ser también 18, pero no es necesario que lo sea.

En tu ejemplo, MyAdvancedTokentiene decimalsigual a 18, lo mismo que Ether. Por lo tanto, no puede emitir más tokens que la cantidad de Ether que ingresa, ya que buyPricees un número entero de uno o más.

Si desea emitir 10 tokens por 1 Eth, puede realizar una de las siguientes acciones:

  • Establézcalo buyPriceen 1 y decimalsen 17. Cada Wei comprará 1 token, pero la interfaz de usuario lo mostrará como 10 veces más grande.

  • Establézcalo buyPriceen 10 17 y decimalsen 0. Cada Ether comprará 10 fichas base y se mostrarán como fichas completas.

  • Establézcalo buyPriceen 10 x y decimalsen 17 - x.

O puede olvidarse de todo esto y simplemente multiplicar por el inverso de buyPrice(10) en lugar de dividir por el precio de compra. Este es probablemente el más simple.


Todo esto es un gran dolor de cabeza, por supuesto. Realmente odio el decimalsconcepto de token ERC20. Aquí hay una larga discusión al respecto. Prefiero la codificación decimalsa 0, fwiw.

En otras palabras, en todos los contratos realizados con ese código repetitivo de ethereum.org, ¿un token comprado no puede tener un valor inferior a 1 ETH? Gracias por la gran respuesta.