Skip to content

Sign Bidirectional Flow

The Sign Bidirectional flow enables cross-chain transaction execution with verified response callbacks. It allows a source chain contract to execute a transaction on a destination chain and receive the execution result back on-chain with cryptographic proof.

For example, a Solana program can execute a transaction on Ethereum and receive the contract return value or success/failure status back on Solana—all verified by the MPC network.

Comprehensive Documentation: For detailed documentation including request ID generation, serialization schemas, response verification, error handling, and security considerations, see the Signet Solana Program Rust Docs.

Supported Chains

Source ChainDestination ChainStatus
SolanaEthereumSupported
SolanaBitcoinIn Progress
PolkadotEthereumIn Progress
PolkadotBitcoinIn Progress
HyperliquidEthereumPlanned
HyperliquidBitcoinPlanned

Overview

The bidirectional flow enables a source chain contract to:

  1. Request a signature for a destination chain transaction
  2. Broadcast the signed transaction to the destination chain
  3. Receive the execution result (contract return value or success/failure) back on the source chain
User                   Source Chain              MPC               Destination Chain
  │                         │                        │                        │
  │ sign_bidirectional()    │                        │                        │
  ├────────────────────────►│                        │                        │
  │                         │ SignBidirectionalEvent │                        │
  │                         ├───────────────────────►│ Sign & store           │
  │                         │◄───── respond() ───────┤                        │
  │ Poll signature          │                        │                        │
  │◄─ SignatureRespondedEvent                        │                        │
  │                         │                        │                        │
  │ Broadcast ──────────────┼────────────────────────┼───────────────────────►│
  │                         │                        │◄──── Observe tx ───────┤
  │                         │◄─ respond_bidirectional()                       │
  │ Poll response           │                        │                        │
  │◄─ RespondBidirectionalEvent                      │                        │
  │                         │                        │                        │

Flow Steps

  1. Sign Request: User calls sign_bidirectional with a serialized unsigned transaction for the destination chain
  2. Signature Delivery: MPC signs the transaction and returns the signature via respond()
  3. User Broadcast: User assembles and broadcasts the signed transaction to the destination chain
  4. Observation: MPC Indexer (using a light client) observes the destination chain and detects confirmation
  5. Output Extraction: MPC extracts execution result (contract return value or transfer success)
  6. Response Callback: MPC calls respond_bidirectional with the result and a cryptographic proof. The RespondBidirectional event is indexed and sent to processing on the source chain contract

Related Documentation