# Send gasless transactions

Openfort backend wallets can send transactions on Solana without requiring the wallet to hold SOL for fees. The SDK provides three ways to send transactions: high-level transfers, raw instructions, and pre-built raw transactions.

:::warning
Solana gasless transactions require a **gas sponsorship policy** with the `sponsorSolTransaction` operation. Create one in the [Openfort Dashboard](https://dashboard.openfort.io) or via the [Policy Engine](/docs/configuration/policies). Solana policies are project-scoped and apply automatically to all transactions — no policy ID is passed per-request.
:::

## Install dependencies

:::code-group
```sh [npm]
npm install @solana/kit @solana-program/compute-budget @solana/kora @solana/transaction-confirmation @solana-program/system @solana-program/token

```

```sh [yarn]
yarn add @solana/kit @solana-program/compute-budget @solana/kora @solana/transaction-confirmation @solana-program/system @solana-program/token

```

```sh [pnpm]
pnpm add @solana/kit @solana-program/compute-budget @solana/kora @solana/transaction-confirmation @solana-program/system @solana-program/token

```
:::

:::tip[Runnable examples]
See the complete runnable examples for [Solana transactions](https://github.com/openfort-xyz/openfort-node/tree/main/examples/solana/transactions) and [Solana signing](https://github.com/openfort-xyz/openfort-node/tree/main/examples/solana/signing) in the Node SDK repository.
:::

## Transfers

Use `account.transfer()` for SOL and SPL token transfers.

### SOL transfer

```ts
import 'dotenv/config'
import Openfort from '@openfort/openfort-node'

const openfort = new Openfort(process.env.OPENFORT_SECRET_KEY!, {
  walletSecret: process.env.OPENFORT_WALLET_SECRET!,
  publishableKey: process.env.OPENFORT_PUBLISHABLE_KEY!,
})

const account = await openfort.accounts.solana.backend.create()

const result = await account.transfer({
  to: '{{DESTINATION_ADDRESS}}',
  amount: 1_000_000n, // in lamports
  cluster: 'devnet', // or 'mainnet-beta'
})

console.log('SOL transfer signature:', result.signature)
```

### SPL token transfer by name

```ts
const result = await account.transfer({
  to: '{{DESTINATION_ADDRESS}}',
  amount: 1_000_000n,
  token: 'usdc',
  cluster: 'devnet', // or 'mainnet-beta'
})

console.log('USDC transfer signature:', result.signature)
```

### SPL token transfer by mint address

```ts
const result = await account.transfer({
  to: '{{DESTINATION_ADDRESS}}',
  amount: 2_000_000n,
  token: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU', // mint address
  cluster: 'devnet', // or 'mainnet-beta'
})

console.log('SPL transfer signature:', result.signature)
```

## Send transaction with instructions

Use `sendTransaction` for more control. Build raw Solana instructions and let Openfort handle the rest.

```ts
import 'dotenv/config'
import Openfort from '@openfort/openfort-node'
import { getTransferSolInstruction } from '@solana-program/system'
import { address, createNoopSigner } from '@solana/kit'

const openfort = new Openfort(process.env.OPENFORT_SECRET_KEY!, {
  walletSecret: process.env.OPENFORT_WALLET_SECRET!,
  publishableKey: process.env.OPENFORT_PUBLISHABLE_KEY!,
})

const account = await openfort.accounts.solana.backend.create()

// Build a raw SOL transfer instruction
const solTransferIx = getTransferSolInstruction({
  source: createNoopSigner(address(account.address)),
  destination: address('{{DESTINATION_ADDRESS}}'),
  amount: 10n,
})

const result = await openfort.accounts.solana.backend.sendTransaction({
  account,
  cluster: 'devnet', // or 'mainnet-beta'
  instructions: [solTransferIx],
})

console.log('Transaction signature:', result.signature)
```

## Send a raw transaction

If you already have a serialized transaction (base64-encoded), submit it directly with `sendRawTransaction`.

```ts
import 'dotenv/config'
import Openfort from '@openfort/openfort-node'

const openfort = new Openfort(process.env.OPENFORT_SECRET_KEY!, {
  walletSecret: process.env.OPENFORT_WALLET_SECRET!,
  publishableKey: process.env.OPENFORT_PUBLISHABLE_KEY!,
})

const account = await openfort.accounts.solana.backend.create()

// A base64-encoded Solana transaction
const base64Transaction = '...'

const result = await account.sendRawTransaction({
  cluster: 'devnet', // or 'mainnet-beta'
  transaction: base64Transaction,
})

console.log('Transaction signature:', result.signature)
```
