Skip to main content

Overview

The CDP SDK provides support for managing Solana accounts on the Solana blockchain. This includes creating, retrieving, updating, and listing Solana accounts.

Account Types

The SDK includes generated types for Solana accounts:
use cdp_sdk::types::{
    SolanaAccount,
    EndUserSolanaAccount,
};

Creating Solana Accounts

Create a Server-Managed Account

Create a new Solana account:
use cdp_sdk::{types, Client};

let response = client
    .add_end_user_solana_account()
    .user_id("user-123".parse()?)
    .x_wallet_auth("") // Automatically set by middleware
    .x_idempotency_key("unique-request-id")
    .send()
    .await?;

let account = response.into_inner().solana_account;
println!("Account address: {}", account.address);

Create Request Parameters

user_id
String
required
User identifier (alphanumeric with hyphens, 1-100 characters). Pattern: ^[a-zA-Z0-9-]{1,100}$
x_idempotency_key
String
required
Unique key to ensure idempotent request handling (1-128 characters)
x_wallet_auth
String
required
Wallet authentication JWT (automatically added by WalletAuth middleware)

Retrieving Solana Accounts

Get Account by Address

Retrieve a specific Solana account using its address:
let response = client
    .get_solana_account()
    .address("5KQq...base58address")
    .send()
    .await?;

let account = response.into_inner();
println!("Account: {:?}", account);
address
String
required
The Solana account address (base58-encoded public key)

Get Account by Name

Retrieve a Solana account by its assigned name:
let response = client
    .get_solana_account_by_name()
    .name("my-solana-account")
    .send()
    .await?;

let account = response.into_inner();
name
String
required
The name assigned to the account

Updating Solana Accounts

Update properties of an existing Solana account:
use cdp_sdk::types;

let update_body = types::UpdateSolanaAccountBody::builder()
    .name(Some("updated-solana-account".parse()?));

let response = client
    .update_solana_account()
    .address("5KQq...base58address")
    .body(update_body)
    .send()
    .await?;

let updated_account = response.into_inner();
println!("Updated: {:?}", updated_account);

Update Parameters

address
String
required
The Solana account address to update
name
Option<String>
New name for the account

Listing Solana Accounts

List all Solana accounts with pagination:
let response = client
    .list_solana_accounts()
    .page_size(10)
    .send()
    .await?;

let accounts_list = response.into_inner();
println!("Found {} accounts", accounts_list.accounts.len());

for account in accounts_list.accounts {
    println!("  - {}", account.address);
}

// Handle pagination
if let Some(next_token) = accounts_list.next_page_token {
    let next_response = client
        .list_solana_accounts()
        .page_size(10)
        .page_token(next_token)
        .send()
        .await?;
}

List Parameters

page_size
Option<i32>
Number of accounts to return per page (default: 50)
page_token
Option<String>
Token for retrieving the next page of results

Response Types

EndUserSolanaAccount

Solana account responses include:
address
String
The Solana account address (base58-encoded)
user_id
String
The user ID associated with this account
created_at
DateTime
Timestamp when the account was created
updated_at
DateTime
Timestamp when the account was last updated

End User Operations

When working with end user Solana accounts, use the user_id parameter:
// Create account for specific user
let response = client
    .add_end_user_solana_account()
    .user_id("user-123".parse()?)
    .x_wallet_auth("")
    .x_idempotency_key("request-id-456")
    .send()
    .await?;

let account = response.into_inner().solana_account;
println!("Created for user: {}", account.user_id);

Error Handling

Always handle potential errors when working with Solana accounts:
match client.add_end_user_solana_account()
    .user_id("user-123".parse()?)
    .x_wallet_auth("")
    .x_idempotency_key("request-id")
    .send()
    .await 
{
    Ok(response) => {
        let account = response.into_inner().solana_account;
        println!("Success: {}", account.address);
    }
    Err(e) => {
        eprintln!("Failed to create Solana account: {}", e);
    }
}

Best Practices

Idempotency Keys

Always use unique idempotency keys to prevent duplicate account creation:
use uuid::Uuid;

let idempotency_key = Uuid::new_v4().to_string();

let response = client
    .add_end_user_solana_account()
    .user_id("user-123".parse()?)
    .x_wallet_auth("")
    .x_idempotency_key(&idempotency_key)
    .send()
    .await?;

User ID Validation

Ensure user IDs match the required pattern:
// Valid user IDs: alphanumeric with hyphens, 1-100 chars
let valid_ids = vec![
    "user-123",
    "test-user-456",
    "abc123",
];

for user_id in valid_ids {
    match user_id.parse::<AddEndUserSolanaAccountUserId>() {
        Ok(id) => println!("Valid: {}", id),
        Err(e) => eprintln!("Invalid: {}", e),
    }
}

See Also

Build docs developers (and LLMs) love