4

I'm new to Solidity and attempting to add a withdraw ether function for my contract which enables me to release funds the parent contract account, but the compiler (remix) keeps on giving me an undeclared identifier error: onlyOwner is an undeclared identifier.

Any help? Do I have to define, and if so, how?

Please and thanks for the help!

Here's my code: (Concensys Template)

pragma solidity ^0.4.18;import "./EIP20Interface.sol";               
contract BLUBLOXX is EIP20Interface {

uint256 constant private MAX_UINT256 = 2**256 - 1;
mapping (address => uint256) public balances;
mapping (address => mapping (address => uint256)) public allowed;
/*
NOTE:
The following variables are OPTIONAL vanities. One does not have to include them.
They allow one to customise the token contract & in no way influences the core functionality.
Some wallets/interfaces might not even bother to look at this information.
*/
string public name;                   //fancy name: eg Simon Bucks
uint8 public decimals;                //How many decimals to show.
string public symbol;                 //An identifier: eg SBX

uint price = 0.001 ether;

function BLUBLOXX(
    uint256 _initialAmount,
    string _tokenName,
    uint8 _decimalUnits,
    string _tokenSymbol
) public {
    balances[msg.sender] = _initialAmount;               // Give the creator all initial tokens
    totalSupply = _initialAmount;                        // Update total supply
    name = _tokenName;                                   // Set the name for display purposes
    decimals = _decimalUnits;                            // Amount of decimals for display purposes
    symbol = _tokenSymbol;                               // Set the symbol for display purposes
}

function transfer(address _to, uint256 _value) public returns (bool success) {
    require(balances[msg.sender] >= _value);
    balances[msg.sender] -= _value;
    balances[_to] += _value;
    Transfer(msg.sender, _to, _value);
    return true;
}

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
    uint256 allowance = allowed[_from][msg.sender];
    require(balances[_from] >= _value && allowance >= _value);
    balances[_to] += _value;
    balances[_from] -= _value;
    if (allowance < MAX_UINT256) {
        allowed[_from][msg.sender] -= _value;
    }
    Transfer(_from, _to, _value);
    return true;
}

function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
}

function approve(address _spender, uint256 _value) public returns (bool success) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
}

function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
    return allowed[_owner][_spender];
}   

function() public payable{

    uint toMint = msg.value/price;
    totalSupply += toMint;
    balances[msg.sender]+=toMint;

    Transfer(0, msg.sender, toMint);

}

function withdrawEther() external onlyOwner {
owner.transfer(this.balance);

2 Answers 2

3

Yes, you must define the modifier within your contract. Assuming by owner you mean the contract creator, you must define a variable in your contract.

address private owner;

and in the constructor make sure you set it to the contract creator

owner = msg.sender;

then to create the modifier, this would probably do the trick.

modifier onlyOwner(){
    require(msg.sender == owner);
    _;
}
1

onlyOwner is a modifier which adds code to the function. You have specified this in your function, but you didn't specify the modifier itself.

Usually, you would have something like this in your contract:

address owner = msg.sender;

modifier onlyOwner() {
    require(msg.sender == owner);
    _;
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.