Solidity: TypeError: Функция объявлена ​​как представление, но это выражение изменяет состояние и, таким образом, требует, чтобы функция не оплачивалась (по умолчанию) или подлежит оплате.

Я пытался создать смарт-контракт / токен, разверну его в тестовой сети Binance Smart Chain. Я следил за некоторой документацией и начал с этого. Я вникаю в эту проблему с функцией. Функция объявлена ​​как только для чтения. Вот исходный код

Функция изменяет состояние адреса владельца, какой еще вариант объявить его как доступный только для чтения


      // SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.2;

//import "Context.sol";
//import "IBEP20.sol";
//import "SafeMath.sol";
//import "Ownable.sol";

contract SampleTaken {
    
    
    mapping(address => uint) public balances;
    
    uint public totalSupply = 1000000 * 10 ** 18;
    string public name ="Sample Token";
    string public symbol ="KJA";
    uint public decimals = 18;
    
    /** Events aailable for the Contract**/
    
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    
    constructor(){
        balances[msg.sender] = totalSupply;
    }
    
    function balanceOf(address _ownerAddress) public view returns (uint){
        return balances[_ownerAddress];
    }
    
    function transfer(address _toAddress, uint _noOfTokens) public view returns (bool){
    require(balanceOf(msg.sender) >= _noOfTokens, "Total balance is less than the number of Tokens asked for !!!");
    balances[_toAddress] +=_noOfTokens;
    balances[msg.sender] -= _noOfTokens;
    emit Transfer(msg.sender,_toAddress, _noOfTokens);
    return true;
    }
    
    function transferFrom(address _from, address _to, uint _value) public returns (bool){
     require(balanceOf(_from) >= _value, "Balance is less than the number of Tokens asked for !!!");
    // require(allowance[_from][msg.sender] >= _value, "Allowance too low");
     balances[_to] += _value;
     balances[_from] -= _value;   
     
     emit Transfer (_from, _to, _value);
     return true;
     
     }    
}

Любая помощь очень ценится.

С Уважением

2 ответа

Ваша функция объявлена ​​как функция.

Функции могут быть объявлены как представления, и в этом случае они обещают не изменять состояние.

Источник: документы Solidity

Но эти строки (в пределах transfer() функция) изменить состояние:

      balances[_toAddress] +=_noOfTokens;
balances[msg.sender] -= _noOfTokens;
emit Transfer(msg.sender,_toAddress, _noOfTokens);

Если вы хотите, чтобы ваша функция изменяла состояние, это не может быть (или pure) - и вам нужно удалить view модификатор:

      function transfer(address _toAddress, uint _noOfTokens) public returns (bool){

Удалять viewили же pureключевое слово из объявления функции и оставить только public returns

Изменять

      function transfer(address _toAddress, uint _noOfTokens) public view returns (bool)

к

      function transfer(address _toAddress, uint _noOfTokens) public returns (bool)

Измененный метод:

      function transfer(address _toAddress, uint _noOfTokens) public returns (bool){
    require(balanceOf(msg.sender) >= _noOfTokens, "Total balance is less than the number of Tokens asked for !!!");
    balances[_toAddress] +=_noOfTokens;
    balances[msg.sender] -= _noOfTokens;
    emit Transfer(msg.sender,_toAddress, _noOfTokens);
    return true;
    }
    
Другие вопросы по тегам