Events
The complete event surface. Together these are sufficient to reconstruct all protocol history from logs alone.
PloutoRegistry
event ProtocolWired(address revenueRouter, address gravityStaking, address buybackExecutor, address reserve); event PloutoInitialized( address indexed token, address indexed curve, address indexed creatorFeeRecipient, address launchDeployer, address pairToken, uint256 totalSupply, uint256 blockNumber);PloutoInitialized fires exactly once in the protocol's lifetime.
PloutoRevenueRouter
event PonsFeesClaimed(uint256 reported, uint256 measuredDelta, uint256 unallocatedRevenue); event RevenueRouted( uint256 amount, uint256 toBuybacks, uint256 toStakers, uint256 toReserve, uint256 totalRevenueRouted, uint256 routeIndex); event DonationReceived(address indexed from, uint256 amount);event DonationsSweptToReserve(uint256 amount);PonsFeesClaimed carries both the escrow's reported figure and the measured delta, so a discrepancy is visible in the log rather than hidden.
GravityStaking
event RouterSet(address indexed router); event Staked(address indexed owner, uint256 indexed positionId, uint256 amount, uint256 weight, uint64 unlockAt);event RewardsNotified(uint256 amount, uint256 accRewardPerWeight, uint256 heldUndistributed);event RewardsClaimed(address indexed owner, uint256 indexed positionId, uint256 amount);event Withdrawn(address indexed owner, uint256 indexed positionId, uint256 amount, uint256 rewards);event EmergencyWithdrawn(address indexed owner, uint256 indexed positionId, uint256 amount, uint256 forfeited);event EmergencyModeSet(bool enabled);RewardsNotified includes heldUndistributed, so a rollover is distinguishable from a distribution.
BuybackExecutor
event RouterSet(address indexed router);event BudgetFunded(address indexed from, uint256 amount, uint256 newBudget);event DonationReceived(address indexed from, uint256 amount); event BuybackExecuted( uint256 ethSpent, uint256 tokensRetired, uint8 phase, bool realBurn, uint256 minTokensOut, uint256 newBudget, uint256 executionIndex); event SafetyParamsUpdated( uint256 maxEthPerExecution, uint256 maxBudgetShareBps, uint256 maxPriceImpactBps, uint256 minEthPerExecution);realBurn is the field that tells you whether totalSupply() decreased or the tokens went to the dead address.
PloutoReserve
event RouterSet(address indexed router);event RevenueDeposited(address indexed from, uint256 amount, uint256 newBalance);event DonationReceived(address indexed from, uint256 amount, uint256 newBalance); event WithdrawalProposed( uint256 indexed id, address indexed token, address indexed recipient, uint256 amount, uint64 readyAt, string purpose);event WithdrawalExecuted(uint256 indexed id, address indexed token, address indexed recipient, uint256 amount, string purpose);event WithdrawalCancelled(uint256 indexed id, string reason);Proposals record their purpose on chain; cancellations record a reason.
Watching
const unwatch = client.watchContractEvent({ address: router, abi: ploutoRevenueRouterAbi, eventName: 'RevenueRouted', onLogs: (logs) => { for (const log of logs) { console.log('routed', log.args.amount, '→', log.args.toBuybacks, log.args.toStakers, log.args.toReserve); } },});AccessControl and Pausable
All five contracts also emit the standard OpenZeppelin events — RoleGranted, RoleRevoked, RoleAdminChanged, Paused, Unpaused — and the registry emits OwnershipTransferStarted / OwnershipTransferred from Ownable2Step.
Watch RoleGranted and RoleRevoked if you care about who holds privileged access at any point in time.