Estoy experimentando con el MyAdvancedToken
có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? buyPrice
no 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 ( buyPrice
no puede ser 0.1).
Parte de la documentación dice eso value
y buyPrice
debe 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.value
aparece 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.value
wei en lugar de ETH?
Gracias.
Dentro de un contrato, msg.value
siempre 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 MyAdvancedToken
token se ha decimals
establecido 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 decimals
pará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:
decimals
parámetro. Suele ser también 18, pero no es necesario que lo sea.En tu ejemplo, MyAdvancedToken
tiene decimals
igual a 18, lo mismo que Ether. Por lo tanto, no puede emitir más tokens que la cantidad de Ether que ingresa, ya que buyPrice
es 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 buyPrice
en 1 y decimals
en 17. Cada Wei comprará 1 token, pero la interfaz de usuario lo mostrará como 10 veces más grande.
Establézcalo buyPrice
en 10 17 y decimals
en 0. Cada Ether comprará 10 fichas base y se mostrarán como fichas completas.
Establézcalo buyPrice
en 10 x y decimals
en 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 decimals
concepto de token ERC20. Aquí hay una larga discusión al respecto. Prefiero la codificación decimals
a 0, fwiw.
GAEfan