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;
}
}
Submitted on: 2025-09-24 16:17:45
Comments
Log in to comment.
No comments yet.