Creating an NFT Marketplace in Solana using Rust: A Step-by-Step Guide with Code Examples

Non-fungible tokens (NFTs) have gained a lot of popularity in recent years due to their unique and secure nature. NFTs are digital assets that are verified on a blockchain network, making them resistant to fraud. Solana is a fast and scalable blockchain network that has gained popularity for its low transaction fees and high throughput. In this article, we will explore how to create an NFT marketplace in Solana using Rust programming language, Solana’s Serum DEX, and the Solana web3.js library.
Prerequisites
Before we begin, there are a few prerequisites that need to be met in order to create an NFT marketplace in Solana using Rust. These include:
- Familiarity with Rust programming language
- An understanding of the Solana blockchain network
- Basic knowledge of React and web development
If you are unfamiliar with any of these topics, it is recommended that you first familiarize yourself with them before proceeding.
Creating the Smart Contract
The first step in creating an NFT marketplace in Solana using Rust is to create a smart contract that will handle the creation, buying, and selling of NFTs. The smart contract will be deployed on the Solana network, and will be responsible for creating and managing the NFTs.
Here is an example Rust smart contract that can be used to create an NFT:
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint,
entrypoint::ProgramResult,
msg,
program_error::ProgramError,
pubkey::Pubkey,
};
entrypoint!(process_instruction);
fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
msg!("NFT Marketplace");
Ok(())
}In this example, we are using the Solana Program Library (SPL) to create the smart contract. The process_instruction function takes three parameters: the program ID, the accounts involved in the transaction, and the instruction data. The msg! macro is used to print a message to the console.
Creating the NFT
The next step is to create the NFT. To create the NFT, we will use the Solana web3.js library to interact with the smart contract. Here is an example of how to create the NFT:
import { Keypair, Connection, Transaction, TransactionInstruction } from "@solana/web3.js";
import { TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from "@solana/spl-token";
import { TOKENS, PAYER, MINT, VAULT, RECEIVER } from "./config";
import { Token, TOKEN_PROGRAM } from "@solana/spl-token";
const connection = new Connection("https://api.devnet.solana.com");
const payer = Keypair.fromSecretKey(new Uint8Array(PAYER));
const mint = new PublicKey(MINT);
const vault = new PublicKey(VAULT);
const receiver = new PublicKey(RECEIVER);
const token = new Token(connection, mint, TOKEN_PROGRAM_ID, payer);
const createNFT = async (name, symbol) => {
const nft = await token.createAssociatedTokenAccount(receiver);
console.log(`NFT Account: ${nft}`);
const tx = new Transaction();
tx.add(
Token.createMintToInstruction(
TOKEN_PROGRAM_ID,
mint,
nft,
payer.publicKey,
[],
1
)
);
tx.feePayer = payer.publicKey;
await connection.sendTransaction(tx, [payer]);
console.log(`NFT Created: ${nft.toBase58()}`);
};In this example, we are importing the necessary libraries, setting up our connection to the Solana network, and defining the keypair of the payer, the mint, the vault, the receiver, and the token. We are also defining a function called createNFT that takes in the name and symbol of the NFT and creates an associated token account.
The createNFT function first creates an associated token account using the createAssociatedTokenAccount method. This method takes in the public key of the recipient of the NFT and returns the public key of the associated token account.
Next, the function creates a new transaction and adds the Token.createMintToInstruction instruction to mint one NFT token to the associated token account. This instruction takes in the token program ID, the mint public key, the associated token account public key, the payer public key, an empty array for the authority, and the number of tokens to mint.
Finally, the transaction is sent to the Solana network using the connection.sendTransaction method, with the payer keypair as the signer. This will mint one NFT token and add it to the associated token account.
Creating the NFT Marketplace
Now that we have created the NFT, the next step is to create the NFT marketplace. To create the marketplace, we will use Solana’s Serum decentralized exchange (DEX) to handle the buying and selling of the NFTs.
Here is an example of how to create the NFT marketplace:
import { Connection, PublicKey } from "@solana/web3.js";
import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
import { Market } from "@project-serum/serum";
import { TOKENS, MARKET, PAYER } from "./config";
const connection = new Connection("https://api.devnet.solana.com");
const market = await Market.load(connection, new PublicKey(MARKET), {}, new PublicKey(PAYER));
const tokenA = new PublicKey(TOKENS.A);
const tokenB = new PublicKey(TOKENS.B);
const placeBid = async (price, size) => {
const orderbook = await market.loadOrderbook(connection);
const bid = await market.makeBid(connection, price, size, orderbook, tokenA, tokenB);
console.log(`Bid placed: ${bid}`);
};
const placeAsk = async (price, size) => {
const orderbook = await market.loadOrderbook(connection);
const ask = await market.makeAsk(connection, price, size, orderbook, tokenA, tokenB);
console.log(`Ask placed: ${ask}`);
};In this example, we are importing the necessary libraries, setting up our connection to the Solana network, and defining the market, tokenA, and tokenB. We are also defining two functions: placeBid and placeAsk.
The placeBid function takes in the price and size of the bid, loads the orderbook using market.loadOrderbook, and makes a bid using the market.makeBid method. This method takes in the connection, the price, the size, the orderbook, the tokenA public key, and the tokenB public key.
The placeAsk function works in a similar way but instead makes an ask using the market.makeAsk method.
Integrating the Smart Contract and Marketplace
Now that we have created the smart contract and the marketplace, the final step is to integrate them. To integrate the smart contract and the marketplace, we will use the Solana web3.js library to interact with the smart contract and the Serum DEX.
Here is an example of how to integrate the smart contract and the marketplace:
import { Keypair }
const { Connection, PublicKey } = require("@solana/web3.js");
const { TOKEN_PROGRAM_ID } = require("@solana/spl-token");
const { Market } = require("@project-serum/serum");
const { TOKENS, MARKET, PAYER } = require("./config");
const connection = new Connection("https://api.devnet.solana.com");
const market = await Market.load(connection, new PublicKey(MARKET), {}, new PublicKey(PAYER));
const tokenA = new PublicKey(TOKENS.A);
const tokenB = new PublicKey(TOKENS.B);
const payer = Keypair.generate();
const mint = await createMint(payer, "MyNFT", "MNFT");
const createNFT = async (name, symbol) => {
const associatedTokenAccount = await createAssociatedTokenAccount(mint.publicKey, payer.publicKey);
const tx = new Transaction();
tx.add(Token.createMintToInstruction(TOKEN_PROGRAM_ID, mint.publicKey, associatedTokenAccount, payer.publicKey, [], 1));
await connection.sendTransaction(tx, [payer]);
return associatedTokenAccount;
};
const placeBid = async (nftAccount, price, size) => {
const orderbook = await market.loadOrderbook(connection);
const bid = await market.makeBid(connection, price, size, orderbook, mint.publicKey, nftAccount);
console.log(Bid placed: ${bid});
};
const placeAsk = async (nftAccount, price, size) => {
const orderbook = await market.loadOrderbook(connection);
const ask = await market.makeAsk(connection, price, size, orderbook, mint.publicKey, nftAccount);
console.log(Ask placed: ${ask});
};
const createAssociatedTokenAccount = async (mintPublicKey, ownerPublicKey) => {
const associatedTokenAccount = await Token.getAssociatedTokenAddress(
ASSOCIATED_TOKEN_PROGRAM_ID,
TOKEN_PROGRAM_ID,
mintPublicKey,
ownerPublicKey,
);
const instructions = await Token.createAssociatedTokenAccountInstruction(
ASSOCIATED_TOKEN_PROGRAM_ID,
TOKEN_PROGRAM_ID,
mintPublicKey,
associatedTokenAccount,
ownerPublicKey,
ownerPublicKey,
);
await sendTransaction(connection, instructions, [ownerPrivateKey]);
return associatedTokenAccount;
};
const createMint = async (payer, name, symbol) => {
const mint = new Keypair();
const instructions = await Token.createMintToInstruction(
TOKEN_PROGRAM_ID,
mint.publicKey,
0,
payer.publicKey,
[],
0,
DECIMALS,
);
await sendTransaction(connection, instructions, [payer]);
return mint;
};
async function main() {
const nftAccount = await createNFT("MyNFT", "MNFT");
await placeBid(nftAccount, 10, 1);
await placeAsk(nftAccount, 20, 1);
}
main();In this example, we are first importing the necessary libraries, defining the connection, market, tokenA, tokenB, payer, and mint. We are also defining the `createNFT`, `placeBid`, and `placeAsk` functions, which are similar to the ones we defined earlier. The `createAssociatedTokenAccount` function is used to create an associated token account for the NFT. This function takes in the mint public key and owner public key and returns the associated token account public key. The `createMint` function is used to create the NFT mint. This function takes in the payer keypair, the name of the NFT, and the symbol of the NFT, and returns the mint public key. Finally, we have the main function, which calls the createNFT, placeBid, and placeAsk functions. These functions are used to create an NFT, place a bid on the NFT, and place an ask on the NFT, respectively.
Once you have saved the code in a file, let’s say marketplace.js, you can run it with Node.js by typing node marketplace.js in your terminal. This will execute the main function, which will create an NFT, place a bid on it, and place an ask on it.
Conclusion
In this article, we have gone over the basics of creating an NFT marketplace in Solana using Rust. We started by discussing what Solana is and why it is a good choice for an NFT marketplace. We then went over the basic concepts of NFTs and how they can be used in a marketplace.
We then dove into the technical details of creating an NFT marketplace using Rust. We discussed how to create an NFT token, how to mint the token, how to create a market, how to place a bid on the market, and how to place an ask on the market. We provided code examples and explanations for each step along the way.
We hope that this article has been helpful in giving you a basic understanding of how to create an NFT marketplace in Solana using Rust. With this knowledge, you can start experimenting and building your own NFT marketplace.
Learn more about Purple Dash: https://purpledash.dev
Discover more Web3, blockchain, and fintech-related content on our blog: https://purpledash.dev/blog/
For more updates follow Purple Dash on LinkedIn: https://www.linkedin.com/company/purple-dash/
Disclosure: This article was written with the assitance of AI technology. An AI tool (Chat GPT) was used to create an outline and generate content for portions of the article. A human writer has manually reviewed, edited, and contributed to the article content before publishing.






