Skip to content

Fees & royalties

Every cost in the protocol, with the arithmetic and how to verify each value on-chain. For the user-facing summary see Fees.

What is charged, and when

ActionCost
Deposit a skinFree. The mint transaction is paid by the protocol.
Approve the marketplaceGas only, once per wallet
List a tokenFree. A listing is a signature, not a transaction.
Cancel a listingGas only
BuyRoyalty + platform fee, both taken out of the sale price
Withdraw (burn)withdrawFee per token — currently 0 — plus gas

There is no deposit fee, no minting fee charged to the user, no listing fee, and no subscription.

Sale arithmetic

On every fill, LootMarket computes:

royaltyAmount  = royaltyInfo(tokenId, price).amount     // ERC-2981, from LootSkins
platformFee    = price * platformFeeBps / 10_000
sellerProceeds = price - royaltyAmount - platformFee

Paid in that order — royalty receiver, then fee recipient, then seller — before the NFT transfers. If royaltyAmount + platformFee ever exceeded price, the fill reverts with FeeExceedsPrice rather than underflowing the seller.

Current values

ValueRead it with
Platform fee200 bps (2%)platformFeeBps() on LootMarket
Creator royalty500 bps (5%)royaltyInfo(tokenId, price) on LootSkins
Seller receives93% of the sale price

Both are owner-settable, so treat this table as a snapshot and read the chain when the number matters.

Worked example — a 0.05 ETH sale

price            0.050000 ETH   50000000000000000 wei
royalty  5%      0.002500 ETH    2500000000000000 wei  → royalty receiver
platform 2%      0.001000 ETH    1000000000000000 wei  → fee recipient
                 ────────────
seller          0.0465   ETH   46500000000000000 wei  → maker

buyer pays       0.050000 ETH + gas

Send more than price and the excess is refunded in the same transaction, so overpaying costs nothing but the gas to move it.

The 10% hard cap

solidity
uint16 public constant MAX_PLATFORM_FEE_BPS = 1_000;   // 10%

Checked in both initialize and setPlatformFee, so no owner action can set the platform fee above 10%. An attempt reverts with FeeTooHigh. This is a compile-time constant — changing it would require a contract upgrade, which is publicly observable.

The ERC-2981 royalty has its own cap, MAX_ROYALTY_BPS = 1000 (10%), enforced in both initialize and setDefaultRoyalty on LootSkins. An attempt above it reverts with RoyaltyTooHigh.

Both caps together are what bound a fill: royalty and platform fee can never consume more than 20% of a sale, so a seller always keeps at least 80% of the price they signed for — no owner action can change that without a contract upgrade, which is publicly observable.

Royalty is advisory at the token level

LootSkins implements ERC-2981, which is a lookup standard, not an enforcement mechanism. The token contract does not block a transfer that skips royalty.

  • Selling through LootMarket: royalty is read and paid on every fill.
  • Selling anywhere else, or transferring directly: whether royalty is honoured is entirely up to that venue.

Withdrawal fee

withdrawFee on LootSkins is charged per token on deTokenize and is currently 0.

Excess is not refunded

Unlike a marketplace fill, deTokenize does not refund overpayment. Read withdrawFee() immediately before calling and send exactly fee × ids.length. Sending more means losing the difference.

Collected fees accumulate in the contract and are swept by the owner via withdrawFees, which emits FeesWithdrawn.

Gas

Robinhood Chain is an Arbitrum Nitro L2; typical operations cost a fraction of a cent. Always estimate gas per transaction rather than hardcoding a limit — the Nitro fee model prices L1 data separately, and a hardcoded limit that works today can fail after a calldata change.

LootFi is not affiliated with, endorsed by, or sponsored by Valve Corporation. Counter-Strike and Steam are trademarks of Valve Corporation.