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.
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
statusenabled - 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
-
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. -
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_backupandgas_history. If you run withDB_SYNC=nonethose two will be missing and the backup feature will fail.SHOW TABLES LIKE 'nft\_%';initial.sqlcarries 19 of them.nft_metadata_backupbrings that to 20 once the sync has run, andgas_historyis the twenty-first table the addon owns. -
Restart the backend. Route registration and menu loading happen at boot. Until you restart,
/nftand/admin/nftare 404. -
Grant permissions. No seeder gives any role NFT access. Until you tick boxes on the Roles screen,
/admin/nftanswers 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:
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:
-
Create a collection as a normal user at
/nft/collection/create. It is written PENDING. -
Approve it at
/admin/nft/collection— the status toggle sets ACTIVE. -
Deploy the collection contract from the creator's own screen. This spends gas from the master wallet again, one deployment per collection.
-
Mint one token at
/nft/create. The creator's browser wallet signs; the backend verifies the receipt before it writes the row. -
List it and buy it from a second account. Check that a
nft_salerow 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.