У меня есть переменная: TokenPriceWei = 2000, это означает, что я устанавливаю цену 1 токена за 2000 Wei.
Когда я получаю msg.value , правильно ли tokensAmount = (msg.value / TokenPriceWei) для получения правильной суммы токена?
Мне интересно, потому что я видел несколько примеров, и ни один из них не делает этого при расчете скорости токена/wei.
Теоретически это правильно, но помните, что вы не можете представлять десятичную точку в твердости.
если отправить 3500wei операция 3500/2000 = 1 а не 1.75. Есть три решения:
Требовать это: require(msg.value%TokenPriceWei == 0)
, чтобы люди отправляли точную сумму за целое число токенов. (не так дружелюбно)
Получите количество токенов как msg.value/TokenPriceWei
и затем верните покупателю эту сумму: msg.value % TokenPriceWei
, которая является остатком от деления в примере 3500/2000
это 1
токен купленный и затем 1500wei
возвращенный пользователю.
decimals
Используйте множитель, чтобы иметь возможность косвенно представлять десятичную точку . Затем включите переменную :
decimals = 10**3; // 3 is the number of decimal points, it can be anything you want, 18 is most used in tokens
numberoftokens = (masg.value*decimals)/TokenPriceWei;
Обратите внимание, что это делает огромное количество токенов ERC20. Mist будет использовать переменные десятичные дроби, чтобы исправить значение при представлении его пользователям. Вам нужно помнить об этом множителе во всем, что вы делаете с токенами, так это делается в большинстве контрактов с токенами. Например, в примере 3500wei
вы получите: 3500*1000/2000 = 3500000/2000 = 1750
Mist получит, что десятичные знаки есть, 1000
и покажет, что у пользователя есть 1.75
токены.
Надеюсь, поможет.