微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Solidity:TypeError:函数声明为视图,但此表达式修改了状态,因此需要不可支付默认或可支付

如何解决Solidity:TypeError:函数声明为视图,但此表达式修改了状态,因此需要不可支付默认或可支付

我一直在尝试创建一个智能合约/令牌,将在币安智能链测试网上部署它。我遵循了一些文档并从这个开始。我正在处理这个功能问题。函数被声明为只读。这是源代码

函数正在改变所有者地址的状态,还有什么其他选项可以将其声明为只读


// 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;
     
     }    
}

非常感谢任何帮助。

问候

解决方法

您的 transfer() 函数被声明为 view 函数。

函数可以声明为视图,在这种情况下,它们承诺不修改状态。

来源:Solidity docs

但是这些行(在 transfer() 函数中)修改了状态:

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

如果您希望您的函数修改状态,则它不能是 view(也不是 pure)函数 - 您需要删除 view 修饰符:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?