4

I'm trying to learn how to create tokens using Solidity/MIST.

I have modified a pre existing contract on a functioning token but I am having an error whenever I insert it into Ropsten.

The contract code can be seen here (it pasted oddly into stackexchange)

https://pastebin.com/s6Wc5wMp

The error i'm getting is:

 No visibility specified. Defaulting to "public".
function Ownable() {
^Spanning multiple lines., 

Any help with this would be appreciated.

Matthew Hughes
  • 75
  • 2
  • 10

2 Answers2

5

This is probably a duplicate but I'll leave it to others to confirm that.

The error is really a warning. It's simply saying that no visibility was specified, so it's going with the default. This has been related to security issues in contracts - evidently, developers didn't realize their sensitive functions were open to "public". This error is added to more recent compilers to turn the dev's attention to a possible risk.

You can easily silence the warning by adding the modifier public:

function Ownable() public { ...

This won't change anything about the compiled code but it will signal the compiler that you are aware of the public visibility.

Hope it helps.

Rob Hitchens
  • 55,151
  • 11
  • 89
  • 145
  • Is it safe to leave most things as public? – Matthew Hughes Jan 26 '18 at 18:03
  • I think it's safer to say that visibility should be limited to those who should see it. It just happens that the most common use-case something users and contracts are supposed to see. Public functions are the most common. The Parity debacle is traceable to a public function that (arguably) should have been guarded better because a random user was permitted to execute something that caused some damage. This warning would have said "hey ... do you realize it's public?" – Rob Hitchens Jan 26 '18 at 18:39
  • Thanks for the help Rob, i'm banging my head of the wall, do you have twitter? I've a few questions you could probably answer quickly. I'm @barryflood on twitter. – Matthew Hughes Jan 26 '18 at 18:46
  • I got it working! :-) – Matthew Hughes Jan 26 '18 at 18:56
3

This happens when you are not specifying visibility of the function.

I suggest to read Solidity Documentation to understand Function Types and Visibility and Getters.

There are currently 4 function types:

  • public - can be used both as an internal and as an external function.
  • internal - can only be called inside the current contract.
  • external - can be called from other contracts and via transactions.
  • private - are only visible for the contract they are defined in and not in derived contracts.
Roman Frolov
  • 3,177
  • 2
  • 11
  • 29
  • Thanks for this, i've added public to most things. I'm getting another error now though:

    function mul(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; }

    Function state mutability can be restricted to pure function mul(uint256 a, uint256 b) internal constant returns (uint256) { ^ Spanning multiple lines. ,

    what does that mean?

    – Matthew Hughes Jan 26 '18 at 18:10
  • The same warning. Compiler suggests you to modify visibility of this function to pure. Just do it. – Roman Frolov Jan 26 '18 at 18:12
  • I've done this but keep running into more errors. I appreciate the help.

    what does this mean?

    Overriding function changes state mutability from "pure" to "view". function balanceOf(address _owner) public view returns (uint256 balance) { ^ Spanning multiple lines.

    – Matthew Hughes Jan 26 '18 at 18:26
  • This one means that you need to change visibility from pure to view, because you are using external for this function variables, but not changing any stored data. – Roman Frolov Jan 26 '18 at 18:28
  • It already is set as view I think, unless i'm missing something?

    unction balanceOf(address _owner) public view returns (uint256 balance)

    – Matthew Hughes Jan 26 '18 at 18:31
  • You should make small research and understand how visibility and function types work. If you will have new specific questions feel free to Ask Question. – Roman Frolov Jan 26 '18 at 18:36