编译器
0.8.19+commit.7dd6d404
文件 1 的 4:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 4:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 3 的 4:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 4 的 4:StakeAway2.sol
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
contract StakeAway2 is Ownable, Pausable
{
address payable private managerAddress;
uint256 private fixedFeeAmount;
mapping(address => uint256) private contractFees;
event Claimed(address indexed tokenContractAddress, address indexed claimerAddress, uint256 indexed feeAmount);
event PaymentSent(address indexed senderAddress, address indexed receiverAddress, uint256 amount);
constructor(address payable managerAddress_, uint256 fixedFeeAmount_)
{
managerAddress = managerAddress_;
fixedFeeAmount = fixedFeeAmount_;
}
function setManagerAddress(address payable managerAddress_) external onlyOwner
{
require(managerAddress_ != address(0), "Address missing");
managerAddress = managerAddress_;
}
function getManagerAddress() external view returns (address)
{
return managerAddress;
}
function setFixedFeeAmount(uint256 fixedFeeAmount_) external onlyOwner
{
fixedFeeAmount = fixedFeeAmount_;
}
function getFixedFeeAmount() external view returns (uint256)
{
return fixedFeeAmount;
}
function setContractFeeAmount(address contractAddress_, uint256 feeAmount_) external onlyOwner
{
require(contractAddress_ != address(0), "Invalid contract");
require(feeAmount_ > 0, "Invalid fee amount");
contractFees[contractAddress_] = feeAmount_;
}
function clearContractFeeAmount(address contractAddress_) external onlyOwner
{
uint256 feeAmount = contractFees[contractAddress_];
require(feeAmount > 0, "Invalid contract");
delete contractFees[contractAddress_];
}
function getContractFeeAmount(address contractAddress_) external view returns (uint256)
{
return contractFees[contractAddress_];
}
function sendPayment(address payable receiverAddress) external payable onlyOwner
{
require(receiverAddress != address(0), "Address missing");
require(msg.value > 0, "Invalid amount");
(bool successFee,) = receiverAddress.call{value: msg.value}("");
require(successFee, "Payment failed");
emit PaymentSent(msg.sender, receiverAddress, msg.value);
}
function claim(address tokenContractAddress) external payable whenNotPaused
{
uint256 feeAmount = contractFees[tokenContractAddress];
if (feeAmount == 0) {
feeAmount = fixedFeeAmount;
}
require(msg.value == feeAmount, "Incorrect fee amount");
(bool successFee,) = managerAddress.call{value: feeAmount}("");
require(successFee, "Fee payment failed");
emit Claimed(tokenContractAddress, msg.sender, feeAmount);
}
}
{
"compilationTarget": {
"contracts/StakeAway2.sol": "StakeAway2"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address payable","name":"managerAddress_","type":"address"},{"internalType":"uint256","name":"fixedFeeAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimerAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"senderAddress","type":"address"},{"indexed":true,"internalType":"address","name":"receiverAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"tokenContractAddress","type":"address"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"}],"name":"clearContractFeeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"}],"name":"getContractFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFixedFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getManagerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiverAddress","type":"address"}],"name":"sendPayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"},{"internalType":"uint256","name":"feeAmount_","type":"uint256"}],"name":"setContractFeeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fixedFeeAmount_","type":"uint256"}],"name":"setFixedFeeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"managerAddress_","type":"address"}],"name":"setManagerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]