Skip to content

Developer overview

LootFi is designed so a third party can display, index, or trade its tokens without asking anyone's permission and without trusting an off-chain service for anything that matters.

The stable surface

These are the things you can build on. They change only through a public, observable contract upgrade, which is recorded in the changelog.

SurfaceWhat it gives you
LootSkinsOwnership, transfers, burns, category, royalty, metadata URI
LootMarketListings, fills, cancellations, fee parameters
Contract eventsEverything above as an indexable stream
tokenURI metadataItem name, image, and stats

Addresses and the deploy block: Deployments.

The web app's HTTP API is not a public API

The endpoints the LootFi web app calls are session-authenticated, undocumented, unversioned, and change without notice. Do not integrate against them. If you need data the contracts and events do not expose, index the chain yourself — the events are designed to make that sufficient.

Which surface for which job

Display a token you already know the id ofownerOf, tokenURI, categoryOf. See Read token state.

Enumerate the collection — LootSkins is not ERC-721Enumerable. There is no totalSupply() and no tokenByIndex(). Replay Transfer logs from the deploy block. See Events & indexing.

Track salesOrderFulfilled carries price, currency, royalty and platform fee broken out, so you can compute exact seller proceeds without re-reading state at that block.

Build an alternate marketplace UI — sign orders with the EIP-712 payload in Sign an order and submit them with Fill an order. Orders you create are fillable by anyone, including through LootFi's own interface, because the contract is the only thing that adjudicates them.

Settle trades in your own venue — nothing stops you. LootSkins is a plain ERC-721. Note that ERC-2981 royalty is advisory at the token level; LootMarket pays it, a third-party venue chooses.

Things that will bite you

Each of these has a specific page, but they are collected here because they are the mistakes integrators actually make.

  1. Category.Gun is ordinal 0 and **paintSeed: 0 is a real, sometimes valuable, seed. Never test truthiness — test != null.
  2. null in metadata means "not looked up yet", not "the item has none". stickers: [] and stickers: null are different facts.
  3. Detokenized.tokenIds is non-indexed, in the data field. You cannot filter it by topic; decode the data.
  4. EOA signatures only. ECDSA.recover is used, so ERC-1271 smart-contract wallets cannot be order makers.
  5. allowedCollection / allowedCurrency are singular. The plural names do not exist and calling them reverts with no matching function.
  6. Read baseURI() on-chain. Do not hardcode a metadata host; it is owner-updatable.
  7. Approval can be per-token or operator. A preflight that only checks isApprovedForAll will wrongly reject fillable orders.

Getting the ABIs

The contracts are verified on Blockscout. Open any address from Deployments, select the Contract tab, and read or copy the ABI there. That is the authoritative source — it is generated from the bytecode actually deployed, rather than from source that may have moved ahead.

RPC etiquette

The public endpoint https://rpc.mainnet.chain.robinhood.com is fine for development and light reads. For anything production — an indexer backfilling from the deploy block, or a UI polling on an interval — run your own node or use a dedicated provider. Batch eth_getLogs over bounded block ranges rather than requesting the full history in one call.

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