Skip to main content

Type-safe Solana RPC http/websocket API with a focus on Helius and built on Pydantic models.

Project description

SolSystem

Friendly Solana RPC API client supporting both Http and Websockets.

Includes some endpoints specific only to Helius and the Metaplex DAAS API for retrieving asset data.

Why + Plans

After trying the official solana python + solders packages I was left feeling like they were an afterthought of development and weren't supported too well. The API wasn't to my liking, so I decided to develop something more pythonic and cleaner.

As I work on solana projects I plan to add further functionality to this API. One of the goals is to integrate a DEX API as well, likely from jupiter.

Version Note

This API was built with Python 3.12 and the latest package versions available at the time. The purpose was to take advantage of the great typing additions that have come to python and pydantic up to version 3.12. The library can fairly easily be backported to earlier versions of python, but it was not in the current scope of the author's work.

Examples

Using the SyncClient to return account info for a particular public key. Common configuration parameters are provided via the Configuration Object. The response object here will be a fully typed solsystem Response object with populated fields.

from SolSystem import (
    SyncClient,
    GetAccountInfo,
    Configuration,
    Encoding,
)
def main():
    with SyncClient(rpc_endpoint = "<RPC ENDPOINT URL>") as client:
        response = client.request(
            method = GetAccountInfo(
                account = "<BASE58 PUBLIC KEY>",
                configuration = Configuration(
                    encoding = Encoding.JSONPARSED,
                )
            )
        )
        # Note response is fully typed as a Response[Account] object
        print(response.model_dump_json(indent = 2))

Here we use the AsyncClient to get the current account balance and display the balance in both SOL and Lamports. We can use the Lamports response object to easily convert and perform arithmetic operations on the value.

import asyncio
from SolSystem import (
    AsyncClient,
    GetAccountBalance,
    Configuration,
    Commitment,
)
async def main():
    async with AsyncClient(rpc_endpoint = "<RPC ENDPOINT URL>") as client:
        resopnse = await client.request(
            method = GetAccountBalance(
                account = "<BASE58 PUBLIC KEY>",
                configuration = Configuration(
                    commitment = Commitment.CONFIRMED,
                )
            )
        )
        # Note response is fully typed as a Response[Lamports] object
        print(response.model_dump_json(indent = 2))

        print(F"Lamport Value: {response.value}")
        print(F"Sol Value: {response.value.sol}")

The Websocket client works as a factory which creates subscribed clients. Each call to subscribe on the factory will create a separate object that manages the subscription for its specific method. We then use an async iterator or a loop to receive messages on each subscription.

import asyncio
from SolSystem import (
    WebsocketClient,
    WsGetAccountInfo,
    Configuration,
    Commitment,
)
async def main():
    async with WebsocketClient(
            end_point = "<WS RPC ENDPOINT URL>",
            message_limit = 3,
    ) as client_factory:
        # We will only recieve 3 messages per subscription
        account_subscription = await client_factory.subscribe(
            method = WsGetAccountInfo(
                account = "<BASE58 PUBLIC KEY>",
                configuration = Configuration(
                    commitment = Commitment.FINALIZED,
                )
            )
        )

        async for message in account_subscription:
            print(F"Owner: {message.value.owner}")
            print(F"Balance: {message.value.lamports}")
            print(F"Data: {message.value.data}")
            
        await account_subscription.unsubscribe()

Development

The project uses pdm as both the package manager and the build tool for simplicity. For development simply pull and run pdm install provided you have the correct python version and pdm installed already.

Simple tests are available in the /tests/ folder for confirming that response and request models are working correctly.

The project was developed in an environment running ruff and pylance so type checking was done through them.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

solsystem-1.0.7.tar.gz (62.1 kB view details)

Uploaded Source

Built Distribution

solsystem-1.0.7-py3-none-any.whl (112.0 kB view details)

Uploaded Python 3

File details

Details for the file solsystem-1.0.7.tar.gz.

File metadata

  • Download URL: solsystem-1.0.7.tar.gz
  • Upload date:
  • Size: 62.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.19.2 CPython/3.13.0 Darwin/22.1.0

File hashes

Hashes for solsystem-1.0.7.tar.gz
Algorithm Hash digest
SHA256 9d0f4e4a493aa07d94b99fa49b0215474377953be7cbc272f243ade1f7538299
MD5 d70e568a6e3d46d9b05be4e53ad38520
BLAKE2b-256 a124afce8a378a1025ad31f35c2f6cfafb3e27e16979555981b4d01bc38e6382

See more details on using hashes here.

File details

Details for the file solsystem-1.0.7-py3-none-any.whl.

File metadata

  • Download URL: solsystem-1.0.7-py3-none-any.whl
  • Upload date:
  • Size: 112.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.19.2 CPython/3.13.0 Darwin/22.1.0

File hashes

Hashes for solsystem-1.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 996293832821a2b64c4ffeeb3c7afbef53f9f5bc09e466d5d9f012c3993d1151
MD5 aec9c84f2500cdcf49fffe9e58e13e89
BLAKE2b-256 4fc89ef20c7eb73efd0e92cea22cde098267710e735bc58d86ebac3ecb06c523

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page