Quick answers:
To quickly and specifically answer your questions:
- you do not have to redeem NFTs
- you do not need a voucher or anything similar
- you can use the ReadApi to see what compressed NFTs an address owns (or even check an entire collection's owners)
Background
With compressed NFTs, you will have to use an RPC provider that supports the new Digital Asset Standard Read Api (ReadApi for short). The ReadApi adds extra RPC endpoints you can send requests to in order to get tons of information on NFTs (both compressed and traditional/uncompressed NFTs). But these "extra" RPC endpoints won't work on non-supporting providers.
Right now, a few common providers have support. Like Helius, Triton, and SimpleHash.
You can use the ReadApi playground to see the current RPC methods available and the data you can get from them.
Details
For your use case of trying to do some token gating, I would use either the getAssetsByOwner
and/or getAssetsByGroup
endpoints on the ReadApi. These will return a list of assets that you can parse and determine how you want to set the access restrictions for your app.
An example asset response might look like this:
{
interface: 'V1_NFT',
id: 'FX1wWj25bNQJh4gZquH5EMEQtooxg7CzkBxXmziBgeay',
content: [Object],
authorities: [Array],
compression: [Object],
grouping: [],
royalty: [Object],
creators: [],
ownership: [Object],
supply: [Object],
mutable: false
}
I would also recommend paying special attention to these values:
id
- (aka assetId
) this is effectively your compressed NFTs address. sort of. see below.
grouping
- can tell you the collection address that the NFT belongs to. The collection address will be the group_value
.
ownership
- gives you the NFT owner's address (and also if the NFT has delegated authority to another address)
compression
- tells you if this NFT is actually using compression or not. This will also give you the tree
address that is storing the compressed NFT on chain. This could be useful for token gating, but would depend on your implementation.
NOTE: Some of the values will be empty if the NFT is not a compressed NFT. (such as many of the compression
fields). So keep that in mind.
The assetId
If the asset returned is a traditional/uncompressed NFT, this value will be the actual NFTs address viewable via an explorer.
If the asset returned is a compressed NFT, the value is NOT an actual account. It is the leaf node's label within the tree. Due to how merkle trees work, this "address looking value" is not viewable using an explorer the same way a regular Solana address is.
The two are not the same. Once explorers add better support for compressed NFTs, I'm sure we will be able to better explore compressed NFTs.
(PS: this was written in March of 2023)
Example of these more useful data fields:
assetId: 5q7qQ4FWYyj4vnFrivRBe6beo6p88X8HTkkyVPjPkQmF
ownership: {
frozen: false,
delegated: false,
delegate: null,
ownership_model: 'single',
owner: '3aDhr6bXvXAoZg2DtgvxcPa29fydTvHaCNQPYrwcuoSP'
}
grouping: [
{
group_key: 'collection',
group_value: 'G3Tc3QphQK1EjSdLKcgPjtbQyssr2EXDtzeZevzg4tMS'
}
]
compression: {
eligible: false,
compressed: true,
data_hash: 'D57LAefACeaJesajt6VPAxY4QFXhHjPyZbjq9efrt3jP',
creator_hash: '6Q7xtKPmmLihpHGVBA6u1ENE351YKoyqd3ssHACfmXbn',
asset_hash: 'F3oDH1mJ47Z7tNBHvrpN5UFf4VAeQSwTtxZeJmn7q3Fh',
tree: 'BBUkS4LZQ7mU8iZXYLVGNUjSxCYnB3x44UuPVHVXS9Fo',
seq: 3,
leaf_id: 0
}
PS: This is from a devnet collection, tree, and NFT. You could lookup the account addresses on an explorer if you want.
Checkout this demo repo and code examples
You can also checkout this demo repo on the Solana Developers GitHub:
https://github.com/solana-developers/compressed-nfts
It has a bunch of example code on how to do quite a bit with compressed NFTs, and lots of comments to explain things throughout the files.