Deploying and Interacting with Solana Tokens

The Fireblocks SDK allows you to issue and manage Solana Token 2022 mints through the /v1/tokenization/tokens endpoint. This guide explains how to deploy a new Solana token and interact with it (minting, or other IDL-based instructions).

📘

Note:

Tokenization on Solana currently supports only** Token 2022 **with extensions. Custom templates are only supported on EVM chains. For non-SPL or Token2022 program interactions, see: Interact with Solana Programs.

Overview

Unlike EVM-based networks, Solana token issuance does not require uploading a contract template. The Fireblocks SDK automates deploying the Token 2022 program and creating your token with the parameters you specify.

Prerequisites

❗️

Warning

The vault must hold enough SOL to cover transaction fees and rent-exempt balances.

📘

Note:

The vault used to issue the token receives the authorities for all Token 2022 extensions.

Step 1: Initialize the Fireblocks SDK

Install:

  • npm install @fireblocks/ts-sdk

or:

  • yarn add @fireblocks/ts-sdk

Initialize:

import { Fireblocks, BasePath } from '@fireblocks/ts-sdk';

const fireblocksSdk = new Fireblocks({
  apiKey: 'YOUR_API_KEY',
  secretKey: 'YOUR_PRIVATE_KEY',
  basePath: BasePath.US, // Use BasePath.EU if applicable
});

Step 2: Issue a New Solana Token

const deployResponse = await fireblocksSdk.tokenization.issueNewToken({
  createTokenRequestDto: {
    vaultAccountId: '0', // Vault account ID that will manage the token
    createParams: {
      name: 'My Solana Token',
      symbol: 'MST',
      decimals: 9, // Solana tokens typically use 9 decimals
    },
    assetId: 'SOL_TEST', // or 'SOL' for Mainnet
  },
});

console.log('Token deployment initiated:', deployResponse);

You’ll receive a TokenLinkDto that references your deployed token. Monitor its status (PENDINGCOMPLETED or FAILED) via the token link endpoint.

📘

Note:

The deploying vault receives the mint and extension authorities (transferable later via setAuthority).

Step 3: Interact with the Token (Minting Example)

3.1 Fetch the Token’s IDL

const tokenLink = await fireblocksSdk.tokenization.getLinkedToken({
  id: deployResponse.id,
});

const idl = await fireblocksSdk.contractInteractions.getDeployedContractAbi({
  contractAddress: tokenLink.tokenMetadata.contractAddress,
  baseAssetId: 'SOL_TEST',
});

3.2 Create a Mint Instruction

const mintToCheckedInstruction = idl.data.abi.find(
  (func) => func.name === 'mintToChecked'
);

// Example instruction (populate addresses/values as needed):
const mintInstruction = {
  name: 'mintToChecked',
  accounts: [
    { name: 'mint', writable: true, address: 'MINT_ADDRESS' },
    { name: 'token', writable: true, address: 'RECIPIENT_TOKEN_ACCOUNT_ADDRESS' },
    { name: 'mintAuthority', signer: true, address: 'YOUR_MINT_AUTHORITY_ADDRESS' },
  ],
  args: [
    { name: 'amount', type: 'u64', value: '1000000000' },
    { name: 'decimals', type: 'u8', value: 9 },
  ],
};

📘

Note:

Some IDL fields may be pre-populated (e.g., decimals, mint). If the recipient lacks a token account for this mint, Fireblocks can create one when you pass the base asset wallet address.

3.3 Execute the Mint Transaction

const mintResponse = await fireblocksSdk.contractInteractions.writeCallFunction({
  contractAddress: tokenLink.tokenMetadata.contractAddress,
  baseAssetId: 'SOL_TEST',
  writeCallFunctionDto: {
    vaultAccountId: '0',
    abiFunction: mintInstruction,
  },
});

console.log('Minting tokens initiated:', mintResponse);

You’ll get a Fireblocks Transaction ID to poll for status.

Supported Token-2022 Extensions

  • Metadata – Attach and update metadata
  • Transfer hook – Execute custom logic per transfer
  • Metadata pointer – Reference external metadata sources
  • Interest bearing – Accrue interest over time
  • Default account state – Set default token account state
  • Mint close authority – Securely close the mint account
  • Transfer fee config – Apply dynamic transfer fees
  • Permanent delegate – Assign a permanent delegate
📘

Note:

The issuing vault initially holds authority over all extensions.

Limitations

  • The deploying vault receives all extension authorities; transfer with setAuthority if needed.
  • Tokenization does not support custom data types or string encoding in IDL; such instructions won’t appear.
  • For custom types/strings, serialize the program data and submit via the Transactions API.

Reference Models

TokenLinkDto (high-level)

  • id – Fireblocks-generated token link ID
  • statusPENDING | COMPLETED | FAILED
  • displayName – Human-readable name
  • tokenMetadata – Details like mint/ABI/IDL info

Further Reading