draft version of dummy gatekeeper added
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
This commit is contained in:
parent
21c2002310
commit
62c70893a9
69
src/Gatekeeper.sol
Normal file
69
src/Gatekeeper.sol
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
pragma solidity ^0.8.20;
|
||||||
|
|
||||||
|
import "./interfaces/IGatekeeper.sol";
|
||||||
|
|
||||||
|
contract Gatekeeper is IGatekeeper {
|
||||||
|
uint256 public override ghostedSupply;
|
||||||
|
address public immutable staking;
|
||||||
|
|
||||||
|
uint256 private _aggregatedPublicKey;
|
||||||
|
mapping(uint256 => mapping(uint256 => bool)) private _executedTransaction;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
address _staking,
|
||||||
|
uint256 _ghostedSupply
|
||||||
|
) {
|
||||||
|
ghostedSupply = _ghostedSupply;
|
||||||
|
staking = _staking;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ghost(bytes32 receiver, uint256 amount) external override {
|
||||||
|
if (msg.sender != staking) revert NotStaking();
|
||||||
|
ghostedSupply += amount;
|
||||||
|
emit Ghosted(receiver, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function materialize(
|
||||||
|
address receiver,
|
||||||
|
uint256 amount,
|
||||||
|
uint256 rx,
|
||||||
|
uint256 s
|
||||||
|
) external override {
|
||||||
|
if (msg.sender != staking) revert NotStaking();
|
||||||
|
_checkTransactionExistence(rx, s);
|
||||||
|
bytes32 message = keccak256(abi.encodePacked("materialize", receiver, amount));
|
||||||
|
|
||||||
|
if (_incorrectSignature(rx, s, message)) revert WrongSignature();
|
||||||
|
ghostedSupply -= amount;
|
||||||
|
emit Materialized(receiver, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function rotate(
|
||||||
|
uint256 aggregatedPublicKey,
|
||||||
|
uint256 rx,
|
||||||
|
uint256 s
|
||||||
|
) external override {
|
||||||
|
_checkTransactionExistence(rx, s);
|
||||||
|
bytes32 message = keccak256(abi.encodePacked("rotate", aggregatedPublicKey));
|
||||||
|
|
||||||
|
if (_incorrectSignature(rx, s, message)) revert WrongSignature();
|
||||||
|
_aggregatedPublicKey = aggregatedPublicKey;
|
||||||
|
emit Rotated(aggregatedPublicKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _checkTransactionExistence(uint256 rx, uint256 s) private {
|
||||||
|
if (_executedTransaction[rx][s]) revert AlreadyExecuted();
|
||||||
|
_executedTransaction[rx][s] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _incorrectSignature(uint256 rx, uint256 s, bytes32 m) private pure returns (bool) {
|
||||||
|
// no logic below, just to suppress warnings from solc
|
||||||
|
uint256 void = rx;
|
||||||
|
void = s;
|
||||||
|
void = uint256(m);
|
||||||
|
|
||||||
|
// always bad signature for now
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ import "./interfaces/ISTNK.sol";
|
|||||||
import "./interfaces/IGHST.sol";
|
import "./interfaces/IGHST.sol";
|
||||||
import "./interfaces/IDistributor.sol";
|
import "./interfaces/IDistributor.sol";
|
||||||
import "./interfaces/IStaking.sol";
|
import "./interfaces/IStaking.sol";
|
||||||
|
import "./interfaces/IGatekeeper.sol";
|
||||||
|
|
||||||
contract GhostStaking is IStaking, GhostAccessControlled {
|
contract GhostStaking is IStaking, GhostAccessControlled {
|
||||||
using SafeERC20 for IERC20;
|
using SafeERC20 for IERC20;
|
||||||
@ -24,6 +25,7 @@ contract GhostStaking is IStaking, GhostAccessControlled {
|
|||||||
|
|
||||||
Epoch public epoch;
|
Epoch public epoch;
|
||||||
address public distributor;
|
address public distributor;
|
||||||
|
address public gatekeeper;
|
||||||
uint256 public sharesInWarmup;
|
uint256 public sharesInWarmup;
|
||||||
|
|
||||||
mapping(address => Claim) public warmupInfo;
|
mapping(address => Claim) public warmupInfo;
|
||||||
@ -133,6 +135,22 @@ contract GhostStaking is IStaking, GhostAccessControlled {
|
|||||||
ISTNK(stnk).safeTransfer(to, balance);
|
ISTNK(stnk).safeTransfer(to, balance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ghost(
|
||||||
|
bytes32 receiver,
|
||||||
|
uint256 amount
|
||||||
|
) external override {
|
||||||
|
IGatekeeper(gatekeeper).ghost(receiver, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function materialize(
|
||||||
|
address receiver,
|
||||||
|
uint256 amount,
|
||||||
|
uint256 rx,
|
||||||
|
uint256 s
|
||||||
|
) external override {
|
||||||
|
IGatekeeper(gatekeeper).materialize(receiver, amount, rx, s);
|
||||||
|
}
|
||||||
|
|
||||||
function rebase() public override returns (uint256 bounty) {
|
function rebase() public override returns (uint256 bounty) {
|
||||||
if (epoch.end <= block.timestamp) {
|
if (epoch.end <= block.timestamp) {
|
||||||
ISTNK(stnk).rebase(epoch.distribute, epoch.number);
|
ISTNK(stnk).rebase(epoch.distribute, epoch.number);
|
||||||
@ -164,6 +182,11 @@ contract GhostStaking is IStaking, GhostAccessControlled {
|
|||||||
emit WarmupSet(_warmupPeriod);
|
emit WarmupSet(_warmupPeriod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setGatekeeperAddress(address _gatekeeper) external onlyGovernor {
|
||||||
|
gatekeeper = _gatekeeper;
|
||||||
|
emit GatekeeperSet(_gatekeeper);
|
||||||
|
}
|
||||||
|
|
||||||
function index() public view override returns (uint256) {
|
function index() public view override returns (uint256) {
|
||||||
return ISTNK(stnk).index();
|
return ISTNK(stnk).index();
|
||||||
}
|
}
|
||||||
@ -172,6 +195,12 @@ contract GhostStaking is IStaking, GhostAccessControlled {
|
|||||||
return ISTNK(stnk).balanceForShares(sharesInWarmup);
|
return ISTNK(stnk).balanceForShares(sharesInWarmup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ghostedSupply() public view override returns (uint256 amount) {
|
||||||
|
if (gatekeeper != address(0)) {
|
||||||
|
amount = IGatekeeper(gatekeeper).ghostedSupply();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function _send(
|
function _send(
|
||||||
uint256 amount,
|
uint256 amount,
|
||||||
address to,
|
address to,
|
||||||
|
@ -168,7 +168,7 @@ contract Stinky is ISTNK, ERC20Permit {
|
|||||||
|
|
||||||
function circulatingSupply() public view override returns (uint256) {
|
function circulatingSupply() public view override returns (uint256) {
|
||||||
return _totalSupply +
|
return _totalSupply +
|
||||||
IGHST(ghst).balanceFrom(IERC20(ghst).totalSupply()) +
|
IGHST(ghst).balanceFrom(IERC20(ghst).totalSupply() + IStaking(staking).ghostedSupply()) +
|
||||||
IStaking(staking).supplyInWarmup() -
|
IStaking(staking).supplyInWarmup() -
|
||||||
balanceOf(staking);
|
balanceOf(staking);
|
||||||
}
|
}
|
||||||
|
17
src/interfaces/IGatekeeper.sol
Normal file
17
src/interfaces/IGatekeeper.sol
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
pragma solidity ^0.8.20;
|
||||||
|
|
||||||
|
interface IGatekeeper {
|
||||||
|
error NotStaking();
|
||||||
|
error WrongSignature();
|
||||||
|
error AlreadyExecuted();
|
||||||
|
|
||||||
|
event Ghosted(bytes32 indexed receiver, uint256 indexed amount);
|
||||||
|
event Materialized(address indexed receiver, uint256 indexed amount);
|
||||||
|
event Rotated(uint256 indexed aggregatedPublicKey);
|
||||||
|
|
||||||
|
function ghostedSupply() external view returns (uint256);
|
||||||
|
function ghost(bytes32 receiver, uint256 amount) external;
|
||||||
|
function materialize(address receiver, uint256 amount, uint256 rx, uint256 s) external;
|
||||||
|
function rotate(uint256 aggregatedPublicKey, uint256 rx, uint256 s) external;
|
||||||
|
}
|
@ -7,6 +7,7 @@ interface IStaking {
|
|||||||
error InsufficientBalance();
|
error InsufficientBalance();
|
||||||
|
|
||||||
event DistributorSet(address distributor);
|
event DistributorSet(address distributor);
|
||||||
|
event GatekeeperSet(address gatekeeper);
|
||||||
event WarmupSet(uint256 warmup);
|
event WarmupSet(uint256 warmup);
|
||||||
|
|
||||||
struct Epoch {
|
struct Epoch {
|
||||||
@ -43,7 +44,11 @@ interface IStaking {
|
|||||||
|
|
||||||
function wrap(address _to, uint256 _amount) external returns (uint256 gBalance_);
|
function wrap(address _to, uint256 _amount) external returns (uint256 gBalance_);
|
||||||
function unwrap(address _to, uint256 _amount) external returns (uint256 sBalance_);
|
function unwrap(address _to, uint256 _amount) external returns (uint256 sBalance_);
|
||||||
|
function ghost(bytes32 receiver, uint256 amount) external;
|
||||||
|
function materialize(address receiver, uint256 amount, uint256 rx, uint256 s) external;
|
||||||
function rebase() external returns (uint256);
|
function rebase() external returns (uint256);
|
||||||
|
|
||||||
function index() external view returns (uint256);
|
function index() external view returns (uint256);
|
||||||
function supplyInWarmup() external view returns (uint256);
|
function supplyInWarmup() external view returns (uint256);
|
||||||
|
function ghostedSupply() external view returns (uint256);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user