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

Was this helpful?

Edit on GitHub
  1. Reference
  2. iOS

sendSol

Sends SOL tokens to a specified Solana address. This method constructs and sends a Solana transfer transaction.

Function Signature

public func sendSol(
    _ lamports: UInt64,
    to: String,
    withChainId chainId: String
) async throws -> String

Parameters

  • lamports: Amount of lamports to send (1 SOL = 1,000,000,000 lamports)

  • to: The recipient's Solana address

  • withChainId: The CAIP-2 chain identifier (e.g., "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" for Solana mainnet)

Returns

The transaction hash (signature) as a string

Throws

  • MpcError.addressNotFound if no Solana address is found for the wallet

  • PortalSolError.failedToGetLatestBlockhash if unable to get the latest blockhash

  • PortalSolError.failedToGetTransactionHash if transaction signing/sending fails

  • Errors from SolanaSwift.PublicKey initialization if addresses are invalid

Example Usage

// Basic SOL transfer
do {
    // Send 1 SOL (1 SOL = 1,000,000,000 lamports)
    let txHash = try await portal.sendSol(
        1_000_000_000,
        to: "recipient_solana_address",
        withChainId: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
    )
    print("Transaction sent: \(txHash)")
} catch {
    print("Error sending SOL: \(error)")
}

// Example with amount calculation
func sendSol(amount: Double, to recipient: String) async throws {
    // Convert SOL to lamports (1 SOL = 1,000,000,000 lamports)
    let lamports = UInt64(amount * 1_000_000_000)
    
    do {
        let txHash = try await portal.sendSol(
            lamports,
            to: recipient,
            withChainId: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
        )
        print("Sent \(amount) SOL")
        print("Transaction hash: \(txHash)")
    } catch MpcError.addressNotFound {
        print("No Solana wallet found. Please create or recover a wallet first.")
    } catch {
        print("Transaction failed: \(error)")
    }
}

// Complete example with balance check
func sendSolWithBalanceCheck(
    amount: Double,
    to recipient: String
) async throws {
    // Get current balance first
    let assets = try await portal.getAssets("solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp")
    
    guard let nativeBalance = assets.nativeBalance,
          let balanceStr = nativeBalance.balance,
          let balance = Double(balanceStr) else {
        throw CustomError.balanceCheckFailed
    }
    
    // Check if we have enough balance (including some for fees)
    let requiredAmount = amount + 0.001 // Add some for fees
    guard balance >= requiredAmount else {
        throw CustomError.insufficientBalance(
            has: balance,
            needs: requiredAmount
        )
    }
    
    // Convert SOL to lamports
    let lamports = UInt64(amount * 1_000_000_000)
    
    // Send transaction
    let txHash = try await portal.sendSol(
        lamports,
        to: recipient,
        withChainId: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
    )
    
    print("Transaction successful!")
    print("Amount: \(amount) SOL")
    print("To: \(recipient)")
    print("Hash: \(txHash)")
}

// Example usage in a view controller
class SendSolViewController: UIViewController {
    @IBAction func sendButtonTapped() {
        Task {
            do {
                try await sendSolWithBalanceCheck(
                    amount: 0.1,
                    to: "recipient_address"
                )
                
                await MainActor.run {
                    showSuccess("Transaction sent successfully!")
                }
            } catch let error as CustomError {
                await MainActor.run {
                    handleCustomError(error)
                }
            } catch {
                await MainActor.run {
                    showError("Transaction failed: \(error.localizedDescription)")
                }
            }
        }
    }
}

Implementation Notes

  • Run generateor recover if needed.

  • Amount must be specified in lamports (1 SOL = 1,000,000,000 lamports)

  • The transaction is automatically signed and sent to the network

  • The fee is paid by the sender's address

  • Consider adding extra amount for transaction fees

  • The function waits for transaction submission but not confirmation

PreviousgetTransactionsNextevaluateTransaction

Last updated 3 months ago

Was this helpful?