Install and enable

What must exist before the NFT Marketplace addon works — the Ecosystem prerequisite, licence activation, master wallets and gas, the first marketplace contract, categories, and the settings that decide whether anyone can trade.

7 min readUpdated 3 August 2026install, ecosystem, master-wallet, deployment

Activating the licence is the quick part. The addon is not usable until a marketplace contract exists on at least one chain, and that deployment spends real gas from an Ecosystem master wallet. Read this page end to end before you start, because two of the steps cost money and one of them cannot be undone cleanly.

Prerequisites

    • A working Bicrypto install — see Core setup
    • The Ecosystem addon installed and activated
    • At least one Ecosystem chain configured with a reachable RPC endpoint
    • An Ecosystem master wallet for that chain, with status enabled
    • Native currency in that master wallet to pay deployment gas
    • The cron process running — offers and auctions are settled by scheduled jobs
    • Your CodeCanyon username and the NFT Marketplace licence code

Why Ecosystem is mandatory

The NFT addon has no blockchain layer of its own. It imports three functions from Ecosystem at runtime:

Function Used for
getProvider(chain) Every RPC call — deployments, transfers, receipts, balances
getSmartContract("nft", name) Loading the ABI and bytecode for NFTMarketplace, NFTAuction, ERC721NFT and ERC1155NFT
getAdjustedGasPrice(chain) Gas pricing on deployments

They are loaded through guarded require calls, so a missing Ecosystem does not crash the backend — it degrades silently until a deployment is attempted, at which point the marketplace service throws "Ecosystem extension is required for NFT marketplace deployment".

Deployments also read ecosystemMasterWallet directly, decrypt the stored private key, and sign with it. The master wallet is the deployer and, unless you override it, the marketplace fee recipient.

The compiled contract artifacts live in backend/ecosystem/smart-contracts/nft/NFTMarketplace.json, NFTAuction.json, ERC721NFT.json and ERC1155NFT.json. They ship with the addon; you do not compile anything.

Ecosystem uses ScyllaDB for its order books and market data. The NFT addon never touches it — it uses only Ecosystem's provider, master wallet and smart-contract loader, all of which are MySQL and RPC. If you are installing Ecosystem purely to run NFT, you do not need a Scylla cluster.

Install the addon

  1. Activate the licence. In the admin panel go to System → Extensions (/admin/system/extension), find NFT Marketplace, and enter your CodeCanyon username and licence code. Activation is verified against the licence server, so the box needs outbound HTTPS.

  2. Confirm the schema. The NFT tables ship in initial.sql, so a core install already has them. Two later tables are created by the boot sync instead: nft_metadata_backup and gas_history. If you run with DB_SYNC=none those two will be missing and the backup feature will fail.

    SHOW TABLES LIKE 'nft\_%';

    initial.sql carries 19 of them. nft_metadata_backup brings that to 20 once the sync has run, and gas_history is the twenty-first table the addon owns.

  3. Restart the backend. Route registration and menu loading happen at boot. Until you restart, /nft and /admin/nft are 404.

  4. Grant permissions. No seeder gives any role NFT access. Until you tick boxes on the Roles screen, /admin/nft answers with a no-permission page even for an account on the Admin role. See Permissions for the full key list.

Deploy your first marketplace contract

Nothing works until this exists. /api/nft/chains is built from the nft_marketplace table, the collection-create endpoint refuses any chain with no ACTIVE row, and every purchase path looks for a marketplace address before it falls back to a direct transfer.

Go to Admin → NFT → Trading → Marketplace (/admin/nft/marketplace) and use the deploy panel.

The contract is deployed with a 4,000,000 gas limit against live gas prices. Budget for it, and deploy to a test chain first if you have one configured. There is no dry run.

The deploy call takes five inputs:

Field Default Notes
chain ETH Must have an active Ecosystem master wallet
feeRecipient the master wallet address Where on-chain fees accumulate and where withdrawals default to
feePercentage 2.5 Rejected outside 0–10. Written into the contract in basis points
listingFee 0 A flat fee in native token, charged by the contract on listing
maxRoyaltyPercentage 10 The contract's own ceiling on creator royalties

A second deployment on the same chain returns 409 unless you pass force: true. Forcing marks the previous row DEPRECATED and inserts the new one as ACTIVE.

feePercentage here is baked into the deployed contract. The Marketplace Fee slider on the settings screen writes nftMarketplaceFeePercentage, which is what the custodial offer path charges. Deploying at 2.5% and then setting the slider to 5% gives you a marketplace that charges 2.5% on fixed-price sales and 5% on offers. Set them to the same number, and change them together.

Network is always recorded as mainnet

The deploy route writes network: "mainnet" on the nft_marketplace row regardless of what the chain's RPC actually points at. That string is then the join key: /api/nft/chains returns it, the collection form sends it back, and collection creation matches on chain and network. It is internally consistent, so a testnet RPC works fine — but do not read "mainnet" in that column as evidence of anything.

Configure the marketplace

Once a contract exists, work through the four settings tabs at Admin → NFT → System → Settings (/admin/nft/settings). Every key, its default and its real behaviour are listed in Settings; the ones that block a launch are:

Whether sellers can list at a fixed price
Whether sellers can run timed auctions
Whether buyers can make escrowed offers
Platform fee on custodial (offer) settlements
The ceiling every royalty in the product is clamped to

Several of these keys have no seeded row. The onboarding checklist treats a missing key as "not configured", and more importantly the code path that reads a boolean setting falls back to its default only when the key is absent — so until you have written them, what your settings screen shows and what the backend enforces can differ. Open each tab and save.

Create categories

Collection creation requires a valid categoryId, and the category must already exist. With zero categories nobody can create anything.

Go to Admin → NFT → Content → Categories (/admin/nft/category) and add at least two. The onboarding checklist looks for two or more.

Check the cron jobs

Three jobs run in the nft category. Confirm they appear and are running on the admin cron screen:

Job Every What breaks without it
expireOffers 5 minutes Expired offers stay ACTIVE and buyers' escrow stays held indefinitely
settleAuctions 10 minutes Ended auctions never pay out and never transfer the NFT
processNFTBackups 15 minutes Scheduled blockchain-state backups never run

settleAuctions also runs the stale-offer sweep that unwinds accepted offers whose on-chain transfer never happened. If the cron process is down, buyers' funds sit locked with no NFT and no notification.

Verify the install

Work the onboarding checklist at /admin/nft/onboarding. It is not linked from the navigation — reach it from the button on the Marketplace screen or type the URL. It reads real state and reports four phases:

At least one ACTIVE row in nft_marketplace. This satisfies both the "deploy primary marketplace" and "verify blockchain health" tasks — they are driven by the same check, so passing one passes both.

nftEnableFixedPriceSales, nftEnableAuctions and nftEnableOffers must all be present (not merely defaulted), nftRequireMetadataValidation must be present, and nftRequireKycForCreators must be present.

Two or more categories, at least one collection with status = ACTIVE, and at least one ACTIVE collection that actually has tokens in it.

At least one nft_creator row with isVerified = true. Creator profiles are created automatically the first time a user makes a collection; verification is a manual flip on the Creators screen.

Then prove the whole loop with a real account before you announce anything:

  1. Create a collection as a normal user at /nft/collection/create. It is written PENDING.

  2. Approve it at /admin/nft/collection — the status toggle sets ACTIVE.

  3. Deploy the collection contract from the creator's own screen. This spends gas from the master wallet again, one deployment per collection.

  4. Mint one token at /nft/create. The creator's browser wallet signs; the backend verifies the receipt before it writes the row.

  5. List it and buy it from a second account. Check that a nft_sale row appears and the token's owner changed.

If step 5 fails with "Connect a wallet address in your profile", read When money or an NFT is stuck. It is the single most common blocker on a fresh install, and it is fixable only from the customer's own profile — not from the admin panel.