// SPDX-License-Identifier: MIT pragma solidity 0.8.26; import {ERC20} from '@openzeppelin/contracts/token/ERC20/ERC20.sol'; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; /// @notice Faucet-only test token, with no economic value or relationship to Circle / WETH issuers. contract DemoToken is ERC20 { address public immutable faucet; uint8 private immutable precision; constructor(string memory name_,string memory symbol_,uint8 decimals_) ERC20(name_,symbol_){faucet=msg.sender;precision=decimals_;} function decimals() public view override returns(uint8){return precision;} function mint(address to,uint256 amount) external {require(msg.sender==faucet,'faucet only');_mint(to,amount);} } /// @notice Fixed illustrative rate: 3000 demo USDC per demo WETH. Not a DEX, oracle or bridge. contract DemoSwap { using SafeERC20 for IERC20; IERC20 public immutable input; IERC20 public immutable output; address public immutable deployer; address public vault; constructor(address input_,address output_){input=IERC20(input_);output=IERC20(output_);deployer=msg.sender;} function setVault(address v) external {require(msg.sender==deployer&&vault==address(0)&&v.code.length>0,'locked');vault=v;} function swap(uint256 amount,address recipient) external returns(uint256 out){ require(msg.sender==vault,'vault only');out=amount*1e12/3000;output.safeTransfer(recipient,out); } }