Concepts

The mechanism

A contribution enters the sale. A proof carries its allocation to a fresh destination.

Contribute → finalize → claim

A participant contributes during the sale and creates a public commitment from a private claim secret. The commitment records an entitlement without naming the wallet that will eventually receive it.

When the sale closes, Venuo finalizes the contribution set. The participant later proves that one valid commitment belongs to that set and binds the claim to a chosen destination.

one allocation flow
funding wallet          Venuo sale             claim destination
     | contribute + commit |                         |
     |-------------------->| finalize eligible set   |
     |                     |                         |
     |   membership proof  |                         |
     |-------------------->| verify one-time claim   |
     |                     |------------------------>|
     |                     | deliver token allocation|

The claim credential

The claim credential proves membership in the finalized sale without revealing which commitment it spends. It also binds the allocation to the selected destination and creates a one-time nullifier so the entitlement cannot be reused.

What changes onchain

StagePublicNot directly published
ContributionFunding wallet, amount, sale, timing, commitmentFuture claim destination
FinalizationFinalized sale set, terms, and original commitment submissionsWhich commitment will later be redeemed
ClaimDestination, allocation, timing, one-time nullifierWhich contribution commitment was redeemed

Cancellation and refunds

If a sale is cancelled, the same entitlement can authorize its refund path instead of a token claim. The one-time nullifier ensures the participant cannot complete both outcomes.

What remains visible
The proof does not publish the commitment-to-claim mapping. It does not hide the public contribution, claim destination, amounts, timing, or network metadata.

Under the hood

Each sale runs on an append-only Poseidon Merkle tree (fixed depth 20) that accepts one commitment per contribution. Closing the sale freezes one final root; claims accept that root only. A claim is a Groth16 proof over BN254 showing that a secret-derived commitment belongs to the final root, paired with a one-time nullifier and a destination binding that proof-copying cannot redirect. The Solana program independently re-checks the root, sale context, and allocation before it verifies the proof — a valid proof alone never authorizes settlement.

ComponentResponsibility
Sale accountContribution terms, allocation, capacity, and windows
Commitment treeDepth-20 Poseidon tree; freezes to one final root at close
Payment / token vaultsHold contributed SOL and the escrowed token inventory
Nullifier registryBlocks a spent entitlement from claiming or refunding twice

Full cryptographic notation, the claim relation, account model, and security proofs are in the technical paper.