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 identifier (alphanumeric with hyphens, 1-100 characters). Pattern: ^[a-zA-Z0-9-]{1,100}$
Unique key to ensure idempotent request handling (1-128 characters)
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);
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();
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
The Solana account address to update
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
Number of accounts to return per page (default: 50)
Token for retrieving the next page of results
Response Types
EndUserSolanaAccount
Solana account responses include:
The Solana account address (base58-encoded)
The user ID associated with this account
Timestamp when the account was created
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