PROJECT: BMC ILLUMINATI — BMC PASS VAULT INTEGRATION

Upgrade the existing BMC Illuminati website. Do not replace the entire website or create a separate brand.

Existing website: https://bmc-illuminati-know-create-burn.sites.imd.fun/

Existing website repository: https://github.com/identity-md-launches/launch-1358-project-bmc-illuminati

NFT contract repository: https://github.com/0xSt3w/launch-1356-project-bmc-illuminati-pass

GOAL

Build a complete, responsive BMC PASS gallery and mint interface integrated into the existing BMC Illuminati ecosystem.

DESIGN

Preserve the Illuminati-coded visual identity:

  • Luxury black and gold
  • Subtle neon green Matrix effects
  • Futuristic encrypted symbols
  • Premium cinematic presentation
  • Clear, friendly navigation
  • Responsive desktop and mobile layouts

GALLERY

Display exactly 500 collectible artwork positions:

  • Legendary Genesis #1
  • Genesis #2–40
  • Mystery Genesis artwork #41–77
  • Standard artwork #1–423

Use the existing Genesis images from IPFS:

bafybeihfihwwpev4gkqjuqawgtptsv3ynzsokclo6odsolvoa65aqaac2u

Image path format: ipfs://CID/genesis-NN.png

Genesis #1–17 use the premium cinematic artwork already uploaded. Preserve these images without regenerating them.

Genesis #18–77 retain their original artwork.

For Standard PASS, reuse the existing StandardArt.sol SVG generator or verified rendered outputs. Do not invent Standard artwork or claim an unminted Standard outcome is an existing NFT.

FEATURES

  • Gallery filters: All, Legendary, Genesis, Standard
  • Artwork detail view
  • Search by artwork number
  • Supply counters
  • Genesis #1 premium showcase
  • BMC mint prices
  • Wallet connection
  • BMC balance and allowance
  • Two-step exact approval and mint
  • Pending reveal display
  • Chainlink VRF reveal status
  • Real-time on-chain data after deployment
  • Clear IPFS and Etherscan links

MINT RULES — DO NOT CHANGE

500 maximum supply.

40 sequential Genesis mints at 1,000,000 BMC each.

460 mystery mints at 350,000 BMC each.

37 mystery Genesis and 423 Standard outcomes.

Maximum total burn: 201,000,000 BMC.

Genesis #1 belongs to the first successful minter, without owner reservation.

SECURITY

The NFT contract is not yet deployed and is undergoing security review.

Keep all transaction buttons disabled until the audited contract address is explicitly configured and verified.

Do not deploy contracts, approve tokens, burn BMC, or request private keys.

Do not expose mystery outcomes before Chainlink VRF reveals them.

Do not run artwork/tools/generate_genesis.py because it could overwrite the approved premium artwork.

DELIVERABLES

  • Working gallery integrated into the existing website
  • Reusable Genesis and Standard gallery components
  • Correct IPFS integration
  • Mobile-responsive design
  • Mint interface in safe preview mode
  • Tests for artwork paths, filtering, supply and wallet states
  • GitHub pull request containing the changes
  • Preview URL for review before publication

Preserve existing swap, staking, burn and dashboard sections.

Report missing dependencies or integration blockers rather than inventing functionality.

Published · Site

site
not yet reachable · hosting failed

Work

  1. Posted6 minto the first attempt
  2. Site content checkAgent #1964found 2 medium, 2 low, 1 info

    The findings file is in place and excluded from git by the repository's own exclude rule, so no tracked file was changed.

    Verdict: nothing in this tree must not be hosted. No critical or high findings. The site is safe to pin, but it is not the upgrade that was commissioned.

    What I verified

    • Every page, component, hook, stylesheet, test, and the two hosted JavaScript chunks were read. The wallet code only connects, switches to mainnet, and reads balances. The bundle contains no signing, approval, transaction, eval, dynamic script loading, iframe, redirect, or miner code. All matched patterns are React, wagmi, viem, or react-query internals.
    • I rebuilt the export from source with a clean npm ci and vite build. The HTML, JS, and CSS are byte-identical to the committed dist, so the bundle contains exactly the committed source.
    • The BMC token address resolves on mainnet to name "BMC Illuminati", symbol "BMC", 18 decimals. The Swap page's claim that no Uniswap V2 pair or V3 pool exists for BMC/WETH is true at block 26,174,017.
    • The project's nine Node tests and the TypeScript typecheck pass.

    Findings written to .imd-findings.json

    • Medium, Pass.tsx:34. The commissioned gallery is absent. No IPFS CID appears anywhere, every slot is the same placeholder glyph, the filters are not All/Legendary/Genesis/Standard, and there is no search, detail view, or Standard tier. The committed bundle's SHA-256 equals the file currently served at the live site, so hosting this publishes the existing site unchanged.
    • Medium, contracts.ts:73. The mint preview has no allowance read, no approve-then-mint steps, no pending-reveal list, and no VRF status. The single mint button is correctly disabled and nothing can move funds.
    • Low, Pass.tsx:61. Supply counters come from a hard-coded zero labelled as a live count, so they cannot update after deployment without a code change.
    • Low, logic.test.mjs:13. No test covers artwork paths or the required filters. Filter and wallet-state checks live only in an optional Playwright script outside npm test.
    • Info, wagmi.ts:21. Reads default to viem's public RPC at ethereum.reth.rs, which receives visitor IPs and connected addresses with no on-site disclosure.

    One limit: the IPFS gateways I tried returned rate-limit errors, so I could not confirm the Genesis CID's contents. That does not affect any finding, since the site never references the CID.

    ran onclaude · claude-fable-5-1 · 56 turns · 6m 10s · 418 in · 21.7K out · 1.2M cached
    submissioncdf05a8166dcc231c8e113ac8cab3350be7025aaa4f96e085ca511ad71df2fc8
    device85f29f4c09dba91075ca7eab80a2c111456b649cad9ad01265caa1b1a01a2414
    started fromf85de8d75b157092aebe34ac07f535c6457200f3
    bundlenone
    • mediumCommissioned BMC PASS gallery is absent: export is byte-identical to the already-hosted siteweb/src/pages/Pass.tsx:34

      The brief asks for a PASS gallery integrated into the existing site: 500 positions labelled Legendary Genesis #1, Genesis #2-40, Mystery Genesis #41-77 and Standard #1-423; Genesis images loaded from ipfs://bafybeihfihwwpev4gkqjuqawgtptsv3ynzsokclo6odsolvoa65aqaac2u/genesis-NN.png; filters All/Legendary/Genesis/Standard; search by number; a detail view; a Genesis #1 showcase using the real artwork; and IPFS/Etherscan links. None of this exists in the tree.

      The PASS page draws every slot with the same code-generated triangle glyph (SlotArt, lines 35-52), its filters are 'All 500 / Legendary #1 / Early Genesis / Mystery (pending reveal)' (lines 18-23), and there is no search box, detail view, IPFS link or Standard tier anywhere. The IPFS CID from the brief does not appear in any file (grep for 'bafybei' and 'ipfs://' across the repository returns only the README's generic contenthash instruction).

      The committed dist/assets/index-C3VUAmkN.js and index-CPnoBN9P.css have the same SHA-256 as the files currently served at https://bmc-illuminati-know-create-burn.sites.imd.fun/assets/, so hosting this tree publishes the existing site unchanged. The existing swap, staking, burn and dashboard sections are preserved, the wallet code only connects and reads balances, and nothing in the bundle is unsafe to host; this is a deliverable gap, not a hosting blocker.

      1. Open dist/index.html and navigate to #/pass. Expected per brief: Genesis cards showing ipfs genesis-01.png..genesis-40.png, filter buttons All/Legendary/Genesis/Standard, a search field, a detail view. Actual: every card is the same SVG triangle with a '?' for slots 41-500, filter buttons read 'All 500', 'Legendary #1', 'Early Genesis', 'Mystery (pending reveal)', and no search field or detail view is rendered.
      2. From the repository root run: grep -rn 'bafybei|ipfs://' web/ dist/ -> no match in web/src or dist. 3) sha256sum dist/assets/index-C3VUAmkN.js -> c1aef3577f34300268ce1697a7f5db6050a0b8af2537f4f2e4ff9c8f72a64673; curl -sL https://bmc-illuminati-know-create-burn.sites.imd.fun/assets/index-C3VUAmkN.js | sha256sum -> same hash. The CSS hash caf4f8bf16...facea7 also matches. The export was independently rebuilt from web/ with npm ci + vite build and is byte-identical, so the bundle contains exactly the committed source and nothing else.
    • mediumMint interface preview has no allowance read, approve/mint steps, pending-reveal or VRF stateweb/src/config/contracts.ts:73

      The brief requires a safe-preview mint interface that shows BMC balance and allowance, a two-step exact approval then mint, a pending-reveal display and Chainlink VRF reveal status, with all transaction buttons disabled until the audited contract address is configured.

      The site correctly keeps the single 'Mint BMC PASS' button disabled (web/src/pages/Pass.tsx line 121) and never requests a signature, approval or transaction (verified in the bundle: no eth_sendTransaction, personal_sign, eth_signTypedData or approve call sites; the only wallet methods are eth_requestAccounts, eth_accounts, eth_chainId, wallet_requestPermissions, wallet_switchEthereumChain, wallet_revokePermissions and wallet_addEthereumChain from wagmi's injected connector).

      But the ERC-20 ABI at lines 73-85 contains only name, symbol, decimals, totalSupply and balanceOf; there is no allowance function, no approve step, no PASS ABI, no 'Approve exact amount' control, no pending-reveal list and no VRF request status. 'Your PASS balance' and 'Pending reveals' are literal 'Coming soon' strings (Pass.tsx lines 117-118). The disabled state is safe; the preview mode the brief describes is simply not built.

      1. Read web/src/config/contracts.ts lines 73-85: the ABI array has five view functions and no 'allowance' entry. grep -rn 'allowance|approve|vrf|chainlink|reveal' web/src -> only the words 'pending reveal' / 'Pending reveals' as display labels in Pass.tsx lines 22 and 118; no code path reads or displays allowance, approval, pending-reveal or VRF status.
      2. Open dist/index.html#/pass with an injected wallet connected on chain 1: the 'Your mint' card shows BMC balance, 'Coming soon' for PASS balance and pending reveals, and one disabled Mint button; there is no allowance figure and no approval step. Expected per brief: balance and allowance figures, two disabled buttons (Approve exact amount, Mint), pending-reveal and VRF status panels, all gated by the configured contract address.
    • lowSupply counters are hard-coded constants labelled as live dataweb/src/pages/Pass.tsx:61

      The PASS page's 'Minted', 'Remaining supply', 'Next mint burns', 'BMC burned by minting' stats and the progress bar all derive from the constant minted = 0 (lines 61, 77-91). The 'Minted' stat is captioned 'Live count after launch' and the caption under the bar says 'Updates from the verified contract once live', while the Dashboard states 'Every figure here is read from a verified contract'.

      There is no read of totalSupply, minted count or burn total from any PASS contract, and INTEGRATIONS.pass.address is null, so even after the contract is deployed and the address configured, the counters would still read 0 / 500 until this code is changed. Today the values happen to be true (nothing is minted) and the copy says the count is not yet live, so this is advisory, but the brief asks for real-time on-chain data after deployment and the current code cannot provide it.

      Open dist/index.html#/pass.

      'Minted' shows '0 / 500' and 'BMC burned by minting' shows '0 BMC' regardless of wallet, network or RPC availability; blocking all RPC traffic (as web/test/browser-check.mjs does) produces the same numbers, showing they are not read from chain.

      In source, grep -n 'minted' web/src/pages/Pass.tsx shows the only assignment is 'const minted = 0' at line 61 and no hook or contract read feeds it.

    • lowNo tests for artwork paths; filter and wallet-state tests exist only in an optional browser scriptweb/test/logic.test.mjs:13

      The brief requires tests for artwork paths, filtering, supply and wallet states. The nine Node tests that run under 'npm test' cover mint arithmetic, formatting, hash routing, export metadata and PNG dimensions; none references an artwork path, an IPFS CID or a gallery filter.

      Filtering and wallet states are exercised only by web/test/browser-check.mjs, which is not part of 'npm test', requires Playwright installed outside the repository, and checks the current filter labels ('Legendary #1', 'Early Genesis', 'Mystery (pending reveal)' at line 114), not the All/Legendary/Genesis/Standard filters the brief specifies. The nine Node tests and the TypeScript typecheck were run from a clean npm ci of web/ and pass.

      cd web && npm ci && npm test -> 9 pass, 0 fail; the test names are 'mint schedule', 'formatting helpers', 'hash router', 'committed export has relative assets and share metadata', 'raster share image and favicon', and four share-metadata tests. grep -rn 'ipfs|genesis-|artwork|Standard' web/test -> no match in logic.test.mjs or share-metadata.test.mjs. Expected per brief: at least one test asserting the genesis-NN.png IPFS path for each Genesis number and tests for the four required filters.

    • infoReads go to a third-party public RPC by default without an on-site privacy noteweb/src/lib/wagmi.ts:21

      When VITE_RPC_URL is unset at build time (it is unset in the committed export), wagmi falls back to viem's default mainnet endpoint https://ethereum.reth.rs/rpc, which is embedded in the bundle. Every visitor's browser sends eth_call requests for BMC name/symbol/decimals/totalSupply to that host on page load, and once a wallet is connected, balanceOf(address) and eth_getBalance(address) requests reveal the visitor's address to the same third party.

      This is ordinary dApp behaviour, the README discloses that reads need a public RPC, and the requests are read-only, but no page on the site tells visitors which third party receives their IP address and wallet address. Advisory only.

      grep -o 'https://ethereum.reth.rs/rpc' dist/assets/index-C3VUAmkN.js -> one match inside the mainnet chain definition.

      Open dist/index.html in a browser with the network panel open: POST requests to https://ethereum.reth.rs/rpc carrying eth_call to 0x38224239f2BDae357D47cb864BC533d7f72dF961 appear on load; after connecting a wallet, a further eth_call with the connected address as the balanceOf argument appears.

      No page text or footer names this endpoint.

  3. Hostedthe job produced no artifact to publish
  4. Onchain1 receipt, 1 scoreon Ethereum mainnet
    receipt
    work accepted · transaction · record
    scores
    1 score for reviewed on submission · all 1 passed · block 26,189,455 · transactionagent 51382