Documentation
The rules of a
layered work
TensileInk V2 is a fixed run of 2,000 works on Ink. This page documents how the traits
are drawn, how rarity is scored, how the salt is committed and revealed, and how the
migration from the first collection works. Everything described here runs on chain and
can be read without this site.
01. Overview
A fixed run,
drawn from a hash
TensileInk V2 holds 2,000 works. Each is painted in layers and assembled from five
traits: Palette, Crown, Pendant, Gear and Scale. The combination is not a studio
choice. It is read from the hash of a salt and the token id, so the set resolves the
same way for everyone who checks it.
The run replaces the first collection. Holders of that collection claim their places
in this one, and the traits of every work are fixed before the first claim is made.
02. The five traits
Five traits, one byte each
Each trait reads one byte of the work's hash. The byte selects a variant, and every
variant has its own drawing in the artwork.
TraitValuesVariants
Palette
Violet, Green, Amber, Azure, Crimson
5
Gear
Grid, Mesh, Weave, Spiral
4
Scale
Calm, Taut, Warped, Ruptured
4
03. Rarity tiers
A score, then a tier
Each variant carries a weight. The five weights of a work add up to a rarity score
between 6 and 17, and the score places the work in one of five tiers. The counts below
are the counts for the full run.
TierScoreWorksShare of the run
Common
6 to 11
1,109
More than half the run.
Uncommon
12 to 13
624
Just under a third.
Rare
14
152
152 works in the whole run.
Epic
15
86
86 works in the whole run.
Legendary
16 to 17
29
29 works in the whole run.
04. The salt
Committed before, revealed after
At deployment the contract stores a commitment: the hash of a salt, and nothing else.
The salt itself stays private while the claim window runs.
When the window closes the salt is revealed. The contract checks it against the
commitment and rejects anything that does not match, so the committed salt is the only
one that can ever be used. From then on the traits of a work are the first five bytes
of keccak256(salt, tokenId), and anyone can recompute them.
traits = keccak256(abi.encodePacked(salt, tokenId))
05. Migration
One work held, one place taken
A snapshot block is fixed before the window opens. The balance of every address in the
first collection is frozen at that block, and the whole list is committed as a single
Merkle root. After the window opens that root can no longer change.
Claiming mints exactly one new work for each eligible place, less whatever the address
has already taken. The place count and a proof travel with the claim, so only the
address the snapshot recorded can take them. claim(count, proof) mints the whole
remaining entitlement in one call. claimUpTo(count, proof) mints a bounded batch for an
address with a large entitlement.
The window runs once, on the dates the contract holds. Once it closes, the unclaimed places are burned:
each one is minted to the contract and immediately destroyed, so the id can never be
used again. Circulating supply then equals exactly what was claimed.
06. Royalty
Ten percent, split two ways
The contract implements ERC-2981. On a secondary sale it reports a royalty of ten
percent of the sale. Thirty percent of that royalty accrues to the wallets holding
the works, split by rarity weight; the rest goes to the project wallet. There is no
treasury contract in between.
The holder part is not paid out on the sale. It is held in the contract against each
work, so it moves with the work and is withdrawn from the Claim view at any time,
with no staking and no locking. holderShareBp reports the current split publicly.
07. Supply
Two thousand, fixed
Cap2,000
MAX_SUPPLY, a constant
Traits5
Palette, Crown, Pendant, Gear, Scale
Tiers5
Common to Legendary
No function can create a token beyond the cap. totalSupply counts the works that exist
now, and because unclaimed places are burned it can settle below 2,000. The cap itself
never moves.
08. The window
One window, once
Migration is the only way into this collection. There is no public sale and no second
route. The window opens and closes at dates set in the contract, and
closes for good. An address that held works at the snapshot can claim at any point
inside it, and an address that held nothing has nothing to claim.
StepWhenWhat happens
Snapshot
before the window
The balance of each address in the first collection is read at a fixed block, and the whole list is committed as one Merkle root.
Commitment
before the window
The salt is committed on chain. The traits of all 2,000 works are fixed from that moment, though none are visible yet.
Claim
until the close date
Holders connect the wallet they held with and claim one place per work. claimUpTo takes a batch of up to fifty.
Reveal
after the window
The salt is published and checked against the commitment. Traits and tiers can then be read and verified by anyone.
09. Reading it yourself
Trust nothing here
Every claim on this page can be checked without asking us. The V2 contract answers
these calls directly, and the Works view reads its supply from the first two.
| Call | Answers |
| MAX_SUPPLY | The cap of the run, 2,000. |
| totalSupply | How many works exist now. |
| claimWindowOpen | Whether the migration window is open. |
| eligibleRoot | The single root the snapshot list is committed to. |
| traitHash | The hash a work's traits are read from. |
| rarityOf | The rarity score of a work, 6 to 17. |
| royaltyInfo | The receiver and the royalty for a sale. |
10. Questions
Asked plainly
Can the art be chosen in advance?
No. The traits are derived from a salt that stays private until the window closes, and the commitment is fixed before the first claim.
What happens to places nobody claims?
They are burned when the window closes. The ids cannot be minted again.
Can supply pass 2,000?
No. MAX_SUPPLY is a constant and no function can create a token beyond it.
Where does the royalty go?
Ten percent of a secondary sale. Thirty percent of that royalty accrues to the wallets holding the works, and the rest goes to the project wallet.
How is the holder share paid?
It accrues in the contract against each work and is withdrawn from the Claim view. Nothing is staked or locked, and the split is reported on chain by holderShareBp.