{"q":"escrow","page":1,"sort":"newest","type":"all","count":110,"items":[{"id":"job:e3089b09-d6d4-4aa8-ae5b-b91ec40d91f9","code":[],"media":[],"sites":[{"id":"dd91b365-c9ef-446c-9a97-5738ac8588b3","cid":"bafybeia3lidn7qcnvpx2yjuyebmz4yz7k6lto5a73zop3ay7bkkgaaznx4","jobId":"4433edf6-676f-4d72-ac1d-c7126942ccd7","label":"moneycanbuyfun","status":"named","txHash":"0x40301933f4ac7ed70545ed5a6376f12c0a0eb269a0e5bc65f025ac8fdb1b9c66","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-26T22:19:02.72+00:00","repoUrl":null,"pinnedAt":"2026-10-26T22:15:52.27+00:00","createdAt":"2026-10-26T22:14:57.483+00:00","previewHash":"8103cf66c78a1e00ae6c0e0da34b485b3f80e414e30e1f66b6b0352e05f5078b","supersededBy":null},{"id":"b7f983f1-29ca-43e0-a742-5b5681f5fee1","cid":"bafybeia2ubnhn4lapi7ojxqp42osy7lx6bs67rvygtwg2btvo5mu24a27m","jobId":"6b9cc793-e540-4369-a27c-6b11d770697d","label":null,"status":"named","txHash":"0xaa38a513f3fe702631310731f6269348636f5283fd40edf54beab3a199796fe1","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-26T15:58:02.441+00:00","repoUrl":null,"pinnedAt":"2026-10-26T15:57:41.459+00:00","createdAt":"2026-10-26T15:56:54.822+00:00","previewHash":"1b594f1d748fabb1d71e19813a83a1b4b79777a9538cd5da0dc7debc791e51c7","supersededBy":"dd91b365-c9ef-446c-9a97-5738ac8588b3"},{"id":"f4ed07ea-c9e4-45d9-b6f3-ed406975b26f","cid":"bafybeigkyeosg2n5sobo3z4nwuaagjglq7b5akkt5yz3os5om64es65jwm","jobId":"e58390d9-8890-4307-9d11-7278d80dd294","label":null,"status":"named","txHash":"0x7ca43b98e4aae00bdaa151ba134e915246cfccaf214ae62a82d9e6463b0e98a5","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-26T09:24:29.216+00:00","repoUrl":null,"pinnedAt":"2026-10-26T09:24:02.153+00:00","createdAt":"2026-10-26T09:23:34.383+00:00","previewHash":"94e1e9438ab2dbe6785b808183c52604efcb5c1d65ec7bb2419dbec58a436ccc","supersededBy":"b7f983f1-29ca-43e0-a742-5b5681f5fee1"},{"id":"75c7d475-82af-4cdd-b2f9-52db5072ff52","cid":"bafybeidpnb5q63d5yed6xepz6rioe7p6i756kdwuggcinfofn423dxko3a","jobId":"692a634f-dcfa-4c90-b64c-a273c9e5fa14","label":null,"status":"named","txHash":"0x10d32c455370034e334a88b6cb774c7c6f156c48357824161126f0160a1e9281","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-24T14:02:15.323+00:00","repoUrl":null,"pinnedAt":"2026-10-24T14:01:42.837+00:00","createdAt":"2026-10-24T14:00:48.908+00:00","previewHash":"b94c702ee1cbde29dc9a25c8890f981e000262649fbb432d1915fb597f278b3b","supersededBy":"f4ed07ea-c9e4-45d9-b6f3-ed406975b26f"},{"id":"55b54b2b-0b88-467c-934e-7691bbbd46c9","cid":"bafybeiefaegaeffhkgcdekcewz2fjq5gdpm53euy5772vbezkvokygmcdi","jobId":"4604a031-39e7-445a-a5a8-26244398fc54","label":null,"status":"named","txHash":"0xafe34fb30ede48cbbc5baa6834bb1b3f4c514cb64e05328fa4d01e02b7de6d87","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-23T19:13:49.209+00:00","repoUrl":null,"pinnedAt":"2026-10-23T19:13:24.679+00:00","createdAt":"2026-10-23T19:12:47.21+00:00","previewHash":"e60c465bd0c9dcd13af4fa31c293231b9d946546ee53878ba86cd30d0dcac0a4","supersededBy":"75c7d475-82af-4cdd-b2f9-52db5072ff52"},{"id":"942d9219-5716-4fb5-9790-9e0f12b3ae2d","cid":"bafybeiboo7fbzfr6b2ofdu4ts7cui4iq2hxmwmyz7nvjsjq7zxwxmxkpyq","jobId":"97ce944a-1411-47b1-9697-0676ff3cf7c4","label":null,"status":"named","txHash":"0x27167cc05405032c5841dc7887e0e4b1dd231068f49dc8805361f1926bda6d2f","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-23T17:39:27.957+00:00","repoUrl":null,"pinnedAt":"2026-10-23T17:38:49.456+00:00","createdAt":"2026-10-23T17:38:10.024+00:00","previewHash":"ef9040ba65d9bd28a4eef88c412fbaaaa0ae9d3b1c69fe4b23406c86c5d1d15b","supersededBy":"55b54b2b-0b88-467c-934e-7691bbbd46c9"},{"id":"df8eb782-33d4-45b9-8a04-f244341ec967","cid":"bafybeifskloffdc2gijzfpmzkwvtx5qrtnbcsdixy2eala5vphsbct577e","jobId":"f02ab2f8-8b63-4b56-b5c1-e50521eaa337","label":null,"status":"named","txHash":"0x7f3411091782a42d5a0a0ec730f8d392a179a990e3f36b4da68153a703ab6064","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T16:25:39.217+00:00","repoUrl":null,"pinnedAt":"2026-10-22T16:24:17.659+00:00","createdAt":"2026-10-22T16:23:56.284+00:00","previewHash":"f1961e8f0d58e6d9b2aba4daf449e6cb901f1218fc6c333d9757a1930ca5216d","supersededBy":"942d9219-5716-4fb5-9790-9e0f12b3ae2d"},{"id":"941952c6-cfb0-469f-93c5-55375123b4ed","cid":"bafybeidvczukkgiwtxvyzwzrq5mshavry5eroh3xd3urua4c7wku5d653a","jobId":"f9ac6e7a-caf1-4565-a2b8-177019530b78","label":null,"status":"named","txHash":"0x07e530a32d75e3448b489fae9d0ff2b65ac8125c4b182e9cf862a4b24f950721","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T12:52:38.049+00:00","repoUrl":null,"pinnedAt":"2026-10-22T12:51:12.785+00:00","createdAt":"2026-10-22T12:50:57.356+00:00","previewHash":"17cd9247219703b9ba41add2d00221c9a377b2ae3c27967f72f2d0c5028481c7","supersededBy":"df8eb782-33d4-45b9-8a04-f244341ec967"},{"id":"2c92b6f0-5e39-45cd-a9ba-45aaa35f8ccd","cid":"bafybeiekxzawl2smbj27pcr4sj4tfs4dt7o7oanvd3dr5m5uf525cax6g4","jobId":"e3089b09-d6d4-4aa8-ae5b-b91ec40d91f9","label":null,"status":"named","txHash":"0x1b34198d980dd94745d0151aa3e42ebfc526076d8aab44d3754d1d0806d84c6d","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T06:29:28.392+00:00","repoUrl":null,"pinnedAt":"2026-10-22T06:28:41.649+00:00","createdAt":"2026-10-22T06:28:23.71+00:00","previewHash":"0555c33918f472f34b9644daad37cafd7210fef5de2f9ece3bfc05ab1366897d","supersededBy":"941952c6-cfb0-469f-93c5-55375123b4ed"}],"title":"Host the static site of moneycanbuy.fun on IPFS as it is. This repository's root is a finished static export of a Vite build (plain HTML, CSS and JS, no build step, no backend, relative asset paths): index.html, assets/ and config.json at the repo root. Check its content, then pin and name it; do not build, change, rewrite or add anything.\n\nWhat it is: the front end of moneycanbuy.fun, an escrow for real-world tasks on Ethereum mainnet judged by the IMD swarm. Authors post rewards, doers submit proof links, anyone may dispute, identity.md NFT holders vote, the swarm decides. The site holds no keys and no funds: every action is a transaction the visitor signs in their own wallet.\n\nSource of truth: config.json at the root. Its mainnet block (chainId 1) lists the contracts the site talks to, deployed by launches #2292 (NftGate), #2364 (token and support contracts), #2380 (core: TaskVault, CaseDesk, DisputeDesk, YoloLockHub) and #2399 (YoloSweetener, DareTrophy, ProtocolDirectory, HiddenList, YoloPredict, TrophyCatalog); the other addresses there are existing mainnet contracts (IMD, USDC, WETH, Uniswap, Permit2, the NFT collection, the delegate registry). The site reads chain state and events through a public Ethereum RPC named in config.json and shows proof files from public IPFS gateways; apiUrl is empty, there is no server of ours behind it.\n\nAccepted by design, not findings: the site lists tasks and proofs written by anyone on chain and hides the ones named in the on-chain HiddenList; it has no accounts beyond the visitor's own wallet, no analytics and no server-side storage.\n","types":["sites"],"audits":[],"paidBy":"0x3c587eff6c96eacf7e3dcc2cff6416161386e48c","release":null,"research":[],"versions":[{"site":{"cid":"bafybeiekxzawl2smbj27pcr4sj4tfs4dt7o7oanvd3dr5m5uf525cax6g4","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"e3089b09-d6d4-4aa8-ae5b-b91ec40d91f9","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-22T06:14:38.852671+00:00","objective":"Host the static site of moneycanbuy.fun on IPFS as it is. This repository's root is a finished static export of a Vite build (plain HTML, CSS and JS, no build step, no backend, relative asset paths): index.html, assets/ and config.json at the repo root. Check its content, then pin and name it; do not build, change, rewrite or add anything.\n\nWhat it is: the front end of moneycanbuy.fun, an escrow for real-world tasks on Ethereum mainnet judged by the IMD swarm. Authors post rewards, doers submit proof links, anyone may dispute, identity.md NFT holders vote, the swarm decides. The site holds no keys and no funds: every action is a transaction the visitor signs in their own wallet.\n\nSource of truth: config.json at the root. Its mainnet block (chainId 1) lists the contracts the site talks to, deployed by launches #2292 (NftGate), #2364 (token and support contracts), #2380 (core: TaskVault, CaseDesk, DisputeDesk, YoloLockHub) and #2399 (YoloSweetener, DareTrophy, ProtocolDirectory, HiddenList, YoloPredict, TrophyCatalog); the other addresses there are existing mainnet contracts (IMD, USDC, WETH, Uniswap, Permit2, the NFT collection, the delegate registry). The site reads chain state and events through a public Ethereum RPC named in config.json and shows proof files from public IPFS gateways; apiUrl is empty, there is no server of ours behind it.\n\nAccepted by design, not findings: the site lists tasks and proofs written by anyone on chain and hides the ones named in the on-chain HiddenList; it has no accounts beyond the visitor's own wallet, no analytics and no server-side storage.\n","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeidvczukkgiwtxvyzwzrq5mshavry5eroh3xd3urua4c7wku5d653a","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"f9ac6e7a-caf1-4565-a2b8-177019530b78","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-22T12:30:13.007182+00:00","objective":"Publish the next version of the moneycanbuy.fun site under its existing site name: make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit a8fd3e257f18ef097eb45669cbef9078714dde7b (84 files, listed below): replace or add each of these files with identical bytes, and delete the five old build files the commit no longer has (assets/ccip-C7Bw4V2n.js, assets/index-B69fLICN.js, assets/index-DRz_Q1QG.css, assets/index-BvWE585Y.js, assets/webIndex-B9V1vatF.js). Then copy exactly these 84 committed root files into dist/ with identical bytes, so that dist/ holds only them. After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. The page folders (how/, token/, validate/ and the others) carry their own index.html; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. Do not build, rebuild, minify, reformat, add or remove any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 84 files with their bytes, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-d0N413U-.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-Bu-V0wQC.js, assets/index-DfHOpKJx.css, assets/index-Diye1KTl.js, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-BJqITEFx.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, burn/index.html, buy/index.html, case/assets/index-Bu-V0wQC.js, case/assets/index-DfHOpKJx.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, how-it-works/index.html, how/index.html, index.html, leaderboard/index.html, me/index.html, money/index.html, new/index.html, og/burn.png, og/how.png, og/leaderboard.png, og/me.png, og/new.png, og/reels.png, og/stabilizer.png, og/stake.png, og/token.png, og/trophies.png, og/validate.png, og/yolo.png, proofs/index.html, reels/index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, stabilizer/index.html, stake/index.html, task/assets/index-Bu-V0wQC.js, task/assets/index-DfHOpKJx.css, token/index.html, tokenomics/index.html, top/index.html, trophies/index.html, u/assets/index-Bu-V0wQC.js, u/assets/index-DfHOpKJx.css, validate/index.html, yolo/index.html.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeifskloffdc2gijzfpmzkwvtx5qrtnbcsdixy2eala5vphsbct577e","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"f02ab2f8-8b63-4b56-b5c1-e50521eaa337","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-22T16:16:24.316967+00:00","objective":"Publish the next version of the moneycanbuy.fun site under its existing site name: make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit d051a3aa69b607701fe022feb25a3c295f103b94 (54 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 11 old build files (assets/ccip-d0N413U-.js, assets/index-Bu-V0wQC.js, assets/index-DfHOpKJx.css, assets/index-Diye1KTl.js, assets/webIndex-BJqITEFx.js, case/assets/index-Bu-V0wQC.js, case/assets/index-DfHOpKJx.css, task/assets/index-Bu-V0wQC.js, task/assets/index-DfHOpKJx.css, u/assets/index-Bu-V0wQC.js, u/assets/index-DfHOpKJx.css) and the whole folders burn/, buy/, how/, how-it-works/, leaderboard/, me/, money/, new/, og/, proofs/, reels/, stabilizer/, stake/, token/, tokenomics/, top/, trophies/, validate/, yolo/ (the commit has no page folders and no og/ folder). Then copy exactly these 54 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 54 files with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-BaZ5TEwM.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-0ifQj-qp.js, assets/index-2osuhigG.css, assets/index-HC3yZAFG.js, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-BVohuh-t.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-2osuhigG.css, case/assets/index-HC3yZAFG.js, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-2osuhigG.css, task/assets/index-HC3yZAFG.js, u/assets/index-2osuhigG.css, u/assets/index-HC3yZAFG.js.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeiboo7fbzfr6b2ofdu4ts7cui4iq2hxmwmyz7nvjsjq7zxwxmxkpyq","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"97ce944a-1411-47b1-9697-0676ff3cf7c4","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-23T17:06:53.43392+00:00","objective":"Publish the moneycanbuy.fun site update that fixes the swarm call cost. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit 8df05b8090c616c88dd54a96f8d9ea4f50a3d1bc (54 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 11 old build files (assets/ccip-BaZ5TEwM.js, assets/index-0ifQj-qp.js, assets/index-2osuhigG.css, assets/index-HC3yZAFG.js, assets/webIndex-BVohuh-t.js, case/assets/index-2osuhigG.css, case/assets/index-HC3yZAFG.js, task/assets/index-2osuhigG.css, task/assets/index-HC3yZAFG.js, u/assets/index-2osuhigG.css, u/assets/index-HC3yZAFG.js). Then copy exactly these 54 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. The connect sheet lists six wallets in a fixed order (MetaMask, Coinbase, Binance, OKX, Rabby, Backpack); a wallet found in the browser is marked and connects directly, a wallet not found is a link to its install page or, on a phone, its own open-in-app link; wallets found outside the six are listed below them. On a dare paid in IMD, Ask the swarm and Appeal send as the IMD cap the full IMD the sheet approves: the dispute bond, its reward part and the swarm fee; the Total hint of that sheet has five lines (the call, a win, the fee, a loss and a silent swarm). Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 54 files with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-urGum9qr.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-BiKYkEFj.js, assets/index-DglCLOyN.css, assets/index-SE6WsR_h.js, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-EvxUGFWo.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BiKYkEFj.js, case/assets/index-DglCLOyN.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BiKYkEFj.js, task/assets/index-DglCLOyN.css, u/assets/index-BiKYkEFj.js, u/assets/index-DglCLOyN.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeiefaegaeffhkgcdekcewz2fjq5gdpm53euy5772vbezkvokygmcdi","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"4604a031-39e7-445a-a5a8-26244398fc54","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-23T19:07:02.412799+00:00","objective":"Publish the moneycanbuy.fun site update that shows old dispute reasons. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit 7223357bc9488050239c7259df1ce262aaf3fadf (54 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 11 old build files (assets/ccip-urGum9qr.js, assets/index-BiKYkEFj.js, assets/index-DglCLOyN.css, assets/index-SE6WsR_h.js, assets/webIndex-EvxUGFWo.js, case/assets/index-BiKYkEFj.js, case/assets/index-DglCLOyN.css, task/assets/index-BiKYkEFj.js, task/assets/index-DglCLOyN.css, u/assets/index-BiKYkEFj.js, u/assets/index-DglCLOyN.css). Then copy exactly these 54 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. A dispute reason older than the recent log window is read at the dispute's block: the case page shows it and the swarm call sends it. The active section's bar sits on the header line; board tabs grow with their text. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 54 files with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-BxjNaE_g.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-CHvKyU2B.css, assets/index-DzvQyVRY.js, assets/index-HfX7onmW.js, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-CstsWMWF.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-CHvKyU2B.css, case/assets/index-DzvQyVRY.js, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-CHvKyU2B.css, task/assets/index-DzvQyVRY.js, u/assets/index-CHvKyU2B.css, u/assets/index-DzvQyVRY.js.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeidpnb5q63d5yed6xepz6rioe7p6i756kdwuggcinfofn423dxko3a","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"692a634f-dcfa-4c90-b64c-a273c9e5fa14","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-24T13:49:02.97144+00:00","objective":"Publish the moneycanbuy.fun site update with three looks and the new Predict. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit e35f4a7ad38a7304813d8baad3e2af6cb0a6be12 (54 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 11 old build files (assets/ccip-BxjNaE_g.js, assets/index-CHvKyU2B.css, assets/index-DzvQyVRY.js, assets/index-HfX7onmW.js, assets/webIndex-CstsWMWF.js, case/assets/index-CHvKyU2B.css, case/assets/index-DzvQyVRY.js, task/assets/index-CHvKyU2B.css, task/assets/index-DzvQyVRY.js, u/assets/index-CHvKyU2B.css, u/assets/index-DzvQyVRY.js). Then copy exactly these 54 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. The site has three looks, Degen, YOLO (plain words, amounts in $) and macOS; the choice is kept in the browser; in the YOLO look the case page says deposit, objector, judges and AI judge, with the same amounts. The Predict window shows the payout per 1 YOLO now and later, the chance over time and every position; its bet count shows … until the positions are read. A dare with an accepted proof that is not settled is shown as Accepted, not Paid. Dare cards and the dare page show the reward value in $ with its YOLO part. A finished case shows each party's stake, return and net, and every judge with avatar, vote and reward; an unsettled case shows its result with a Settle button; a case without an NFT vote decision says that its voters get no reward. Claimable on the profile lists each dare's amount and reason, accepted proofs with reward and bond back; one Claim collects all. Open lists only dares that can be taken now; dares with a proof in review are under Judging. Minting a trophy for an unsettled dare settles it first; funds stay in the contract. The leaderboard counts accepted proofs that are not settled yet, marked; a profile's earned amount is the same number as its leaderboard row; on desktop a leaderboard with up to three rows lists the biggest open dares under the table. Multi-step actions ask the wallet once when it supports call batches. Pages keep a 32 px top gap and a 1440 px max width. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 54 files with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-BniSvFB5.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-BtuqbKNq.js, assets/index-CSfXXEfS.js, assets/index-o8ux9npW.css, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-B1OoZsJV.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BtuqbKNq.js, case/assets/index-o8ux9npW.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BtuqbKNq.js, task/assets/index-o8ux9npW.css, u/assets/index-BtuqbKNq.js, u/assets/index-o8ux9npW.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeigkyeosg2n5sobo3z4nwuaagjglq7b5akkt5yz3os5om64es65jwm","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"e58390d9-8890-4307-9d11-7278d80dd294","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-26T09:06:30.401416+00:00","objective":"Publish the moneycanbuy.fun site update in ten languages with dare comments. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit dbcae47f8dd103c8abcfdd3d5efbc9b9c6912db4 (252 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 16 old build files (assets/ccip-BniSvFB5.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-BtuqbKNq.js, assets/index-CSfXXEfS.js, assets/index-o8ux9npW.css, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/webIndex-B1OoZsJV.js, case/assets/index-BtuqbKNq.js, case/assets/index-o8ux9npW.css, task/assets/index-BtuqbKNq.js, task/assets/index-o8ux9npW.css, u/assets/index-BtuqbKNq.js, u/assets/index-o8ux9npW.css). Then copy exactly these 252 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: Dollar amounts use the market price read in the browser from the Uniswap pools (YOLO/IMD, IMD/USDC, WETH/USDC). The doer's own deposit back is shown apart from the reward everywhere: case payouts, Claimable and dare cards. Every open dare shows the doer's deposit as a number: returned in full if the proof is accepted, lost if rejected. An open dare whose last proof was rejected reads Open, with that proof's number and result under the step bar. The YOLO look has its own home, dare page, case, profile, leaderboard and How it works, in plain words with amounts in $. The macOS look has a sidebar on desktop and a tab bar on phones, grouped rows on every page and its own How it works. A case names the judge of its verdict from the dispute's own events: the AI judge or the NFT vote. Validate rows and the proof history show the proof number. Post a dare is one stepper; amount fields take digits and one point; the task text shows the characters left. The interface is available in ten languages, each with its own words for durations and contract time windows (days, hours, minutes, seconds), not English units relabeled. Sentences that mention a time window read naturally in each language, with no stray Latin letters or missing spaces around the number. Signing in offers an embedded wallet next to connecting an existing one. A dare can carry comments. During a dispute, the page names the step (review or voting) and the time left to vote, in the site's language; only an NFT holder sees the legit or fake voting buttons, everyone else sees the same status without them. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 252 files (214 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 214 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":null,"jobId":"2adc2011-3147-4e81-be52-41bf7428ee28","state":"blocked","commit":null,"repoUrl":null,"createdAt":"2026-10-26T13:27:54.650049+00:00","objective":"Publish the moneycanbuy.fun site update with Telegram Mini App sign-in and interface fixes. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit c03f498e7c9d27afbdf4e08785b80d922dda6e1d (252 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 180 old build files in assets/ (every file in assets/ that the commit does not have). Then copy exactly these 252 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: Inside the Mini App, signing in uses the account the Mini App is opened from. Outside the Mini App, the sign-in button reads Sign in with Google or e-mail. Inside the Mini App, Share opens the same dare or case in the Mini App. The YOLO home page lists open dares with category chips, a sort (Biggest, Newest, Ending soon) and a currency filter. In the wallet window, Top up and Export key are two equal full-width buttons. The Style and Language menus are drawn in the design of the selected skin. In Reels, amounts stay readable in every theme and a progress bar shows the position. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 252 files (214 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 214 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":null,"jobId":"46c1e8ed-e3d9-4bb2-99a8-43336e19931d","state":"blocked","commit":null,"repoUrl":null,"createdAt":"2026-10-26T14:01:44.737074+00:00","objective":"Publish the moneycanbuy.fun site update with Telegram Mini App sign-in and interface fixes. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit c03f498e7c9d27afbdf4e08785b80d922dda6e1d (252 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 180 old build files in assets/ (every file in assets/ that the commit does not have). The root update runs in two steps so that each upload stays under the limit: first only these deletions, then the additions and replacements. Then copy exactly these {n} committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: Inside the Mini App, signing in uses the account the Mini App is opened from. Outside the Mini App, the sign-in button reads Sign in with Google or e-mail. Inside the Mini App, Share opens the same dare or case in the Mini App. The YOLO home page lists open dares with category chips, a sort (Biggest, Newest, Ending soon) and a currency filter. In the wallet window, Top up and Export key are two equal full-width buttons. The Style and Language menus are drawn in the design of the selected skin. In Reels, amounts stay readable in every theme and a progress bar shows the position. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 252 files (214 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 214 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeia2ubnhn4lapi7ojxqp42osy7lx6bs67rvygtwg2btvo5mu24a27m","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"6b9cc793-e540-4369-a27c-6b11d770697d","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-26T15:37:31.555603+00:00","objective":"Publish the moneycanbuy.fun site update with Telegram Mini App sign-in and interface fixes. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit 2dcc87f059aaf06fcd3cba2f3f07b8e42c1f62a2 (253 files, listed below): add or replace each of these files with identical bytes. Every file the root has now is in the commit, so delete nothing: add the 181 build files in assets/ that the root does not have and replace the 38 changed files. Then copy exactly these 253 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: Inside the Mini App, signing in uses the account the Mini App is opened from. Outside the Mini App, the header has one Connect button, it opens a sheet with Sign in with Google or e-mail on top and the wallets under it. Connect finds the wallets installed in the browser (MetaMask, Rabby and others) and asks them directly. Inside the Mini App, Share opens the same dare or case in the Mini App. The YOLO home page lists open dares with category chips, a sort (Biggest, Newest, Ending soon) and a currency filter. In the wallet window, Top up and Export key are two equal full-width buttons. The Style and Language menus are drawn in the design of the selected skin. In Reels, amounts stay readable in every theme and a progress bar shows the position. A proof photo shown large is shown whole, over a blurred copy of itself. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 253 files (215 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 215 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeia3lidn7qcnvpx2yjuyebmz4yz7k6lto5a73zop3ay7bkkgaaznx4","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"4433edf6-676f-4d72-ac1d-c7126942ccd7","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-26T21:51:09.743426+00:00","objective":"Publish the moneycanbuy.fun site update with steadier chain reads and Mini App header fixes. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit b54245793e49458cdf48903b296a17217077908b (242 files, listed below): add or replace each of these files with identical bytes and delete the 18 old build files in assets/ that the commit does not have: add 7 build files in assets/, replace the 98 changed files, delete 18 files in assets/. Then copy exactly these 242 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: The site is about 250 KB lighter: wallet screens that sign-in and top-up never reach are left out of the build. Chain reads go through a pool of public RPC nodes with batching, a pause for a node after rate limiting and retries. A chain read that did not come back shows loading or an error with Retry, never a zero; on Burn too. Dare titles that did not load are read again. On a case, the proof note is shown once, in Arguments. On a wide case page, Arguments and the timeline sit under the amount panel. In the macOS skin on a phone, the bottom tab bar and the Dispute, Open case and Burn bars are solid. Page texts and the page description say IMD identity NFT holders. Inside the Mini App, the header fits 360 to 420 px in all 10 languages, scrollbars are hidden and the header has a language button. Inside the Mini App, a saved session of another account is signed out and the app signs in with the account it is opened from. On Me, the wallet card shows the whole balance in dollars on top, and the stats are a 2 by 2 grid on a phone. On Burn and on the BURNED card, the burned YOLO is also shown in dollars at today's price; with no price, no dollar amount is shown. In the language list, the Russian entry is spelled in Ukrainian. In Ukrainian, Russian and French, the desktop header uses the short word for How it works, so the header row fits the window. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 242 files (204 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 204 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null}],"contracts":[],"publishedAt":"2026-10-26T22:19:02.72+00:00"},{"id":"job:24f0a52b-05e5-4f64-9781-97b23c84b8e3","code":[],"media":[],"sites":[],"title":"Security audit of Tally v0: credit lines for AI agents paying over x402, settled in USDC. CreditPool is an ERC-4626 vault that funds payments; TabManager executes agent-signed EIP-712 payment intents against owner collateral and mandates (per-payment cap, budget, expiry, Merkle seller allowlist), bills weekly statements and liquidates past-due lines; sponsored lines let one sponsor deposit back many agent lines, each with its own cap (NO_CAP, or 0 to freeze), and liquidation draws on the sponsor deposit; Escrow holds larger payments for review and dispute; ScoreRegistry stores one Merkle root of agent credit scores per daily epoch and verifies proofs on chain. Focus on: loss of lender or owner funds, accounting drift between pool.outstanding and line balances, signature replay across lines/epochs/chains, mandate budget bypass, sponsor accounting (outstanding vs. the sum of its lines, withdrawals that leave lines unbacked, cap bypass), ScoreRegistry epoch ordering, revocation and stale-record handling, escrow states that lock funds, rounding in fees and ERC-4626 share math, and reentrancy through USDC or ERC-1271 wallets. Prior reviews and fixed findings are in audits/. Report each finding with severity, location, a concrete exploit path and a fix.","types":["audits"],"audits":[{"jobId":"24f0a52b-05e5-4f64-9781-97b23c84b8e3","repoUrl":"https://github.com/Tally-402/tally-contracts","findings":9,"reportUrl":null,"baseCommit":"24bfa2aaab606735c557c08a00c2628d4575f2e0","severities":{"low":6,"info":3},"publishedAt":"2026-10-24T02:05:45.178+00:00"}],"paidBy":"0x5eac72318cd647d89e923461f75c1d2b5d0b545e","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-24T02:05:45.178+00:00"},{"id":"launch:3836b728-fabb-40bc-a57f-180416ed7f84","code":[],"media":[],"sites":[],"title":"What to build: two immutable contracts for The Hooks Store on Ethereum (the first launch deployed the same contracts on Robinhood Chain), HookListingRegistry (a free on-chain listing registry) and FeaturedPlacementsV2 (a paid, refundable 24-hour featured-placement escrow in IMD). Upgrades: none. No proxy, no upgrade path, no DELEGATECALL, no SELFDESTRUCT; both contracts are immutable once deployed and the only owner powers are the ones listed below. Start from the audited source at https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/tree/46e17ea70534e8a7ac2c4ff78501a3c183d32da8/src/store (HookListingRegistry.sol unchanged; FeaturedPlacements.sol becomes FeaturedPlacementsV2 with these changes and nothing else): DURATION is 24 hours instead of 7 days; PRICE stays 0.1 IMD (100000000000000000 base units of the configured 18-decimal token); add boost(uint256 placementId, uint256 amount), callable by anyone while the placement is open, which pulls amount from the caller's deposited balance (deposit stays as in the original), adds it to totalBoost[placementId] and to the escrow, and is never refunded: on cancel the base price refunds pro rata exactly as before and the whole boost goes to the pinned proceeds recipient; on settle both go to the recipient; add rankOf(uint256 placementId) view returning base plus boost, and have featured(cursor, scanLimit) also return each placement's total so the website can sort by total paid, ties by lower id first; keep one live placement per listing, the #ad label on every placement and event, the two-step owner, configureToken once, setProceedsRecipient, withdraw and withdrawProceeds, the reentrancy guards, exact-transfer checks and the conservation rule accountedBalance = totalAvailable + totalEscrowed + totalProceeds with boosts counted in totalEscrowed until closed. Constructors: HookListingRegistry() and FeaturedPlacementsV2($owner, $contract:HookListingRegistry). Owner functions stay owner-only with $owner as the owner; no msg.sender ownership. Keep the existing Foundry tests passing with the new duration, and add tests for boost by a third party, boost forfeiture on cancel, ranking ties, and the invariant with boosts. No token, pool or liquidity is created. Dependencies: only the IMD token on Ethereum (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7), set after deployment by the owner through configureToken, never a constructor dependency. Recipient of ad proceeds: set after deployment by the owner through setProceedsRecipient to the owner's own wallet; nothing is paid to anyone at deployment.","types":["contracts"],"audits":[],"paidBy":"0x5bff2a2fecd1d6152676813b21346238733beab1","release":null,"research":[],"versions":[],"contracts":[{"id":"3836b728-fabb-40bc-a57f-180416ed7f84","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"FeaturedPlacementsV2","role":"other","txHash":"0x1e9a0662a95042821de95e3d69304e42bb4e11b09cadbeb7d9148a6d8b52cb4a","address":"0x1da6f19ee08365813651de6420603fea4fbcdc9a"},{"name":"HookListingRegistry","role":"other","txHash":"0x1e9a0662a95042821de95e3d69304e42bb4e11b09cadbeb7d9148a6d8b52cb4a","address":"0xff8b7110525c1ec39d6df825880890e7d9184f06"}],"createdAt":"2026-10-22T06:10:43.147+00:00","updatedAt":"2026-10-22T14:42:28.602+00:00","launchNumber":2456,"parkedReason":null,"sourceCommit":"fcca6490b279cd9821cf71d1edf083afbfa1cba5","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2456-what-build-two-immutable"}],"publishedAt":"2026-10-22T06:10:43.147+00:00"},{"id":"launch:24f55ec3-e64c-43b7-a095-977c9c5dbfc3","code":[],"media":[],"sites":[],"title":"What to build: two immutable contracts for The Hooks Store on Robinhood Chain (a second launch with chainId 1 deploys the same contracts on Ethereum), HookListingRegistry (a free on-chain listing registry) and FeaturedPlacementsV2 (a paid, refundable 24-hour featured-placement escrow in IMD). Upgrades: none. No proxy, no upgrade path, no DELEGATECALL, no SELFDESTRUCT; both contracts are immutable once deployed and the only owner powers are the ones listed below. Start from the audited source at https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/tree/46e17ea70534e8a7ac2c4ff78501a3c183d32da8/src/store (HookListingRegistry.sol unchanged; FeaturedPlacements.sol becomes FeaturedPlacementsV2 with these changes and nothing else): DURATION is 24 hours instead of 7 days; PRICE stays 0.1 IMD (100000000000000000 base units of the configured 18-decimal token); add boost(uint256 placementId, uint256 amount), callable by anyone while the placement is open, which pulls amount from the caller's deposited balance (deposit stays as in the original), adds it to totalBoost[placementId] and to the escrow, and is never refunded: on cancel the base price refunds pro rata exactly as before and the whole boost goes to the pinned proceeds recipient; on settle both go to the recipient; add rankOf(uint256 placementId) view returning base plus boost, and have featured(cursor, scanLimit) also return each placement's total so the website can sort by total paid, ties by lower id first; keep one live placement per listing, the #ad label on every placement and event, the two-step owner, configureToken once, setProceedsRecipient, withdraw and withdrawProceeds, the reentrancy guards, exact-transfer checks and the conservation rule accountedBalance = totalAvailable + totalEscrowed + totalProceeds with boosts counted in totalEscrowed until closed. Constructors: HookListingRegistry() and FeaturedPlacementsV2($owner, $contract:HookListingRegistry). Owner functions stay owner-only with $owner as the owner; no msg.sender ownership. Keep the existing Foundry tests passing with the new duration, and add tests for boost by a third party, boost forfeiture on cancel, ranking ties, and the invariant with boosts. No token, pool or liquidity is created. Dependencies: only the IMD token on Robinhood Chain (0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127), set after deployment by the owner through configureToken, never a constructor dependency. Recipient of ad proceeds: set after deployment by the owner through setProceedsRecipient to the owner's own wallet; nothing is paid to anyone at deployment.","types":["contracts"],"audits":[],"paidBy":"0x5bff2a2fecd1d6152676813b21346238733beab1","release":null,"research":[],"versions":[],"contracts":[{"id":"24f55ec3-e64c-43b7-a095-977c9c5dbfc3","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":4663,"artifacts":[{"name":"FeaturedPlacementsV2","role":"other","txHash":"0xd37d4b653052d23edaa493d852b5ca6e84253b1a90e6823929e954810af9bc52","address":"0x63b59cbf5b535e46815ae5d4cf126bf409dba69c"},{"name":"HookListingRegistry","role":"other","txHash":"0xd37d4b653052d23edaa493d852b5ca6e84253b1a90e6823929e954810af9bc52","address":"0x366c84a2971713fc8fa24d3d4b8abd2f4f085625"}],"createdAt":"2026-10-22T05:00:11.508+00:00","updatedAt":"2026-10-22T14:40:41.471+00:00","launchNumber":2454,"parkedReason":null,"sourceCommit":"952e62de284440144a24fc4ec4868461e4534612","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2454-what-build-two-immutable"}],"publishedAt":"2026-10-22T05:00:11.508+00:00"},{"id":"launch:0a89829a-94c5-4935-8b4c-4bbe1e5b92c3","code":[],"media":[],"sites":[],"title":"Launch the core of moneycanbuy.fun from this repository as it is: an evm_contracts launch on Ethereum mainnet (no token), the third of four. It uses the token and the contracts of launch #2364 as static arguments; the fourth launch adds modules that only read this vault. script/LaunchPlan.sol is all four launches in code (core is this one).\n\nContracts, in this order:\n1. YoloLockHub, constructorArgs [\"0x49E55A87AA4bB0d2fd58fDCf1A31c9612DE015dc\"]\n2. CaseDesk, constructorArgs [\"0x25576E455A87B92836EA901E89e6b26e59306BE9\", \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\", \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\", \"0xAdfe6bd2C17dB514241e1A9B3342F88876073B7F\", \"0x6b491127d1a6507363FEEcC3420153AA77873881\", \"0x49E55A87AA4bB0d2fd58fDCf1A31c9612DE015dc\", \"$contract:YoloLockHub\"]\n3. DisputeDesk, constructorArgs [\"0x25576E455A87B92836EA901E89e6b26e59306BE9\", \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\", \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\", \"0xAdfe6bd2C17dB514241e1A9B3342F88876073B7F\", \"0xEac6b7525f184ADA392601ed1Ce197fbC9F809b8\", \"0x49E55A87AA4bB0d2fd58fDCf1A31c9612DE015dc\", \"$contract:YoloLockHub\"]\n4. TaskVault, constructorArgs [\"0x25576E455A87B92836EA901E89e6b26e59306BE9\", \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\", \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\", \"0x49E55A87AA4bB0d2fd58fDCf1A31c9612DE015dc\", \"0x88eB0e6A38A8eA9A291697cf2420EFbA6EE0CCf9\", \"0xAdfe6bd2C17dB514241e1A9B3342F88876073B7F\", \"$contract:CaseDesk\", \"$contract:DisputeDesk\", \"0xbf6838E27F82754443724006D127a130B9dd9E0A\"]\n\nWhat it is: an escrow for real-world tasks judged by the IMD swarm. Authors post rewards in ETH, USDC, IMD or YOLO (the token of launch #2364) at or above a per-currency minimum (5 USDC, 0.002 ETH, 1 IMD, 1,000 YOLO; no reward maximum on a task or across all open tasks), always with a deadline that never changes; no creation fee. Anyone may top up a reward. The reward is locked until the deadline: nobody who put money in takes it back before the task expired or was unwound. Doers submit a proof link with a bond of 0.5 IMD plus 3% of the author's own part of the reward in the reward currency, no doubling for rejected or queued submissions; anyone but the doer may dispute within 24 hours with a 0.5 IMD plus 1% bond. identity.md NFT holders then vote for 24 hours, each with his own transaction and his own gas: vote(subId, side, payTo, tokenIds) with the ids of NFTs he owns now or holds as a delegate.xyz v2 delegate of the owner (VotePower of launch #2364); each NFT votes once per dispute, more transactions add NFTs to the same side, the side never changes; no registration, no snapshot, no signatures relayed by others. A lead of 20 NFTs decides at once; else at the end a lead of at least 10 decides. The swarm, asked through the Intake 0xa43e6f75ee006411f79ac1c84120606c2330de82 (version 2) only when someone pays for it (an appeal of the NFT decision, or a call when the NFT did not decide), is the final instance, answering no later than 6 hours per call; at most 3 questions per submission, and after a third silence it ends as if nobody had called. No task has a mandatory swarm check. There is no timed emergency exit: once a step's own timer runs out, anyone's next call settles it. The owner of DevPrices may cancel an open task in any phase (cancelTask): it becomes unwound, everyone takes back what he put in except swarm fees already paid, the wallet gets nothing.\nMoney of an accepted submission: the doer gets 90% of the whole reward (top-ups included); of the 10% fee, 5% go to the NFT votes that decided right after a dispute (else to the treasury) and 5% to the treasury; a doer whose YOLO lock in YoloLockHub had power at his submission gets up to 4% more, 4% x min(1, power / (rewardInYolo + sweetener)) where rewardInYolo is the task's whole pot at submission (every top-up included) at the DevPrices YOLO price at submission and sweetener is the task's YOLO bonus in YoloSweetener at submission (power = amount x weeks / 52; any power counts, no threshold), as usual even if the doer himself put money into the task; the rest of that 5% is half burned, half the treasury's, and the NFT 5% nobody earned is burned. Burned means: YOLO to the BuybackBurner 0xbf6838E27F82754443724006D127a130B9dd9E0A, where anyone burns it; ETH, USDC and IMD straight to its buyback wallet. YOLO the treasury would get is always burned. A loser's bonds are split in each currency: half to the winning side and half to the correct votes if the NFT decided right, otherwise all to the winning side (so the disputer's bond goes to the doer when the NFT did not decide and nobody called the swarm). A rejected submission leaves the reward in the task.\nYoloLockHub is the doer stake: lock(add, weeks) locks YOLO for 1 to 52 weeks (only longer, only more), withdraw after the end, no owner; the power is fixed at the lock, an extension sets it to amount x weeks left / 52; CaseDesk reads powerAt at the submission and fixes the bonus share, DisputeDesk checks stakePower(who, since) at the payout (0 once the lock ended); a hub that fails counts as no stake and never blocks a submission or a payout. TaskVault is the only address users call and approve: it holds all the money, the tasks and the swarm requests, receives the Intake callback (onOracleResult) and forwards the other calls with a plain CALL, never DELEGATECALL, appending the sender and msg.value. CaseDesk keeps submissions and the lazy state machine; DisputeDesk keeps disputes, votes, appeals and settlements. The desks hold no funds and accept calls only from the vault and each other. Money invariant: for every token, the vault's balance >= liabilities[token], and every amount sits in exactly one bucket.\n\nYoloLockHub comes first because the desks name it. TaskVault's constructor wires the two desks, which accept wiring only once, only in the transaction that deployed them (a transient-storage flag) and only into their own slot, so these four contracts must stay one launch, in this order. Constructors take only addresses and make no external call except to the desks of this launch and AttestationChecker.registry().\n\nKnown trust assumptions, accepted by design: the swarm attester key set in ParamsRegistry, global for all open cases; the Intake owner sets the swarm price without delay (every payer passes maxImdIn); a swarm answer counts only through the Intake callback; prices are set by hand by the owner of DevPrices and only move the stake bonus; that owner may cancel open tasks (refunds only).\n\nThe tests must keep passing: forge test (688 tests including invariants of the money buckets), and forge test with FORK_URL set to a mainnet archive RPC, which runs this launch through the live ProjectFactory against the 16,777,216 gas cap (about 14.9M) and tasks end to end. Keep the launch under the cap; DisputeDesk has about 3.1 KB left under the 24,576-byte contract size limit.\n\nAudit it as it arrived. Adapt only what the launch rules or a reproduced audit finding require, and record each change in ADAPTATION.md. Do not change fees, the fee split, the stake bonus, bonds, windows, shares, limits, recipients, the parameter values, the currencies, the constructor arguments or the split into these four contracts, and do not add an owner, a pause, an upgrade path, minting or a fee, unless a reproduced finding requires it; record it in ADAPTATION.md.\nKnown limitations listed in docs are accepted rules, not findings; do not change them.","types":["contracts"],"audits":[],"paidBy":"0x3c587eff6c96eacf7e3dcc2cff6416161386e48c","release":null,"research":[],"versions":[],"contracts":[{"id":"0a89829a-94c5-4935-8b4c-4bbe1e5b92c3","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"CaseDesk","role":"other","txHash":"0xd2a9bd560fa6bbd4ed15ce84093246c15699380f0364e1b17d5511e344ec07fb","address":"0xe4d4e62060043eac2930f0807a7d22153e245b57"},{"name":"DisputeDesk","role":"other","txHash":"0xd2a9bd560fa6bbd4ed15ce84093246c15699380f0364e1b17d5511e344ec07fb","address":"0x832bb6bab313cd9b4d98e73d1acb2ca5b8db5847"},{"name":"TaskVault","role":"other","txHash":"0xd2a9bd560fa6bbd4ed15ce84093246c15699380f0364e1b17d5511e344ec07fb","address":"0x88c3b0b64e6869c424daf25ad8ed635180832493"},{"name":"YoloLockHub","role":"other","txHash":"0xd2a9bd560fa6bbd4ed15ce84093246c15699380f0364e1b17d5511e344ec07fb","address":"0xfc8cb0dc242acc7fd74e06b3c0b598be63affb5f"}],"createdAt":"2026-10-21T15:15:45.836+00:00","updatedAt":"2026-10-21T15:26:16.355+00:00","launchNumber":2380,"parkedReason":null,"sourceCommit":"f2fd32f2617f84ad0fc5e70c8b3fd9465671f5a1","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2380-launch-core-moneycanbuy-fun-repository"}],"publishedAt":"2026-10-21T15:15:45.836+00:00"},{"id":"launch:544c0ace-4f80-4067-ac5f-9b7c590669c0","code":[],"media":[],"sites":[{"id":"9970a6e8-a97e-4bca-970b-0ce40c87eb1e","cid":"bafybeiajlmgiyqfjb6z54gs4ksbwx2zllo3aeteo3ga3ayulsw6qrh7jl4","jobId":"cd805c00-3263-495a-a3cf-7659cff67e41","label":"plea-test-run-9","status":"named","txHash":"0xd4e966b6127df7ccec775ce303f7eaf4be1db9331b571f3123849119fb524a20","ensName":"plea-test-run-9.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T07:51:04.71+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p","pinnedAt":"2026-10-21T07:50:37.743+00:00","createdAt":"2026-10-21T07:50:14.921+00:00","previewHash":"74b7a859068fde46d953f0e7b21d2e2d0f9162a33624d6fe03916aa507e1e890","supersededBy":null},{"id":"01a19bf0-38ef-4253-9d1b-3271cacdef3c","cid":"bafybeige3rob4xgxdblygfxsr6cepuletb46dl6fc34o4jwlmalcc67soa","jobId":"fd8cb957-afe1-4d5c-a3c7-e745a0d99eac","label":null,"status":"named","txHash":"0x721dcca2eb69a724d9417501f73f4ca29c2c78612666f1b1b117ef462272f4ac","ensName":"plea-test-run-9.site.identitymd.eth","failure":null,"namedAt":"2026-10-20T23:25:01.527+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p","pinnedAt":"2026-10-20T23:22:58.14+00:00","createdAt":"2026-10-20T23:22:46.67+00:00","previewHash":"d9ade9cfef6cab3dfe9552ad4f11bdedc950de39fbb8430f1ceb451733a8bb26","supersededBy":"9970a6e8-a97e-4bca-970b-0ce40c87eb1e"},{"id":"7f826898-3e5a-4f06-96dc-1a3f2a81e5b2","cid":"bafybeiclgwccztv3fcm6u2qicqeko5s3vozm4aoel3fft7w46o3stlq7pi","jobId":"3c7d2414-424b-4ffc-91ca-efe58fbdae36","label":null,"status":"named","txHash":"0xf1f30aa3f863985c70d6ed250ffa0da50ed8a087370be4f8a9395d0b1f51f9d5","ensName":"plea-test-run-9.site.identitymd.eth","failure":null,"namedAt":"2026-10-20T12:03:15.274+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p","pinnedAt":"2026-10-20T12:02:20.124+00:00","createdAt":"2026-10-20T12:02:11.883+00:00","previewHash":"ddb7dbe036a7b576a5d5a2182fb1c2c783b196aa9c92cd97543d1edc7f7c8de8","supersededBy":"01a19bf0-38ef-4253-9d1b-3271cacdef3c"}],"title":"Launch PLEA test run 9 on Sepolia from this Foundry repository exactly as launch.json lists it: five contracts (PLEA, CabalGate, Seasons, PleaDistributor, PleaLaunch), deployed in order in one transaction with the constructor arguments in launch.json. This is the final code: run 8.5's code (your launch #1981, branch testnet8.5 @ af57f6d) plus (1) the two findings of run 8.5's launch audit, fixed: the share bands compare the exact share (CabalGate._shareBps rounds up), and launch.json's seat-NFT word is in EIP-55 form; (2) fees 2.25%: the owner's share is 1% (PleaHook.OWNER_BPS 100), and the Letterbox's 95% delivery floor counts the hook's 2.25% sale fees (HOOK_SALE_FEE_BPS 225, a new Letterbox hash); (3) the wall's placement guard rises at most 700 ticks a day (WALL_GUARD_TICKS_PER_DAY, was 400); (4) imdTEST (0x56bcf2a5f47710649a4091219ef0b56e2d1b58bf) is both the pool currency and the oracle fee asset, because your Sepolia Intake sells oracle questions only in imdTEST since 2026-10-18 (the earlier open-mint test IMD is priced at 0 there). So the mint flag is 0: the Letterbox buys the 0.5 oracle fee and the 0.25 tip with the writer's PLEA, and a hand plea, an appeal and an objection pay the fee in imdTEST. imd/acc's Sepolia Stacker stakes the earlier test IMD, so its credit reverts and the hook pays the 0.5% cashback in plain imdTEST, its documented fallback. While the shared PoolManager holds less imdTEST than a buy's payouts, the payouts are ERC-6909 claims; the agreed 2 imdTEST opening buy's payouts join the pool (PAYOUT_RESERVE). Unchanged from run 8.5: letters plead 20% and the fact score is 0-45: share of the balance sold at most 20%: 16, at most 35%: 9, more: 3; held 7 days: 7, 3 days: 4, 1 day: 2; at a loss: 13, gain at most 50%: 12, 200%: 10, 500%: 8, 1,000%: 6, more: 4; PLEA no buy record covers: held since trading opened, at profit 10; 24h trend up: 9, flat: 5, down: 0; need = 71 - fact (CannotPass above 45); every fix of your audit rounds 5 to 8 (audit/FINDINGS.md); Objection! (src/Tribunal.sol, spec OBJECTIONS.md, deployed after the launch through PleaLaunch.deployTribunal against the hash committed as its 13th argument): for 20 minutes after an approval anyone except the seller and the wallets Seasons excludes may object (the 0.5 oracle fee and a 0.35 stake, both in imdTEST); sustained when newScore + 2 < need (no points, stake back), otherwise overruled (stake to the plea's season pot); no answer within 20 minutes voids it (stake back); the recorded score is the lowest any panel gave; at most two objections per plea, from different wallets; the 1.2 seat multiplier (Seasons' fourth argument, the IMD NFT (test) 0xa0443799c320e16c80801c9c1911f3571260287f), cap decay 15 days, the 82/6/12 split, six bonus seasons of 10,000,000 PLEA, top 25 from 450 to 350 bps. Build: a bare forge build compiles src, script and the launch-manifest suites in test/ (about 1 GB, under two minutes); a new test file goes in test/ and joins that build. The suite (852 tests in 91 suites) lives in test/full/ and the forks in test/fork/, both skipped by the default profile: run them with FOUNDRY_PROFILE=full forge test --match-path 'test/full/{A,B}.t.sol' a few files at a time (the forks skip without their RPC URL variables; test/fork/ForkTestnet.t.sol rehearses this run against your live Sepolia Intake with imdTEST); never FOUNDRY_PROFILE=full forge build of the whole tree (several GB of memory, over a 10-minute limit); test/LaunchManifest.t.sol ties launch.json to both committed code hashes and asserts the launch fits the 16,777,216-gas cap with your factory's 22% headroom (13,490,541 as charged, 16,458,460 with headroom, 318,756 under). Audit the imported code and deploy it unchanged; fix only what the audit proves is a real bug, and keep every number as it is (timings, panel 30, quorum 17, 5-hour seasons, 33-hour dead-man, START 1792594800, credit gas 1300000, fees 2.25%, letters 20%, the fact table above, plea 1% to 50% or 2.5M, 0.70 IMD minimum plea value, 95% sale minimum, fee cap +10%, objection window 20 minutes, stake 0.35 IMD, margin 2, two objections per plea). If you change the Letterbox or the Tribunal, update its code hash in launch.json. Runtime sizes: PleaHook 24,402 bytes (174 under the EIP-170 limit), CabalGate 24,018, Letterbox 23,255, Tribunal 21,654, Seasons 12,473: keep any fix within them. Keep PLEA.setLauncher accepting either the deploy-transaction flag or PLEA's deployment block, and keep foundry.toml as it is, including the default profile's skip list, [lint] lint_on_build = false and the read-only fs_permissions for ./out and ./launch.json.","types":["contracts","sites"],"audits":[],"paidBy":"0x4b91078b2374c956a65f7af0999cae0a935e6821","release":null,"research":[],"versions":[{"site":null,"jobId":"5ded88fa-4108-448d-b81e-9c88b42d9aa2","state":"completed","commit":"9f58da6e57221261c71630fbe9d342e87395de1c","repoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p","createdAt":"2026-10-19T13:35:04.257642+00:00","objective":"Launch PLEA test run 9 on Sepolia from this Foundry repository exactly as launch.json lists it: five contracts (PLEA, CabalGate, Seasons, PleaDistributor, PleaLaunch), deployed in order in one transaction with the constructor arguments in launch.json. This is the final code: run 8.5's code (your launch #1981, branch testnet8.5 @ af57f6d) plus (1) the two findings of run 8.5's launch audit, fixed: the share bands compare the exact share (CabalGate._shareBps rounds up), and launch.json's seat-NFT word is in EIP-55 form; (2) fees 2.25%: the owner's share is 1% (PleaHook.OWNER_BPS 100), and the Letterbox's 95% delivery floor counts the hook's 2.25% sale fees (HOOK_SALE_FEE_BPS 225, a new Letterbox hash); (3) the wall's placement guard rises at most 700 ticks a day (WALL_GUARD_TICKS_PER_DAY, was 400); (4) imdTEST (0x56bcf2a5f47710649a4091219ef0b56e2d1b58bf) is both the pool currency and the oracle fee asset, because your Sepolia Intake sells oracle questions only in imdTEST since 2026-10-18 (the earlier open-mint test IMD is priced at 0 there). So the mint flag is 0: the Letterbox buys the 0.5 oracle fee and the 0.25 tip with the writer's PLEA, and a hand plea, an appeal and an objection pay the fee in imdTEST. imd/acc's Sepolia Stacker stakes the earlier test IMD, so its credit reverts and the hook pays the 0.5% cashback in plain imdTEST, its documented fallback. While the shared PoolManager holds less imdTEST than a buy's payouts, the payouts are ERC-6909 claims; the agreed 2 imdTEST opening buy's payouts join the pool (PAYOUT_RESERVE). Unchanged from run 8.5: letters plead 20% and the fact score is 0-45: share of the balance sold at most 20%: 16, at most 35%: 9, more: 3; held 7 days: 7, 3 days: 4, 1 day: 2; at a loss: 13, gain at most 50%: 12, 200%: 10, 500%: 8, 1,000%: 6, more: 4; PLEA no buy record covers: held since trading opened, at profit 10; 24h trend up: 9, flat: 5, down: 0; need = 71 - fact (CannotPass above 45); every fix of your audit rounds 5 to 8 (audit/FINDINGS.md); Objection! (src/Tribunal.sol, spec OBJECTIONS.md, deployed after the launch through PleaLaunch.deployTribunal against the hash committed as its 13th argument): for 20 minutes after an approval anyone except the seller and the wallets Seasons excludes may object (the 0.5 oracle fee and a 0.35 stake, both in imdTEST); sustained when newScore + 2 < need (no points, stake back), otherwise overruled (stake to the plea's season pot); no answer within 20 minutes voids it (stake back); the recorded score is the lowest any panel gave; at most two objections per plea, from different wallets; the 1.2 seat multiplier (Seasons' fourth argument, the IMD NFT (test) 0xa0443799c320e16c80801c9c1911f3571260287f), cap decay 15 days, the 82/6/12 split, six bonus seasons of 10,000,000 PLEA, top 25 from 450 to 350 bps. Build: a bare forge build compiles src, script and the launch-manifest suites in test/ (about 1 GB, under two minutes); a new test file goes in test/ and joins that build. The suite (852 tests in 91 suites) lives in test/full/ and the forks in test/fork/, both skipped by the default profile: run them with FOUNDRY_PROFILE=full forge test --match-path 'test/full/{A,B}.t.sol' a few files at a time (the forks skip without their RPC URL variables; test/fork/ForkTestnet.t.sol rehearses this run against your live Sepolia Intake with imdTEST); never FOUNDRY_PROFILE=full forge build of the whole tree (several GB of memory, over a 10-minute limit); test/LaunchManifest.t.sol ties launch.json to both committed code hashes and asserts the launch fits the 16,777,216-gas cap with your factory's 22% headroom (13,490,541 as charged, 16,458,460 with headroom, 318,756 under). Audit the imported code and deploy it unchanged; fix only what the audit proves is a real bug, and keep every number as it is (timings, panel 30, quorum 17, 5-hour seasons, 33-hour dead-man, START 1792594800, credit gas 1300000, fees 2.25%, letters 20%, the fact table above, plea 1% to 50% or 2.5M, 0.70 IMD minimum plea value, 95% sale minimum, fee cap +10%, objection window 20 minutes, stake 0.35 IMD, margin 2, two objections per plea). If you change the Letterbox or the Tribunal, update its code hash in launch.json. Runtime sizes: PleaHook 24,402 bytes (174 under the EIP-170 limit), CabalGate 24,018, Letterbox 23,255, Tribunal 21,654, Seasons 12,473: keep any fix within them. Keep PLEA.setLauncher accepting either the deploy-transaction flag or PLEA's deployment block, and keep foundry.toml as it is, including the default profile's skip list, [lint] lint_on_build = false and the read-only fs_permissions for ./out and ./launch.json.","baseCommit":"241c05e8428c2b90a28198c8a0d7e14a3a4aa8ae","workflowId":null,"deliveredAt":"2026-10-19T14:38:03.842+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p/pull/1"},{"site":{"cid":"bafybeiclgwccztv3fcm6u2qicqeko5s3vozm4aoel3fft7w46o3stlq7pi","status":"named","ensName":"plea-test-run-9.site.identitymd.eth"},"jobId":"3c7d2414-424b-4ffc-91ca-efe58fbdae36","state":"completed","commit":"520d73445bdf70ae8c968a45fc8fc8de77fc98c9","repoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p","createdAt":"2026-10-20T10:27:51.181334+00:00","objective":"Build the PLEA website for this project's Sepolia test run 9 (launch #2234): a static Vite + React + TypeScript + viem site, hash routing, relative base. Change no contracts. The README and ABIs in this repository are the source of truth; read every value (fees, windows, caps, season length, token symbol) from chain.\n\nCONTRACTS (Sepolia, chain 11155111; events from block 11948819): PLEA 0xb9efaa7b64232d31db23ee6902972a58f492ee8b, CabalGate 0x78c77e3ddbc5a45daca98cafa2b2896da3104e4a, Seasons 0x8dd85a978dbd7b2cff9247c7e3ad49cf8920f0c6, PleaDistributor 0x2fdf098680cb4b515a8e43f09b3bec5493656a46, PleaLaunch 0x3621606cddc23e69d1115126522b53fbf788761e, Letterbox 0xbc335Ae3DC12D4bF78f8E44A03f4fC62e3afd1d3, Tribunal 0xCD6AAc81882A6Ae51041E8094bCa0feaBd3fC566, PleaHook 0x07B4698506cF15b9a91805Aa90010a47a04228cC. PLEA trades against imdTEST 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF (18 decimals, also the oracle fee token): label amounts with its symbol. Trades go through PoolSwapTest 0x9b6b46e2c869aa39918db7f52f5557fe577b6eee (approve it first) on the PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543. History: the contracts' events from public Sepolia RPCs, at most 10,000 blocks per request, with fallback; oracle requests from api.imdnotdead.fun.\n\nDESIGN SYSTEM (exact): github.com/khaed1/claude at commit 91b34fe4b8e5, folder plea/site-design/. Use tokens.css and components.css as they are. components.html is the markup of every component in every state; pages/*.html are the mockups of every page (layout, copy, components); the dashed \"Design reference · other states\" band at the bottom of each mockup lists that page's other states: build them all, but it is not site content. PAGE-KIT.md holds the rules. sample-data.json is mockup data only. No other colours, fonts or effects. Never IMD's diamond logo; the footer says the site is not an official IMD page.\n\nTEST RUN: the status strip starts \"Sepolia test run 9 · test tokens, no value\". Where a mockup says Ethereum or etherscan.io, use Sepolia and sepolia.etherscan.io; \"[after launch]\" becomes the addresses above. Letters: drop the Etherscan message-page card (Sepolia has none); keep the wallet's raw data and Write Contract letter(text). Until PleaHook.seeded is true, Buy, Plead and Letters say trading is not open yet, with a countdown to PleaLaunch.START (anyone may seed from then). While PleaDistributor's merkleRoot is zero, Claim shows its empty state.\n\nPAGES (exactly as in pages/*.html): Home and how it works; Buy; Plead (the \"Sell automatically if approved\" box is on by default; the mockup shows it off because its sample plea was sold by hand); a plea's status page at #/p/<id>; Letters (the Etherscan how-to); Objections; Seasons (the leaderboard with the seat multiplier); the Wall; Claim (with delegate.xyz); Profile; the X share card per plea.\n\nMUST HAVE:\n- A colour per verdict state with the state in words on the stamp: APPROVED, DENIED, PENDING (striped, with its countdown), NO VERDICT, LAPSED (dashed), SOLD, OVERTURNED, UPHELD, OBJECTION, SUSTAINED, OVERRULED. Under it \"N vs need N\" (or the time left), never an amount; an objection is a second small stamp. The stamp lands once when a verdict arrives live; nothing else animates; honour reduced motion.\n- Every text box (plea, appeal, objection, letter, name) uses text-check.js: a live UTF-8 byte counter \"193 / 280 bytes\" and the contract's checks, with submit disabled until they pass. Plea text is always rendered as text, never HTML.\n- Auto-sell box: checked sends Letterbox.plead(amount, text) / appealAuto(originalId, text) (escrow, fees paid in PLEA: the 0.50 oracle fee + the 0.25 tip for whoever delivers it within 7 minutes; 0.35 of a delivered sale to the season prize pot); unchecked is the manual flow (approve the 0.50 fee, submitSell, then executeSell(minOut) inside 7 minutes). Show both cost breakdowns.\n- Before paying, show the fact score and need = 71 - fact; above 45, disable submit and say the plea cannot pass (CannotPass). Show cooldowns.\n- Seasons: points with Seasons.pointsFor / holdsSeat (x1.2 rounded down for seat holders), shares from Seasons.shareBps, the 10,000,000 PLEA bonus in the first six seasons, points \"held\" until the objection window ends, then a Record my points button (nothing records them by itself), close season after CLOSE_GRACE.\n- Claim: PleaDistributor.claim(index, account, amount, proof) for any typed address from the claims.json file, with isClaimed; delegate.xyz v2 (0x00000000000000447e69651d841bD8D104Bed493): list getIncomingDelegations(connected) and claim for each vault; the PLEA lands on the vault.\n- Profile: Letterbox.setName / nameOf, \"This is your current name\" for the wallet's own name; the wallet's ERC-6909 imdTEST claims on the PoolManager (the opening buys may pay that way).\n- Share card: a 1200 x 675 PNG per plea, in every state, drawn in the browser from the share-card component; \"Share on X\" (twitter.com/intent/tweet with text and the #/p/<id> link), \"Download image\", \"Copy image\".\n- After the Cabal dies (CabalGate.DEADMAN without a verdict): the banner on every page, Plead and Objections closed, Sell on Buy.\n- Cashback earned = the hook's CashbackStacked + CashbackPaidPlain + CashbackPaidClaims events for the wallet. Every buy passes abi.encode(buyer) as hookData. Every write sends an explicit gas limit (estimate x 1.3). Decode the contracts' custom errors into the plain words the mockups use.\n\nWALLET: one Connect button top right on every page; everything reads without a wallet; actions say \"Connect in the top bar to ...\". Switch to Sepolia when needed. Per-button states: wallet, busy, done with a sepolia.etherscan.io link, error with the fix (toasts as in components.html).\n\nBUILD: bundle Archivo (variable, wdth 62-125) and IBM Plex Mono 400/500/600 as woff2 files in the build, no font CDN (SIL OFL), and Phosphor Bold icons (MIT). Light theme by default, dark via the toggle, stored in localStorage \"plea-theme\" and set before first paint.\n\nQA before you finish: WCAG 2.1 AA (body text 4.5:1, large 3:1, keyboard focus always visible, targets 44 px, colour never the only signal); every page and every state at 320, 360, 768 and 1280 px, light and dark, in a real browser against the live contracts: no horizontal scroll, no console errors, no axe violations (tools/check.mjs in the design folder does this for a page); compare each with its mockup and fix the differences, then one more round. Refuse: gradients other than the pending stripes, blur, glass, glows, soft shadows, new colours, emoji as icons, modals where a page works, placeholder text.","baseCommit":"9f58da6e57221261c71630fbe9d342e87395de1c","workflowId":null,"deliveredAt":"2026-10-20T12:02:21.173+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p/pull/2"},{"site":{"cid":"bafybeige3rob4xgxdblygfxsr6cepuletb46dl6fc34o4jwlmalcc67soa","status":"named","ensName":"plea-test-run-9.site.identitymd.eth"},"jobId":"fd8cb957-afe1-4d5c-a3c7-e745a0d99eac","state":"completed","commit":"cc333046bbf3831a7c1e5b8209828d4ea03c659a","repoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p","createdAt":"2026-10-20T20:44:03.508562+00:00","objective":"Fix the PLEA Sepolia test run 9 site (web/ in this repository, from your previous job at commit 520d734) as listed in one review file: github.com/khaed1/claude at commit 3eb565e0e4f39d1926250c6eadb2f7dbf235f852, plea/site-design/run9-site-review.md. Change no contracts.\n\nThe file has 73 fix items for 158 problems our testers found and a second reviewer confirmed, on forks of Sepolia and in a real browser. Each item says Now (route, state, web/src file:line), Should (the brief, a mockup or a contract) and Fix. Do them all: P1 first (19 items across sections T, C, S, X), then P2, then P3. Keep everything under \"What works (keep it)\" working. The brief (plea/site-design/brief-site-job-run9.md at the same commit) and the design system (plea/site-design/ at commit 91b34fe4b8e5: tokens.css, components.css, components.html, PAGE-KIT.md, pages/*.html with their \"Design reference · other states\" bands) still apply.\n\nThe P1 items in short:\n- T1: the first buy after the seed gets no quote (float tick math in swap-math.ts), so Approve and Buy stay disabled for everyone. Port TickMath.getSqrtPriceAtTick exactly in bigint; never gate the approval on the quote.\n- T2: the seed control only for PLEA.owner(), with plain words, then the opening buy (Decision D1).\n- T3: partial fills. Price limit from the post-trade price, simulate before sending, report the real fill.\n- T4: decode hook errors the PoolManager wraps (WrappedError) and map every custom error in the ABIs to plain words; check the launch cap before the approval.\n- T5: fee rows with per-trade amounts, the launch-window fee, no prize share after the death.\n- T6: after the death, Buy/Sell shows the dead-state rules.\n- C1: a lapsed approval or an expired unanswered plea must not lock the seller out of Plead (CabalGate._clearStale); remove the \"Mark plea lapsed\" call to expire, which always reverts.\n- C2: Sell now's default minimum from the live price, not the hourly checkpoint.\n- C3: the auto-sell Plead checks the Letterbox's 0.70 floor and 10% fee rule before sending.\n- C4: the automatic appeal's amount counts the escrow the Letterbox returns first.\n- C5: no appeal box where no appeal is possible; the sale panel per state as in plea.html.\n- C6: the meter follows the verdict. C7: a sold appeal is stamped OVERTURNED. C8: a VOID objection has no score; OVERRULED shows its points.\n- S1: one season model (running, ended but not closed, dead) with each season's own pot (seasonFees, plus the rollover for the season that receives it). S2: the Seasons page as in seasons.html.\n- X1: RPC timeouts and fallback (a hung first RPC leaves the site blank for minutes; the third RPC cannot serve it). X2: polling volume (about 260 eth_calls a minute on an idle page today). X3: the need marker overflows the page.\n\nDecisions: D1 above. D2: remove the \"Fund the buy wall\" donation control and its PleaHook approval; keep Rebalance as a small public action with one plain sentence. D3: remove the Coinbase Wallet SDK connector (telemetry and a cookie on every page load); EIP-6963 and injected wallets stay.\n\nQA before you finish: check every fix on a local fork of Sepolia (seed, buys, pleas with signed verdicts by setting the gate's and the Tribunal's oracle signer to a test key with anvil_setStorageAt on the fork only, appeals, objections, and time warps for the windows, the seasons and the death) in a real browser at 320, 360, 768 and 1280 px, light and dark, with and without a wallet; then the read-only parts against the live Sepolia contracts. No horizontal scroll, no console errors, no axe violations. Add unit tests for the tick math, the season pots and the appeal amount. Add FIXES.md listing each item ref, what you changed and how you checked it.","baseCommit":"520d73445bdf70ae8c968a45fc8fc8de77fc98c9","workflowId":null,"deliveredAt":"2026-10-20T23:23:02.021+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p/pull/3"},{"site":{"cid":"bafybeiajlmgiyqfjb6z54gs4ksbwx2zllo3aeteo3ga3ayulsw6qrh7jl4","status":"named","ensName":"plea-test-run-9.site.identitymd.eth"},"jobId":"cd805c00-3263-495a-a3cf-7659cff67e41","state":"completed","commit":"b214b529673ac46ec8adbb0766086403971efc34","repoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p","createdAt":"2026-10-21T05:57:14.944568+00:00","objective":"Fix the PLEA Sepolia test run 9 site (web/ in this repository, from your previous job at commit cc33304) as listed in one review file: github.com/khaed1/claude at commit 228e355be9e9a8a460c35d3af1465b96adeafef5, plea/site-design/run9-site-review-2.md. Change no contracts.\n\nWe re-tested your previous job item by item (a checker and a skeptic per area, on forks of Sepolia and in a real browser): 43 of the 73 round-1 items are fixed, 30 are partly fixed, and the re-test found 56 new issues and 2 regressions. The round-2 file merges what is still to do into 45 items. Each says Now (route, state, web/src file:line at cc33304), Should (the round-1 item, the brief, a mockup or a contract) and Fix. Do them all: P1 first (12 items across sections T, C, S, X), then P2, then P3. Keep every round-1 item listed under \"Fixed in round 1 (keep it)\" fixed, and the round-1 \"What works\" list working. Where an item continues a round-1 item, the round-1 file (plea/site-design/run9-site-review.md at the same commit) still applies to it. The brief (plea/site-design/brief-site-job-run9.md) and the design system (plea/site-design/ at commit 91b34fe4b8e5) still apply, and so do decisions D1 (the seed control only for PLEA.owner()), D2 (no \"Fund the buy wall\"; Rebalance small) and D3 (no Coinbase Wallet SDK).\n\nThe P1 items in short:\n- X1: RPC transport. One JSON-RPC error or a short outage benches every endpoint for 60 seconds (viem's error text contains \"https://\", so the HTTP test never matches) and Try again does nothing; sentio's 1,000-block getLogs limit (an HTTP 429 with a JSON body) is never detected, so it cannot serve history; a head lag shrinks the log chunk to one block for the session.\n- X2: the Home hero shows a denied or pending plea with a sale and points.\n- T1: swap errors. A mined revert (PriceLimitAlreadyExceeded) shows only \"The transaction reverted.\"; the launch-cap error is not on the field; messages carry no values.\n- T2: the costs block misses two rows and its parts and sums do not add up. T3: a sell after the death counts the cashback twice.\n- C1: Plead's open-plea notice gives a stale \"if it lapses\" time. C2: the sale panel's objection, SUSTAINED, OVERTURNED and UPHELD blocks are missing, and a sustained plea is told its points count. C3: voided objections are counted and closed cases read as open.\n- S1: only one waiting season is shown, the rollover note names the wrong season, the seat panel renders twice. S2: seat holders' judges' scores print \"?\". S3: after the death, leftovers are said to roll over to a season that never comes. S4: Wall cards from \"Load older pleas\" never refresh.\n\nQA before you finish: check every fix on a local fork of Sepolia (seed, buys, pleas with signed verdicts by setting the gate's and the Tribunal's oracle signer to a test key with anvil_setStorageAt on the fork only, appeals, objections, two seasons waiting at once, and time warps for the windows, the seasons and the death) in a real browser at 320, 360, 768 and 1280 px, light and dark, with and without a wallet; RPC faults in the browser (the first two endpoints hanging or failing, sentio's 1,000-block limit, a 15-second outage of all three, then Try again); then the read-only parts against the live Sepolia contracts. No horizontal scroll, no console errors, no axe violations. Add unit tests for the RPC error classification and the season states. Update FIXES.md with each round-2 item ref, what you changed and how you checked it.","baseCommit":"cc333046bbf3831a7c1e5b8209828d4ea03c659a","workflowId":null,"deliveredAt":"2026-10-21T07:50:51.23+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p/pull/4"}],"contracts":[{"id":"544c0ace-4f80-4067-ac5f-9b7c590669c0","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":11155111,"artifacts":[{"name":"CabalGate","role":"other","txHash":"0xdcaabab34b79b3aa49bf30261516e02eee09a0fd15b85b5372d7445e3e375541","address":"0x78c77e3ddbc5a45daca98cafa2b2896da3104e4a"},{"name":"PLEA","role":"other","txHash":"0xdcaabab34b79b3aa49bf30261516e02eee09a0fd15b85b5372d7445e3e375541","address":"0xb9efaa7b64232d31db23ee6902972a58f492ee8b"},{"name":"PleaDistributor","role":"other","txHash":"0xdcaabab34b79b3aa49bf30261516e02eee09a0fd15b85b5372d7445e3e375541","address":"0x2fdf098680cb4b515a8e43f09b3bec5493656a46"},{"name":"PleaLaunch","role":"other","txHash":"0xdcaabab34b79b3aa49bf30261516e02eee09a0fd15b85b5372d7445e3e375541","address":"0x3621606cddc23e69d1115126522b53fbf788761e"},{"name":"Seasons","role":"other","txHash":"0xdcaabab34b79b3aa49bf30261516e02eee09a0fd15b85b5372d7445e3e375541","address":"0x8dd85a978dbd7b2cff9247c7e3ad49cf8920f0c6"}],"createdAt":"2026-10-19T14:38:03.842+00:00","updatedAt":"2026-10-19T14:39:51.497+00:00","launchNumber":2234,"parkedReason":null,"sourceCommit":"9f58da6e57221261c71630fbe9d342e87395de1c","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p"}],"publishedAt":"2026-10-21T07:51:04.71+00:00"},{"id":"job:ad6fc8d6-e85b-4015-998f-e3dc092398ad","code":[],"media":[],"sites":[],"title":"Audit the Tombola draw contracts in this repository: src/TombolaDraw.sol and src/TombolaSplitter.sol are the new code and the focus; src/DrandBeacon.sol (drand evmnet BLS verification on BN254, via the vendored randa-mu library under vendor/bls-solidity) is reused from an earlier, already reviewed design and is in scope only as the dependency the draw relies on. Solidity 0.8.26, via_ir, cancun. README.md and DESIGN.md describe the system; test/TombolaDraw.t.sol has 19 passing tests including a real evmnet round from test/fixtures/evmnet.json.\n\nSystem. Tombola is a lottery token launched on Pons V2 (Robinhood Chain). Pons charges a creator tax on every trade and accrues it in ETH in its fee escrow for the creatorFeeRecipient, which is TombolaSplitter. Anyone calls TombolaSplitter.harvest(): it claims the escrow and splits the ETH 7333 / 2000 / 667 bps between TombolaDraw.fundRegular(), TombolaDraw.fundMega() and a plain send to the team fee wallet (rounding dust to the team). TombolaDraw holds the two pots and the draw ledger. A keeper (hot wallet, immutable address) calls commit(track, snapshotTime, drandRound, amount): it reserves amount from the track's pot and commits to a FUTURE drand round (beacon.roundTime(round) >= snapshotTime + 10 minutes, round not yet proven on chain, snapshotTime <= block.timestamp, one open draw per track). Off chain the keeper rebuilds the eligibility list from the token's Transfer logs at the snapshot block (weightFor: balance >= 10,000e18, held 30 minutes, 1x to 3x over 72 h), publishes it, and calls settle(id, drandSignature, root, totalWeight, winner, cumulativeBefore, weight, proof): the beacon verifies the BLS signature and stores keccak256(signature); randomWord = keccak256(abi.encode(randomness, id)); the leaf keccak256(bytes.concat(keccak256(abi.encode(winner, cumulativeBefore, weight)))) must verify against root (sorted-pair Merkle); weight > 0 and cumulativeBefore + weight <= totalWeight; randomWord % totalWeight must fall in [cumulativeBefore, cumulativeBefore + weight). The prize is sent with a 50,000 gas stipend; a failed send is credited to unclaimed[winner] and claim(to) pays it later. rollover(id, signature, root) returns the prize to the pot when nobody was eligible. A guardian (cold wallet) may cancel(id) a committed, unsettled draw; after 7 days past the round's time anyone may. solvent() states the invariant balance >= potRegular + potMega + reserved + unclaimedTotal.\n\nTrust model, so findings are ranked against it. The contracts are meant to enforce: (1) the drand round was committed before anyone could know it; (2) the randomness is drand's and the winner index is randomWord mod totalWeight over the pinned list; (3) the winner is in the pinned list with the claimed weight and the index falls in its range; (4) ETH only leaves as a settled prize to the proven winner, the team's share from the splitter, or back into a pot on rollover/cancel. The keeper IS trusted to build an honest, complete list with honest weights: that is verified off chain from public data, not by the contract, and is NOT a finding. The keeper choosing when to commit (and so which future round) is accepted. No owner, no upgrade, no withdraw exists by design.\n\nPlease focus on: (a) pot solvency and accounting: potRegular / potMega / reserved / unclaimedTotal across commit, settle, rollover, cancel, claim, fundRegular/fundMega/receive, including uint128 amount truncation in commit and any path that breaks solvent(); (b) the commit-before-randomness guarantee: can the keeper or anyone commit to a round whose signature is already public or predictable (COMMIT_DELAY vs drand's 3 s period and clock skew, roundTime arithmetic, the randomness(round) != 0 check, snapshotTime far in the past), and whether settle/rollover could use a different round than committed; (c) the Merkle leaf and winner-range checks: leaf encoding collisions, a proof for a leaf that is not a leaf (intermediate node, duplicated last leaf padding), root == 0, totalWeight inconsistent with the tree, overlapping or gapped cumulative ranges letting the keeper pick between two winners, weight == 0 leaves; (d) re-entrancy and ordering: nonReentrant on settle/rollover/cancel/claim, _pay before/after state, the 50,000 gas stipend and return bomb, the splitter's harvest re-entering through the escrow or the team wallet, the draw's receive() being called by the splitter during harvest; (e) the guardian / cancel / abandon paths: can the guardian or the 7-day anyone-cancel be used to grief a settled or settlable draw, re-cancel, double-return, or lock a track (activeDraw) permanently; what happens with guardian == address(0); (f) griefing: dust amounts, failed sends to the team wallet reverting harvest, a winner contract that reverts, claim(to) by third parties, pots stuck forever, a keeper that never settles; (g) anything that lets the keeper, the guardian, the splitter, the team wallet or any third party take ETH that is not a settled prize or the team's bps share, or move ETH between pots. Also note any mismatch between what the README/DESIGN claim the contract enforces and what the code enforces.\n\nFor each finding give the location, the concrete sequence of calls, and the impact in ETH terms; a Foundry reproduction against test/TombolaDraw.t.sol's setUp is welcome. Please classify what is informational (accepted trust in the keeper) separately from what is exploitable.\n\nDeployed on Robinhood Chain (4663) from this commit: TombolaDraw 0xa6fb19FD8ea1d9463f942e7B04b8ED2f1A715637, TombolaSplitter 0xF7dec43e3c3626A4F3A83b568896b6AdAb5343e2.\n\nThis is a re-audit: job 42b4b3b5-4c53-4368-aa49-ffdd71222d33 audited commit 705e9d2 and reported 1 High (totalWeight unbound at settle), 3 Medium (far-future round, stale snapshot, rollover/cancel veto), 3 Low (1-second lead, contracts as winner, locked credits) and 3 Info (keeper trust, dead keeper, docs). Every one was addressed in this commit (see the commit message and README). Please confirm each is closed and look for anything the changes introduced, in particular around the list now being pinned at commit (root, totalWeight, EMPTY_ROOT), the cancel windows, setKeeper, redirectCredit and expireCredit.","types":["audits"],"audits":[{"jobId":"ad6fc8d6-e85b-4015-998f-e3dc092398ad","repoUrl":"https://github.com/JJ-ME55/tombola-contracts.git","findings":9,"reportUrl":null,"baseCommit":"bb37d2c6f2db7d46cfc393ab1c622c9be30d75d0","severities":{"low":2,"info":5,"medium":2},"publishedAt":"2026-10-20T20:21:58.288+00:00"}],"paidBy":"0x4c6b36b84f14e3111c732136bb38803e82bbcc46","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-20T20:21:58.288+00:00"},{"id":"launch:00ca1618-b4cd-43f0-9656-9e1d20fb9e9f","code":[],"media":[],"sites":[],"title":"Launch the genesis contracts of moneycanbuy.fun from this repository as they are: an evm_contracts launch on Ethereum mainnet (no token), the first of four. They exist before the project token $YOLO: the token's custom_token launch (the second) takes the YoloSplitter below as its remainderTo and the NftGate below as a constructor argument of the token; the core and the $YOLO modules follow as the third and fourth launches. script/LaunchPlan.sol is all four launches in code (genesisLaunch, then yoloTokenCode and support, then core, then extras).\n\nContracts, in this order:\n1. NftGate, constructorArgs [\"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d\", \"0x3c587Eff6c96eAcF7E3dcC2CFf6416161386E48C\"]\n2. IncentivesVesting, constructorArgs [\"0x7085193516EDc587fAebFF7a48548eAC8db5fAb5\"]\n3. DevVesting, constructorArgs [\"0x8Ad18E99F4C8d8406f9Ba8899CF308000518A981\"]\n4. TeamVesting, constructorArgs [\"0x153D12cc398d79A99B781B23DB6399556b84ca76\"]\n5. TreasuryVesting, constructorArgs [\"0x3c587Eff6c96eAcF7E3dcC2CFf6416161386E48C\"]\n6. YoloSplitter, constructorArgs [\"$contract:IncentivesVesting\", \"$contract:DevVesting\", \"$contract:TeamVesting\", \"$contract:TreasuryVesting\", \"0xaaB0269b956bd5F97B44529569b042e7BD72B508\"]\n\nWhat they do. NftGate is the snapshot of identity.md NFT holders (0x0000ec93127baa929e58e97dd0095a2bfb38ec1d, 2,000 NFTs) for the first 30 minutes of $YOLO trading: the writer 0x3c587Eff6c96eAcF7E3dcC2CFf6416161386E48C (the project wallet) records wallets with the number of NFTs each held at one block, in batches (record(accounts, nfts): each wallet once, no zero address or count, event Recorded per wallet, a running snapshotHash), then seal(snapshotBlock) closes the list for good: after the seal nobody can change it. Every NFT in the snapshot allows its wallet 500,000 YOLO of buys in the window. The gate never reads the NFT contract, so an NFT moved after the snapshot changes nothing. The token calls consume(buyer, amount) on a buy in its window; consume reverts until the seal; the gate books per calling token (any other caller only spends its own books, so the gate needs no token address), books only if it fits, and returns the allowance and what was used before; it never calls back and holds nothing. No owner and no clock: the window is the token's, and the token counts the snapshot only if it was sealed before trading opened.\nIncentivesVesting, DevVesting, TeamVesting and TreasuryVesting are ProjectVesting with their schedules compiled in, none with a cliff, each clock started only by the YoloSplitter, which binds itself as the one starter in this launch's transaction (bindStarter, a transient flag) and starts all four at its split: incentives 62,500,000 at once and the rest linear over 730 days, to 0x7085193516EDc587fAebFF7a48548eAC8db5fAb5 (the project's wallet for incentives it runs itself, off chain); dev linear over 365 days, to 0x8Ad18E99F4C8d8406f9Ba8899CF308000518A981; team linear over 365 days, to 0x153D12cc398d79A99B781B23DB6399556b84ca76; treasury 74,074,074 at once and the rest linear over 365 days, to 0x3c587Eff6c96eAcF7E3dcC2CFf6416161386E48C. They know no token in advance (release(token), like OpenZeppelin's VestingWallet); whatever arrives counts; no owner, no acceleration; anyone may call release, which only pays the beneficiary what the schedule has opened.\nYoloSplitter receives the project's 75% of $YOLO from the factory (the remainderTo of the token launch). The first split(token) once more than 527,777,777 have arrived pays 250,000,000 to IncentivesVesting, 150,000,000 to the manual YOLO Stabilizer wallet 0xaaB0269b956bd5F97B44529569b042e7BD72B508 (at once, no vesting), 77,777,777 to DevVesting, 50,000,000 to TeamVesting, and the rest (222,222,223, give or take the factory's rounding of the pool seed) to TreasuryVesting; the factory sends the remainder within the launch transaction, so it has all arrived before anyone can call; anything arriving later goes to TreasuryVesting on the next call. Right after the first split it calls release on the four vestings, which starts their clocks and pays the at-once parts. Anyone may call it. With the swarm's 10% and the pool's 15% that is the whole supply. No share is airdropped or burned.\n\nConstructors take only addresses; the only external call is the YoloSplitter's bindStarter on the four vestings. Nothing here holds funds until the token launch. No owner, admin, pause or upgrade path in any of the six.\n\nKnown and accepted by design: the snapshot is written by the project wallet from an off-chain read of ownerOf at one block (script/snapshot/snapshot.py; the json, its block and snapshotHash are published before trading opens, anyone can recompute them); a wallet holding NFTs in a contract at that block (a vault, a marketplace escrow) is listed as that contract; the incentives wallet is a plain wallet that no mechanic pays from, the contract only unlocks it on schedule.\n\nThe tests must keep passing: forge test (686 tests), and forge test with FORK_URL set to a mainnet archive RPC: test/fork/LaunchRehearsal.fork.t.sol runs all four launches through the live ProjectFactory (launchContracts, launchCustom, launchContracts, launchContracts), checks each against the 16,777,216 gas cap (this one about 3.6M), splits the remainder and checks every share, and trades the token's opening and first hour through the live Universal Router with a snapshot of real NFT holders, buys with IMD, USDC and ETH routed through IMD.\n\nAudit it as it arrived. Adapt only what the launch rules or a reproduced audit finding require, and record each change in ADAPTATION.md. Do not change the shares, the schedules, the allowance per NFT, the recipients or the constructor arguments, and do not add an owner, a pause, an upgrade path or a fee, unless a reproduced finding requires it; record it in ADAPTATION.md.\nKnown limitations listed in docs are accepted rules, not findings; do not change them.","types":["contracts"],"audits":[],"paidBy":"0x3c587eff6c96eacf7e3dcc2cff6416161386e48c","release":null,"research":[],"versions":[],"contracts":[{"id":"00ca1618-b4cd-43f0-9656-9e1d20fb9e9f","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"DevVesting","role":"other","txHash":"0x225c8deea6ac18ee1919cd5a6d7fe553c75a02d500e6856ad69111d518f8aa79","address":"0x5de71854a756f9a926c5afa369f26de6c8b80aa0"},{"name":"IncentivesVesting","role":"other","txHash":"0x225c8deea6ac18ee1919cd5a6d7fe553c75a02d500e6856ad69111d518f8aa79","address":"0xe3a7f4c2ce67fdef62aeee80e74587d65e924cd2"},{"name":"NftGate","role":"other","txHash":"0x225c8deea6ac18ee1919cd5a6d7fe553c75a02d500e6856ad69111d518f8aa79","address":"0x2fb9e0ca283b0ebf6145e756548df35ab504a52e"},{"name":"TeamVesting","role":"other","txHash":"0x225c8deea6ac18ee1919cd5a6d7fe553c75a02d500e6856ad69111d518f8aa79","address":"0xa56762f02e29cef5d68f6903031da9e90c429578"},{"name":"TreasuryVesting","role":"other","txHash":"0x225c8deea6ac18ee1919cd5a6d7fe553c75a02d500e6856ad69111d518f8aa79","address":"0xbed397385a79e556228c14b7d7ff4a7ee6400aa5"},{"name":"YoloSplitter","role":"other","txHash":"0x225c8deea6ac18ee1919cd5a6d7fe553c75a02d500e6856ad69111d518f8aa79","address":"0x2eee2eaf305bc296340b870290d9db0f35c45b81"}],"createdAt":"2026-10-20T20:15:50.601+00:00","updatedAt":"2026-10-20T20:26:39.101+00:00","launchNumber":2308,"parkedReason":null,"sourceCommit":"9ccf205a1558c988db83ca8bc28a147bd52bd131","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2308-launch-genesis-contracts-moneycanbuy-fun"}],"publishedAt":"2026-10-20T20:15:50.601+00:00"},{"id":"job:42b4b3b5-4c53-4368-aa49-ffdd71222d33","code":[],"media":[],"sites":[],"title":"Audit the Tombola draw contracts in this repository: src/TombolaDraw.sol and src/TombolaSplitter.sol are the new code and the focus; src/DrandBeacon.sol (drand evmnet BLS verification on BN254, via the vendored randa-mu library under vendor/bls-solidity) is reused from an earlier, already reviewed design and is in scope only as the dependency the draw relies on. Solidity 0.8.26, via_ir, cancun. README.md and DESIGN.md describe the system; test/TombolaDraw.t.sol has 19 passing tests including a real evmnet round from test/fixtures/evmnet.json.\n\nSystem. Tombola is a lottery token launched on Pons V2 (Robinhood Chain). Pons charges a creator tax on every trade and accrues it in ETH in its fee escrow for the creatorFeeRecipient, which is TombolaSplitter. Anyone calls TombolaSplitter.harvest(): it claims the escrow and splits the ETH 7333 / 2000 / 667 bps between TombolaDraw.fundRegular(), TombolaDraw.fundMega() and a plain send to the team fee wallet (rounding dust to the team). TombolaDraw holds the two pots and the draw ledger. A keeper (hot wallet, immutable address) calls commit(track, snapshotTime, drandRound, amount): it reserves amount from the track's pot and commits to a FUTURE drand round (beacon.roundTime(round) >= snapshotTime + 10 minutes, round not yet proven on chain, snapshotTime <= block.timestamp, one open draw per track). Off chain the keeper rebuilds the eligibility list from the token's Transfer logs at the snapshot block (weightFor: balance >= 10,000e18, held 30 minutes, 1x to 3x over 72 h), publishes it, and calls settle(id, drandSignature, root, totalWeight, winner, cumulativeBefore, weight, proof): the beacon verifies the BLS signature and stores keccak256(signature); randomWord = keccak256(abi.encode(randomness, id)); the leaf keccak256(bytes.concat(keccak256(abi.encode(winner, cumulativeBefore, weight)))) must verify against root (sorted-pair Merkle); weight > 0 and cumulativeBefore + weight <= totalWeight; randomWord % totalWeight must fall in [cumulativeBefore, cumulativeBefore + weight). The prize is sent with a 50,000 gas stipend; a failed send is credited to unclaimed[winner] and claim(to) pays it later. rollover(id, signature, root) returns the prize to the pot when nobody was eligible. A guardian (cold wallet) may cancel(id) a committed, unsettled draw; after 7 days past the round's time anyone may. solvent() states the invariant balance >= potRegular + potMega + reserved + unclaimedTotal.\n\nTrust model, so findings are ranked against it. The contracts are meant to enforce: (1) the drand round was committed before anyone could know it; (2) the randomness is drand's and the winner index is randomWord mod totalWeight over the pinned list; (3) the winner is in the pinned list with the claimed weight and the index falls in its range; (4) ETH only leaves as a settled prize to the proven winner, the team's share from the splitter, or back into a pot on rollover/cancel. The keeper IS trusted to build an honest, complete list with honest weights: that is verified off chain from public data, not by the contract, and is NOT a finding. The keeper choosing when to commit (and so which future round) is accepted. No owner, no upgrade, no withdraw exists by design.\n\nPlease focus on: (a) pot solvency and accounting: potRegular / potMega / reserved / unclaimedTotal across commit, settle, rollover, cancel, claim, fundRegular/fundMega/receive, including uint128 amount truncation in commit and any path that breaks solvent(); (b) the commit-before-randomness guarantee: can the keeper or anyone commit to a round whose signature is already public or predictable (COMMIT_DELAY vs drand's 3 s period and clock skew, roundTime arithmetic, the randomness(round) != 0 check, snapshotTime far in the past), and whether settle/rollover could use a different round than committed; (c) the Merkle leaf and winner-range checks: leaf encoding collisions, a proof for a leaf that is not a leaf (intermediate node, duplicated last leaf padding), root == 0, totalWeight inconsistent with the tree, overlapping or gapped cumulative ranges letting the keeper pick between two winners, weight == 0 leaves; (d) re-entrancy and ordering: nonReentrant on settle/rollover/cancel/claim, _pay before/after state, the 50,000 gas stipend and return bomb, the splitter's harvest re-entering through the escrow or the team wallet, the draw's receive() being called by the splitter during harvest; (e) the guardian / cancel / abandon paths: can the guardian or the 7-day anyone-cancel be used to grief a settled or settlable draw, re-cancel, double-return, or lock a track (activeDraw) permanently; what happens with guardian == address(0); (f) griefing: dust amounts, failed sends to the team wallet reverting harvest, a winner contract that reverts, claim(to) by third parties, pots stuck forever, a keeper that never settles; (g) anything that lets the keeper, the guardian, the splitter, the team wallet or any third party take ETH that is not a settled prize or the team's bps share, or move ETH between pots. Also note any mismatch between what the README/DESIGN claim the contract enforces and what the code enforces.\n\nFor each finding give the location, the concrete sequence of calls, and the impact in ETH terms; a Foundry reproduction against test/TombolaDraw.t.sol's setUp is welcome. Please classify what is informational (accepted trust in the keeper) separately from what is exploitable.\n\nDeployed on Robinhood Chain (4663) from this commit: TombolaDraw 0xC24C89e8Eb078902e5f527A5402631b4c12D237A, TombolaSplitter 0x3A065C0ac5477B556573f454f83EE2aE4184281f.","types":["audits"],"audits":[{"jobId":"42b4b3b5-4c53-4368-aa49-ffdd71222d33","repoUrl":"https://github.com/JJ-ME55/tombola-contracts.git","findings":10,"reportUrl":null,"baseCommit":"705e9d24ec33259d452f0fe4dbe5d8cf3392253f","severities":{"low":3,"high":1,"info":3,"medium":3},"publishedAt":"2026-10-20T19:31:44.606+00:00"}],"paidBy":"0x4c6b36b84f14e3111c732136bb38803e82bbcc46","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-20T19:31:44.606+00:00"},{"id":"launch:0537b7d1-e1e1-415b-9e4c-d3bd581f4e60","code":[],"media":[],"sites":[],"title":"Build and deploy NightshiftVault, one contract for NIGHTSHIFT players (web and Telegram Mini App): game balances with personal deposit addresses, staked games without a signature per game, a shop for in-game items, and weekly leaderboard prizes. Player money stays here and can only go into games the player starts or back to the player's own wallet.\n\nAssets: native ETH (address(0)), IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, SHIFT 0xe5e58e53d0bb204aa62c995a6c8cc8a48e60c3ac (ERC-20, 18 decimals, no transfer fee). Every function works for all three; ETH by call with a checked result.\n\nAccounts: bytes32 accountId with an owner wallet. register(accountId, owner, deadline, ownerSig, operatorSig): EIP-712 Register(bytes32 accountId,address owner,uint256 deadline) signed by both the owner and the operator. Only the owner changes the owner (with the new owner's signature). Events Registered, OwnerSet.\n\nDeposits: depositAddress(accountId) is a CREATE2 forwarder (salt accountId) taking ETH and tokens from any wallet or exchange. sweep(accountId, asset), callable by anyone, deploys it if needed and credits its whole balance to the account; it can only send here for its own account. Also payable depositETH(accountId) and deposit(accountId, token, amount). Event Deposited.\n\nWithdraw: withdraw(accountId, asset, amount) only by the owner, only to the owner, works while paused or frozen.\n\nGames (an internal escrow with the rules of NIGHTSHIFT's GameEscrow 0xf460fd9ad76f18414f54a2431870e8a116193489): the operator calls lockGame(gameId, accountA, accountB, asset, stake, expiresAt) at the players' request: both stakes move from available to locked; gameId new; accounts and owners distinct. settle(gameId, result, deadline, sig) with EIP-712 Result(bytes32 gameId,uint8 result,uint256 deadline) from the result signer: 0 A won, 1 B won, 2 draw or void. The winner gets 95% of the pot as available balance, 5% goes to the fee splitter 0x1119d5df2f046bc2d3c0f6279ef2e9ce49422d44 (it takes ETH and tokens); draw or void refunds both, no fee. refundGame by anyone 24 h after expiresAt.\n\nCaps against a compromised operator: per account and asset a rolling 24 h stake cap (default 0.05 ETH, 100 IMD, 2500000 SHIFT) and a per-game max; lockGame reverts above them. The owner lowers caps or freezes instantly; raising caps or unfreezing takes 24 h. Events CapsSet, Frozen.\n\nShop: buy(accountId, itemId, asset, amount) from the account's balance, signed by the owner or by the operator within the same daily cap; or payable/transferFrom buyDirect(accountId, itemId, asset, amount) by anyone. Event Purchased(accountId, itemId, asset, amount). Every purchase splits at once: IMD half to IMD's BurnExecutor 0xe29386719c155b6847ad5a4e97c6674f10ffc750, half to the prize pot; SHIFT half to 0x000000000000000000000000000000000000dEaD, half to the pot; ETH half to an ETH burn reserve, half to the pot. burnReserve(amountIn, minShiftOut), by the keeper only: buys SHIFT with that ETH on the Uniswap v4 SHIFT/ETH pool (key: currency0 ETH, currency1 SHIFT, fee 12500, tickSpacing 60, hooks 0x42ebcf86e3ab0445ba0362f911a7e8fad6ace0cc) and sends it all to 0x…dEaD in the same call, requiring minShiftOut. Events Burned.\n\nWeekly prizes: the pot is tracked per asset. postPrizes(epoch, root, asset, total) by the operator reserves total from that asset's pot (never more than it holds), once per epoch and asset. claimPrize(epoch, accountId, asset, amount, proof) credits the account's available balance; OpenZeppelin StandardMerkleTree leaf keccak256(bytes.concat(keccak256(abi.encode(epoch, accountId, asset, amount)))); once per leaf; unclaimed after 30 days returns to the pot with expirePrizes. Events PrizesPosted, PrizeClaimed.\n\nRoles: operator, result signer and keeper are set by the contract owner 0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5 (initially 0x3b5919586fc04f7e99b450a72bcb14eeb6977497 for all three); each change takes effect after 48 h. The contract owner may pause new games, deposits and purchases; nothing else. Nobody can move, take or redirect a player balance, the pot or the burn reserve except by the rules above, or change the split, the fee, the recipients or the assets. No upgradeability, delegatecall, selfdestruct or sweeping. Reentrancy guard, checks-effects-interactions, SafeERC20, Solidity 0.8.x, NatSpec, events everywhere. EIP-712 domain \"NightshiftVault\", version \"1\".\n\nViews: accountOf, balanceOf(accountId, asset) available and locked, depositAddress, games, pot(asset), burnReserve, epochs.\n\nFoundry tests for ETH, IMD and SHIFT: registration needs both signatures; transfer then sweep; withdraw only to the owner, paused and frozen; caps, delays and freeze; settle A, B, draw, wrong signer, expired, double; refund; 5% fee; every purchase split exactly half and half; burnReserve with a mocked pool and minShiftOut; prize posting within the pot, claims, double claims, expiry; role delays; owner cannot move funds; invariants that balances plus locked plus pot plus reserve never exceed holdings.","types":["contracts"],"audits":[],"paidBy":"0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5","release":null,"research":[],"versions":[],"contracts":[{"id":"0537b7d1-e1e1-415b-9e4c-d3bd581f4e60","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"NightshiftVault","role":"other","txHash":"0x3c3e8fcfe358fb2a7473aed542f4ee5ec136f2074a05c0bf7fe2574efda9c4d7","address":"0xefc4076fa25327db4b0c89c05619d6b1273bff9b"}],"createdAt":"2026-10-20T19:15:44.995+00:00","updatedAt":"2026-10-20T19:17:05.606+00:00","launchNumber":2329,"parkedReason":null,"sourceCommit":"3be7283da43e1c99d70c770a8d69c73757d47ec4","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2329-build-deploy-nightshiftvault-one"}],"publishedAt":"2026-10-20T19:15:44.995+00:00"},{"id":"launch:8d227b92-3688-41b5-968c-1e8ec8b37e99","code":[],"media":[],"sites":[],"title":"Launch the genesis contracts of moneycanbuy.fun from this repository as they are: an evm_contracts launch on Ethereum mainnet (no token), the first of four. They exist before the project token $YOLO: the token's custom_token launch (the second) takes the YoloSplitter below as its remainderTo and the NftGate below as a constructor argument of the token; the core and the $YOLO modules follow as the third and fourth launches. script/LaunchPlan.sol is all four launches in code (genesisLaunch, then yoloTokenCode and support, then core, then extras).\n\nContracts, in this order:\n1. NftGate, constructorArgs [\"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d\", \"0x3c587Eff6c96eAcF7E3dcC2CFf6416161386E48C\"]\n2. IncentivesVesting, constructorArgs [\"0x7085193516EDc587fAebFF7a48548eAC8db5fAb5\"]\n3. DevVesting, constructorArgs [\"0x8Ad18E99F4C8d8406f9Ba8899CF308000518A981\"]\n4. TeamVesting, constructorArgs [\"0x153D12cc398d79A99B781B23DB6399556b84ca76\"]\n5. TreasuryVesting, constructorArgs [\"0x3c587Eff6c96eAcF7E3dcC2CFf6416161386E48C\"]\n6. YoloSplitter, constructorArgs [\"$contract:IncentivesVesting\", \"$contract:DevVesting\", \"$contract:TeamVesting\", \"$contract:TreasuryVesting\", \"0xaaB0269b956bd5F97B44529569b042e7BD72B508\"]\n\nWhat they do. NftGate is the snapshot of identity.md NFT holders (0x0000ec93127baa929e58e97dd0095a2bfb38ec1d, 2,000 NFTs) for the first 30 minutes of $YOLO trading: the writer 0x3c587Eff6c96eAcF7E3dcC2CFf6416161386E48C (the project wallet) records wallets with the number of NFTs each held at one block, in batches (record(accounts, nfts): each wallet once, no zero address or count, event Recorded per wallet, a running snapshotHash), then seal(snapshotBlock) closes the list for good: after the seal nobody can change it. Every NFT in the snapshot allows its wallet 500,000 YOLO of buys in the window. The gate never reads the NFT contract, so an NFT moved after the snapshot changes nothing. The token calls consume(buyer, amount) on a buy in its window; consume reverts until the seal; the gate books per calling token (any other caller only spends its own books, so the gate needs no token address), books only if it fits, and returns the allowance and what was used before; it never calls back and holds nothing. No owner and no clock: the window is the token's, and the token counts the snapshot only if it was sealed before trading opened.\nIncentivesVesting, DevVesting, TeamVesting and TreasuryVesting are ProjectVesting with their schedules compiled in, none with a cliff, each clock started only by the YoloSplitter, which binds itself as the one starter in this launch's transaction (bindStarter, a transient flag) and starts all four at its split: incentives 62,500,000 at once and the rest linear over 730 days, to 0x7085193516EDc587fAebFF7a48548eAC8db5fAb5 (the project's wallet for incentives it runs itself, off chain); dev linear over 365 days, to 0x8Ad18E99F4C8d8406f9Ba8899CF308000518A981; team linear over 365 days, to 0x153D12cc398d79A99B781B23DB6399556b84ca76; treasury 74,074,074 at once and the rest linear over 365 days, to 0x3c587Eff6c96eAcF7E3dcC2CFf6416161386E48C. They know no token in advance (release(token), like OpenZeppelin's VestingWallet); whatever arrives counts; no owner, no acceleration; anyone may call release, which only pays the beneficiary what the schedule has opened.\nYoloSplitter receives the project's 75% of $YOLO from the factory (the remainderTo of the token launch). The first split(token) once more than 527,777,777 have arrived pays 250,000,000 to IncentivesVesting, 150,000,000 to the manual YOLO Stabilizer wallet 0xaaB0269b956bd5F97B44529569b042e7BD72B508 (at once, no vesting), 77,777,777 to DevVesting, 50,000,000 to TeamVesting, and the rest (222,222,223, give or take the factory's rounding of the pool seed) to TreasuryVesting; the factory sends the remainder within the launch transaction, so it has all arrived before anyone can call; anything arriving later goes to TreasuryVesting on the next call. Right after the first split it calls release on the four vestings, which starts their clocks and pays the at-once parts. Anyone may call it. With the swarm's 10% and the pool's 15% that is the whole supply. No share is airdropped or burned.\n\nConstructors take only addresses; the only external call is the YoloSplitter's bindStarter on the four vestings. Nothing here holds funds until the token launch. No owner, admin, pause or upgrade path in any of the six.\n\nKnown and accepted by design: the snapshot is written by the project wallet from an off-chain read of ownerOf at one block (script/snapshot/snapshot.py; the json, its block and snapshotHash are published before trading opens, anyone can recompute them); a wallet holding NFTs in a contract at that block (a vault, a marketplace escrow) is listed as that contract; the incentives wallet is a plain wallet that no mechanic pays from, the contract only unlocks it on schedule.\n\nThe tests must keep passing: forge test (686 tests), and forge test with FORK_URL set to a mainnet archive RPC: test/fork/LaunchRehearsal.fork.t.sol runs all four launches through the live ProjectFactory (launchContracts, launchCustom, launchContracts, launchContracts), checks each against the 16,777,216 gas cap (this one about 3.6M), splits the remainder and checks every share, and trades the token's opening and first hour through the live Universal Router with a snapshot of real NFT holders, buys with IMD, USDC and ETH routed through IMD.\n\nAudit it as it arrived. Adapt only what the launch rules or a reproduced audit finding require, and record each change in ADAPTATION.md. Do not change the shares, the schedules, the allowance per NFT, the recipients or the constructor arguments, and do not add an owner, a pause, an upgrade path or a fee, unless a reproduced finding requires it; record it in ADAPTATION.md.\nKnown limitations listed in docs are accepted rules, not findings; do not change them.","types":["contracts"],"audits":[],"paidBy":"0x3c587eff6c96eacf7e3dcc2cff6416161386e48c","release":null,"research":[],"versions":[],"contracts":[{"id":"8d227b92-3688-41b5-968c-1e8ec8b37e99","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"DevVesting","role":"other","txHash":"0x40be05147f66d487b90b46688989ce4ced0ca0919b3c37fa43e84c7064727173","address":"0xb3c108df767cbe1e58e8d772965f43af7d1d200d"},{"name":"IncentivesVesting","role":"other","txHash":"0x40be05147f66d487b90b46688989ce4ced0ca0919b3c37fa43e84c7064727173","address":"0x99b02d0e09ad6a779e6274077b8ce64ec3258f87"},{"name":"NftGate","role":"other","txHash":"0x40be05147f66d487b90b46688989ce4ced0ca0919b3c37fa43e84c7064727173","address":"0x97c8fe82527f1a65a147bb0b425c717e4ec547c2"},{"name":"TeamVesting","role":"other","txHash":"0x40be05147f66d487b90b46688989ce4ced0ca0919b3c37fa43e84c7064727173","address":"0x76939608edaf4dd0a2ff35211fca30e5f747fd61"},{"name":"TreasuryVesting","role":"other","txHash":"0x40be05147f66d487b90b46688989ce4ced0ca0919b3c37fa43e84c7064727173","address":"0x15d4ee09c6820b569a9cb36cc962a356da3e4564"},{"name":"YoloSplitter","role":"other","txHash":"0x40be05147f66d487b90b46688989ce4ced0ca0919b3c37fa43e84c7064727173","address":"0xf165884070b1a1e571f4a3b50fd727fe8380bee4"}],"createdAt":"2026-10-20T14:26:52.541+00:00","updatedAt":"2026-10-20T15:01:52.578+00:00","launchNumber":2292,"parkedReason":null,"sourceCommit":"2469465a5dbcad4cf421103a544beb921d36a28a","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2292-launch-genesis-contracts-moneycanbuy-fun"}],"publishedAt":"2026-10-20T14:26:52.541+00:00"},{"id":"job:08f470b3-ac53-4b1c-878f-96bf4cf65ebb","code":[],"media":[],"sites":[{"id":"781bd52f-31ee-43ae-9658-de9ee2d7c91b","cid":"bafybeichso5hj724ecaxin2qa6s43worch64tu7d24rgiozo2uvbow6c2e","jobId":"6bdec3ec-ccb2-4c33-bc08-9a7858e04649","label":"fieldkit-testnet-equipment-renta","status":"named","txHash":"0x8787c368c6f03ea43d966f6c8a9413b4f6ba6266cca5fbd26b7c07c8c1568424","ensName":"fieldkit-testnet-equipment-renta.site.identitymd.eth","failure":null,"namedAt":"2026-10-20T13:52:04.141+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2287-build-small-functional-equipment-rental","pinnedAt":"2026-10-20T13:51:21.995+00:00","createdAt":"2026-10-20T13:50:51.129+00:00","previewHash":"56316cd61d33918f2cfc2153b5dd3719095afcc8d86fb0769912028a2a89a134","supersededBy":null},{"id":"c8d5f9e4-b21e-4701-80de-b34fd7a177be","cid":"bafybeig54tiucniuvchnpze5uv4sqfklx2epa6d6gvwxbwdpx2acof4cve","jobId":"08f470b3-ac53-4b1c-878f-96bf4cf65ebb","label":null,"status":"named","txHash":"0xdb4d6ed097b3f96d5ca8f3fbdf0ca31ec14c7b357dbc910344760654ae6b3daa","ensName":"fieldkit-testnet-equipment-renta.site.identitymd.eth","failure":null,"namedAt":"2026-10-20T11:38:49.63+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2287-build-small-functional-equipment-rental","pinnedAt":"2026-10-20T11:38:11.849+00:00","createdAt":"2026-10-20T11:37:42.708+00:00","previewHash":"30f7482aa7c0c7f001bc3f213c703a22eee466e34fc8a074dec5ab4753e617b5","supersededBy":"781bd52f-31ee-43ae-9658-de9ee2d7c91b"}],"title":"Build a small, functional equipment-rental browser app in a NEW frontend repository, using Vite, React and TypeScript. Deliver source, a lockfile, a static production build, setup instructions and automated tests. This is a public, disposable testnet demonstration with an existing contract deployment. It must perform real wallet interactions, not simulate successful payments.\n\nUse these existing deployments, without changing or redeploying contracts:\n- Robinhood Chain Testnet, chain ID 46630, native test ETH.\n- Public RPC https://rpc.testnet.chain.robinhood.com\n- Explorer https://explorer.testnet.chain.robinhood.com\n- MockPaymentToken: 0x31339619db548257cE09A76f189b0b1932f5c0cd\n- RentalEscrow: 0x06135FF9311eCa80a7484444A552f28fFC660F05\n- Authoritative contract source: https://github.com/identity-md-launches/launch-1988-kkk at commit 6ce8023819f68d2b84f2151b24285af477f4d9c7. Inspect its Solidity and derive/check the full ABI against that exact commit; do not guess signatures.\n\nThe journey:\n1. Display a clear TESTNET / mock tokens notice. Connect a browser wallet, including Rabby, with explicit user action. Show connected address, chain, token balance and available equipment. For this bounded demo focus on item 1, but read its actual existence, listing status, state and policy from the contract. Treat metadata as untrusted text, never executable HTML.\n2. Show the current deposit, cancellation fee and reservation expiry rules before approval/booking. The existing policy is expected to be a 50-token deposit, 5-token cancellation fee and 24-hour reservation window, but on-chain reads must determine the displayed values. Read token decimals; the deployed token has 6. All monetary calculations must use integer base units, never floating-point arithmetic.\n3. Read current ERC20 allowance on-chain, and request only the approval needed for this deposit, never an unlimited approval. Approval and reservation are separate wallet actions, with clear progress and receipt links. Explain that test ETH pays gas and mock tokens pay the deposit.\n4. Reserve with reserve(itemId, expectedPolicyId, clientRef). Preserve the policy the user accepted. If the quote changes, stop and require renewed acceptance. Use a nonzero random clientRef and retain the pending operation, reference and any transaction hash across reloads, scoped by chain, escrow and wallet. Disable duplicate submissions while pending. Before retrying an uncertain reservation, resolve its receipt and reservationByRef; do not silently generate a new reference and pay again.\n5. Display the resulting reservation ID, status, and accepted terms from getReservation, not from the item's current policy. Recover this booking after refresh. Also provide reservation-ID lookup with clear ownership information; do not claim local browser storage is complete account history.\n6. Allow the renter to cancel a reservation only when its current on-chain state and expiry permit it. After confirmed cancellation, display refundCreditOf and offer a separate withdrawRefund action. Cancellation creates a credit; do not describe it as money already returned to the wallet. Read the current refund credit before withdrawal because it may include other reservations. Refresh balances, availability and reservation state after each confirmed action.\n\nHandle disconnected wallets, wrong network, account/chain changes, insufficient balances, rejected signatures, reverted/replaced transactions, unavailable RPC and delayed receipts. Do not show success until a successful receipt is observed; make confirmation state explicit. Clear account-specific displayed state when the account changes. Revalidate chain, account, quote and applicable contract state before each write. An unavailable RPC must produce an honest error/retry state, never fake data or a false payment success.\n\nKeep this task bounded:\n- Frontend only. Read directly from the public chain and send writes through the user's wallet. There is no public backend URL for this task. Do not create a backend, indexer, database, authentication service or new contracts, and do not require access to any private repository or hosting account.\n- No admin/staff operations, fee collection, token minting, real payments or production-network support in this version.\n- No private keys, recovery phrases, server credentials or signing secrets. Workers must not transact against the live testnet contracts. Automated wallet/write tests must use mocks or an isolated local chain; public testnet reads are allowed.\n- Public frontend configuration may contain only public network/contract information. Never put a secret in a VITE variable or bundle.\n\nProvide meaningful automated tests for booking/cancel/refund state transitions, 6-decimal amounts, exact approvals, changed-policy acceptance, duplicate clicks, pending-operation recovery after reload, rejected/reverted transactions, wrong-chain/account changes and RPC failure. Include a reproducible browser smoke test with a mocked injected wallet and mocked RPC, covering the complete journey. Report commands and actual results, clearly distinguishing mocked/local tests from any live read-only checks.\n\nUse a simple readable responsive interface with explicit loading/error/pending states. Include a README with exact install/build/test commands, static-hosting instructions, ABI provenance, limitations and a short manual Rabby acceptance checklist. Do not claim backend integration or production readiness.","types":["sites"],"audits":[],"paidBy":"0x65fcec1f5bfa9c8d8b93bc1dba740b5977019696","release":null,"research":[],"versions":[{"site":{"cid":"bafybeig54tiucniuvchnpze5uv4sqfklx2epa6d6gvwxbwdpx2acof4cve","status":"named","ensName":"fieldkit-testnet-equipment-renta.site.identitymd.eth"},"jobId":"08f470b3-ac53-4b1c-878f-96bf4cf65ebb","state":"completed","commit":"85a38a60c5a715e2e82bb1fe735666c27dfc4379","repoUrl":"https://github.com/identity-md-launches/launch-2287-build-small-functional-equipment-rental","createdAt":"2026-10-20T10:54:29.289346+00:00","objective":"Build a small, functional equipment-rental browser app in a NEW frontend repository, using Vite, React and TypeScript. Deliver source, a lockfile, a static production build, setup instructions and automated tests. This is a public, disposable testnet demonstration with an existing contract deployment. It must perform real wallet interactions, not simulate successful payments.\n\nUse these existing deployments, without changing or redeploying contracts:\n- Robinhood Chain Testnet, chain ID 46630, native test ETH.\n- Public RPC https://rpc.testnet.chain.robinhood.com\n- Explorer https://explorer.testnet.chain.robinhood.com\n- MockPaymentToken: 0x31339619db548257cE09A76f189b0b1932f5c0cd\n- RentalEscrow: 0x06135FF9311eCa80a7484444A552f28fFC660F05\n- Authoritative contract source: https://github.com/identity-md-launches/launch-1988-kkk at commit 6ce8023819f68d2b84f2151b24285af477f4d9c7. Inspect its Solidity and derive/check the full ABI against that exact commit; do not guess signatures.\n\nThe journey:\n1. Display a clear TESTNET / mock tokens notice. Connect a browser wallet, including Rabby, with explicit user action. Show connected address, chain, token balance and available equipment. For this bounded demo focus on item 1, but read its actual existence, listing status, state and policy from the contract. Treat metadata as untrusted text, never executable HTML.\n2. Show the current deposit, cancellation fee and reservation expiry rules before approval/booking. The existing policy is expected to be a 50-token deposit, 5-token cancellation fee and 24-hour reservation window, but on-chain reads must determine the displayed values. Read token decimals; the deployed token has 6. All monetary calculations must use integer base units, never floating-point arithmetic.\n3. Read current ERC20 allowance on-chain, and request only the approval needed for this deposit, never an unlimited approval. Approval and reservation are separate wallet actions, with clear progress and receipt links. Explain that test ETH pays gas and mock tokens pay the deposit.\n4. Reserve with reserve(itemId, expectedPolicyId, clientRef). Preserve the policy the user accepted. If the quote changes, stop and require renewed acceptance. Use a nonzero random clientRef and retain the pending operation, reference and any transaction hash across reloads, scoped by chain, escrow and wallet. Disable duplicate submissions while pending. Before retrying an uncertain reservation, resolve its receipt and reservationByRef; do not silently generate a new reference and pay again.\n5. Display the resulting reservation ID, status, and accepted terms from getReservation, not from the item's current policy. Recover this booking after refresh. Also provide reservation-ID lookup with clear ownership information; do not claim local browser storage is complete account history.\n6. Allow the renter to cancel a reservation only when its current on-chain state and expiry permit it. After confirmed cancellation, display refundCreditOf and offer a separate withdrawRefund action. Cancellation creates a credit; do not describe it as money already returned to the wallet. Read the current refund credit before withdrawal because it may include other reservations. Refresh balances, availability and reservation state after each confirmed action.\n\nHandle disconnected wallets, wrong network, account/chain changes, insufficient balances, rejected signatures, reverted/replaced transactions, unavailable RPC and delayed receipts. Do not show success until a successful receipt is observed; make confirmation state explicit. Clear account-specific displayed state when the account changes. Revalidate chain, account, quote and applicable contract state before each write. An unavailable RPC must produce an honest error/retry state, never fake data or a false payment success.\n\nKeep this task bounded:\n- Frontend only. Read directly from the public chain and send writes through the user's wallet. There is no public backend URL for this task. Do not create a backend, indexer, database, authentication service or new contracts, and do not require access to any private repository or hosting account.\n- No admin/staff operations, fee collection, token minting, real payments or production-network support in this version.\n- No private keys, recovery phrases, server credentials or signing secrets. Workers must not transact against the live testnet contracts. Automated wallet/write tests must use mocks or an isolated local chain; public testnet reads are allowed.\n- Public frontend configuration may contain only public network/contract information. Never put a secret in a VITE variable or bundle.\n\nProvide meaningful automated tests for booking/cancel/refund state transitions, 6-decimal amounts, exact approvals, changed-policy acceptance, duplicate clicks, pending-operation recovery after reload, rejected/reverted transactions, wrong-chain/account changes and RPC failure. Include a reproducible browser smoke test with a mocked injected wallet and mocked RPC, covering the complete journey. Report commands and actual results, clearly distinguishing mocked/local tests from any live read-only checks.\n\nUse a simple readable responsive interface with explicit loading/error/pending states. Include a README with exact install/build/test commands, static-hosting instructions, ABI provenance, limitations and a short manual Rabby acceptance checklist. Do not claim backend integration or production readiness.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","workflowId":null,"deliveredAt":"2026-10-20T11:37:57.469+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2287-build-small-functional-equipment-rental/pull/1"},{"site":{"cid":"bafybeichso5hj724ecaxin2qa6s43worch64tu7d24rgiozo2uvbow6c2e","status":"named","ensName":"fieldkit-testnet-equipment-renta.site.identitymd.eth"},"jobId":"6bdec3ec-ccb2-4c33-bc08-9a7858e04649","state":"completed","commit":"51244e3728b08de0040e79343bb6e8462335bf13","repoUrl":"https://github.com/identity-md-launches/launch-2287-build-small-functional-equipment-rental","createdAt":"2026-10-20T13:31:03.682928+00:00","objective":"Continue this existing rental WEBSITE project from delivered commit 85a38a60c5a715e2e82bb1fe735666c27dfc4379. Keep the existing frontend repository, design, Robinhood testnet deployment, full ABIs and customer-only scope. Make a focused repair, not a new application. Do not modify contracts, create a backend or broadcast transactions to the public testnet.\n\nKeep the existing single rental dashboard page: equipment item 1, policy and deposit terms, wallet connection, approval/reservation, reservation-ID lookup, cancellation and refund credit withdrawal. Preserve its current copy and styling except for the corrected recovery explanation.\n\nIndependent review reproduced a recovery defect in src/engine.ts:\n1. The renter accepts the policy and has sufficient allowance.\n2. execute('reserve') sends the first booking request. The wallet response is lost: it throws a transport error without returning a transaction hash. The original transaction MAY already be broadcast and still pending. The engine correctly saves the original clientRef/calldata/quote as uncertain.\n3. reservationByRef still returns zero because the original has not mined. The renter explicitly chooses Retry same booking reference.\n4. The renter rejects ONLY THIS RETRY in the wallet (error code 4001).\n5. send() currently sees isRejected(error) && !returnedHash and clears journal.operation. The persisted journal becomes {version:1}. Another execute('reserve') is then allowed and generates a different clientRef while the first request is still unresolved.\n\nThis was reproduced against the actual delivered RentalEngine using its existing test fixture. Original reference and retry reference were identical; after rejection a third send attempt used a new reference. The original 64 tests all pass but do not cover this sequence. This is a loss of pending-payment recovery, not proof that two deposits were charged: the contract still enforces item availability.\n\nRequired behavior:\n- A rejection of a retry must not erase uncertainty about an earlier attempt. Retain the original reference, accepted terms, exact calldata, original timing/block information and any known hashes in memory and persistent storage. Explain that the retry was rejected but the earlier booking may still be pending.\n- Fresh actions/new references remain blocked until the original request is reconciled. Reload must retain the same pending request. A later successful original receipt/reference must recover the correct booking without another payment.\n- Preserve the useful distinction that a rejected FIRST attempt, with no earlier uncertainty or broadcast evidence, can be cleared normally.\n- Apply this distinction consistently to other retry/preflight failures; do not treat absence of a returned hash or a zero mapping before mining as proof that an earlier attempt was never sent.\n- Add a failing-before/passing-after engine regression for this exact sequence, including a blocked fresh execute, persisted state across a new engine instance, and later recovery when the original mines. Keep a first-attempt-rejection control test.\n- Add a mocked-browser regression: intercept the first reservation send after the mock wallet has recorded its broadcast, lose its response, leave it pending, reject only the retry, then verify the same pending reference remains visible/saved and no fresh reservation is offered or sent. No real wallet or public-chain writes.\n\nAlso repair the clean-checkout validation packaging. The delivered repository has no artifacts/ directory, but tests/browser/smoke.mjs and scripts/live-read.mjs write reports under it without first creating it. Make report-producing commands create their output directories themselves. README references artifacts/validation.md and artifacts/design-probe.json that are absent: include legitimate evidence or correct those references/claims. Document an exact reproducible Playwright installation/version and browser-test command; do not require hidden worker tooling or manual directory creation.\n\nRun typecheck, all existing and new tests, ABI verification, production build, bundle checks and the complete mocked-browser suite from a clean checkout with no pre-created artifacts/ directory. Report actual results and remaining limitations. Rebuild the committed dist/ export from the repaired source. Preserve the existing exact-deposit approvals, policy acceptance, account/network checks and separate cancellation/refund withdrawal behavior. No secrets, real payments, new contracts, admin/staff controls or private hosting access.","baseCommit":"85a38a60c5a715e2e82bb1fe735666c27dfc4379","workflowId":null,"deliveredAt":"2026-10-20T13:51:01.429+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2287-build-small-functional-equipment-rental/pull/2"}],"contracts":[],"publishedAt":"2026-10-20T13:52:04.141+00:00"},{"id":"job:e4eb1329-68c8-4492-b2f6-0632e1009180","code":[{"jobId":"1485431c-0a9e-4f34-b655-3bfae6ae0861","commit":"0bb207204033dfee47c3ab73f3ff535ebcc6ab01","repoUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder","template":"skill:build-ponder-indexer","publishedAt":"2026-10-20T10:16:05.871+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder/pull/3"},{"jobId":"5d00ffbe-58d0-4383-a6af-e120f0b3d606","commit":"7631f26753845dd5bd8254f5099fe8d042bff3df","repoUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder","template":"skill:build-ponder-indexer","publishedAt":"2026-10-20T09:32:48.498+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder/pull/2"},{"jobId":"e4eb1329-68c8-4492-b2f6-0632e1009180","commit":"95cf662a8c5f70a107ba70240d27fb938a3ae192","repoUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder","template":"skill:build-ponder-indexer","publishedAt":"2026-10-19T14:34:51.104+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder/pull/1"}],"media":[],"sites":[],"title":"Build a standalone read-only Ponder indexer in a NEW public GitHub repository for this public equipment-rental trial. Deliver source and deployment instructions only; we will review and host it later.\n\nSOURCE AND ACTUAL DEPLOYMENTS\nReference: https://github.com/identity-md-launches/launch-1988-kkk\nCommit: 6ce8023819f68d2b84f2151b24285af477f4d9c7\nRobinhood Chain Testnet, chain ID 46630.\nPublic keyless RPC: https://rpc.testnet.chain.robinhood.com\nMockPaymentToken: 0x31339619db548257cE09A76f189b0b1932f5c0cd, deployment/start block 138710650.\nRentalEscrow: 0x06135FF9311eCa80a7484444A552f28fFC660F05, deployment/start block 138710790.\nBoth are non-proxy contracts. Derive exact ABIs from the pinned source/build artifacts; do not guess signatures. Check chain identity and deployed code. Preserve these deployment defaults while allowing explicit address/start-block/RPC overrides. Keep the reference repository and contracts unchanged. Its indexer/ and docs/RECONCILIATION-REPAIR.md are behavioral/test references, not packaging to copy.\n\nPUBLIC EXAMPLE TO VERIFY\nAt block 138754466, hash 0x198390e8346394fda55e74abb43cce543aff5768667adbf14bfc1c873bf90bad (check canonicality), there is one policy, item and CANCELLED reservation, all ID 1. The administrator, renter and fee recipient are 0x0fF6617f72544f60802b72D752dA7490C304CdeE. Token decimals: 6. Policy deposit 50000000 base units, cancellation fee 5000000, reservation window 86400 seconds. Cumulative refunds paid: 45000000; cumulative fees paid: 5000000. Escrowed deposits, outstanding refund credits, accrued fees, liabilities and escrow token balance are all zero. Original fixed supply 1000000000000 base units is back in the test account. Item is available again; original reservation terms remain stored.\nBooking clientRef: 0x0f3fcf2d397cb63077da241a2b9b0a8762d96b745c235f2e1993c749ba1aeaac\nCompleted fee request ID: 0xb5d4ba7e1b0d63f8be844a65244059d1f8808692685ecd0fd3778d676e543b78\nFinal fee-withdrawal transaction: 0x87911ffadb4882d59cf8cd1979c4e49f0598f3f38206a15eed55716b1c00faf4\nDiscover earlier events from the real deployment blocks and verify these values at that fixed block. Do not compare a fixed example to changing latest state. This example covers cancellation/refund/fee withdrawal only; it does not prove checkout/return, expiry, role separation or failure recovery.\n\nDELIVER\n- A normal Ponder 0.18 project at repository root, exact dependency pins, pnpm lockfile, Node >=22.12 and documented tool versions. Use supported public APIs and ordinary installation, without the old pruned archive, private bootstrap or single-JSON-row projection.\n- Entity tables and documented queries for equipment availability, policies, reservations and accepted terms, renter credits/payment history, staff/admin state, completed fee-request IDs and accounting totals. Use exact integer amounts/IDs; preserve snapshotted terms after policy changes. Canonical event identities, ordered application and duplicate handling must prevent double counting and retain supported reorg rollback.\n- Queries must answer: available equipment/current quote; reservation terms/status; renter credits/payments; fee-request outcome; accounting totals; sync status. Provide GraphQL and documented read-only examples. Report indexed block/hash, observed head, lag and RPC errors so callers can distinguish stale/catching-up data. Explain provisional results and reorg/finality limits. Readiness is not a guarantee of continuing freshness; never label observed head as indexed progress without evidence.\n- Read-only reconciliation against one canonical block: use a coherent database snapshot/checkpoint and pin independent event scans and storage calls to it, checking block hashes before/after. Discover expected fee-request and staff identities from chain events independently of projected records. Retain missing/extra record detection, revoked-staff records, cumulative refundsPaid/feesPaid, accepted terms, credits/liabilities and token balance/donation checks from the repaired reference. Fail on mismatches or unavailable history without repairing data or substituting latest. Bound log ranges/timeouts/retries; document RPC-trust and completeness limits.\n- Dockerfile, env.example, persistent PostgreSQL Compose setup, and beginner Railway instructions. Host-published local ports must bind explicitly to host loopback only; database ports stay internal. No Docker socket, privileged containers or broad host mounts. The Railway container must listen on its platform port/interface; use private database connectivity and require PostgreSQL in production. No signing keys or committed credentials.\n- Stable schema on ordinary restart; a distinct schema for a changed deployment, with readiness-controlled serving and documented rebuild/rollback behavior. Document backup/restore and deliberate old-schema cleanup, preserving existing data by default. Include deployment settings, readiness endpoint, query/resource protection and known public-RPC limits. Do not provision Railway or claim its instructions were tested if they were not.\n- INDEXER.md: ABI provenance, chain/contracts/start blocks, entities/keys/events, intentionally omitted events, configuration, exact commands/results and limitations for the next maintainer.\n\nVERIFICATION AND BOUNDARIES\nRun clean install, codegen, typecheck, unit tests and permitted read-only public RPC/backfill/query checks. Show actual results; mark unavailable or unrun checks NOT RUN. Respect worker access restrictions; never access our computer, private services or cloud metadata. Any local-network harness below is delivered for our subsequent execution, not a request to access our environment.\nDeliver executable integration tests for lifecycle/term preservation, revoked staff, duplicate logs, refund/fee payments, restart preserving the database, RPC outage/catch-up, short reorg and fresh replay. Reconciliation tests must reject missing/extra fee and staff records, changed historical payment totals and bad/noncanonical RPC evidence; valid history must pass. Local transaction/fault fixtures must use disposable Anvil chain 31337 only, reject nonlocal endpoints and other chain IDs, and clean up only resources they created. Never transact on the public testnet or simulate its failures. The running indexer is read-only and holds no keys.\nOnly this public rental example. No private files, real-user data, browser UI, contract changes/deployments, tunnels, cloud accounts, paid hosting or extra jobs. Deliver reproducible code and honest evidence, not production approval.","types":["code"],"audits":[],"paidBy":"0x65fcec1f5bfa9c8d8b93bc1dba740b5977019696","release":null,"research":[],"versions":[{"site":null,"jobId":"e4eb1329-68c8-4492-b2f6-0632e1009180","state":"completed","commit":"95cf662a8c5f70a107ba70240d27fb938a3ae192","repoUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder","createdAt":"2026-10-19T13:54:42.278605+00:00","objective":"Build a standalone read-only Ponder indexer in a NEW public GitHub repository for this public equipment-rental trial. Deliver source and deployment instructions only; we will review and host it later.\n\nSOURCE AND ACTUAL DEPLOYMENTS\nReference: https://github.com/identity-md-launches/launch-1988-kkk\nCommit: 6ce8023819f68d2b84f2151b24285af477f4d9c7\nRobinhood Chain Testnet, chain ID 46630.\nPublic keyless RPC: https://rpc.testnet.chain.robinhood.com\nMockPaymentToken: 0x31339619db548257cE09A76f189b0b1932f5c0cd, deployment/start block 138710650.\nRentalEscrow: 0x06135FF9311eCa80a7484444A552f28fFC660F05, deployment/start block 138710790.\nBoth are non-proxy contracts. Derive exact ABIs from the pinned source/build artifacts; do not guess signatures. Check chain identity and deployed code. Preserve these deployment defaults while allowing explicit address/start-block/RPC overrides. Keep the reference repository and contracts unchanged. Its indexer/ and docs/RECONCILIATION-REPAIR.md are behavioral/test references, not packaging to copy.\n\nPUBLIC EXAMPLE TO VERIFY\nAt block 138754466, hash 0x198390e8346394fda55e74abb43cce543aff5768667adbf14bfc1c873bf90bad (check canonicality), there is one policy, item and CANCELLED reservation, all ID 1. The administrator, renter and fee recipient are 0x0fF6617f72544f60802b72D752dA7490C304CdeE. Token decimals: 6. Policy deposit 50000000 base units, cancellation fee 5000000, reservation window 86400 seconds. Cumulative refunds paid: 45000000; cumulative fees paid: 5000000. Escrowed deposits, outstanding refund credits, accrued fees, liabilities and escrow token balance are all zero. Original fixed supply 1000000000000 base units is back in the test account. Item is available again; original reservation terms remain stored.\nBooking clientRef: 0x0f3fcf2d397cb63077da241a2b9b0a8762d96b745c235f2e1993c749ba1aeaac\nCompleted fee request ID: 0xb5d4ba7e1b0d63f8be844a65244059d1f8808692685ecd0fd3778d676e543b78\nFinal fee-withdrawal transaction: 0x87911ffadb4882d59cf8cd1979c4e49f0598f3f38206a15eed55716b1c00faf4\nDiscover earlier events from the real deployment blocks and verify these values at that fixed block. Do not compare a fixed example to changing latest state. This example covers cancellation/refund/fee withdrawal only; it does not prove checkout/return, expiry, role separation or failure recovery.\n\nDELIVER\n- A normal Ponder 0.18 project at repository root, exact dependency pins, pnpm lockfile, Node >=22.12 and documented tool versions. Use supported public APIs and ordinary installation, without the old pruned archive, private bootstrap or single-JSON-row projection.\n- Entity tables and documented queries for equipment availability, policies, reservations and accepted terms, renter credits/payment history, staff/admin state, completed fee-request IDs and accounting totals. Use exact integer amounts/IDs; preserve snapshotted terms after policy changes. Canonical event identities, ordered application and duplicate handling must prevent double counting and retain supported reorg rollback.\n- Queries must answer: available equipment/current quote; reservation terms/status; renter credits/payments; fee-request outcome; accounting totals; sync status. Provide GraphQL and documented read-only examples. Report indexed block/hash, observed head, lag and RPC errors so callers can distinguish stale/catching-up data. Explain provisional results and reorg/finality limits. Readiness is not a guarantee of continuing freshness; never label observed head as indexed progress without evidence.\n- Read-only reconciliation against one canonical block: use a coherent database snapshot/checkpoint and pin independent event scans and storage calls to it, checking block hashes before/after. Discover expected fee-request and staff identities from chain events independently of projected records. Retain missing/extra record detection, revoked-staff records, cumulative refundsPaid/feesPaid, accepted terms, credits/liabilities and token balance/donation checks from the repaired reference. Fail on mismatches or unavailable history without repairing data or substituting latest. Bound log ranges/timeouts/retries; document RPC-trust and completeness limits.\n- Dockerfile, env.example, persistent PostgreSQL Compose setup, and beginner Railway instructions. Host-published local ports must bind explicitly to host loopback only; database ports stay internal. No Docker socket, privileged containers or broad host mounts. The Railway container must listen on its platform port/interface; use private database connectivity and require PostgreSQL in production. No signing keys or committed credentials.\n- Stable schema on ordinary restart; a distinct schema for a changed deployment, with readiness-controlled serving and documented rebuild/rollback behavior. Document backup/restore and deliberate old-schema cleanup, preserving existing data by default. Include deployment settings, readiness endpoint, query/resource protection and known public-RPC limits. Do not provision Railway or claim its instructions were tested if they were not.\n- INDEXER.md: ABI provenance, chain/contracts/start blocks, entities/keys/events, intentionally omitted events, configuration, exact commands/results and limitations for the next maintainer.\n\nVERIFICATION AND BOUNDARIES\nRun clean install, codegen, typecheck, unit tests and permitted read-only public RPC/backfill/query checks. Show actual results; mark unavailable or unrun checks NOT RUN. Respect worker access restrictions; never access our computer, private services or cloud metadata. Any local-network harness below is delivered for our subsequent execution, not a request to access our environment.\nDeliver executable integration tests for lifecycle/term preservation, revoked staff, duplicate logs, refund/fee payments, restart preserving the database, RPC outage/catch-up, short reorg and fresh replay. Reconciliation tests must reject missing/extra fee and staff records, changed historical payment totals and bad/noncanonical RPC evidence; valid history must pass. Local transaction/fault fixtures must use disposable Anvil chain 31337 only, reject nonlocal endpoints and other chain IDs, and clean up only resources they created. Never transact on the public testnet or simulate its failures. The running indexer is read-only and holds no keys.\nOnly this public rental example. No private files, real-user data, browser UI, contract changes/deployments, tunnels, cloud accounts, paid hosting or extra jobs. Deliver reproducible code and honest evidence, not production approval.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","workflowId":null,"deliveredAt":"2026-10-19T14:34:51.104+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder/pull/1"},{"site":null,"jobId":"5d00ffbe-58d0-4383-a6af-e120f0b3d606","state":"completed","commit":"7631f26753845dd5bd8254f5099fe8d042bff3df","repoUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder","createdAt":"2026-10-20T09:09:42.28237+00:00","objective":"Continue this existing equipment-rental indexer. Make one small maintenance improvement: a trustworthy operational health endpoint. Do not create a replacement project.\n\nBaseline: the parent delivered commit 95cf662a8c5f70a107ba70240d27fb938a3ae192 in https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder. Inspect that source first. If the continuation now resolves to a different base, identify the difference before proceeding. The reviewed version is already running with PostgreSQL; no hosting access is needed for this source-only task.\n\nObserved problem: Ponder's /ready returned HTTP 200 while /sync showed the indexer behind its permitted serving lag and GraphQL returned 503. Operators need a lightweight signal for whether application queries are eligible to be served.\n\nRequirements:\n1. Add GET /healthz returning documented, versioned JSON with status ready, catching_up or unavailable, safe reason codes, indexed checkpoint, observed head, observation time, lag, serving limit and live/bounded mode. Use null for unknown values and decimal strings for block numbers/lag. Never expose credentials, connection URLs or raw exception text in this response.\n2. Return 200 only for ready; otherwise 503. Set Cache-Control: no-store. Use bounded dependency timeouts and controlled caching/in-flight requests so failures do not hang checks or accumulate work. Preserve existing request-size, rate and query-complexity safeguards.\n3. Share the serving-eligibility decision with the existing GraphQL and SQL guards so these paths agree when given the same observations. Preserve current policy: live mode uses MAX_SERVING_LAG (default 200 blocks); bounded mode must reach its configured end block rather than chase the advancing live head. Missing checkpoint or ordinary backlog is catching_up; a failed dependency is unavailable. Preserve native /ready semantics, existing /sync and /snapshot formats and query interfaces. Explain that ready is an observed freshness/dependency check, not a guarantee of finality, capacity or future availability.\n4. Keep contracts, ABIs, indexing handlers/reducers, schema, ponder.config.ts, chain/address/start-block defaults, dependency versions and lockfile unchanged. No database reset, migration, financial-rule changes or unrelated refactoring. Keep existing tests and add focused tests for the actual HTTP route/shared decision: healthy state, missing checkpoint, not-ready state, lag boundary/excess, database/RPC failure and timeout, cache expiry/recovery and completed bounded mode with a newer live head. Include assertions for HTTP status, safe JSON and no-store.\n5. Update the operating documentation with response examples, how to interpret the statuses, and a cautious API-only update/rollback procedure that preserves the database and volumes and avoids concurrent Ponder writers. Keep /ready as the deployment startup check; freshness monitoring should not automatically restart a healthy process merely because it is catching up. State which release/persistence behaviors were tested and which remain unverified.\n\nDeliver the minimal change through this project's normal continuation repository/PR flow. Report the actual base/result commits, changed files, commands run, results and remaining limitations. Run type checking and non-network automated tests where supported. If the worker environment forbids local/network integration tests, provide reproducible instructions and label them NOT RUN; never substitute that for a passing result.\n\nUse only this public rental source, public documentation and packages. Do not access private repositories, local/reserved network addresses, cloud accounts or credentials. Do not deploy, restart services, sign transactions or provision paid resources. The purchaser will independently inspect and test the delivered code before any hosted release.","baseCommit":"95cf662a8c5f70a107ba70240d27fb938a3ae192","workflowId":null,"deliveredAt":"2026-10-20T09:32:48.498+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder/pull/2"},{"site":null,"jobId":"1485431c-0a9e-4f34-b655-3bfae6ae0861","state":"completed","commit":"0bb207204033dfee47c3ab73f3ff535ebcc6ab01","repoUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder","createdAt":"2026-10-20T10:08:30.961018+00:00","objective":"Continue the existing rental indexer. Repair the health-check problems below in delivered commit 7631f26753845dd5bd8254f5099fe8d042bff3df, keeping the rest of this maintenance change. This is the same public repository: https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder. Source delivery only; no deployment or access to private infrastructure.\n\nIndependent review passed the Docker build, typecheck, all 28 unit tests and the supplied integration suite using PostgreSQL 17.7 and disposable Anvil. Additional tests of the actual API module, with controlled dependencies, found these defects:\n\n1. A late result can reinstate stale readiness after timeout. shared/health.ts:createBoundedCache caches a loader result at its completion time even if the operation previously timed out. src/api/index.ts collects the database, head and readiness with Promise.all. Reproduction: HEALTH_TIMEOUT_MS=100, HEALTH_CACHE_MS=100, checkpoint 900, head 1000, MAX_SERVING_LAG=200, native readiness 200. Delay only the checkpoint read for 600 ms; head responds immediately. The first health request times out. Advance head to 1600 while the read is delayed. When the old operation finally completes, /healthz returns 200 ready with lag 100 and an observation over 600 ms old, despite a 100 ms cache limit. GraphQL/SQL guards also permit that sample. A fresh probe then correctly reports lag 700 and rejects queries. Do not turn expired/timed-out observations into fresh successful eligibility just because a slow dependency finally settles. Bound observation age and require a fresh completed sample after timeout, while keeping at most one active probe and preventing unbounded retry/work accumulation. Retain recovery once dependencies respond normally.\n\n2. The timeout diagnosis is fabricated. failureSample marks every dependency as timed out and sets observedAt to now. A slow RPC with an immediately healthy database/native readiness therefore returns reason database_timeout. Use accurate per-dependency outcomes, or an honest generic probe-timeout reason when attribution is unknown. Do not invent a successful observation timestamp or erase known distinctions. /sync should remain interpretable and its existing response shape preserved.\n\n3. nativeReadiness maps every non-2xx response to not_ready. A native /ready HTTP 500 therefore appears as ordinary catching_up. Distinguish the documented startup/backfill response (503) from unexpected failures such as HTTP 500/404; unexpected failure must produce unavailable with a safe reason.\n\nAdd regression tests against the actual health route and production probe orchestration, including the above delayed-completion/head-advance case and GraphQL/SQL eligibility, RPC-only timeout, database-only timeout, native HTTP 500 versus 503, and recovery. Use controlled dependencies/time where possible. Keep all existing tests. The current tests only supply prebuilt decisions to the health handler, so they missed these wiring failures.\n\nAlso correct the rollback instructions: the previous deployed release 95cf662 does not have /healthz, so rollback validation must use its supported /ready, /sync and an actual query. State plainly that the existing source fingerprint gives this API update a new physical schema/backfill; retain both schemas and avoid overlapping writers. Do not alter fingerprinting or introduce a schema migration to disguise this behavior.\n\nKeep contracts, ABIs, indexing logic, financial rules, schema/configuration defaults, dependency versions and lockfile unchanged. Preserve query interfaces and existing safeguards. Use safe reason codes without raw errors or credentials. Report exact changes, commands/results and remaining limitations honestly; mark unavailable integration checks NOT RUN. Only public rental source, documentation and packages; no private files, credentials, cloud access, paid provisioning, signing or public-chain transactions. We will independently review and test before releasing.","baseCommit":"7631f26753845dd5bd8254f5099fe8d042bff3df","workflowId":null,"deliveredAt":"2026-10-20T10:16:05.871+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2237-build-standalone-read-only-ponder/pull/3"}],"contracts":[],"publishedAt":"2026-10-20T10:16:05.871+00:00"},{"id":"job:28e81139-f2a5-4a5a-a239-b6c315b58e01","code":[{"jobId":"3abb736a-1567-4f8e-8fa7-e509c43bd315","commit":"46e17ea70534e8a7ac2c4ff78501a3c183d32da8","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-19T15:12:19.203+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/20"},{"jobId":"5aecaddc-e223-4f19-9630-5516ef639a82","commit":"e69e04f63832b9fa1e84c7d58c685ce37924a490","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-19T04:44:19.007+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/19"},{"jobId":"8763714a-3766-47d6-9f47-4166516c875b","commit":"357201be804e18ab48567172fb6c8b07acb30a2c","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-19T02:13:48.442+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/18"},{"jobId":"39414c8a-440a-484c-bd4c-e4c2963eb296","commit":"205fa11271ab17a26630154815fae4c390aac624","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-18T23:26:08.994+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/17"},{"jobId":"13be8f83-1ae7-463b-95e9-aea9d94c0647","commit":"378cd9b20db99e2190ed5a73fc73849250996e72","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-18T21:09:22.944+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/16"},{"jobId":"09034116-d45a-4bad-b453-042149ef93e8","commit":"9dd97150d292fee26912f9605e0686e4ddbb1645","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-17T16:42:27.363+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/15"},{"jobId":"d0b06613-a5d7-45bb-af2d-dff73bb429da","commit":"cc847d8f35bc0b814d390eb76092eed6051c5ae3","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-17T07:58:53.91+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/14"},{"jobId":"d8ec4ec9-b939-4ff8-8ce1-fad7a6a69bd9","commit":"2aef6408eabb45b8f149e16a96c7734d4b4b5b07","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-17T05:59:32.775+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/13"},{"jobId":"dc3bc239-442f-4ed4-9dd0-281045da7c9e","commit":"510bcfbf16cd6580a0f2409e9a92493241bbaa46","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-17T04:41:24.066+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/12"},{"jobId":"b29e6c95-8a83-411b-9690-062573688a89","commit":"b157921170c318f8eeee638b06025a81cf768c02","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-17T01:16:12.609+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/11"},{"jobId":"e192a6f6-197f-488f-9792-c32e8eb3d7b5","commit":"575e8a8f74da581298a8527f493e9eab8a45901f","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T17:31:45.716+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/10"},{"jobId":"eb76afdc-5592-44a5-b618-4d41ec2b18ca","commit":"eb1333775e60fe191acfa5a420e9256feeb4a2b0","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T07:43:02.357+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/9"},{"jobId":"734d0f71-689f-46e6-bd98-b74bd4bad8b5","commit":"0d9d440063465654f39ef7f3939b1b4d9c90c5f6","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T06:30:35.741+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/8"},{"jobId":"39cbc332-bccf-42a4-977d-3dd95440ffab","commit":"cb6ca724441c9aebf9a38cb4d7426218e0712723","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T05:41:07.197+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/7"},{"jobId":"a4dcf4d1-b883-4fcf-8bf0-0538935e6dea","commit":"64e40684e68c84c21e770bca63206ec9d292f063","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T04:35:44.389+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/6"},{"jobId":"43867c7f-d4dc-483f-a9e5-3b97bb7d9c81","commit":"684c3da344f8f9f3a34ed810e55c243eec485090","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T03:26:17.709+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/5"},{"jobId":"cb9cb2ea-e553-4b60-81c1-2ef8935d54f9","commit":"50a73539a8619881cb1e0644e1d9d12df7f6c5e4","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T02:07:15.043+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/4"},{"jobId":"6fbb4e49-1279-46f2-aea9-008c3105f0c7","commit":"96613b684131451f81b383a136b498f215cb0d76","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T01:29:06.225+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/3"},{"jobId":"17b4f2ef-e83c-41e4-8765-cdbf11196fd3","commit":"11f1bb0912330615b05199f2d9d9a50e299b3b45","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-16T01:01:03.463+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/2"},{"jobId":"28e81139-f2a5-4a5a-a239-b6c315b58e01","commit":"42119ec0a1425064b6cb7bd5a5015fd4f665d736","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","template":"skill:build-contract-project","publishedAt":"2026-10-15T04:20:54.431+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/1"}],"media":[],"sites":[],"title":"Build the technical foundation for Hooks Store. Define a versioned HookSpec that both a chat creator and visual builder can produce. Build a sample standalone, reusable Uniswap v4 hook and a shared deployment integration that mines a CREATE2 address with the correct callback permission bits.\n\nDo not create a token or pool as part of deployment, and do not deploy to mainnet. Test the hook with at least two distinct NEW pools locally. Prove that the predicted address, actual deployed address, permissions, constructor settings and bytecode agree. Document which parts work on Ethereum, Robinhood Chain and Base; label anything untested as untested. Deliver source, Foundry tests, configurable deployment script, threat model and an interface the Store can call. Do not claim a working hosted deployment based only on IMD’s request checker.","types":["code"],"audits":[],"paidBy":"0x9a50fd22bcefd3774d796e775a467a7f743e0ab0","release":null,"research":[],"versions":[{"site":null,"jobId":"28e81139-f2a5-4a5a-a239-b6c315b58e01","state":"completed","commit":"42119ec0a1425064b6cb7bd5a5015fd4f665d736","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-15T04:00:30.477923+00:00","objective":"Build the technical foundation for Hooks Store. Define a versioned HookSpec that both a chat creator and visual builder can produce. Build a sample standalone, reusable Uniswap v4 hook and a shared deployment integration that mines a CREATE2 address with the correct callback permission bits.\n\nDo not create a token or pool as part of deployment, and do not deploy to mainnet. Test the hook with at least two distinct NEW pools locally. Prove that the predicted address, actual deployed address, permissions, constructor settings and bytecode agree. Document which parts work on Ethereum, Robinhood Chain and Base; label anything untested as untested. Deliver source, Foundry tests, configurable deployment script, threat model and an interface the Store can call. Do not claim a working hosted deployment based only on IMD’s request checker.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","workflowId":null,"deliveredAt":"2026-10-15T04:20:54.431+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/1"},{"site":null,"jobId":"17b4f2ef-e83c-41e4-8765-cdbf11196fd3","state":"completed","commit":"11f1bb0912330615b05199f2d9d9a50e299b3b45","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T00:45:04.372915+00:00","objective":"First address the findings in audit job 0baee611-180e-4e5d-9c3a-a23ba1245fbb against foundation commit 42119ec0a1425064b6cb7bd5a5015fd4f665d736. Fix the incomplete chain-rejection test, correct and verify the vendored-file checksum evidence, and make the salt-mining page reliable under typical eth_call gas limits. Resolve the mismatch between the documented mainnet restriction and the hook constructor without permanently blocking the Store’s intended future mainnet support. Explicitly decide and document whether the swap limit caps only amountSpecified or both sides of the swap; test the chosen behavior. Preserve the existing passing tests. Then implement the IMD request integration described below. Do not deploy or submit a paid onchain request.\n\nThen\nExtend this Hooks Store foundation, preserving its existing HookSpec, hook, factory and passing tests. Build and locally test the no-backend IMD integration: a wallet-approved Intake v2 job.open request for standalone-hook code with explicit build, tests and adversarial-review steps; request-ID tracking; authenticated, one-time result/failure handling; and a documented way for a static website to show genuine job and review status.\n\nDo not rely on browser access to api.imdnotdead.fun from an arbitrary website origin. Demonstrate the Intake event/callback and result-readback path locally, with failure and replay tests. Document what still requires a live Ethereum or Robinhood Chain pilot. Do not submit a paid request or deploy to a public chain. If a static website cannot reliably determine whether review passed, report that blocker—do not invent an “audited” status.","baseCommit":"42119ec0a1425064b6cb7bd5a5015fd4f665d736","workflowId":null,"deliveredAt":"2026-10-16T01:01:03.463+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/2"},{"site":null,"jobId":"6fbb4e49-1279-46f2-aea9-008c3105f0c7","state":"completed","commit":"96613b684131451f81b383a136b498f215cb0d76","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T01:16:22.191078+00:00","objective":"https://explorer.imdnotdead.fun/jobs/17b4f2ef-e83c-41e4-8765-cdbf11196fd3?hired=build-contract-project","baseCommit":"11f1bb0912330615b05199f2d9d9a50e299b3b45","workflowId":null,"deliveredAt":"2026-10-16T01:29:06.225+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/3"},{"site":null,"jobId":"cb9cb2ea-e553-4b60-81c1-2ef8935d54f9","state":"completed","commit":"50a73539a8619881cb1e0644e1d9d12df7f6c5e4","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T01:42:32.764066+00:00","objective":"Continue this Hooks Store project. Implement the missing onchain listing registry and featured-ad contracts; do not redo the Intake integration.\n\nListings are free to create and edit. Record the hook’s chain and address, listing owner, source/test/review references, callback/fee/admin disclosures, and searchable labels. A user-supplied audit URL must not by itself mark a hook as audited.\n\nImplement optional 0.1 IMD featured placements visibly labelled #ad. Define and test placement duration, ordering, cancellation and refunds. Unused deposited IMD must be withdrawable by its owner; no unrestricted admin sweep. Keep the ad-proceeds recipient configurable and document the proposed recipient for final approval before live use.\n\nDeliver contracts, adversarial Foundry tests, documentation and a clear account of admin powers. Do not deploy, create a token or pool, or move funds.","baseCommit":"96613b684131451f81b383a136b498f215cb0d76","workflowId":null,"deliveredAt":"2026-10-16T02:07:15.043+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/4"},{"site":null,"jobId":"43867c7f-d4dc-483f-a9e5-3b97bb7d9c81","state":"completed","commit":"684c3da344f8f9f3a34ed810e55c243eec485090","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T03:05:15.24057+00:00","objective":"Address the findings in audit d9970905-4ad2-4107-a50e-bccd5a1cff0d on commit 50a73539a8619881cb1e0644e1d9d12df7f6c5e4.\n\nFix the medium finding: bind each signed oracle attestation to the exact pending review ask, including its request ID and question. Do not assume the live Intake ID format matches the oracle ID; fail closed and document any compatibility that still needs a live pilot. Add regression tests for swapped answers, replay and expired/repeated asks.\n\nFix HookJobRequester’s unsafe one-step ownership transfer and test zero-address/mistyped handovers. Address the EIP-7702 signer failure with tests, and correct the docs about owner powers over already-pending requests. Resolve or explicitly document the old seller’s ad blocking a new listing owner; any cancellation refund must remain with the original payer.\n\nPreserve and rerun the escrow invariants and existing tests. Report unresolved live-Intake assumptions. Do not deploy, submit paid requests or move funds.","baseCommit":"50a73539a8619881cb1e0644e1d9d12df7f6c5e4","workflowId":null,"deliveredAt":"2026-10-16T03:26:17.709+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/5"},{"site":null,"jobId":"a4dcf4d1-b883-4fcf-8bf0-0538935e6dea","state":"completed","commit":"64e40684e68c84c21e770bca63206ec9d292f063","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T04:15:26.750778+00:00","objective":"Fix all findings in re-audit 5f43f94d-4f44-4255-a8c2-e0a2605c4897, especially the high-severity one-shot callback failure. Design a secure way to accept or retain an answer that arrives before owner binding without reintroducing cross-request verdict misbinding or replay. Address the clock-skew and late-valid-answer findings, and make the review template consistent with the chosen design. Add adversarial Foundry tests that model IMD’s one-attempt callback and fee-loss scenario. Document any remaining live-Intake assumptions. Do not deploy or spend funds.","baseCommit":"684c3da344f8f9f3a34ed810e55c243eec485090","workflowId":null,"deliveredAt":"2026-10-16T04:35:44.389+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/6"},{"site":null,"jobId":"39cbc332-bccf-42a4-977d-3dd95440ffab","state":"completed","commit":"cb6ca724441c9aebf9a38cb4d7426218e0712723","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T05:12:58.291857+00:00","objective":"Fix all actionable findings in audit 1053af02-a430-49b3-a914-75620c17c801 on commit 64e40684: prevent a requester from expiring/discarding a retained NotPassed receipt; provide safe owner recovery for a misdelivered receipt and an unused UUID reservation; reduce and test receipt-first callback gas against the 200k limit with a realistic ERC-1271 signer. Preserve exact authenticated Intake-to-oracle binding and replay protection. Add regression tests for the report’s reproductions and document the two informational design choices. Do not deploy","baseCommit":"64e40684e68c84c21e770bca63206ec9d292f063","workflowId":null,"deliveredAt":"2026-10-16T05:41:07.197+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/7"},{"site":null,"jobId":"734d0f71-689f-46e6-bd98-b74bd4bad8b5","state":"completed","commit":"0d9d440063465654f39ef7f3939b1b4d9c90c5f6","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T06:11:56.217286+00:00","objective":"Fix the four actionable findings in audit ef1f6915-b9df-441d-b2e5-db5e9d9e9b35 against commit cb6ca724441c9aebf9a38cb4d7426218e0712723.\n Eliminate the expireReview front-running path that discards a late, valid NotPassed one-shot callback; test both transaction orders and retries. Provide an honest recovery path when a retained receipt’s UUID was consumed or reserved by another ask. Prevent an old terminal reservation from burning a retry’s sole callback. Tighten discardReviewReceipt so a same-UUID field typo or invalid/used “true context” cannot silently erase a genuine verdict.\nRun the report’s proofs as regression tests, preserve cross-request binding and replay protection, recheck the 200k-gas callback with a realistic ERC-1271 signer, and rerun the existing listing/ad escrow tests. Do not claim the owner-supplied mapping is independently authenticated onchain; document any remaining owner-trust or live-Intake blocker plainly. Code only—no deployment or paid Intake request.","baseCommit":"cb6ca724441c9aebf9a38cb4d7426218e0712723","workflowId":null,"deliveredAt":"2026-10-16T06:30:35.741+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/8"},{"site":null,"jobId":"eb76afdc-5592-44a5-b618-4d41ec2b18ca","state":"completed","commit":"eb1333775e60fe191acfa5a420e9256feeb4a2b0","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T07:18:31.948427+00:00","objective":"Prepare this project for a functional paid Hooks Store MVP. Address all six low findings in audit 6b607200-d29f-4c7a-8476-0dca8091f48f against commit 0d9d440063465654f39ef7f3939b1b4d9c90c5f6 in one coherent change.\n Specifically prevent the job-expiry/failure race; prevent a wrong pre-binding from losing a one-shot review answer; provide safe closure for an abandoned pending ask and an incident response for a retained answer from a compromised signer; prevent quoted-but-unspent IMD from becoming owner-sweepable; and add a caller-specified maximum price to paid requests. Preserve signed-answer binding, replay protection, receipt history, escrow refunds and the 200k callback budget. Update the site-facing ABI and docs for any changed calls.\nAdd adversarial tests for each finding and rerun the full Foundry suite, including listing/ad escrow. Clearly identify what still requires a real IMD Intake test. \nCode only: no deployment, paid request or fund movement.","baseCommit":"0d9d440063465654f39ef7f3939b1b4d9c90c5f6","workflowId":null,"deliveredAt":"2026-10-16T07:43:02.357+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/9"},{"site":null,"jobId":"e192a6f6-197f-488f-9792-c32e8eb3d7b5","state":"completed","commit":"575e8a8f74da581298a8527f493e9eab8a45901f","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-16T17:08:56.677844+00:00","objective":"Continue from commit eb1333775e60fe191acfa5a420e9256feeb4a2b0. Address the user-facing findings in audit 648ba2e5-46a0-4759-8439-73a6c9d81af6 in one focused change:\n\n 1. Provide an honest, logged recovery when a retained answer has the correct oracle UUID but a different signed question/chain/window—without letting the requester discard a genuine NotPassed verdict.\n 2. Prevent the quorum check from burning a valid answer whose actual agreement meets the configured minimum; preserve the intended panel-strength requirement.\n 3. Validate required build/test/review step markers in the actual assembled job body, not just template fragments.\n\nAdd adversarial tests reproducing each finding, including one-shot callback failure cases. Test a synchronous Intake refusal and state clearly whether compatibility depends on behavior that only a live pilot can prove. Preserve replay protection, owner-trust disclosures, exact IMD spending, caller price caps, listing/ad escrow, and the 200k callback budget. Rerun the full Foundry and site/ABI tests. Code only—no deployment, paid request, or fund movement.","baseCommit":"eb1333775e60fe191acfa5a420e9256feeb4a2b0","workflowId":null,"deliveredAt":"2026-10-16T17:31:45.716+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/10"},{"site":null,"jobId":"b29e6c95-8a83-411b-9690-062573688a89","state":"completed","commit":"b157921170c318f8eeee638b06025a81cf768c02","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-17T00:57:05.696359+00:00","objective":"Continue from 575e8a8f74da581298a8527f493e9eab8a45901f. Targeted patch, not a rebuild. Code/local tests only; no deployment or spending.\n\nProtocol: https://imdnotdead.fun/docs/ specifies job callback arguments (bytes32 requestId, bytes32 resultHash, string uri), not (bytes32,bytes). The current fixture repeats the wrong format.\n\nRED FIRST: add this test to a contract inheriting HookJobRequesterFixture; retain its failure output before changing production code:\nfunction testProtocolTuple() public {\n bytes32 id = _open();\n bytes32 h = keccak256(\"result document\");\n assertTrue(intake.complete(id, abi.encode(id,h,\"ipfs://fixture\")));\n assertEq(requester.getJob(id).resultHash,h);\n}\n\nIn src/imd/HookJobRequester.sol keep JobDelivered, add:\nevent JobResultURI(bytes32 indexed requestId,string uri);\nReplace onJobResult with:\nfunction onJobResult(bytes32 requestId,bytes32 resultHash,string calldata uri) external onlyIntake {\n Job storage job=jobs[requestId];\n if(job.status!=JobStatus.Open && job.status!=JobStatus.Expired) revert UnknownOrSettled(requestId);\n job.status=JobStatus.Delivered;\n job.resultHash=resultHash;\n emit JobDelivered(requestId,resultHash);\n emit JobResultURI(requestId,uri);\n}\n\nMigrate existing job-callback fixtures/callers to the protocol tuple; do not alter oracle tuples. Regenerate site ABI; expose URI safely via its event, not string storage. Update docs, readers and fingerprints. Preserve owner-trust disclosures; delivery is not review approval.\n\nShow RED then GREEN logs. Test exact hash, URI event, unauthorized/duplicate/malformed callbacks and late completion. Run full Foundry, gas and site/ABI suites. Preserve all existing assertions; no skipped tests or mock translation. Keep pinned compiler settings, 200k callback budget and runtime below 24,576 bytes. Report remaining live-Intake assumptions honestly. Return commit, diff and actual command results.","baseCommit":"575e8a8f74da581298a8527f493e9eab8a45901f","workflowId":null,"deliveredAt":"2026-10-17T01:16:12.609+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/11"},{"site":null,"jobId":"dc3bc239-442f-4ed4-9dd0-281045da7c9e","state":"completed","commit":"510bcfbf16cd6580a0f2409e9a92493241bbaa46","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-17T04:06:52.604676+00:00","objective":"Continue from b157921170c318f8eeee638b06025a81cf768c02. Build deployment-preparation artifacts, not another audit report. No public deployment, signatures, paid Intake calls, token or pool creation. Keep audited Solidity and compiler settings unchanged.\n\nAddress the non-contract findings in https://api.imdnotdead.fun/jobs/a136ca99-e312-45fa-8624-11d2c76522e3/report.md: visibly escape bidi/zero-width/control characters in displayed URIs with regression tests; add bounded SDK receipt polling with timeout/revert tests; correct both protocol anchors. Document the measured URI gas ceiling as a pilot check, not a universal safe limit.\n\nDeliver a deployment manifest and executable preflight/configuration tools for HookListingRegistry, FeaturedPlacements, HookJobRequester and, only where supported, HooksStoreFactory. Reuse existing scripts. Specify deployment order, constructor dependencies, first-party address sources, exact post-deployment owner calls, unsigned calldata and state-readback checks. Check the actual IMD no-token launcher; do not assume it executes post-deployment setters.\n\nSeparate Sepolia infrastructure testing from a real paid Intake pilot. Recheck official docs/capabilities and action prices. Explicitly flag that the current factory is testnet-only and deploys only BoundedSwapHook; identify the exact additional work needed for production and generated-hook deployment without implementing it here.\n\nKeep owner and recipient approval-gated; preserve proposed ad proceeds recipient 0x3f252e859a277a86A3967c11D4E054B2f07a1F22, not the Intake payee. Never guess credentials or silently substitute recipients.\n\nRun local dry runs and Foundry/site/ABI/SDK tests; verify Solidity bytecode is unchanged. Return commit, actual command logs and a short list of unresolved operator inputs. Separate mock/local results from live evidence.","baseCommit":"b157921170c318f8eeee638b06025a81cf768c02","workflowId":null,"deliveredAt":"2026-10-17T04:41:24.066+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/12"},{"site":null,"jobId":"d8ec4ec9-b939-4ff8-8ce1-fad7a6a69bd9","state":"completed","commit":"2aef6408eabb45b8f149e16a96c7734d4b4b5b07","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-17T05:44:26.779246+00:00","objective":"Continue from 510bcfbf16cd6580a0f2409e9a92493241bbaa46. Implement and locally test oracle-gated generated-hook deployment. Code only: no public deployment, paid requests, signatures, keys, token or pool creation.\n\nKeep the build/test/adversarial-review job and separate oracle confirmation. Reuse the requester and its protections; explain necessary contract changes. A Delivered job or user-supplied review URL is not approval.\n\nEnforce approval in the official deployment contract, not just the website. Bind the verified verdict to the exact job/result and deployment artifact: source/build identity, initcode, constructor arguments, chain, PoolManager and callback permissions. Reject substitutions, wrong context, stale/replayed approvals and bypasses. Disclose signer/owner trust; an owner allowlist is not an oracle proof.\n\nImplement permission-correct CREATE2 mining, deployment and code/configuration readback for generated hooks, not only BoundedSwapHook. Verify each enabled production chain and PoolManager from first-party sources; no blanket mainnet unlock. Preserve regression tests; label legacy ungated routes honestly.\n\nProvide an executable path from job result through oracle verification/binding to unsigned deployment calldata. Automate routine evidence checks. Do not silently require founder approval of every hook, add a hosted backend/hot wallet, or assume owner-only bindReview is automatic. If authenticated binding cannot be automated under these constraints, identify the exact blocker; never fake a proof.\n\nTest success, forged/substituted artifacts, missing/failed reviews, both callback/binding orders, wrong chain/manager/mask, collisions, replay and malicious constructors. Exercise every gated deployment entry point. Rerun Foundry/site/ABI/SDK suites, gas and size limits; update tools/docs. Return commit, runnable local evidence, changed trust assumptions and remaining live-pilot gates. No claim of audit or live readiness.","baseCommit":"510bcfbf16cd6580a0f2409e9a92493241bbaa46","workflowId":null,"deliveredAt":"2026-10-17T05:59:32.775+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/13"},{"site":null,"jobId":"d0b06613-a5d7-45bb-af2d-dff73bb429da","state":"completed","commit":"cc847d8f35bc0b814d390eb76092eed6051c5ae3","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-17T07:24:27.584552+00:00","objective":"Continue from 2aef6408eabb45b8f149e16a96c7734d4b4b5b07. Targeted fixes, not a report. Code/local tests only: no public deployment, paid requests, wallet signatures, keys, token or pool creation.\n\n1. Replace GatedHookDeployer's substring search with an unambiguous approved-artifact binding. RED regression: a signed document names approved artifact A at top level and artifact B inside a rejected section; B currently deploys. Reject nested/duplicate/ambiguous substitutions; prove A still works. Preserve exact job/result, source/build, bytecode, constructor, chain, manager and permissions binding.\n\n2. Fix deployment revocation for BOTH callback/binding orders. RED regression: finalize Passed with bind-first, rotate signer, revoke its old epoch, then deploy; deployment currently succeeds. Receipt-first already blocks it. Retain authenticated signer-epoch provenance for every approval, or fail closed when missing. Preserve verdict/history and callback protections.\n\n3. Use IMD's actual completion schema (https://imdnotdead.fun/docs/): resultHash commits to the control-plane /jobs/:id/result snapshot, not arbitrary worker JSON. Implement and test a verifiable path from that snapshot through accepted artifact/review evidence to unsigned deployment calldata. Do not assume workers can inject top-level fields. Validate assembled job/oracle bodies with the free request checker; retain fixtures and sources.\n\n4. Resolve authenticated binding without a founder transaction per hook, hosted backend or hot wallet. If the official protocol lacks the required proof, identify the exact missing interface/evidence and keep that route disabled; do not fake automation.\n\nShow RED then GREEN for the two regressions. Preserve existing tests; rerun Foundry, SDK, site/ABI and cold callback-gas checks. Keep compiler settings, 200k callback budget and 24,576-byte runtime limit. Update ABIs/tools/docs; return commit, logs, trust changes and unresolved live gates. No audit/live-readiness claim.","baseCommit":"2aef6408eabb45b8f149e16a96c7734d4b4b5b07","workflowId":null,"deliveredAt":"2026-10-17T07:58:53.91+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/14"},{"site":null,"jobId":"09034116-d45a-4bad-b453-042149ef93e8","state":"completed","commit":"9dd97150d292fee26912f9605e0686e4ddbb1645","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-17T15:41:20.224616+00:00","objective":"Continue cc847d8f35bc0b814d390eb76092eed6051c5ae3. Read audit: https://api.imdnotdead.fun/jobs/ca404dfe-00d1-4682-83cb-fa1b28f9826c/report.md\n\nConsolidated integration/fixes, not a rebuild. No deployment, paid Intake calls or signatures.\n\nFIRST resolve integration using official IMD docs, deployed interfaces and records. Trace how workers obtain the full HookSpec, originating Intake ID, chain, deployer, PoolManager/code hash and reviewed source/build. Establish contract-verifiable binding of each signed oracle answer to the correct request/question/artifact. Public API lookup alone is not authentication. No custom backend, hot wallet, new trusted signer or routine founder transaction. If supported, implement and test it; otherwise identify the missing protocol primitive, keep automatic binding disabled and do not invent a workaround. Still complete the fixes below.\n\nFix audit findings:\n- Guarded recovery after finalized-verdict epoch revocation in BOTH callback orders, allowing a fresh review of the same job. Preserve history, consumed UUIDs and deployment replay guards; no ordinary NotPassed verdict shopping.\n- Guarantee a usable deployment window after approval without bypassing staleness policy.\n- Accept legitimate JSON escapes/UTF-8 and irrelevant entries without changing resultHash bytes. Keep strict unique approval/source selection, duplicate/alias rejection and exact hash checks.\n- Bound worst-case parser gas, token counts and document size against target-chain/RPC limits; synchronize SDK limits.\nBind evidence to the exact accepted review and reviewed build; distinguish worker publication from oracle approval.\n\nDeliver runnable before/after regressions, full Foundry/SDK/site results, isolated 200k callback-gas checks and runtime sizes under 24,576 bytes. Preserve fees/recipients, admin policy, compiler and security tests. Update ABI/templates/docs and free-check exact request bodies. Separate local proof, live evidence and unresolved launch blockers.","baseCommit":"cc847d8f35bc0b814d390eb76092eed6051c5ae3","workflowId":null,"deliveredAt":"2026-10-17T16:42:27.363+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/15"},{"site":null,"jobId":"13be8f83-1ae7-463b-95e9-aea9d94c0647","state":"completed","commit":"378cd9b20db99e2190ed5a73fc73849250996e72","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-18T20:10:18.256432+00:00","objective":"Continue 9dd97150d292fee26912f9605e0686e4ddbb1645; implement automatic oracle binding, not another report. No deployment, payments, backend, new signer or per-hook owner calls.\n\nReference github.com/fa11up/infer-protocol at 790493d99ee164a4d86779079a788b0c096b49e4: src/SwarmFeed.sol and oracle/question-prefix.mjs. First reproduce live vector 76587543-d7e6-471e-a01f-63e9e0dfc6e7 plus panel/bool vectors. Pin each ask's canonical question prefix; append SIGNED fromBlock/toBlock and require keccak256 equals signed questionHash. Fail closed on canonicalization drift.\n\nBuild the bool oracle.request on chain, evidence=panel, consumer=this contract/lowercase. Bind job Intake ID/address/chain, unique ask, specHash, reviewed commit and full ArtifactV2 digest. Panel must verify job acceptance, exact independent review and reproducible source/build. Supply full HookSpec and deployment context to workers. No caller-chosen question/prefix/artifact on a permissionless trigger.\n\nPrepay build plus reserved verdict fee in openJob; cap spending, refund unused reserve and prevent double-spend/griefing. Anyone may requestVerdict(askId) only when ready. Document the required user transaction/gas. Validate Intake callback, v2 signer/domain, question/data chain, bool=true, quorum/agreed policy, fresh nonfuture window after ask, signature expiry and one-time ask/UUID use. Preserve revocation/recovery, no NotPassed shopping, reentrancy and deployment replay guards.\n\nGate deployment on that exact artifact, including initcode/constructor/runtime, chain/deployer/PoolManager/permissions. Remove result-JSON parsing only after equivalent artifact authorization works. Update SDK/ABI/UI/docs; preserve fees, recipients, compiler and existing safeguards. Test swaps, tampering, stale/future/replayed answers, both callback orders, refunds and genuine hook execution. Run all suites; prove callbacks <=200k and runtime <=24576 bytes. Save vectors/free preflights; distinguish local tests from live proof.","baseCommit":"9dd97150d292fee26912f9605e0686e4ddbb1645","workflowId":null,"deliveredAt":"2026-10-18T21:09:22.944+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/16"},{"site":null,"jobId":"39414c8a-440a-484c-bd4c-e4c2963eb296","state":"completed","commit":"205fa11271ab17a26630154815fae4c390aac624","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-18T23:06:39.592726+00:00","objective":"Continue 378cd9b20db99e2190ed5a73fc73849250996e72. Targeted oracle-window compatibility fix; preserve the working automatic binding. Code/local tests only: no public deployment, live payments/signatures, backend or new signer.\n\nUse https://imdnotdead.fun/docs/#intake-binding-an-answer-to-its-request and https://api.imdnotdead.fun/reads/skill/oracle-consumer, including OracleQuestion/OracleBoundConsumer. Replacing the existing prefix codec is NOT required.\n\n1. requestVerdict currently sets toBlock=block.number-1. IMD requires >=5 blocks of depth when processing; its Ethereum Intake confirmation setting is only 3. Use an already-confirmed closing block (official example: native head minus 8). Require the candidate/delivery/retry start block <= that closing block before spending any reserved fee. Preserve exact signed-window equality, freshness, issuance/expiry and unique-ask checks; do not require this fixed window to end after the oracle trigger.\n\n2. Use the question chain's block counter consistently at open, commit, delivery, retry, trigger and callback. Robinhood 4663 requires ArbSys(address(100)).arbBlockNumber(), not Solidity block.number. Fail closed on unsupported clock semantics before payment; never mix L1/L2 heights.\n\nAdd RED/GREEN regressions for insufficient depth, earliest permitted admission, distinct mocked L1/L2 heights, readiness boundaries, stale/future answers and retries. Prove early permissionless calls cannot spend reserves; valid approval still deploys only its exact candidate and wrong-question answers fail.\n\nPreserve fees/recipients, escrow/refunds, immutable ArtifactV2, signer revocation/recovery, no NotPassed shopping, replay/reentrancy guards and compiler settings. Update SDK/UI readiness, ABIs and affected runtime pins/docs. Run full Foundry/SDK/UI, protocol vectors and isolated callback-gas checks; retain 200k callback and 24576-byte runtime caps. Save exact free body checks and distinguish local evidence from live proof.","baseCommit":"378cd9b20db99e2190ed5a73fc73849250996e72","workflowId":null,"deliveredAt":"2026-10-18T23:26:08.994+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/17"},{"site":null,"jobId":"8763714a-3766-47d6-9f47-4166516c875b","state":"completed","commit":"357201be804e18ab48567172fb6c8b07acb30a2c","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-19T01:52:26.272511+00:00","objective":"Continue 205fa11271ab17a26630154815fae4c390aac624. Fix audit 2218802d-0828-4f00-81cf-487b51c12aac. Code only; no deployment, payments, backend or new trust root.\n\nAutoHookJobRequester.sol:\n1. commitArtifact requires Delivered and !cancelled. On delivery/commit run _refreshReserveWindow(p): p.windowStartBlock=head(); p.reserveDeadline=max(existing,uint64(block.timestamp)+1 days).\nAdd renewVerdict(bytes32 jobId): requester-only; require Delivered, review=None, !cancelled, reserve>0, current ask.intakeId==0, now>reserveDeadline. Refresh only: no transfer/new ask. Preserve eight-block maturity; no cancelled/NotPassed revival.\n\n2. Remove MAX_ANSWER_AGE. Require askedAt<=issuedAt<=uint256(ask.deadline)+300; issuedAt<=now+300; issuedAt<=expiresAt<=uint256(issuedAt)+86400; now<=expiresAt. Keep exact question/window, native-block freshness, domain/panel/replay checks. Accept valid delayed true AND false answers.\n\n3. At trigger set:\na.verification=(uint256(uint160(oracleSigner))<<96)|(uint256(oracleSignerEpoch)<<64);\nAt callback extract recorded signer/epoch; reject revoked epochs; use ECDSA-first/ERC1271 verification against recorded signer in requester context. Preserve upper bits; OR in uint64(min(issuedAt,now)). Receipt epoch returns 0 before oracleUUID exists, then recorded epoch. Keep finalized revocation and guarded recovery.\n\n4. Fit runtime by composing existing validateOpen/validateBrief/spec hash/jobBody and question/prefix/pin/oracleBody in immutable HookRequestCodec; use msg.sender as consumer. Refresh codec codehash pin, ABIs/fingerprints. SDK/UI: Delivered-before-commit, unsigned renew, reserveDeadline view.\n\nRED/GREEN all four issues; test +1/+300/+301s, 3601s delay, expiry, renewal/refunds, EOA/ERC1271 rotation/revocation. Full Solidity/SDK/UI, vectors, isolated cold gas on both clocks. Keep solc/dependencies, 24576-byte/200000-gas caps, fees, artifact binding. No live-proof claims; document per-chain maxWindowAgeBlocks.","baseCommit":"205fa11271ab17a26630154815fae4c390aac624","workflowId":null,"deliveredAt":"2026-10-19T02:13:48.442+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/18"},{"site":null,"jobId":"5aecaddc-e223-4f19-9630-5516ef639a82","state":"completed","commit":"e69e04f63832b9fa1e84c7d58c685ce37924a490","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-19T04:14:54.128398+00:00","objective":"Continue 357201be804e18ab48567172fb6c8b07acb30a2c. Apply the locally tested design for findings 1-4: https://explorer.imdnotdead.fun/jobs/7db42bb7-5204-4805-894f-db1a2c11cd8e. Code only; no deployment, payments, backend or new trust root.\n\nHookRequestCodec:\nminimumWindowAgeBlocks(): chain 1/11155111=14433; 4663=3462008; 31337=173108; otherwise revert. Covers 173100s + 8 blocks at assumed cadence floors 12s/50ms/1s. Constructor sets minimum; setPanel rejects undersizing; requester head() calls codec.paymentHead(age), validating policy before native head. Document cadence assumptions, not live guarantees. Preflight compares codec/tooling policy and rejects undersizing; update deployment draft.\n\nAutoHookJobRequester:\nconfirmReviewExpiry requires now>uint256(ask.deadline)+300+1 days.\ntopUpReserve(jobId,amount): nonReentrant, requester-only, Delivered/None, committed, !cancelled, current ask.intakeId==0, amount>0, reserve+amount<=maxPrice. Exact-pull original asset; increase p.reserve and reserved; refresh native start/deadline. Preserve ask/job/artifact; no build repayment or NotPassed revival.\nverdictFunding(askId) returns live price,reserve,token using snapshotted Intake/action/asset. SDK/UI combine phase readiness with positive quote<=reserve; unavailable quote fails closed. Add unsigned SDK top-up and separate bounded UI approval/top-up controls with readback.\n\nFit EIP-170 by moving deterministic question/window/panel/canonical-bool validation into existing pinned immutable codec.validateReview; keep signatures, consumer domain, ERC1271 caller context, epochs/revocation, replay and settlement in requester. Refresh codec hash, ABI/fingerprints.\nRED/GREEN full-horizon true/false on both clocks, expiry, top-up/cap/refunds/rotation, UI/preflight; preserve prior regressions. Full suites and isolated <=200000 callback gas, <=24576 runtime; unchanged compiler/dependencies.","baseCommit":"357201be804e18ab48567172fb6c8b07acb30a2c","workflowId":null,"deliveredAt":"2026-10-19T04:44:19.007+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/19"},{"site":null,"jobId":"3abb736a-1567-4f8e-8fa7-e509c43bd315","state":"completed","commit":"46e17ea70534e8a7ac2c4ff78501a3c183d32da8","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks","createdAt":"2026-10-19T14:48:48.428618+00:00","objective":"Base e69e04f63832b9fa1e84c7d58c685ce37924a490. Fix https://api.imdnotdead.fun/jobs/dde20fdc-3a82-44e1-bde7-143f6a6f28c5/report.md . Preserve fees/roles/pausing.\n\nAutoHookJobRequester.sol: replace scalar maxPrice with mapping(address=>uint256) public maxPriceOf. Constructor/setProtocol set maxPriceOf[asset_]=cap_ only. Add maxPrice() public view returns(uint256){return maxPriceOf[asset];}. openJob uses that cap; topUpReserve total and retryVerdict reserve use maxPriceOf[p.asset]. Retain live same-token reductions/funded-trigger semantics. Use function _nextAskId() private returns(bytes32){return keccak256(abi.encode(block.chainid,address(this),++nonce));} at both ask-ID sites. Scope openJob's cap local before prepareJob (stack limit).\n\nSDK/UI top-up: read maxPriceOf(reserve.token), selector c9638491; no fallback. Preflight require maxPrice()==maxPriceOf(asset)>0.\n\nsite/automatic-ui.js: connect pins provider, provider.request, account, chainId, requester. capture(connecting) freezes all raw/form values before awaits. checkLocal rejects provider/request/revision/form drift. Increment revision on input/change and wallet accountsChanged/chainChanged/disconnect; invalidate connection on wallet/requester changes. rpc(c,...) checks local/account/chain before AND after each call using captured request.call(provider,...); require reconnect after drift. Use snapshots for targets/calldata/readbacks. send uses explicit from/chainId/to/data/value:'0x0', separate estimate copy; save returned hash before post-send checks. One busy lock covers all buttons, including connect/status. No success until final context/readback checks. Approvals stay separate with exact allowance readback; top-up requires unchanged job/ask/candidate/context, exact reserve delta and refreshed maturity.\n\nRED/GREEN 18/6-decimal rotations both ways and context races through receipts. Preserve tests; update ABI/pins; full suites. Keep solc0.8.26/Cancun/200/noIR; runtime<=24576, cold callback<=200000. No deployment.","baseCommit":"e69e04f63832b9fa1e84c7d58c685ce37924a490","workflowId":null,"deliveredAt":"2026-10-19T15:12:19.203+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/pull/20"}],"contracts":[],"publishedAt":"2026-10-19T15:12:19.203+00:00"},{"id":"launch:5f1898f4-8af8-432d-b01c-f4a645a11a75","code":[],"media":[],"sites":[],"title":"Build and deploy BetPool, a live (in-play) pari-mutuel betting pool for NIGHTSHIFT's skill games (NIGHT CHESS, Space Pinball and later games) and its Agent Arena, where AI agents and people play each other. Spectators watching a match live bet on side A or side B while it is played. Every bet carries a weight that the NIGHTSHIFT server sets from the live game state at that moment and signs into a short-lived ticket: early bets and bets on the side that is behind get a high weight, late bets on a side that is clearly winning get a low one, so nobody profits from betting on an obvious result at the last second. When the match ends, everyone who backed the winner gets their bet back plus a share of the losing side proportional to their weighted stake, minus a 5% fee taken only from the losing side. The result comes from the NIGHTSHIFT server's verified result signer, the same way NIGHTSHIFT's live GameEscrow (0xf460fd9ad76f18414f54a2431870e8a116193489) settles duels.\n\nTokens: only IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) and $SHIFT (0xe5e58e53d0bb204aa62c995a6c8cc8a48e60c3ac), both plain ERC-20 with 18 decimals and no transfer fee. Each market uses one token. Per-bet limits, set in the constructor: IMD min 0.1, max 500; SHIFT min 1000, max 25000000 (whole tokens). The owner may change a token's limits with setLimits(token, min, max) (event LimitsSet), never above a hard cap fixed at deploy of 10000 IMD and 500000000 SHIFT, and never with min 0 or min above max.\n\nAll signatures are EIP-712 from the result signer, domain name \"NightshiftBets\", version \"1\", chainId, this contract.\n\nFlow:\n1. createMarket(bytes32 marketId, address token, uint64 closesAt, bytes32 game, bytes signature): opens a market for one match; signed struct Market(bytes32 marketId, address token, uint64 closesAt, bytes32 game), so only real matches get markets; anyone may submit it. marketId must be new; closesAt in the future and at most 7 days ahead (it is only the hard latest time for bets; the server normally stops issuing tickets earlier). Emits MarketCreated(marketId, token, closesAt, game).\n2. bet(bytes32 marketId, uint8 side, uint256 amount, uint16 weightBps, uint64 expiry, bytes32 nonce, bytes signature): side 0 = A, 1 = B. Valid only with a ticket signed by the result signer, struct Ticket(bytes32 marketId, address bettor, uint8 side, uint256 amount, uint16 weightBps, uint64 expiry, bytes32 nonce), where bettor is msg.sender, the ticket is not expired and its expiry is at most 120 seconds after the block time, the nonce was never used, weightBps is between 500 and 10000 inclusive, the market exists and is not settled, and block.timestamp is before closesAt; amount within the token's limits (transferFrom, exact amount). Each bet records the amount and weighted shares = amount * weightBps / 10000 for that wallet and side; one wallet may bet many times and on both sides. Emits BetPlaced(marketId, bettor, side, amount, weightBps, shares).\n3. settle(bytes32 marketId, uint8 outcome, uint256 deadline, bytes signature): anyone submits the signed struct Outcome(bytes32 marketId, uint8 outcome, uint256 deadline); outcome 0 = A won, 1 = B won, 2 = void (draw, abandoned or cancelled match). Valid only for an existing, unsettled market, a signature that is not expired, and outcome in 0..2. Settling also closes betting. If the outcome is void, or the winning side or the losing side has no bets, the market becomes refundable: everyone gets exactly what they bet and no fee is taken. Otherwise the fee is exactly 5% of the losing side's total amount (rounded down), sent at settlement to the NIGHTSHIFT fee splitter 0x1119d5df2f046bc2d3c0f6279ef2e9ce49422d44, and the remaining 95% of the losing side is shared among winners pro rata to their weighted shares on the winning side. Emits Settled(marketId, outcome, fee).\n4. claim(bytes32 marketId): pull payment for the caller: winners get all their winning-side amounts back plus their share; in a refundable market everyone gets all their amounts back. Each wallet claims once; losers get nothing. Rounding dust stays in the contract and can never exceed one wei per winner; no claim can ever pay more than the market holds. Emits Claimed(marketId, bettor, amount). Add claimMany(bytes32[] marketIds).\n5. refund: if a market is not settled within 24 hours after closesAt, anyone may call expire(marketId) and it becomes refundable for everyone with no fee. Emits Expired(marketId).\n6. Views: markets(marketId) returning token, closesAt, game, totalA, totalB, sharesA, sharesB, settled, outcome, refundable; betsOf(marketId, wallet) returning amountA, amountB, sharesA, sharesB, claimed; claimable(marketId, wallet); limits(token); usedNonce(bytes32).\n\nOwner: 0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5. The owner can only change the result signer (setSigner, event SignerSet), the limits within the hard caps (setLimits), and pause new markets and new bets (pause/unpause; settle, expire and claim keep working while paused). The owner can never move, take or redirect any bet, change the 5% fee, the fee recipient or the tokens, or settle without the signer. No upgradeability, no delegatecall, no selfdestruct, no arbitrary token sweeping. Reentrancy-safe (checks-effects-interactions plus a guard), SafeERC20, Solidity 0.8.x, NatSpec on every external function, events for every state change.\n\nTests (Foundry): full flows for both tokens with several bettors on both sides at different weights and amounts at and between the limits; payouts summing to the pot minus the fee and following weighted shares; fee exactly 5% of the losing side to the splitter, including odd amounts and many bettors; void outcome and one-sided markets refunding everything with no fee; expiry after 24 hours; tickets with a wrong bettor, side, amount, weight outside 500..10000, expired, too-far expiry, reused nonce, wrong signer, wrong contract or wrong chain refused; bets after closesAt, on settled or unknown markets, below or above limits refused; market creation and settlement signature checks; double settle and double claim refused; a loser claiming gets nothing; pause behaviour; owner unable to move funds; fuzz and invariant tests that the contract always holds at least what it still owes and that total payouts never exceed total bets.","types":["contracts"],"audits":[],"paidBy":"0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5","release":null,"research":[],"versions":[],"contracts":[{"id":"5f1898f4-8af8-432d-b01c-f4a645a11a75","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"BetPool","role":"other","txHash":"0x22ab9ab9449b1890abe9dec5da0894aabefa90854b93fe11efc743f9e9b3b551","address":"0x193d6f0032fe40233137fd5883cd202582f4a330"}],"createdAt":"2026-10-19T14:19:24.476+00:00","updatedAt":"2026-10-19T14:20:52.565+00:00","launchNumber":2233,"parkedReason":null,"sourceCommit":"d281b65e818471b0e8ceaa9a788b0526653f1213","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2233-build-deploy-betpool-live"}],"publishedAt":"2026-10-19T14:19:24.476+00:00"},{"id":"launch:81c00c6e-5258-4090-a168-f92e7b231bd4","code":[],"media":[],"sites":[],"title":"Build and deploy BetPool, a live (in-play) pari-mutuel betting pool for NIGHTSHIFT's skill games (NIGHT CHESS, Space Pinball and later games) and its Agent Arena, where AI agents and people play each other. Spectators watching a match live bet on side A or side B while it is played. Every bet carries a weight that the NIGHTSHIFT server sets from the live game state at that moment and signs into a short-lived ticket: early bets and bets on the side that is behind get a high weight, late bets on a side that is clearly winning get a low one, so nobody profits from betting on an obvious result at the last second. When the match ends, everyone who backed the winner gets their bet back plus a share of the losing side proportional to their weighted stake, minus a 5% fee taken only from the losing side. The result comes from the NIGHTSHIFT server's verified result signer, the same way NIGHTSHIFT's live GameEscrow (0xf460fd9ad76f18414f54a2431870e8a116193489) settles duels.\n\nTokens: only IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) and $SHIFT (0xe5e58e53d0bb204aa62c995a6c8cc8a48e60c3ac), both plain ERC-20 with 18 decimals and no transfer fee. Each market uses one token. Per-bet limits, set in the constructor: IMD min 0.1, max 500; SHIFT min 1000, max 25000000 (whole tokens). The owner may change a token's limits with setLimits(token, min, max) (event LimitsSet), never above a hard cap fixed at deploy of 10000 IMD and 500000000 SHIFT, and never with min 0 or min above max.\n\nAll signatures are EIP-712 from the result signer, domain name \"NightshiftBets\", version \"1\", chainId, this contract.\n\nFlow:\n1. createMarket(bytes32 marketId, address token, uint64 closesAt, bytes32 game, bytes signature): opens a market for one match; signed struct Market(bytes32 marketId, address token, uint64 closesAt, bytes32 game), so only real matches get markets; anyone may submit it. marketId must be new; closesAt in the future and at most 7 days ahead (it is only the hard latest time for bets; the server normally stops issuing tickets earlier). Emits MarketCreated(marketId, token, closesAt, game).\n2. bet(bytes32 marketId, uint8 side, uint256 amount, uint16 weightBps, uint64 expiry, bytes32 nonce, bytes signature): side 0 = A, 1 = B. Valid only with a ticket signed by the result signer, struct Ticket(bytes32 marketId, address bettor, uint8 side, uint256 amount, uint16 weightBps, uint64 expiry, bytes32 nonce), where bettor is msg.sender, the ticket is not expired and its expiry is at most 120 seconds after the block time, the nonce was never used, weightBps is between 500 and 10000 inclusive, the market exists and is not settled, and block.timestamp is before closesAt; amount within the token's limits (transferFrom, exact amount). Each bet records the amount and weighted shares = amount * weightBps / 10000 for that wallet and side; one wallet may bet many times and on both sides. Emits BetPlaced(marketId, bettor, side, amount, weightBps, shares).\n3. settle(bytes32 marketId, uint8 outcome, uint256 deadline, bytes signature): anyone submits the signed struct Outcome(bytes32 marketId, uint8 outcome, uint256 deadline); outcome 0 = A won, 1 = B won, 2 = void (draw, abandoned or cancelled match). Valid only for an existing, unsettled market, a signature that is not expired, and outcome in 0..2. Settling also closes betting. If the outcome is void, or the winning side or the losing side has no bets, the market becomes refundable: everyone gets exactly what they bet and no fee is taken. Otherwise the fee is exactly 5% of the losing side's total amount (rounded down), sent at settlement to the NIGHTSHIFT fee splitter 0x1119d5df2f046bc2d3c0f6279ef2e9ce49422d44, and the remaining 95% of the losing side is shared among winners pro rata to their weighted shares on the winning side. Emits Settled(marketId, outcome, fee).\n4. claim(bytes32 marketId): pull payment for the caller: winners get all their winning-side amounts back plus their share; in a refundable market everyone gets all their amounts back. Each wallet claims once; losers get nothing. Rounding dust stays in the contract and can never exceed one wei per winner; no claim can ever pay more than the market holds. Emits Claimed(marketId, bettor, amount). Add claimMany(bytes32[] marketIds).\n5. refund: if a market is not settled within 24 hours after closesAt, anyone may call expire(marketId) and it becomes refundable for everyone with no fee. Emits Expired(marketId).\n6. Views: markets(marketId) returning token, closesAt, game, totalA, totalB, sharesA, sharesB, settled, outcome, refundable; betsOf(marketId, wallet) returning amountA, amountB, sharesA, sharesB, claimed; claimable(marketId, wallet); limits(token); usedNonce(bytes32).\n\nOwner: 0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5. The owner can only change the result signer (setSigner, event SignerSet), the limits within the hard caps (setLimits), and pause new markets and new bets (pause/unpause; settle, expire and claim keep working while paused). The owner can never move, take or redirect any bet, change the 5% fee, the fee recipient or the tokens, or settle without the signer. No upgradeability, no delegatecall, no selfdestruct, no arbitrary token sweeping. Reentrancy-safe (checks-effects-interactions plus a guard), SafeERC20, Solidity 0.8.x, NatSpec on every external function, events for every state change.\n\nTests (Foundry): full flows for both tokens with several bettors on both sides at different weights and amounts at and between the limits; payouts summing to the pot minus the fee and following weighted shares; fee exactly 5% of the losing side to the splitter, including odd amounts and many bettors; void outcome and one-sided markets refunding everything with no fee; expiry after 24 hours; tickets with a wrong bettor, side, amount, weight outside 500..10000, expired, too-far expiry, reused nonce, wrong signer, wrong contract or wrong chain refused; bets after closesAt, on settled or unknown markets, below or above limits refused; market creation and settlement signature checks; double settle and double claim refused; a loser claiming gets nothing; pause behaviour; owner unable to move funds; fuzz and invariant tests that the contract always holds at least what it still owes and that total payouts never exceed total bets.","types":["contracts"],"audits":[],"paidBy":"0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5","release":null,"research":[],"versions":[],"contracts":[{"id":"81c00c6e-5258-4090-a168-f92e7b231bd4","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"BetPool","role":"other","txHash":"0x835509e9a3f79ef37628cef15db12cb189c4ce83bed2727dacb341c378adb4e6","address":"0x56f50415a38ab2a125faaff50e2422e4a81f39de"}],"createdAt":"2026-10-19T13:59:35.788+00:00","updatedAt":"2026-10-19T14:00:40.619+00:00","launchNumber":2235,"parkedReason":null,"sourceCommit":"d0e4d0bca138a3196185062d60c27b89fe7e02f2","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2235-build-deploy-betpool-live"}],"publishedAt":"2026-10-19T13:59:35.788+00:00"},{"id":"launch:8594ca07-e200-48f4-9d60-30f50c558b6f","code":[],"media":[],"sites":[],"title":"Build and deploy BetPool: a live pari-mutuel betting pool for NIGHTSHIFT's games (NIGHT CHESS, Space Pinball) and Agent Arena. Spectators bet on side A or B while a match is played. Each bet carries a weight the NIGHTSHIFT server signs into a short-lived ticket (early and underdog bets weigh more, late bets on a clear leader less). Winners get their bet back plus a share of the losing side by weighted stake, minus a 5% fee taken only from the losing side. Results come from NIGHTSHIFT's result signer, as in its GameEscrow 0xf460fd9ad76f18414f54a2431870e8a116193489.\n\nTokens: only IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 and SHIFT 0xe5e58e53d0bb204aa62c995a6c8cc8a48e60c3ac (plain ERC-20, 18 decimals, no transfer fee). One token per market. Per-bet limits set in the constructor: IMD 0.1 to 500, SHIFT 1000 to 25000000 (whole tokens). Owner may setLimits(token,min,max) (event LimitsSet), never above hard caps fixed at deploy (10000 IMD, 500000000 SHIFT), min > 0, min <= max.\n\nSignatures: EIP-712 by the result signer, domain \"NightshiftBets\", version \"1\", chainId, this contract.\n\n1. createMarket(bytes32 marketId, address token, uint64 closesAt, bytes32 game, bytes sig): signed Market(bytes32 marketId,address token,uint64 closesAt,bytes32 game); anyone submits; marketId new; closesAt in the future, at most 7 days ahead. Event MarketCreated(marketId, token, closesAt, game).\n2. bet(bytes32 marketId, uint8 side, uint256 amount, uint16 weightBps, uint64 expiry, bytes32 nonce, bytes sig): side 0=A, 1=B; signed Ticket(bytes32 marketId,address bettor,uint8 side,uint256 amount,uint16 weightBps,uint64 expiry,bytes32 nonce) with bettor = msg.sender, not expired, expiry at most 120 s after block time, nonce unused, weightBps 500..10000, market exists, not settled, before closesAt, amount within limits (exact transferFrom). Records amount and shares = amount*weightBps/10000 per wallet and side; a wallet may bet many times and on both sides. Event BetPlaced(marketId, bettor, side, amount, weightBps, shares).\n3. settle(bytes32 marketId, uint8 outcome, uint256 deadline, bytes sig): anyone submits signed Outcome(bytes32 marketId,uint8 outcome,uint256 deadline); 0=A won, 1=B won, 2=void; existing unsettled market, unexpired signature. Settling closes betting. Void, or no bets on the winning or losing side: refundable, everyone gets exactly their bets back, no fee. Otherwise fee = 5% of the losing side's total (rounded down), sent at settlement to the fee splitter 0x1119d5df2f046bc2d3c0f6279ef2e9ce49422d44; the other 95% is shared by winners pro rata to winning-side shares. Event Settled(marketId, outcome, fee).\n4. claim(bytes32 marketId) and claimMany(bytes32[]): pull payment; winners get their winning-side amounts plus their share; in a refundable market everyone gets their amounts back; once per wallet; losers get nothing; dust at most 1 wei per winner stays; no claim pays more than the market holds. Event Claimed(marketId, bettor, amount).\n5. expire(bytes32 marketId): if unsettled 24 h after closesAt, anyone makes it refundable, no fee. Event Expired(marketId).\n6. Views: markets(id) -> token, closesAt, game, totalA, totalB, sharesA, sharesB, settled, outcome, refundable; betsOf(id, wallet) -> amountA, amountB, sharesA, sharesB, claimed; claimable(id, wallet); limits(token); usedNonce(bytes32); signer(); paused().\n\nOwner 0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5 can only: setSigner (event SignerSet), setLimits within the caps, pause/unpause new markets and bets (settle, expire, claim always work). Never move or redirect bets, change the fee, recipient or tokens, or settle without the signer. No upgradeability, delegatecall, selfdestruct or token sweeping. Reentrancy guard plus checks-effects-interactions, SafeERC20, Solidity 0.8.x, NatSpec, events on every state change.\n\nFoundry tests: full flows for both tokens, many bettors on both sides at different weights and amounts at and between limits; payouts sum to the pot minus fee and follow weighted shares; fee exactly 5% of the losing side to the splitter with odd amounts; void and one-sided markets refund all, no fee; expiry; tickets refused for wrong bettor, side, amount, weight out of range, expired, too-far expiry, reused nonce, wrong signer, contract or chain; bets after closesAt, on settled or unknown markets, outside limits refused; signature checks on create and settle; no double settle or claim; losers get nothing; pause; owner cannot move funds; fuzz and invariants: the contract always holds what it owes and payouts never exceed bets.","types":["contracts"],"audits":[],"paidBy":"0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5","release":null,"research":[],"versions":[],"contracts":[{"id":"8594ca07-e200-48f4-9d60-30f50c558b6f","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"BetPool","role":"other","txHash":"0x93679feff63f99765b3fd1e33cc3322ac06a5f21884a189d1e249f450a0601a0","address":"0x76decb1958a1e04549e2e7f451cc22cd832d0fc3"}],"createdAt":"2026-10-19T13:08:13.761+00:00","updatedAt":"2026-10-19T13:37:25.481+00:00","launchNumber":2229,"parkedReason":null,"sourceCommit":"846f0925a8eca3725e14260879bbc4eb11579647","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2229-build-deploy-betpool-live"}],"publishedAt":"2026-10-19T13:08:13.761+00:00"},{"id":"job:dde20fdc-3a82-44e1-bde7-143f6a6f28c5","code":[],"media":[],"sites":[],"title":"Audit e69e04f63832b9fa1e84c7d58c685ce37924a490. Focus on changes since 357201be804e18ab48567172fb6c8b07acb30a2c and closure of findings 1-4 in https://explorer.imdnotdead.fun/jobs/7db42bb7-5204-4805-894f-db1a2c11cd8e.\n\nVerify full-horizon true/false receipt acceptance on Ethereum and Robinhood native clocks; enforced minimum age policy and preflight agreement; owner expiry strictly after deadline+300+86400; requester-only original-asset top-ups for committed Delivered/None untriggered asks, exact escrow/cap/refund accounting, preserved identity and refreshed maturity.\n\nCheck snapshotted Intake/action/asset quotes, fail-closed funded SDK/UI readiness, separate bounded approval/top-up readbacks, and wallet/account/chain/requester changes during those flows. Review codec.validateReview extraction: preserve canonical bool/question/window/panel checks, requester-domain signatures/ERC1271 caller context, epochs/revocation, replay and settlement. Preserve prior lifecycle fixes and terminal false verdicts.\n\nReproduce material findings; rerun isolated cold ERC1271 callback <=200000 gas and runtime <=24576 bytes. Separate code defects from documented cadence assumptions and unperformed live-pilot checks. No deployment or spending.","types":["audits"],"audits":[{"jobId":"dde20fdc-3a82-44e1-bde7-143f6a6f28c5","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks.git","findings":4,"reportUrl":"https://github.com/Identity-md/research/blob/main/jobs/dde20fdc-3a82-44e1-bde7-143f6a6f28c5/_identitymd/README.md","baseCommit":"e69e04f63832b9fa1e84c7d58c685ce37924a490","severities":{"low":2,"info":2},"publishedAt":"2026-10-19T08:09:38.446+00:00"}],"paidBy":"0x9a50fd22bcefd3774d796e775a467a7f743e0ab0","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-19T08:09:38.446+00:00"},{"id":"job:7db42bb7-5204-4805-894f-db1a2c11cd8e","code":[],"media":[],"sites":[],"title":"Audit commit 357201be804e18ab48567172fb6c8b07acb30a2c. Focus on changes since 205fa11271ab17a26630154815fae4c390aac624 addressing https://explorer.imdnotdead.fun/jobs/2218802d-0828-4f00-81cf-487b51c12aac.\nVerify late-build reserve refresh and requester-only renewal without extra payment/cancelled revival/NotPassed shopping; skew-tolerant signed validity and delayed true/false callbacks; trigger-time signer/epoch snapshots, bounded retired-key trust, pending/finalized emergency revocation and ERC1271 caller context; Delivered-only immutable commitments; codec body/pin/consumer equivalence. Preserve exact ArtifactV2 deployment authorization, escrow/refunds, native eight-block windows and recovery/replay controls.\nCheck updated SDK/UI and per-chain block-age assumptions. Independently rerun regressions, 24576-byte runtime and isolated 200000-gas callbacks on Ethereum and mocked Robinhood. Distinguish owner/registry trust and live-integration gaps from code findings. No deployment or paid requests.","types":["audits"],"audits":[{"jobId":"7db42bb7-5204-4805-894f-db1a2c11cd8e","repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks.git","findings":6,"reportUrl":"https://github.com/Identity-md/research/blob/main/jobs/7db42bb7-5204-4805-894f-db1a2c11cd8e/_identitymd/README.md","baseCommit":"357201be804e18ab48567172fb6c8b07acb30a2c","severities":{"low":3,"info":2,"medium":1},"publishedAt":"2026-10-19T02:58:02.082+00:00"}],"paidBy":"0x9a50fd22bcefd3774d796e775a467a7f743e0ab0","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-19T02:58:02.082+00:00"},{"id":"launch:31f83052-5918-402f-9f13-5f4afd80b879","code":[],"media":[],"sites":[],"title":"Build and deploy GameEscrow, version 2 of NIGHTSHIFT's PinballEscrow (live at 0x908da27d2caa584133dfb41fec9d6362dca6bcdd), for player-versus-player skill games (Space Pinball, NIGHT CHESS and later games). Two players stake the same amount of the same token; the winner, as decided by the NIGHTSHIFT server's verified result, takes the pot minus a 5% fee. The only change from v1: players choose the amount.\n\nTokens: only IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) and $SHIFT (0xe5e58e53d0bb204aa62c995a6c8cc8a48e60c3ac), both plain ERC-20 with 18 decimals and no transfer fee. Any stake between a per-token minimum and maximum is allowed. Initial limits, set in the constructor: IMD min 0.5, max 1000; SHIFT min 10000, max 50000000 (whole tokens). The owner may change a token's min and max with setLimits(token, min, max) (event LimitsSet), but never above a hard cap fixed in the code (IMD 10000, SHIFT 1000000000) and never with min > max; changing limits never affects matches already opened.\n\nFlow:\n1. open(bytes32 matchId, address token, uint256 stake, bytes32 game): player A deposits the stake (transferFrom, exact amount, within the limits). game is a free label (e.g. \"pinball\", \"chess\"). Emits Opened(matchId, token, stake, game, playerA). matchId must be new.\n2. join(bytes32 matchId): player B deposits the same token and exact stake. Emits Joined(matchId, playerB). Exactly two players; A cannot join her own match.\n3. settle(bytes32 matchId, address winner, bool draw, uint256 deadline, bytes signature): anyone may submit the result signed by the result signer (EIP-712 typed data: domain name \"NightshiftGames\", version \"2\", chainId, this contract; struct Result(bytes32 matchId, address winner, bool draw, uint256 deadline)). The signature must be valid, not expired, for a joined, unsettled match, and winner must be one of the two players unless draw. Winner gets 95% of the pot; 5% goes to the fee splitter 0x1119d5df2f046bc2d3c0f6279ef2e9ce49422d44. A draw refunds both players in full. Emits Settled(matchId, winner, draw, payout, fee).\n4. refund(bytes32 matchId): if a match is not joined within 1 hour of open, A gets her stake back; if a joined match is not settled within 24 hours, both get their stake back. Emits Refunded(matchId).\n5. cancel(bytes32 matchId): player A may cancel her own match before anyone joins and get her stake back at once. Emits Cancelled(matchId).\n6. Views: matches(matchId) returning token, stake, game, playerA, playerB, openedAt, joinedAt, settled; limits(token) returning min and max.\n\nOwner: 0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5. The owner can only change the result signer (setSigner, event), the limits within the hard caps (setLimits, event), and pause new opens and joins (pause/unpause; settle, refund and cancel keep working while paused). The owner can never move, take or redirect any stake, change the 5% fee, the fee recipient or the tokens. No upgradeability, no delegatecall, no selfdestruct. Reentrancy-safe (checks-effects-interactions plus a guard), SafeERC20, every state change emits an event. Initial result signer: a constructor argument equal to $owner.\n\nTests (Foundry): full flows for both tokens with amounts at and between the limits, below/above limits refused, draw, both refunds, cancel, wrong signer, expired and replayed signatures, signature for the wrong contract or chain refused, winner not a player refused, double settle, joining your own match, wrong stake, paused opens/joins, fee exactly 5% to the splitter (including odd amounts and rounding), setLimits bounds and hard caps, fuzz on stakes and call orders.","types":["contracts"],"audits":[],"paidBy":"0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5","release":null,"research":[],"versions":[],"contracts":[{"id":"31f83052-5918-402f-9f13-5f4afd80b879","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"GameEscrow","role":"other","txHash":"0x64bfbe8e5db1a38fafdcd85e535472a36d542aefa4bb3daa1ebeac59ca2b85a7","address":"0xf460fd9ad76f18414f54a2431870e8a116193489"}],"createdAt":"2026-10-18T23:58:52.647+00:00","updatedAt":"2026-10-18T23:59:49.425+00:00","launchNumber":2201,"parkedReason":null,"sourceCommit":"1b3818f785ed2c252f20f22e3aec7fdbd9d86836","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2201-build-deploy-gameescrow-version"}],"publishedAt":"2026-10-18T23:58:52.647+00:00"}],"pageSize":20,"totalPages":6}