Vector Field

Vector Field

"We favor the simple expression of the complex thought. We are for the large shape because it has the impact of the unequivocal. We wish to reassert the picture plane. We are for flat forms because they destroy illusion and reveal truth." - Mark Rothko

Radically minimalist, stored completely on the Ethereum Blockchain, and limited to only 300 verifiably random iterations; Vector Field is an investment piece for the serious collector.


Vector Field is an exploration of the blockchain as material, the physicality of randomness, and immutable minimalism:

  • Blockchains establish truth through decentralized consensus
  • Injecting true randomness into a decentralized, deterministic network (blockchain) gives it properties of a physical material
  • Gestures restrained in number and complexity best convey this materiality and its expressive potential



Each of the 300 Vector Fields are generated and stored completely on-chain. That means that rather than containing a link to an image file, as is the case with most NFTs, the instructions to draw each Field are encoded on the token itself.

The art is completely stored on the Ethereum blockchain as the tokenURI:

//adapted from

function svgToImageURI(string memory svg) public pure returns (string memory) {
        string memory baseURL = "data:image/svg+xml;base64,";
        string memory svgBase64Encoded = Base64.encode(bytes(string(abi.encodePacked(svg))));
        return string(abi.encodePacked(baseURL,svgBase64Encoded));

Verifiable Randomness

The Vector Field contract uses Chainlink VRF (verifiable randomness function), which is an oracle that allows true, physically-generated randomness to be called into Solidity functions.

Like physical objects, each Vector Field exists between the artist’s intention and the material’s natural randomness. Through this process, we are using the blockchain itself as a material, imbuing it with a randomness that would not normally exist without our intervention.

The final Vector field forms are a record of the dialogue between the smart contract and a truly random number generated from quantum phenomena.



Each Field is a truly random confluence of granular variations in color, dimension, and layout. The most harmonious, discordant, or interesting combinations will rise in desirability based on the tastes of the collector community and wider market. That said, warmth and saturation tend to be rare. Blanks and near-blanks are exceptionally rare.



Every Field originates from a two-stage mint process that centers the collector as primary to the finished work.

During the first stage, the smart contract creates the unique token and requests a truly random number from Chainlink VRF. The unique random number is encoded as part of the token URI, and the embryonic Field is ready for the second stage.


During the second stage, the SVG generation function takes the token’s random number and uses it to describe three rectangles with a for loop, :

for(uint i = 0; i < 3; i++) {

            string memory pathSvg = generatePath(uint256(keccak256(abi.encode(_randomness, i))));
            finalSvg = string(abi.encodePacked(finalSvg, pathSvg));
        finalSvg = string(abi.encodePacked(finalSvg, "</svg>"));

Each rectangle’s dimensions, location, color, and opacity are determined by the random number, within boundaries set by the artist:

//adapted from

function generatePath(uint256 _randomness) public view returns(string memory pathSvg) {

        //the x/y dimensions and x/y position of each rectangle are bounded by the modulo %, 
        //which sets their maximum value and gives the Field visual coherence regardless of the randomness value.

        uint256 x = uint256(keccak256(abi.encode(_randomness, height * 2 + 1))) % width;
        uint256 y = uint256(keccak256(abi.encode(_randomness, width + 1))) % height;
        uint256 w = uint256(keccak256(abi.encode(_randomness, height + 2 + 3))) % 1000;
        uint256 h = uint256(keccak256(abi.encode(_randomness, height * 2 + 1))) % width;

       //opacity of each rectangle bounded at 80% maximum:

        uint256 opacity = uint256(keccak256(abi.encode(_randomness + 2))) % 80;

       //each variable above Mad-libbed into the string that becomes the SVG code:
				pathSvg = string(abi.encodePacked( "<rect x='", uint2str(x), "' y= '", uint2str(y),"' width= '", uint2str(w), "' height='", uint2str(h), "' opacity='.", uint2str(opacity), "'"));

				//color of each rectangle randomly selected from the palatte of six defined in constructor:

        string memory color = colors[_randomness % colors.length];
        pathSvg = string(abi.encodePacked(pathSvg, " fill='", color,"'/>"));

The randomly generated SVG is then encoded as a bytes32 string and embedded directly into the token URI. This completes the Field and binds it immutably to the Ethereum Blockchain.


The Field above is described completely by the code below, which is encoded as its tokenURI:

<svg xmlns='' 
height='2000' width='1500' fill='none' viewBox='500 100 1500 2000'>

//the background of each Field is comprised of two layers:

//the first layer is like a basecoat 
//It's completely white and opaque
//It's the only constant between all Fields

<path d='M500 100h1500v2000H0z' fill= '#ffffff'/>

//this second layer is mediated by the random number and has variable opacity and color

<path d='M500 100h1500v2000H0z' fill='#868b8e' opacity='.56'/>

//and here are the three rectangles whose dimensions, locations, colors, and opacities 
//are mediated by the random number's interactions with the boundary function:
<rect x='528' y= '336' width= '489' height='528' opacity='.0' fill='#b9b7bd'/>
<rect x='647' y= '1001' width= '141' height='647' opacity='.34' fill='#b9b7bd'/>
<rect x='699' y= '1181' width= '278' height='699' opacity='.73' fill='#970c10'/>


Vector Field is both a process and a product. We are developing a set of tools and techniques, both technical and conceptual, for processing the present moment and constructing the future.


Mint Your Field

Vector Field x Chainlink