diff --git a/broadcast/DeployFaucet.s.sol/11155111/run-1747222552.json b/broadcast/DeployFaucet.s.sol/11155111/run-1747222552.json new file mode 100644 index 0000000..1c22f66 --- /dev/null +++ b/broadcast/DeployFaucet.s.sol/11155111/run-1747222552.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x969356ecaed58af76e1d637eb8ba13a679c3904d2bd21a8905d3e8ba395ab13e", + "transactionType": "CREATE", + "contractName": "Faucet", + "contractAddress": "0x5239fcdea2c628b5c7bcd8dd42da4db3f752b246", + "function": null, + "arguments": null, + "transaction": { + "from": "0xae5a4884d813f334e1b80b26402ec78fadaee7eb", + "gas": "0xec377", + "value": "0x0", + "input": "0x608060405266038d7ea4c68000600155670de0b6b3a764000060025561070860035534801561002c575f5ffd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361009e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009591906101b3565b60405180910390fd5b6100ad816100b360201b60201c565b506101cc565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61019d82610174565b9050919050565b6101ad81610193565b82525050565b5f6020820190506101c65f8301846101a4565b92915050565b610ac3806101d95f395ff3fe6080604052600436106100aa575f3560e01c8063941b91c011610063578063941b91c01461019b578063b5b9cc66146101c3578063ccca123b146101eb578063d20cd56a14610215578063df351aaf1461023d578063f2fde38b14610265576100b1565b806302e60c76146100b55780632d291cad146100df5780636ff18ab91461011b578063715018a61461014557806387167b5a1461015b5780638da5cb5b14610171576100b1565b366100b157005b5f5ffd5b3480156100c0575f5ffd5b506100c961028d565b6040516100d69190610820565b60405180910390f35b3480156100ea575f5ffd5b5061010560048036038101906101009190610897565b610293565b60405161011291906108dc565b60405180910390f35b348015610126575f5ffd5b5061012f610337565b60405161013c9190610820565b60405180910390f35b348015610150575f5ffd5b5061015961033d565b005b348015610166575f5ffd5b5061016f610350565b005b34801561017c575f5ffd5b50610185610434565b6040516101929190610904565b60405180910390f35b3480156101a6575f5ffd5b506101c160048036038101906101bc9190610947565b61045b565b005b3480156101ce575f5ffd5b506101e960048036038101906101e49190610897565b61046d565b005b3480156101f6575f5ffd5b506101ff61060b565b60405161020c9190610820565b60405180910390f35b348015610220575f5ffd5b5061023b60048036038101906102369190610947565b610611565b005b348015610248575f5ffd5b50610263600480360381019061025e9190610947565b610623565b005b348015610270575f5ffd5b5061028b60048036038101906102869190610897565b610635565b005b60015481565b5f5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036102e15760019050610332565b60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054421061032e5760019050610332565b5f90505b919050565b60025481565b6103456106b9565b61034e5f610740565b565b61035933610293565b610361575f5ffd5b60015447101561039d576040517fe301d63d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc60015490811502906040515f60405180830381858888f193505050501580156103e2573d5f5f3e3d5ffd5b50600354426103f1919061099f565b60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6104636106b9565b8060028190555050565b61047633610293565b61047e575f5ffd5b5f8190505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104bc9190610904565b602060405180830381865afa1580156104d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb91906109e6565b9050600254811015610539576040517f3bcd51e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336002546040518363ffffffff1660e01b8152600401610576929190610a11565b6020604051808303815f875af1158015610592573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b69190610a62565b50600354426105c5919061099f565b60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050565b60035481565b6106196106b9565b8060018190555050565b61062b6106b9565b8060038190555050565b61063d6106b9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106ad575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016106a49190610904565b60405180910390fd5b6106b681610740565b50565b6106c1610801565b73ffffffffffffffffffffffffffffffffffffffff166106df610434565b73ffffffffffffffffffffffffffffffffffffffff161461073e57610702610801565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016107359190610904565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f819050919050565b61081a81610808565b82525050565b5f6020820190506108335f830184610811565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108668261083d565b9050919050565b6108768161085c565b8114610880575f5ffd5b50565b5f813590506108918161086d565b92915050565b5f602082840312156108ac576108ab610839565b5b5f6108b984828501610883565b91505092915050565b5f8115159050919050565b6108d6816108c2565b82525050565b5f6020820190506108ef5f8301846108cd565b92915050565b6108fe8161085c565b82525050565b5f6020820190506109175f8301846108f5565b92915050565b61092681610808565b8114610930575f5ffd5b50565b5f813590506109418161091d565b92915050565b5f6020828403121561095c5761095b610839565b5b5f61096984828501610933565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6109a982610808565b91506109b483610808565b92508282019050808211156109cc576109cb610972565b5b92915050565b5f815190506109e08161091d565b92915050565b5f602082840312156109fb576109fa610839565b5b5f610a08848285016109d2565b91505092915050565b5f604082019050610a245f8301856108f5565b610a316020830184610811565b9392505050565b610a41816108c2565b8114610a4b575f5ffd5b50565b5f81519050610a5c81610a38565b92915050565b5f60208284031215610a7757610a76610839565b5b5f610a8484828501610a4e565b9150509291505056fea2646970667358221220c161b9c5f528ed05d8177612dfd310cd0514ed7f1db875e55b54df1988f31d2764736f6c634300081c0033", + "nonce": "0x40", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x2dab198", + "logs": [ + { + "address": "0x5239fcdea2c628b5c7bcd8dd42da4db3f752b246", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000ae5a4884d813f334e1b80b26402ec78fadaee7eb" + ], + "data": "0x", + "blockHash": "0xc8a594619aef0ee93b69bcf9eef6538dd3fccd20401b90386ecd4cefa5365d7f", + "blockNumber": "0x7f0690", + "blockTimestamp": "0x68247ffc", + "transactionHash": "0x969356ecaed58af76e1d637eb8ba13a679c3904d2bd21a8905d3e8ba395ab13e", + "transactionIndex": "0x13e", + "logIndex": "0x30e", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000804000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000001000000000000000000000000000000000000020000000000000000000800000000000002008000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x969356ecaed58af76e1d637eb8ba13a679c3904d2bd21a8905d3e8ba395ab13e", + "transactionIndex": "0x13e", + "blockHash": "0xc8a594619aef0ee93b69bcf9eef6538dd3fccd20401b90386ecd4cefa5365d7f", + "blockNumber": "0x7f0690", + "gasUsed": "0xb5b48", + "effectiveGasPrice": "0x8cbc3823", + "from": "0xae5a4884d813f334e1b80b26402ec78fadaee7eb", + "to": null, + "contractAddress": "0x5239fcdea2c628b5c7bcd8dd42da4db3f752b246" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1747222552, + "chain": 11155111, + "commit": "85b4305" +} \ No newline at end of file diff --git a/broadcast/DeployFaucet.s.sol/11155111/run-latest.json b/broadcast/DeployFaucet.s.sol/11155111/run-latest.json new file mode 100644 index 0000000..1c22f66 --- /dev/null +++ b/broadcast/DeployFaucet.s.sol/11155111/run-latest.json @@ -0,0 +1,63 @@ +{ + "transactions": [ + { + "hash": "0x969356ecaed58af76e1d637eb8ba13a679c3904d2bd21a8905d3e8ba395ab13e", + "transactionType": "CREATE", + "contractName": "Faucet", + "contractAddress": "0x5239fcdea2c628b5c7bcd8dd42da4db3f752b246", + "function": null, + "arguments": null, + "transaction": { + "from": "0xae5a4884d813f334e1b80b26402ec78fadaee7eb", + "gas": "0xec377", + "value": "0x0", + "input": "0x608060405266038d7ea4c68000600155670de0b6b3a764000060025561070860035534801561002c575f5ffd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361009e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009591906101b3565b60405180910390fd5b6100ad816100b360201b60201c565b506101cc565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61019d82610174565b9050919050565b6101ad81610193565b82525050565b5f6020820190506101c65f8301846101a4565b92915050565b610ac3806101d95f395ff3fe6080604052600436106100aa575f3560e01c8063941b91c011610063578063941b91c01461019b578063b5b9cc66146101c3578063ccca123b146101eb578063d20cd56a14610215578063df351aaf1461023d578063f2fde38b14610265576100b1565b806302e60c76146100b55780632d291cad146100df5780636ff18ab91461011b578063715018a61461014557806387167b5a1461015b5780638da5cb5b14610171576100b1565b366100b157005b5f5ffd5b3480156100c0575f5ffd5b506100c961028d565b6040516100d69190610820565b60405180910390f35b3480156100ea575f5ffd5b5061010560048036038101906101009190610897565b610293565b60405161011291906108dc565b60405180910390f35b348015610126575f5ffd5b5061012f610337565b60405161013c9190610820565b60405180910390f35b348015610150575f5ffd5b5061015961033d565b005b348015610166575f5ffd5b5061016f610350565b005b34801561017c575f5ffd5b50610185610434565b6040516101929190610904565b60405180910390f35b3480156101a6575f5ffd5b506101c160048036038101906101bc9190610947565b61045b565b005b3480156101ce575f5ffd5b506101e960048036038101906101e49190610897565b61046d565b005b3480156101f6575f5ffd5b506101ff61060b565b60405161020c9190610820565b60405180910390f35b348015610220575f5ffd5b5061023b60048036038101906102369190610947565b610611565b005b348015610248575f5ffd5b50610263600480360381019061025e9190610947565b610623565b005b348015610270575f5ffd5b5061028b60048036038101906102869190610897565b610635565b005b60015481565b5f5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036102e15760019050610332565b60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054421061032e5760019050610332565b5f90505b919050565b60025481565b6103456106b9565b61034e5f610740565b565b61035933610293565b610361575f5ffd5b60015447101561039d576040517fe301d63d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc60015490811502906040515f60405180830381858888f193505050501580156103e2573d5f5f3e3d5ffd5b50600354426103f1919061099f565b60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6104636106b9565b8060028190555050565b61047633610293565b61047e575f5ffd5b5f8190505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104bc9190610904565b602060405180830381865afa1580156104d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb91906109e6565b9050600254811015610539576040517f3bcd51e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336002546040518363ffffffff1660e01b8152600401610576929190610a11565b6020604051808303815f875af1158015610592573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b69190610a62565b50600354426105c5919061099f565b60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050565b60035481565b6106196106b9565b8060018190555050565b61062b6106b9565b8060038190555050565b61063d6106b9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106ad575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016106a49190610904565b60405180910390fd5b6106b681610740565b50565b6106c1610801565b73ffffffffffffffffffffffffffffffffffffffff166106df610434565b73ffffffffffffffffffffffffffffffffffffffff161461073e57610702610801565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016107359190610904565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f819050919050565b61081a81610808565b82525050565b5f6020820190506108335f830184610811565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108668261083d565b9050919050565b6108768161085c565b8114610880575f5ffd5b50565b5f813590506108918161086d565b92915050565b5f602082840312156108ac576108ab610839565b5b5f6108b984828501610883565b91505092915050565b5f8115159050919050565b6108d6816108c2565b82525050565b5f6020820190506108ef5f8301846108cd565b92915050565b6108fe8161085c565b82525050565b5f6020820190506109175f8301846108f5565b92915050565b61092681610808565b8114610930575f5ffd5b50565b5f813590506109418161091d565b92915050565b5f6020828403121561095c5761095b610839565b5b5f61096984828501610933565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6109a982610808565b91506109b483610808565b92508282019050808211156109cc576109cb610972565b5b92915050565b5f815190506109e08161091d565b92915050565b5f602082840312156109fb576109fa610839565b5b5f610a08848285016109d2565b91505092915050565b5f604082019050610a245f8301856108f5565b610a316020830184610811565b9392505050565b610a41816108c2565b8114610a4b575f5ffd5b50565b5f81519050610a5c81610a38565b92915050565b5f60208284031215610a7757610a76610839565b5b5f610a8484828501610a4e565b9150509291505056fea2646970667358221220c161b9c5f528ed05d8177612dfd310cd0514ed7f1db875e55b54df1988f31d2764736f6c634300081c0033", + "nonce": "0x40", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x2dab198", + "logs": [ + { + "address": "0x5239fcdea2c628b5c7bcd8dd42da4db3f752b246", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000ae5a4884d813f334e1b80b26402ec78fadaee7eb" + ], + "data": "0x", + "blockHash": "0xc8a594619aef0ee93b69bcf9eef6538dd3fccd20401b90386ecd4cefa5365d7f", + "blockNumber": "0x7f0690", + "blockTimestamp": "0x68247ffc", + "transactionHash": "0x969356ecaed58af76e1d637eb8ba13a679c3904d2bd21a8905d3e8ba395ab13e", + "transactionIndex": "0x13e", + "logIndex": "0x30e", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000804000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000001000000000000000000000000000000000000020000000000000000000800000000000002008000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x969356ecaed58af76e1d637eb8ba13a679c3904d2bd21a8905d3e8ba395ab13e", + "transactionIndex": "0x13e", + "blockHash": "0xc8a594619aef0ee93b69bcf9eef6538dd3fccd20401b90386ecd4cefa5365d7f", + "blockNumber": "0x7f0690", + "gasUsed": "0xb5b48", + "effectiveGasPrice": "0x8cbc3823", + "from": "0xae5a4884d813f334e1b80b26402ec78fadaee7eb", + "to": null, + "contractAddress": "0x5239fcdea2c628b5c7bcd8dd42da4db3f752b246" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1747222552, + "chain": 11155111, + "commit": "85b4305" +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index a51e25b..86bac16 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,5 +3,6 @@ src = "src" out = "out" libs = ["lib"] evm_version = "prague" +solc_version = "0.8.28" # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/script/DeployFaucet.s.sol b/script/DeployFaucet.s.sol new file mode 100644 index 0000000..60b08f3 --- /dev/null +++ b/script/DeployFaucet.s.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import "forge-std/Script.sol"; +import "forge-std/Vm.sol"; +import "src/Faucet.sol"; + +contract DeployFaucet is Script { + Faucet public faucet; + + function run() external { + uint256 deployerPk = vm.envUint("DEPLOYER_KEY"); + + vm.startBroadcast(deployerPk); + faucet = new Faucet(); + vm.stopBroadcast(); + } +} diff --git a/src/Faucet.sol b/src/Faucet.sol new file mode 100644 index 0000000..ac7f7bd --- /dev/null +++ b/src/Faucet.sol @@ -0,0 +1,60 @@ +pragma solidity ^0.8.28; + +import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import "lib/openzeppelin-contracts/contracts/access/Ownable.sol"; + +contract Faucet is Ownable { + uint256 public ethDripAmount = 0.001 ether; + uint256 public tokenDripAmount = 1 ether; + uint256 public waitTime = 30 minutes; + + error TokenInsufficientBalance(); + error EthInsufficientBalance(); + + mapping(address => uint256) lastAccessTime; + + constructor() Ownable(msg.sender) {} + + function dripToken(address tokenAddress) public { + require(allowedToWithdraw(msg.sender)); + IERC20 token = IERC20(tokenAddress); + uint256 tokenBalance = token.balanceOf(address(this)); + if (tokenBalance < tokenDripAmount) { + revert TokenInsufficientBalance(); + } + token.transfer(msg.sender, tokenDripAmount); + lastAccessTime[msg.sender] = block.timestamp + waitTime; + } + + function dripEth() public { + require(allowedToWithdraw(msg.sender)); + if (address(this).balance < ethDripAmount) { + revert EthInsufficientBalance(); + } + payable(msg.sender).transfer(ethDripAmount); + lastAccessTime[msg.sender] = block.timestamp + waitTime; + } + + function allowedToWithdraw(address _address) public view returns (bool) { + if (lastAccessTime[_address] == 0) { + return true; + } else if (block.timestamp >= lastAccessTime[_address]) { + return true; + } + return false; + } + + function setEtherDrip(uint256 amount) public onlyOwner { + ethDripAmount = amount; + } + + function setTokenDrip(uint256 amount) public onlyOwner { + tokenDripAmount = amount; + } + + function setWaitTime(uint256 time) public onlyOwner { + waitTime = time; + } + + receive() external payable {} +}