Documentation

Auctions & Redemptions

Starting the auction

Any address can kick off the auction by calling start() on the vault - provided card holders have reached quorum and a reserve price exists. This call has to be made with an amount of ETH matching the reserve price, this then also functions as the first bid.

Auction mechanics

ParameterDefault
Duration7 days
Minimum bid increment5% above previous bid
Anti-snipe extension15 minutes

Bidding. Call bid() with an ETH value at least 5% higher than the current highest bid. The moment a new bid arrives, the previous high bidder is automatically refunded - no manual withdrawal step. If that refund somehow fails (say the previous bidder is a contract with no receive function), the amount is wrapped as WETH and sent instead.

Anti-snipe. Any bid in the final 15 minutes resets the deadline to 15 minutes out. This guarantees every interested bidder a fair chance to respond instead of losing to a transaction timed for the last block.

Ending. When the timer expires, anyone can call end(). The NFT transfers to the winning bidder, and the winning ETH stays parked in the vault contract until card holders come to claim it.

Direct redemptions

If you've quietly acquired all 100 cards while the vault is still Inactive, you don't need an auction at all. Call redeem() on the vault and the collectible transfers directly to you.

Cashing out

After an auction ends, every card holder withdraws their proportional cut of the winning bid by calling cash() on the vault. Your payout is calculated as:

yourPayout = (yourCardBalance × auctionProceeds) / 100

Your cards are burned in the same transaction. Cashing out converts your ownership stake into your slice of the proceeds.

Example. You hold 25 of 100 cards and the winning bid was 10 ETH. When you call cash(), you receive 2.5 ETH and your 25 cards are burned.

Note:

Just like outbid refunds, if the ETH payout to your address fails, the contract wraps it as WETH and sends that instead.