SDK Troubleshooting
Use this page to map common @omegax/protocol-sdk integration failures to likely causes
and fixes in the canonical OmegaX model.
Fast triage
- Confirm Node version is
>=20. - Confirm your runtime is using ESM imports.
- Confirm
programIdand RPC cluster match the deployment you expect. - Confirm settlement-sensitive flows use
createSafeProtocolClient(...)unless you are intentionally testing raw protocol builders. - Run the no-signature smoke:
npx @omegax/protocol-sdk doctor
- If your application has its own read-only smoke, run it after
doctor. A useful smoke imports the SDK, creates a safe client, and lists the public instruction and account names without requiring a funded signer.
If doctor passes but your app still fails, reduce the issue to the smallest
SDK import, client creation, account read, or build...Tx(...) call that
reproduces the behavior.
Typed SDK errors
Public failure paths that app builders can act on now throw typed errors from
@omegax/protocol-sdk/errors. Branch on instanceof or the stable code
field instead of parsing message text.
Common codes:
OMEGAX_CONFIG_ERROROMEGAX_INVALID_PUBLIC_KEYOMEGAX_PROGRAM_MISMATCHOMEGAX_ACCOUNT_NOT_FOUNDOMEGAX_ACCOUNT_OWNER_MISMATCHOMEGAX_TOKEN_ACCOUNT_PREFLIGHTOMEGAX_INSTRUCTION_BUILDOMEGAX_TRANSACTION_DECODEOMEGAX_RPC_ERROR
See SDK Error Catalog for causes, fixes, and retry guidance.
Install warning for uuid
Some Solana dependency trees still print an install warning for uuid@8.3.2
when a consumer project installs the packed SDK or a scaffolded template. Treat
that warning as non-blocking for SDK integration.
If your package manager supports dependency audits, run the audit that your application uses for release. Treat SDK integration warnings separately from transaction-safety checks.
Transaction and submission issues
Missing fee payer or required signature
Cause:
- The built transaction returned
missing_fee_payerormissing_required_signaturebecause it was not signed by the required signer.
Fix:
- Ensure your fee payer signs before serialization.
- Align the signer with the authority required by the instruction scope.
Simulation returns unverified signature
Cause:
- The simulation returned
signatureVerified: falsebecause the caller disabledsigVerify, or explicitly allowed fallback after the RPC rejected signature-verifying simulation arguments.
Fix:
- Treat the simulation as preflight-only.
- Re-sign and simulate with
sigVerify: true. - For claim or intake flows, call
validateSignedClaimTx(...)before trusting the submitted transaction, and always pass the exact server-storedexpectedUnsignedTxBase64transaction that the user was supposed to sign.
RPC timeout
Cause:
- Confirmation took too long or the blockhash expired.
Fix:
- Fetch a fresh blockhash with
getRecentBlockhash(). - Rebuild, re-sign, and resubmit the transaction.
Network error
Cause:
- RPC transport or network connectivity interrupted submission.
Fix:
- Retry against a healthy RPC endpoint.
- Record simulation logs so you can distinguish transport failures from program failures.
Canonical claim and obligation failures
These are normalized by normalizeClaimSimulationFailure(...) and normalizeClaimRpcFailure(...).
Protocol paused
Cause:
- A protocol or plan-level control is blocking the claim flow.
Fix:
- Inspect governance, reserve-domain, health-plan, or capital-class pause state before retrying.
Claim intake paused
Cause:
- Claim intake is paused for the relevant scope.
Fix:
- Resume intake or route the case through the correct plan and series.
Not eligible
Cause:
- The
MemberPositionis not eligible for the requested claim or payout.
Fix:
- Verify
fetchMemberPosition(...)anddescribeEligibilityStatus(...).
Funding exhausted
Cause:
- The applicable funding line or reserve scope does not have enough free capital.
Fix:
- Inspect
fetchFundingLineLedger(...),fetchPlanReserveLedger(...), andrecomputeReserveBalanceSheet(...).
Allocation frozen
Cause:
- Allocation controls are in deallocation-only or freeze mode.
Fix:
- Check allocation and capital-class controls before attempting new utilization.
Queue only
Cause:
- A capital surface is operating in queue-only mode.
Fix:
- Use
buildRequestRedemptionTx(...)and wait forbuildProcessRedemptionQueueTx(...)rather than expecting immediate exit.
Invalid claim state
Cause:
- The claim case or obligation is not in a state that permits the requested transition.
Fix:
- Inspect
fetchClaimCase(...)orfetchObligation(...)and only apply valid state transitions.
Builder and PDA issues
Seed ID length
Cause:
- A plan, series, funding-line, pool, class, or obligation identifier triggered
seed id must be 1..32 UTF-8 bytesbecause it exceeds PDA seed limits.
Fix:
- Validate identifiers with
isSeedIdSafe(...)orassertSeedId(...).
Account discriminator mismatch
Cause:
- The address does not point to the account type you tried to decode.
Fix:
- Re-derive the address with the canonical PDA helper.
- Confirm the
programIdand cluster are correct. - Use
fetch...(...)readers instead of ad hoc decoding where possible.
Package subpath not exported
Cause:
- Your import returned
ERR_PACKAGE_PATH_NOT_EXPORTEDbecause the subpath is not part of the public export map.
Fix:
- Use one of the documented public subpaths such as
@omegax/protocol-sdk/protocol_models,@omegax/protocol-sdk/protocol_seeds, or@omegax/protocol-sdk/transactions. - Check SDK API Reference and Release Notes before using a newly mentioned package subpath.
Reserve and capital issues
Capital subscriptions fail unexpectedly
Cause:
- The capital class may be paused, restricted, or credential gating may be missing.
Fix:
- Inspect
fetchCapitalClass(...). - Check
describeCapitalRestriction(...).
Redemptions do not process
Cause:
- The position may still be locked, queue-only controls may apply, or redeemable capital may be insufficient.
Fix:
- Inspect
fetchLPPosition(...),fetchPoolClassLedger(...), andfetchDomainAssetLedger(...). - Recompute the reserve sheet with
recomputeReserveBalanceSheet(...).
Sponsor budget or premium math looks wrong
Cause:
- You may be reading gross vault balance instead of attributed ledger state.
Fix:
- Treat free capital as ledger-derived, not raw token balance.
- Use
buildSponsorReadModel(...)orbuildCapitalReadModel(...)for higher-level views.
Version and surface mismatch
If a documented helper, account, or subpath is missing in your installed package:
- Confirm the installed package version with your package manager.
- Compare it with SDK Release Notes.
- Reinstall or upgrade
@omegax/protocol-sdkif your lockfile is still pinned to an older release. - Re-run
npx @omegax/protocol-sdk doctor.
If the mismatch persists, capture the SDK version, cluster, programId, and the
smallest code sample that reproduces the issue.
If issues persist
- Capture the transaction signature.
- Preserve simulation logs.
- Record SDK version, cluster,
programId, and the package subpath or helper you used. - Reduce the failure to the smallest
build...Tx(...)call that still reproduces the issue.