Timelock in Solidity – EatTheBlocks

0
Timelock in Solidity – EatTheBlocks

Το timelock είναι ένα κομμάτι κώδικα που κλειδώνει τη λειτουργικότητα μιας εφαρμογής έως ότου περάσει ένα ορισμένο χρονικό διάστημα. Χρησιμοποιήθηκε ευρέως ως ένας τύπος πρωτόγονων έξυπνων συμβολαίων σε πολλά σενάρια Bitcoin προκειμένου να κλειδωθούν τα bitcoin συνήθως για περιόδους μηνών ή ετών.

Αργότερα, η τρέλα του ICO έφερε πολλά έργα απάτης όπου οι ιδρυτές πέταξαν τα κουπόνια τους μόλις μπορούσαν να πάρουν κάποιο κέρδος. Τα έργα Legit άρχισαν να εφαρμόζουν timelocks για να σηματοδοτήσουν τη δέσμευση από τους ιδρυτές, καθώς το timelock λειτούργησε ως μηχανισμός κατοχύρωσης που χρησιμοποιείται ευρέως στον κόσμο των startup.

Η γεωργία απόδοσης και το DeFi έχουν φέρει μια νέα σειρά πονζινομικών, συστημάτων απόρριψης και εκτέλεσης και ζητημάτων διακυβέρνησης. Το Sushiswap είχε ένα πρόσφατο επεισόδιο όπου ο ιδρυτής πέταξε εκατομμύρια δολάρια σε Sushi Tokens από τη δεξαμενή προγραμματιστών και επηρέασε τους κατόχους Sushi, λανθασμένο ή όχι ένα timelock θα μπορούσε να αποτρέψει αυτήν τη συμπεριφορά.

pragma solidity ^0.7.0;
contract DeFiProtocol {
    address public ERC20Token;
    address public uniswapPool;
    uint256 public burnFee;
    function setERC20(address _erc) public {
        ERC20Token = _erc;
    }

    function setUniswapPool(address _pool) public {
        uniswapPool = _pool;
    }

    function setFee(uint256 _fee) public {
        burnFee = _fee;
    }
}

Χαρακτηριστικά ενός timelock:
– Επέκταση από το Ownable, επιτρέψτε μας να προσθέσουμε τον τροποποιητή onlyOwner στις λειτουργίες μας που επιτρέπουν μόνο στον κάτοχο της σύμβασης να τον εκτελέσει.
– Το enum μας επιτρέπει να έχουμε πρόσβαση στη λειτουργία κλειδώματος χρόνου με πιο ευανάγνωστο τρόπο.
– Η σταθερά _TIMELOCK ορίζει πόσο θέλουμε οι συναρτήσεις μας να περιμένουν μέχρι να εκτελεστούν.
– Δημιουργούμε επίσης μια αντιστοίχιση timelock που μας βοηθά να δούμε ποια λειτουργία είναι ξεκλείδωτη αυτήν τη στιγμή και να δημιουργήσουμε τους δικούς μας τροποποιητές ανάλογα

Λειτουργία Timelock σε σταθερότητα

pragma solidity ^0.7.0;

import "@openzeppelin/contracts/access/Ownable.sol";

contract DeFiProtocol is Ownable {

   address public ERC20Token;
   address public uniswapPool;
   uint256 public burnFee;

   enum Functions { ERC, POOL, FEE }    
   uint256 private constant _TIMELOCK = 1 days;
   mapping(Functions => uint256) public timelock;

   modifier notLocked(Functions _fn) {
     require(timelock[_fn] != 0 && timelock[_fn] <= block.timestamp, "Function is timelocked");
     _;
   }

  //unlock timelock
  function unlockFunction(Functions _fn) public onlyOwner {
    timelock[_fn] = block.timestamp + _TIMELOCK;
  }

  //lock timelock
  function lockFunction(Functions _fn) public onlyOwner {
    timelock[_fn] = 0;
  }

  function setERC20(address _erc) public onlyOwner notLocked(Functions.ERC) {
      ERC20Token = _erc;
      timelock[ERC] = 0;
  }

  function setUniswapPool(address _pool) public onlyOwner notLocked(Functions.POOL) {
      uniswapPool = _pool;
      timelock[POOL] = 0;
  }

  function setFee(uint256 _fee) public onlyOwner notLocked(Functions.FEE) {
      burnFee = _fee;
      timelock[FEE] = 0;
  }
}

Schreibe einen Kommentar