Introduction
MPL Core Asset
Last updated January 31, 2026
This page explains what a Core Asset is and how it differs from traditional Solana NFTs. Understand the account structure, collection relationships, and metadata storage.
Key Concepts
- Single-account model: Core Assets store ownership within the Asset account itself
- No token accounts: Unlike SPL tokens, Core doesn't require Associated Token Accounts
- Collection membership: Assets can belong to Collections via the updateAuthority field
- Off-chain metadata: A URI points to JSON metadata (permanent storage like Arweave/IPFS is recommended)
Summary
A Core Asset is a single Solana account that represents an NFT. Unlike Token Metadata (which requires 3+ accounts), Core stores all essential data in one account: owner, name, URI, and update authority. This makes Core Assets ~80% cheaper and simpler to work with.
Overview
Setting itself apart from existing Asset programs, like Solana’s Token program, Metaplex Core and Core Assets (sometimes referred to as Core NFT Assets) do not rely on multiple accounts, like Associated Token Accounts. Instead, Core Assets store the relationship between a wallet and the "mint" account within the asset itself.
The Core Asset Account
The Core Asset account represents the bare minimum data for a digital asset. This structure provides an unopinionated blockchain primitive for onchain ownership.
Is my Asset in a Collection?
MPL Core Assets can belong to collections. The updateAuthority field in the MPL Core Asset data provides two duties, either to report the update authority of the Asset, or to provide the publicKey of the MPL Core Collection to which it belongs. When accessing the updateAuthority field either directly via the asset, or via the collectionAddress helper of the MPL Core Asset, the returning result will be one of the following outcomes: Collection The asset belongs to the collection at the given address.
Create Asset
{
__kind: 'Collection'
fields: [PublicKey]
}
import { fetchAssetV1 } from '@metaplex-foundation/mpl-core'
const asset = await fetchAssetV1(umi, assetAddress.publicKey)
const collectionId = collectionAddress(asset)
console.log({collectionId})
console.log({asset})
// log
collection: '2222222222222222222222222222222'
asset: {
key: AssetV1,
owner: "11111111111111111111111111111111",
updateAuthority: {
type: 'Collection',
address: '2222222222222222222222222222222'
},
name: "My Core Asset",
uri: "https://example.com/metadata.json",
...
}
Address The asset has an update authority set and does not belong to a collection.
Create Asset
import { fetchAssetV1 } from '@metaplex-foundation/mpl-core'
const asset = await fetchAssetV1(umi, assetAddress.publicKey)
const collectionId = collectionAddress(asset)
console.log({collectionId})
console.log({asset})
// log
collectionId: undefined
asset: {
key: AssetV1,
owner: "11111111111111111111111111111111",
updateAuthority: {
type: 'Address',
address: '2222222222222222222222222222222'
}
name: "My Core Asset",
uri: "https://example.com/metadata.json",
...
}
None The asset has no update authority set.
Create Asset
import { fetchAssetV1 } from '@metaplex-foundation/mpl-core'
const asset = await fetchAssetV1(umi, assetAddress.publicKey)
const collectionId = collectionAddress(asset)
console.log({collectionId})
console.log({asset})
// log
collectionId: undefined
asset: {
key: AssetV1,
owner: "11111111111111111111111111111111",
updateAuthority: {
type: 'None',
},
name: "My Core Asset",
uri: "https://example.com/metadata.json",
}
Off Chain Metadata
One important attribute of the Asset Account is the URI attribute that points to a JSON file off-chain. This is used to safely provide additional data whilst not being constrained by the fees involved in storing onchain data. That JSON file follows a certain standard that anyone can use to find useful information on tokens. Off Chain Metadata can be stored at any publicly accessible location. Popular places to host your json files include;
- Arweave
- NFT.Storage/IPFS
- Amazon AWS S3/Google Cloud
| Field | Type | Description |
|---|---|---|
| name | string | Name of the asset. |
| description | string | Description of the asset. |
| image | string | URI pointing to the asset's logo. |
| animation_url | string | URI pointing to the asset's animation. |
| external_url | string | URI pointing to an external URL defining the asset — e.g. the game's main site. |
| attributes | array | Array of attributes defining the characteristics of the asset.
|
| properties | object | Additional properties that define the asset.
|
Note that, this JSON file can be stored using a permanent storage solution such as Arweave to ensure it cannot be updated. Additionally, one can set the Update Authority field to None to make it immutable and, therefore, forbid the URI and Name attributes to ever be changed. Using this combination, we can guarantee the immutability of the off-chain JSON file.
FAQ
How is Core different from Token Metadata NFTs?
Token Metadata requires 3+ accounts (mint, metadata, token account). Core uses a single account that stores owner and metadata together. This makes Core ~80% cheaper and faster to create.
What data is stored on-chain vs off-chain?
On-chain: owner, name, URI, update authority, plugins. Off-chain (at the URI): description, image, attributes, animation URL, and other extended metadata.
Can I convert a Token Metadata NFT to Core?
Not directly. Core and Token Metadata are separate standards. You would need to burn the old NFT and mint a new Core Asset. Some migration tools exist to help with this process.
Is Core compatible with existing NFT marketplaces?
Most major Solana marketplaces support Core Assets. Check Ecosystem Support for the current list of compatible platforms.
What happens if the off-chain metadata goes offline?
The Asset still exists on-chain with its name and URI, but the image and off-chain attributes won't be accessible. On-chain attributes (via the Attributes plugin) remain accessible. Use permanent storage (Arweave, IPFS with pinning) to prevent this.
Glossary
| Term | Definition |
|---|---|
| Asset | A single Core account representing an NFT |
| Owner | The wallet that currently owns the Asset |
| Update Authority | The account authorized to modify Asset metadata |
| URI | URL pointing to off-chain JSON metadata |
| Collection | A Core account that groups related Assets |
| Key | Account discriminator identifying the account type |
| seq | Sequence number used for compression indexing |
