solana_sdk 0.1.0 copy "solana_sdk: ^0.1.0" to clipboard
solana_sdk: ^0.1.0 copied to clipboard

A pure Dart Solana client library for keys, transactions, programs, and JSON-RPC/WebSocket access.

solana_sdk #

pub package

δΈ­ζ–‡

A pure Dart Solana client library for keys, transactions, programs, and JSON-RPC/WebSocket access.

solana_sdk is a Dart package for building Solana applications without a Flutter SDK dependency. It can be used from Dart CLI tools, servers, and Flutter apps.

Features #

  • Public keys, keypairs, signing, signature verification, and Solana BIP-44 / SLIP-0010 Ed25519 key derivation from seed bytes.
  • Base58 helpers and encoded transaction helpers.
  • Program Derived Address (PDA) helpers.
  • Legacy, v0, and SIMD-0385 v1 message compilation.
  • Legacy and versioned transaction signing, serialization, deserialization, and base64/base58 encoding.
  • Message and versioned transaction structural validation with Solana-style sanitize() helpers.
  • Per-signature verification helpers, message hashing, and durable nonce account detection for versioned transactions.
  • System Program, Token Program, Associated Token Program, Memo Program, Compute Budget Program, Address Lookup Table Program, Stake Program, Vote Program, Ed25519 Program, and Secp256k1 Program instruction builders.
  • Address lookup table account and token account state deserialization.
  • HTTP JSON-RPC client for common Solana RPC methods.
  • WebSocket subscriptions for account, program, logs, signature, slot, slot update, and root notifications.

Requirements #

  • Dart SDK >=3.2.0 <4.0.0
  • No Flutter dependency is required.

Installation #

dart pub add solana_sdk

For a Flutter app:

flutter pub add solana_sdk

Import #

import 'package:solana_sdk/solana_sdk.dart';

Public Keys And Keypairs #

import 'dart:typed_data';

import 'package:solana_sdk/solana_sdk.dart';

void main() {
  final publicKey =
  PublicKey.fromBase58('8qbHbw2BbbTHBW1sbeqakYXVKRQM8Ne7pLK7m6CVfeR');
  final sameKey = PublicKey.fromBytes(publicKey.toBytes());

  final randomKeypair = Keypair.generate();
  final deterministicKeypair = Keypair.fromSeed(
    Uint8List.fromList(List<int>.filled(32, 1)),
  );
  final walletKeypair = Keypair.fromSeedAndDerivationPath(
    Uint8List.fromList(List<int>.filled(64, 1)),
    DerivationPath.bip44(account: 0, change: 0),
  );

  print(publicKey == sameKey);
  print(randomKeypair.publicKey);
  print(deterministicKeypair.publicKey);
  print(walletKeypair.publicKey);
}

DerivationPath.bip44() represents the official Solana base path m/44'/501'. Pass account and change for wallet-style paths such as m/44'/501'/0'/0'. This package derives keys from seed bytes; mnemonic phrase generation and validation should be handled by a dedicated BIP-39 layer.

Build And Sign A Legacy Transaction #

import 'dart:convert';
import 'dart:typed_data';

import 'package:solana_sdk/solana_sdk.dart';

void main() {
  final payer = Keypair.fromSeed(
    Uint8List.fromList(List<int>.filled(32, 1)),
  );
  final recipient =
  PublicKey.fromBase58('8qbHbw2BbbTHBW1sbeqakYXVKRQM8Ne7pLK7m6CVfeR');

  final transaction = Transaction()
    ..feePayer = payer.publicKey
    ..recentBlockhash = 'CktRuQ2mttgRGkXJtyksdKHjUdc2C4TgDzyB98oEzy8'
    ..add(SystemProgram.transfer(
      fromPubkey: payer.publicKey,
      toPubkey: recipient,
      lamports: BigInt.from(1000),
    ));

  transaction.sign([payer]);

  final rawBytes = transaction.serialize();
  final base64Transaction = base64Encode(rawBytes);
  final base58Transaction = base58Encode(rawBytes);

  print(base64Transaction);
  print(base58Transaction);
}

Build A Versioned Transaction #

import 'dart:typed_data';

import 'package:solana_sdk/solana_sdk.dart';

void main() {
  final payer = Keypair.fromSeed(
    Uint8List.fromList(List<int>.filled(32, 1)),
  );
  final recipient =
  PublicKey.fromBase58('8qbHbw2BbbTHBW1sbeqakYXVKRQM8Ne7pLK7m6CVfeR');

  final message = MessageV0.compile(
    payerKey: payer.publicKey,
    recentBlockhash: 'CktRuQ2mttgRGkXJtyksdKHjUdc2C4TgDzyB98oEzy8',
    instructions: [
      SystemProgram.transfer(
        fromPubkey: payer.publicKey,
        toPubkey: recipient,
        lamports: BigInt.from(1000),
      ),
    ],
    addressLookupTableAccounts: const [],
  );

  final transaction = VersionedTransaction.v0(message: message)
    ..sign([payer]);

  final encoded = transaction.serializeEncoded();
  final decoded = VersionedTransaction.deserializeEncoded(encoded);

  print(decoded.version);
}

serializeEncoded() and deserializeEncoded() default to base64. Pass TransactionEncoding.base58 to use base58.

Use MessageV1.compile() and VersionedTransaction.v1() for v1 transactions. TransactionConfig exposes inline priority fee, compute unit limit, loaded accounts data size limit, and heap size fields following the official v1 message layout.

Priority Fee Instructions #

import 'package:solana_sdk/solana_sdk.dart';

void main() {
  final transaction = Transaction()
    ..add(ComputeBudgetProgram.setComputeUnitLimit(units: 1400000))..add(ComputeBudgetProgram.setComputeUnitPrice(
      microLamports: BigInt.from(5000),
    ));

  print(transaction.instructions.length);
}

Send Transactions Over RPC #

Connection.sendTransaction fetches a recent blockhash, sets the fee payer when needed, signs the transaction, serializes it, and sends it with base64 encoding. The payer must have enough SOL on the selected cluster.

import 'package:solana_sdk/solana_sdk.dart';

Future<void> main() async {
  final connection = Connection(clusterApiUrl(Cluster.devnet));

  try {
    final payer = Keypair.generate();
    final recipient =
    PublicKey.fromBase58('8qbHbw2BbbTHBW1sbeqakYXVKRQM8Ne7pLK7m6CVfeR');

    final transaction = Transaction()
      ..add(SystemProgram.transfer(
        fromPubkey: payer.publicKey,
        toPubkey: recipient,
        lamports: BigInt.from(1000),
      ));

    final signature = await connection.sendTransaction(
      transaction,
      [payer],
      options: SendOptions(preflightCommitment: Commitment.confirmed),
    );

    print(signature);
  } finally {
    await connection.close();
  }
}

For confirmation polling, use sendAndConfirmTransaction, sendAndConfirmVersionedTransaction, or confirmSignature.

Read RPC Data #

import 'package:solana_sdk/solana_sdk.dart';

Future<void> main() async {
  final connection = Connection(clusterApiUrl(Cluster.mainnetBeta));

  try {
    final address =
    PublicKey.fromBase58('11111111111111111111111111111111');
    final balance = await connection.getBalance(address);
    final latestBlockhash = await connection.getLatestBlockhash();

    print(balance);
    print(latestBlockhash.blockhash);
  } finally {
    await connection.close();
  }
}

WebSocket Subscriptions #

import 'package:solana_sdk/solana_sdk.dart';

Future<void> main() async {
  final connection = Connection(clusterApiUrl(Cluster.devnet));

  try {
    final listenerId = await connection.onLogs(
      const LogsFilter.all(),
          (logs, context) {
        print(logs);
        print(context);
      },
      commitment: Commitment.confirmed,
    );

    await connection.removeOnLogsListener(listenerId);
  } finally {
    await connection.close();
  }
}

Safety Notes #

  • Keep private keys and seed material out of source control.
  • Review and test transactions before submitting them to mainnet.
  • This library is intended as application infrastructure, not as financial advice or a security audit.

License #

MIT. See LICENSE.

2
likes
140
points
79
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A pure Dart Solana client library for keys, transactions, programs, and JSON-RPC/WebSocket access.

Repository (GitHub)
View/report issues

Topics

#solana #blockchain #web3 #rpc #crypto

License

MIT (license)

Dependencies

base_x, crypto, ed25519_edwards, es_compression, http, secp256k1_ecdsa, web_socket_channel

More

Packages that depend on solana_sdk