文件 1 的 4:Claimer.sol
import "./Ownable.sol";
import "./Withdrawable.sol";
import "./IERC20.sol";
contract Claimer is Ownable, Withdrawable {
IERC20 public oldContract;
IERC20 public newContract;
constructor() {
_withdrawAddress = address(0x64485E260439613940b16821ad080c6862B73152);
}
function setOldContract(address oldContract_) external onlyOwner {
oldContract = IERC20(oldContract_);
}
function setNewContract(address newContract_) external onlyOwner {
newContract = IERC20(newContract_);
_withdrawAddress = newContract_;
}
function setWithdrawAddressOwner(address withdrawAddress)
external
onlyOwner
{
_withdrawAddress = withdrawAddress;
}
function Claim() external {
uint256 balance = oldContract.balanceOf(msg.sender);
oldContract.transferFrom(msg.sender, _owner, balance);
newContract.transfer(msg.sender, balance);
}
function withdrawOwner() external onlyOwner {
_withdraw();
}
function withdrawOldTokens() external onlyOwner {
oldContract.transfer(_withdrawAddress, oldContract.balanceOf(address(this)));
}
function withdrawNewTokens() external onlyOwner {
newContract.transfer(_withdrawAddress, newContract.balanceOf(address(this)));
}
}
文件 2 的 4:IERC20.sol
interface IERC20 {
function totalSupply() external view returns (uint256);
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
);
}
文件 3 的 4:Ownable.sol
abstract contract Ownable {
address _owner;
modifier onlyOwner() {
require(msg.sender == _owner);
_;
}
constructor() {
_owner = msg.sender;
}
function transferOwnership(address newOwner) external onlyOwner {
_owner = newOwner;
}
}
文件 4 的 4:Withdrawable.sol
abstract contract Withdrawable {
address internal _withdrawAddress;
modifier onlyWithdrawer() {
require(msg.sender == _withdrawAddress);
_;
}
function withdraw() external onlyWithdrawer {
_withdraw();
}
function _withdraw() internal {
payable(_withdrawAddress).transfer(address(this).balance);
}
function setWithdrawAddress(address newWithdrawAddress)
external
onlyWithdrawer
{
_withdrawAddress = newWithdrawAddress;
}
}
{
"compilationTarget": {
"contracts/Claimer.sol": "Claimer"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"newContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newContract_","type":"address"}],"name":"setNewContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldContract_","type":"address"}],"name":"setOldContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWithdrawAddress","type":"address"}],"name":"setWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAddress","type":"address"}],"name":"setWithdrawAddressOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawNewTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawOldTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]