ApproveAndTransferBlod

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"
  }
}}

Tags:
Factory|addr:0x403618227cc185eab902abe4caf6c15c8bd6a302|verified:true|block:23732036|tx:0xb0e0864590a961c33830b9ca468737d61d9111911f06becc6b2cc5e3a32ae648|first_check:1762346308

Submitted on: 2025-11-05 13:38:30

Comments

Log in to comment.

No comments yet.