Playbook
Rinkeby Testnet vs Mainnet Client Split (Rinkeby Testnet Vs Mainnet Client Split)
The marketplace SPA locks to Rinkeby Infura while collection mint clients harden on mainnet. Shared web3/IPFS utils must stay network-agnostic; config must not.
OpenSea-like Marketplace UI
Part 3 of 3
Bare Crypto marketplace SPA: OpenSea-like information architecture (Home, Marketplace, Viewer, Profile, mint form), listing discovery by scanning totalSupply, and the Rinkeby Infura vs mainnet mint-client split with shared utils — ADRs, Infura rate limits, and 30s-poll stale listing failures.
Same util folder, different chain truth
In the Bare Crypto family, the marketplace UI talks to a Rinkeby read/write node while CBD All-Stars / Confident Gorillas mint surfaces move to mainnet Infura and wallet connectors. The code looks similar — web3Utils, IPFS helpers, metadata shapes — but network identity, contract addresses, and risk models diverge. Client split is a repo policy and an ADR.
Shared utils (shape)
web3 helpers · IPFS upload/retrieve · metadata attrs
╱ ╲
Marketplace SPA Collection mint clients
network: Rinkeby network: Ethereum mainnet
listings + viewer whitelist / mint / reveal
Infura test endpoint Infura main + Web3Modal
╲ ╱
NEVER share one hardcoded project key across envs
This part explains why separating an OpenSea-like testnet market from mainnet mint clients is not 'just config'.
Concepts, defined where they first appear
📦 Client Split
Intentionally separating the testnet marketplace app from mainnet mint apps in one product family.
📦 Shared Util
Network-agnostic helpers (call patterns, IPFS, metadata); network truth stays in config.
📦 Rinkeby
The Ethereum testnet the marketplace prototype targeted (era choice; later retired).
📦 Mainnet Hardening
Production mint surface with real value, wallet connectors, and wrong-network guards.
Copying util files is not sharing a source of truth; write which invariants are common vs env-specific.
Two clients, two risks
Marketplace: listing scans, stale polls, test ETH. Mint client: paid mint, whitelist, reveal. Sharing one Infura project and the same bundle secrets merges test quota with production and multiplies key leak blast radius.
What to share, what not
Shareable: metadata attribute shape, IPFS pin/retrieve wrappers, contract.methods.X.call patterns. Not shareable: RPC URL/project id, contract addresses, default chain id, poll intervals, wallet connector set.
ADR: Client split
Decision: separate marketplace (Rinkeby) from mint (mainnet) apps
Share: pure utils + metadata conventions
Do not share: network endpoints, addresses, secrets
Consequence: duplicate apps, clearer blast radius
Config discipline
Era code often baked Infura endpoints into source — this case study marks that as an anti-pattern and never reprints values. Right direction: build-time env, per-network apps or a network selector, never real project IDs in docs.
Where the OpenSea reference stops
OpenSea runs multi-chain operations in one product. Bare Crypto shrinks blast radius by keeping the testnet market beside mainnet mint on the learning path. That is a client boundary, not merely immaturity.
The mappings that get confused most often
❌ If marketplace works on Rinkeby, mint can reuse the endpoint
✓ Risk and quota models differ
❌ Copying util files = single source of truth
✓ Package invariants; not secrets
❌ Testnet address is 'close enough' with mainnet ABI
✓ Wrong chain + wrong address = user loss
❌ Printing Infura project ids in docs is educational
✓ It is a leak; use placeholders
A checklist for auditing your own system
- Which files are true shared invariants across marketplace and mint?
- How many places hardcode the RPC endpoint?
- What does the UI do when the wallet is on the wrong network?
- If rate limit hits marketplace, does mint share the same project pain?
- Can you write the split in one ADR paragraph?
What to take away from this part
- Rinkeby marketplace and mainnet mint clients are split on purpose.
- Shared util shape is common; network secrets and addresses are not.
- OpenSea-like IA does not require one production stack.
The same web3 helper does not mean the same chain.
FAQ
Frequently asked questions
What is Client Split?
Intentionally separating the testnet marketplace app from mainnet mint apps in one product family.
What is Shared Util?
Network-agnostic helpers (call patterns, IPFS, metadata); network truth stays in config.
Is it true that "If marketplace works on Rinkeby, mint can reuse the endpoint"?
Risk and quota models differ
What does this part lock in?
This part explains why separating an OpenSea-like testnet market from mainnet mint clients is not 'just config'. In the Bare Crypto family, the marketplace UI talks to a Rinkeby read/write node while CBD All-Stars / Confident Gorillas mint surfaces move to mainnet Infura and wallet connectors. The code looks similar — `web3Utils`, IPFS helpers, metadata shapes — but network identity, contract addresses, and risk models diverge. Client split is a repo policy and an ADR.
Engineering Principles Learned
- Client split is a risk boundary, not only folder layout.
- Util sharing is invariant sharing — not endpoint sharing.
- Secrets and project IDs do not belong in the case study.
Continue reading
Continue reading
Next in series
Listing Discovery by Scanning totalSupply
getListings reads NFT totalSupply and fans out multiple RPC calls per tokenId. N×calls do not scale; 30s polls create stale listings and Infura rate-limit…
Same series
OpenSea-like Information Architecture
The Bare Crypto marketplace SPA deliberately mirrors OpenSea's mental model: Home, Marketplace, Viewer, Profile, and a mint form.
Related articles
Wallet Brand Landing vs Real Extension Scope
The Bare Wallet app is honestly a marketing SPA / download funnel — not a Chrome MV3 extension. A CRA PWA manifest must not be mistaken for extension…