Я экспериментирую с MyAdvancedToken
кодом по адресу: 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
}
Если amount purchased = msg.value/buyPrice
, то как вообще можно купить токен стоимостью менее 1ETH? buyPrice
не может быть десятичным числом меньше 1. Другими словами, я хочу, чтобы человек мог отправить 1 ETH и получить 10 токенов. Эта математика не позволяет этого ( buyPrice
не может быть 0,1).
В некоторых документах говорится, что value
это buyPrice
должно быть в wei, а не в ETH. В этом случае я мог заставить математику работать. Однако при тестировании с использованием MyEtherWallet и приложения Ethereum Wallet я вижу, msg.value
что это ETH. Если я отправлю 1 ETH с помощью buyPrice = 10
, пользователь купит 0,1 токена.
Есть ли какой-то трюк, чтобы получить msg.value
Wei вместо ETH?
Спасибо.
В рамках контракта msg.value
всегда находится в Вэй. Внешние приложения иногда отображают значения в Eth для «удобства» пользователя, но внутри транзакции это всегда Wei.
Обратите внимание, что то же самое верно и для значений токенов в контрактах. Например, этот MyAdvancedToken
токен имеет decimals
значение 18 (такое же, как у эфира). Когда вы покупаете 0,1 токена, внутри вы фактически покупаете 10 17 токенов. Пользовательский интерфейс может использовать этот decimals
параметр для преобразования его в 0,1 для отображения.
[Чтобы расширить это, теперь я больше не на мобильном телефоне.]
Как для эфира, так и для токенов у вас есть две вещи:
decimals
параметра. Часто это также 18, но не обязательно.В вашем примере MyAdvancedToken
равно decimals
18, как и Эфир. Таким образом, вы не можете выпустить больше токенов, чем количество поступающего эфира, поскольку buyPrice
это целое число, равное единице или больше.
Если вы хотите выпустить 10 токенов за 1 Eth, вы можете сделать одно из следующих действий:
Установите buyPrice
1 и decimals
17. Каждый Wei купит 1 токен, но пользовательский интерфейс будет отображать его в 10 раз больше.
Установите buyPrice
10 17 и decimals
0. Каждый Эфир будет покупать 10 базовых токенов, и они будут отображаться как целые токены.
Установите buyPrice
на 10 x и decimals
на 17 - x
.
Или вы можете забыть обо всем этом и просто умножить на величину, обратную buyPrice
(10), а не делить на цену покупки. Это, пожалуй, самое простое.
Все это, конечно, большая головная боль. Я действительно ненавижу концепцию токена ERC20 decimals
. Вот долгое обсуждение этого. Я предпочитаю жесткое кодирование decimals
до 0, между прочим.
GAEfan