0

我一直在尝试使用下面的代码从 Solana 钱包地址获取 Solana 钱包中特定令牌的 spl-token 帐户地址,但在获取我正在寻找的结果时遇到问题。我跑:

const web3 = require('@solana/web3.js');

(async () => {
  const solana = new web3.Connection("https://api.mainnet-beta.solana.com");

//the public solana address
  const accountPublicKey = new web3.PublicKey(
    "2B1Uy1UTnsaN1rBNJLrvk8rzTf5V187wkhouWJSApvGT"
  );

//mintAccount = the token mint address
  const mintAccount = new web3.PublicKey(
    "GLmaRDRmYd4u3YLfnj9eq1mrwxa1YfSweZYYZXZLTRdK"
  );
  console.log(
    await solana.getTokenAccountsByOwner(accountPublicKey, {
      mint: mintAccount,
    })
  );
})();

我正在寻找返回中的令牌帐户地址,6kRT2kAVsBThd5cz6gaQtomaBwLxSp672RoRPGizikH4。我得到:

{上下文:{槽:116402202},值:[{帐户:[Object],pubkey:[PublicKey]}]}

我可以使用 .value[0].pubkey 或 .value[0].account 深入了解这一点,但最终无法获得我正在寻找的信息,这是 6kRT2kAVsBThd5cz6gaQtomaBwLxSp672RoRPGizikH4 的返回

有谁知道出了什么问题?(注意我不想使用 getOrCreateAssociatedAccountInfo() 方法,我试图在不处理钱包密钥对的情况下获取令牌帐户地址)

4

2 回答 2

1

问题已解决:我需要获取正确的 _BN 数据并进行转换,解决方案如下。

const web3 = require('@solana/web3.js');

(async () => {
  const solana = new web3.Connection("https://api.mainnet-beta.solana.com");

//the public solana address
  const accountPublicKey = new web3.PublicKey(
    "2B1Uy1UTnsaN1rBNJLrvk8rzTf5V187wkhouWJSApvGT"
  );

//mintAccount = the token mint address
  const mintAccount = new web3.PublicKey(
    "GLmaRDRmYd4u3YLfnj9eq1mrwxa1YfSweZYYZXZLTRdK"
  );
  const account = await solana.getTokenAccountsByOwner(accountPublicKey, {
      mint: mintAccount});

      console.log(account.value[0].pubkey.toString());

})();

于 2022-01-15T21:45:47.730 回答
0

这肯定会成为一种强硬的方法。作为替代方案,您可以尝试仅搜索该钱包拥有的关联令牌帐户,如果它不存在,则不创建它。

您基本上会遵循https://github.com/solana-labs/solana-program-library/blob/0a61bc4ea30f818d4c86f4fe1863100ed261c64d/token/js/client/token.js#L539上的逻辑, 除非没有整个catch块。

于 2022-01-18T20:39:28.397 回答