获取钱包中 Solana 代币的余额和所有自定义代币列表

Get Balance and all custom token list of Solana tokens in Wallet

我实际上卡在了连接幻影钱包的第一步。我正在尝试执行以下步骤。

  1. 连接到 Phantom 钱包
  2. 获得一把Public钥匙
  3. 获取所有代币的余额
  4. 执行Buy/Sell

我可以使用以下代码连接到幻影钱包。我不确定该过程的下一步是否是获取 public 密钥,以便我可以找到作为帐户一部分的所有代币的余额。

const balance = connection.getBalance(publicKey); 上述方法是我从文档中找到的,但我不确定如何获取将钱包连接到网站的最终用户的 publicKey。

const connection = new solanaWeb3.Connection(solanaWeb3.clusterApiUrl("mainnet-beta")) console.log(connection);

假设您有用于与 solana 钱包集成的 React 应用程序,首先安装这些软件包:

yarn add @solana/wallet-adapter-base \
     @solana/wallet-adapter-react \
     @solana/wallet-adapter-react-ui \
     @solana/wallet-adapter-wallets \
     @solana/web3.js \
     react

你也可以使用 next、vue、angular、svelte 和 material ui

接下来我们进行此设置:

import React, { FC, useMemo } from 'react';
import { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react';
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base';
import {
    //LedgerWalletAdapter,
    PhantomWalletAdapter,
    SolflareWalletAdapter,
    //SlopeWalletAdapter,
    //SolletExtensionWalletAdapter,
    //SolletWalletAdapter,
    //TorusWalletAdapter,
} from '@solana/wallet-adapter-wallets';
import {
    WalletModalProvider,
    WalletDisconnectButton,
    WalletMultiButton
} from '@solana/wallet-adapter-react-ui';
import { clusterApiUrl } from '@solana/web3.js';

// Default styles that can be overridden by your app
require('@solana/wallet-adapter-react-ui/styles.css');

export const Wallet: FC = () => {
    // The network can be set to 'devnet', 'testnet', or 'mainnet-beta'.
    const network = WalletAdapterNetwork.Devnet;

    // You can also provide a custom RPC endpoint.
    const endpoint = useMemo(() => clusterApiUrl(network), [network]);

    // @solana/wallet-adapter-wallets includes all the adapters but supports tree shaking and lazy loading --
    // Only the wallets you configure here will be compiled into your application, and only the dependencies
    // of wallets that your users connect to will be loaded.
    const wallets = useMemo(
        () => [
            new PhantomWalletAdapter(),
            new SlopeWalletAdapter(),
            new SolflareWalletAdapter(),
            new TorusWalletAdapter(),
            new LedgerWalletAdapter(),
            new SolletWalletAdapter({ network }),
            new SolletExtensionWalletAdapter({ network }),
        ],
        [network]
    );

    return (
        <ConnectionProvider endpoint={endpoint}>
            <WalletProvider wallets={wallets} autoConnect>
                <WalletModalProvider>
                    <WalletMultiButton />
                    <WalletDisconnectButton />
                    { /* Your app's components go here, nested within the context providers. */ }
                </WalletModalProvider>
            </WalletProvider>
        </ConnectionProvider>
    );
};
  • 导入模块后,我评论了一些钱包适配器,除了phantom和solfare

这个代码块也很重要:

        <ConnectionProvider endpoint={endpoint}>
            <WalletProvider wallets={wallets} autoConnect>
                <WalletModalProvider>
                    <WalletMultiButton />
                    <WalletDisconnectButton />
                    { /* Your app's components go here, nested within the context 
                      providers. */ }
                </WalletModalProvider>
            </WalletProvider>
        </ConnectionProvider>

带有功能按钮的模态框被

包围
  • ConnectionProvider:为钱包准备连接和查询钱包令牌的端点
  • WalletProvider:准备哪些钱包应该在模式中加载并准备好连接

最后用法:

import { WalletNotConnectedError } from '@solana/wallet-adapter-base';
import { useConnection, useWallet } from '@solana/wallet-adapter-react';
import { Keypair, SystemProgram, Transaction } from '@solana/web3.js';
import React, { FC, useCallback } from 'react';

export const SendOneLamportToRandomAddress: FC = () => {
    const { connection } = useConnection();
    const { publicKey, sendTransaction } = useWallet();

    const onClick = useCallback(async () => {
        if (!publicKey) throw new WalletNotConnectedError();

        const transaction = new Transaction().add(
            SystemProgram.transfer({
                fromPubkey: publicKey,
                toPubkey: Keypair.generate().publicKey,
                lamports: 1,
            })
        );

        const signature = await sendTransaction(transaction, connection);

        await connection.confirmTransaction(signature, 'processed');
    }, [publicKey, sendTransaction, connection]);

    return (
        <button onClick={onClick} disabled={!publicKey}>
            Send 1 lamport to a random address!
        </button>
    );
};

所以你可以在这部分上面看到

const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();

准备建立连接并给你连接钱包 public 密钥,还利用连接钱包的 sendTransaction 功能,听起来不错!

我认为代码的其他部分很明显。

那么,像phantom这样的钱包适配器,我们有多少功能呢?什么功能? 我们可以得到 public key, connecting(boolean), connected(boolean), readyState.

我们还有其他一些主要功能,例如:

  • 连接
  • 断开连接
  • 发送交易
  • 签署交易
  • 签署所有交易
  • signMessage

你可以在这个github repo link

中看到所有这些

另一点是,如果你使用 Anchor 框架,你应该知道 Anchor 使用它自己的“钱包”对象与连接的钱包交互并代表它签署交易。 因此,为了获得与 Anchor 的钱包定义兼容的对象,我们可以使用另一个名为 useAnchorWallet 的可组合项。这将 return 一个可以签署交易的钱包对象。

const wallet = useAnchorWallet()

玩得开心