文件 1 的 1:ChampzClaim.sol
pragma solidity 0.8.26;
interface ERC20 {
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function getOwner() external view returns (address);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address _owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return payable(msg.sender);
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
contract Ownable is Context {
address public _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract ChampzClaim is Ownable {
event Claimed(address indexed user, uint256 amount);
ERC20 public oldToken;
ERC20 public newToken;
constructor(address _oldToken, address _newToken) {
oldToken = ERC20(_oldToken);
newToken = ERC20(_newToken);
}
function deposit(uint256 amount) public onlyOwner {
newToken.transferFrom(msg.sender, address(this), amount);
}
function withdraw(address token, uint256 amount) public onlyOwner {
ERC20(token).transfer(msg.sender, amount);
}
function claim() public {
uint256 amount = oldToken.balanceOf(msg.sender);
require(amount > 0, "No old token balance (user)");
require(oldToken.allowance(msg.sender, address(this)) >= amount, "Insufficient allowance");
require(newToken.balanceOf(address(this)) >= amount, "Insufficient new token balance (contract)");
require(oldToken.transferFrom(msg.sender, address(this), amount), "Could not transfer old token");
require(newToken.transfer(msg.sender, amount), "Could not transfer new token");
emit Claimed(msg.sender, amount);
}
}
{
"compilationTarget": {
"contracts/ChampzClaim.sol": "ChampzClaim"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}