Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"@dynamic-labs/global-wallet-client": "4.15.0",
"@dynamic-labs/sdk-react-core": "4.29.4",
"@dynamic-labs/solana": "4.29.4",
"@dynamic-labs/sui": "4.29.0",
"@react-native-async-storage/async-storage": "^2.2.0",
"@wallet-standard/wallet": "^1.1.0",
"react": "^19.1.1",
Expand Down Expand Up @@ -133,6 +134,11 @@
"import": "./dist/esm/solana.js",
"default": "./dist/cjs/solana.js"
},
"./sui": {
"types": "./dist/types/sui.d.ts",
"import": "./dist/esm/sui.js",
"default": "./dist/cjs/sui.js"
},
"./ethers": {
"types": "./dist/types/ethers.d.ts",
"import": "./dist/esm/ethers.js",
Expand Down
83 changes: 83 additions & 0 deletions src/lib/suiClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { isSuiWallet, type SuiWallet } from "@dynamic-labs/sui-core";

import { PrimaryWallet } from "../types";

/**
* Extracts a Sui Client from a Primary Wallet instance.
*
* @param primaryWallet - The primary wallet instance from useUniversalSignInContext
* @returns The Sui Client for interacting with the Sui blockchain
* @throws {Error} When primaryWallet is null/undefined or is not a Sui wallet
*
* @example
* ```typescript
* import { getSuiWalletClient } from '@zetachain/wallet/sui';
*
* const { primaryWallet } = useUniversalSignInContext();
*
* try {
* const walletClient = await getSuiWalletClient(primaryWallet);
* // Use with Sui transactions
* const result = await walletClient.executeTransactionBlock({
* transactionBlock: signedTx.bytes,
* signature: signedTx.signature,
* options: {}
* });
* } catch (error) {
* console.error('Not a Sui wallet or wallet unavailable:', error);
* }
* ```
*/
export const getSuiWalletClient = async (
primaryWallet: PrimaryWallet
): Promise<NonNullable<Awaited<ReturnType<SuiWallet["getSuiClient"]>>>> => {
if (!primaryWallet) {
throw new Error("Primary wallet is not available");
}

if (!isSuiWallet(primaryWallet)) {
throw new Error("Primary wallet is not a Sui wallet");
}

const walletClient = await primaryWallet.getSuiClient();

if (!walletClient) {
throw new Error("Failed to get Sui client from wallet");
}

return walletClient;
};

/**
* Validates and returns a properly typed Sui Wallet from a Primary Wallet instance.
*
* @param primaryWallet - The primary wallet instance from useUniversalSignInContext
* @returns The typed SuiWallet instance with signTransaction method
* @throws {Error} When primaryWallet is null/undefined or is not a Sui wallet
*
* @example
* ```typescript
* import { getSuiWallet } from '@zetachain/wallet/sui';
*
* const { primaryWallet } = useUniversalSignInContext();
*
* try {
* const suiWallet = getSuiWallet(primaryWallet);
* // Use to sign transactions
* const signedTx = await suiWallet.signTransaction(transaction);
* } catch (error) {
* console.error('Not a Sui wallet or wallet unavailable:', error);
* }
* ```
*/
export const getSuiWallet = (primaryWallet: PrimaryWallet): SuiWallet => {
if (!primaryWallet) {
throw new Error("Primary wallet is not available");
}

if (!isSuiWallet(primaryWallet)) {
throw new Error("Primary wallet is not a Sui wallet");
}

return primaryWallet;
};
7 changes: 6 additions & 1 deletion src/react/providers/UniversalSignInContextProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
mergeNetworks,
} from "@dynamic-labs/sdk-react-core";
import { SolanaWalletConnectors } from "@dynamic-labs/solana";
import { SuiWalletConnectors } from "@dynamic-labs/sui";
import React, { useEffect } from "react";

import {
Expand Down Expand Up @@ -116,7 +117,11 @@ export const UniversalSignInContextProvider: React.FC<
"eip155:7000",
],

walletConnectors: [EthereumWalletConnectors, SolanaWalletConnectors],
walletConnectors: [
EthereumWalletConnectors,
SolanaWalletConnectors,
SuiWalletConnectors,
],
};

return (
Expand Down
1 change: 1 addition & 0 deletions src/sui.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { getSuiWallet, getSuiWalletClient } from "./lib/suiClient";
Loading
Loading