功能

获取资产

现在我们知道如何创建和铸造资产的各种链上账户,让我们学习如何获取它们。

数字资产

上一页所述,一个资产——无论是否可替代——需要创建多个链上账户。根据资产的代币标准,某些账户可能不是必需的。以下是这些账户的快速概述:

  • 铸造账户(来自 SPL Token 程序):它定义了底层 SPL 代币的核心属性。这是任何资产的入口点,因为所有其他账户都从它派生。
  • 元数据账户:它为底层 SPL 代币提供附加数据和功能。
  • 主版版本账户(仅适用于非同质化代币):它使原始 NFT 能够打印多个副本。即使 NFT 不允许打印版本,仍然会创建主版账户,因为它被用作铸造账户的铸造权限和冻结权限,以确保其非同质化性。

为了使获取资产更容易,我们的 SDK 提供了一组辅助方法,允许我们一次性获取资产的所有相关账户。我们称存储所有这些账户的数据类型为数字资产。在接下来的小节中,我们将介绍获取数字资产的各种方法。

数字资产定义

import { PublicKey } from '@metaplex-foundation/umi'
import { Mint } from '@metaplex-foundation/mpl-toolbox'
import {
Metadata,
MasterEdition,
Edition,
} from '@metaplex-foundation/mpl-token-metadata'
export type DigitalAsset = {
publicKey: PublicKey
mint: Mint
metadata: Metadata
edition?:
| ({ isOriginal: true } & MasterEdition)
| ({ isOriginal: false } & Edition)
}

按铸造获取

此辅助方法从其铸造账户的公钥获取单个数字资产

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchDigitalAsset } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const mintAddress = publicKey('Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK');
8
9// Fetch a digital asset by its mint address
10const asset = await fetchDigitalAsset(umi, mintAddress);
11
12console.log('Asset:', asset.publicKey);
13console.log('Metadata:', asset.metadata.publicKey);
14console.log('Name:', asset.metadata.name);
15console.log('URI:', asset.metadata.uri);
16console.log('Seller Fee:', asset.metadata.sellerFeeBasisPoints);

按元数据获取

此辅助方法从其元数据账户的公钥获取单个数字资产。这比前一个辅助方法效率略低,因为我们首先需要获取元数据账户的内容来查找铸造地址,但如果您只能访问元数据公钥,这可能会有所帮助。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchDigitalAssetByMetadata } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const metadataAddress = publicKey('Gz3vYbpsB2agTsAwedtvtTkQ1CG9Cpo6eTq59rrEGCKF');
8
9// Fetch a digital asset by its metadata address
10const asset = await fetchDigitalAssetByMetadata(umi, metadataAddress);
11
12console.log('Asset:', asset.publicKey);
13console.log('Metadata:', asset.metadata.publicKey);
14console.log('Name:', asset.metadata.name);
15console.log('URI:', asset.metadata.uri);

按铸造列表获取所有

此辅助方法获取与提供列表中的铸造公钥一样多的数字资产

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchAllDigitalAsset } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const mints = [
8 publicKey('Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK'),
9 publicKey('8TQdiAzdZZEaKtHGjvnLMXhVGjfNsqMgPGBQPPsWYgo8'),
10];
11
12// Fetch multiple digital assets by their mint addresses
13const assets = await fetchAllDigitalAsset(umi, mints);
14
15assets.forEach((asset) => {
16 console.log('Asset:', asset.publicKey);
17 console.log('Name:', asset.metadata.name);
18});

按创作者获取所有

此辅助方法按创作者获取所有数字资产。由于创作者可以位于元数据账户中的五个不同位置,我们还必须提供我们感兴趣的创作者位置。例如,如果我们知道对于一组 NFT,第一个创作者是创作者 A,第二个创作者是 B,我们将希望在位置 1 中搜索创作者 A,在位置 2 中搜索创作者 B。

此辅助方法需要 RPC 调用来过滤账户,在 Umi SDK 中可用。对于 Kit SDK,请考虑使用 DAS(数字资产标准)API 提供商进行高效查询。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchAllDigitalAssetByCreator } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const creator = publicKey('creatorAddress...');
8
9// Assets where the creator is first in the Creator array
10const assetsA = await fetchAllDigitalAssetByCreator(umi, creator);
11
12// Assets where the creator is second in the Creator array
13const assetsB = await fetchAllDigitalAssetByCreator(umi, creator, {
14 position: 2,
15});
16
17console.log('Assets with creator at position 1:', assetsA.length);
18assetsA.forEach((asset) => {
19 console.log('Name:', asset.metadata.name);
20});

按所有者获取所有

此辅助方法按所有者获取所有数字资产

此辅助方法需要 RPC 调用来过滤账户,在 Umi SDK 中可用。对于 Kit SDK,请考虑使用 DAS(数字资产标准)API 提供商进行高效查询。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchAllDigitalAssetByOwner } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const owner = publicKey('ownerAddress...');
8
9// Fetch all digital assets owned by a wallet
10const assets = await fetchAllDigitalAssetByOwner(umi, owner);
11
12assets.forEach((asset) => {
13 console.log('Name:', asset.metadata.name);
14 console.log('URI:', asset.metadata.uri);
15});

按更新权限获取所有

此辅助方法从其更新权限的公钥获取所有数字资产

此辅助方法需要 RPC 调用来过滤账户,在 Umi SDK 中可用。对于 Kit SDK,请考虑使用 DAS(数字资产标准)API 提供商进行高效查询。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchAllDigitalAssetByUpdateAuthority } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const updateAuthority = publicKey('updateAuthorityAddress...');
8
9// Fetch all digital assets by update authority
10const assets = await fetchAllDigitalAssetByUpdateAuthority(umi, updateAuthority);
11
12console.log('Found', assets.length, 'assets');
13assets.forEach((asset) => {
14 console.log('Name:', asset.metadata.name);
15 console.log('Mint:', asset.publicKey);
16});

带代币的数字资产

请注意,上述提到的数字资产数据结构不提供有关资产所有者的任何信息。第一个定义仅关注无论其所有者如何都需要的链上账户。但是,为了提供资产的更完整图景,我们可能还需要知道谁拥有它。这就是带代币的数字资产数据结构的用武之地。它是数字资产数据结构的扩展,还包括以下账户:

  • 代币账户(来自 SPL Token 程序):它定义了铸造账户与其所有者之间的关系。它存储重要数据,例如所有者拥有的代币数量。在 NFT 的情况下,数量始终为 1。
  • 代币记录账户(仅适用于 PNFT):它为可编程非同质化代币定义附加的代币相关信息,例如其当前的代币委托及其角色。

请注意,对于可替代资产,同一个数字资产可能通过多个代币账户与多个所有者关联。因此,对于同一个数字资产,可以有多个带代币的数字资产。

在这里,我们还提供了一组辅助方法来获取带代币的数字资产。

带代币的数字资产定义

import { Token } from '@metaplex-foundation/mpl-toolbox'
import {
DigitalAsset,
TokenRecord,
} from '@metaplex-foundation/mpl-token-metadata'
export type DigitalAssetWithToken = DigitalAsset & {
token: Token
tokenRecord?: TokenRecord
}

按铸造获取

此辅助方法从其铸造账户的公钥获取单个带代币的数字资产。这主要适用于非同质化资产,因为它只会返回一个带代币的数字资产,无论可替代资产存在多少个。

Kit SDK 需要知道代币地址或所有者。如果您知道所有者,请使用下面的"按铸造和所有者获取"辅助方法。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchDigitalAssetWithTokenByMint } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const mint = publicKey('Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK');
8
9// Fetch a digital asset with its token account by mint address
10const asset = await fetchDigitalAssetWithTokenByMint(umi, mint);
11
12console.log('Asset:', asset.publicKey);
13console.log('Name:', asset.metadata.name);
14console.log('Token Owner:', asset.token.owner);
15console.log('Token Amount:', asset.token.amount);

按铸造和所有者获取

此辅助方法比前一个辅助方法更高效,但要求我们知道资产的所有者。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchDigitalAssetWithAssociatedToken } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const mint = publicKey('Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK');
8const owner = publicKey('ownerAddress...');
9
10// Fetch a digital asset with its associated token account
11const asset = await fetchDigitalAssetWithAssociatedToken(umi, mint, owner);
12
13console.log('Asset:', asset.publicKey);
14console.log('Name:', asset.metadata.name);
15console.log('Token Owner:', asset.token.owner);
16console.log('Token Amount:', asset.token.amount);

按所有者获取所有

此辅助方法从给定所有者获取所有带代币的数字资产

此辅助方法需要 RPC 调用来过滤账户,在 Umi SDK 中可用。对于 Kit SDK,请考虑使用 DAS(数字资产标准)API 提供商进行高效查询。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchAllDigitalAssetWithTokenByOwner } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const owner = publicKey('ownerAddress...');
8
9// Fetch all digital assets with their token accounts by owner
10const assets = await fetchAllDigitalAssetWithTokenByOwner(umi, owner);
11
12console.log('Found', assets.length, 'assets');
13assets.forEach((asset) => {
14 console.log('Name:', asset.metadata.name);
15 console.log('Token Amount:', asset.token.amount);
16});

按铸造获取所有

此辅助方法从铸造账户的公钥获取所有带代币的数字资产。这对于可替代资产特别相关,因为它获取所有代币账户。

此辅助方法需要 RPC 调用来过滤账户,在 Umi SDK 中可用。对于 Kit SDK,请考虑使用 DAS(数字资产标准)API 提供商进行高效查询。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchAllDigitalAssetWithTokenByMint } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const mint = publicKey('Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK');
8
9// Fetch all token accounts for a given mint
10const assets = await fetchAllDigitalAssetWithTokenByMint(umi, mint);
11
12console.log('Found', assets.length, 'token accounts');
13assets.forEach((asset) => {
14 console.log('Owner:', asset.token.owner);
15 console.log('Amount:', asset.token.amount);
16});

按所有者和铸造获取所有

此辅助方法从所有者和铸造账户获取所有带代币的数字资产。这对于为给定所有者拥有多个代币账户的可替代资产很有用。

此辅助方法需要 RPC 调用来过滤账户,在 Umi SDK 中可用。对于 Kit SDK,请考虑使用 DAS(数字资产标准)API 提供商进行高效查询。

1import { publicKey } from '@metaplex-foundation/umi';
2import { fetchAllDigitalAssetWithTokenByOwnerAndMint } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5// See getting-started for full setup
6
7const owner = publicKey('ownerAddress...');
8const mint = publicKey('Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK');
9
10// Fetch all token accounts for a given owner and mint
11const assets = await fetchAllDigitalAssetWithTokenByOwnerAndMint(umi, owner, mint);
12
13console.log('Found', assets.length, 'token accounts');
14assets.forEach((asset) => {
15 console.log('Token Address:', asset.token.publicKey);
16 console.log('Amount:', asset.token.amount);
17});