// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract VentureFund {
struct Anteilseigner {
bool gewaehlt;
uint anteil;
}
mapping(address => Anteilseigner) public anteilseigner; // Ethereum-Adressen
// der Anteilseigner
struct Startup {
address adresse; // Ethereum-Adresse eines Startups für Auszahlung
uint stimmen;
}
Startup[] public startups; // Array von Startups die gewählt werden können
uint public mindestsumme;
uint public fondvolumen;
constructor(address[] memory startupAdressen, uint _mindestsumme) {
mindestsumme = _mindestsumme;
for (uint i = 0; i < startupAdressen.length; i++) {
startups.push(Startup({
stimmen: 0,
adresse: startupAdressen[i]
}));
}
}
// TODO: Was macht diese Funktion? Wie könnte ein Name der Funktion heißen?
function NAME () public payable {
anteilseigner[msg.sender].anteil += msg.value; // 'msg.value'
// entspricht der ETH,
// die bei dem
// Funktionsaufruf
// mitgesendet werden
fondvolumen += msg.value;
}
function abstimmen(uint startupNummer) public {
Anteilseigner storage sender = anteilseigner[msg.sender];
// 'msg.sender' entspricht der
// Ethereum-Adresse des
// Funktionsaufrufenden
// TODO: Funktion selbst schreiben
// Beachte, dass nur Anteilseigner abstimmen dürfen und diese sollten
// noch nicht gewählt haben. Man sollte zudem nur vor dem Ende
// abstimmen dürfen.
// 'sender.gewaehlt' und 'sender.anteil' können genutzt werden genauso
// wie 'startups[startupNummer].stimmen'
}
function auszaehlen() public view
returns (uint gewinner)
{
// TODO: Funktion selbst schreiben
// Nutze eine for-Schleife, um aus dem 'startups'-Array, dasjenige mit
// den meisten Stimmen als Gewinner auszuzählen.
}
function auszahlen() public
{
require(fondvolumen >= mindestsumme, "Noch nicht genug eingesammelt.");
payable(startups[auszaehlen()].adresse).transfer(fondvolumen);
}
}