# Safe Saber Walletkit

## Supported Library: @saberhq/use-solana

Snowflake Safe-integrated version of @saberhq/use-solana

## Installation

[![npm](https://img.shields.io/npm/v/@snowflake-so/safe-saber-walletkit)](https://www.npmjs.com/package/@snowflake-so/safe-saber-walletkit)

```
npm install @snowflake-so/safe-saber-walletkit

yarn add @snowflake-so/safe-saber-walletkit
```

## Disclaimer

This package is a **forked versio**n of `@saberhq/use-solana` package. The purpose of this is to provide more React hooks and Context API for the use of Snowflake Safe integration. Original source code can be found here: [@saberhq/use-solana](https://github.com/saber-hq/saber-common/tree/d50ce9594e01e1eff4a7c1073915413f9330125f/packages/use-solana)

Tribute to the **Saber** team for an amazing open-sourced project

### @saberhq/use-solana

Solana frontend library and TypeScript SDK. This SDK features:

- React hooks and providers for adding a Solana connection to your app
- Integrations with several popular wallets (full list [here](https://github.com/saber-hq/use-solana/blob/master/packages/use-solana/src/providers.tsx))
- Helpers for fetching token account balances and performing mathematical operations on tokens

### Changelog

#### useConnectedSafeWallet

Extends useConnectedWallet

```tsx
export const useConnectedSafeWallet = () => {
  const wallet = useConnectedWallet();
  const { safe } = useSafe();
  const [returnWallet, setReturnWallet] = useState<ConnectedSafeWallet>();

  useEffect(() => {
    if (
      safe.connected &&
      safe.safeInfo.vaultAddress &&
      safe.safeInfo.walletPublicKey
    ) {
      setReturnWallet({
        ...(wallet as ConnectedWallet),
        publicKey: new PublicKey(safe.safeInfo.vaultAddress),
        autoApprove: wallet?.autoApprove ?? false,
        connected: true,
        isSafeApp: true,
        walletPublicKey: new PublicKey(safe.safeInfo.walletPublicKey),
      });
    } else if (wallet !== null) {
      setReturnWallet(wallet);
    }
  }, [wallet, safe]);

  return returnWallet;
};
```

#### useSnowflakeSolana

Extends useSolana

```tsx
export const useSnowflakeSolana = (): UseSolana<
  WalletTypeEnum<any>,
  boolean
> => {
  const walletSolana = useSolana();
  const connectedWallet = useConnectedSafeWallet();
  const [snowflakeSolana, setSnowflakeSolana] =
    useState<UseSolana<WalletTypeEnum<any>, boolean>>(walletSolana);

  useEffect(() => {
    if (connectedWallet?.isSafeApp) {
      setSnowflakeSolana({
        ...(walletSolana as UseSolana<WalletTypeEnum<any>, boolean>),
        wallet: connectedWallet,
        connected: true,
        publicKey: connectedWallet.publicKey,
        providerMut: new SolanaAugmentedProvider(
          WalletAdapterProvider.init({
            connection: walletSolana.connection,
            wallet: connectedWallet,
          })
        ),
      });
    } else {
      setSnowflakeSolana(walletSolana);
    }
  }, [walletSolana, connectedWallet]);

  return snowflakeSolana;
};
```

### Documentation

Detailed information on how to build on Saber can be found on the [Saber developer documentation website](https://docs.saber.so/docs/developing/overview).

Automatically generated TypeScript documentation can be found [on GitHub pages](https://saber-hq.github.io/saber-common/).

## Support

### Struggle with the SDK integration?

If you have any problem with using the SDK in your system, drop a question our Snowflake Discord #sdk to receive a support from our engineers.

### Find a bug or want to contribute to Snowflake?

If you find a bug or have any problem and idea while using the SDK, you can create an issue on SDK Github.

License
MIT

## License

Apache 2.0
