{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"32c3663b-c37f-4f9b-af9c-4d552c1b01cd","kind":"skill:build-ponder-indexer","nodes":[{"acceptedSubmissionHash":"ced788e07722c171dbb6fa09b8ce0cb7ab920cf471b92fcfb58cdcc0c8350e96","dependsOn":[],"execution":{"mustProduce":["INDEXER.md"],"network":true,"profile":"none","requires":["network"],"skillHash":"de7d672edd661a5cf3efc279e8e2dcf49065c52be4f6f75989f77dfa7e91e833","skillId":"build-ponder-indexer","tools":[]},"key":"build_ponder_indexer","kind":"code","role":"implement","skillHash":"de7d672edd661a5cf3efc279e8e2dcf49065c52be4f6f75989f77dfa7e91e833","skillId":"build-ponder-indexer","state":"accepted"}],"objective":"Build a read-only Ponder indexer, in a NEW public GitHub repository, for PLEA's live contracts on Ethereum mainnet (chain id 1). Deliver source and instructions only; we review it and run it ourselves on our own server.\n\nWHAT IT STORES: one table, nothing else. Every log the eight contracts below emit, from their start blocks, kept raw, plus the Stacker's Stacked events for PLEA's hook. No decoding and no other tables: our website decodes these logs with its own ABIs, exactly as it decodes eth_getLogs. It answers one query, the raw logs of a block range (SERVING).\nponder.schema.ts, exactly: export const rawLog = onchainTable(\"raw_log\", (t) => ({ id: t.text().primaryKey(), blockNumber: t.bigint().notNull(), blockHash: t.hex().notNull(), blockTimestamp: t.bigint().notNull(), transactionHash: t.hex().notNull(), transactionIndex: t.integer().notNull(), logIndex: t.integer().notNull(), address: t.hex().notNull(), topic0: t.hex(), topic1: t.hex(), topic2: t.hex(), topic3: t.hex(), data: t.hex().notNull() }));\nid is \"<blockNumber>-<logIndex>\"; address lowercase; topic0..topic3 the log's topics in order, null when absent; data the raw data. One handler per event inserts the row (onConflictDoNothing).\n\nCONTRACTS (none is a proxy; all verified on Sourcify, https://repo.sourcify.dev/1/<address>; source https://github.com/khaed1/plea at commit 42e0f855875786a953e945e528e9d7f2724a5352, src/). Register every event of each ABI, taken from the verified metadata or that source, never guessed:\nPLEA 0x1f158929496162b53fb232536468948e25170ab3, start block 26293890\nCabalGate 0x39ac882a1161ea19acb6fbdd7a5835d96cf876eb, 26293890\nSeasons 0xf7c024f7bc96cf152a572f6e184318ff6d380738, 26293890\nPleaDistributor 0x97face21c7a9f3b64d0f4e0bf21861721fbbfe3e, 26293890\nPleaLaunch 0x9e75eabf8d1c905a07a0c99bb9ec9430a065358f, 26293890\nLetterbox 0x00423ebaed03445fc1452d9a79a51e3c0dfdab5f, 26294106\nTribunal 0x1aa665eb420f28103324daaaf034de13ee6f53d9, 26294111\nPleaHook 0xf1122bc96adea8768cff2badf02b6d4594f928cc, 26294113\nStacker 0x06909f672301f28a810f78cfe7a754851269f4f0 (verified on Sourcify): only Stacked(address indexed project, address indexed trader, uint256 imd, uint256 shares) with project = PleaHook (a topic1 filter), from 26294113.\nCheck chain id 1 and that each address has code. Addresses and start blocks are config defaults; the RPC URL comes only from env PONDER_RPC_URL_1.\n\nSERVING: Ponder's GraphQL at /graphql (src/api/index.ts, Hono) with CORS open to every origin, preflight included: browsers read it. This exact query must work, BigInt variables passed as strings, paging by 1,000 until hasNextPage is false:\nquery Logs($from: BigInt!, $to: BigInt!, $after: String) { rawLogs(where: { blockNumber_gte: $from, blockNumber_lte: $to }, orderBy: \"id\", orderDirection: \"asc\", limit: 1000, after: $after) { items { blockNumber blockHash blockTimestamp transactionHash transactionIndex logIndex address topic0 topic1 topic2 topic3 data } pageInfo { hasNextPage endCursor } } _meta { status } }\n_meta.status must give the last indexed block per chain ({\"<chain>\": {\"id\": 1, \"block\": {\"number\", \"timestamp\"}}}). Keep /health and /ready.\n\nPUBLIC EXAMPLE TO VERIFY: from block 26293890 to 26294150 the table holds exactly 13 logs, equal to eth_getLogs for the eight addresses plus the Stacker filter: block 26293890 log indexes 409-412 (PLEA, CabalGate, PleaDistributor, PLEA; tx 0x992d6122488684be9a1d70fd5efe170d0f08c89190e1b39b048323a4a1953c0d), 26294106 775-776, 26294111 1200-1201, 26294113 889-893 (three PLEA Transfer mints, then PLEA, PleaLaunch). Trading has not opened yet, so few logs exist; later there will be thousands.\nWrite scripts/compare.mjs <graphql url> <rpc url> <from> <to>: it runs the query above and compares every field with eth_getLogs for the same range (the nine filters, chunked by a settable block range), log for log in (blockNumber, logIndex) order, and exits non-zero on any difference. Show its output against a real backfill.\n\nDELIVER: a normal Ponder 0.18.1 project at the repository root (ponder, viem and hono pinned exactly, a lockfile, Node >= 22). README: run locally with PGlite; run in production with PostgreSQL (DATABASE_URL) and a fixed --schema; Dockerfile, docker-compose.yml (Postgres internal only; the app port published on the host's loopback interface only, so a reverse proxy adds HTTPS), env.example; restarting without losing data, rebuilding after a config change; what the RPC must serve (eth_getLogs over the range, block reads; public RPC range limits). INDEXER.md: ABI provenance, contracts, start blocks, the events registered per contract, the commands run and their results.\n\nVERIFY: clean install, codegen, typecheck, a backfill from the start blocks against a public Ethereum RPC, the example above, the compare script, the CORS preflight (curl -i -X OPTIONS with an Origin header), and paging across more than 1,000 rows (a local test with synthetic rows). Mark anything not run NOT RUN.\n\nBOUNDARIES: read-only; no keys, no transactions, no contract changes, no website, no paid hosting or cloud accounts; never access our machines.","parentJobId":null,"planHash":"6f9cb0c68159e2ab2ca5c3ab5d869309125e474a64f18a42cdb653f62f47fd9c","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"32c3663b-c37f-4f9b-af9c-4d552c1b01cd","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2652-build-read-only-ponder-indexer"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50957","feedbackHash":"c5589b8a4216981d06b458923ff4dd3b9cefe12e2413e21692f849adb43749e7","nodeKey":"build_ponder_indexer","submissionHash":"ced788e07722c171dbb6fa09b8ce0cb7ab920cf471b92fcfb58cdcc0c8350e96","tag1":"verification:structural","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"891d138f2d8a90c1b5976514df95fd3a988f1d6ba1ed6920047c3fc274fbc387","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"fc07fa76af146e72740cae719763ddb8443510879fce3a1d35d3d2a072706637","device":"0256823ae36e7900","findings":[],"hash":"ced788e07722c171dbb6fa09b8ce0cb7ab920cf471b92fcfb58cdcc0c8350e96","nodeId":"3e61186a-e40f-4f99-b4d1-1371f8d8a766","outcome":"completed","summary":"Reduced the source export to **883,609 bytes**, below 8 MiB. Dependency versions remain unchanged. Clean install, codegen, typecheck, and all seven tests pass.\n\n**Limitation:** removing dependency archives means fresh installs require registry access; the offline-install requirement remains unmet. Docker execution and GitHub publication remain NOT RUN.","treeHash":"1f1c6801d333fa1448287ba63e029ee9826aedda","usage":{"cachedInputTokens":4610944,"inputTokens":165762,"model":"gpt-6-astra","outputTokens":74976,"runtime":"codex","turns":15,"wallClockMs":2277683}}],"verification":[{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"ced788e07722c171dbb6fa09b8ce0cb7ab920cf471b92fcfb58cdcc0c8350e96","verifiedTreeHash":"1f1c6801d333fa1448287ba63e029ee9826aedda","verifierVersion":"0.1.0+d372f99e"}]}