A generative art system that creates unique, deterministic Rorschach-style inkblots from Ethereum addresses for NFTs. Each address produces a consistent, reproducible particle-based image.
- Deterministic Generation: Same Ethereum address always produces the same inkblot
- Particle-Based Animation: Thousands of small circles create organic, symmetrical patterns
- Color Theory Integration: Colors are derived from address characteristics
- NFT-Ready: Includes metadata generation and trait extraction
- Special Cases: Unique patterns for addresses containing "420" or with repeating characters
The system uses color theory to create harmonious color combinations based on Ethereum address characteristics:
- Primary color is derived from the first 7 characters of the address
- First 3 characters determine the base hue (0-360°)
- Next 2 characters set saturation (70-90%)
- Next 2 characters control lightness (40-70%)
The system creates color pairs using the following relationships:
-
Harmony (Adjacent Colors)
- Default relationship for most addresses
- Colors are 20° apart on the color wheel
- High saturation (70-90%) for vibrant combinations
- Balanced lightness (40-70%) for optimal contrast
-
Special Cases
- 420 Special: Green color pair for addresses containing "420"
- Monochrome: Low-saturation grayscale for addresses with repeating zeros
- Sepia: Warm earth tones for addresses with repeating non-zero characters
Colors are named based on their position on the color wheel and their properties:
- Base colors: Red, Orange, Yellow, Green, Teal, Blue, Indigo, Purple
- Modifiers: Dark, Light, Muted, Vibrant
- Special cases: Deep, Pale, Gray percentages
npm installnode index.js --ethAddress 0x123... --size 800 --outputPath output.pngOptions:
--ethAddress: Ethereum address for deterministic generation--size: Canvas size in pixels (default: 800)--outputPath: Path for saving the output image--particleCount: Number of particles per frame--runDuration: Number of frames to generate--saveMetadata: Flag to save NFT metadata--examples: Generate predefined example inkblots
You can also generate images for 50 random addresses to get a feel for what the inkblots look like in the wild:
node src/testAddresses.jsconst { generateInkblot } = require('./src/generateRorschach');
const result = await generateInkblot({
ethAddress: '0x123...',
size: 800,
outputPath: 'output.png',
saveMetadata: true,
});The generator creates metadata in standard NFT format:
{
"name": "Infinite Inkblot 0x5B38Da6a",
"description": "A unique Rorschach-style inkblot generated from an Ethereum address",
"image": "inkblot_0x5B38Da6a.png",
"attributes": [
{
"trait_type": "ColorRelationship",
"value": "Harmony"
},
{
"trait_type": "Address",
"value": "0x5B38Da6a..."
}
]
}src/: Source code for inkblot generationcli.js: Command line interfaceconfig.js: Global parametersgenerateRorschach.js: Main generator moduleutils/: Utility functionscolors.js: Hardcoded color mappings (for backwards compatibility)colorTheory.js: Color generation and relationshipsethUtils.js: Ethereum address analysisparticleUtils.js: Particle generationrenderUtils.js: Image rendering
Smart contracts are built with Foundry, and can be found in contracts/.
MIT