Skip to main content

0. Prerequisites

This guide assumes that you have completed the Setup guide to get a Privy client instance.

1. Creating a wallet

First, we will create a wallet. You will use this wallet’s id in future calls to sign messages and send transactions.
Learn more about creating wallets.
When using the PrivyClient to work with the API, all errors thrown will be instances of privy_rs::Error. This error type implements std::error::Error, so you can use it with ? to propagate errors or your favorite error handling library such as anyhow. You can see more examples in the error handling section below.

2. Signing a message

Next, we’ll sign a plaintext message with the wallet using chain-specific signing methods. Make sure to specify your wallet ID from creation in the input.
Learn more about signing messages.

3. Sending transactions

Your wallet must have some funds in order to send a transaction. You can use a testnet faucet to test transacting on a testnet (e.g. Base Sepolia) or send funds to the wallet on the network of your choice.
To send a transaction from your wallet, use chain-specific transaction methods. The SDK will populate missing network-related values, sign your transaction, broadcast it to the network, and return the transaction hash to you. In the request, make sure to specify your wallet id from your wallet creation above, as well as the caip2 chain ID for the network you want to transact on.
Learn more about sending transactions.
If you’re interested in more control, you can prepare and broadcast the transaction yourself, and simply use raw signing methods to sign the transaction with a wallet.

4. Creating a user

To create a user for your application, you can use the create method, passing in linked accounts, custom metadata, and wallets that should be associated with said user.
Learn more about creating users, and look at our pregenerating wallets guide for linking wallets to your users before they even sign in.

5. Error handling

In the examples above we use ? to propagate errors, however the Rust SDK provides comprehensive error handling through multiple specialized error types. All error types implement std::error::Error, allowing seamless integration with Rust’s error handling ecosystem.

Error types

The SDK provides the following main error categories:

PrivyApiError

The core generated client error type that represents all possible API communication failures:

PrivyCreateError

Client initialization errors that occur when creating a PrivyClient instance:

PrivySignedApiError

Errors for operations requiring cryptographic signatures (authorization keys):

PrivyExportError

Wallet export operation errors:

CryptoError

General cryptographic operation errors:

KeyError

Cryptographic key management errors:

SigningError

Digital signature creation errors:

SignatureGenerationError

Authorization signature generation errors:

Basic error handling

Advanced error handling

Integration with error handling libraries

The SDK works seamlessly with popular Rust error handling libraries:
We also implement logging via the tracing crate, which is a popular and well-supported logging facade for Rust.

Next steps & advanced topics

  • For an additional layer of security, you can choose to sign your requests with authorization keys.
  • To restrict what wallets can do, you can set up policies.
  • To prevent double sending the same transaction, take a look at our support for idempotency keys.
  • If you want to require multiple parties to sign off before sending a transaction for a wallet, you can accomplish this through the use of quorum approvals.