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
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
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
0x60806040526120d060015534801561001657600080fd5b50600480546001600160a01b03191633179055610ca8806100386000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063af81c5b911610071578063af81c5b914610160578063b77b2e141461018c578063ba8dbea2146101c4578063d92fc67b146101ea578063ef78d4fd146101f2578063f851a440146101fa576100a9565b80630f3a9f65146100ae5780633ccfd60b146100cd5780634f64b2be146100d55780635fa7b5841461010e578063ad2bc27214610134575b600080fd5b6100cb600480360360208110156100c457600080fd5b5035610202565b005b6100cb610299565b6100f2600480360360208110156100eb57600080fd5b5035610525565b604080516001600160a01b039092168252519081900360200190f35b6100cb6004803603602081101561012457600080fd5b50356001600160a01b031661054c565b6100cb6004803603604081101561014a57600080fd5b506001600160a01b03813516906020013561083c565b6100cb6004803603604081101561017657600080fd5b506001600160a01b03813516906020013561090a565b6101b2600480360360208110156101a257600080fd5b50356001600160a01b0316610a9a565b60408051918252519081900360200190f35b6101b2600480360360208110156101da57600080fd5b50356001600160a01b0316610aac565b6101b2610abe565b6101b2610ac5565b6100f2610acb565b6004546001600160a01b0316331461025e576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b60018190556040805182815290517f1445a8659aa0e3feb1c4a3ea8344a4e720c388d7ce59ab4824248fbc3bd1ef949181900360200190a150565b3332146102ed576040805162461bcd60e51b815260206004820152601d60248201527f646f206e6f742077697468647261772066726f6d20636f6e7472616374000000604482015290519081900360640190fd5b336000908152602081905260409020546001544390820110610344576040805162461bcd60e51b815260206004820152600b60248201526a141b19585cd9481dd85a5d60aa1b604482015290519081900360640190fd5b60005b60025481101561050f576000600360006002848154811061036457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020549050801561050657806002838154811061039f57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156103ee57600080fd5b505afa158015610402573d6000803e3d6000fd5b505050506040513d602081101561041857600080fd5b5051106105065760006002838154811061042e57fe5b9060005260206000200160009054906101000a90046001600160a01b0316905061048233836002868154811061046057fe5b6000918252602090912001546001600160a01b0316919063ffffffff610ada16565b7f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb338260036000600288815481106104b657fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283019091205482519584168652939092169184019190915282810191909152519081900360600190a1505b50600101610347565b5050336000908152602081905260409020439055565b6002818154811061053257fe5b6000918252602090912001546001600160a01b0316905081565b6004546001600160a01b031633146105a8576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6060600280548060200260200160405190810160405280929190818152602001828054801561060057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105e2575b50939450600093505050505b815181101561083757826001600160a01b031682828151811061062b57fe5b60200260200101516001600160a01b0316141561082f57600260018351038154811061065357fe5b600091825260209091200154600280546001600160a01b03909216918390811061067957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060026001835103815481106106b857fe5b6000918252602080832090910180546001600160a01b03191690556001600160a01b03851680835260038252604080842084905580516370a0823160e01b8152306004820152905191926370a0823192602480840193829003018186803b15801561072257600080fd5b505afa158015610736573d6000803e3d6000fd5b505050506040513d602081101561074c57600080fd5b5051905080156107ed5760048054604080516370a0823160e01b81523093810193909352516107ed926001600160a01b03928316928816916370a0823191602480820192602092909190829003018186803b1580156107aa57600080fd5b505afa1580156107be573d6000803e3d6000fd5b505050506040513d60208110156107d457600080fd5b50516001600160a01b038716919063ffffffff610ada16565b604080516001600160a01b038616815290517f4eb129c82dcd3eedb52df2b0e6fb4cfa41ac64ee9d63ff081acbb1877e85d79b9181900360200190a150610837565b60010161060c565b505050565b6004546001600160a01b03163314610898576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6001600160a01b0382166000908152600360205260409020546108ee576040805162461bcd60e51b8152602060048201526009602482015268139bdd08195e1a5cdd60ba1b604482015290519081900360640190fd5b6001600160a01b03909116600090815260036020526040902055565b6004546001600160a01b03163314610966576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6001600160a01b038216600090815260036020526040902054156109c0576040805162461bcd60e51b815260206004820152600c60248201526b546f6b656e2065786973747360a01b604482015290519081900360640190fd5b600081116109ff576040805162461bcd60e51b81526020600482015260076024820152660706572203e20360cc1b604482015290519081900360640190fd5b60028054600091610a139060018301610c36565b90508260028281548110610a2357fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591851680825260038352604091829020859055815190815291820184905280517fe1bea1af9b1d1aede8b7fa043080de8690470a8ae61449360b3d0c0bf8104b469281900390910190a1505050565b60006020819052908152604090205481565b60036020526000908152604090205481565b6002545b90565b60015481565b6004546001600160a01b031681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310610b575780518252601f199092019160209182019101610b38565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610bb9576040519150601f19603f3d011682016040523d82523d6000602084013e610bbe565b606091505b5091509150818015610bec575080511580610bec5750808060200190516020811015610be957600080fd5b50515b610c2f576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b81548183558181111561083757600083815260209020610837918101908301610ac291905b80821115610c6f5760008155600101610c5b565b509056fea265627a7a72315820da7ee823a92ae770917ec7755b0d39e23df9342f86563f87d16576ca99b16df864736f6c63430005110032
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063af81c5b911610071578063af81c5b914610160578063b77b2e141461018c578063ba8dbea2146101c4578063d92fc67b146101ea578063ef78d4fd146101f2578063f851a440146101fa576100a9565b80630f3a9f65146100ae5780633ccfd60b146100cd5780634f64b2be146100d55780635fa7b5841461010e578063ad2bc27214610134575b600080fd5b6100cb600480360360208110156100c457600080fd5b5035610202565b005b6100cb610299565b6100f2600480360360208110156100eb57600080fd5b5035610525565b604080516001600160a01b039092168252519081900360200190f35b6100cb6004803603602081101561012457600080fd5b50356001600160a01b031661054c565b6100cb6004803603604081101561014a57600080fd5b506001600160a01b03813516906020013561083c565b6100cb6004803603604081101561017657600080fd5b506001600160a01b03813516906020013561090a565b6101b2600480360360208110156101a257600080fd5b50356001600160a01b0316610a9a565b60408051918252519081900360200190f35b6101b2600480360360208110156101da57600080fd5b50356001600160a01b0316610aac565b6101b2610abe565b6101b2610ac5565b6100f2610acb565b6004546001600160a01b0316331461025e576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b60018190556040805182815290517f1445a8659aa0e3feb1c4a3ea8344a4e720c388d7ce59ab4824248fbc3bd1ef949181900360200190a150565b3332146102ed576040805162461bcd60e51b815260206004820152601d60248201527f646f206e6f742077697468647261772066726f6d20636f6e7472616374000000604482015290519081900360640190fd5b336000908152602081905260409020546001544390820110610344576040805162461bcd60e51b815260206004820152600b60248201526a141b19585cd9481dd85a5d60aa1b604482015290519081900360640190fd5b60005b60025481101561050f576000600360006002848154811061036457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020549050801561050657806002838154811061039f57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156103ee57600080fd5b505afa158015610402573d6000803e3d6000fd5b505050506040513d602081101561041857600080fd5b5051106105065760006002838154811061042e57fe5b9060005260206000200160009054906101000a90046001600160a01b0316905061048233836002868154811061046057fe5b6000918252602090912001546001600160a01b0316919063ffffffff610ada16565b7f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb338260036000600288815481106104b657fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283019091205482519584168652939092169184019190915282810191909152519081900360600190a1505b50600101610347565b5050336000908152602081905260409020439055565b6002818154811061053257fe5b6000918252602090912001546001600160a01b0316905081565b6004546001600160a01b031633146105a8576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6060600280548060200260200160405190810160405280929190818152602001828054801561060057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105e2575b50939450600093505050505b815181101561083757826001600160a01b031682828151811061062b57fe5b60200260200101516001600160a01b0316141561082f57600260018351038154811061065357fe5b600091825260209091200154600280546001600160a01b03909216918390811061067957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060026001835103815481106106b857fe5b6000918252602080832090910180546001600160a01b03191690556001600160a01b03851680835260038252604080842084905580516370a0823160e01b8152306004820152905191926370a0823192602480840193829003018186803b15801561072257600080fd5b505afa158015610736573d6000803e3d6000fd5b505050506040513d602081101561074c57600080fd5b5051905080156107ed5760048054604080516370a0823160e01b81523093810193909352516107ed926001600160a01b03928316928816916370a0823191602480820192602092909190829003018186803b1580156107aa57600080fd5b505afa1580156107be573d6000803e3d6000fd5b505050506040513d60208110156107d457600080fd5b50516001600160a01b038716919063ffffffff610ada16565b604080516001600160a01b038616815290517f4eb129c82dcd3eedb52df2b0e6fb4cfa41ac64ee9d63ff081acbb1877e85d79b9181900360200190a150610837565b60010161060c565b505050565b6004546001600160a01b03163314610898576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6001600160a01b0382166000908152600360205260409020546108ee576040805162461bcd60e51b8152602060048201526009602482015268139bdd08195e1a5cdd60ba1b604482015290519081900360640190fd5b6001600160a01b03909116600090815260036020526040902055565b6004546001600160a01b03163314610966576040805162461bcd60e51b815260206004820152601a6024820152792737ba1020baba3437b934bd32b2161027b7363c9020b236b4b760311b604482015290519081900360640190fd5b6001600160a01b038216600090815260036020526040902054156109c0576040805162461bcd60e51b815260206004820152600c60248201526b546f6b656e2065786973747360a01b604482015290519081900360640190fd5b600081116109ff576040805162461bcd60e51b81526020600482015260076024820152660706572203e20360cc1b604482015290519081900360640190fd5b60028054600091610a139060018301610c36565b90508260028281548110610a2357fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591851680825260038352604091829020859055815190815291820184905280517fe1bea1af9b1d1aede8b7fa043080de8690470a8ae61449360b3d0c0bf8104b469281900390910190a1505050565b60006020819052908152604090205481565b60036020526000908152604090205481565b6002545b90565b60015481565b6004546001600160a01b031681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310610b575780518252601f199092019160209182019101610b38565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610bb9576040519150601f19603f3d011682016040523d82523d6000602084013e610bbe565b606091505b5091509150818015610bec575080511580610bec5750808060200190516020811015610be957600080fd5b50515b610c2f576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b81548183558181111561083757600083815260209020610837918101908301610ac291905b80821115610c6f5760008155600101610c5b565b509056fea265627a7a72315820da7ee823a92ae770917ec7755b0d39e23df9342f86563f87d16576ca99b16df864736f6c63430005110032