NFT Management
Access prerequisites
- Permission (module):
manageToken - License/Feature:
MANAGE_NFTS - Menu container: TOKENIZATION → group Tokenization → Manage NFTs
What it is / when to use
Catalog of NFTs / tokenized assets (real estate, certificates, collectibles, packages). Here the operator creates, edits, views and deactivates NFTs, assigns them to a collection and a category, sets the price and accepted currencies, configures wallet commissions, draws and sends (distributes) NFTs to users.
Creating an NFT requires the collection and the category to already exist.
Prerequisites
- Permission:
manageToken(dual — CPM enum + dynamic module in DB). - License/Feature:
MANAGE_NFTS. - Dependencies: the Collection must exist (Collections); the Category must exist and allow product creation (
allow_product_creation = true, in NFT Categories).
Step by step (listing)
- Access the menu Tokenization → Manage NFTs.
- Search by name (search with debounce) and filter by collection.
- Use the icons on each row: draw (raffle), send (distribute), edit, view and delete.
- Use Create NFT to open the form.
Filters and columns
| Filter / Column | What it shows | Data source |
|---|---|---|
| Search by name | Filters by name (server-side, paginated) | getAllAssets({ name, collectionId, limit, offset }) |
| Collection | Filters by collectionId | getCollections() |
| Name / Type / Value | Identification, type (NFT) and current price in tokens | TokenController (assets) |
| Actions | Raffle, send, edit, view, delete | — |
Create / Edit NFT form
The form is divided into groups (Catalog, Commercial, Settings) with sections. During creation, the "Additional information" section is locked (only available in edit/view mode).
Section: General (required)
| Field | What it is | Required? | System/backend effect |
|---|---|---|---|
| Collection | Collection the NFT belongs to | Yes | collection.id. Defines the contract/standard on-chain (ERC-721 or regulated). |
| Category | Asset category | Yes | category_id — only categories with allow_product_creation. |
| Name | Asset name | Yes | name. |
| Description | Description | Yes | description. |
| Quantity | Number of items to issue | Yes | quantity. |
| Characteristics | Free key/value pairs or by template | No | characteristics[]. |
Section: Pricing (required)
| Field | What it is | Required? | System/backend effect |
|---|---|---|---|
| Price | Asset value in fiat currency | Yes* | price (BigNumber). *Can be waived with skipPrice. |
| Accepted currencies | Tokens accepted as payment (checkbox per token) | No | payment_types[]. |
| Allow split | Distributes payment among the checked tokens | No | allow_split + percentage per token (paymentPrice). The sum must total 100%. |
| Transaction type / Fee | Transaction tax/fee (Percentage or Absolute) | No | taxType (A/P) + transactionTax. |
Section: Media (required)
| Field | What it is | Required? | System/backend effect |
|---|---|---|---|
| Photos | Asset images | Yes | photos[] (at least one). |
Section: Wallets / Commissions (optional)
| Field | What it is | Required? | System/backend effect |
|---|---|---|---|
| Wallet + commission | Wallets that receive a commission from the sale | No | wallets_commission[] = { id, commission }. |
Section: Publication (settings)
Groups the NFT behavior toggles and the linked token/liquidity fields. The full reference for each toggle is in Settings reference (toggles).
Non-toggle fields in this section:
| Field | What it is | Required? | System/backend effect |
|---|---|---|---|
| Linked token for future distributions | Token used in distributions/claims made from the NFT | No | tokenClaimId. Defines which token the holder receives when the NFT distributes value. |
| Liquidity token for future distributions | Liquidity token offered as an alternative for receiving | No | liquidityToken. Enables the option for the holder to choose to receive in fiat/token (see block_liquidity_option). |
| Internal status | Operational status used internally for the NFT | No | status. Not displayed to the end user. |
Section: Additional information (edit only)
projectUrl, projectDescription, projectCustomHtml and contract — project information and contract address.
Settings reference (toggles)
The NFT has 8 toggles distributed between the Pricing (allow_split) and Publication (the rest) sections. All are booleans and stored in the assets entity of the TokenController. The table below covers 100% of them.
| Label (screen) | Field (ngModel) | What it does (backend effect) | When to use |
|---|---|---|---|
| Publish NFT immediately | asset.enabled | Publishes the NFT on the platforms (Midas-Web/Trade) and includes it in catalog listings. When off, the NFT exists but is hidden from users. "Deleting" the NFT from the listing is also a soft-delete that clears this field (enabled = false + disabled = now). | Turn on when the offering is ready for the public. Leave off for drafts/pre-launch. |
| Block sale | asset.block_sell | Locks the primary sale. In market.core.handler, the purchase reservation throws an error (NFT sale is blocked) when block_sell = true, except for administrative calls (isAdminCall). It is automatically locked in NFT Burn (snapshot in nft_burn_operation.previous_block_sell for manual reversal). | To close the primary sale of an offering (sold out, suspended, under recall) without deleting the NFT. |
| Block resale | asset.block_resell | Prevents the secondary market: in the holder's app (Midas-Web card-list), resale, auction and split actions are hidden when block_resell = true. It is also locked together with block_sell during NFT Burn (snapshot in previous_block_resell). | Non-resalable NFTs: nominal tickets, locked-up quotas, regulated assets that cannot circulate. |
| Package only | asset.only_package | Removes the NFT from the standalone catalog: the public listing query (AssetsDAO) adds only_package = false, so the NFT only appears/is sold inside an NFT Package. The product detail screen also hides the standalone checkout. Admins and the collection profile continue to see it. | When the NFT should only be acquired bundled in a package, never standalone. |
| Manage access | asset.handle_access | Treats the NFT as an access control/credential: upon completing the purchase, market.core.handler creates a user access token in CPM for the buyer (and removes the seller's on resale). The NFT then appears in the admin's "access assets" list. | Tickets, subscriptions, restricted areas — any NFT that grants an access right tied to ownership. |
| Block liquidity preference | asset.block_liquidity_option | Freezes the choice of distribution receiving method: changeDistributionType (assets.core.handler) throws an error when true, and in the holder's app the "receive in fiat/token" icons are disabled. Works together with the Liquidity token configured. | When the liquidity method is already defined by the offering and the holder can no longer switch it. |
| Exclude from Income Tax Report (IRPF) | asset.block_from_irpf | Excludes the NFT from the IRPF report: the irpf.snapshot.handler and the report generator filter (!block_from_irpf) both the base snapshot and the final snapshot, removing the asset from the income lines. | Assets that should not appear in the user's Income Tax Report (e.g.: non-taxable items, internal utilities). |
| Allow NFT Split | asset.allow_split | Two effects: (1) in Pricing, enables distributing payment among several accepted tokens (percentage per token, sum = 100%); (2) in the holder's app, enables the split action on resale — the split icon only appears with allow_split = true, block_resell = false and price > 0. | When the NFT can be split and/or paid with a split among multiple tokens. |
Relationship with NFT Burn
block_sell and block_resell are not just manual settings: NFT Burn turns both on automatically in the same atomic transaction as the burn header, storing the previous values in nft_burn_operation.previous_block_sell / previous_block_resell to allow manual reversal. Locking the NFT at T0 prevents purchase and resale while the watcher processes the on-chain settlement (sink wallet or native burn).
Non-obvious effects
block_sellhas an admin exception: calls withisAdminCallbypass the lock — the operator can still distribute/sell through the administration even with the public sale locked.only_packagedoes not disappear for admin: the NFT remains visible to administrators and in the collection profile; theonly_package = falsefilter only applies to the user's public catalog.allow_splitis two features in one toggle: it controls both the payment split (Pricing) and the permission to split the NFT in the secondary market.
Actions and modals
- Create / Edit: confirmation modal (bottom sheet). Creation sends the full payload (
createAssets); editing sends the editable subset (editAssets). - Draw (raffle): opens the raffle wheel — all users who hold that NFT participate; after spinning, the winner's email and the NFT ID are displayed.
- NFT Report: on the raffle screen, exports the list of users with an indication of who holds the NFT (email, name, phone, registration date, account status).
- Send (distribute) NFT: distribution modal — the admin sends the NFT to specific users.
- Delete: logical deactivation (
enabled = false+disabled = now), preserving history.
Business rules / cautions
Attention
- Collection and category are prerequisites — without them the save is not enabled.
- Mint exclusive to the job (crowdfunding): for crowdfunding assets, NFT issuance and burn occur only through the crowdfunding job. Financial distribution does not issue an NFT, and
TKN_OWNERdoes not issue or resell — this guarantees the raised == NFTs invariant by construction. block_sell/block_reselllock primary and secondary sales; they are also triggered automatically in the NFT Burn flow.
Irreversible
- NFT issuance (mint) on-chain has no rollback. Check the collection, category and quantity before confirming.
- Financial values: price, commissions and fees are BigNumber — no rounding.
- Status APPROVED: distributions/sends on behalf of a user require the target user to have
status === 'APPROVED'.
Examples
Scenario 1 — Tokenized real estate NFT with wallet commission
- General: collection "Imóveis SP", category "Imóveis", name, description, quantity
100. - Pricing: price
R$ 1.000,00; accepted currencies:BRLX. Type Percentage, fee2%. - Wallets: add the partner's wallet with
commission = 5. - Media: photos of the property.
- Publication: Publish listing on, Block resale according to the offering's rules.
- Save. Result: 100 NFT quotas published, with a 5% commission to the partner's wallet.
Scenario 2 — Access NFT (ticket) non-resalable
- General: collection "Eventos", category "Ingressos", quantity according to capacity.
- Publication: turn on Manage access and Block resale.
- Pricing: ticket price; accepted currency according to the operation.
- Save. Result: NFT functions as a ticket, with no secondary market.