Skip to main content
In a few minutes you will broker a real capability on Robinhood testnet: discover a price, sign one order with your own key, submit it to a relayer, and watch the settlement on the explorer. The first instruction is a key and a signature.
No account. No API key. No dashboard. Nevermined requires a dashboard login and an NVM_API_KEY before your first call; Skyfire requires an account, KYA, and a funded wallet. Caplane reaches a real on-chain settlement with none of these. You bring a key; the relayer is only msg.sender.
1

Get the quickstart

Clone the repository (the guaranteed path, no version skew) and install:
git clone https://github.com/DavidZapataOh/Caplane && cd Caplane
pnpm install
2

Bring a key and fund it

Use a throwaway testnet key as CONSUMER_PK (environment only, never a flag, never logged). It signs; it needs no ETH. Fund its address with TestUSDC from the faucet so it can pay for a capability.The server never sees or holds your key. You sign locally; only the resulting signature leaves your machine.
3

Have a relayer to submit to

The relayer is permissionless, so you can run your own with one command (it only needs a gas key) and submit to it locally:
RELAYER_PK=0x<a-testnet-gas-key> pnpm --filter @caplane/relayer start
# serves POST /broker + GET /info on http://localhost:8787
Or point CAPLANE_RELAYER_URL at any hosted relayer. The relayer transmits your order and earns feeBps; it can never tamper with it (see the binding).
4

Run one command

CONSUMER_PK=0x… pnpm join
Under the hood this is about ten lines over the SDK, signing with your own account and submitting to the relayer:
import { connect } from "@caplane/consumer-agent";

const caplane = await connect({
  chainId: 46630,                               // Robinhood: the Allocation floor
  relayerUrl: process.env.CAPLANE_RELAYER_URL!, // any relayer; default http://localhost:8787
});

const slot = await caplane.buyAllocation({
  account,                                      // your LocalAccount; signs locally, never broadcasts
  vaultId: 1n,
  feeBps: 100,                                  // the relayer's incentive
});

console.log(slot.txHash, slot.slotTokenId, slot.explorerUrl);
connect discovers the live quote, builds the order, signs the EIP-3009 authorization (nonce = orderHash), submits it, and decodes the receipt.
5

See it settle

The command prints the real orderHash, the txHash, the explorer link, and the minted slot. A real run looks like this (this settlement is real; click it):
orderHash   0x4c7aac9359ac3cf807e312c24fed6501aa61dfcc9c03a73c66618f6d7db9b0f9
settled     tx 0xb89a566248c40431342c32281b6875e6113cd797cd82fb2d9153646abcabd845
capability  allocation slot #1  (granted to your address)
paid        5.000000 TUSDC      (provider 4.950000 + relayer 0.050000, feeBps 100)
verify      https://explorer.testnet.chain.robinhood.com/tx/0xb89a566248c40431342c32281b6875e6113cd797cd82fb2d9153646abcabd845
Open the explorer link to confirm the Brokered event and the minted slot on-chain.

What just happened

  • You signed one order. Its nonce was the order hash, so a relayer could not tamper with it (the binding).
  • The broker settled the payment, granted the slot, and paid out in one transaction, or it would have reverted (how it settles).
  • The relayer earned feeBps. You created no account and held no API key.

Go deeper