2025-01-13 12:04:03 +01:00
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity 0.8.28;
|
|
|
|
|
|
|
|
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
|
|
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
|
|
|
|
|
|
|
|
using SafeERC20 for IERC20;
|
|
|
|
|
|
|
|
contract Vault {
|
|
|
|
IERC20 private immutable _token;
|
2025-01-14 12:09:48 +01:00
|
|
|
|
|
|
|
type Controller is address;
|
|
|
|
type Context is bytes32;
|
|
|
|
type Recipient is address;
|
|
|
|
|
|
|
|
mapping(Controller => mapping(Context => mapping(Recipient => uint256)))
|
|
|
|
private _available;
|
2025-01-13 12:04:03 +01:00
|
|
|
|
|
|
|
constructor(IERC20 token) {
|
|
|
|
_token = token;
|
|
|
|
}
|
|
|
|
|
2025-01-14 12:09:48 +01:00
|
|
|
function balance(
|
|
|
|
Context context,
|
|
|
|
Recipient recipient
|
|
|
|
) public view returns (uint256) {
|
|
|
|
Controller controller = Controller.wrap(msg.sender);
|
|
|
|
return _available[controller][context][recipient];
|
2025-01-13 12:04:03 +01:00
|
|
|
}
|
|
|
|
|
2025-01-14 12:09:48 +01:00
|
|
|
function deposit(Context context, address from, uint256 amount) public {
|
|
|
|
Controller controller = Controller.wrap(msg.sender);
|
|
|
|
Recipient recipient = Recipient.wrap(from);
|
|
|
|
_available[controller][context][recipient] += amount;
|
|
|
|
_token.safeTransferFrom(from, address(this), amount);
|
2025-01-13 12:04:03 +01:00
|
|
|
}
|
|
|
|
|
2025-01-14 12:09:48 +01:00
|
|
|
function withdraw(Context context, Recipient recipient) public {
|
|
|
|
Controller controller = Controller.wrap(msg.sender);
|
|
|
|
uint256 amount = _available[controller][context][recipient];
|
|
|
|
delete _available[controller][context][recipient];
|
|
|
|
_token.safeTransfer(Recipient.unwrap(recipient), amount);
|
2025-01-13 12:04:03 +01:00
|
|
|
}
|
2025-01-14 14:11:53 +01:00
|
|
|
|
|
|
|
function burn(Context context, Recipient recipient) public {
|
|
|
|
Controller controller = Controller.wrap(msg.sender);
|
|
|
|
uint256 amount = _available[controller][context][recipient];
|
|
|
|
delete _available[controller][context][recipient];
|
|
|
|
_token.safeTransfer(address(0xdead), amount);
|
|
|
|
}
|
2025-01-13 12:04:03 +01:00
|
|
|
}
|