Skip to content
Protocol contracts not yet configured for this build
Enter app

Developers

Events

The complete event surface. Together these are sufficient to reconstruct all protocol history from logs alone.

PloutoRegistry

solidity
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

solidity
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

solidity
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

solidity
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

solidity
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

typescript
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.