The Modular ZK
Interoperability Layer

Union connects the next generation of blockchains and rollups, across any ecosystem.

Launch Testnet App ->

The Endgame of Infrastructure

Efficient zero-knowledge cryptography and consensus verification are the holy grail of interoperability. Union makes protocols fast, trustless and permissionless.

CometBLS V3
ZkMint
TendermintX
Fraud-proof bridges
60x
faster
DVN Performance

Scale the Modular Stack

Union is the first infrastructure layer that unifies thousands of networks, unlocking horizontal scalability for any protocol.

Supports Any Execution Environment

Build whatever, wherever.

contract DexPortal is IBCAppBase {
  function swap(
    address base,
    uint256 amount,
    uint256 minReturn,
    uint64 timeout
  ) public {
    Proxy quote = swapProxies[base];
    IERC20(base).transferFrom(
      _msgSender(),
      address(this),
      amount
    );
    ibcHandler.send(
      quote.port,
      quote.channel,
      timeout,
      abi.encode(
        Swap({
          origin: _msgSender(),
          amount: amount,
          minReturn: minReturn
        })
      )
    );
  }
}
fn swap(
    deps: Deps,
    env: Env,
    info: MessageInfo,
    base: String,
    amount: Uint256,
    min_return: Uint256,
    timeout: u64,
) -> Result<Response, Error> {
    let proxy = SWAP_PROXIES.load(&deps.storage, base)?;
 
    Ok(Response::add_message(wasm_execute(
        base,
        &cw20::msg::TransferFrom {
            owner: info.sender,
            recipient: env.contract.address,
            amount,
        },
        vec![],
    ))
    .add_message(IbcMsg::SendPacket {
        channel_id: proxy.channel,
        data: Swap {
            origin: info.sender,
            amount,
            min_return,
        },
        timeout: IbcTimeout::with_block(timeout),
    }))
}
contract DexPortal is IBCAppBase {
  function swap(
    address base,
    uint256 amount,
    uint256 minReturn,
    uint64 timeout
  ) public {
    Proxy quote = swapProxies[base];
    IERC20(base).transferFrom(
      _msgSender(),
      address(this),
      amount
    );
    ibcHandler.send(
      quote.port,
      quote.channel,
      timeout,
      abi.encode(
        Swap({
          origin: _msgSender(),
          amount: amount,
          minReturn: minReturn
        })
      )
    );
  }
}

Blog

Read the latest on Union's developments

Join the Union

Help us build the endgame of interoperability.