stateRoot, no batchCount, no
submitBatch and no verifyProof; it is a bridge contract with a mint entry point.
The second is a plain ERC-20: name() returns "Aere-Bridged USDC", symbol() returns
"aUSDC", decimals() returns 6 and the total supply is 50 aUSDC. There is no ZK rollup
and no rollup verifier deployed on chain 2800. The addresses are removed rather than corrected,
because there is nothing to correct them to. The circuit and the browser prover below are real; the
deployment is not.
The design: state is a Poseidon commitment of two account balances, and each batch is a transfer carrying a Groth16 proof that the transfer was applied correctly. An L1 verifier would check the proof, so there is no fraud window and finality is immediate on inclusion. This is the validity-proof model, in two-account form to show the cryptographic core, and the same pattern extends to N accounts through a Merkle-tree state. Everything in this paragraph describes what the circuit does, not what chain 2800 runs today.
The chain only stores a Poseidon commitment of the two balances. To advance the rollup, you must know the pre-image. Anyone can post a batch as long as they know the current balances. The genesis is account 0 = 1000, account 1 = 0.
The verifier will reject any proof that doesn't match the current on-chain state root or violates the transfer rules. Submitting advances the rollup; the verifier costs no fees on AERE.
Off-chain (browser) On-chain (AERE L1)
───────────────── ──────────────────
1. Read on-chain stateRoot ┐
2. Know (bal0, bal1) such that │
Poseidon(bal0,bal1) == stateRoot │
3. Pick (direction, amount) ├── Verifier (Groth16) checks:
4. Compute newBal0, newBal1 │ • prover knew pre-image of stateRoot
5. Compute newState = Poseidon(...) │ • amount ≤ sender balance
6. Run circom witness + Groth16 prove │ • newState matches Poseidon of new balances
7. Submit (newState, dir, amount, proof)──┘
8. State root advances to newState
9. BatchPosted event emitted