编译器
0.8.20+commit.a1b79de6
文件 1 的 2:IERC20.sol
pragma solidity ^0.8.20;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 2 的 2:bitcoinFaucet.sol
pragma solidity ^0.8.20;
import "./IERC20.sol";
contract bitcoinFaucet {
uint256 decimalMultiplier = 100000000;
address private owner;
address public tokenAddress;
address public tokenOwner;
bool public faucetOpen = true;
uint256 public limitPerWallet = 50;
mapping(address => uint256) public claimedByAddress;
constructor(address _tokenAddress, address _tokenOwner) {
tokenAddress = _tokenAddress;
tokenOwner = _tokenOwner;
owner = msg.sender;
}
function admin_open(bool _faucetOpen) public {
require(msg.sender == owner, "Restricted operation");
faucetOpen = _faucetOpen;
}
function claim(
) external {
require(faucetOpen, "Faucet not open");
require(claimedByAddress[msg.sender] == 0, "Address already claimed");
claimedByAddress[msg.sender] = 1;
require(IERC20(tokenAddress).transferFrom(tokenOwner, msg.sender, (limitPerWallet*decimalMultiplier)), "transfer failed");
}
function checkAvailableBalance () external view returns (uint256){
return IERC20(tokenAddress).balanceOf(tokenOwner)/decimalMultiplier;
}
}
{
"compilationTarget": {
"bitcoinFaucet.sol": "bitcoinFaucet"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_tokenOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bool","name":"_faucetOpen","type":"bool"}],"name":"admin_open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkAvailableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"faucetOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]