Fields & Floors Collectors
Search every numbered sports card on eBay by print run, autograph, rookie status and price, then save searches and get an email when a new card lists.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证PND is open source artist infrastructure owned by the artist
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Artist-owned auction infrastructure on Ethereum. Rebuild of ripe0x/pin around one invariant:
Token data is stored permanently in Postgres. The web app never refetches on cache miss. The web app never triggers a chain read for storable data. The worker keeps stored data fresh; the web reads.
See PLAN.md for the full architectural rationale.查看完整 README ↗Artist-owned auction infrastructure on Ethereum. Rebuild of ripe0x/pin around one invariant:
Token data is stored permanently in Postgres. The web app never refetches on cache miss. The web app never triggers a chain read for storable data. The worker keeps stored data fresh; the web reads.
See PLAN.md for the full architectural rationale.
web (Next.js) → Netlify (build config in netlify.toml)
indexer (Ponder, fixed contracts) → Railway
worker (Node, per-artist scans + owners + ENS + metadata) → Railway
postgres (the `maglev` Railway DB) → Railway
The worker owns all periodic work — there are no Netlify scheduled
functions or cron jobs driving indexing. (The original plan put all four
on a single Railway project; the web app currently builds and deploys on
Netlify per netlify.toml. apps/web/railway.json is vestigial.)
# 1. Install
pnpm install
# 2. Postgres in Docker
docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=dev postgres:15
# 3. Env (root .env, used by db:migrate; per-app envs for runtimes)
echo "DATABASE_URL=postgres://postgres:dev@localhost:5432/postgres" > .env
cp apps/web/.env.example apps/web/.env.local
cp apps/indexer/.env.example apps/indexer/.env
cp apps/worker/.env.example apps/worker/.env
# 4. Migrate
pnpm db:migrate
# 5. Run each service in a separate terminal
pnpm dev:indexer # Ponder; takes ~1h for full backfill on first run
pnpm dev:worker # Node worker; starts head-following after Ponder is ready
pnpm dev:web # Next.js on :3000
State-machine subscriptions:
SovereignAuctionHouseFactory + clones (PND auctions)NFTMarket (Foundation marketplace)FoundationNFT shared 1/1SuperRareNFT shared 1/1CatalogDiscovery-only (one row per artist-deploys-a-clone, no per-clone events):
NFTCollectionFactoryV1/V2 → fnd_collectionsMintFactory → mint_creatorsTLUniversalDeployer → tl_creatorsNOT indexed by Ponder (handled by worker scanners): SR Bazaar marketplace, TL Auction House, Foundation/Mint/TL per-clone Transfer events, Manifold.
| Task | Cadence | Reads | Writes |
|---|---|---|---|
seed-known-artists | startup + 1h | Ponder + artist_seeds | known_artists view |
warm-contract-identity | 10m | new contracts | contract_identity |
warm-ens | 10m | known artists, auction winners/buyers | ens_identities |
warm-metadata | 1m/5m | new artist_tokens rows | token_metadata |
scan-fnd-collections | 10m | fnd_collections, cursor | artist_tokens, cursor |
scan-mint-clones | 10m | mint_creators, cursor | artist_tokens, cursor |
scan-tl-clones | 10m | tl_creators, cursor | artist_tokens, cursor |
scan-manifold | 30m | Etherscan + Alchemy NFT API | artist_tokens |
resolve-new-token-owner | event-driven | (single ownerOf per new mint) | token_owners |
scan-token-transfers | 5m | distinct contracts in artist_tokens, cursor | token_owners, token_transfers |
ponder-drift-check | 1h | pnd_houses vs ponder_sync.factory_addresses | (alerts) |
All scanners gate on isKnownArtist(addr). known_artists is the spend ceiling.
apps/web/src/lib/reads.ts is the entire data-fetching surface. Every page hits one or more of those typed SELECTs. No fallback chains; if data isn't there, the page shows an empty state and a worker job has been queued.
apps/web/src/lib/onchain.ts is the six functions that genuinely need live state:
getActiveAuctionState, getBuyPrice, getActiveSrV2AuctionMap, getActiveTlAuctionMap, getCurrentOwner, getEnsForFreshAddress.Every other reach to chain happens in the worker, off the request path, behind a cursor.
MIT.