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 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)
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:
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.