Appearance
Buy
Buying is one transaction. You submit the seller's signed order together with payment, the contract validates everything, splits the payment, and transfers the token to you — all atomically. Either the whole thing happens or none of it does.
What happens in the transaction
You call fulfillOrder(order, signature) with ETH attached
│
├─ 1. CHECK collection allowed · order not expired
│ nonce unused and not below the maker's floor
│ signature really is the maker's
│ maker still owns the token
│ marketplace still approved to move it
│
├─ 2. CONSUME the nonce is marked used, before any money moves
│
├─ 3. PAY royalty ──► ERC-2981 receiver
│ platform fee ──► fee recipient
│ remainder ──► seller
│ any overpayment ──► refunded to you
│
└─ 4. TRANSFER the NFT moves from seller to you — LASTThat ordering is not incidental. The nonce is consumed before any external call, and the token transfers after payment has settled, so a re-entrant callback cannot buy the same order twice or take the token without paying.
One transaction, one outcome
There is no "payment pending" state and no window where you have paid but do not hold the token. If the transaction reverts, you keep your ETH — you pay only gas.
Paying
Listings are priced in native ETH. You send the price as the transaction's value; there is no token approval to grant and no wrapped asset involved.
Overpayment is refunded in the same transaction
The contract requires at least the price and refunds the excess to you before the transaction ends. You do not need to compute an exact amount to the wei, and you cannot lose the difference.
Underpayment reverts. Nothing is taken.
You also need enough ETH on top of the price to cover gas. Gas on this chain is cheap, but the price plus gas must both fit in your balance.
What you receive
Two things, and they are the same thing:
- The ERC-721 token, transferred directly from the seller's wallet to yours.
- The redemption right for the specific CS2 skin backing it.
There is no separate step to claim the skin and no registry to update. Whoever holds the token can withdraw the item — burn the token and a trade offer is sent to their saved Steam trade URL. The skin you can redeem is the exact physical asset the original depositor sent: same float, same paint seed, same stickers, same name tag.
Before buying based on stats, note that float, paint seed, and sticker data come from third-party lookups, can be absent, and are not on-chain. null means "not looked up", and paintSeed: 0 is a real seed. See Metadata and Risks & limitations.
Why a fill can fail
A listing is a signature, and the world moves between when it was signed and when you click. The contract re-checks everything at fill time, so a stale listing reverts rather than half-settling. The interface pre-checks the same conditions immediately before sending, so most of these surface as a message rather than a failed transaction — but a fill can still lose a race.
| Reason | What happened |
|---|---|
| Expired | The order's expiry timestamp has passed. |
| Already sold | Someone filled it first; the nonce is consumed. |
| Cancelled | The seller cancelled that nonce, or raised their minimum nonce past it. |
| Seller no longer owns it | They transferred, sold elsewhere, or burned the token. The order is dead. |
| Approval revoked | The seller revoked the marketplace's operator approval, so the transfer cannot execute. |
| Underpayment | Less than the price was attached. |
| Marketplace paused | Trading is administratively paused. See Admin & upgrades. |
None of these can take your money. Every one of them reverts the whole transaction before payment settles; your only cost is gas.
A listing disappearing is normal
Sellers cancel, transfer, and let orders expire constantly, and several of those require no transaction at all — so a listing can become unfillable with no on-chain trace until someone tries. If a listing vanishes between page load and click, that is the system working.
Buying your own listing
Blocked on chain
Filling your own order reverts with SelfPurchase, so you cannot do it by accident.
It used to succeed, and was strictly bad for whoever tried: the sale price came back to you, but the royalty and platform fee did not, so you finished with the same token and less ETH. That also made it a fixed-cost way to fake trading volume, which is the real reason it is now rejected.
Verifying a purchase
Everything about the sale is public on-chain:
- The
OrderFulfilledevent names the order hash, maker, taker, collection, token id, currency, price, royalty amount, and platform fee. - The ERC-721
Transferevent records the token moving to you. ownerOf(tokenId)onLootSkinsconfirms you hold it.
Addresses: Deployments. Event shapes: Events & indexing.
Next
- Withdraw your skin — redeem what you bought.
- Fees — what a sale costs, verified on-chain.
- Fill an order — doing this programmatically.
- Marketplace — the settlement design.