pragma solidity ^0.8.0;
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
}
contract UpgradedSDCP {
address public owner;
address public previousSDCP;
event TokensRecovered(address token, uint256 amount, address recipient);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address _previousSDCP) {
require(_previousSDCP != address(0), "Previous SDCP address cannot be zero");
owner = msg.sender;
previousSDCP = _previousSDCP;
}
modifier onlyOwner() {
require(msg.sender == owner, "Caller is not the owner");
_;
}
/**
* @notice Recover tokens from the previous SDCP contract.
* @param tokenAddress The address of the token to recover.
* @param recipient The address to receive the recovered tokens.
*/
function recoverTokens(address tokenAddress, address recipient) external onlyOwner {
require(tokenAddress != address(0), "Token address cannot be zero");
require(recipient != address(0), "Recipient address cannot be zero");
IERC20 token = IERC20(tokenAddress);
uint256 balance = token.balanceOf(previousSDCP);
require(balance > 0, "No tokens to recover");
// Call the token's transfer method to recover tokens
require(token.transfer(recipient, balance), "Token transfer failed");
emit TokensRecovered(tokenAddress, balance, recipient);
}
/**
* @notice Transfer ownership of this contract to a new owner.
* @param newOwner The address of the new owner.
*/
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "New owner cannot be the zero address");
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
{
"compilationTarget": {
"UpgradedSDCP.sol": "UpgradedSDCP"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_previousSDCP","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"TokensRecovered","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousSDCP","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]