Ayuda de Solidity - Identificador no declarado - onlyOwner WithdrawEther

Soy nuevo en Solidity e intento agregar una función de retiro de éter para mi contrato que me permite liberar fondos de la cuenta principal del contrato, pero el compilador (remix) sigue dándome un error de identificador no declarado: onlyOwner es un identificador no declarado.

¿Alguna ayuda? ¿Tengo que definir, y si es así, cómo?

Por favor y gracias por la ayuda!

Aquí está mi código: (Plantilla Concensys)

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);

Respuestas (2)

Sí, debe definir el modificador dentro de su contrato. Suponiendo que por propietario se refiere al creador del contrato, debe definir una variable en su contrato.

address private owner;

y en el constructor, asegúrese de configurarlo para el creador del contrato

owner = msg.sender;

luego, para crear el modificador, esto probablemente funcionaría.

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

onlyOwneres un modificador que agrega código a la función. Ha especificado esto en su función, pero no especificó el modificador en sí.

Por lo general, tendría algo como esto en su contrato:

address owner = msg.sender;

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