Address Details
contract

0x04C3d955e84FBcbe159d8eeCeaF77d16b52A47E0

Contract Name
Faucet
Creator
0xb28fab–e5a0c9 at 0xd49a9d–08eac7
Balance
58 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
14,025 Transactions
Transfers
64,005 Transfers
Gas Used
2,626,648,183
Last Balance Update
14678905
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
Faucet




Optimization enabled
true
Compiler version
v0.5.17+commit.d19bba13




Optimization runs
200
EVM Version
istanbul




Verified at
2022-05-22T09:04:41.330744Z

/Users/huanglu/workspace/ETHEREUM/venus/chee-faucet/contracts/Faucet.sol

pragma solidity 0.5.17;

import "./IERC20.sol";
import "./AddressHelper.sol";

contract Faucet {
    using AddressHelper for address;

    mapping(address => uint256) public withdrawAuth;
    uint256 public period = 8400;

    IERC20[] public tokens;
    mapping(address => uint256) public tokensInfo;

    address public admin;

    constructor() public {
        admin = msg.sender;
    }

    function withdraw() public {
        require(msg.sender == tx.origin, "do not withdraw from contract");

        uint256 start = withdrawAuth[msg.sender];
        require(start + period < block.number, "Please wait");

        for (uint256 i = 0; i < tokens.length; i++) {
            uint256 per = tokensInfo[address(tokens[i])];
            if (per > 0) {
                if (tokens[i].balanceOf(address(this)) >= per) {
                    address token = address(tokens[i]);
                    address(tokens[i]).safeTransfer(msg.sender, per);

                    emit Withdraw(
                        msg.sender,
                        token,
                        tokensInfo[address(tokens[i])]
                    );
                }
            }
        }
        withdrawAuth[msg.sender] = block.number;
    }

    function setPer(address _token, uint256 _per) public onlyAdmin {
        require(tokensInfo[_token] > 0, "Not exist");
        tokensInfo[_token] = _per;
    }

    function addToken(IERC20 _token, uint256 _per) public onlyAdmin {
        require(tokensInfo[address(_token)] == 0, "Token exists");
        require(_per > 0, "per > 0");
        uint256 index = tokens.length++;
        tokens[index] = _token;
        tokensInfo[address(_token)] = _per;
        emit AddToken(address(_token), _per);
    }

    function setPeriod(uint256 _period) public onlyAdmin {
        period = _period;
        emit SetPeriod(_period);
    }

    function removeToken(IERC20 _token) public onlyAdmin {
        IERC20[] memory _tokens = tokens;
        for (uint256 i = 0; i < _tokens.length; i++) {
            if (address(_tokens[i]) == address(_token)) {
                tokens[i] = tokens[_tokens.length - 1];
                delete tokens[_tokens.length - 1];
                delete tokensInfo[address(_token)];
                uint256 balance = _token.balanceOf(address(this));
                if (balance > 0) {
                    address(_token).safeTransfer(
                        admin,
                        _token.balanceOf(address(this))
                    );
                }
                emit RemoveToken(address(_token));
                break;
            }
        }
    }

    function tokensLength() public view returns (uint256) {
        return tokens.length;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "Not Authorized, Only Admin");
        _;
    }

    event AddToken(address _token, uint256 _per);

    event SetPer(address _token, uint256 _per);

    event Withdraw(address withdrawer, address token, uint256 amount);

    event RemoveToken(address _token);

    event SetPeriod(uint256 _period);
}
        

/Users/huanglu/workspace/ETHEREUM/venus/chee-faucet/contracts/AddressHelper.sol

pragma solidity 0.5.17;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library AddressHelper {
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TRANSFER_FAILED"
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TRANSFER_FROM_FAILED"
        );
    }

    function safeTransferEther(address to, uint256 value) internal {
        (bool success, ) = to.call.value(value)(new bytes(0));
        require(success, "ETH_TRANSFER_FAILED");
    }

    function isContract(address token) internal view returns (bool) {
        if (token == address(0x0)) {
            return false;
        }
        uint256 size;
        assembly {
            size := extcodesize(token)
        }
        return size > 0;
    }

    /**
     * @dev returns the address used within the protocol to identify ETH
     * @return the address assigned to ETH
     */
    function ethAddress() internal pure returns (address) {
        return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    }
}
          

/Users/huanglu/workspace/ETHEREUM/venus/chee-faucet/contracts/IERC20.sol

pragma solidity 0.5.17;

interface IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function allocateTo(address _owner, uint256 value) external;

    function transfer(address _to, uint256 _value)
        external
        returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function approve(address _spender, uint256 _value)
        external
        returns (bool success);

    function allowance(address _owner, address _spender)
        external
        view
        returns (uint256 remaining);
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[]},{"type":"event","name":"AddToken","inputs":[{"type":"address","name":"_token","internalType":"address","indexed":false},{"type":"uint256","name":"_per","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RemoveToken","inputs":[{"type":"address","name":"_token","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"SetPer","inputs":[{"type":"address","name":"_token","internalType":"address","indexed":false},{"type":"uint256","name":"_per","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetPeriod","inputs":[{"type":"uint256","name":"_period","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"withdrawer","internalType":"address","indexed":false},{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"addToken","inputs":[{"type":"address","name":"_token","internalType":"contract IERC20"},{"type":"uint256","name":"_per","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"period","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"removeToken","inputs":[{"type":"address","name":"_token","internalType":"contract IERC20"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setPer","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_per","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setPeriod","inputs":[{"type":"uint256","name":"_period","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"tokens","inputs":[{"type":"uint256","name":"","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensInfo","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensLength","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"withdraw","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawAuth","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true}]
              

Contract Creation Code

Verify & Publish
0x60806040526120d060015534801561001657600080fd5b50600480546001600160a01b03191633179055610ca8806100386000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063af81c5b911610071578063af81c5b914610160578063b77b2e141461018c578063ba8dbea2146101c4578063d92fc67b146101ea578063ef78d4fd146101f2578063f851a440146101fa576100a9565b80630f3a9f65146100ae5780633ccfd60b146100cd5780634f64b2be146100d55780635fa7b5841461010e578063ad2bc27214610134575b600080fd5b6100cb600480360360208110156100c457600080fd5b5035610202565b005b6100cb610299565b6100f2600480360360208110156100eb57600080fd5b5035610525565b604080516001600160a01b039092168252519081900360200190f35b6100cb6004803603602081101561012457600080fd5b50356001600160a01b031661054c565b6100cb6004803603604081101561014a57600080fd5b506001600160a01b03813516906020013561083c565b6100cb6004803603604081101561017657600080fd5b506001600160a01b03813516906020013561090a565b6101b2600480360360208110156101a257600080fd5b50356001600160a01b0316610a9a565b60408051918252519081900360200190f35b6101b2600480360360208110156101da57600080fd5b50356001600160a01b0316610aac565b6101b2610abe565b6101b2610ac5565b6100f2610acb565b6004546001600160a01b0316331461025e576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b60018190556040805182815290517f1445a8659aa0e3feb1c4a3ea8344a4e720c388d7ce59ab4824248fbc3bd1ef949181900360200190a150565b3332146102ed576040805162461bcd60e51b815260206004820152601d60248201527f646f206e6f742077697468647261772066726f6d20636f6e7472616374000000604482015290519081900360640190fd5b336000908152602081905260409020546001544390820110610344576040805162461bcd60e51b815260206004820152600b60248201526a141b19585cd9481dd85a5d60aa1b604482015290519081900360640190fd5b60005b60025481101561050f576000600360006002848154811061036457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020549050801561050657806002838154811061039f57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156103ee57600080fd5b505afa158015610402573d6000803e3d6000fd5b505050506040513d602081101561041857600080fd5b5051106105065760006002838154811061042e57fe5b9060005260206000200160009054906101000a90046001600160a01b0316905061048233836002868154811061046057fe5b6000918252602090912001546001600160a01b0316919063ffffffff610ada16565b7f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb338260036000600288815481106104b657fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283019091205482519584168652939092169184019190915282810191909152519081900360600190a1505b50600101610347565b5050336000908152602081905260409020439055565b6002818154811061053257fe5b6000918252602090912001546001600160a01b0316905081565b6004546001600160a01b031633146105a8576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6060600280548060200260200160405190810160405280929190818152602001828054801561060057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105e2575b50939450600093505050505b815181101561083757826001600160a01b031682828151811061062b57fe5b60200260200101516001600160a01b0316141561082f57600260018351038154811061065357fe5b600091825260209091200154600280546001600160a01b03909216918390811061067957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060026001835103815481106106b857fe5b6000918252602080832090910180546001600160a01b03191690556001600160a01b03851680835260038252604080842084905580516370a0823160e01b8152306004820152905191926370a0823192602480840193829003018186803b15801561072257600080fd5b505afa158015610736573d6000803e3d6000fd5b505050506040513d602081101561074c57600080fd5b5051905080156107ed5760048054604080516370a0823160e01b81523093810193909352516107ed926001600160a01b03928316928816916370a0823191602480820192602092909190829003018186803b1580156107aa57600080fd5b505afa1580156107be573d6000803e3d6000fd5b505050506040513d60208110156107d457600080fd5b50516001600160a01b038716919063ffffffff610ada16565b604080516001600160a01b038616815290517f4eb129c82dcd3eedb52df2b0e6fb4cfa41ac64ee9d63ff081acbb1877e85d79b9181900360200190a150610837565b60010161060c565b505050565b6004546001600160a01b03163314610898576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6001600160a01b0382166000908152600360205260409020546108ee576040805162461bcd60e51b8152602060048201526009602482015268139bdd08195e1a5cdd60ba1b604482015290519081900360640190fd5b6001600160a01b03909116600090815260036020526040902055565b6004546001600160a01b03163314610966576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6001600160a01b038216600090815260036020526040902054156109c0576040805162461bcd60e51b815260206004820152600c60248201526b546f6b656e2065786973747360a01b604482015290519081900360640190fd5b600081116109ff576040805162461bcd60e51b81526020600482015260076024820152660706572203e20360cc1b604482015290519081900360640190fd5b60028054600091610a139060018301610c36565b90508260028281548110610a2357fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591851680825260038352604091829020859055815190815291820184905280517fe1bea1af9b1d1aede8b7fa043080de8690470a8ae61449360b3d0c0bf8104b469281900390910190a1505050565b60006020819052908152604090205481565b60036020526000908152604090205481565b6002545b90565b60015481565b6004546001600160a01b031681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310610b575780518252601f199092019160209182019101610b38565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610bb9576040519150601f19603f3d011682016040523d82523d6000602084013e610bbe565b606091505b5091509150818015610bec575080511580610bec5750808060200190516020811015610be957600080fd5b50515b610c2f576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b81548183558181111561083757600083815260209020610837918101908301610ac291905b80821115610c6f5760008155600101610c5b565b509056fea265627a7a72315820da7ee823a92ae770917ec7755b0d39e23df9342f86563f87d16576ca99b16df864736f6c63430005110032

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063af81c5b911610071578063af81c5b914610160578063b77b2e141461018c578063ba8dbea2146101c4578063d92fc67b146101ea578063ef78d4fd146101f2578063f851a440146101fa576100a9565b80630f3a9f65146100ae5780633ccfd60b146100cd5780634f64b2be146100d55780635fa7b5841461010e578063ad2bc27214610134575b600080fd5b6100cb600480360360208110156100c457600080fd5b5035610202565b005b6100cb610299565b6100f2600480360360208110156100eb57600080fd5b5035610525565b604080516001600160a01b039092168252519081900360200190f35b6100cb6004803603602081101561012457600080fd5b50356001600160a01b031661054c565b6100cb6004803603604081101561014a57600080fd5b506001600160a01b03813516906020013561083c565b6100cb6004803603604081101561017657600080fd5b506001600160a01b03813516906020013561090a565b6101b2600480360360208110156101a257600080fd5b50356001600160a01b0316610a9a565b60408051918252519081900360200190f35b6101b2600480360360208110156101da57600080fd5b50356001600160a01b0316610aac565b6101b2610abe565b6101b2610ac5565b6100f2610acb565b6004546001600160a01b0316331461025e576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b60018190556040805182815290517f1445a8659aa0e3feb1c4a3ea8344a4e720c388d7ce59ab4824248fbc3bd1ef949181900360200190a150565b3332146102ed576040805162461bcd60e51b815260206004820152601d60248201527f646f206e6f742077697468647261772066726f6d20636f6e7472616374000000604482015290519081900360640190fd5b336000908152602081905260409020546001544390820110610344576040805162461bcd60e51b815260206004820152600b60248201526a141b19585cd9481dd85a5d60aa1b604482015290519081900360640190fd5b60005b60025481101561050f576000600360006002848154811061036457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020549050801561050657806002838154811061039f57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156103ee57600080fd5b505afa158015610402573d6000803e3d6000fd5b505050506040513d602081101561041857600080fd5b5051106105065760006002838154811061042e57fe5b9060005260206000200160009054906101000a90046001600160a01b0316905061048233836002868154811061046057fe5b6000918252602090912001546001600160a01b0316919063ffffffff610ada16565b7f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb338260036000600288815481106104b657fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283019091205482519584168652939092169184019190915282810191909152519081900360600190a1505b50600101610347565b5050336000908152602081905260409020439055565b6002818154811061053257fe5b6000918252602090912001546001600160a01b0316905081565b6004546001600160a01b031633146105a8576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6060600280548060200260200160405190810160405280929190818152602001828054801561060057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105e2575b50939450600093505050505b815181101561083757826001600160a01b031682828151811061062b57fe5b60200260200101516001600160a01b0316141561082f57600260018351038154811061065357fe5b600091825260209091200154600280546001600160a01b03909216918390811061067957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060026001835103815481106106b857fe5b6000918252602080832090910180546001600160a01b03191690556001600160a01b03851680835260038252604080842084905580516370a0823160e01b8152306004820152905191926370a0823192602480840193829003018186803b15801561072257600080fd5b505afa158015610736573d6000803e3d6000fd5b505050506040513d602081101561074c57600080fd5b5051905080156107ed5760048054604080516370a0823160e01b81523093810193909352516107ed926001600160a01b03928316928816916370a0823191602480820192602092909190829003018186803b1580156107aa57600080fd5b505afa1580156107be573d6000803e3d6000fd5b505050506040513d60208110156107d457600080fd5b50516001600160a01b038716919063ffffffff610ada16565b604080516001600160a01b038616815290517f4eb129c82dcd3eedb52df2b0e6fb4cfa41ac64ee9d63ff081acbb1877e85d79b9181900360200190a150610837565b60010161060c565b505050565b6004546001600160a01b03163314610898576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6001600160a01b0382166000908152600360205260409020546108ee576040805162461bcd60e51b8152602060048201526009602482015268139bdd08195e1a5cdd60ba1b604482015290519081900360640190fd5b6001600160a01b03909116600090815260036020526040902055565b6004546001600160a01b03163314610966576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6001600160a01b038216600090815260036020526040902054156109c0576040805162461bcd60e51b815260206004820152600c60248201526b546f6b656e2065786973747360a01b604482015290519081900360640190fd5b600081116109ff576040805162461bcd60e51b81526020600482015260076024820152660706572203e20360cc1b604482015290519081900360640190fd5b60028054600091610a139060018301610c36565b90508260028281548110610a2357fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591851680825260038352604091829020859055815190815291820184905280517fe1bea1af9b1d1aede8b7fa043080de8690470a8ae61449360b3d0c0bf8104b469281900390910190a1505050565b60006020819052908152604090205481565b60036020526000908152604090205481565b6002545b90565b60015481565b6004546001600160a01b031681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310610b575780518252601f199092019160209182019101610b38565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610bb9576040519150601f19603f3d011682016040523d82523d6000602084013e610bbe565b606091505b5091509150818015610bec575080511580610bec5750808060200190516020811015610be957600080fd5b50515b610c2f576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b81548183558181111561083757600083815260209020610837918101908301610ac291905b80821115610c6f5760008155600101610c5b565b509056fea265627a7a72315820da7ee823a92ae770917ec7755b0d39e23df9342f86563f87d16576ca99b16df864736f6c63430005110032