【Solidity】Lock 锁

锁在开发产品的过程中还是比较常会用到,例如特定的时间段内不能进行交易,等到特定的时间之后才能继续进行交易。也可以根据特定的账户加锁,加锁了之后就无法再交易。

代码范例

  1. 代币发行者上错上锁,继承了openzeppelin ownable判断是否是发行者,无需写而外的代码。
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.2;

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

contract TimeLock is ERC20, Ownable {
    bool isLock = false;

    constructor() ERC20("testCoin", "TSC") {
        //初始发行10万代币,然后打入作者的户口中
        _mint(msg.sender, 100000 * 10 ** decimals());
    }

    function setLock()public onlyOwner returns(bool){
        //只有合作发行者才能够把合作封锁
        isLock = true;
        return true;
    }

    function transfer(address _to, uint256 _amount) public override returns(bool){
        //如果发现锁着了就会报错
        require(isLock==false,"Contact was lock!");
        return super.transfer(_to,_amount);
    }
}

2. 一分钟内只能发行一次交易

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.2;

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

contract TimeLock is ERC20, Ownable {
    bool isLock = false;

     /**
    1 == 1 seconds
    1 minutes == 60 seconds
    1 hours == 60 minutes
    1 days == 24 hours
    1 weeks == 7 days
    */

    uint public timeLock = block.timestamp;

    constructor() ERC20("testCoin", "TSC") {
        //初始发行10万代币,然后打入作者的户口中
        _mint(msg.sender, 100000 * 10 ** decimals());
    }


    function transfer(address _to, uint256 _amount) public override returns(bool){
        //一分钟只能交易一次,否则就报错
        require(block.timestamp > timeLock,"It's not time yet");
        bool success =  super.transfer(_to,_amount);
        timeLock = block.timestamp +  1 minutes;
        return success;
    }
}

3. 代币发行者能够设定任何的地址为黑名单,所以黑名单户口当中的代币将无法转账给其他户口。

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.2;

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

contract BlacklistLock is ERC20, Ownable {

    mapping(address=>uint8) blacklistAccount;
    constructor() ERC20("testCoin", "TSC") {
        //初始发行10万代币,然后打入作者的户口中
        _mint(msg.sender, 100000 * 10 ** decimals());
    }

    function setBlackList(address _address)public onlyOwner{
        //发行者无法把自己的地址给黑名单掉
        require(_address!=owner(),"cannot blacklist owner address");
        blacklistAccount[_address] = 1;
    }

    function removeBlackList(address _address)public onlyOwner{
        //发行者无法把自己的地址给黑名单掉
        require(_address!=owner(),"cannot remove blacklist owner address");
        delete blacklistAccount[_address];
    }

    function transfer(address _to, uint256 _amount) public override returns(bool){
        //黑名单就无法转账
        require(blacklistAccount[msg.sender]==0,"your account is blacklisted");
        bool success =  super.transfer(_to,_amount);
        return success;
    }
}

Loading

Facebook评论