Documentation Index
Fetch the complete documentation index at: https://docs.portalhq.io/llms.txt
Use this file to discover all available pages before exploring further.
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.
Web
iOS
Android
React Native
Using Swift Package Manager (SPM)
- In Xcode, right-click on your project in the Project Navigator
- Select “Add Packages…”
- In the search field, enter either:
- Package name:
PortalSwift
- Repository URL:
https://github.com/portal-hq/PortalSwift
- Select your desired version
- Click “Add Package”
Using CocoaPods
- Add the following line to your
Podfile:
pod 'PortalSwift', :git => 'https://github.com/portal-hq/PortalSwift.git'
- In Terminal, navigate to your project directory and run:
- 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 dependencyimplementation "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 react-native-keychain
cd ios & pod install # (FOR iOS use only)
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 Portal Admin Dashboard 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
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 CAIP-2 Chain IDs to their respective RPC URLs.
Portal offers custom approval flows during the signing process, but for now, we can auto-approve all signatures with the autoApprove argument.
Web
iOS
Android
React Native
import Portal from '@portal-hq/web'
const portal = new Portal({
apiKey: 'YOUR_TEST_CLIENT_API_KEY',
autoApprove: true,
rpcConfig: {
'eip155:10143': '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:10143']: 'https://api.portalhq.io/rpc/v1/eip155/10143',
['solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp']: 'https://api.portalhq.io/rpc/v1/solana/5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
['solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1']: 'https://api.portalhq.io/rpc/v1/solana/EtWTRABZaYq6iMfeYKouRu166VU2xqa1',
},
})
Create a wallet
To create a new wallet, use the portal.createWallet() function. You can optionally provide a callback to receive status updates during wallet creation.
Web
iOS
Android
React Native
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}")
print("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
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 faucets page.
The chainId will need to be a CAIP-2 compliant Chain ID. For more info on Chain ID formatting, see this doc.
Web
iOS
Android
React Native
const chainId = "eip155:10143" // Monad Testnet
const params = {
amount: "0.01", // You will receive 0.01 MON
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:10143" // Monad Testnet
let params = FundParams(
amount: "0.01", // You will receive 0.01 MON
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:10143" // Monad Testnet
val params = FundParams(
amount = "0.01", // You will receive 0.01 MON
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:10143" // Monad Testnet
const params = {
amount: "0.01", // You will receive 0.01 MON
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:
portal.sendAsset() - A simple method for sending tokens from your Portal wallet.
portal.request() - Direct access to the underlying web3 provider for custom transactions. (You can learn more about this method here.)
For most use cases, we recommend using portal.sendAsset() as shown in the examples below.
EVM
Web
iOS
Android
React Native
const chainId = "eip155:10143" // Monad Testnet
const params = {
amount: "0.0001", // Sends 0.0001 MON
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:10143" // Monad Testnet
let params = SendAssetParams(
to: "0xDestinationAddress", // The recipient address
amount: "0.0001", // Sends 0.0001 MON
token: "NATIVE", // Token, use "NATIVE" for the chain's native token
signatureApprovalMemo: "test" // Optional signature approval memo to use for the request
)
// Send the tokens
let txHash = try await portal.sendAsset(chainId, params)
print("✅ Transaction hash: \(txHash)")
val chainId = "eip155:10143" // Monad Testnet
val params = SendAssetParams(
amount = "0.0001", // Sends 0.0001 MON
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:10143" // Monad Testnet
const params = {
amount: "0.0001", // Sends 0.0001 MON
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}`)
If your Portal client is using Account Abstraction, then txHash is actually a User Operation hash. You can manually look up the user operation hash here.
Solana
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 here.
Web
iOS
Android
React Native
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}`)
You just created a Portal client, created their wallet, accessed their addresses, received testnet tokens, and sent tokens on both Monad Testnet and Solana Devnet! 🎉
Next we recommend going through the complete SDK guides where we go into much more detail.