Solidity

Implementierung eines Token-Vesting-Smart-Contracts in Solidity

Published on
Implementierung eines Token-Vesting-Smart-Contracts in Solidity

Dieser Artikel beschreibt die Entwicklung eines Solidity-Smart-Contracts für Token-Vesting. Token-Vesting ist ein Mechanismus, der die Freigabe von Tokens über einen bestimmten Zeitraum hinweg regelt. Dies wird oft verwendet, um die langfristige Bindung von Investoren und Teammitgliedern zu gewährleisten.

Kernkomponenten des Smart Contracts:

  • Token-Adresse: Die Adresse des zu vestenden ERC-20 Tokens.
  • Beneficiary: Die Adresse des Empfängers der Tokens.
  • Startdatum: Das Datum, an dem das Vesting beginnt.
  • Vesting-Zeitraum: Die Dauer des Vestings in Sekunden.
  • Cliff: Der Zeitraum in Sekunden, in dem keine Tokens freigegeben werden.
  • Freigabeplan: Die Methode zur Freigabe der Tokens (z.B. linear, exponentiell).

Solidity Code Beispiel (lineare Freigabe):

pragma solidity ^0.8.0;

import "./IERC20.sol";

contract TokenVesting {
    IERC20 public token;
    address public beneficiary;
    uint256 public cliff;
    uint256 public vestingDuration;
    uint256 public startTime;
    uint256 public released;

    constructor(address _token, address _beneficiary, uint256 _startTime, uint256 _cliff, uint256 _vestingDuration) {
        token = IERC20(_token);
        beneficiary = _beneficiary;
        startTime = _startTime;
        cliff = _cliff;
        vestingDuration = _vestingDuration;
    }

    function release() public {
        require(block.timestamp >= startTime + cliff, "Cliff not passed");
        uint256 releasableAmount = releasableTokens();
        require(releasableAmount > 0, "No tokens to release");
        token.transfer(beneficiary, releasableAmount);
        released += releasableAmount;
    }

    function releasableTokens() public view returns (uint256) {
        uint256 vestedAmount = 0;
        if (block.timestamp > startTime + vestingDuration) {
            vestedAmount = token.balanceOf(address(this));
        } else if (block.timestamp >= startTime + cliff) {
            vestedAmount = token.balanceOf(address(this)) * (block.timestamp - (startTime + cliff)) / vestingDuration;
        }
        return vestedAmount - released;
    }
}

Erläuterungen:

  • Der Contract importiert das IERC20 Interface für die Interaktion mit dem ERC-20 Token.
  • Die Funktion release() ermöglicht dem Beneficiary die Freigabe der Tokens.
  • Die Funktion releasableTokens() berechnet die freigabereifen Tokens.
  • Es wird sichergestellt, dass der Cliff verstrichen ist, bevor Tokens freigegeben werden.

Sicherheitsaspekte:

  • Zugriffskontrolle: Die release() Funktion sollte ggf. durch eine komplexere Zugriffskontrolle (z.B. rollenbasierte Zugriffskontrolle) erweitert werden.
  • Re-Entrancy: Der Contract sollte auf Re-Entrancy-Angriffe geprüft werden.
  • Überlauf/Unterlaufschutz: Die Verwendung von SafeMath oder anderen Mechanismen zum Schutz vor Überläufen und Unterläufen ist essentiell.

Weiterführende Aspekte:

Für komplexere Vesting-Szenarien, wie z.B. exponentielle Freigabepläne, müssen die Berechnungen in der releasableTokens() Funktion entsprechend angepasst werden. Die Implementierung einer Pause-Funktion kann auch sinnvoll sein, um den Vertrag im Notfall anzuhalten.

Dieser Artikel bietet einen grundlegenden Überblick. Eine umfassende Prüfung und Anpassung an die spezifischen Anforderungen ist vor der produktiven Verwendung unerlässlich.