index41 — THE PROVING PIPELINE three Ethereum mainnet transaction hashes in, one Creditcoin ruling out run at 2026-08-16T09:38:24.555Z THE DEFAULT RUN — the hosted proof source answers first, as it does with no flags at all. invoked as: npm run prove -- --fresh-court The Index41 address below is this run's own court, NOT the headline deployment — that one is in docs/DEPLOYMENT.md, and docs/PIPELINE.md tabulates every proven run. A court that has ruled is retired by the replay guard, so an independent run needs --fresh-court; that flag deploys a court and touches no Attestcoin surface. --kill-hosted is the only flag that changes which proof source answers. ── 0. Input ────────────────────────────────────────────────────────────────── no hashes given — using the recorded sandwich in data/sandwich-25764741.json A real Ethereum mainnet sandwich, found by scripts/find-sandwich.ts. Searcher 0x11111215 front-runs and back-runs a victim swap on Uniswap V2 pool 0xd91c72da, all three transactions in block 25764741 at positions 14, 15, 16. The back-run pays 1.333 gwei against the front-run's 0.042 gwei: the searcher bids for the exit, not the entry. front-run 0xec3777f9d0e55d03b9caa3a4b8a786dd62e16eeb327a9f1c45dfbc79af618436 victim 0x7b054188f739937a2fc2c9257b48f2ccab0ec4440ce5eda7f2ec5ccbb44485a0 back-run 0xb0cae362c6a6dcf08f4adfc1d510cdda851271a913cdea4bc81da010b65be23a ── 1. Networks ─────────────────────────────────────────────────────────────── creditcoin https://rpc.cc3-testnet.creditcoin.network · chainId 102031 · head 5319075 ethereum https://ethereum-rpc.publicnode.com · head 25766772 signer 0x9436ed9Ac85F9e39A5AE44cd598651F272c45e24 · 9994.986453825499340876 CTC verifier 0x0000000000000000000000000000000000000FD2 (from the SDK's own constant) decoder 0x731c345d79Fb8BbDC541f9DF3b6317585F849F9f (Creditcoin's deployed EvmV1Decoder) prover https://prover.cc3-testnet.creditcoin.network source chain key 3 → chainId 1 (attestation genesis 0) ── 2. Resolve the block and the three positions ────────────────────────────── front-run block 25764741 position 14 from 0x11111215b72e894c60f24e91ac2c8ccb1d373911 victim block 25764741 position 15 from 0x51f400b9770ad2bddb7cf74664f5cd1daf6a1410 back-run block 25764741 position 16 from 0x11111215b72e894c60f24e91ac2c8ccb1d373911 Those positions come from an Ethereum RPC and index41 does not act on them. They are the ground truth the Creditcoin precompile has to reproduce, unaided. ── 3. Attestation — adaptive, not a flat sleep loop ────────────────────────── prover health healthy · cc3=true eth=true · up 483595s asking the prover for a height it cannot possibly serve, to see how it says no: HTTP 422 BlockNotReady: The continuity proof cannot be created because block 25766733 is not attested to yet. Last attested block: 25766730 retriable=true block_number=25766733 last_attested_block=25766730 → 3 blocks behind, so the adaptive poller would sleep 36s, not a flat 15s attested tip 25766730 0x9f8485140cfe5561f9e7b377dbda4b8693ef7f17fa4306d3afcc7187a436482a (isAttestation=true) waitUntilHeight returned after 343ms · block is 1989 below the tip, so extraDelayMs=0 (the SDK default of 15000 would have added 15000ms of nothing) prover ready after 1 attempt(s), 0ms slept, schedule [] · attested-height 25766730 continuity parent 25764700 (attestation=false) → child 25764800 (attestation=false) ── 4. Proofs — three interchangeable sources, hosted last-resort-free ──────── hosted:proof-batch (by block position) trusts: https://prover.cc3-testnet.creditcoin.network — POST /api/v1/proof-batch/{chain_key} hosted:ProofBuilder.getBatchProof (SDK, by tx hash) trusts: https://prover.cc3-testnet.creditcoin.network — POST /api/v1/proof-batch-by-tx/{chain_key}, via the SDK client local:RawProofBuilder (no hosted prover) trusts: an Ethereum RPC + the Creditcoin chain-info precompile. No proof service. ✓ hosted:proof-batch (by block position) — 1200ms source used hosted:proof-batch (by block position) fromHeader=25764741 toHeader=25764741 cached=false 60 continuity roots, fetched ONCE for all 3 legs ── 5. Audit — the source gets no benefit of the doubt ──────────────────────── leaf → root, one bit of laterality per sibling (L = sibling on the left): front-run RLLLRRRR → 14 merkle ok · leaf matches mainnet · 3520 bytes victim LLLLRRRR → 15 merkle ok · leaf matches mainnet · 6496 bytes back-run RRRRLRRR → 16 merkle ok · leaf matches mainnet · 3456 bytes merkle root 0x362ca563e40b7cef16c1b901211e74a50abb61657945997a476ae7bc35676c16 continuity 60 roots covering 25764741..25764800 chains to 0x5492ed3ccc5cc7055fba39eedfed0b3cdc11b8de7bbebc866a1e4642ffa5d197 recognised as a checkpoint at height 25764800 Every byte was re-derived from Ethereum and bound to Creditcoin state before a claim existed. ── 6. Decode — through Creditcoin's own EvmV1Decoder, the copy the contract links to ─ front-run type 2 · from 0x11111215b72E894C60F24E91ac2c8cCb1D373911 · to 0x672061B75F770331b0c7C2a566a9Ac0A9BA331D2 status 1 · gasUsed 116894 · 4 logs · maxPriorityFeePerGas 3196467 · decode cost 533805 gas victim type 2 · from 0x51f400b9770aD2BDdb7CF74664F5Cd1DAF6A1410 · to 0x6131B5fae19EA4f9D964eAc0408E4408b66337b5 status 1 · gasUsed 179643 · 8 logs · maxPriorityFeePerGas 102666 · decode cost 659115 gas back-run type 2 · from 0x11111215b72E894C60F24E91ac2c8cCb1D373911 · to 0x672061B75F770331b0c7C2a566a9Ac0A9BA331D2 status 1 · gasUsed 84829 · 4 logs · maxPriorityFeePerGas 1294180444 · decode cost 532145 gas pool 0xd91c72da93288f00385e3c2ead75623ebedf9272 (the Swap emitter common to all three legs — not their `to`) numeraire token1 searcher 0x11111215b72E894C60F24E91ac2c8cCb1D373911 victim 0x51f400b9770aD2BDdb7CF74664F5Cd1DAF6A1410 · entry point 0x6131B5fae19EA4f9D964eAc0408E4408b66337b5 front-run paid in 46827428 victim paid in 100000000 back-run took out 47047136 realized profit 219708 ← this is the harm, and it is inside the proof ── 7. Dry run — every verification, for free, before any gas is spent ──────── front-run verifySingle=true · calculateTxIndex=14 (mainnet says 14) victim verifySingle=true · calculateTxIndex=15 (mainnet says 15) back-run verifySingle=true · calculateTxIndex=16 (mainnet says 16) 14 < 15 < 16 — front-run BEFORE victim BEFORE back-run. Cost so far: zero gas. ── 8. The court ────────────────────────────────────────────────────────────── deploying Index41 (linked against the on-chain EvmV1Decoder)… Index41 0xBA3b9f7C2e6F61eF38C395aaFd8a4df2dA28C17d (deploy gas 3342081) explorer https://creditcoin-testnet.blockscout.com/address/0xBA3b9f7C2e6F61eF38C395aaFd8a4df2dA28C17d bonding 1.0 CTC for relay 0x9436ed9Ac85F9e39A5AE44cd598651F272c45e24… declaring coverage of entry point 0x6131B5fae19EA4f9D964eAc0408E4408b66337b5… Index41 0xBA3b9f7C2e6F61eF38C395aaFd8a4df2dA28C17d relay 0x9436ed9Ac85F9e39A5AE44cd598651F272c45e24 · bond 1.0 CTC · covers 0x6131B5fae19EA4f9D964eAc0408E4408b66337b5=true claim id 0x614797006ffc0dde2116854291d5d94a83b9f5bb6e8d3412aa58ada39ebe7e93 ── 9. Submit — 3× verifyAndEmit in ONE Creditcoin transaction ──────────────── calldata 17860 bytes (utils.hex.bytesInHexString) gas limit 1539012 from utils.gas.computeGasLimit MAX_GAS_CAP 75000000 — the budget is 2.052% of it sending with 1539012 CC3 tx 0xddee0f3f370d9834ab1bd87c5b10c24436895ddb014a19d85591e4d84088f58d block 5319080 · status 1 GAS USED 1092100 (1.456% of MAX_GAS_CAP) ── 10. The ruling ──────────────────────────────────────────────────────────── the precompile's OWN event, once per verifyAndEmit — not our contract, not this script: TransactionVerified(chainKey=3, height=25764741, txIndex=14) TransactionVerified(chainKey=3, height=25764741, txIndex=15) TransactionVerified(chainKey=3, height=25764741, txIndex=16) SandwichProven(0x11111215b72E894C60F24E91ac2c8cCb1D373911, 25764741, 14, 15, 16, 219708, 219708) HarmPaid(0x51f400b9770aD2BDdb7CF74664F5Cd1DAF6A1410, 0x9436ed9Ac85F9e39A5AE44cd598651F272c45e24, 219708) index 14 searcher buy 0xec3777f9d0e55d03b9caa3a4b8a786dd62e16eeb327a9f1c45dfbc79af618436 index 15 the victim 0x7b054188f739937a2fc2c9257b48f2ccab0ec4440ce5eda7f2ec5ccbb44485a0 index 16 searcher sell 0xb0cae362c6a6dcf08f4adfc1d510cdda851271a913cdea4bc81da010b65be23a explorer https://creditcoin-testnet.blockscout.com/tx/0xddee0f3f370d9834ab1bd87c5b10c24436895ddb014a19d85591e4d84088f58d contract https://creditcoin-testnet.blockscout.com/address/0xBA3b9f7C2e6F61eF38C395aaFd8a4df2dA28C17d Creditcoin read the position of a transaction inside an Ethereum block, and the bond paid. ── Attestcoin surface tally ────────────────────────────────────────────────── ATTESTCOIN SURFACES EXERCISED THIS RUN: 30 30 did real work · 3 constructed but never queried · 3 not reached · 36 catalogued · 21 of the 30 are undocumented did real work (30): 1. chainInfo.PrecompileChainInfoProvider 2. chainInfo.getSupportedChainByKey [undocumented] 3. chainInfo.getAttestationGenesisHeight [undocumented] 4. chainInfo.getLatestAttestedHeightAndHash [undocumented] 5. chainInfo.getContinuityBounds [undocumented] 6. chainInfo.waitUntilHeightAttested [undocumented] 7. chainInfo.getAttestationHeightForDigest [undocumented] 8. chainInfo.getCheckpointForHeight [undocumented] 9. blockProver.BLOCK_PROVER_PRECOMPILE_ADDRESS 10. blockProver.PrecompileBlockProver 11. blockProver.verifySingle 12. blockProver.computeTransactionIndex [undocumented] 19. proofProvider.merkle.hashLeaf [undocumented] 20. proofProvider.merkle.hashInner [undocumented] 21. proofProvider.merkle.computeDigestOf [undocumented] 22. encoding.getTransactionWithRaw [undocumented] 23. encoding.abiEncode [undocumented] 24. encoding.EncodingVersion 25. utils.gas.computeGasLimit [undocumented] 26. utils.gas.MAX_GAS_CAP [undocumented] 27. utils.gas.gasAsPercentageOfMax [undocumented] 28. utils.hex.bytesInHexString [undocumented] 29. utils.decoder.decodeEvmV1Transaction [undocumented] 30. GET /api/v1/health 31. GET /api/v1/attested-height/{chain_key} 32. POST /api/v1/proof-batch/{chain_key} [undocumented] 33. ErrorResponse.retriable / last_attested_block [undocumented] 34. INativeQueryVerifier.verifyAndEmit 35. INativeQueryVerifier.calculateTxIndex [undocumented] 36. EvmV1Decoder (deployed library) constructed, never queried — the standby proof rungs (3): 13. proofProvider.service.ProofBuilder 15. proofProvider.raw.RawProofBuilder 17. proofProvider.raw.blockProvider.SimpleBlockProvider [undocumented] not reached on this run (3): 14. proofProvider.service.ProofBuilder.getBatchProof 16. proofProvider.raw.RawProofBuilder.getProof [undocumented] 18. proofProvider.raw.blockProvider.BlockProvider (implemented) [undocumented] Counted by src/surfaces.ts, recorded at the call site as each surface is exercised — not transcribed from a table. Unknown ids throw, so this number cannot be padded. ────────────────────────────────────────────────────────────────────────────── finished 2026-08-16T09:39:33.324Z evidence written to docs/pipeline-output.txt