Skip to main content

System Overview

MultiHopper is built as a layered system. The protocol layer enforces all routing guarantees on-chain; the application layer provides the tooling to create and monitor routes.

Smart Contracts

Two on-chain programs implement the protocol:

MultiHopper Core

3jLoS2wbNgtKzieUUxwg6Xhdv6gbZkHDtPWA9ZAgspFhHandles route creation, hop execution, wrap/unwrap operations, fee collection, provider registration, and fee schedule management. This is the primary program for all route interactions.

Orchestrator

4TPCmR2uN3hDM1FbTsf7ZtFXwXGSz4u1Kxv5YHj6eruXA permissionless execution engine that breaks route deployment into discrete keeper-executable steps. Manages the multi-transaction sequence needed to fund and initialize a route on behalf of the creator.

Transfer Hook Guard

2JEv3pD6nczEvn1xDXaEzehkJofPPjoQQpnW5nGY3r52Implements the Token2022 transfer hook extension for all wrapper mints. Enforces that only the protocol program can move wrapper tokens and that every transfer occurs within a valid, active route context.

Key On-Chain Accounts

MultiHopper Core

Orchestrator

Application Layer

Monorepo Structure

The codebase is organized as a Turborepo monorepo:
The Anchor programs live in a separate multihopper-contracts repository.

Full Tech Stack

Architectural Principles

Distribution and execution are intentionally separated. The abstraction layer handles asset routing and intermediate wallet coordination. The hop execution engine handles sequenced transfers. This separation allows each layer to evolve independently and makes the security boundary cleaner. Permissionless execution. No single entity controls whether a route executes. Any keeper can trigger orchestrator steps or hop executions — the program validates correctness, not identity. Off-chain indexing, on-chain authority. The indexer and API provide a convenient read layer, but they hold no authority over funds. All state that matters for settlement is on-chain. Provider extensibility. Integrators can register as providers via register_provider, attach a provider_id to routes, and configure per-provider fee tiers via initialize_fee_schedule / update_fee_schedule.