首页 > 解决方案 > solidity 错误 - 在 uint256 中进行参数相关查找后,成员“子”未找到或不可见

问题描述

我写了一个简单的智能合约,但它在传输函数中有错误,Member "sub" not found or not visible after argument-dependent lookup in uint256.可能导致错误的原因是什么?是因为solidity版本吗?

pragma solidity ^0.5.16;

contract Token {
    string public name = "Token";
    string public symbol = "TK";
    uint256 public decimals = 18;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf; //Track balance

    constructor() public {
        totalSupply = 1000000 * (10 ** decimals);
        balanceOf[msg.sender] = totalSupply;
    }

     //Send Token
    function transfer(address _to, uint256 _value) public returns(bool success){
        balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value); //error on this line
        balanceOf[_to] = balanceOf[_to].add(_value);
        return true;
    } 
}

标签: blockchainsolidity

解决方案


我们需要导入SafeMath.sol库并声明它的用法。之后,我们可以调用带有变量.sub的函数。.adduint256

// SPDX-License-Identifier: MIT
pragma solidity ^0.5.16;

// Import SafeMath library
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
// Or we can import from online
import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/utils/math/SafeMath.sol";

contract Token {
    // declar SafeMath libary usage for uint256
    using SafeMath for uint256;

    string public name = "Token";
    string public symbol = "TK";
    uint256 public decimals = 18;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf; //Track balance

    constructor() public {
        totalSupply = 1000000 * (10 ** decimals);
        balanceOf[msg.sender] = totalSupply;
    }

     //Send Token
    function transfer(address _to, uint256 _value) public returns(bool success){
        balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value); //error on this line
        balanceOf[_to] = balanceOf[_to].add(_value);
        return true;
    } 
}

推荐阅读