tesseract

Quickstart

Testnet swap group in fifteen minutes.

Tesseract is MIT-licensed and fully self-hosted. Clone it, run the tests, deploy the contracts, run the relayer, and create your first cross-rollup atomic swap group. No accounts, no hosted service, no API keys.

  1. 01

    Clone and install

    Clone the MIT-licensed repository and install the Vyper and Rust toolchains. Everything is self-hosted — there is no hosted service to sign up for.

    git clone https://github.com/cryptuon/tesseract
    cd tesseract
    
    # contracts
    pip install vyper
    # relayer
    rustup toolchain install stable
  2. 02

    Run the test suite

    Before deploying anything, run the 135-test suite. It covers compilation, tokenomics, access control, safety, and cross-chain integration scenarios.

    # compile all seven Vyper contracts + run tests
    make test
    
    # expected on main: 86 passed, 40 xfailed, 9 xpassed
  3. 03

    Deploy the contracts to a testnet

    Deploy the seven Vyper contracts to each rollup you want to coordinate — Sepolia, Amoy, and the L2 testnets are supported out of the box.

    # deploy to Arbitrum Sepolia + Base Sepolia
    make deploy NETWORK=arbitrum-sepolia
    make deploy NETWORK=base-sepolia
    
    # note the deployed TesseractBuffer + Coordinator addresses
  4. 04

    Run the relayer

    Point the Rust relayer at each chain's RPC and the contract addresses. It monitors events over WebSocket with HTTP failover and persists state in PostgreSQL.

    export DATABASE_URL=postgres://localhost/tesseract
    export RPC_ARBITRUM_SEPOLIA=wss://...
    export RPC_BASE_SEPOLIA=wss://...
    
    cargo run --release --bin relayer
  5. 05

    Create a swap group

    Submit a commitment for each leg with a shared swap_group_id and a deadline. Reveal after one block; the relayer coordinates resolution across chains, or the group refunds after the deadline.

    # leg A on Arbitrum, leg B on Base, one shared group id
    GROUP=$(cast keccak "arb-base-demo-001")
    
    cast send $BUFFER_ARB "buffer_transaction_with_commitment(bytes32,bytes32,bytes32,uint256,address)" \
      $TX_A $COMMIT_A $GROUP $DEADLINE $REFUND
    cast send $BUFFER_BASE "buffer_transaction_with_commitment(bytes32,bytes32,bytes32,uint256,address)" \
      $TX_B $COMMIT_B $GROUP $DEADLINE $REFUND
    
    # reveal after 1 block, then the relayer resolves the group