Appearance
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.
| Surface | What it gives you |
|---|---|
| LootSkins | Ownership, transfers, burns, category, royalty, metadata URI |
| LootMarket | Listings, fills, cancellations, fee parameters |
| Contract events | Everything above as an indexable stream |
tokenURI metadata | Item 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 of — ownerOf, 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 sales — OrderFulfilled 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.
Category.Gunis ordinal0and **paintSeed: 0is a real, sometimes valuable, seed. Never test truthiness — test!= null.nullin metadata means "not looked up yet", not "the item has none".stickers: []andstickers: nullare different facts.Detokenized.tokenIdsis non-indexed, in the data field. You cannot filter it by topic; decode the data.- EOA signatures only.
ECDSA.recoveris used, so ERC-1271 smart-contract wallets cannot be order makers. allowedCollection/allowedCurrencyare singular. The plural names do not exist and calling them reverts with no matching function.- Read
baseURI()on-chain. Do not hardcode a metadata host; it is owner-updatable. - Approval can be per-token or operator. A preflight that only checks
isApprovedForAllwill 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.