Features
Reading Inherited Royalties
Last updated August 6, 2026
Summary
Bubblegum V2 can store seller fees as an inherit sentinel (65535) on the leaf and resolve the effective rate from the MPL-Core collection's Royalties plugin. DAS puts collection-resolved values on the main fields (for display) and exposes leaf values on _raw fields (for hashing).
- Use main fields (
royalty.basis_points,creators) for royalty UI and payout display - Use
_rawfields (royalty.basis_points_raw,creators_raw) for proofs, hashing, and write instructions - Non-inherited assets are unchanged —
_raw/inheritedare omitted
This page is for any client that reads getAsset / DAS responses — wallets, marketplaces, indexers, analytics, and apps. For minting and updating inherited cNFTs, see Minting and Updating.
When it applies
A cNFT is using inherited royalties when:
- It is a Bubblegum V2 asset in an MPL-Core collection with the
Royaltiesplugin, and - The leaf seller fee is the inherit sentinel
65535(0xffff)
DAS signals this with royalty.inherited: true and royalty.basis_points_raw: 65535 when the collection royalty can be resolved onto the main fields.
Field map
Display values and leaf values live on different DAS fields, and writes must use the leaf values.
| Use case | Fields |
|---|---|
| Display rate / royalty UI | royalty.basis_points, royalty.percent |
| Display payees / payout splits | creators |
| Hashing, merkle proofs, write instructions | royalty.basis_points_raw, creators_raw |
| Detect inherit mode | royalty.inherited (or basis_points_raw === 65535) |
Example DAS response (inherited)
An inherited asset returns the collection's resolved rate on basis_points and the 65535 sentinel on basis_points_raw.
"royalty": {
"royalty_model": "creators",
"target": null,
"percent": 0.075,
"basis_points": 750,
"basis_points_raw": 65535,
"inherited": true,
"primary_sale_happened": false,
"locked": false
},
"creators": [
{
"address": "CJkzXwVwqiaSvMuRb3obrZHdrPFjCMBJBDrjspn72tDv",
"share": 100,
"verified": true
}
],
"creators_raw": []
basis_points: 750is the collection rate to show users (7.5%).basis_points_raw: 65535is the on-chain sentinel used in the leaf data hash — not a 655.35% royalty.creatorsare collection Royalties plugin payees;creators_raw: []is the leaf creators array for hashing.
If the collection cannot be resolved, basis_points may fall back while basis_points_raw remains 65535.
Detection and display helpers
These three helpers cover the operations that differ for inherited royalties: detecting inheritance, recovering the leaf value for writes, and picking the right creator list.
const INHERIT = 0xffff // 65535
function isInheritedRoyalty(royalty: {
basis_points: number
basis_points_raw?: number | null
inherited?: boolean | null
}): boolean {
if (royalty.inherited === true) return true
if (royalty.basis_points_raw != null) {
return royalty.basis_points_raw === INHERIT
}
// Older DAS versions return neither field and surface the sentinel
// directly in basis_points. Without this, 65535 reads as a 655.35% fee.
return royalty.basis_points === INHERIT
}
function leafBasisPoints(royalty: {
basis_points: number
basis_points_raw?: number | null
inherited?: boolean | null
}): number {
if (royalty.basis_points_raw != null) return royalty.basis_points_raw
if (royalty.inherited) return INHERIT
return royalty.basis_points
}
function leafCreators(asset: {
creators: Array<{ address: string; share: number; verified: boolean }>
creators_raw?: Array<{
address: string
share: number
verified: boolean
}> | null
}) {
return asset.creators_raw ?? asset.creators
}
With @metaplex-foundation/digital-asset-standard-api:
import {
SELLER_FEE_BASIS_POINTS_INHERIT,
isInheritedSfbpRoyalty,
getRawSellerFeeBasisPoints,
getResolvedSellerFeeBasisPoints,
} from '@metaplex-foundation/digital-asset-standard-api'
const royalty = asset.royalty
if (isInheritedSfbpRoyalty(royalty)) {
const rate = getResolvedSellerFeeBasisPoints(royalty) // e.g. 750 (display)
const leaf = getRawSellerFeeBasisPoints(royalty) // 65535
const payees = asset.creators // collection payees
const leafCreators = asset.creators_raw ?? []
}
What not to do
Most integration bugs come from showing a leaf value to users or hashing a display value into a write.
- Do not show
65535or6.5535%as the user-facing royalty rate — that value lives onbasis_points_raw. - Do not assume empty
creators_rawmeans no royalty recipients; display payees are oncreators. - Do not use main
basis_points/creatorswhen recomputing leaf hashes or building Bubblegum write instructions — usebasis_points_rawandcreators_raw.
Outdated DAS / marketplaces
Inherited royalties require a DAS indexer that resolves collection rates onto the main fields. On an outdated DAS endpoint, getAsset still returns the leaf as-is: royalty.basis_points ≈ 65535, creators: [], and no basis_points_raw / inherited / creators_raw.
Marketplaces that only read those DAS asset fields for payouts may treat the asset as having no royalty recipients (or an invalid rate) and pay creators nothing. Prefer marketplaces that:
- Use an upgraded DAS that returns
inherited/_rawand collection-resolvedcreators/basis_points, or - Read the MPL-Core collection Royalties plugin directly for payouts
Royalty enforcement (who may transfer) is separate: configure the collection Royalties plugin ruleSet (ProgramAllowList / ProgramDenyList). Bubblegum does not escrow royalty payments on transfer.
Bubblegum SDK note
getAssetWithProof keeps reading compatible: metadata mirrors DAS main fields (basis_points, creators), so metadata.sellerFeeBasisPoints is the resolved collection rate when inherited. currentMetadata is leaf-canonical for writes (sentinel when inherited). Optional siblings sellerFeeBasisPointsRaw / creatorsRaw and inherited mirror DAS _raw / inherit detection. Spread ...assetWithProof into write instructions — use currentMetadata for leaf args, not display metadata. See the JavaScript SDK.
Notes
- DAS support varies by provider. Upgraded indexers return
basis_points_raw,creators_raw, andinherited; older ones omit all three and surface the65535sentinel directly onbasis_points, so treat those fields as optional and fall back on the sentinel. - Inheritance is resolved at read time from the MPL-Core collection's Royalties plugin. Changing the collection's rate changes what DAS reports for every inheriting asset without touching any leaf.
- Royalty enforcement is separate from royalty payment. The collection's
ruleSet(ProgramAllowList/ProgramDenyList) governs which programs may transfer; Bubblegum does not escrow royalty payments on transfer. - Applies to Bubblegum V2 (MPL-Bubblegum). V1 trees have no collection-level royalty inheritance.
- The DAS fields on this page (
basis_points_raw,creators_raw,inherited) need@metaplex-foundation/digital-asset-standard-api≥ 2.1.0.getAssetWithProofexposescurrentMetadatafrom@metaplex-foundation/mpl-bubblegum5.1.0, but itssellerFeeBasisPointsRaw,creatorsRaw, andinheritedsiblings are not published yet — they arrive with mpl-bubblegum#173. Read them offrpcAssetuntil that ships.
FAQ
Why does royalty.basis_points_raw show 65535?
That is the onchain inherit sentinel used for leaf hashing. royalty.basis_points already holds the collection rate for display.
Why is creators_raw empty on an inherited cNFT?
Leaf creators must be empty when SFBP is inherited. Use creators for collection royalty payees.
Do I need to change anything for non-inherited cNFTs?
No. When inheritance is not used, the _raw fields and inherited are omitted and the main royalty and creators fields behave as before.
