{"rewardSnapshot":null,"merkleRoot":null,"claims":null,"id":"9c2520b0-2497-443c-9020-b6c06b59fd65","launchNumber":2445,"kind":"evm_contracts","status":"live","chainId":1,"sourceRepoUrl":"https://github.com/identity-md-launches/launch-2445-build-deploy-nightwatchrenderer-ethereum","sourceCommit":"1da7b703bc4c6b1632a53c1d18f9a5abdc2d197b","parkedReason":null,"artifactCount":1,"manifestHash":"17ca47e197e4e04de99a43192f118f3404639cb646c055c2be740a70897d21e5","attestationHash":"bc32f4b6c437b7cdef8466156c3e675941b11d7c2561a9052afb09f487670a85","attestation":{"treeHash":"afab04abc237a3f9fb6b05ae881e1ee03c7d23b8","verifierVersion":"0.1.0+560ab6a2","verifierKey":"68249df1f422fa72f61ca7f0ddaf9b62043959c5c134498441d5e552a9921782","toolchain":{"solc":"0.8.26","forge":"forge Version: 1.8.3","viaIR":true,"optimizer":true,"evmVersion":"cancun","bytecodeHash":"none","optimizerRuns":200},"contracts":[{"name":"NightWatchRenderer","path":"src/NightWatchRenderer.sol","abiHash":"7ad4e221f865f90a724c048b46e372926b9ca2879644c6a148300f80d81d9597","opcodes":{"callcode":false,"delegatecall":false,"selfdestruct":false},"metadataHash":"a2c506fe060d3252527a93aa0677ceb40911c64a32e7edb30bace30bfd87e3c0","creationCodeHash":"a1727883edf3abe6445e8776dca0fc43ebfd77ce7799334208d35f4827e8015b","deployedCodeHash":"f482ddd6347255a296996e529e55b89443ecb357e9897a7ab1a07a9436513b9b","creationCodeBytes":11798,"deployedCodeBytes":11772}],"manifest":{"kind":"evm_contracts","notes":"Deploy NightWatchRenderer on Ethereum with no constructor arguments. It is a stateless, view-only NIGHT WATCHERS SVG renderer callable by anyone through svg(), with no owner, admin, fees or upgrade controls. It reads the existing NIGHT FROGS renderer at 0x4D9BfbafE31eC18E9D3066F1475e24906d155D67 and ArtStore at 0x2A0140BC2b117ffEe9b092af1a927b96328FB000; both addresses are constants in the accepted source. No token, ETH funding or initialization calls are required.","contracts":[{"contract":"NightWatchRenderer","constructorArgs":[]}]},"manifestError":null},"attestationFailure":null,"deployFailure":null,"policyVersion":27,"economics":null,"poolFee":null,"requester":"0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5","admissionChecks":[{"name":"provenance","detail":"8 node(s) accepted at 1da7b703","status":"passed"},{"name":"findings","detail":"8 accepted submission(s), no unresolved blocking findings","status":"passed"},{"name":"independent_review","detail":"1 independent review(s)","status":"passed"},{"name":"bytecode","detail":"1 contract(s) clean and reproducible","status":"passed"},{"name":"manifest","detail":"1 application contracts; no protocol token or pool","status":"passed"},{"name":"protected_invariants","detail":"invariants-72ac6e744789: Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 626.52µs (463.45µs CPU time)","status":"passed"},{"name":"economics","detail":"policy explicitly selects no on-chain contributor rewards","status":"passed"}],"assurances":[],"logo":null,"seeded":null,"createdAt":"2026-10-22T01:33:39.608Z","updatedAt":"2026-10-22T01:34:40.052Z","jobs":[{"id":"3d2313bb-d6d8-4b83-b0d8-2964dbc762af","objective":"Build and deploy NightWatchRenderer on Ethereum: one immutable, view-only contract that draws the art of NIGHT WATCHERS (an NFT ordered separately). No token, no owner or admin, no storage, no fees, not upgradeable or pausable. Who can call what: anyone calls svg(), there is nothing else; it holds and receives no funds. Outside services: none; it only reads 2 deployed contracts: the NIGHT FROGS renderer 0x4D9BfbafE31eC18E9D3066F1475e24906d155D67, traitSVG(uint8 layer, uint8 index) returns string (layers 0-6, 6 = Accessory), and ArtStore 0x2A0140BC2b117ffEe9b092af1a927b96328FB000, read(0) returns the shared <style>+<defs> string (call it BASE).\n\nsvg(uint256 n, uint8 t, uint8[7] traits, string label, uint16[10] inputs, uint16 points) view returns (string); reverts unless 1 <= t <= 6 (6 = The Captain). C = colour by t: 1 #3FE6FF, 2 #B8FF4A, 3 #A98BFF, 4 #FF4FD8, 5 #FFC46B, 6 #E9E4FF. ROMAN = I, II, III, IV, V, C. L(i) = traitSVG(i, traits[i]). The result is exactly this concatenation, no spaces or newlines added; numbers in plain decimal:\n'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1000 1000\" width=\"1000\" height=\"1000\" color=\"' C '\"><title>NIGHT WATCHERS #' n '</title>' BASE DEFS L(0) LIGHT [t>=2: RAYS] [t>=3: RING] [t>=5: RING2] '<g filter=\"url(#otA)\">' L(1) L(2) L(3) [t>=3: '<g filter=\"url(#otE)\">' L(4) '</g>', else L(4)] L(5) L(6) '</g>' [traits[6]=1: BADGE] [t=6: ArtStore read(3)] [t>=3: EMBERS] [t>=4: HOLO] SHADE CARD [t>=2: INNER] [t>=4: PULSE] [t>=5: BOSS] TITLE PIP(0)..PIP(4) HEX SPINE PLATE '</svg>'\nEach part below is a literal string; {X} is replaced by X.\nDEFS = <defs><radialGradient id=\"otL\"><stop offset=\"0\" stop-color=\"currentColor\" stop-opacity=\".6\"/><stop offset=\"1\" stop-color=\"currentColor\" stop-opacity=\"0\"/></radialGradient><radialGradient id=\"otR\"><stop offset=\".15\" stop-color=\"#FFFFFF\"/><stop offset=\"1\" stop-color=\"#FFFFFF\" stop-opacity=\"0\"/></radialGradient><mask id=\"otM\"><rect x=\"0\" y=\"0\" width=\"1000\" height=\"1000\" fill=\"url(#otR)\"/></mask><linearGradient id=\"otH\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\".4\" stop-color=\"#FFFFFF\" stop-opacity=\"0\"/><stop offset=\".5\" stop-color=\"#FFFFFF\" stop-opacity=\".7\"/><stop offset=\".6\" stop-color=\"#FFFFFF\" stop-opacity=\"0\"/></linearGradient><filter id=\"otA\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"140%\"><feMorphology in=\"SourceAlpha\" operator=\"dilate\" radius=\"5\"/><feGaussianBlur stdDeviation=\"15\" result=\"b\"/><feFlood flood-color=\"{C}\"/><feComposite in2=\"b\" operator=\"in\"/><feMerge><feMergeNode/><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge></filter><filter id=\"otE\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\"><feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"9\" result=\"b\"/><feFlood flood-color=\"{C}\"/><feComposite in2=\"b\" operator=\"in\"/><feMerge><feMergeNode/><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge></filter></defs>\nLIGHT = <circle cx=\"500\" cy=\"540\" r=\"480\" fill=\"url(#otL)\" opacity=\"{O}\"/> with O = .6, .7, .8, .9, 1, 1 for t = 1..6\nSPIN(TO, D) = <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 500 540\" to=\"{TO} 500 540\" dur=\"{D}s\" repeatCount=\"indefinite\"/>\nRAYS = <circle cx=\"500\" cy=\"540\" r=\"330\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"660\" stroke-dasharray=\"8 44\" opacity=\"{O}\" mask=\"url(#otM)\">{SPIN}</circle> with O = .22 for t 2-3, else .34; SPIN = SPIN(360, 80) when t>=5, else empty\nRING = <circle cx=\"500\" cy=\"540\" r=\"402\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-dasharray=\"2 16\" opacity=\".7\">{SPIN}</circle> with SPIN = SPIN(360, 120) when t>=5, else empty\nRING2 = <circle cx=\"500\" cy=\"540\" r=\"432\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-dasharray=\"40 14 4 14\" opacity=\".8\">{SPIN}</circle> with SPIN = SPIN(-360, 90)\nEMBERS = '<g filter=\"url(#otE)\">', then for k = 0 .. 4t-7 the string <circle cx=\"{X}\" cy=\"{Y}\" r=\"{R}\" fill=\"currentColor\"><animateTransform attributeName=\"transform\" type=\"translate\" values=\"0 0;0 -280\" dur=\"{D}s\" repeatCount=\"indefinite\"/><animate attributeName=\"opacity\" values=\"0;1;0\" dur=\"{D}s\" repeatCount=\"indefinite\"/></circle> with X = 890 - (37k mod 150) for odd k else 110 + (37k mod 150), Y = 560 + (83k mod 340), R = 4 + 2(k mod 3), D = 4 + (k mod 4), then '</g>'\nHOLO = <rect x=\"-500\" y=\"0\" width=\"2000\" height=\"1000\" fill=\"url(#otH)\" opacity=\".45\" style=\"mix-blend-mode:overlay\"><animateTransform attributeName=\"transform\" type=\"translate\" values=\"-1000 0;1000 0\" dur=\"6s\" repeatCount=\"indefinite\"/></rect>\nSHADE = <rect x=\"0\" y=\"0\" width=\"1000\" height=\"1000\" fill=\"url(#vignette)\"/><rect x=\"0\" y=\"0\" width=\"1000\" height=\"1000\" fill=\"#FFFFFF\" filter=\"url(#grain)\" opacity=\".035\"/>\nCARD = <path d=\"M60 24H940L976 60V940L940 976H60L24 940V60Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\"/>\nINNER = <path d=\"M72 36H928L964 72V928L928 964H72L36 928V72Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" opacity=\".45\"/><path d=\"M500 24V44M24 500H44M956 500H976\" stroke=\"currentColor\" stroke-width=\"4\"/>\nPULSE = <path d=\"M60 24H940L976 60V940L940 976H60L24 940V60Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"12\" filter=\"url(#glow)\"><animate attributeName=\"opacity\" values=\".15;.7;.15\" dur=\"4s\" repeatCount=\"indefinite\"/></path>\nBOSS = <path d=\"M54 10H946L990 54V946L946 990H54L10 946V54Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"/><path d=\"M436 44L448 8L476 30L500 2L524 30L552 8L564 44Z\" fill=\"currentColor\" stroke=\"#08070D\" stroke-width=\"4\" stroke-linejoin=\"round\"/>\nTITLE = <text x=\"66\" y=\"86\" font-size=\"16\" fill=\"#C4B4FF\" letter-spacing=\"7\">NIGHT FROGS / GEN 2</text><text x=\"62\" y=\"142\" font-size=\"56\" fill=\"#F2EFFF\" letter-spacing=\"5\">NIGHT WATCHER</text>\nPIP(k) = <rect x=\"{X}\" y=\"158\" width=\"26\" height=\"8\" fill=\"currentColor\" opacity=\"{O}\"/> with X = 66 + 34k, O = 1 if k < t else .2\nHEX = <path d=\"M884 50L936 80V140L884 170L832 140V80Z\" fill=\"{FILL}\" stroke=\"currentColor\" stroke-width=\"5\"/><text x=\"884\" y=\"126\" font-size=\"{S}\" fill=\"{INK}\" text-anchor=\"middle\">{ROMAN}</text> with FILL = currentColor and INK = #08070D if t >= 4, else FILL = #08070D and INK = currentColor; S = 34 if t = 3 else 40\nSPINE = <text x=\"0\" y=\"0\" font-size=\"13\" fill=\"currentColor\" letter-spacing=\"6\" text-anchor=\"middle\" opacity=\".85\" transform=\"translate(958 520) rotate(90)\">NIGHTSHIFT / NIGHT WATCH / TIER {ROMAN}</text>\nPLATE = <path d=\"M64 870H904L940 906L904 942H64Z\" fill=\"#08070D\" fill-opacity=\".88\" stroke=\"currentColor\" stroke-width=\"3\"/><text x=\"86\" y=\"917\" font-size=\"30\" fill=\"#F2EFFF\">#{N}</text><text x=\"{X}\" y=\"916\" font-size=\"22\" fill=\"currentColor\">{LABEL}</text><text x=\"896\" y=\"916\" font-size=\"18\" fill=\"#C4B4FF\" text-anchor=\"end\">{P} FP</text><text x=\"66\" y=\"966\" font-size=\"14\" fill=\"#C4B4FF\" letter-spacing=\"3\">FORGED FROM {FROM}</text> with N = n, X = 130 + 20 x (number of digits of n), LABEL = label as given, P = points, FROM = the 10 inputs, each as # and its number, one space between\nBADGE = <text x=\"500\" y=\"858\" font-size=\"23\" fill=\"#08070D\" text-anchor=\"middle\">NW{N}</text> with N = n\n\nTest vectors (keccak256 of the bytes): svg(1, 1, [4,2,4,3,1,5,5], \"SHIFT LEAD\", [184,185,186,189,190,78,80,81,82,86], 10) = 0x6c9b4ba9e1d970ae878562252ecde4ba26c461fec4cc1af9d983049fcccbb448; svg(9, 2, [1,4,3,5,6,3,1], \"FOREMAN\", [112,120,146,170,205,232,276,281,310,370], 20) = 0x6599cac260892032e955386e9d89eadb3155873df88c7d0eb9811d0516a71e9f; svg(7, 3, [5,4,3,5,3,3,4], \"SUPERVISOR\", [26,30,50,2,5,96,97,93,94,87], 50) = 0x77a2bd2785100118716ecfd64d45fac8dc442da9985103657651e4cdfd3cff34; svg(50, 5, [5,5,7,5,7,6,4], \"KODES\", [10,45,103,12,19,22,69,188,204,267], 128) = 0x7615dc42aa811e30e90ea4b235d71d4fdf31c0fa8e07440ee34715e47fd00609; svg(0, 6, [5,5,7,0,1,3,0], \"CAPTAIN\", [1,45,103,12,19,22,69,188,204,267], 128) = 0xe3bc253ef478a52132f479126df379e37100408b505528a7fee1b5879cf27cdc.\nFoundry tests: the 5 vectors; t 0 and 7 revert; svg() gas and the 5 images in the README. Verify on Etherscan + Sourcify.","state":"completed","attachedAt":"2026-10-22T01:33:39.608Z"}],"artifacts":[{"role":"other","name":"NightWatchRenderer","address":"0x053471879f65f6b4f644635fbdd798b9d7c5e1f5","creationCodeHash":"a1727883edf3abe6445e8776dca0fc43ebfd77ce7799334208d35f4827e8015b","txHash":"0x51c4958e00e590e9eb98bca315a7a8d094624257c704628f2aa9ec6062b23125","blockNumber":26244896,"verifiedAt":"2026-10-22T01:37:24.744Z","verifyFailure":null}],"allocations":[]}