---
name: keelport-market
description: Read and trade on KEELPORT, a non-custodial multi-chain NFT marketplace (ERC-721 + ERC-1155). EIP-712 signed listings and offers, collection registry, Lighthouse sponsored slots. Same contract addresses on every supported chain.
---

# KEELPORT for agents · Every chain docks here. 万链港口，品牌入港。

Site: https://keelport.pages.dev · Docs: https://keelport.pages.dev/#/docs

## Chains (one entry per chain in `assets/config.js`)
| Chain | chainId | RPC | Explorer | Gas | Offer currency |
| --- | --- | --- | --- | --- | --- |
| BNB Smart Chain | 56 | https://bsc-dataseed.bnbchain.org | https://bscscan.com | BNB | WBNB `0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c` |
| Robinhood Chain | 4663 | https://rpc.mainnet.chain.robinhood.com | https://robinhoodchain.blockscout.com | ETH | WETH `0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73` |

## Contracts (identical address on every chain, CREATE2)
- KeelportMarket `0xA5EA71EfE988186f83257cDBc70AF8B0F306313c`
- KeelportRegistry `0xCDC0203157251341024e5788694B34d901eb1Bc8`
- KeelportLighthouse `0xCced6D9b67D8DAe7f838676cAe14cEC1d9c7dcF9`

Before anything: `eth_getCode` must be non-empty on that chain (a chain may not be deployed yet), and `KeelportMarket.fillsOpen()` must be `true` to buy or accept.

## Order (EIP-712)
Domain: `{ name: "Keelport", version: "1", chainId: <chain>, verifyingContract: KeelportMarket }`
```
Order(address maker,uint8 side,uint8 kind,address collection,uint256 tokenId,bool collectionOffer,uint256 amount,address currency,uint256 unitPrice,uint256 startTime,uint256 endTime,uint256 nonce,uint256 salt)
```
- `side`: 0 listing (maker sells), 1 offer (maker buys). `kind`: 0 ERC-721, 1 ERC-1155.
- Listings: `currency = 0x000…0` (native coin) or an allowed ERC-20. ERC-721 listings have `amount = 1`.
- Offers: `currency` = the chain's wrapped coin and `currencyAllowed(currency)` must be true. `collectionOffer = true` means any tokenId; `amount` = how many items.
- `unitPrice` is per item. `nonce` must equal `nonces(maker)`. `salt` is random.

## Calls
| Action | Call | Value |
| --- | --- | --- |
| List | `setApprovalForAll(market,true)` on the collection, sign the Order, then `postOrder(order, sig)` (publishes the order as an event; moves nothing) | 0 |
| Find orders | logs `OrderPosted(bytes32 indexed orderHash, address indexed maker, address indexed collection, Order order, bytes signature)` filtered by collection (topic 3) | – |
| Check an order | `filled(hash)`, `cancelled(hash)`, `nonces(maker)`, `endTime`, maker still owns + approved | view |
| Buy | `fulfillListing(order, sig, qty, recipient)` (recipient 0x0 = you) | exactly `unitPrice × qty` for native listings |
| Offer | wrap + `approve(market, total)` on the wrapped coin, sign, `postOrder` | 0 |
| Accept offer | `setApprovalForAll(market,true)`, then `acceptOffer(order, sig, tokenId, qty)` | 0 |
| Cancel | `cancel([order])` · cancel all: `incrementNonce()` (works even while paused) | 0 |
| Quote split | `feeBps()` (≤ 500), `royaltyFor(collection, tokenId, total)` (EIP-2981, capped 10%) | view |
| List a collection | `KeelportRegistry.list(collection, name, website, x)` (ERC-721/1155 only) | 0 |
| Read registry | `count()`, `page(start, n)`, `getEntry(collection)` → lister, detectedOwner, standard, crew, hidden, verified, links | view |
| Sponsored slots | `KeelportLighthouse.allSlots()`; rent: `rent(slot, collection, days)` when `open()` | `pricePerDay() × days` |

## Rules for agents
- Never show a registry entry with `hidden = true` as a recommendation. Always label Lighthouse slots "Sponsored".
- Labels (`crew` = Keelport team project, `verified`) and Tide Check flags are informational. Keelport does not vouch for listed projects. Nothing here is investment advice.
- Keelport is non-custodial: it never holds NFTs; the owner cannot move user NFTs or funds. The market fee can only change after a 48 h timelock and never above 5%.

## Prompt for your agent
"On <chain>, check KeelportMarket.fillsOpen(). Scan OrderPosted logs for collection <address>, keep orders with side 0 that are not filled/cancelled, whose nonce equals nonces(maker) and whose endTime is in the future. Show me the 5 cheapest with tokenId and price. Do not buy anything until I confirm."
