Функция покупки токена не работает в смарт-контракте краудсейла

Я новичок в блокчейне Эфириума. Я создал краудсейл и смарт-контракт ERC20 и развернул его в тестовой сети rinkeby. Функция передачи токена ERC20 работает нормально.

Но когда я проверяю функциональность функции покупки токена. Так что он запущен успешно. Но когда я проверяю его вывод на https://rinkeby.etherscan.io/ . Таким образом, он показывает 0 передачи токена. И это не показывает цену токена на кошельке.

Код смарт-контракта Crowd Sale выглядит следующим образом:

pragma solidity ^0.4.2;

import "./DappToken.sol";

contract DappTokenSale {
    address admin;
    DappToken public tokenContract;
    uint256 public tokenPrice;
    uint256 public tokensSold;
    uint256 public decimals;


    event Sell(address _buyer, uint256 _amount);

    function DappTokenSale(DappToken _tokenContract, uint256 _tokenPrice) public {
        admin = msg.sender;
        tokenContract = _tokenContract;
        tokenPrice = _tokenPrice;
    }

    function multiply(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function buyTokens(address _receiver, uint256 _amount) public payable {
        _amount = msg.value;
        require(_receiver != address(0));
        require(_amount > 0);
        uint256 tokensToBuy = multiply(_amount, (10 ** decimals)) / 1 ether * tokenPrice;
        require(tokenContract.transfer(msg.sender, tokensToBuy));
        tokensSold += _amount;

        emit Sell(msg.sender, tokensToBuy);
    }

  // Ending Token DappTokenSale
    function endSale() public {
            // Require admin
            require (msg.sender == admin);

             // Transfer remaing DappToken to admin
            require(tokenContract.transfer(admin,tokenContract.balanceOf(this)));


            // Destroy Contract
            selfdestruct(admin);
    }
}

Код солидности DappToken: -

pragma solidity ^0.4.24;

/**
 * The contractName contract does this and that...
 */

contract DappToken {
    // Name
    string public name = "DappToken";
    // Symbol
    string public symbol = 'DAPP';
    //standard
    string public standard = 'DApp Token v1.0';
    //Decimals
    uint256 public decimals = 18;
    //token price
    uint256 public tokenPrice = 2000; //1 eth = 2000 tokens

    uint256 public totalSupply;

    event Transfer(
        address indexed _form,
        address indexed _to,
        uint256 _value
        );

    event Approval(
            address indexed _owner,
            address indexed _spender,
            uint256 _value
        );


    mapping(address => uint256) public balanceOf;
    mapping(address => mapping (address => uint256)) public allowance;


//  function DappToken (uint256 _intialSupply) public {
//      balanceOf[msg.sender] = _intialSupply;
//      totalSupply = _intialSupply;
//      //allocate the intial supply
//
//  }
    constructor(uint256 _intialSupply) public
            {
                balanceOf[msg.sender] = _intialSupply;
                totalSupply = _intialSupply;
            }

    //Transfar
    function transfer(address _to,uint256 _value) public returns (bool success){
    // Exception if account does not enough
    require(balanceOf[msg.sender] >= _value);
    // Transfar the balance
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value; 

    // Transfar Event
    emit Transfer(msg.sender,_to,_value);

    // Return a boolean
    return true;
    } 

    // approve
    function approve(address _spender,uint256 _value) public returns (bool success){
        //allowence
        allowance[msg.sender][_spender] = _value;

        // Approve event
        emit Approval(msg.sender,_spender,_value);
             return true;

    }
    // transfer form
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= balanceOf[_from]);
        require(_value <= allowance[_from][msg.sender]);
        // change the balance
        balanceOf[_from] -= _value;

        //update the balance
       balanceOf[_to] += _value; 

       allowance[_from][msg.sender] -= _value;

       emit Transfer(_from,_to,_value);


        return true;
    }
}

На самом деле я хочу купить функциональность токена следующим образом: -

  1. Количество токенов ввода пользователя (3 эфира).
  2. Я установил цену токена 1 эфир = 2000 токенов.
  3. Итак, когда пользователь вводит 3 эфира, на его счет переводится 6000 токенов.

Итак, мой запрос : -

Запрос-1 : Почему функция покупки токена не отправляет 6000 токенов на счет получателя??

Запрос-1 : Где я ошибаюсь в коде смарт-контракта?

не должно ли это быть tokensold+=tokenToBuy; ?
Да, ты прав. Я исправляю это. Но значение tokensToBuy равно 0. Где я ошибаюсь в расчетах.
Я думаю, проблема в вашей функции умножения
Я также удаляю функцию умножения и умножаю традиционный метод
Я отлаживаю и обнаруживаю, что это условие - обратная транзакция. требуют (tokenContract.transfer (msg.sender, tokensToBuy)); Поэтому я не могу понять, где я ошибаюсь в коде. ?? Пожалуйста, помогите мне, если вы понимаете
функция перевода вызова с адреса, отличного от адреса владельца
Вы говорите, что вместо значения msg.sender я пишу адрес отправителя. Но как я нахожу адрес в функции покупки токена.
Вы можете поделиться кодом файла DappToken, который вы импортировали?
Привет, я обновил свой вопрос, пожалуйста, проверьте.
я думаю, что это должна быть ваша функция: function buyTokens (address _receiver) public payable { uint256 _amount = msg.value; требуют (_получатель != адрес (0)); требуется (_количество > 0); uint256 tokensToBuy = умножить (_количество, (10 * десятичные знаки)) / 1 цена токена эфира; требуют (tokenContract.transfer (_receiver, tokensToBuy)); tokensold += _amount; выпустить Sell(msg.sender, tokensToBuy); }
Привет, Танвир, я применил твой метод. Я успешно перевожу сумму на свой адрес для продажи. Как я могу проверить, находит ли конечный пользователь токен или нет?? Могу ли я связаться с вами?? Если да, сообщите номер своего мобильного телефона.
Но вызов формы я легко понимаю мой запрос.

Ответы (1)

Я думаю, что это должна быть ваша функция:

function buyTokens(address _receiver) public payable { 
uint256 _amount = msg.value; 
require(_receiver != address(0)); require(_amount > 0); 
uint256 tokensToBuy = multiply(_amount, (10 * decimals)) / 1 ether tokenPrice;
require(tokenContract.transfer(_receiver, tokensToBuy)); 
tokensSold += _amount; 

emit Sell(msg.sender, tokensToBuy); }

Редактировать: Вы можете проверить количество токенов, полученных конечным пользователем через Metamask .