qpostmintparameters`pRwPMP: Only <= 256 configs`@PMP: pmpKey cannot be empty or e`DRnxceed 255 bytes`PMP: pmp is locked and cannot be`DPMP: tokenPMPPostConfigHook does`D not implement IPMPConfigureHook`dPMP: tokenPMPReadAugmentationHook does not implement IPMPAugment`dPMP: paramType is unconfiguredPMP: pmpLockedAfterTimestamp is in the past and not unlimited (z`dPMP: String params must have art`DRwPMP: authAddress is zero`@R{PMP: authAddress is not zero` RyPMP: minRange is not empty`0RyPMP: maxRange is not empty`0RzPMP: selectOptions is empty`(PMP: selectOptions length > 255PMP: maxRange > _TIMESTAMP_MAXPMP: param not part of most rece`DRyntly configured PMP params`0PMP: input paramType is unconfig`DPMP: token owner auth requiredPMP: artist and token owner auth`DPMP: artist and token owner and `DPMP: artist and address auth req`DPMP: token owner and address aut`DPMP: selectOptions index out of `DPMP: bool param value must be 0 `DRuPMP: invalid paramType`PPMP: value must be empty for str`DPMP: artist auth required to con`DRsfigure artist string``PMP: non-string param must have `DRqempty string value`pPMP: artist string cannot be con`Dfigured for non-string paramsRqpostmintparameters`pRwPMP: Unhandled ParamType`@a>uWa>ua>=V[`@Q`PPPPPPPPPPPPPV[`RuPMP: Invalid paramType`PPMP: selectOptions is not emptyRxPMP: minRange >= maxRange`8PMP: param value out of boundsRrIndex out of bounds`h
qpostmintparameters`pRwPMP: Only <= 256 configs`@PMP: pmpKey cannot be empty or e`DRnxceed 255 bytes`PMP: pmp is locked and cannot be`DPMP: tokenPMPPostConfigHook does`D not implement IPMPConfigureHook`dPMP: tokenPMPReadAugmentationHook does not implement IPMPAugment`dPMP: paramType is unconfiguredPMP: pmpLockedAfterTimestamp is in the past and not unlimited (z`dPMP: String params must have art`DRwPMP: authAddress is zero`@R{PMP: authAddress is not zero` RyPMP: minRange is not empty`0RyPMP: maxRange is not empty`0RzPMP: selectOptions is empty`(PMP: selectOptions length > 255PMP: maxRange > _TIMESTAMP_MAXPMP: param not part of most rece`DRyntly configured PMP params`0PMP: input paramType is unconfig`DPMP: token owner auth requiredPMP: artist and token owner auth`DPMP: artist and token owner and `DPMP: artist and address auth req`DPMP: token owner and address aut`DPMP: selectOptions index out of `DPMP: bool param value must be 0 `DRuPMP: invalid paramType`PPMP: value must be empty for str`DPMP: artist auth required to con`DRsfigure artist string``PMP: non-string param must have `DRqempty string value`pPMP: artist string cannot be con`Dfigured for non-string paramsRqpostmintparameters`pRwPMP: Unhandled ParamType`@PPPPPPPPPPPPPV[`RuPMP: Invalid paramType`PPMP: selectOptions is not emptyRxPMP: minRange >= maxRange`8PMP: param value out of boundsRrIndex out of bounds`h
DOS (Dances on Shadows)
This series is part of the Paysages Plausibles exhibition presented at Art Basel, Zero Space, 16–21 June.
DOS (Dances on Shadows) explores the relation between digital and physical aesthetics: pixelated shadows, coloured pastel contours, gestures, and drifts around latent landscapes. DOS follows the movements, traces, and residual energies that inhabit these plausible landscapes, revealing structures embedded within the main series through the plotter's language of contour, repetition, and displacement.
Each work pairs an NFT with a physical plotter drawing: a landscape on paper overlaid with pastel on tracing paper, allowing ground and surface to read through one another. The project sits between Sol LeWitt's instruction-based drawings and Harold Cohen's computer-generated works, where programmatic systems produce images that oscillate between representation and abstraction. The artist defines the rules, but the final configuration remains open to the generative process.
Ten works are available online. Each acquisition includes both the NFT and the accompanying physical artwork. To enquire about purchasing, please contact sales@artblocks.io.
// contractUtils.js
Function selector f getLiveData(uint256,") = 5ab53d9f8cc8560d63a97f685fc0b43b0207c52774e14c25a396a9b8e8 First 4 bytes (8 hex chars@a**
* Call the smart8
Address - T T URL`X try in ord4ffc102cdc983c50bba66b4284c390b(?
=https://your-
// Click animation: small bounProgress > 0 && ed frame for supply pool sprites shimmer overlaye part of future"BASE_PIXEL_DIM;C>RECEIVE_STYLES.FALL`[
Baseline: 1500RECEIVE_STYLES.GRIDSNAKE_SPEED_INCREASE16x16 (4x), 32x32 (2@= RECEIVE_STYLES.BOU@O%IZEXn
BASE_PIXEL_DIM &
SHOOTER LOGIC
* Extract a quadrant from bitmap and create padded ImageDa1
number} srcSiz@2= new Uint8Clampedbon right/bottomaDaŲ !
in clockwis&ht.getEle@
ById(CANVAS_IDglobalCompositeOperd8 uedToken, audioMan5 P
CYCLE_DURATION!= G REMOVED: I+e#.*REMOVED: harmonic- L5SPECIAL_EFFECT_DURATIONINVERSE SCALING: H,CRUNCHY UPDATES: On"{Che%6#Q`*Az%J$F.3: RANDOM HUE SHIFT0: DISPLACEMENT ONLY%
// fetchTokens.js
/**
* F@ from ArtBlocks API@*&
that have been
: ["226", "345@/
async functio ('https://core-api.artblAn20053426ad1c782de9ea8444358070-5
// contractUtils.js
Function selector f getLiveData(uint256,") = 5ab53d9f8cc8560d63a97f685fc0b43b0207c52774e14c25a396a9b8e8 First 4 bytes (8 hex chars@a**
* Call the smart8
Address - T T URL`X try in ord4A8ed1FC47dc71c3EDA3F1
=https://your-