Portal provides MPC wallets and dApp connections for organizations and their users. To integrate Portal, an organization adds a client library to their mobile app and a few server API endpoints.


We support Cocoa Pods and Swift Package Manager as distribution methods for our swift package.


Add this to your pod file:


pod 'PortalSwift', :git => ''


Run pod install.

If you are running an xcode project and need to run pod init and run into ruby or xcode errors, ensure your xcode project is compatible with an xcode version lower than 14.

After you run pod install you should see a PROJECT_NAME.xcworkspace file. Open that file with xcode. You will need to work within that file to properly have the pod linked.

Initializing Portal

We can now create an instance of the Portal class. Below is an example of how you can do this:

import PortalSwift

class ViewController: UIViewController {
  public var portal: Portal?
  public var clientAuthToken: String = "CLIENT_API_KEY_OR_CLIENT_SESSION_TOKEN"

  override func viewDidLoad() {

  func registerPortal() -> Void {
    do {
      // Create a Portal instance.
      portal = try Portal(
        withRpcConfig: [
          "eip155:1": "\(config.alchemyApiKey)",
          "eip155:11155111": "\(config.alchemyApiKey)",
          "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp": "\(config.alchemyApiKey)",
          "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1": "\(config.alchemyApiKey)",
    } catch {
      // Handle errors creating an instance of Portal.

Now that we have our Portal instance, the next step is to generate wallets for your user. Let's create them!

If you are using Client Session Tokens (CSTs), this hint is for you.

When your user's CST expires, all Portal SDKs will throw an error on the next MPC Operation the user makes (e.g. creating a wallet, backing up a wallet, recovering a wallet, or signing). That error will include a code SESSION_EXPIRED in the SDK methods, which you can use as an indicator to refresh your CST.

Last updated