mirror of
git://holbrook.no/eth-faucet
synced 2026-05-25 04:36:18 +02:00
Merge branch 'tmp' into dev-0.2.0
This commit is contained in:
@@ -8,17 +8,16 @@ contract EthFacuet {
|
||||
address public registry;
|
||||
address public periodChecker;
|
||||
uint256 public sealState;
|
||||
uint256 public amount;
|
||||
uint256 amount;
|
||||
|
||||
uint8 constant REGISTRY_STATE = 1;
|
||||
uint8 constant PERIODCHECKER_STATE = 2;
|
||||
uint8 constant VALUE_STATE = 4;
|
||||
uint256 constant public maxSealState = 7;
|
||||
|
||||
event FaucetUsed(address indexed _recipient, address indexed _token, uint256 _amount);
|
||||
event FaucetFail(address indexed _recipient, address indexed _token, uint256 _amount);
|
||||
event Give(address indexed _recipient, address indexed _token, uint256 _amount);
|
||||
event FaucetAmountChange(uint256 _amount);
|
||||
event FaucetStateChange(uint256 indexed _sealState, address _registry, address _periodChecker);
|
||||
event SealStateChange(uint256 indexed _sealState, address _registry, address _periodChecker);
|
||||
event ImNotGassy();
|
||||
|
||||
constructor() {
|
||||
@@ -29,7 +28,7 @@ contract EthFacuet {
|
||||
require(_state < 8, 'ERR_INVALID_STATE');
|
||||
require(_state & sealState == 0, 'ERR_ALREADY_LOCKED');
|
||||
sealState |= _state;
|
||||
emit FaucetStateChange(sealState, registry, periodChecker);
|
||||
emit SealStateChange(sealState, registry, periodChecker);
|
||||
return uint256(sealState);
|
||||
}
|
||||
|
||||
@@ -45,91 +44,119 @@ contract EthFacuet {
|
||||
require(msg.sender == owner, 'ERR_NOT_OWNER');
|
||||
require(sealState & PERIODCHECKER_STATE == 0, 'ERR_SEALED');
|
||||
periodChecker = _checker;
|
||||
emit FaucetStateChange(sealState, registry, periodChecker);
|
||||
emit SealStateChange(sealState, registry, periodChecker);
|
||||
}
|
||||
|
||||
function setRegistry(address _registry) public {
|
||||
require(msg.sender == owner, 'ERR_NOT_OWNER');
|
||||
require(sealState & REGISTRY_STATE == 0, 'ERR_SEALED');
|
||||
registry = _registry;
|
||||
emit FaucetStateChange(sealState, registry, periodChecker);
|
||||
emit SealStateChange(sealState, registry, periodChecker);
|
||||
}
|
||||
|
||||
function checkPeriod(address _recipient) private returns(bool) {
|
||||
bool _ok;
|
||||
bytes memory _result;
|
||||
|
||||
if (periodChecker == address(0)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
(_ok, _result) = periodChecker.call(abi.encodeWithSignature("check(address)", _recipient));
|
||||
if (!_ok) {
|
||||
revert('ERR_PERIOD_BACKEND');
|
||||
}
|
||||
if (_result[31] == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
return _result[31] == 0x01;
|
||||
}
|
||||
|
||||
function checkRegistry(address _recipient) private returns(bool) {
|
||||
bool _ok;
|
||||
bytes memory _result;
|
||||
|
||||
if (registry == address(0)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
(_ok, _result) = registry.call(abi.encodeWithSignature("have(address)", _recipient));
|
||||
if (!_ok) {
|
||||
emit FaucetFail(_recipient, address(0), amount);
|
||||
revert('ERR_REGISTRY_BACKEND');
|
||||
}
|
||||
if (_result[31] == 0) {
|
||||
emit FaucetFail(_recipient, address(0), amount);
|
||||
revert('ERR_REGISTRY_CHECK');
|
||||
}
|
||||
|
||||
emit FaucetUsed(_recipient, address(0), amount);
|
||||
return true;
|
||||
return _result[31] == 0x01;
|
||||
}
|
||||
|
||||
function checkBalance() private returns(bool) {
|
||||
if (amount > address(this).balance) {
|
||||
function checkBalance() private view returns(bool) {
|
||||
return amount >= address(this).balance;
|
||||
}
|
||||
|
||||
function check(address _recipient) public returns(bool) {
|
||||
if (!checkPeriod(_recipient)) {
|
||||
return false;
|
||||
emit ImNotGassy();
|
||||
revert('ERR_ITSNOTAGAS');
|
||||
}
|
||||
}
|
||||
|
||||
function checkCanPoke(address _recipient) private returns(uint256) {
|
||||
if (periodChecker != address(0)) {
|
||||
checkPeriod(_recipient);
|
||||
if (!checkRegistry(_recipient)) {
|
||||
return false;
|
||||
}
|
||||
if (registry != address(0)) {
|
||||
checkRegistry(_recipient);
|
||||
}
|
||||
checkBalance();
|
||||
return true;
|
||||
return checkBalance();
|
||||
}
|
||||
|
||||
function check(address _recipient) public returns(bool){
|
||||
function checkAndPoke(address _recipient) private returns(bool){
|
||||
bool _ok;
|
||||
bytes memory _result;
|
||||
|
||||
if (!checkBalance()) {
|
||||
revert('ERR_INSUFFICIENT_BALANCE');
|
||||
}
|
||||
|
||||
if (!checkRegistry(_recipient)) {
|
||||
revert('ERR_NOT_IN_WHITELIST');
|
||||
}
|
||||
|
||||
if (periodChecker == address(0)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
(_ok, _result) = periodChecker.call(abi.encodeWithSignature("poke(address)", _recipient));
|
||||
if (!_ok) {
|
||||
emit FaucetFail(_recipient, address(0), amount);
|
||||
revert('ERR_PERIOD_BACKEND');
|
||||
}
|
||||
if (_result[31] == 0) {
|
||||
revert('ERR_PERIOD_CHECK');
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function gimme() public returns(uint256) {
|
||||
require(checkCanPoke(msg.sender));
|
||||
require(checkAndPoke(msg.sender));
|
||||
payable(msg.sender).transfer(amount);
|
||||
emit Give(msg.sender, address(0), amount);
|
||||
return amount;
|
||||
}
|
||||
|
||||
function giveTo(address _recipient) public returns(uint256) {
|
||||
require(checkCanPoke(_recipient));
|
||||
require(checkAndPoke(_recipient));
|
||||
payable(_recipient).transfer(amount);
|
||||
emit Give(_recipient, address(0), amount);
|
||||
return amount;
|
||||
}
|
||||
|
||||
function nextTime(address _subject) public returns(uint256) {
|
||||
bool _ok;
|
||||
bytes memory _result;
|
||||
|
||||
(_ok, _result) = periodChecker.call(abi.encodeWithSignature("next(address)", _subject));
|
||||
if (!_ok) {
|
||||
revert('ERR_PERIOD_BACKEND_ERROR');
|
||||
}
|
||||
return uint256(bytes32(_result));
|
||||
}
|
||||
|
||||
function tokenAmount() public view returns(uint256) {
|
||||
return amount;
|
||||
}
|
||||
|
||||
function token() public pure returns(address) {
|
||||
return address(0);
|
||||
}
|
||||
|
||||
receive () payable external {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,17 +34,21 @@ contract PeriodSimple {
|
||||
emit BalanceThresholdChange(_threshold);
|
||||
}
|
||||
|
||||
function check(address _subject) public view returns(bool) {
|
||||
function next(address _subject) external view returns(uint256) {
|
||||
return lastUsed[_subject] + period;
|
||||
}
|
||||
|
||||
function check(address _subject) external view returns(bool) {
|
||||
require(_subject.balance >= balanceThreshold);
|
||||
if (lastUsed[_subject] == 0) {
|
||||
return true;
|
||||
}
|
||||
return block.timestamp > lastUsed[_subject] + period;
|
||||
return block.timestamp > this.next(_subject);
|
||||
}
|
||||
|
||||
function poke(address _subject) public {
|
||||
function poke(address _subject) external {
|
||||
require(msg.sender == owner || msg.sender == poker, 'ERR_ACCESS');
|
||||
require(check(_subject), 'ERR_PREMATURE');
|
||||
require(this.check(_subject), 'ERR_PREMATURE');
|
||||
lastUsed[_subject] = block.timestamp;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user