Description:
Smart contract deployed on Ethereum with Factory features.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"ApproveAndTransferBlod.sol": {
"content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.20;\r
\r
/**\r
* ApproveAndTransferBlod.sol\r
* 教学用途:\r
* - (owner)部署合约\r
* - (授权者)对某个 token 合约 approve 给本合约\r
* - 调用合约将 token 从授权者账户转到接收者\r
*\r
* 注意:只在测试网使用!\r
*/\r
interface IERC20 {\r
function allowance(address owner, address spender) external view returns (uint256);\r
}\r
\r
contract ApproveAndTransferBlod {\r
address public owner; //\r
\r
event TransferFromExecuted(address indexed token, address indexed from, address indexed to, uint256 amount, bytes rawReturn);\r
event TransferFromFailed(address indexed token, address indexed from, address indexed to, uint256 amount, string reason);\r
\r
modifier onlyOwner() {\r
require(msg.sender == owner, "only owner can call");\r
_;\r
}\r
\r
constructor() {\r
owner = msg.sender; // 部署合约\r
}\r
\r
/**\r
* 检查某地址对本合约的 allowance\r
*/\r
function checkAllowance(address token, address holder) external view returns (uint256) {\r
return IERC20(token).allowance(holder, address(this));\r
}\r
\r
/**\r
* 核心:从授权者账户将 token 转到接收者\r
* 仅 owner可调用\r
*/\r
function transferFromApproved(\r
address token,\r
address from, // 或其他授权者\r
address to,\r
uint256 amount\r
) external onlyOwner returns (bool) {\r
uint256 allowed = IERC20(token).allowance(from, address(this));\r
require(allowed >= amount, "insufficient allowance");\r
\r
bytes memory data = abi.encodeWithSignature("transferFrom(address,address,uint256)", from, to, amount);\r
(bool success, bytes memory ret) = token.call(data);\r
\r
if (!success) {\r
revert("token.transferFrom call failed");\r
}\r
\r
if (ret.length == 0) {\r
emit TransferFromExecuted(token, from, to, amount, ret);\r
return true;\r
} else {\r
bool ok;\r
if (ret.length >= 32) {\r
ok = abi.decode(ret, (bool));\r
} else {\r
ok = false;\r
}\r
if (!ok) {\r
emit TransferFromFailed(token, from, to, amount, "transferFrom returned false");\r
revert("transferFrom returned false");\r
}\r
emit TransferFromExecuted(token, from, to, amount, ret);\r
return true;\r
}\r
}\r
\r
/**\r
* owner可提取合约自身持有的 token\r
*/\r
function withdrawToken(address token, address to, uint256 amount) external onlyOwner returns (bool) {\r
bytes memory data = abi.encodeWithSignature("transfer(address,uint256)", to, amount);\r
(bool success, bytes memory ret) = token.call(data);\r
require(success, "token.transfer call failed");\r
if (ret.length == 0) {\r
return true;\r
} else {\r
bool ok = abi.decode(ret, (bool));\r
require(ok, "transfer returned false");\r
return true;\r
}\r
}\r
\r
/**\r
* 可选:owner转移合约所有权\r
*/\r
function transferOwnership(address newOwner) external onlyOwner {\r
require(newOwner != address(0), "zero address");\r
owner = newOwner;\r
}\r
}\r
"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": [],
"evmVersion": "london"
}
}}
Submitted on: 2025-11-05 13:38:30
Comments
Log in to comment.
No comments yet.