AB5D

Chroma Theory

Paweł Dudko · Project 170 · Factory

Edition size: 106 · First mint: 9 October 2021

Chroma Theory #4 by Paweł Dudko. Copyright: NFT License. From the AB5D collection.

Open artwork

The work and its context

Chroma Theory is Art Blocks project 170 on the contract at 0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270, on Ethereum mainnet, credited to Pawel Dudko. The indexed record returns 106 invocations against a maximum of 106, a declared dependency of p5@1.0.0, and a display_static value of false 1. The project page describes it as an Art Blocks 500 release in the Factory category and carries an animated badge and no interactive badge 2. Both are correct, and in this batch that combination is unusual enough to be worth saying twice.

What you see has no edges. A square field holds four to six large circles of colour, drawn on a nearly white ground, and then the whole image is pushed through two passes of a blur shader whose radius is itself changing. The circles dissolve. What remains is a field of soft colour masses that drift, swell and bleed into one another: amber against mint, magenta against olive, lilac against pale yellow. Nothing in the finished picture is recognisable as a circle.

The artist's own description is accurate and worth taking seriously as a description of intent: "the infinite animation filled with color, where you can experience slight movement, irregular pulse, and tonal diffusion", an "abstract study of color coexistence and mutual interference, from pastel hues to vivid compositions", ending "Sit back, relax and give it time" 13.

Three things should be established before the essay proceeds.

The animation is genuinely infinite rather than looping. Its pseudo-random generator is advanced on every frame, inside the drawing routine, so the state never returns to where it started 1. This is not a reading of intent: the artist later made a separate revision of this work specifically to add looping, and said so 4.

The program is packed. What the index stores is 2,495 bytes of an obfuscator's output, which unpacks to 2,651 characters of ordinary JavaScript 1. It is the smallest program in this batch and it does more per byte than any of the others, because most of the visual work is done by a GLSL fragment shader compiled at runtime.

And two of the five published traits reproduce exactly from the hash while three do not, in a way that cannot be explained by an error in this researcher's reading, because the reading was checked against the running artwork and matches it 56.

Conception and development

The website recorded against the project is https://www.pdudko.com/p/chroma-theory.html. It returns a page titled "Page not found" with the text "404 NOT FOUND" 7. The domain is live and the artist maintains a substantial site there. A first pass through the site's own navigation and its NFT and generative art category found no entry for this project, and it would have been easy to conclude at that point that the artist had removed it. A site search for the project name found it immediately, at https://pdudko.com/chroma-theory/ 3. The lesson is recorded in the notes; the page exists and the link of record is simply wrong.

On that page the artist gives a short statement and one piece of biography that reframes the project. Chroma Theory is described as "an infinite scripted digital animation that is based on color theory", in which "all of the spots visible in a single rendering are subject to the rules of perception, mixing, matching, or contrasting colors" 3.

The biography is the useful part. The artist writes that the project "is a homecoming to the beginning of my art creation, photography and CGI", and then draws a distinction between this work and earlier generative projects: in The Faces of the Circle from 2018, and in (Un)necessary and Populations from 2016, "final artworks were selected by me and limited to those, I decided to create and exhibit. There are no such limitations in the digital world, which makes art more personal with a hint of surprise" 3. That is a statement about curation. The artist's earlier generative work was a process from which the artist chose outputs; this one is a process whose outputs are chosen by minting. The artist frames the difference as the appeal of the form.

The same page carries a list of twelve hashes used to render stills for exhibition, and a thirteenth for a single still 3. Those are not token hashes from this edition; they are configurations the artist rendered for display, which is worth knowing if a catalogue ever encounters one of those images and tries to match it to a token.

There is also a sequel, and it is directly useful for reading the original. In January 2022 the artist published Dark Chroma Theory, a set of sixteen pieces on a different chain, described as "a revision of Chroma Theory published on Art Blocks" in which "the code has been updated with certain features, e.g.: dark background only, looped animation, organic movement, wider color range, spots number, and appearance reviewed" 4. The artist explains the changes: they came out of working on Genuary 2022 prompts, "the idea of the center spot was abandoned and replaced with a higher spots number", and "the elements' movement and dissolution were improved to be more organic and looped" 4.

Two things follow. The centre spot, which in the Art Blocks work is drawn separately from the others and has its own two published traits, was a design element the artist later chose to remove. And looping was a feature the revision added, which means the original does not loop. Both of those read directly onto the program, and both are confirmed there.

The indexed interview field is null and no dated development account beyond these pages was located 1.

How the work was constructed

The program was retrieved from the indexed project record by an HTTP POST to the Art Blocks public GraphQL endpoint, using a named operation filtered on the exact slug, with the returned composite identity key corroborating contract and project 1. The record reports a script count of 1. The stored program is 2,495 bytes and hashes to SHA-256 af5637d607606dc4d6deedebc53e453e9815e41dc8832e6b9fa2b056cb9aa6af. That digest is over the bytes as stored, which is the packed form.

Those bytes are not readable JavaScript. They are the output of a well-known packing routine that replaces every identifier with a base-62 token and ships a decoder that calls eval. To read the program without executing it, the packing was undone by reimplementing the substitution as pure string work: extract the template, the base, the token count and the keyword table, then replace each encoded token with its keyword. That yields 2,651 characters of ordinary JavaScript, which was read in full 1. No artist code is reproduced in this package, packed or unpacked.

The unpacked program is short and the division of labour is unusual. Almost all of the visual effect comes from a GLSL fragment shader defined as a string inside the JavaScript and compiled at runtime. The shader samples its input texture in sixteen directions at eight radii, sums the samples and divides, which is a radial blur whose radius is supplied as a uniform. The program builds three off-screen buffers at one fifth resolution, draws the circles into the first, runs the blur into the second, runs it again into the third, and draws that to the canvas 1. The softness of every image in this edition is that two-pass shader, and the low buffer resolution is why the result is smooth rather than banded.

The hash is read two ways. Thirty-two byte pairs are taken from the hash, and each is reduced modulo 10, giving values from 0 to 9 that select the colour and size parameters. Separately, the first sixteen characters of the hash string are parsed as an integer to seed an xorshift generator that supplies the positions and per-spot colours 1.

That seeding has the same defect found in two other projects in this batch. The slice takes the first sixteen characters of the hash string, which begins with the two-character 0x prefix, so only fourteen hexadecimal digits are parsed. The resulting value is a 56-bit number held in a double, beyond the range of exactly representable integers, so its low bits are lost before the generator starts. Three different artists, three unrelated programs, the same off-by-two.

The generator itself yields one of exactly a thousand values, because its output is reduced modulo 1000 and divided by 1000. For a work whose subject is colour relationships, that is a coarse quantiser on every position and hue it supplies.

The trait mapping was reimplemented from the unpacked program and run against all 106 token hashes, then compared with the published features 5. Two traits reproduce exactly.

Spots reproduces at 106 of 106. The rule is worth stating because the published number is not the number the program uses. The program computes a spot count as a fractional value between 3 and 5, then runs a loop while the index is less than or equal to it, which draws four, five or six circles. It then draws one further circle at the centre, from separate parameters. The published Spots value is the total of both: five, six or seven. The trait counts what you could see, if you could see them, rather than what the loop counts.

CenterRadius reproduces at 106 of 106, as the centre circle's diameter expressed as a percentage of the canvas, truncated rather than rounded.

BackgroundColor, CenterColor and ColorDeviation do not reproduce, and the reason is not a mistake in the reading. The program computes the background hue as the main hue plus two of the per-spot hues minus 120, modulo 360, and the centre hue as the absolute sum of three per-spot hues modulo 360 1. Reimplementing that chain gives, for the first token in the edition, a background hue of 83.04 and a centre hue of 340.92. Reading those same variables out of the token's running sketch in the renderer gives 83.04 and 340.92 6. The reimplementation is correct to two decimal places against the live artwork. The published traits for that token are BackgroundColor 183 and CenterColor 328.

The rendered pixels do not resolve it either. Sampling the finished canvas for that token gives a hue of 42 at the corner and 58 at the centre 6, which matches neither the internal values nor the published ones, because the blurred spots cover the frame and the near-white background is never visible on its own.

Several other explanations were tested and rejected: the three traits are not simple functions of any single hash byte, and seeding the generator from the full hash, from the hash without its prefix, or from its first eight digits does not reproduce them either 5. No feature-generating code exists anywhere in the retrieved program. Whatever produced those three values is a separate piece of software that was not located, and this package reports the divergence rather than inventing a rule to cover it.

Finally, the motion. Two things advance every frame. A counter increments by 0.04 and is fed through Perlin noise to set the blur radius, which is why the image breathes rather than pulses regularly. And each spot's noise coordinate advances by a fresh draw from the pseudo-random generator, which means the generator's state is consumed continuously for as long as the work runs 1. There is no loop point and no end state. Measured on the first token across 12.6 seconds, the frame counter advanced 754 frames, the counter advanced exactly 0.04 per frame, and the blur radius moved 140, 125, 115, 145, 105, 129 without pattern 6.

The mint

Four events need separating.

The first token, invocation 0, was minted on 9 October 2021 at 11:41:28 UTC 5. The project was activated a fortnight later, on 23 October 2021 at 18:04:15 UTC 1. The public opening, recorded as the project start datetime, was on 28 October 2021 at 16:00:00 UTC 1. The project page displays "Released on 29 October 2021", which is that opening rendered in a timezone ahead of UTC 2. Completion, the final mint, was on 21 March 2022 at 07:15:20 UTC 15.

Invocation 0 is still held by the address the index records as the artist's 15, so the artist proof has not moved.

The sale mechanism is published on the project page: a Dutch auction with a starting price of 2 ETH decreasing every five minutes to a resting price of 0.1 ETH, through the ladder 2, 1.75, 1.5, 1.25, 1, 0.75, 0.5, 0.25, 0.1 2. Nine rungs at five-minute intervals puts the resting price at 16:40:00 UTC, forty minutes after opening.

Setting that schedule against the mint timestamps gives a precise picture. Two tokens were minted during the descent: invocation 1 at 16:28:44 UTC, inside the 0.75 rung, and invocation 2 at 16:39:28 UTC, inside the 0.25 rung and thirty-two seconds before the floor 25. The remaining 103 tokens were minted at or after the resting price. The auction, in other words, went almost all the way down before it found its second buyer.

The pace afterwards was steady rather than fast: 13 tokens in the first hour, 16 more during the rest of the first day, 17 across days two to seven, 19 across days eight to thirty, and the final 40 across the remaining months 5. The longest gap between consecutive invocations was 27.6 days, between invocations 99 and 100 5. The sale duration from public opening to final mint is 143.6 days, calculated as the final mint at 2022-03-21T07:15:20Z minus the opening at 2021-10-28T16:00:00Z divided into days 15.

The index reports a current price of 0.1 ETH 1, which is the auction's published resting price rather than a later change.

It is worth noting that the same batch contains another Factory release from the same fortnight whose auction also fell to its floor with two tokens sold during the descent. Two cases is not a trend, and no claim about the wider platform is made here.

The artwork licence the platform reports is the string NFT License, and the index carries no link for it: the link_to_license field is null 1. The project details panel on the live page publishes edition size, website, library, aspect ratio, blockchain, token standard, contract type and the attribute list, and no licence field at all 2. So the entire rights record for this artwork is one unlinked string.

A document called the NFT License is published at nftlicense.org and was read in full during this session 8. It grants the token owner personal non-commercial use of the associated art, display on a marketplace that cryptographically verifies ownership, display on a third-party site or app that verifies ownership and does not retain the art afterwards, and commercialisation on the owner's own merchandise up to 100,000 dollars of annual revenue. It prohibits modifying the art, using it to market third-party products, use in connection with hatred or violence, and attempting to trademark it. Its foot attributes it to Dapper Labs 8.

That document is not cited here as the licence governing this work, because nothing in the project's record points to it. The index string names a licence; it does not link one, and no signed or artist-published instrument for this project was located. The association between the label and that document is a reasonable inference from the name and nothing stronger, and this package records the terms URL as null rather than supplying a link the record does not make. A reader should treat the terms above as what a document of that name says, not as what this artwork is licensed under.

Code rights are separate and are recorded as unknown. No licence statement or copyright notice appears anywhere in the program, packed or unpacked 1. On-chain storage makes the program retrievable; it does not make it redistributable. The program's packed form is worth a note here: packing is an obfuscation as well as a compression, and while it does not create any legal protection, it does mean that the readable form of this work exists only after a transformation that the artist did not publish. That is a reason to describe the program rather than reproduce it, which is what this package does.

The artist's own website footer reads "Copyright all rights reserved", but it is the default footer of the site's theme and appears on every page including the index, so it is recorded here as a site-wide notice rather than as a statement about this artwork 3.

The declared dependency, p5@1.0.0, carries its own upstream licensing, which was not inspected and is recorded separately as unknown 1. The program also compiles GLSL shader source of its own authorship at runtime; that source is part of the artist's program and carries no separate notice.

Close reading of examples

Four tokens were opened in the original renderer and observed across changing states. Two are treated at length. Every canonical token page below returned HTTP 200 when fetched during this session, and every observation is this researcher's own inspection of the live renderer 6.

Chroma Theory #4 by Paweł Dudko
Chroma Theory #4 by Paweł Dudko. Open artwork

Chroma Theory #4, token 170000004, is the AB5D holding and the proposed header work. Ownership was verified rather than assumed: the complete linked wallet set was refreshed from the AB5D profile during this session and returned three addresses, and this token's indexed owner is the third of them 95. Its published traits give Spots 5, CenterRadius 47, BackgroundColor 153, CenterColor 181 and ColorDeviation 117 5.

On screen it is a field of soft magenta and rose across the upper half, an olive-green passage at the right, and a warm cream void low and left, all of it dissolving into a nearly white ground at the left edge. There is no hard edge anywhere in the image and no shape that could be named. Reading the sketch's own variables confirmed the reproduction: the spot count drawn is five, matching the published Spots, and the centre circle's radius is 47.22 per cent of the canvas, matching the published CenterRadius of 47 after truncation 6. The same read gave the background hue the program actually uses, 333.96, against a published BackgroundColor of 153.

Observed over 15.1 seconds, six canvas signatures were all distinct, the frame counter advanced from 776 to 1529, the noise counter advanced by exactly 0.04 per frame, and the blur radius moved 100.9, 101.1, 116.2, 102.4, 124.6, 143.7 6. That sequence is the "irregular pulse" of the artist's description, and it is irregular because it is Perlin noise sampled along a line rather than a periodic function.

Chroma Theory #0 by Paweł Dudko
Chroma Theory #0 by Paweł Dudko. Open artwork

Chroma Theory #0, token 170000000, is the artist's proof and the token used to verify the reproduction against the running program. It is still held by the address the index names as the artist's 5. Its published traits give Spots 5, CenterRadius 36, BackgroundColor 183, CenterColor 328, ColorDeviation 127 5.

On screen it is amber and mint: a large warm-yellow mass upper left, a green and yellow passage across the lower right, cool grey-white between them. Reading the sketch's variables gave a per-spot hue array of 59.04, 41.76, 161.28 and 137.88, a main hue of 360, a spot count of 3.44 and a centre radius of 239.06 pixels on a 662-pixel working dimension 6. Every one of those matched the independent reimplementation exactly, which is what licenses the statement in the construction section that the three unreproduced colour traits are not a failure of this reading. Observed over 15.1 seconds, six signatures were distinct and the frame counter advanced 754 frames 6.

Chroma Theory #13 by Paweł Dudko
Chroma Theory #13 by Paweł Dudko. Open artwork

Chroma Theory #13, token 170000013, carries the highest published Spots value in the edition, 7, and a CenterRadius of 44 5. Fifteen of the 106 tokens share that Spots value. On screen it is the coolest of the four: pale lilac and periwinkle across the centre and lower left, a mint and aqua passage upper right, a soft lemon mass at the bottom left corner, against near-white. Reading its variables gave seven circles drawn and a centre radius of 44.44 per cent, both matching the published traits 6. Sampled five seconds apart the image had changed 6.

Chroma Theory #10 by Paweł Dudko
Chroma Theory #10 by Paweł Dudko. Open artwork

Chroma Theory #10, token 170000010, sits at the other end of the centre-circle range with the minimum published CenterRadius of 25 5. On screen a broad rose-pink mass fills the upper two thirds with a paler flushed centre, and a pale green passage crosses the lower third, all against near-white. The sketch reported a centre radius of exactly 25.00 per cent and five circles drawn, matching the published traits 6. Sampled five seconds apart the image had changed 6.

The four together show the range the artist describes, "from pastel hues to vivid compositions", and they also show what the traits cannot tell you. Two tokens with identical published Spots values of 5 look nothing alike, because what governs the image is where four to six very large circles happen to fall and how much they overlap, and those positions come from the generator rather than from any published trait.

On sound: every session was silent, and this is silence by construction rather than blocked playback. The document contained no audio or video elements, the only script loaded was the p5 library at version 1.0.0 with no sound add-on, and the unpacked program contains no audio call 61. No playback action was attempted because there is no audio path to attempt one on.

No interaction was tested because none is documented and none exists: the unpacked program defines no key or mouse handler of any kind 1, and the project page carries no interactive badge 2.

Significance and limitations

Chroma Theory is the quietest work in this batch and the one whose published record is least able to describe it.

What the work does is simple to state and hard to catalogue. It draws a handful of enormous coloured circles, blurs them twice through a shader whose radius is drifting, and keeps drifting forever. The image never settles and never repeats. A still of it is not a reduced version of the work; it is one arbitrary moment from something with no privileged moment, and the artist's instruction to "give it time" is the accurate one.

Two of its five published traits describe the work correctly and reproduce from the hash exactly. Three do not match anything this research could find: not the values the running program uses, not the pixels it produces, and not any simple function of the hash. The reproduction was verified against the live artwork variable by variable, so the gap is in the published metadata rather than in the reading. For a project whose subject is colour, having its three colour traits unexplained is a real hole in the record, and it is the single thing a coordinator would most want resolved.

The rest of the platform record is thin in ways worth stating plainly. The licence is one unlinked string. The website of record is a 404, although the artist's page does exist elsewhere on the same domain and a site search finds it in one step. The indexed interview field is null. Against that, the project page gets two things right that comparable pages in this batch get wrong: it carries an animated badge and no interactive badge, which is exactly what the program warrants, and it publishes the full Dutch auction ladder, which makes the mint reconstructable to the minute.

The most useful thing an outside source contributed was the sequel. Because the artist published Dark Chroma Theory as an explicit revision and listed what changed, the original's properties can be read off the differences: looping was added later, so the original does not loop; the centre spot was abandoned later, so the centre spot is a deliberate element of the original rather than an artefact; and the spot count was raised later, so the original's four-to-six is a chosen constraint. That is a rare case of an artist documenting a work by documenting its successor.

The limitations of this package should be stated plainly. Four of 106 tokens were observed. The colour traits are unresolved, and the hypotheses tested to exhaustion are listed in the evidence rather than summarised as a conclusion. The program was read by undoing its packing, which is a transformation this researcher performed, so the reading is of a derived form rather than of bytes the artist published; the digest recorded is over the stored bytes, and the unpacking is described so that it can be repeated. No on-chain price history was read, so the auction reconstruction rests on the published ladder and the mint timestamps rather than on observed price changes. The artist's site was searched only for this project's name; other pages that might discuss it were not read. The Dark Chroma Theory collection itself was not inspected on its marketplace, only the artist's account of it.

Unresolved research questions, stated explicitly:

What generates BackgroundColor, CenterColor and ColorDeviation? No feature-generating code exists in the retrieved program, the values match neither the running sketch nor its output, and no single-byte or alternative-seed rule reproduces them. The software that produced them was not located.

What does ColorDeviation measure? Unlike the other four traits its name does not correspond to any variable in the program, and its 67 distinct values across 106 tokens rule out the simple byte-derived quantities.

Why does the seeding take sixteen characters of a hash string that begins with a two-character prefix? The same off-by-two appears in two other unrelated projects in this batch, which suggests a shared source rather than three coincidences, but no common origin was identified.

Was the packing a size optimisation, an obfuscation, or both? On-chain storage cost is a plausible motive for a 2,495-byte program, and the artist does not discuss it in any located source.

Is the artist's website link of record broken at Art Blocks or was the artist's page moved? The project page and the index both carry the dead URL, and the working page sits at a different path on the same domain.

References


  1. Art Blocks. Art Blocks public GraphQL index, projects_metadata for project 170. Accessed 2026-09-18. 

  2. Art Blocks. Chroma Theory by Pawel Dudko, collection page. Accessed 2026-09-18. 

  3. Pawel Dudko. Chroma Theory, artist project page. Published 2021-10-26. Accessed 2026-09-18. 

  4. Pawel Dudko. Dark Chroma Theory, artist project page. Published 2022-01-28. Accessed 2026-09-18. 

  5. Art Blocks. Art Blocks public GraphQL index, tokens_metadata for all 106 tokens of project 170. Accessed 2026-09-18. 

  6. Art Blocks. Art Blocks live renderer for project 170 tokens. Accessed 2026-09-18. 

  7. Pawel Dudko. The artist website recorded against project 170 (404). Accessed 2026-09-18. 

  8. Dapper Labs. NFT License. Accessed 2026-09-18. 

  9. Art Blocks. Art Blocks public GraphQL index, user_profiles for the AB5D collection. Accessed 2026-09-18. 

Written by claude-opus-5 (contributor-reported) for AB5D. Original prose: CC0. Artwork and code rights are addressed separately above.

Token usage unavailable for the complete essay.

Token usage

No token telemetry is exposed to the agent in this environment. All counts are null rather than estimated, and no batch figure has been divided into per-essay numbers. Cached input and reasoning counts are null rather than folded into a total, so nothing is double-counted.

Generation record

Artist dossier · Source record · Essay data

Research record

The indexed project script was inspected. Runtime observations and limits are documented in the research record. Historical price, allocation and licensing questions remain as identified in the essay. Publication does not resolve those evidence gaps.

Retrieval evidence · Research notes · Manuscript