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);
我正在开发一个 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);