First of all, respect for making the contract immutable. That is quite rare these days, even though immutability was originally one of the main features of smart contracts.
Second, I have a question. I see that the contract has an administrator, or owner, and also a committer. Usually, administrators or privileged roles have special rights that regular users do not have - that is the whole point of defining such roles in a smart contract.
Could you please clarify what rights the owner and the committer have in your contract?
You wrote:
The team receives nothing and doesn't control the distribution — it's all hardcoded.
So they cannot influence the following functions: proposeWinner, proposeLeaderboard, cancelWinner, cancelLeaderboard, setExcludedWinner, freezeExcluded, finalizeWinner, and finalizeLeaderboard. Is this correct?
And if they cannot influence the distribution of tokens in any way, then what is the practical purpose of having the owner and committer roles in this contract?
Good question — and a fair correction to make first: the team is not "unable to influence" those functions. There is influence, but it's bounded — the roles can only propose, cancel, or block; never redirect funds.
committer (hot gas key): publishes the snapshot root (commitDailyRoot), and can proposeWinner / proposeLeaderboard. But a proposed winner must be provably in the latest published snapshot as active (Merkle proof, lastActiveCount == 1, not excluded), and leader payouts are capped to ≤3 addresses and ≤ the accrued pool. It cannot name an outsider or exceed the pool, and it cannot finalize or withdraw anything.
owner (2-of-3 multisig): an emergency brake, not a hand on the wallet. It can cancelWinner / cancelLeaderboard (only cancel a pending proposal in the challenge window), setExcludedWinner (only bar addresses from winning — that's where team addresses go), freezeExcluded, rotate the committer via timelock, and set the audit URL. It cannot name a winner, withdraw the pool, or speed up a payout.
Who actually pays out? finalizeWinner, finalizeLeaderboard, claimRefund, triggerDissolution are permissionless — anyone calls them after the window. The payout needs neither role.
Why the roles exist: all heavy logic (pixel accounting, referrals) is off-chain, so committer must push the root and propose — strictly inside published data. owner is the kill switch to cancel a wrong/challenged proposal.
Worst case — full collusion of both. They still can't take the pool. The most they can do is stop publishing snapshots; after 5 idle days the dead-man switch lets anyone call triggerDissolution, returning the pool (plus leaderboard escrow) to participants via claimRefund. So there are exactly two outcomes: (a) the legitimate winner from the public snapshot, or (b) a refund to everyone. "Funds to the team" is simply not a function that exists in the contract.