From 169cb516a1fda3a730bb854f2bf1f73e8ca08288 Mon Sep 17 00:00:00 2001 From: Uncle Fatso Date: Sun, 5 Apr 2026 21:29:21 +0300 Subject: [PATCH] add stake and unstake events; tests included Signed-off-by: Uncle Fatso --- src/Staking.sol | 2 ++ src/interfaces/IStaking.sol | 16 +++++++++++++++ test/staking/Staking.t.sol | 39 +++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/src/Staking.sol b/src/Staking.sol index bc57da7..2f3070b 100644 --- a/src/Staking.sol +++ b/src/Staking.sol @@ -72,6 +72,7 @@ contract GhostStaking is IStaking, GhostAccessControlled { uint48 expiry = epoch.number + warmupPeriod; IGhostWarmup(warmup).addToWarmup(returnAmount, to, expiry); } + emit Staked(msg.sender, to, amount, isRebase, isClaim); } function claim(address to, bool isRebase) public override returns (uint256 claimedAmount) { @@ -115,6 +116,7 @@ contract GhostStaking is IStaking, GhostAccessControlled { if (amount > IERC20(ftso).balanceOf(address(this))) revert InsufficientBalance(); IERC20(ftso).safeTransfer(to, amount); + emit Unstaked(msg.sender, to, amount, isTrigger, isRebase); return amount; } diff --git a/src/interfaces/IStaking.sol b/src/interfaces/IStaking.sol index 690a356..b39c006 100644 --- a/src/interfaces/IStaking.sol +++ b/src/interfaces/IStaking.sol @@ -6,6 +6,22 @@ interface IStaking { error ExternalClaimsLocked(); error InsufficientBalance(); + event Staked( + address sender, + address receiver, + uint256 amount, + bool isRebase, + bool isClaim + ); + + event Unstaked( + address sender, + address receiver, + uint256 amount, + bool isTrigger, + bool isRebase + ); + event DistributorSet(address distributor); event GatekeeperSet(address gatekeeper); event WarmupSet(uint256 warmup); diff --git a/test/staking/Staking.t.sol b/test/staking/Staking.t.sol index bd31e4c..a4aec64 100644 --- a/test/staking/Staking.t.sol +++ b/test/staking/Staking.t.sol @@ -46,6 +46,22 @@ contract StakingTest is Test { uint256 public constant AMOUNT = 69; uint256 public constant BIG_AMOUNT = AMOUNT * 1e9; + event Staked( + address sender, + address receiver, + uint256 amount, + bool isRebase, + bool isClaim + ); + + event Unstaked( + address sender, + address receiver, + uint256 amount, + bool isTrigger, + bool isRebase + ); + event DistributorSet(address distributor); event WarmupSet(uint256 warmup); event Ghosted(bytes32 indexed receiver, uint256 indexed amount); @@ -149,6 +165,16 @@ contract StakingTest is Test { assertEq(lock, false); } + function test_stake_emitsStakedEvent() public { + _mintAndApprove(ALICE, AMOUNT); + + vm.expectEmit(true, true, true, false, address(staking)); + emit Staked(ALICE, ALICE, AMOUNT, true, true); + + vm.prank(ALICE); + staking.stake(AMOUNT, ALICE, true, true); + } + function test_stake_exchangesFatsoToStinkyWhenClaimIsTrueAndRebasingIsTrue() public { _mintAndApprove(ALICE, AMOUNT); @@ -298,6 +324,19 @@ contract StakingTest is Test { assertEq(staking.supplyInWarmup(), 0); } + function test_unstake_emitsUnstakedEvent() public { + _prepareAndRoll(ALICE, AMOUNT, true, true); + uint256 aliceBalance = stnk.balanceOf(ALICE); + vm.startPrank(ALICE); + stnk.approve(address(staking), aliceBalance); + + vm.expectEmit(true, true, true, false, address(staking)); + emit Unstaked(ALICE, ALICE, aliceBalance, false, true); + + staking.unstake(aliceBalance, ALICE, false, true); + vm.stopPrank(); + } + function test_unstake_canRedeemStinkyToFatso() public { _prepareAndRoll(ALICE, AMOUNT, true, true); uint256 aliceBalance = stnk.balanceOf(ALICE);