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)
In Xcode, right-click on your project in the Project Navigator
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.
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 = Portal("YOUR_TEST_CLIENT_API_KEY", autoApprove: true)
import io.portalhq.android.Portal
val portal = Portal("YOUR_TEST_CLIENT_API_KEY", autoApprove = true)
To create a new wallet, use the portal.createWallet() function. You can optionally provide a callback to receive status updates 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 faucets page.
The chainId will need to be a CAIP-2 compliant Chain ID. For more info on Chain ID formatting, see this doc.
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}")
Sending Tokens from your Wallet
Portal provides two ways to send transactions:
portal.sendAsset() - A simple method for sending tokens from your Portal wallet.
portal.provider.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.
Submitting an EVM Transaction
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(chainId, params)
console.log(`✅ Transaction hash: ${txHash}`)
Submitting a Solana Transaction
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.
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(chainId, params)
console.log(`✅ Transaction hash: ${txHash}`)