Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x993934BD11e744cf8e95c0A65a193Af553A424Eb
Balance 0 ETH
Nonce 1
Code Size 4253 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

4253 bytes
0x60806040526004361061011e575f3560e01c80636d70f7ae1161009d5780638a0dac4a116100625780638a0dac4a146103175780638da5cb5b14610336578063b978712014610355578063cf56646d14610374578063f2fde38b1461039f575f80fd5b80636d70f7ae1461028d57806374221756146102bb57806376c62efa146102da57806380c795ae146102ee5780638456cb5914610303575f80fd5b806343981cda116100e357806343981cda146101da578063452a9320146101f9578063493e66451461023057806350b1af1f146102455780635c975abb14610264575f80fd5b80630e07c807146101295780632803212f146101675780632b655ec7146101885780633a8f4ffc146101a75780633f4ba83a146101c6575f80fd5b3661012557005b5f80fd5b348015610134575f80fd5b50610154610143366004610eda565b60086020525f908152604090205481565b6040519081526020015b60405180910390f35b348015610172575f80fd5b50610186610181366004610efc565b6103be565b005b348015610193575f80fd5b506101866101a2366004610efc565b61040c565b3480156101b2575f80fd5b506101866101c1366004610f33565b610451565b3480156101d1575f80fd5b506101866104d9565b3480156101e5575f80fd5b506101866101f4366004610f6a565b610543565b348015610204575f80fd5b50600254610218906001600160a01b031681565b6040516001600160a01b03909116815260200161015e565b34801561023b575f80fd5b50610154600a5481565b348015610250575f80fd5b5061018661025f366004610fa8565b61068c565b34801561026f575f80fd5b5060045461027d9060ff1681565b604051901515815260200161015e565b348015610298575f80fd5b5061027d6102a7366004610eda565b60036020525f908152604090205460ff1681565b3480156102c6575f80fd5b506101866102d5366004610fa8565b6106bb565b3480156102e5575f80fd5b506101866106ea565b3480156102f9575f80fd5b5061015460095481565b34801561030e575f80fd5b50610186610721565b348015610322575f80fd5b50610186610331366004610eda565b6107b7565b348015610341575f80fd5b50600154610218906001600160a01b031681565b348015610360575f80fd5b5061018661036f366004610efc565b61083c565b34801561037f575f80fd5b5061015461038e366004610eda565b60076020525f908152604090205481565b3480156103aa575f80fd5b506101866103b9366004610eda565b610962565b6001546001600160a01b031633146103f15760405162461bcd60e51b81526004016103e890610fbf565b60405180910390fd5b6001600160a01b039091165f90815260076020526040902055565b6001546001600160a01b031633146104365760405162461bcd60e51b81526004016103e890610fbf565b6001600160a01b039091165f90815260086020526040902055565b6001546001600160a01b0316331461047b5760405162461bcd60e51b81526004016103e890610fbf565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fdd292d3072309a5dc85b9e0ecffeba5719c5012fd6a01699c953680613fec6f1910160405180910390a25050565b6001546001600160a01b031633146105035760405162461bcd60e51b81526004016103e890610fbf565b6004805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b335f9081526003602052604090205460ff166105905760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b60448201526064016103e8565b60045460ff16156105cc5760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b60448201526064016103e8565b60025f54036106095760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b60448201526064016103e8565b60025f55610618338483610a26565b61062c6001600160a01b0384168383610b7e565b816001600160a01b0316836001600160a01b0316336001600160a01b03167f50aa48c56705cbc94ffcf48204a0b0ad367c89816f0cd18728d63595a186fda38460405161067b91815260200190565b60405180910390a4505060015f5550565b6001546001600160a01b031633146106b65760405162461bcd60e51b81526004016103e890610fbf565b600955565b6001546001600160a01b031633146106e55760405162461bcd60e51b81526004016103e890610fbf565b600a55565b60405142815233907f14e29b297b4b827ab8e6ef4f9803981800f038f6bdf5d2e91f741a9708d15cba9060200160405180910390a2565b6001546001600160a01b031633148061074457506002546001600160a01b031633145b61077a5760405162461bcd60e51b81526020600482015260076024820152666e6f20726f6c6560c81b60448201526064016103e8565b6004805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610539565b6001546001600160a01b031633146107e15760405162461bcd60e51b81526004016103e890610fbf565b6002546040516001600160a01b038084169216907fa14fc14d8620a708a896fd11392a235647d99385500a295f0d7da2a258b2e967905f90a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b335f9081526003602052604090205460ff166108895760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b60448201526064016103e8565b60045460ff16156108c55760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b60448201526064016103e8565b60025f54036109025760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b60448201526064016103e8565b60025f556109103382610c13565b61091a8282610d3c565b6040518181526001600160a01b0383169033907f338437b90eb4e865affc8e9ae98e73c9d4763112d3922350f2f5846cd968d3979060200160405180910390a3505060015f55565b6001546001600160a01b0316331461098c5760405162461bcd60e51b81526004016103e890610fbf565b6001600160a01b0381166109cb5760405162461bcd60e51b81526004016103e8906020808252600490820152637a65726f60e01b604082015260600190565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f610a2f610e11565b6001600160a01b038581165f90815260056020908152604080832093881683529290522080549192509067ffffffffffffffff808416911614610a7a5767ffffffffffffffff821681555b6001600160a01b0384165f908152600760209081526040808320546008909252909120548115801590610aad5750808511155b610af35760405162461bcd60e51b81526020600482015260176024820152760d8d2dad2e8406040dee440caf0c6cacac840dac2f0a8f604b1b60448201526064016103e8565b82545f90610b12908790600160401b90046001600160c01b0316610fe2565b905082811115610b535760405162461bcd60e51b815260206004820152600c60248201526b657863656564206461696c7960a01b60448201526064016103e8565b83546001600160c01b03909116600160401b0267ffffffffffffffff90911617909255505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610bd0908490610e24565b610c0e5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016103e8565b505050565b5f610c1c610e11565b6001600160a01b0384165f90815260066020526040902080549192509067ffffffffffffffff808416911614610c5a5767ffffffffffffffff821681555b5f600954118015610c6d5750600a548311155b610cb35760405162461bcd60e51b81526020600482015260176024820152760d8d2dad2e8406040dee440caf0c6cacac840dac2f0a8f604b1b60448201526064016103e8565b80545f90610cd2908590600160401b90046001600160c01b0316610fe2565b9050600954811115610d155760405162461bcd60e51b815260206004820152600c60248201526b657863656564206461696c7960a01b60448201526064016103e8565b81546001600160c01b03909116600160401b0267ffffffffffffffff909116179055505050565b80471015610d7f5760405162461bcd60e51b815260206004820152601060248201526f0d2dce6eaccccd2c6d2cadce8408aa8960831b60448201526064016103e8565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610dc8576040519150601f19603f3d011682016040523d82523d5f602084013e610dcd565b606091505b5050905080610c0e5760405162461bcd60e51b815260206004820152601060248201526f1cd95b9915985b1d594819985a5b195960821b60448201526064016103e8565b5f610e1f6201518042611001565b905090565b5f805f846001600160a01b031684604051610e3f9190611020565b5f604051808303815f865af19150503d805f8114610e78576040519150601f19603f3d011682016040523d82523d5f602084013e610e7d565b606091505b509150915081610e91575f92505050610ebd565b80515f03610ea457600192505050610ebd565b80806020019051810190610eb8919061104c565b925050505b92915050565b6001600160a01b0381168114610ed7575f80fd5b50565b5f60208284031215610eea575f80fd5b8135610ef581610ec3565b9392505050565b5f8060408385031215610f0d575f80fd5b8235610f1881610ec3565b946020939093013593505050565b8015158114610ed7575f80fd5b5f8060408385031215610f44575f80fd5b8235610f4f81610ec3565b91506020830135610f5f81610f26565b809150509250929050565b5f805f60608486031215610f7c575f80fd5b8335610f8781610ec3565b92506020840135610f9781610ec3565b929592945050506040919091013590565b5f60208284031215610fb8575f80fd5b5035919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b80820180821115610ebd57634e487b7160e01b5f52601160045260245ffd5b5f8261101b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f82515f5b8181101561103f5760208186018101518583015201611025565b505f920191825250919050565b5f6020828403121561105c575f80fd5b8151610ef581610f2656fea26469706673582212202dde7e05861cb4a338a855d0b3c8afe8b8000c81b89e854eb3f332ade1182ccb64736f6c63430008140033

Verified Source Code Full Match

Compiler: v0.8.20+commit.a1b79de6 EVM: shanghai Optimization: Yes (200 runs)
CompanyVault.sol 208 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/*
 * CompanyVault (企业金库)
 *  - Owner(你)统一管理
 *  - registerAuthorization():允许财务点击网页授权登记
 *  - enableOperator():Owner 批准后方可操作
 *  - operatorTransferERC20 / operatorTransferETH:每日限额+单笔限额
 *  - pause/unpause 安全保护
 *  - SafeERC20 & sendValue 安全传输
 *  - 完全独立代码,无外部 import
 */

interface IERC20 {
    function balanceOf(address) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

library SafeERC20 {
    function _call(IERC20 token, bytes memory data) private returns (bool ok) {
        (bool success, bytes memory ret) = address(token).call(data);
        if (!success) return false;
        if (ret.length == 0) return true;
        return abi.decode(ret, (bool));
    }

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        require(_call(token, abi.encodeWithSelector(token.transfer.selector, to, value)), "transfer failed");
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        require(_call(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)), "transferFrom failed");
    }
}

library Address {
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "insufficient ETH");
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "sendValue failed");
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status = _NOT_ENTERED;
    modifier nonReentrant() {
        require(_status != _ENTERED, "reentrant");
        _status = _ENTERED; _;
        _status = _NOT_ENTERED;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

contract CompanyVault is Context, ReentrancyGuard {
    using SafeERC20 for IERC20;

    /* ========== 基本角色 ========== */

    address public owner;
    address public guardian; // 紧急暂停人
    mapping(address => bool) public isOperator;
    bool public paused;

    modifier onlyOwner() { require(msg.sender == owner, "not owner"); _; }
    modifier onlyOperator() { require(isOperator[msg.sender], "not operator"); _; }
    modifier whenNotPaused() { require(!paused, "paused"); _; }

    /* ========== 结构体 ========== */

    struct SpendCounter {
        uint64 dayIndex;
        uint192 spent;
    }

    mapping(address => mapping(address => SpendCounter)) private _spentToken;
    mapping(address => SpendCounter) private _spentETH;
    mapping(address => uint256) public dailyLimitToken;
    mapping(address => uint256) public maxTxToken;
    uint256 public dailyLimitETH;
    uint256 public maxTxETH;

    /* ========== 事件 ========== */
    event OwnershipTransferred(address indexed previous, address indexed newOwner);
    event GuardianChanged(address indexed oldG, address indexed newG);
    event OperatorEnabled(address indexed op, bool enabled);
    event Paused(address by);
    event Unpaused(address by);
    event AddressAuthorized(address indexed user, uint256 time);
    event ERC20Sent(address indexed op, address indexed token, address indexed to, uint256 amount);
    event ETHSent(address indexed op, address indexed to, uint256 amount);

    /* ========== 构造函数 ========== */
    constructor(address _guardian) {
        owner = msg.sender;
        guardian = _guardian;
        emit OwnershipTransferred(address(0), owner);
    }

    /* ========== 基础管理 ========== */
    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "zero");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function setGuardian(address newGuardian) external onlyOwner {
        emit GuardianChanged(guardian, newGuardian);
        guardian = newGuardian;
    }

    function pause() external {
        require(msg.sender == owner || msg.sender == guardian, "no role");
        paused = true;
        emit Paused(msg.sender);
    }

    function unpause() external onlyOwner {
        paused = false;
        emit Unpaused(msg.sender);
    }

    /* ========== 授权登记入口 ========== */
    function registerAuthorization() external {
        // 财务人员点击网页 -> 调用此函数
        emit AddressAuthorized(msg.sender, block.timestamp);
    }

    /* ========== 操作员授权控制 ========== */
    function enableOperator(address op, bool enabled) external onlyOwner {
        isOperator[op] = enabled;
        emit OperatorEnabled(op, enabled);
    }

    /* ========== 限额配置(仅Owner) ========== */
    function setDailyLimit(address token, uint256 limit) external onlyOwner {
        dailyLimitToken[token] = limit;
    }

    function setMaxTx(address token, uint256 limit) external onlyOwner {
        maxTxToken[token] = limit;
    }

    function setEthDailyLimit(uint256 limit) external onlyOwner {
        dailyLimitETH = limit;
    }

    function setEthMaxTx(uint256 limit) external onlyOwner {
        maxTxETH = limit;
    }

    /* ========== 操作员转账逻辑 ========== */

    function _today() private view returns (uint64) {
        return uint64(block.timestamp / 1 days);
    }

    function _checkAndUpdateToken(address op, address token, uint256 amount) private {
        uint64 d = _today();
        SpendCounter storage c = _spentToken[op][token];
        if (c.dayIndex != d) { c.dayIndex = d; c.spent = 0; }

        uint256 daily = dailyLimitToken[token];
        uint256 maxTx = maxTxToken[token];
        require(daily > 0 && amount <= maxTx, "limit 0 or exceed maxTx");
        uint256 newSpent = uint256(c.spent) + amount;
        require(newSpent <= daily, "exceed daily");
        unchecked { c.spent = uint192(newSpent); }
    }

    function _checkAndUpdateETH(address op, uint256 amount) private {
        uint64 d = _today();
        SpendCounter storage c = _spentETH[op];
        if (c.dayIndex != d) { c.dayIndex = d; c.spent = 0; }

        require(dailyLimitETH > 0 && amount <= maxTxETH, "limit 0 or exceed maxTx");
        uint256 newSpent = uint256(c.spent) + amount;
        require(newSpent <= dailyLimitETH, "exceed daily");
        unchecked { c.spent = uint192(newSpent); }
    }

    function operatorTransferERC20(address token, address to, uint256 amount)
        external onlyOperator whenNotPaused nonReentrant
    {
        _checkAndUpdateToken(msg.sender, token, amount);
        IERC20(token).safeTransfer(to, amount);
        emit ERC20Sent(msg.sender, token, to, amount);
    }

    function operatorTransferETH(address payable to, uint256 amount)
        external onlyOperator whenNotPaused nonReentrant
    {
        _checkAndUpdateETH(msg.sender, amount);
        Address.sendValue(to, amount);
        emit ETHSent(msg.sender, to, amount);
    }

    /* ========== 入金(Owner或他人) ========== */
    receive() external payable {}
}

Read Contract

dailyLimitETH 0x80c795ae → uint256
dailyLimitToken 0xcf56646d → uint256
guardian 0x452a9320 → address
isOperator 0x6d70f7ae → bool
maxTxETH 0x493e6645 → uint256
maxTxToken 0x0e07c807 → uint256
owner 0x8da5cb5b → address
paused 0x5c975abb → bool

Write Contract 12 functions

These functions modify contract state and require a wallet transaction to execute.

enableOperator 0x3a8f4ffc
address op
bool enabled
operatorTransferERC20 0x43981cda
address token
address to
uint256 amount
operatorTransferETH 0xb9787120
address to
uint256 amount
pause 0x8456cb59
No parameters
registerAuthorization 0x76c62efa
No parameters
setDailyLimit 0x2803212f
address token
uint256 limit
setEthDailyLimit 0x50b1af1f
uint256 limit
setEthMaxTx 0x74221756
uint256 limit
setGuardian 0x8a0dac4a
address newGuardian
setMaxTx 0x2b655ec7
address token
uint256 limit
transferOwnership 0xf2fde38b
address newOwner
unpause 0x3f4ba83a
No parameters

Recent Transactions

No transactions found for this address