Solana

Solana

#Installation

To get started, install the following dependencies for your project:

NPM
Yarn
01npm install @magic-ext/solana @solana/web3.js magic-sdk

#Initialization

The Magic class is the entry-point to the Magic SDK. It must be instantiated with a Magic publishable key.

#ES Modules/TypeScript

Typescript
01import { Magic } from 'magic-sdk';
02import { SolanaExtension } from '@magic-ext/solana';
03
04const magic = new Magic('YOUR_API_KEY', {
05  extensions: [
06    new SolanaExtension({
07      rpcUrl: 'SOLANA_RPC_NODE_URL',
08    }),
09  ],
10});

#CDN

Javascript
01<script src="https://auth.magic.link/sdk"></script>
02<script type="text/javascript" src="https://auth.magic.link/sdk/extension/solana"></script>
03
04<script>
05  const magic = new window.Magic("YOUR_API_KEY", {
06      extensions: [
07        new SolanaExtension({
08          rpcUrl: 'SOLANA_RPC_NODE_URL'
09        })
10      ]
11  });
12</script>

#Common Methods

Note that the Magic Solana extension follows the method names and conventions by Solana's Javascript SDK.

#Sign and Send Transaction

#ES Modules/TypeScript

To sign a standard Solana blockchain transaction, call the magic.solana.signTransaction method. Note that you must sign with the Magic SDK method but send the transaction using the @solana/web3.js method connection.sendRawTransaction.

Typescript
01import {  
02  clusterApiUrl,
03  Keypair,  
04  LAMPORTS_PER_SOL,  
05  PublicKey,  
06  SystemProgram,  
07  Transaction,
08} from "@solana/web3.js"
09
10// Ensure you have Magic initialized with the Solana extension
11// Ensure that user is already authenticated
12
13const connection = new Connection(clusterApiUrl("devnet"))
14
15const metadata = await magic.user.getMetadata();
16const userPublicKey = new web3.PublicKey(metadata.publicAddress);
17const recipientPubkey = Keypair.generate().publicKey      
18
19const blockhash = await connection?.getLatestBlockhash()
20if (!blockhash) return      
21
22const transaction = new Transaction({        
23  ...blockhash,        
24  feePayer: userPublicKey,     
25})      
26
27const transferIx = SystemProgram.transfer({        
28  fromPubkey: userPublicKey,        
29  toPubkey: recipientPubkey,        
30  lamports: 0.01 * LAMPORTS_PER_SOL,      
31})      
32
33transaction.add(transferIx)      
34
35const signedTransaction = await magic?.solana.signTransaction(        
36  transaction,        
37  {        
38    requireAllSignatures: false,        
39    verifySignatures: true,      
40  }     
41)      
42
43const signature = await connection?.sendRawTransaction(        
44  Buffer.from(signedTransaction?.rawTransaction as string, "base64")      
45)
46
47console.log(signature);

#Sign Message

#ES Modules/TypeScript

Typescript
01// Ensure you have Magic initialized with the Solana extension
02// Ensure that user is already authenticated
03
04const signedMessage = await magic?.solana.signMessage("Hello World")      console.log(signedMessage)

#Resources