metaplex 和 solana web3 依赖冲突 (react.js)

metaplex and solana web3 dependency conflict (react.js)

我正在开发一个 React 应用程序,我有来自我编写的 2 个不同应用程序的代码

应用程序 A 使用 metaplex 查找用户(钱包地址)拥有的所有 NFT:

import { Connection as MetaConnection } from "@metaplex/js/";
import { Metadata, MetadataData } from "@metaplex-foundation/mpl-token-metadata";

const lookupNfts = async () => {
    let metaConnection = new MetaConnection('mainnet-beta');
    const nftsmetadata = await Metadata.findDataByOwner(metaConnection, props.walletKey);

    // now I have a list of nft's via metadata
}

"dependencies": {
  "@metaplex-foundation/mpl-token-metadata": "^1.2.5",
  "@metaplex/js": "^4.12.0",
  "@solana/spl-token": "^0.1.8",
  "@solana/web3.js": "^1.35.3",
}

应用程序 B 在 NFT 的钱包之间进行支付

import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import { Account } from "@solana/spl-token";   // ERROR on this line, see screenshot

async function transfer_tokens(wallet: Keypair, connection: Connection, amount: number, reciver_token_account: Account, from_token_account: Account) {
//if tx takes more when 60 sec to complete you will receive error here
const transfer_tx = await splToken.transfer(
    connection,
    wallet,
    from_token_account.address,
    reciver_token_account.address,
    wallet,
    amount,
    [wallet],
    false,
    splToken.TOKEN_PROGRAM_ID,
)

但是,当我尝试在一个应用程序中同时使用这段代码时,它不起作用...

似乎有冲突。来自应用程序 A 的依赖项引入 @solana/spl-token@0.1.8,但应用程序 B 需要 @solana/spl-token@0.2.0.

如果我将 solana/spl-token 升级到 0.2.0,应用程序 A 会中断。 如果我将 solana/spl-token 保持在 0.1.8,应用程序 B 将不起作用。

我做了一个 npm ls,它显示了这个。

似乎 metaplex/js@4.12.0 依赖于旧的 0.1.8。

如何解决这个依赖冲突?

@metaplex/js 库使用旧版本的 MPL 包,例如 @metaplex-foundation/mpl-token-metadata,如您所知,它使用旧版本的 @solana/spl-token。不幸的是,即使只有一个嵌套依赖项使用了 SPL 令牌程序的 0.1.8 版本,它也将用于整个项目。

如果您使用的是 yarn,一个快速修复可能是使用 package.json.

中的 resolutions 对象强制版本 0.2.0
"resolutions": {
  "@solana/spl-token": "0.2.0"
}

如果您使用 npm,您还需要 install this package

但是,值得注意的是,Metaplex 当前的 JavaScript SDK 将被弃用,取而代之的是新的:https://github.com/metaplex-foundation/js-next

使用新的 JS SDK,您可以使用以下代码按所有者获取所有 NFT。

import { Metaplex } from "@metaplex-foundation/js-next";
import { Connection, clusterApiUrl } from "@solana/web3.js";

const connection = new Connection(clusterApiUrl("mainnet-beta"));
const metaplex = new Metaplex(connection);
const owner = new PublicKey("some_public_key");

const nft = await metaplex.nfts().findAllByOwner(owner);