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); } }