Skip to main content

Features

Nifty Asset is a fully-featured digital asset standard for Solana. It is lightweight and efficient, designed to offer a small footprint (compute units consumption) and be highly flexible. The main features of the standard are:

  • Single account to represent a digital asset.
  • Flexible on-chain representation: store as much or as little data using optional extensions.
  • Efficient zero-copy de-/serialization to minimize compute units utilization.
  • Full-featured standard, including royalty enforcement, delegates, lock/unlock, inscriptions and groups (collections).
  • Rust and JavaScript client SDKs.

Extensions can be combined to create a wide variety of non-fungible assets, from simple assets with links to off-chain data to fully on-chain assets. In addition to extensions, Nifty Asset follows the ⎘Proxy Pattern to provide developers a program interface to customize every aspect of the protocol – and it enables that without requiring direct changes to the program. The advantage of that is that developers have full flexibility to extend its behaviour in an non-opiniated way. The only requirement is to implement the ⎘program interface.

Single Account

The Asset account consists of a fixed length (header) section followed by an optional variable length section (extensions). The header section contains the basic information of an asset, such as the state, standard, name, and owner. The extensions section contains additional data that can be attached to the asset.

Extensions can either represent additional on-chain data or used to include pointers to external data. For example, an asset can include its image on-chain as an extension or a pointer to an external image.

Delegate System

Nifty Asset include a delegate system with the following roles:

  • Burn
  • Lock
  • Transfer

A delegate can have more than one role active at the same time. This allows creating a delegate for an asset that can perform specific actions on behalf of the owner. This is useful for escrowless marketplaces, for example.

Locking Assets

Asset accounts can be locked and unlocked. This is useful for applications such as escrowless marketplaces and staking. When an asset is locked, it cannot be burned or transferred. Locking can be performed either by the asset owner or a delegate. Once the asset is unlocked, all instruction are permitted.

Soulbound Assets

Nifty Asset allows the creation of assets that cannot be transferred – these are called "soulbound" assets. These assets are created with the Soulbound standard, which cannot be changed after creation.

Extensions

Extensions represent additional data and behaviour that can be attached to assets. Most extensions can be added/removed from assets at any point, as long as the asset is mutable. Extensions that define the "nature" of the assets (e.g., manager extension) must be added when the asset is created.

One of the main advatage of having on-chain extensions is that this data can be read and manipulated by programs.

Attributes

The Attributes extension allows creating a list of on-chain "traits" (key/value pairs) for an asset. The on-chain aspect means these values can be read by other Solana programs and therefore be used by them, e.g., for gaming.

Off-chain attributes are also supported via the Metadata or Links extensions, which allow pointing to external data, similar to other NFT standards on Solana.

Binary Large Object (Blob)

The Blob extension allows storing generic data on-chain, such as images and documents. This data can be read by other Solana programs and therefore be used by them, e.g., for displaying the asset in a marketplace. While storing large amounts of data in a Solana account data is quite expensive, this extension gives the ability to create fully on-chain (FOC) assets for those who wish for them.

Bucket

The Bucket extension allows storing generic data on-chain, similarly to a Blob extension. The main difference is that it is not necessary to specify its content type. The data can be read by other Solana programs, making it useful to store serialized ("object") data.

Creators

The Creators extension allows adding a list of creators to an asset, specifying their status (verified or not) and a percentage share. In most cases, this extension is used in combination with Royalties to determine the addresses that should received royalties. There is no limit on how many creators can be added to an asset.

Grouping

Assets can be part of an on-chain group (collection). A group asset is created using the Grouping extension, which specify the maximum size of the group (or indicates that the group has no upper limit) and its current size. Member assets of the group point to the group asset in their group account field.

A group asset can be used to specify configuration values that are common to all assets in the group, such as creators, royalties or specific attributes. This provides a cost-effective way to store information on-chain that applies to multiple assets.

The Links extension enables a generic way to point to off-chain data. It consists of a list of link pairs, each of which contains a name and a uri. This can be used to point to any additional off-chain data or resources.

Manager

For use cases where the asset needs to be controlled (managed) by a third-party address, Nifty Asset allows the creation of "managed" assets. These assets have the Manager extension enabled, which defines a delegate address with customizable permissions.

Since the Manager extension changes the nature of the asset, given that the owner does not have full ownership of the asset, the extension must be enabled at the creation point and cannot be removed. To clearly distinguish "managed" assets from the others, the standard account field is set to Managed in this case.

Metadata

The Metadata extension allows for assets to have on-chain description, symbol and uri pointing to off-chain metadata, for compatibility with existing NFT standards.

Properties

The Properties extension allows creating a list of on-chain "typed" values (key/value pairs) for an asset. It currently supports three different types: text (as a String value), number (as an u64 value) and boolean. The on-chain aspect means these values can be read by other Solana programs and therefore be used by them (e.g., for gaming).

Proxy

In addition to extensions, Nifty Asset implements the ⎘Proxy Pattern to allow developers extens the program behaviour. The Proxy extension is used to identify accounts that are "proxied" – these accounts will be required to be a signer on instructions that manipulate them. The extension stores the information for clients to determine the address of the proxy program; it also includes the seeds and bump information for a proxy program to add a signature for the account.

Since "proxied" accounts need to be created by a proxy program, the extension must be enabled at the creation point and cannot be removed. To clearly distinguish "proxied" assets from the others, the standard account field is set to Proxied in this case.

Royalties

Nifty Asset encodes royalty enforcement directly into its transfer instruction using a system of composable Constraints that can be used to create restrictions such as an Allowlist or Denylist, ensuring creators receive a portion of the proceeds from secondary sales. This is done via the Royalties extension, where creators can configure the royalties percentage and constraints. These can be used to exclude or include specific programs as valid owners of the asset, similar to the approach used by Programmable NFTs in the Metaplex standard.

The Royalties extension is used in combination with the Creators extension in most cases, where the Creators extension specifies the recipients and share of any royalties.