Algorand
Algorand
#Installation
Magic interacts with the Algorand blockchain via Magic's extension NPM package @magic-ext/algorand
. The Algorand extension also lets you interact with the blockchain using methods from Algorand's Javascript SDK.
You can skip straight to our kitchen sink example directly:
01npm install --save @magic-ext/algorand
#Initialization
01import { Magic } from 'magic-sdk';
02import { AlgorandExtension } from '@magic-ext/algorand';
03
04const magic = new Magic('YOUR_API_KEY', {
05 extensions: {
06 algorand: new AlgorandExtension({
07 rpcUrl: '', // should remain empty
08 }),
09 },
10});
#Common Methods
#Get Test Algorand
Before you can send transaction on the Algorand blockchain, you'll need to acquire some test Algorand.
Go to our Algorand Example application
Login with your email address
Copy your Algorand public address
Go to the Algorand Faucet
Paste your copied Algorand public address in the text input
Now you can use your test Algorand in our example app
#Get Wallet
Use the getWallet
function to get the Algorand public address for the current user.
01import { Magic } from 'magic-sdk';
02import { AlgorandExtension } from '@magic-ext/algorand';
03
04const magic = new Magic('YOUR_API_KEY', {
05 extensions: {
06 algorand: new AlgorandExtension({
07 rpcUrl: '',
08 }),
09 },
10});
11
12// Get user's Algorand public address
13const publicAddress = await magic.algorand.getWallet();
14console.log('algorand public address', publicAddress);
#Sign Transaction
Note that the Magic Algorand extension follows the method names and conventions by Algorand's Javascript SDK. To sign a standard Algorand blockchain transaction, you can call the magic.algorand.signTransaction()
method.
01import { Magic } from 'magic-sdk';
02import { AlgorandExtension } from '@magic-ext/algorand';
03
04const magic = new Magic('YOUR_API_KEY', {
05 extensions: {
06 algorand: new AlgorandExtension({
07 rpcUrl: '',
08 }),
09 },
10});
11
12const sendPaymentTransaction = async () => {
13 // Construct Payload
14 let params = await algodClient.getTransactionParams().do();
15 let note = new TextEncoder().encode("Hello World");
16 let txn = algosdk.makePaymentTxnWithSuggestedParams(
17 from,
18 to,
19 amount,
20 closeRemainderTo,
21 note,
22 params
23 );
24 console.log("txn", txn);
25
26 // Sign Payload
27 let encodedTxn = algosdk.encodeObj(txn.get_obj_for_encoding());
28 const signedTxn = await magic.algorand.signTransaction(encodedTxn);
29 // Broadcast Tx
30 const hash = await algodClient.sendRawTransaction(signedTxn.blob).do();
31 console.log("hash", hash);
32 // Wait for confirmation
33 const receipt = await waitForConfirmation(algodClient, hash.txId, 4);
34 console.log("receipt", receipt);
35};
36
37const sendAssetConfigTransaction = async () => {
38 // Construct Payload
39 let params = await algodClient.getTransactionParams().do();
40 let txn = algosdk.makeAssetCreateTxnWithSuggestedParams(
41 from,
42 note,
43 totalSupply,
44 decimals,
45 defaultFrozen,
46 manager,
47 reserve,
48 freeze,
49 clawback,
50 unitName,
51 assetName,
52 assetURL,
53 assetMetadataHash
54 params
55 );
56 console.log("txn", txn);
57
58 // Sign Payload
59 let encodedTxn = algosdk.encodeObj(txn.get_obj_for_encoding());
60 const signedTxn = await magic.algorand.signTransaction(encodedTxn);
61 // Broadcast Tx
62 const hash = await algodClient.sendRawTransaction(signedTxn.blob).do();
63 console.log("hash", hash);
64 // Wait for confirmation
65 const receipt = await waitForConfirmation(algodClient, hash.txId, 4);
66 console.log("receipt", receipt);
67};
68
69const sendAssetTransferTransaction = async () => {
70 // Construct Payload
71 let params = await algosdk.getTransactionParams().do();
72 let txn = algosdk.makeAssetTransferTxnWithSuggestedParams(
73 from,
74 to,
75 closeRemainderTo,
76 revocationTarget,
77 amount,
78 note,
79 assetIndex, // can get from from acfg tx receipt
80 params
81 );
82
83 // Sign Payload
84 let encodedTxn = algosdk.encodeObj(txn.get_obj_for_encoding());
85 const signedTxn = await magic.algorand.signTransaction(encodedTxn);
86 // Broadcast Tx
87 const hash = await algosdk.sendRawTransaction(signedTxn.blob).do();
88 console.log("hash", hash);
89 // Wait for confirmation
90 const receipt = await waitForConfirmation(algosdk, hash.txId, 4);
91 console.log("receipt", receipt);
92};
#Sign Bid
Note that the Magic Algorand extension follows the method names and conventions by Algorand's Javascript SDK. To sign a standard Algorand blockchain Bid, you can call the magic.algorand.signBid()
method.
01import { Magic } from 'magic-sdk';
02import { AlgorandExtension } from '@magic-ext/algorand';
03
04const magic = new Magic('YOUR_API_KEY', {
05 extensions: {
06 algorand: new AlgorandExtension({
07 rpcUrl: '',
08 }),
09 },
10});
11
12const bid = {
13 bidderKey: 'IB3NJALXLDX5JLYCD4TMTMLVCKDRZNS4JONHMIWD6XM7DSKYR7MWHI6I7U',
14 auctionKey: '7ZUECA7HFLZTXENRV24SHLU4AVPUTMTTDUFUBNBD64C73F3UHRTHAIOF6Q',
15 bidAmount: 1000,
16 maxPrice: 10,
17 bidID: 2,
18 auctionID: 56,
19};
20
21const tx = await magic.algorand.signBid(bid);
22
23console.log('signed bid', tx);
#Sign Group Transaction
To sign a standard Algorand blockchain Group transaction with magic user, you can call the magic.algorand.signGroupTransaction()
method.
01import { Magic } from "magic-sdk";
02import { AlgorandExtension } from "@magic-ext/algorand";
03const algosdk = require('algosdk');
04
05const magic = new Magic('YOUR_API_KEY', {
06 extensions: {
07 algorand: new AlgorandExtension({
08 rpcUrl: ''
09 })
10 }
11});
12
13let client = null;
14async function setupClient() {
15 if( client == null){
16 const token = {
17 "x-api-key": "x api key"
18 };
19 const server = "algorand rpc url";
20 const port = '';
21 let algodClient = new algosdk.Algodv2(token, server, port);
22 client = algodClient;
23 } else {
24 return client;
25 }
26 return client;
27}
28
29
30let algodClient = await setupClient();
31
32let params = await algodClient.getTransactionParams().do();
33
34const txns = [{
35 from: 'magic user public address',
36 to: 'OFHW3Z3T2RML7J2S6KYGHPAMO6IQH76PE2HSCAIN5U5NBGXAIPBOY7DCHI',
37 amount: 1000000,
38 closeRemainderTo: undefined,
39 note: undefined,
40 suggestedParams: params,
41},
42 {
43 from: 'magic user public address',
44 to: 'XRKQBEV7FINQ66SYAFY33UYHOC4GRAICWI3V6V2TXLCQMPJBGGRHLG2E74',
45 amount: 1000000,
46 closeRemainderTo: undefined,
47 note: undefined,
48 suggestedParams: params,
49 }
50]
51
52const signedTX = await magic.algorand.signGroupTransaction(txns);
53
54console.log("signedTX", signedTX);
#Sign Group Transaction V2
To sign a standard Algorand blockchain Group transaction with magic user, you can call the magic.algorand.signGroupTransactionV2()
method.
01import { Magic } from "magic-sdk";
02import { AlgorandExtension } from "@magic-ext/algorand";
03const algosdk = require('algosdk');
04
05const magic = new Magic('YOUR_API_KEY', {
06 extensions: {
07 algorand: new AlgorandExtension({
08 rpcUrl: 'algorand rpc url'
09 })
10 }
11});
12
13
14 let algodClient = await setupClient();
15
16 let suggestedParams = await algodClient.getTransactionParams().do();
17
18 const txn1 = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
19 from: publicAddress,
20 to: 'OFHW3Z3T2RML7J2S6KYGHPAMO6IQH76PE2HSCAIN5U5NBGXAIPBOY7DCHI',
21 amount: 1000,
22 suggestedParams,
23 });
24
25 const txn2 = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
26 from: publicAddress,
27 to: 'XRKQBEV7FINQ66SYAFY33UYHOC4GRAICWI3V6V2TXLCQMPJBGGRHLG2E74',
28 amount: 2000,
29 suggestedParams,
30 });
31
32 const txs = [txn1, txn2];
33 algosdk.assignGroupID(txs);
34
35 const txn1B64 = Buffer.from(txn1.toByte()).toString('base64');
36 const txn2B64 = Buffer.from(txn2.toByte()).toString('base64');
37
38 const txn = [
39 {txn: txn1B64},
40 {txn: txn2B64},
41 ];
42
43 const signedTX = await magic.algorand.signGroupTransactionV2(txn);
44
45 console.log('sign group transaction v2', signedTX);