Ich bin neu bei Solidity und versuche, eine Ether-Auszahlungsfunktion für meinen Vertrag hinzuzufügen, die es mir ermöglicht, Gelder auf das übergeordnete Vertragskonto freizugeben, aber der Compiler (Remix) gibt mir weiterhin einen nicht deklarierten Identifikatorfehler: onlyOwner ist ein nicht deklarierter Identifikator.
Irgendeine Hilfe? Muss ich definieren, und wenn ja, wie?
Bitte und danke für die Hilfe!
Hier ist mein Code: (Concensys-Vorlage)
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);
Ja, Sie müssen den Modifikator in Ihrem Vertrag definieren. Angenommen, Sie meinen mit Eigentümer den Vertragsersteller, dann müssen Sie eine Variable in Ihrem Vertrag definieren.
address private owner;
Stellen Sie im Konstruktor sicher, dass Sie den Vertragsersteller festlegen
owner = msg.sender;
Um dann den Modifikator zu erstellen, würde dies wahrscheinlich ausreichen.
modifier onlyOwner(){
require(msg.sender == owner);
_;
}
onlyOwner
ist ein Modifikator, der der Funktion Code hinzufügt. Sie haben dies in Ihrer Funktion angegeben, aber Sie haben den Modifikator selbst nicht angegeben.
In Ihrem Vertrag steht normalerweise so etwas:
address owner = msg.sender;
modifier onlyOwner() {
require(msg.sender == owner);
_;
}