Conduit owns the RPC connection
Configure a provider once at its owner, not separately in every chart, wallet and payment control. Conduit supplies bounded HTTP JSON-RPC reads and explicitly gated writes. It is not a WebSocket subscription client, background monitor, chain indexer or token-issuing service.
| Mode | Configuration | What it supplies |
|---|---|---|
offline | No endpoint needed | Explicit unavailability for live requests; not simulated RPC success. |
direct-rpc | rpcUrl, optional permitted rpcToken, network and budgets | JSON-RPC over the configured HTTPS connection. The optional token is sent as x-token. |
external-adapter | externalAdapterUrl, network and budgets | A request envelope to an independently implemented adapter, not a subscription to an existing cApp service. |
Use HTTPS, or explicit loopback HTTP for local development. Endpoint parsing rejects embedded URL username/password and fragments. Paths and query strings can still contain provider credentials: treat the full configured URL as sensitive. An Android loopback address belongs to the phone/emulator, not automatically to your development computer.
First successful connection
- Choose the payment network and provider mode in Library → Conduit → Configure. For the reviewed payment recipe use devnet and select the other required peers.
- Set an endpoint and only a client credential that your provider permits in a distributed application. Leave mainnet write permissions off for this devnet recipe.
- Rebuild the package for build-time changes. When
allowRuntimeRpcSettingsis enabled in a direct-RPC build, use the owning RPC settings form for supported device/session connection changes instead. - Run Test & use connection in that form, or call
verifyNetwork()for the devnet primary connection. A network label andstatus.readyare not observations of the actual chain. - Make one bounded read such as a balance or version query. Distinguish a valid zero balance from an unavailable/unauthorized/rate-limited request.
- Only then test preflight and explicit devnet submission through Edge. A working balance read does not test wallet authority, policy, simulation or the write gate.
The runtime settings form changes endpoint/token fields and the optional read connection, not the package's primary payment network or write permissions. A failed test/save keeps the working connection; successful changes invalidate the earlier connection observation. Remembered settings live in app storage, not an encrypted secret vault. Review whether the active settings source is build, device or session.
The separate read-only connection can serve another supported wallet network without changing the payment connection. Asset/balance helpers verify its observed genesis. verifyNetwork() specifically checks the devnet primary connection; do not invent a mainnet argument for that method. Direct inspect() reads a bounded chain fact, not a complete payment verification.
Client credentials are extractable
Credentials in browser assets, a desktop package, an Android package or remembered app settings are available to that client. A hidden field, native wrapper or scoped API does not make those embedded bytes secret. Use only provider-approved client credentials with an appropriate distribution and revocation policy. Backend-only credentials stay in your trusted service.
This build's direct-RPC option sends the optional rpcToken in x-token. It is not a generic bearer/header editor. Requests omit cookies, use no referrer, disable caching and reject redirects. An external adapter does not automatically inherit the direct-RPC token or a browser login cookie. Design and qualify any downstream service authentication separately; do not publish an unrestricted proxy to hide an upstream key.
No operating managed cApp gateway, ephemeral upstream-token issuer, x402 billing or provider account provisioning is supplied by these fields. Solana Edge is the lifecycle coordinator, not that infrastructure. Public examples and documentation do not grant provider access.
Adapter contracts
The downloadable v1 adapter schema describes the request envelope, not all responses, authorization or durable behaviour. Conduit sends the following shape for a devnet genesis check:
{
"protocol": "capp.solana-sidecar-adapter.v1",
"component": "conduit",
"action": "rpc.request",
"network": "devnet",
"input": {"method": "getGenesisHash", "params": []}
}Conduit specifically requires ok: true and the method's actual result in result. It does not accept a successful HTTP status alone or the upstream JSON-RPC envelope nested where a result is expected. This static example contains the genesis constant checked by the supplied devnet runtime; it is not an observed provider response:
{
"ok": true,
"result": "EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG"
}Preserve the requested component, action, network and operation/attempt/digest bindings wherever applicable. Reject unsupported methods and mismatches instead of returning a success-shaped placeholder. Sentinel, Latch, Dispatch and Witness have additional component-specific result requirements; the common request schema alone cannot certify an adapter.
Current contract limit: the published v1 schema enumerates only Conduit, Sentinel, Latch, Dispatch and Witness. Compass, Circuit, Switchyard and Accord also declare external modes in source but their component names are not admitted by that shared schema. Do not advertise those integrations as validated by it. Use their supported local modes for the first composition, or independently agree and test a versioned provider contract before relying on a custom adapter. Expanding an enum alone would not implement a durable ledger or wallet provider.
Budgets, failures and safe retries
Conduit applies a request timeout, per-instance request ceiling and response-size limit. queueRequests can wait for the local rate budget; it is not a durable job queue or automatic submission retry. Provider HTTP 429 adds a cooldown; status exposes remaining retry time. A new connection per click does not create more provider allowance.
| Symptom | Check | Safe next step |
|---|---|---|
OFFLINE / missing endpoint | Selected mode and actual settings source | Configure deliberately; do not substitute another public endpoint. |
| HTTP 401/403 | Provider authorization, client-token header and permitted client use | Correct the owner configuration. Never paste the credential into an issue. |
HTTP 429 / RATE_WAIT | Provider cooldown and local request budget | Reduce/pause reads and retry deliberately after the reported wait. |
FETCH / TIMEOUT | Connectivity, TLS, browser CORS, endpoint and redirect behaviour | Retry a read later; reconcile any possibly submitted transaction. |
CLUSTER_MISMATCH | Observed genesis versus intended devnet | Fix the endpoint; do not disable verification to make it pass. |
WRITE_DISABLED / MAINNET_DISABLED | Build-time transport policy | Change only through an authorised build decision; no app-side bypass. |
ADAPTER_REJECTED | Actual envelope/result and adapter policy | Inspect the contract and service logs privately, not a permissive fallback. |
RESPONSE_LIMIT | Query breadth and response size | Use a smaller query/page or an appropriate data service. |
Do not treat successful TCP/HTTP delivery, getHealth, a configured endpoint or a signature returned by send as equivalent evidence. Recovery starts with the saved attempt when the result is uncertain.
Stay lightweight
Token-account helpers report truncation; activity is cursor-paged RPC history. Preserve before/cursor state and application read budgets instead of fetching the whole chain on a phone. A provider can omit old history: “not found” is not proof that a payment never happened.
Use managed data/RPC services when your product needs indexed history, and keep that service boundary separate from the local application. This does not turn Conduit into an oracle or chain-wide ingestion stack. See Conduit's API and credential guidance for the exact exposed controls and sharing limits.