Squares and Triangles
Maksim Hapeyenka · Project 218 · Factory
Art Blocks Factory, project 218 · 80 outputs · public mint 16 December 2021 · CC BY

Squares and Triangles #64, held by AB5D. Red squares and blue triangles on the additive "Glowy" setting. Render: Art Blocks media proxy.
The work and its context
Squares and Triangles is project 218 on the Art Blocks contract 0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270. The index records 80 invocations against a maximum of 80, the runtime p5@1.0.0, an aspect ratio of 1.77, the licence label CC BY and a price field of 0.075 ETH 1. It sits in the Factory vertical. Art Blocks describes Factory, launched in March 2021, as "an editorially open space for artists to deploy generative art projects", closed in October 2022 2. The project is part of the Art Blocks 500, the set of flagship releases from 2020 to 2025 that Art Blocks now treats as "a finite and complete set" 3.
The mint text is short: "A symphony of nothing but squares and triangles to create something beautiful" 1. Each output is a live animation on a black ground. One square and one triangle are drawn in outline, again and again, each copy a little smaller or larger and turned a little further round the centre of the screen. Hundreds of these thin outlines pile up into rings, halos and spiral arms. The effect is of curves, although the program draws no curves at all 14.
Maksim Hapeyenka's Art Blocks profile gives a two-word biography, "Love programming", and lists this as his only Art Blocks project 5. The project's website field points to the X account @BirthCreator, and the artist address resolves to the ENS name birth-ent.eth 16. Both names come from his later project, Birth (see below).
Conception and development
The artist frames the work as juvenilia. The project description says: "This is a project I made when I was just getting started with generative art. I decided to revive it despite all its flaws to preserve this piece of my humble history" 1.
He told the fuller story in two Medium posts published on 24 September 2021, almost three months before the sale 78. In the first, he introduces himself as a 22-year-old mobile app developer from Belarus who began coding at 15 and working professionally at 18 7. His GitHub account, maxgmer, is mostly Flutter and mobile code 9.
The project began with a favour. A friend asked for a Kinect-driven particle visualisation for a dance video, and that led him to Processing 3 7. He then set himself a constraint: sketches built from one or two simple shapes, with no Bézier curves. In his words: "no tutorial videos, no inspirational ideas, only my own trial and error" 7. After about a week of failures, one evening's experiment of scaling squares quickly while rotating the whole sketch, fewer than ten lines of code, produced the effect. He kept going through the night and later added triangles 7. His public repository "visual_experiments" holds two Processing sketches, one of circles and an unfinished one of squares and triangles 9. It looks like the Processing ancestor of this work, but that is an inference.
After some years of a day job and startup work, he found Art Blocks through CoinMarketCap's NFT tab in the winter of 2020 to 2021 and spent about five months refining the piece for release 7. The second post sets out the rules of the work: "I don't use anything except squares and triangles to draw everything" 8. It adds that the program "doesn't use sin() or cos() anywhere for movement, unlike other spirograph implementations" 8. The code bears this out. Its only sine modulates the opacity of Legendary fills (code reading) 1. The post also lists the keyboard controls, calls Legendary "the only rotating tier", and links a five-video YouTube playlist of tier previews on his channel 810.
The same post planned a far larger edition: "I plan to limit the amount to 1024" 8. The project closed at 80 1. No source found explains the change.
By December 2022 he had moved on. A third Medium post announces Birth, "an upcoming on-chain algorithmic art collection on Bitcoin", and names @BirthCreator as his account 11. Its site, birth.ink, describes itself as "on-chain art on Bitcoin" 12.
How the work was constructed
The program is a single script of 9,622 bytes, SHA-256 7f3b8c9fa1104df9bb1a2569f2a33b4e97647075209ea45b9aea111841b2b9aa. It was retrieved from the Art Blocks index on 20 September 2026 and read in full. No code is reproduced here 1.
Reading the hash. The script walks along the token hash, one to three hexadecimal characters at a time. In order it draws: a colour for the squares, a colour for the triangles, an angle step, a scaling step, a maximum size, the size of the drawing area, a line width and a starting size 1. A Python replica of this sequence, run against all 80 hashes, reproduces every published trait. Only the first 24 or 25 of the 64 hexadecimal characters are ever read for these parameters (own computation from 1).
Drawing. Every frame, at a requested 60 frames a second, the program adds one square and one triangle to a ring buffer and redraws the whole buffer. The image builds up for several seconds and then keeps cycling as old shapes are overwritten. Each new pair is rotated by the angle step and shrunk or grown by the scaling step until it passes the maximum size, when it resets to the starting size 1. Negative steps make shapes grow and invert, so the sweep passes through zero; 37 of the 80 tokens have a negative scaling step (own computation from 1). The square is drawn at 70 per cent of the triangle's span, and both are offset from the centre by half the drawing area, which is why each output reads as a ring with a clear eye.
Colour and glow. Outline opacity is set from the brightness of each colour, so dark colours are drawn more opaquely than light ones 1. Where the line is thin the shapes are combined additively, so overlapping lines brighten towards white. That is the "Glowy" trait. Every Tier 1 output with a base line width below 0.7 is Glowy, and every other Tier 1 output is not 1.
Tiers. Tier 2 (Rare) outputs fill a few shapes with translucent colour: one new shape each second, keeping the last 30. Tier 3 (Legendary) outputs fill two sets of shapes on two timers, always glow, and set the whole composition spinning, slowing each time with friction 1. This matches the artist's own account of the tiers 8.
| Trait | How it arises (code reading, checked against data) | Published counts of 80 |
|---|---|---|
| Rarity tier | leading digits of the hash, divisible by 20 or by 5 (see quirk 1) | Normal 71, Legendary 5, Rare 4 |
| Glow | additive blending: thin Normals and all Legendaries | Glowy 51, No glow 29 |
| Line thickness | one hex digit over 15, floored at 0.4 | Thin 45, Thick 19, Medium 16 |
| Square / triangle red, green, blue | one byte each, binned at roughly 40, 80, 175 and 215 | e.g. square red Medium 29, High 17, Highest 17, Lowest 9, Low 8 |
| Angle modification speed | absolute angle step, 0.1 to 12.5 radians per frame | Medium 25, Slowest 19, Fastest 18, Fast 10, Slow 8 |
| Shape scaling speed | the size of the scaling divisor, 31 to 2,034 | Slow 20, Medium 17, Fastest 17, Fast 14, Slowest 12 |
| Maximum shape size | a reset limit from 0.5 to 4 times the drawing area | Medium 41, Small 24, Large 15 |
| Main drawing area size | 25 to 60 per cent of the shorter screen side | Large 30, Medium 26, Small 24 |
Counts are from the index; the ranges are own computation from the replica 1.
Interaction. The space bar pauses. Keys 1 and 2 fade the squares or the triangles in and out, and 3 brings both back. On Rare and Legendary outputs, 4 toggles the fills, and on Legendaries 5 stops or restarts the spin (code reading) 1.

Squares and Triangles #73, held by AB5D. Labelled "Thin" but drawn with the widest line of any token carrying that label (see quirk 3). Render: Art Blocks media proxy.
Quirks in the algorithm
A full read of the program, checked against all 80 token records with the replica, turned up the following. Points resting on the code alone are marked as code readings.
- Rarity is decided by reading hexadecimal as decimal. The tier test parses the hash without a base, so JavaScript reads only the leading decimal digits and stops at the first letter. A hash beginning "885c" is read as 885; one beginning "0c4c" as 0; one beginning with a letter gives no number at all 1. The replica reproduces all nine Rare and Legendary tokens this way. Three of the five Legendaries (#23, #66 and #74) owe their status to a hash that begins with a zero followed by a letter. The 41 tokens whose hash begins with a letter could never be Rare or Legendary (own computation from 1).
- The rarity odds are not what the code seems to say. At face value the test makes one output in 20 Legendary and three in 20 Rare. Under the decimal reading, a simulation of 200,000 random hashes gives about 4.4 per cent Legendary and 8.2 per cent Rare (own computation). The edition has 5 Legendaries and 4 Rares, against the 4 and 12 the face-value rule would predict 1.
- A line-thickness label that skips a value. Line width is one hex digit divided by 15. Digits 8 to 10 are labelled Medium and 12 to 15 Thick, but digit 11, a width of 0.73, is labelled Thin 1. Eight tokens are affected: #8, #9, #21, #24, #47, #48, #72 and #73. Because their width is above 0.7, the Normals among them are drawn without glow, unlike every other "Thin" Normal (own computation from 1).
- Seven digits share the thinnest line. Any digit from 0 to 6 is raised to the 0.4 floor, which is why Thin is the largest group, at 45 (own computation from 1).
- "Fastest" can be the slowest turn. The angle step is in radians, and the trait ranks its raw size. A turn of 12.5 radians looks the same as a turn of about 0.07 radians, because full circles cancel out. Five of the 18 "Fastest" tokens turn by less than 0.3 radians per frame in effect, less than any "Slowest" token except two (own computation from 1).
- A broken fill on Legendaries. In the Legendary set-up, the triangle's extra fill opacity is multiplied before it has been given a value, so it becomes "not a number" (code reading) 1. A browser canvas usually ignores an invalid colour, so those triangles may take the fill colour set just before, the square's. This has not been tested in a live render.
- Maximum shape size never sets the starting size. The starting size is the smaller of two limits. At a 1,920 by 1,080 window the limit set by an untraited hex digit is the smaller in all 80 tokens (own computation from 1).
- Output depends on the screen and the machine. The canvas fills the browser window, and line widths scale with its shorter side. The ring-buffer length, 900 or 1,000 shapes for Normals, is chosen after that scaling. The Rare and Legendary fill timers run on wall-clock seconds while shapes are added per frame, so a slow machine fills a different set of shapes. The Legendary spin direction uses an unseeded random number (code reading) 1.
- A safeguard that never fired. If a colour's channels sum to 60 or less, the script redraws it, up to five times. None of the 80 tokens needed a redraw (own computation from 1).
The most coveted variants
No collector writing on this project was found. The obvious targets are the nine outputs in the upper tiers, the only ones that animate fills and, in the case of Legendaries, spin 1.
Legendaries (5 of 80): #17, #23, #66, #72 and #74. In still renders the fills read as rings of translucent petals over the outline field. #17 has a ring of pale-blue filled squares; #74 has large green and salmon petals around a red hoop 1. #72 also carries the mislabelled line width of quirk 3.

Squares and Triangles #17, Tier 3 (Legendary). Render: Art Blocks media proxy.

Squares and Triangles #74, Tier 3 (Legendary), one of three whose status comes from a hash beginning with "0". Render: Art Blocks media proxy.
Rares (4 of 80): #0, #19, #42 and #77. Rares are always drawn without glow, and their fills appear as a scatter of soft, pale shapes inside the ring 1. #0, the first invocation, is a dim ochre ring flecked with filled lilac shapes.

Squares and Triangles #0, Tier 2 (Rare), the first invocation. Render: Art Blocks media proxy.
Sales. Trading has been thin and cheap. OpenSea's activity feed, read by automated extraction, gave about twenty recent sales in US dollars but no dates. The highest were #24 at about $540 and #46 at about $482, both bought by the account NoWayJoseph. The two AB5D tokens changed hands at about $309 (#64) and $293 (#73), both to one account 13. All four are Normals, while the one Legendary in the feed, #72, sold for about $219, so the market has not clearly priced the tiers. No auction-house sale was found, and asking prices far exceed trades: the lowest Art Blocks listing at retrieval was 0.6 ETH, eight times the mint price 114.
Notable collectors
At retrieval the 80 tokens were held by 66 addresses 1. The largest holder, 0x72ce…9194, has five, #14 to #18, including the Legendary #17. OpenSea shows #17's owner under the username artbydots 15. An address with three, 0xd4f1…9772, holds the Legendary #72; Art Blocks displays its owner as drCCO 16. Both are pseudonyms; no source says more about either. AB5D holds #64 and #73 in the wallet 0xdd19308a9731cdecb67e0d80ca6823394208c045 117. No museum, fund or DAO holding was found.
The mint
The index records the first three tokens as minted on 7 December 2021, before the project's activation on 10 December 1. OpenSea's activity feed lists #0 and #2 as sold by an account named Maksim_Hapeyenka, which suggests they were artist mints 13. The public sale was set for 16 December 2021 at 17:00 UTC as a Dutch auction from 3 ETH, falling every five minutes through twelve levels to 0.075 ETH 1. Eleven five-minute steps take 55 minutes. The first public mint is recorded at 17:55:30 UTC, which suggests no one bought before the resting price (own computation from 1).
The sale was slow. Only 22 tokens had been minted 24 hours after the start, 46 by the end of December and 53 after 30 days. The 80th was minted on 27 April 2022 1. The sales notes pledged "100% of all ETH above floor price" to The Humane League, and the September post made the same promise 18. If the timing above is right, public buyers paid the floor and the pledge had little to act on. An automated reading of the artist address on Etherscan showed no transfer to an address tagged as the charity 6.
Copyright and licensing
The index records CC BY without a version or a link 1. On that label, the images may be copied, adapted and used commercially provided the artist is credited. The program itself carries no separate code licence, and p5.js is loaded by the platform at view time 1. The earlier AB5D essay makes the same point: the runtime's licence does not license the artwork 4. The earlier "visual_experiments" repository is MIT-licensed, but that covers the Processing sketches there, not this program 9.
Significance and limitations
Squares and Triangles is a small, candid piece: an artist's first generative sketch, found in a night of trial and error and released on an open platform with an apology built into its description. Its interest lies in how much visual depth comes from two outlined polygons, and in how legible its flaws are. The rarity tiers come from a decimal reading of a hexadecimal string, a thickness label skips a value, the "speed" traits rank radians that wrap around, and the Legendary fill depends on an unset number. None of these spoils the images, but the published traits are not a reliable guide to what a viewer sees. The artist's own posts make the project better documented than most early Factory releases, though no interview, exhibition or physical work was found.
Unresolved research questions:
- The quotations from the three Medium posts and the birth.ink site came from automated WebFetch extraction and should be checked against the pages, as should his stated age and background.
- Why did the planned edition of 1,024 close at 80? The answer may be on X (@BirthCreator), which cannot be fetched, or on laminaria-art.com, which no longer resolves and could not be read in an archive.
- Was any donation made to The Humane League? The artist address's full history was not examined, and the sale prices behind the pledge rest on mint transaction values not yet read.
- The OpenSea sale prices, buyers and the Maksim_Hapeyenka sales of #0 and #2 came from undated automated extraction. They need confirming, with dates, from transaction records.
- What does the Legendary triangle fill look like in a live browser, given the invalid opacity in quirk 6?
Bibliography
Primary
-
Art Blocks public GraphQL index,
projects_metadatafor project 218 (description, sales notes, licence and the full program) andtokens_metadatafor all 80 tokens. Retrieved 2026-09-20 via https://artblocks-mainnet.hasura.app/v1/graphql. Collection page: https://www.artblocks.io/collection/squares-and-triangles-by-maksim-hapeyenka ↩
-
Art Blocks, artist profile, Maksim Hapeyenka. Read 20 September 2026. https://www.artblocks.io/artists/maksim-hapeyenka ↩
-
Etherscan, address
0x9c718ebbf5c709667cd3bc24d957d8f898131dd2(birth-ent.eth), the project's artist address. Read 21 September 2026 by automated extraction. https://etherscan.io/address/0x9c718ebbf5c709667cd3bc24d957d8f898131dd2 ↩
-
Maksim Hapeyenka, "'Squares and Triangles' prehistory", Medium, 24 September 2021. Read by automated extraction. https://medium.com/@maksim_hapeyenka/squares-and-triangles-prehistory-da4423b9f9c8 ↩
-
Maksim Hapeyenka, "'Squares and Triangles': everything you need to know", Medium, 24 September 2021. Read by automated extraction. https://medium.com/@maksim_hapeyenka/squares-and-triangles-everything-you-need-to-know-ed9ea913474e ↩
-
Maksim Hapeyenka (maxgmer), GitHub profile and the "visual_experiments" repository (Processing 3, MIT licence). Read 21 September 2026. https://github.com/maxgmer and https://github.com/maxgmer/visual_experiments ↩
-
Maksim Hapeyenka, "Birth: upcoming generative art project on Bitcoin", Medium, 22 December 2022. Read by automated extraction. https://medium.com/@maksim_hapeyenka/birth-upcoming-generative-art-project-on-ethereum-a21cc281971f ↩
-
Birth, "on-chain art on Bitcoin", project site. Read 21 September 2026. https://birth.ink/ ↩
-
Art Blocks, token page for Squares and Triangles #64, showing AB5D as owner. Read 20 September 2026. https://www.artblocks.io/marketplace/asset/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270/218000064 ↩
Video and audio
-
"Squares and Triangles", YouTube playlist of five tier-preview videos, channel Maksim Hapeyenka (title and channel confirmed via YouTube oEmbed, 21 September 2026; videos not watched). https://www.youtube.com/playlist?list=PLwCtmsSTI3-F7EMNOPJz8pZs8pUT0PNpC ↩
Criticism, collecting and market
-
AB5D, "Squares and Triangles by Maksim Hapeyenka", earlier series essay. Read 20 September 2026. https://ab5d.xyz/series/squares-and-triangles-by-maksim-hapeyenka/ ↩
-
OpenSea, "Squares and Triangles by Maksim Hapeyenka" collection activity feed. Read 21 September 2026 by automated extraction; prices shown in US dollars, undated. https://opensea.io/collection/squares-and-triangles-by-maksim-hapeyenka/activity ↩
-
Art Blocks, "Squares and Triangles by Maksim Hapeyenka" marketplace collection page (five listings from 0.6 ETH). Read 21 September 2026. https://www.artblocks.io/marketplace/collections/squares-and-triangles-by-maksim-hapeyenka ↩
-
OpenSea, "Squares and Triangles #17" item page (owner artbydots). Read 21 September 2026 by automated extraction. https://opensea.io/assets/ethereum/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270/218000017 ↩
-
Art Blocks, token page for Squares and Triangles #72 (owner drCCO) and profile of
0xd4f11b5f55c20fc71c4d533d1d4c1106747a9772. Read 21 September 2026. https://www.artblocks.io/token/218000072 and https://www.artblocks.io/profile/0xd4f11b5f55c20fc71c4d533d1d4c1106747a9772 ↩
Further reading
-
Art Blocks, "Factory" discover page. Read 20 September 2026. https://www.artblocks.io/discover/factory ↩
-
Art Blocks, "Art Blocks 500: The Complete Collection". Read 20 September 2026. https://www.artblocks.io/articles/art-blocks-500-complete-collection ↩
Supplied revision published by AB5D. Author not specified. Original prose: CC0. Artwork and code rights are addressed separately above.
Token usage unavailable for the complete essay.
Token usage
Usage for this supplied revision was not provided. The linked generation record describes the original research batch.
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.
