Verify a retirement
Everything on the Core page can be checked independently. This guide shows how, using only Blockscout and the contract itself.
The point of this exercise is that you should not have to trust this interface.
1. Find an execution
Open the Core page and look at Buyback history, or read the executor directly:
function executionsLength() external view returns (uint256)function getExecution(uint256 index) external view returns (Execution)An Execution contains:
struct Execution { uint64 timestamp; uint256 ethSpent; uint256 tokensRetired; uint8 phase; bool realBurn;}2. Find the transaction
On Blockscout, open the BuybackExecutor address and filter its transactions. Each execution emits:
BuybackExecuted( uint256 ethSpent, uint256 tokensRetired, uint8 phase, bool realBurn, uint256 minTokensOut, uint256 newBudget, uint256 executionIndex)Match the executionIndex to the array index you read.
3. Check what actually happened
Inside that transaction you should see:
- ETH leaving the executor toward the Pons curve (phase 0) or the Uniswap v4 PoolManager (phase 2).
- A PLOUTO transfer in to the executor.
- Retirement, in one of two forms:
realBurn == true→ aTransferto the zero address, andtotalSupply()reduced.realBurn == false→ aTransferto0x000000000000000000000000000000000000dEaD.
- A zero PLOUTO balance on the executor afterwards.
That last point is worth checking explicitly. The executor is never supposed to hold tokens between executions, and an invariant test asserts it.
4. Confirm the supply effect
- If realBurn is true
Compare
totalSupply()before and after the block. It should have fallen by exactlytokensRetired. This is a genuine supply reduction.- If realBurn is false
totalSupply()should be unchanged, andbalanceOf(0x…dEaD)should have risen bytokensRetired. The tokens are unspendable but still counted in total supply.
5. Check the bounds were respected
The event includes minTokensOut. Confirm tokensRetired >= minTokensOut; the contract enforces it, but verifying costs nothing.
You can also read the executor's current limits:
maxEthPerExecution() // hard cap per executionmaxBudgetShareBps() // cap as a share of available budgetmaxPriceImpactBps() // on-chain price impact toleranceminEthPerExecution() // dust floorand confirm ethSpent sits inside them.
6. Cross-check the cumulative figures
totalEthSpent() // sum of every ethSpenttotalPloutoRetiredByProtocol() // sum of every tokensRetiredtotalPloutoBurned()totalPloutoSentToDead()The last two must sum to the third. If they do not, something is wrong and it is worth reporting — see responsible disclosure.