-
Notifications
You must be signed in to change notification settings - Fork 53
Description
We are working on Streamflow Aligned Stream Programs which involves Price Oracles like Switchboard.
We are experiencing a critical bug when trying to update a PullFeed on Solana devnet. The fetchUpdateIx() method returns malformed instructions where the System Program is incorrectly marked as a signer, causing all update transactions to fail with "signature verification failure".
Environment
Network: Solana Devnet
SDK Version: @switchboard-xyz/on-demand (latest via npm)
Queue: EYiAmGSdsQTuCw413V5BzaruWuCCSDgTPtBGvLkXHbe7 (default devnet queue)
Gateway: https://141.94.193.169.xip.switchboard-oracles.xyz/devnet
Feed Pubkey: 8XUZByvSgBbnCzXNba6uRHrcFvAVLnCugnpxHBjpRh8w
FeedHash: 0x1e29fc0c8d15e8d0f569a53ed2aed6fed968098735ecd389b2a7f1a895a736be
What Works ✅
Feed Creation: Successfully created PullFeed on-chain
Job Storage: Successfully stored job on IPFS via crossbar.store()
Simulation: Job simulates correctly and returns expected price
Simulation Result: {"feedHash":"direct","results":["0.0003062499999997703125000002"]}
Price: 0.000306 SOL per token ✅
What Fails ❌
When calling fetchUpdateIx(), the returned instructions have incorrect account metadata.
Code Used
typescriptconst [updateIxs, responses, numSuccess, luts] = await pullFeed.fetchUpdateIx({
gateway: gatewayUrl,
crossbarClient: crossbar,
numSignatures: 1,
network: "devnet",
});
Debug Output - Instruction Accounts
Instruction 0 (Secp256k1):
Program: KeccakSecp256k11111111111111111111111111111
Accounts: 0
Instruction 1 (Switchboard Update):
Program: Aio4gaXjXzJNVLtzwtNVmSqGKpANtXhybbkhtAC94ji2
Accounts (12):
0: EYiAmGSdsQTuCw413V5BzaruWuCCSDgTPtBGvLkXHbe7 📖 READ-ONLY (Queue)
1: 4UFmCebEmzESoDTtHrmaftXj7YAsAH4HMios3yMWyVUT 📖 READ-ONLY
2: SysvarS1otHashes111111111111111111111111111 📖 READ-ONLY
3: 11111111111111111111111111111111 ✏️ WRITABLE 🔑 SIGNER ← BUG!
4: 11111111111111111111111111111111 📖 READ-ONLY
5: GDTsjg7yNCimJW5MuCe2nrwrzQcpyKNMZg1514bq4eqq ✏️ WRITABLE
6: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA 📖 READ-ONLY
7: So11111111111111111111111111111111111111112 📖 READ-ONLY
8: Sysvar1nstructions1111111111111111111111111 📖 READ-ONLY
9: 8XUZByvSgBbnCzXNba6uRHrcFvAVLnCugnpxHBjpRh8w ✏️ WRITABLE (Feed)
10: EqT5yWVWxuMdyqTToAobhAhBt7oWq2Wam9c4gTvYdjmq 📖 READ-ONLY
11: DdaoyaZTBec1DEWFFHEBiDsrNXud3HmKUcFNzcQ7YPCx ✏️ WRITABLE
The Problem
Account index 3 is the System Program (111...111) marked as isSigner: true.
This is impossible - the System Program cannot sign transactions. Additionally, our payer wallet (CVEZVjm43zN8iETF5JCQwVx1mBaCETpL2eGEo22e9fQr) is not present in the instruction accounts at all.
Error Message
Error: Simulation failed.
Message: Transaction signature verification failure.
Steps to Reproduce
Create a PullFeed with a custom job (httpTask querying Solana RPC for vault balances)
Store the job using crossbar.store(queue, jobs)
Initialize the feed on-chain with pullFeed.initIx()
Attempt to update using pullFeed.fetchUpdateIx()
Build transaction with sb.asV0Tx() or manual Transaction construction
Send transaction → Fails with signature verification error
Questions
Is this a known devnet gateway issue? Will mainnet have the same problem?
Is there a workaround? Can we manually fix the instruction accounts before sending?
Are there SDK version requirements? Should we use a specific version of @switchboard-xyz/on-demand?
Alternative approach? Should we use Managed Feeds or Switchboard Surge instead of PullFeed for custom price feeds? -- If Yes, could you help establish communications with Streamflow Finance? They are using this deprecated approach
Contact
We're happy to provide additional logs, test with specific SDK versions, or help debug further. This is blocking our integration with Streamflow's price-based vesting feature.
Thank you!
h