How to Integrate with the Solana Blockchain with Magic
How to Integrate with the Solana Blockchain with Magic
#Installation
Magic interacts with the Solana blockchain via Magic's extension NPM package @magic-ext/solana
. The Solana extension also lets you interact with the blockchain using methods from Solana's Javascript SDK.
You can skip straight to our kitchen sink example directly:
#NPM
01npm install --save @magic-ext/solana
#Yarn
01yarn add @magic-ext/solana
#Initializing Extension
#ES Modules/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
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>
#Sign Transaction
Note that the Magic Solana extension follows the method names and conventions by Solana's Javascript SDK. To sign a standard Solana blockchain transaction, you can call the magic.solana.signTransaction
method.
#ES Modules/TypeScript
01import { Magic } from 'magic-sdk';
02import { SolanaExtension } from '@magic-ext/solana';
03
04import * as web3 from '@solana/web3.js';
05
06const rpcUrl = 'SOLANA_RPC_NODE_URL'
07
08const magic = new Magic('YOUR_API_KEY', {
09 extensions: [
10 new SolanaExtension({
11 rpcUrl
12 }),
13 ],
14});
15
16const metadata = await magic.user.getMetadata();
17const recipientPubKey = new web3.PublicKey(destinationAddress);
18const payer = new web3.PublicKey(metadata.publicAddress);
19const connection = new web3.Connection(rpcUrl);
20
21const hash = await connection.getRecentBlockhash();
22
23
24let transactionMagic = new web3.Transaction({
25 feePayer: payer,
26 recentBlockhash: hash.blockhash
27});
28
29const transaction = web3.SystemProgram.transfer({
30 fromPubkey: payer,
31 toPubkey: recipientPubKey,
32 lamports: sendAmount,
33});
34
35transactionMagic.add(...([transaction]));
36
37const serializeConfig = {
38 requireAllSignatures: false,
39 verifySignatures: true
40};
41
42const signedTransaction = await magic.solana.signTransaction(transactionMagic, serializeConfig);
43
44 console.log("Signed transaction", signedTransaction);
#Send Transaction
#ES Modules/TypeScript
01import { Magic } from 'magic-sdk';
02import { SolanaExtension } from '@magic-ext/solana';
03
04import * as web3 from '@solana/web3.js';
05
06const magic = new Magic('YOUR_API_KEY', {
07 extensions: [
08 new SolanaExtension({
09 rpcUrl: 'SOLANA_RPC_NODE_URL',
10 }),
11 ],
12});
13
14const connection = new web3.Connection(rpcUrl);
15// `signedTransaction` comes from `magic.solana.signTransaction` above
16const tx = web3.Transaction.from(signedTransaction.rawTransaction);
17const signature = await connection.sendRawTransaction(tx.serialize());
18
19
20console.log(signature);