symbiotic.relay()

Why relayUse casesDeveloper quickstart

Read documentation

Book demo
Demo
â–Š

The Framework

for Stake-Secured

|

Relay Apps are language-agnostic and turn any computation, data or an event into stake-securely attested programmable outcomes that settle cross chain.

Book DemoLearn More

Audited by

Early adopters

Audited by

Early adopters

Audited by

Early adopters

>1M

MAX OPERATORS SUPPORTED

<=400k

VERIFICATION GAS COST

40MS

PROOF TIME

Why Relay

Built for developers who demand speed, security, and scalability without compromise.

Cheaper at Scale

Constant EVM verification gas via BLS aggregation/compression — no linear scaling.

Cross-Chain by Default

Works across EVMs, Cosmos, L1/2/3 with unified interface — no chain-specific code.

Stake-Backed Security

Economic guarantees and slashing — no reliance on multisigs or trusted parties.

Unified Interface

One attestation flow for any workload — no more custom verification logic per use case.

Language-Agnostic

Lightweight clients in Go, Rust, TypeScript. Bring your own compute runtime.

Cost Predictable

Pay only for validator set settlement and on-chain verification — transparent pricing.

Use Cases

From vaults to bridges, Relay powers the next generation of cross-chain applications

Bridges and Crosschain Message Passing

Secure, efficient cross-chain communication with stake-backed guarantees.

Learn More

Cloud & Compute

Decentralized Docker — verifiable off-chain computation with on-chain settlement.

Data Availability Attestations

Cryptographic proof that data is available and accessible across networks.

Liquidity Management

Symbiotic turns idle vault liquidity into safe productive credit, gives you instant usability for slow to settle assets, and backs every promise with real money at risk.

Chain Agnostic Applications

Turn any source-chain event into a stake-secured attestation that you can verify natively on your Cosmos app (module or contract) and act on immediately.

Oracles & Data Feeds

Trust-minimized data feeds with cryptographic verification and slashing.

Audited by

Early adopters

Audited by

Early adopters

Audited by

Early adopters

Developer Quickstart in 5 minutes

Clone and install dependencies

Clone the Symbiotic Super Sum repository, initialize its submodules, and install the dependencies

Generate the network configuration

Generate the local network definition and helper artifacts Docker uses to start the stack

Start the network

Launch the Anvil chains, deployer, and relay services defined in the generated Compose file

import { createClient } from "@connectrpc/connect";
import { createGrpcTransport } from "@connectrpc/connect-node";
import { SymbioticAPIService } from "@symbioticfi/relay-client-ts";
import {
  GetLastAllCommittedRequestSchema,
  SignMessageRequestSchema,
  ListenProofsRequestSchema,
} from "@symbioticfi/relay-client-ts";
import { create } from "@bufbuild/protobuf";

async function main() {
    const transport = createGrpcTransport({
        baseUrl: "http://localhost:8080",
    });
    const relayClient = createClient(SymbioticAPIService, transport);
    
    const getLastAllCommittedRequest = create(GetLastAllCommittedRequestSchema);
    const getLastAllCommittedResponse = await relayClient.getLastAllCommitted(getLastAllCommittedRequest);
    const epochInfos = getLastAllCommittedResponse.epochInfos;
    let suggestedEpoch = 0;
    for (const epochInfo of epochInfos) {
        if (suggestedEpoch === 0 || epochInfo.lastCommittedEpoch < suggestedEpoch) {
            suggestedEpoch = epochInfo.lastCommittedEpoch;
        }
    }

    const signMessageRequest = create(SignMessageRequestSchema, {
        keyTag: 15, // default key tag - BN254
        message: message.into(),
        requiredEpoch: suggestedEpoch,
    });
    const signMessageResponse = await relayClient.signMessage(signMessageRequest);

    const listenProofsRequest = create(ListenProofsRequestSchema, { startEpoch: suggestedEpoch });
    const proofsStream = await relayClient.listenProofs(listenProofsRequest);
    let aggregationProof;
    for await (const proofResponse of proofsStream) {
        if (proofResponse.requestId === signMessageResponse.requestHash) {
            aggregationProof = proofResponse.aggregationProof?.proof;
            break;
        }
    }

    await appContract.completeTask(taskId, signMessageResponse.epoch, aggregationProof);
}
Copy

Open Quickstart

Start Building

Join the growing ecosystem of developers building the future of cross-chain infrastructure with Relay

Read DocumentationView on GitHub

R

Relay

Built on Symbiotic

The framework for stake-secured cross-chain systems

Developers

DocumentationGitHub