LogoLogo
SupportGithubSign InGet Access
  • Introduction
  • GETTING STARTED
    • SDK Quick Start
    • API Quick Start
  • Guides
    • Web
      • Create a wallet
      • Send tokens
      • Sign a transaction
      • Simulate a transaction
      • Back up a wallet
      • Recover a wallet
      • Cross-device sessions
      • Manage wallet lifecycle states
      • Web authentication methods
      • Perform swaps
      • Add custom signature hooks
      • MPC progress callbacks
      • Portal API methods
      • Configure a custom subdomain
      • Eject a wallet
      • Using the EIP-1193 Provider
      • Legacy documentation
        • Back up a wallet
          • Backup Options
        • Recover a wallet
    • iOS
      • Create a wallet
      • Send tokens
      • Sign a transaction
      • Simulate a transaction
      • Back up a wallet
      • Recover a wallet
      • Cross-device sessions
      • Manage wallet lifecycle states
      • Connect with WalletConnect
      • Build a WebView
      • Perform swaps
      • Add custom signature hooks
      • MPC progress callbacks
      • Portal API methods
      • Manage ERC20 tokens
      • Eject a wallet
      • Legacy documentation
        • Back up a wallet
          • Backup Options
          • Passkey + Enclave Storage
        • Recover a wallet
      • Troubleshooting Tips
      • Feature Flags
    • Android
      • Create a wallet
      • Send tokens
      • Sign a transaction
      • Simulate a transaction
      • Back up a wallet
      • Recover a wallet
      • Cross-device sessions
      • Manage wallet lifecycle states
      • Connect with WalletConnect
      • Build a WebView
      • Perform swaps
      • Add custom signature hooks
      • MPC progress callbacks
      • Portal API methods
      • Eject a wallet
      • Legacy documentation
        • Back up a wallet
          • Backup Options
        • Recover a wallet
    • React Native
      • Create a wallet
      • Send tokens
      • Sign a transaction
      • Simulate a transaction
      • Back up a wallet
      • Recover a wallet
      • Cross-device sessions
      • Manage wallet lifecycle states
      • Connect with WalletConnect
      • Build a WebView
      • Perform swaps
      • Add custom signature hooks
      • MPC progress callbacks
      • Portal API methods
      • Eject a wallet
      • Legacy documentation
        • Back up a wallet
          • Backup Options
        • Recover a wallet
    • Enclave MPC API
      • Create a client
      • Create a wallet
      • Send tokens
      • Sign Ethereum transactions
      • Sign Solana transactions
      • Sign Tron transactions
      • Sign Stellar Transaction
      • Concurrent Transactions
      • Back up a wallet
      • Eject a wallet
  • Reference
    • iOS
      • createWallet
      • backupWallet
      • recoverWallet
      • ejectPrivateKeys
      • registerBackupMethod
      • setGDriveConfiguration
      • setPasskeyConfiguration
      • setPasskeyAuthenticationAnchor
      • setPassword
      • availableRecoveryMethods
      • doesWalletExist
      • isWalletBackedUp
      • isWalletOnDevice
      • isWalletRecoverable
      • getBalances
      • getAssets
      • getNftAssets
      • getTransactions
      • sendSol
      • evaluateTransaction
      • buildEip155Transaction
      • buildSolanaTransaction
      • getWalletCapabilities
    • Android
      • Reference Documentation
    • React Native
      • @portal-hq/core
      • Storage adapters
        • Cloud storage
          • @portal-hq/gdrive-storage
          • @portal-hq/icloud-storage
        • Mobile storage
          • @portal-hq/keychain
          • @portal-hq/mobile-key-values
    • Enclave MPC API
      • V1 endpoints
    • Client API
      • V3 endpoints
      • V1 endpoints
    • Custodian API
      • V3 endpoints
      • V1 endpoints
    • Swaps API
      • V3 endpoints
      • V1 endpoints
  • Resources
    • Flutter
      • iOS
      • Android
    • Error codes
      • Overview
      • Legacy Documentation
        • MPC errors
        • Network errors
        • General errors
        • Encryption errors
        • Portal Connect errors
    • Portal's MPC architecture
    • Authentication and API Keys
    • Self-Managed Backups
    • Alert Webhooks
    • Wallet lifecycle
    • Backup options
      • Password/PIN
      • GDrive
      • iCloud
      • Passkey + Enclave
    • WalletConnect metadata
    • Advanced security scanning
    • Account abstraction
    • Security firewall
    • Eject
    • Security
    • Blockchain support
    • Chain ID formatting
    • Testnet faucets
    • Going to Production
    • Rate Limits
    • Multi-backup migration guide
    • Multi-wallet migration guides
      • Migrating from Android SDK v3.x.x to v4.x.x
      • Migrating from iOS SDK v3.0.x to v3.2.x
  • Support
    • Changelog
      • Android
      • iOS
      • React Native
      • Web
      • Past Releases
        • 2024 Releases
        • 2023 Releases
    • Celo Hackathon Hub
    • Glossary
Powered by GitBook
On this page
  • Overview
  • Authentication
  • Initializing Portal
  • Create a wallet
  • Receive testnet tokens
  • Send tokens
  • EVM
  • Solana

Was this helpful?

Edit on GitHub
  1. GETTING STARTED

SDK Quick Start

This quick start guide will get you up and running with any of the Portal SDKs.

PreviousIntroductionNextAPI Quick Start

Last updated 3 months ago

Was this helpful?

Overview

Portal offers SDKs for Web, iOS, Android, and React Native. To install the chosen Portal SDK in your app, simply add the Portal package to your project.

yarn add @portal-hq/web

Using Swift Package Manager (SPM)

  1. In Xcode, right-click on your project in the Project Navigator

  2. Select "Add Packages..."

  3. In the search field, enter either:

    • Package name: PortalSwift

    • Repository URL: https://github.com/portal-hq/PortalSwift

  4. Select your desired version

  5. Click "Add Package"

Using CocoaPods

  1. Add the following line to your Podfile:

pod 'PortalSwift', :git => 'https://github.com/portal-hq/PortalSwift.git'
  1. In Terminal, navigate to your project directory and run:

pod install
  1. After installation:

    • Close your .xcodeproj file

    • Open the newly generated .xcworkspace file

    • ⚠️ Important: Always use the .xcworkspace file for development when using CocoaPods

Update the dependencies in your app level build.gradle to include the portal-android dependency

implementation "io.portalhq.android:portal-android:X.X.X"

The basic Portal setup consists of three packages:

  • @portal-hq/core - The core Portal library.

  • @portal-hq/keychain - An adapter for storing MPC signing shares on-device.

  • @portal-hq/gdrive-storage - An adapter for storing MPC backup shares off-device.

These modules allow you to initialize Portal in your app.

yarn add @portal-hq/core @portal-hq/keychain @portal-hq/gdrive-storage

Authentication

The Portal SDK is initialized with a Client API Key or Client Session Token. You can get a test Client API Key from the in the Settings -> Test Client API Keys section. Simply click the New + button.

A modal will then be presented, allowing you to copy your test Client API Key. You can repeat this process as many times as you need to.

Initializing Portal

Portal offers custom approval flows during the signing process, but for now, we can auto-approve all signatures with the autoApprove argument.

import Portal from '@portal-hq/web'

const portal = new Portal({
    apiKey: 'YOUR_TEST_CLIENT_API_KEY',
    autoApprove: true,
    rpcConfig: {
      'eip155:11155111': 'YOUR-INFURA-OR-ALCHEMY-URL'
    },
})
import PortalSwift

let portal = try Portal("YOUR_TEST_CLIENT_API_KEY", autoApprove: true)
import io.portalhq.android.Portal

val portal = Portal("YOUR_TEST_CLIENT_API_KEY", autoApprove = true)
import Portal from '@portal-hq/core'

const portal = new Portal({
    apiKey: 'YOUR_TEST_CLIENT_API_KEY',
    autoApprove: true,
    gatewayConfig: {
      ['eip155:1']: 'https://api.portalhq.io/rpc/v1/eip155/1',
      ['eip155:11155111']: 'https://api.portalhq.io/rpc/v1/eip155/11155111',
      ['solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp']: 'https://api.portalhq.io/rpc/v1/solana/5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
      ['solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1']: 'https://api.portalhq.io/rpc/v1/solana/EtWTRABZaYq6iMfeYKouRu166VU2xqa1',
    },
})

Create a wallet

const eip155Address = await portal.createWallet()

console.log(`My Portal EVM address: ${eip155Address}`)
console.log(`My Portal Solana address: ${await portal.getSolanaAddress()}`)
let addresses = try await portal.createWallet()

print("My Portal EVM address: \(addresses.ethereum)")
print("My Portal Solana address: \(addresses.solana)")
val addresses = portal.createWallet()

println("My Portal EVM wallet: ${addresses.ethereumAddress}")
println("My Portal Solana wallet: ${addresses.solanaAddress}")
const addresses = await portal.createWallet()

console.log(`My Portal EVM address: ${addresses.eip155}`)
console.log(`My Portal Solana address: ${addresses.solana}`)

Receive testnet tokens

const chainId = "eip155:11155111" // Ethereum Sepolia

const params = {
  amount: "0.01", // You will receive 0.01 ETH
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
}

// Fund your Portal wallet
const response = await portal.receiveTestnetAsset(chainId, params)

console.log(`✅ Transaction hash: ${response.data.txHash}`)
let chainId = "eip155:11155111" // Ethereum Sepolia

let params = FundParams(
  amount: "0.01", // You will receive 0.01 ETH
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
)

// Fund your Portal wallet
let response = portal.receiveTestnetAsset(chainId, params)

print("✅ Transaction hash: \(response.data.txHash)")
val chainId = "eip155:11155111" // Ethereum Sepolia

val params = FundParams(
  amount = "0.01", // You will receive 0.01 ETH
  token = "NATIVE" // Token, use "NATIVE" for the chain's native token
)

// Fund your Portal wallet
val response = portal.receiveTestnetAsset(chainId, params)

println("✅ Transaction hash: ${response.data.txHash}")
const chainId = "eip155:11155111" // Ethereum Sepolia

const params = {
  amount: "0.01", // You will receive 0.01 ETH
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
}

// Fund your Portal wallet
const response = await portal.receiveTestnetAsset(chainId, params)

console.log("✅ Transaction hash: ${response.data.txHash}")

Send tokens

Portal provides two ways to send transactions:

  1. portal.sendAsset() - A simple method for sending tokens from your Portal wallet.

For most use cases, we recommend using portal.sendAsset() as shown in the examples below.

EVM

const chainId = "eip155:11155111" // Ethereum Sepolia

const params = {
  amount: "0.0001", // Sends 0.0001 ETH
  to: "0xDestinationAddress", // The recipient address
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
}

// Send the tokens
const txHash = await portal.sendAsset(chainId, params)

console.log(`✅ Transaction hash: ${txHash}`)
let chainId = "eip155:11155111" // Sepolia

let params = SendAssetParams(
  amount: "0.0001", // Sends 0.0001 ETH
  to: "0xDestinationAddress", // The recipient address
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
)

// Send the tokens
let txHash = try await portal.sendAsset(chainId, params)

print("✅ Transaction hash: \(txHash)")
val chainId = "eip155:11155111" // Sepolia

val params = SendAssetParams(
  amount = "0.0001", // Sends 0.0001 ETH
  to = "0xDestinationAddress", // The recipient address
  token = "NATIVE" // Token, use "NATIVE" for the chain's native token
)

// Send the tokens
val txHash = portal.sendAsset(chainId, params)

println("✅ Transaction hash: ${txHash}")
const chainId = "eip155:11155111" // Ethereum Sepolia

const params = {
  amount: "0.0001", // Sends 0.0001 ETH
  to: "0xDestinationAddress", // The recipient address
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
}

// Send the tokens
const txHash = await portal.sendAsset(params.to, params.token, params.amount, chainId)

console.log(`✅ Transaction hash: ${txHash}`)

Solana

const chainId = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"; // Solana Devnet

const params = {
  amount: "0.0001", // Sends 0.0001 SOL
  to: "0xDestinationAddress", // The recipient address
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
}

// Send the tokens
const txHash = await portal.sendAsset(chainId, params)

console.log(`✅ Transaction hash: ${txHash}`)
let chainId = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" // Solana Devnet

let params = SendAssetParams(
  amount: "0.0001", // Sends 0.0001 SOL
  to: "0xDestinationAddress", // The recipient address
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
)

// Send the tokens
let response = try await portal.sendAsset(chainId, params)

print("✅ Transaction hash: \(response.result)")
val chainId = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" // Solana Devnet

val params = SendAssetParams(
  amount = "0.0001", // Sends 0.0001 SOL
  to = "0xDestinationAddress", // The recipient address
  token = "NATIVE" // Token, use "NATIVE" for the chain's native token
)

// Send the tokens
val txHash = portal.sendAsset(chainId, params)

print("✅ Transaction hash: \(txHash)")
const chainId = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"; // Solana Devnet

const params = {
  amount: "0.0001", // Sends 0.0001 SOL
  to: "0xDestinationAddress", // The recipient address
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
}

// Send the tokens
const txHash = await portal.sendAsset(params.to, params.token, params.amount, chainId)

console.log(`✅ Transaction hash: ${txHash}`)

To initialize Portal in your application, create a new instance of the Portal class included in the package dependency you added. You can provide your new test Client API Key as the apiKey argument during initialization. rpcConfig is a map of to their respective RPC URLs.

To create a new wallet, use the portal.createWallet() function. You can optionally provide a callback to receive during wallet creation.

Now that you have a wallet, the next step is to get test tokens for it. You can fund your wallet using portal.receiveTestnetAsset. If you are looking for a greater variety of test tokens, we recommend exploring our .

The chainId will need to be a compliant Chain ID. For more info on Chain ID formatting, see .

portal.request() - Direct access to the underlying web3 provider for custom transactions. (You can learn more about this method .)

If your Portal client is using , then txHash is actually a User Operation hash. You can manually look up the user operation hash .

You will need SOL to submit a Solana transaction, which is not currently supported by portal.receiveTestnetAsset. You can find a faucet to get test SOL tokens .

You just created a Portal client, created their wallet, accessed their addresses, received testnet tokens, and sent tokens on both Ethereum Sepolia and Solana Devnet!

Next we recommend going through the where we go into much more detail.

🎉
CAIP-2 Chain IDs
status updates
faucets page
CAIP-2
this doc
here
Account Abstraction
here
here
complete SDK guides
Portal Admin Dashboard