The @dynamic-labs/solana-extension integrates your application with the @solana/web3.js library, providing a Connection and Signer to interact with the Solana blockchain.

Installation

To install the Solana extension, run the following command:

npm install @dynamic-labs/solana-extension@alpha

Setup

Incorporate the Solana extension into your client using the extend method to add getSigner and getConnection methods:

import { createClient } from '@dynamic-labs/client'
import { SolanaExtension } from '@dynamic-labs/solana-extension'

/**
 * Creates and extends the client with Solana blockchain functionality.
 */
export const dynamicClient = createClient({
  environmentId: 'YOUR-ENVIRONMENT-ID',
}).extend(SolanaExtension())

Polyfils

Your React Native project might require polyfills for certain global objects. Install the necessary polyfills and set them up as follows

Installation

npm install text-encoding react-native-get-random-values buffer

Include the following code in your project’s entry point to set up the polyfills:

import { Buffer } from 'buffer'
import 'react-native-get-random-values'

global.TextEncoder = require('text-encoding').TextEncoder
global.Buffer = Buffer

Usage

After setup, you can interact with the Solana blockchain. Below is an example of a component that sends 1 SOL to a specified wallet address:

import { Button } from 'react-native'
import { FC } from 'react'
import { dynamicClient } from '<path to client file>'

import {
  LAMPORTS_PER_SOL,
  PublicKey,
  SystemProgram,
  TransactionMessage,
  VersionedTransaction,
} from '@solana/web3.js'

interface Send1SolButtonProps {
  destinationAddress: string
}

/**
 * Renders a button that sends 1 SOL to a given address.
 */
const Send1SolButton: FC<Send1SolButtonProps> = ({ destinationAddress }) => {
  const send = async () => {
    const wallet = dynamicClient.wallets.primary

    if (!wallet) return

    const connection = dynamicClient.solana.getConnection({
      commitment: 'singleGossip',
    })
    const signer = dynamicClient.solana.getSigner({ wallet })

    const { blockhash } = await connection.getLatestBlockhash()
    const amountInLamports = 1 * LAMPORTS_PER_SOL
    const fromKey = new PublicKey(wallet.address)
    const toKey = new PublicKey(destinationAddress)

    const instructions = [
      SystemProgram.transfer({
        fromPubkey: fromKey,
        lamports: amountInLamports,
        toPubkey: toKey,
      }),
    ]

    const messageV0 = new TransactionMessage({
      instructions,
      payerKey: fromKey,
      recentBlockhash: blockhash,
    }).compileToV0Message()

    const transaction = new VersionedTransaction(messageV0)
    const { signature } = await signer.signAndSendTransaction(transaction)

    console.log('Successful transaction signature:', signature)
  }

  return <Button title="Send" onPress={send} />
}