> ## Documentation Index
> Fetch the complete documentation index at: https://docs.molpha.io/llms.txt
> Use this file to discover all available pages before exploring further.

# How Molpha Works

> From API request to verified value: feeds, rounds, aggregate signatures, payments, and cross-chain verification.

## The flow

<Frame>
  <img src="https://mintcdn.com/molpha/ODmLUZ2hC1cOFhQO/img/flow.png?fit=max&auto=format&n=ODmLUZ2hC1cOFhQO&q=85&s=918ad9a59f0afbeb551452912b5d7ad7" alt="Molpha flow: App -> Gateway -> Nodes -> Signed Payload" data-og-width="2195" width="2195" data-og-height="1843" height="1843" data-path="img/flow.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/molpha/ODmLUZ2hC1cOFhQO/img/flow.png?w=280&fit=max&auto=format&n=ODmLUZ2hC1cOFhQO&q=85&s=5a4342000fa4a3624829ffdabe98d474 280w, https://mintcdn.com/molpha/ODmLUZ2hC1cOFhQO/img/flow.png?w=560&fit=max&auto=format&n=ODmLUZ2hC1cOFhQO&q=85&s=414384a3eab701cc21402417aa5ad22d 560w, https://mintcdn.com/molpha/ODmLUZ2hC1cOFhQO/img/flow.png?w=840&fit=max&auto=format&n=ODmLUZ2hC1cOFhQO&q=85&s=f09d7ab7457bcbc33f32e28021f2fe49 840w, https://mintcdn.com/molpha/ODmLUZ2hC1cOFhQO/img/flow.png?w=1100&fit=max&auto=format&n=ODmLUZ2hC1cOFhQO&q=85&s=ad3c6749dc461aae13674803a5c42727 1100w, https://mintcdn.com/molpha/ODmLUZ2hC1cOFhQO/img/flow.png?w=1650&fit=max&auto=format&n=ODmLUZ2hC1cOFhQO&q=85&s=8927ae6f0624d8ebf1d5a897dd1fe056 1650w, https://mintcdn.com/molpha/ODmLUZ2hC1cOFhQO/img/flow.png?w=2500&fit=max&auto=format&n=ODmLUZ2hC1cOFhQO&q=85&s=b69a7832bcb0af67e1b360d516f1af6c 2500w" />
</Frame>

## Step by step

1. **A feed is identified.** The feed commits to an off-chain API configuration via `apiConfigHash`; only the hash is stored on-chain. The feed identity is derived from `owner`, `apiConfigHash`, and `signaturesRequired`.
2. **Access is checked.** The request uses a subscription owner or [Delegate](/access-models/delegates), or [x402 escrow](/access-models/x402) pay-per-request.
3. **A round is requested.** A gateway round runs against the current on-chain registry version: a deterministically selected subset of nodes independently fetches the API, converges on a canonical value, and produces a single aggregate Schnorr signature.
4. **The result is a self-contained payload.** A `DataUpdate` (feedId, registryVersion, signaturesRequired, value, canonicalTimestamp) plus a `SchnorrSignature` (scalar `s`, commitment address, signers bitmap). The signers bitmap is bound into the signed message — the signer set cannot be chosen after the fact.
5. **Any chain verifies it.** Each verifier re-derives the eligible signer selection from the payload itself, reconstructs the coalition public key as the plain EC sum of the actual signers' keys, and checks one Schnorr signature. The same payload verifies on Solana, EVM, and Starknet.
6. **Consumption.** On Solana, `submit_data_update` writes the verified value to a `Feed` account anyone can read, or Rust consumers verify directly with `molpha-verifier`. On EVM and Starknet, your contract calls `verify()` and applies its own freshness policy.

## Key properties

* **Pull-native.** Rounds run on demand. There is no heartbeat to fund and no per-chain feed maintenance.
* **One signature, every chain.** No `chainId` in the signed message; identical domain-separated hashing on every verifier.
* **Agent-ready economics.** Brebeneskul adds x402 and escrow-based request payment without changing the payload that apps verify.
* **Selection is verifiable on-chain.** The eligible signer group is derived from `(feedId, registryVersion, canonicalTimestamp)` — a caller cannot grind a favorable signer set.
* **Verification is stateless on EVM/Starknet.** A successful `verify()` proves *who signed what*. Freshness, replay protection, and value bounds are the consumer's policy.
