Okay, so you're knee deep in coding a Solana app, right? Need to send some SOL or call a program, but handling keys and signing feels like a nightmare. Especially if you're using Fireblocks for that secure vault setup. That's where Fireblocks' boost for Solana comes in - native program calls and those sweet gasless tx vibes. Wait, gasless? Kinda. It means no upfront gas from your end; Fireblocks handles the heavy lifting behind the scenes. I usually start with their Solana Web3 adapter because it plugs right into your existing @solana/web3.js code. Super straightforward.
Why does this matter? Solana's fast as hell, but tx fees are tiny anyway - like ~0.000005 SOL per signature. But with Fireblocks, you skip the wallet juggling. No more exporting privkeys or dealing with seed phrases. It's all API driven signing. In my experience, this saves hours on auth flows.
Don't skip this. Log into your Fireblocks dashboard. If you're on testnet, spin up a sandbox workspace - it's free and quick. Head to the API users section. Create a new API user. Grab your API and secret. The secret? Download it as a file; you'll point to its path later.
Next, make a vault account. Call it something like "Solana Playground." Note the vaultAccountId - it's a number like 0 or 1. Fund it with some devnet SOL if you're testing. Use their faucet or transfer from another wallet. Pro tip: Enable the Program Call API. It's early access, so ping your CSM if it's not lit up. That's the magic for native calls.
Sound familiar? If you've done EVM chains with Fireblocks, this is the same drill. But Solana's program calls? That's the boost.
git clone https://github.com/fireblocks/solana web3-adapter.gitcd solana web3-adapternpm install -g typescript ts nodenpm install.env.example to .env and fill it: API, secret path, vault ID.That's it. No bloat. Runs on TypeScript, 100% of the code. Stars are low cuz it's beta, but it works solid. I forked it once to tweak polling - you'll see why later.
Look, open a new file, say send sol.ts. Import the goods:
import { FireblocksConnectionAdapter } from './build'; // adjust path
import { Connection, PublicKey, Transaction, SystemProgram, LAMPORTSPERSOL } from '@solana/web3.js'; const solanaEndpoint = 'https://api.devnet.solana.com'; // mainnet beta for real const config = { apiKey: process.env.FIREBLOCKSAPIKEY, apiSecretPath: process.env.FIREBLOCKSSECRETKEY_PATH, vaultAccountId: 0, // your number devnet: true, // flip for prod pollingInterval: 2000, // ms, tweak if slow feeLevel: 'MEDIUM', // LOW/MEDIUM/HIGH waitForFireblocksConfirmation: true // waits for COMPLETED status
}; async function main() { const connection = await FireblocksConnectionAdapter.create(solanaEndpoint, config); const fromAccount = new PublicKey(await connection.getAccount()); // your vault's SOL address console.log('Your address:', fromAccount.toBase58()); const tx = new Transaction().add( SystemProgram.transfer({ fromPubkey: fromAccount, toPubkey: new PublicKey(' recipient devnet address here '), lamports: LAMPORTSPERSOL * 0.001 // 0.001 SOL }) ); const txHash = await connection.sendTransaction(tx); console.log('Tx hash:', txHash);
} main(); Run ts node send sol.ts. Boom. Tx flies off. Fireblocks signs it via their Program Call API. No gas from you - they estimate and cover the ~0.000005 SOL fee internally. If it hangs, check pollingInterval. I usually bump it to 5000ms on mainnet.
What's next? Add a note before sending: connection.setTxNote('Test transfer from adapter');. Or tag an external ID for tracking: connection.setExternalTxId('my order-123');. Handy for dashboards.
Okay, transfers are baby steps. The juice is calling Solana programs. Like swapping on Jupiter or staking. Fireblocks' createTransaction endpoint eats raw instructions. But the adapter makes it web3.js native.
Here's a swap example. Say you wanna swap 0.1 SOL for USDC on Raydium. Grab a Jupiter quote first (use their API). Then build the tx:
// Assume you have Jupiter swap tx from their API
const swapTx = // VersionedTransaction from Jupiter // Adapter handles it
const signed = await connection.sendTransaction(swapTx.transaction, [/ signers if needed /]);
console.log('Swapped! Hash:', signed); But honestly, for complex stuff, use their direct API. POST to /v1/transactions with operation: 'RAW' and solanaProgramCall payload. Include instructions array. Fees? Still ~0.000005 SOL per sig, but Fireblocks batches if possible.
Potential issue: Program ID mismatches. Double check your instruction data. I hit this once - hex encoded wrong. Fix? Use solana program library tools to serialize.
In my experience, staking via Blockdaemon + Fireblocks is clutch for institutions. Connect wallet, input amount, sign. Fees negligible.
Sometimes it flakes. Connection times out? Your RPC endpoint's clogged. Switch to Helius or QuickNode - free tiers rock for devnet. API secret path wrong? Node can't read it - chmod 600 the file.
Tx stuck in BROADCASTING? Set waitForFireblocksConfirmation: false. Grab hash early. Or crank silent: false for logs. Vault underfunded? Check balance via getAccount().
| Issue | Quick Fix |
|---|---|
| Auth fail 401 | Regen API secret, re pair co signer |
| Program call rejected | Verify instruction discriminator |
| High fees | feeLevel: 'LOW', ~0.000002 SOL |
| Polling slow | pollingInterval: 1000 |
| Devnet vs mainnet mixup | Double check devnet: true/false |
See? Most are config tweaks. Test on devnet always.
"Gasless" here means relayer style, but Fireblocks does it custodial. You build tx, they sign and submit, deducting from your vault balance post facto. No meta tx needed. For EVM equiv, it's their Web3Provider. Solana adapter mirrors that.
Cost breakdown:
Why care? Scales for high volume apps. No user gas prompts.
Building a frontend? Connect Fireblocks via WalletConnect. In your React/Vue app:
import { WalletConnectProvider } from '@fireblocks/solana walletconnect'; // conceptual // QR pops, scan with Fireblocks app
const provider = new WalletConnectProvider();
await provider.connect();
const txid = await provider.send(transaction); Real talk: For Definitive.fi trades, they whitelist your address first. Email support, get approved, scan QR, sign. Disconnects clean too - toggle switch.
Issue: Interferes with Phantom? Yeah, disable one at a time. I usually test isolated.
Want Token-2022? Fireblocks SDK: POST /v1/tokenization/tokens. Deploy mint, set authorities. Interact via programs. Adapter sends the txs.
Example: Mint 1000 USDC like tokens.
// Use TokenProgram.createMint etc.
const mintTx = new Transaction().add(/ instructions /);
await connection.sendTransaction(mintTx); Authorities? Fireblocks holds mint/freeze. Revoke later if needed.
Multiple vaults? Pass array to vaultAccountIds. Webhooks for tx events - set endpoint in dashboard. Catch COMPLETED/FAILED.
Rate limits? Fireblocks generous, but batch txs. I run 100/min fine.
Custom fees? Override in config. Medium's safe - avoids mempool drops.
Dig the repo's examples dir. Transfer, airdrop, program invoke. Fork it, tweak.
Me? I built a batch sender: Loop txs, set notes like "Batch #3/50". Ran 200 SOL dust sweeps. Zero fails.
Questions? Hit Fireblocks devs Discord. They're quick.
| Solana Adapter | EVM Web3Provider | |
|---|---|---|
| Setup | Web3.js drop in | Ethers drop in |
| Fees | ~0.000005 SOL | Dynamic GWEI |
| Programs | Native calls | Contract calls |
| Confirm | Poll to COMPLETED | Wait blocks |
Solana wins on speed. 400ms blocks vs ETH 12s.
Honestly, if you're Solana only, this adapter's your best friend. Go build something cool.