Как лучше всего работать с десятичными знаками при создании валюты?
Давайте использовать пример. У меня есть KARLCOIN (KARL), и у меня их 1 000 000, а токен имеет 6 знаков после запятой. У этого токена также будет краудфандинг, где 100 KARL = 1 ETH (0,01 ETH/KARL).
Когда я создаю этот контракт, я должен сделать что-то вроде:
// Constructor
function token() {
owner = msg.sender;
totalSupply = 1000000;
balances[owner] = totalSupply;
decimals = 6;
symbol = "KARL";
}
И затем этот токен также имеет функцию передачи.
Теперь, как я вычисляю, перевожу и отображаю эти суммы? Например, 1 000 000 KARL — это 1 000 000 000 000 наименьшей единицы моей монеты. Назовем его микроКарл, или мк.
Означает ли это, что totalSupply в моем конструкторе должен быть на самом деле 1 000 000 000 000? Когда я перечисляю суммы людям, я перевожу их в mK? По сути, количество Карл * 1 000 000, чтобы привести его в форму микроКарла? Как MyEtherWallet и MetMask узнают, как отображать правильную сумму?
Если бы я использовал web3 для его отображения, я мог бы просто посчитать и отобразить его самостоятельно. Получите сумму в mK, умножьте на 0,000001, а затем отправляйтесь в путь. Верно? Или я тут не в теме?
Я сделал токен и сделал что-то вроде этого (это была долгая ночь) и отправил себе токены, а в MetaMask написано правильное количество. На Etherscan это не так, он показывает гораздо меньшую сумму, а также говорит, что десятичные знаки равны «18», когда MetaMask захватил их как 6, просто вставив адрес контракта.
Я просто немного запутался в десятичном представлении токенов и чувствую, что у меня нет основы того, что я делаю для отладки этого. Любая ясность будет оценена.
Если ваш токен соответствует стандарту ERC20 (а так и должно быть, если вы хотите, чтобы он обрабатывался кошельками или клиентскими приложениями), вы можете включить (это не обязательно, но обрабатывается большинством клиентов) информацию о десятичных знаках .
Таким образом, ваш контракт должен содержать что-то вроде:
uint8 public constant decimals = 6;
И ваш код должен предполагать, что суммы указаны в наименьших возможных единицах.
Используйте его следующим образом:
uint256 public constant decimals = 6;
uint256 public constant totalSupply = 1000000*10**decimals;
Диабет Джонс
Михал Клечек
Диабет Джонс
Диабет Джонс
Михал Клечек
Диабет Джонс