// SPDX-License-Identifier: MIT pragma solidity 0.8.30; /// @notice DEMONSTRATION TOKENS ON ROBINHOOD CHAIN. Neither token has monetary value or claims on real assets. contract DemoUSD { string public constant name = "Veridion Demo USD"; string public constant symbol = "dUSD"; uint8 public constant decimals = 6; uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public nextClaimAt; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function faucet() external { require(block.timestamp >= nextClaimAt[msg.sender], "FAUCET_COOLDOWN"); nextClaimAt[msg.sender] = block.timestamp + 1 days; uint256 amount = 10_000 * 1e6; totalSupply += amount; balanceOf[msg.sender] += amount; emit Transfer(address(0), msg.sender, amount); } function approve(address spender, uint256 amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) external returns (bool) { _transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) external returns (bool) { uint256 permitted = allowance[from][msg.sender]; require(permitted >= amount, "INSUFFICIENT_ALLOWANCE"); allowance[from][msg.sender] = permitted - amount; emit Approval(from, msg.sender, permitted - amount); _transfer(from, to, amount); return true; } function _transfer(address from, address to, uint256 amount) internal { require(to != address(0), "ZERO_ADDRESS"); require(balanceOf[from] >= amount, "INSUFFICIENT_BALANCE"); balanceOf[from] -= amount; balanceOf[to] += amount; emit Transfer(from, to, amount); } } /// @notice Fixed 1:1 test-token vault. No yield, admin, upgrade, or external strategy. /// @dev Demonstrates allowance, custody, share minting and redemption; not a real RWA offering. contract VeridionDemoVault { string public constant name = "Veridion Demo Vault Share"; string public constant symbol = "vDEMO"; uint8 public constant decimals = 6; DemoUSD public asset; uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); event Deposit(address indexed account, uint256 assets, uint256 shares); event Redeem(address indexed account, uint256 assets, uint256 shares); constructor() { require(block.chainid == 4663, "ROBINHOOD_MAINNET_ONLY"); asset = new DemoUSD(); } function totalAssets() external view returns (uint256) { return asset.balanceOf(address(this)); } function deposit(uint256 amount) external { require(amount > 0, "ZERO_AMOUNT"); require(asset.transferFrom(msg.sender, address(this), amount), "TRANSFER_FAILED"); totalSupply += amount; balanceOf[msg.sender] += amount; emit Transfer(address(0), msg.sender, amount); emit Deposit(msg.sender, amount, amount); } function redeem(uint256 shares) external { require(shares > 0, "ZERO_AMOUNT"); require(balanceOf[msg.sender] >= shares, "INSUFFICIENT_SHARES"); balanceOf[msg.sender] -= shares; totalSupply -= shares; emit Transfer(msg.sender, address(0), shares); require(asset.transfer(msg.sender, shares), "TRANSFER_FAILED"); emit Redeem(msg.sender, shares, shares); } function approve(address spender, uint256 amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) external returns (bool) { _transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) external returns (bool) { uint256 permitted = allowance[from][msg.sender]; require(permitted >= amount, "INSUFFICIENT_ALLOWANCE"); allowance[from][msg.sender] = permitted - amount; emit Approval(from, msg.sender, permitted - amount); _transfer(from, to, amount); return true; } function _transfer(address from, address to, uint256 amount) internal { require(to != address(0), "ZERO_ADDRESS"); require(balanceOf[from] >= amount, "INSUFFICIENT_SHARES"); balanceOf[from] -= amount; balanceOf[to] += amount; emit Transfer(from, to, amount); } }