Buy SO4PM
SO4PM
Wrapper
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IERC20Burnable {
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function burn(uint256 amount) external;
}
contract GHSTRedemption {
address public immutable GHST;
address public owner;
uint256 public redemptionCounter;
struct Redemption {
address user;
uint256 amount;
bool settled;
}
mapping(uint256 => Redemption) public redemptions;
event RedeemRequested(
uint256 indexed id,
address indexed user,
uint256 amount
);
event RedeemSettled(uint256 indexed id);
modifier onlyOwner() {
require(msg.sender == owner, "Not admin");
_;
}
constructor(address _ghst) {
GHST = _ghst;
owner = msg.sender;
}
function burnForOffline(uint256 amount) external {
require(amount > 0, "Zero amount");
// 1. Pull tokens from user
IERC20Burnable(GHST).transferFrom(
msg.sender,
address(this),
amount
);
// 2. Burn them
IERC20Burnable(GHST).burn(amount);
redemptionCounter++;
redemptions[redemptionCounter] = Redemption(
msg.sender,
amount,
false
);
emit RedeemRequested(redemptionCounter, msg.sender, amount);
}
function markSettled(uint256 id) external onlyOwner {
require(!redemptions[id].settled, "Already settled");
redemptions[id].settled = true;
emit RedeemSettled(id);
}
}