Asset Claim
The Asset Claim is used to request that a user present proof of ownership for a specific on-chain digital asset, such as a Non-Fungible Token (NFT). This is particularly useful for scenarios like NFT-gated access, where entry to a service or content is restricted to owners of a particular asset.
This claim allows your application to verify asset ownership by specifying various criteria, including the asset's address, its issuer, or its parent collection.
For more general requests that can accept either an asset or a Verifiable Credential, see the Asset or VC Claim.
How It Works#
When you request an Asset Claim, DID Connect prompts the user to select a qualifying asset from their wallet. The wallet filters the user's assets based on the criteria you define in the claim request. Once the user selects and presents a valid asset, your application receives its details for verification.
Parameters#
The asset claim is configured using an object with the following properties. The core of the request is the filters array, which allows you to define one or more sets of criteria.
Parameter | Type | Description |
|---|---|---|
|
| Required. A message displayed to the user explaining why they need to present the asset. |
|
| If |
|
| An array of filter objects. The wallet will find assets that match any of the filters (OR logic). |
|
| An optional URL where the user can go to obtain the required asset if they don't already own one. |
Filter Object Properties#
Each object within the filters array can contain the following properties. All properties within a single filter are combined with AND logic.
Property | Type | Description |
|---|---|---|
|
| The specific DID address of the asset. |
|
| A list of DIDs of trusted asset issuers. An issuer can be a simple DID string or an object |
|
| A list of DIDs of trusted parent assets. This is commonly used to verify if an NFT belongs to a specific collection. |
|
| A specific tag that must be associated with the asset. |
|
| An array of DIDs. The asset's owner must be one of the DIDs in this list. |
|
| Specifies whether the asset must be in a consumed ( |
Requesting an Asset#
Here are some examples of how to structure an asset claim request within the claims object passed to the authenticator.
Example 1: Gating Access with an NFT Collection#
This example requests any asset whose parent is a specific NFT collection DID. This is a common way to grant access to holders of a particular NFT project.
Requesting an NFT from a specific collection
const claims = {
asset: {
description: 'Please present your Membership NFT to access the private community.',
filters: [
{
// The parent DID of the NFT collection
trustedParents: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
},
],
acquireUrl: 'https://example.com/mint-nft',
},
};
// In your route handler
const { authInfo } = await authenticator.sign({ context, claims });Example 2: Requesting a Specific Asset by Address#
If you need the user to present a very specific asset, you can filter by its unique address.
Requesting a specific asset by its address
const claims = {
asset: {
description: 'Please present your Golden Ticket NFT to proceed.',
filters: [
{
// The unique DID address of the Golden Ticket NFT
address: 'zjddPDAK5rm1E4syjTkgoiskGBAfve5YYN2s',
},
],
},
};Example 3: Using Multiple Filters#
You can provide multiple filter objects to give the user more options. In this example, the user can present either an asset from a trusted issuer OR an asset from a trusted collection.
Using multiple filters for more flexibility
const claims = {
asset: {
description: 'Present an asset from our official issuer or a partner collection.',
optional: true, // Making this optional
filters: [
{
// Option 1: Asset from a trusted issuer
trustedIssuers: ['zNKjDm4Xsoaffb19UE6QxVeevuaTaLCS1n1S'],
tag: 'official-badge',
},
{
// Option 2: Asset from a partner NFT collection
trustedParents: ['z9f9aE3E6d4c4b2A1c8f8b6e2d0F0g2H2i4j6k8m'],
},
],
},
};Wallet Response#
If the user successfully presents a valid asset, the onAuth or onConnect callback in your handler will receive the asset details. The presented asset will be included in the claims array of the session context.
You can access it like this:
Handling the wallet response
const handlers = new WalletHandlers({
authenticator,
// ...other handlers
onAuth: async (req, res) => {
const { userDid, claims } = req.context.did_connect;
// Find the presented asset claim in the response
const presentedAsset = claims.find(x => x.type === 'asset');
if (presentedAsset) {
console.log(`User ${userDid} presented asset:`, presentedAsset.asset);
// The `presentedAsset.asset` will contain the full details of the presented NFT
// e.g., its address, issuer, owner, etc.
} else {
console.log('User did not present the required asset.');
}
res.redirect('/profile');
},
});Next, explore how to request a Verifiable Credential, another powerful way to verify user attributes.