Skip to content

[bug] Bitcoin useAppKitAccount values do not change on provider's account change #4064

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
dimisus opened this issue Mar 22, 2025 · 3 comments
Labels
bug Something isn't working needs review

Comments

@dimisus
Copy link

dimisus commented Mar 22, 2025

Link to minimal reproducible example

https://stackblitz.com/edit/github-r4vuagsg?file=src%2FApp.tsx

Summary

XVerse wallet:

//// connect to XVerse wallet

const { address, allAccounts, isConnected } = useAppKitAccount({ namespace: ChainNamespace.bip122 });

useEffect(() => {
  console.log(address);  // ✔️ shows connected address
  console.log(allAccounts); // ✔️ shows all connected addresses
  void walletProvider?.getAccountAddresses().then((a) => {
    console.log({ a }); // ✔️ shows all connected address
  });
}, [address, allAccounts]);

///// Go to XVerse extensions, change from account1 to account2

useEffect(() => {
  console.log(address);  // ✔️ shows new connected address
  console.log(allAccounts); // 𝗫 shows OLD addresses for the connected provider = state not updated
  void walletProvider?.getAccountAddresses().then((a) => {
    console.log({ a }); // ✔️ shows NEW addresses
  });
}, [address, allAccounts]);

Phantom wallet:

//// connect to Phantom wallet

const { address, allAccounts, isConnected } = useAppKitAccount({ namespace: ChainNamespace.bip122 });
const { walletProvider } = useAppKitProvider<BitcoinConnector>(namespace);

useEffect(() => {
  console.log(address);  // ✔️ shows connected address
  console.log(allAccounts); // ✔️ shows all connected addresses
  void walletProvider?.getAccountAddresses().then((a) => {
    console.log({ a }); // ✔️ shows all connected addresses
  });
}, [address, allAccounts]);

///// Go to Phantom extensions, change from account1 to account2

useEffect(() => { // actually, not triggered at all
  console.log(address);  // 𝗫 shows OLD addresses
  console.log(allAccounts); // 𝗫 shows OLD addresseses
  void walletProvider?.getAccountAddresses().then((a) => {
    console.log({ a }); // 𝗫 shows OLD addresses
  });
}, [address, allAccounts]);

// Page reload resolves

List of related npm package versions

"@reown/appkit": "^1.7.0",
"@reown/appkit-adapter-bitcoin": "^1.7.0",
"@reown/appkit-adapter-wagmi": "^1.7.0",

Node.js Version

22.8.0

Package Manager

yarn 3.7.0

@dimisus dimisus added bug Something isn't working needs review labels Mar 22, 2025
Copy link

Hi,

Please can you provide a screen recording of the issue you are getting, this will help us to reproduce it and prioritise it

@dimisus
Copy link
Author

dimisus commented Apr 8, 2025

https://stackblitz.com/edit/github-gdzjhr7k-ynwrrv48?file=src%2FApp.tsx


There is unfortunately another bug with XVerse, in which although the wallet is clearly installed and ready to use, it is not identified by appkit. Happened to me and different colleagues and double checked on different platforms.

Here is the a video for Phantom.

Screen.Recording.2025-04-08.at.10.56.17.mp4

Here is also a current workaround, how I deal with account changes:

 const { open } = useAppKit();
  const namespace = useReownNamespaceByCurrency(Currency.BTC);
  const { address, isConnected, disconnect } = useReownAccountBtc();
  const { walletProvider } = useAppKitProvider<BitcoinConnector>(namespace);
  const { account, allAccounts, setAccount, setAllAccounts } = useCurrentAccountStore();

  const changeAccount = useCallback(
    (nextAccount?: string) => {
      if (walletProvider && isConnected) {
        void walletProvider?.getAccountAddresses().then((providerAddresses) => {
          if (providerAddresses && providerAddresses?.length > 0) {
            setAllAccounts(providerAddresses.filter((item) => !['stacks', 'stx'].includes(item.purpose)));
            const defaultPaymentAccount = providerAddresses.find((item) => item.purpose === 'payment')?.address || null;
            const newAccount = providerAddresses.find((item) => item.address === nextAccount);
            if (newAccount) setAccount(newAccount.address);
            else setAccount(defaultPaymentAccount);
          }
        });
      }
    },
    [walletProvider, address, isConnected]
  );

  useEffect(() => {
    if (walletProvider) {
      changeAccount(account ?? address);
      walletProvider.on('accountsChanged', (accounts: string[]) => {
        changeAccount(accounts[0]);
      });
      walletProvider.on('chainChanged', () => {
        setAccount(null);
        setAllAccounts([]);
        changeAccount();
      });
    }
  }, [walletProvider]);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working needs review
Projects
None yet
Development

No branches or pull requests

2 participants