Vault

Description:

Smart contract deployed on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;

contract Vault {
    uint256 public constant LOCKUP_PERIOD = 14 days;
    uint256 public constant MAX_MAKER_SEND_PERCENTAGE = 9990;
    uint256 public constant PERCENTAGE_BASE = 10000;

    address public maker; 
    struct UserDeposit {
        uint256 balance;
        uint256 unlockTime;
    }

    mapping(address => UserDeposit) private userDeposits;

    event Deposit(address indexed user, uint256 amount);
    event Send(address indexed user, uint256 amount);
    event MakerSend(address indexed maker, uint256 amount);

    uint256 private _status = 1;

    modifier nonReentrant() {
        require(_status != 2, "ReentrancyGuard: reentrant call");
        _status = 2;
        _;
        _status = 1;
    }

    modifier onlyMaker() {
        require(msg.sender == maker, "Only maker can perform this action");
        _;
    }

    constructor() {
        maker = msg.sender;
    }

    function deposit() external payable nonReentrant {
        require(msg.value > 0, "Invalid amount");

        UserDeposit storage depositInfo = userDeposits[msg.sender];
        depositInfo.balance += msg.value;
        depositInfo.unlockTime = block.timestamp + LOCKUP_PERIOD;

        emit Deposit(msg.sender, msg.value);
    }

    function send(uint256 amount) external nonReentrant {
        UserDeposit storage depositInfo = userDeposits[msg.sender];

        require(amount > 0, "Amount must be greater than 0");
        require(amount <= depositInfo.balance, "Insufficient balance");
        require(block.timestamp >= depositInfo.unlockTime, "Lockup period not expired");

        depositInfo.balance -= amount;
        payable(msg.sender).transfer(amount);

        emit Send(msg.sender, amount);
    }

    function makerSend(uint256 amount) external onlyMaker nonReentrant {
        require(amount > 0, "Amount must be bigger than 0");

        uint256 contractBalance = address(this).balance;
        uint256 maxAllowedsend = (contractBalance * MAX_MAKER_SEND_PERCENTAGE) / PERCENTAGE_BASE;

        require(amount <= maxAllowedsend, "send limit exceeded");

        payable(maker).transfer(amount);

        emit MakerSend(maker, amount);
    }

    function getUserBalance(address user) external view returns (uint256) {
        return userDeposits[user].balance;
    }

    function getUnlockTime(address user) external view returns (uint256) {
        return userDeposits[user].unlockTime;
    }
}

Tags:
addr:0x42a7819c0574c871a448fde6f466c4b5953f2741|verified:true|block:23425399|tx:0xcf2ce088535b45e58381775f4a146a2a8da53b10af9132a79a987b5ee0128bc3|first_check:1758723460

Submitted on: 2025-09-24 16:17:45

Comments

Log in to comment.

No comments yet.