The test hub

The public test hub is https://proxy-api.infinimesh.net, with its API under https://proxy-api.infinimesh.net/v1. Pass the origin as baseUrl: the SDK adds /v1 (a trailing /v1 is accepted too). It runs on test networks only. Call it from your backend with your secret key, or from a page with your project id. Its gateway never takes a secret key from a browser.
  • Test funds: CTM from the Continuum testnet faucet. For the other test assets, swap CTM for them through the test hub itself, or ask the hub team.
  • Lanes: the test hub offers wrap-native, evm-permit2, swap-token and solana-escrow; not evm-3009 or open-flow yet.
The test hub has its own catalog, and its contract addresses change when it is redeployed. Build everything from the catalog.

Keys and project ids

Your organization, its project and its keys live in the hub dashboard, proxy-admin.infinimesh.net for the test network: the API has no sign-up and no key routes.
  • A secret API key (c8n_sk_…) for your servers and scripts: make one for your project, and keep it in your secret store or in a git-ignored .env file as HUB_API_KEY.
  • The project id (c8n_pk_…) for your web pages: it is on the project page, public by design. List the origins of the pages that use it (http://localhost:5173, for example, while you develop).
Check a key with one call that needs it:
A 200 means the key is accepted. A 401 means it is not: EPX0001 for a value that is not in the key’s format (a typo, a stray space, a truncated copy), EPX0002 for an unknown, revoked or expired key. Fix it before trying again: 20 refused credentials within a minute lock your IP out of every call for the rest of that minute (EPX0081). The node quickstart’s pnpm smoke starts with the same check. To try the flows in a browser without a server, use the project id: list the page’s origin on the project (http://localhost:5173 for the bridge demo’s pnpm dev; the hosted demo, https://demo.infinimesh.net, too if you connect it with your project id), or leave the list empty while you test (Browser apps).

Test wallets

Use keys made for testing, holding nothing on any real network.
A test “Ethereum” that is a mainnet fork answers chain id 1, exactly like real Ethereum. A transaction or a Permit2 signature made for the fork is valid on real mainnet too: anyone can replay it there. Never test with a key that holds real funds, and pin the fork (below) so the SDK refuses to sign if your RPC points at the real network.
On a server, or in a script:

Chain-instance pins

A pin names one block, by number and hash, that only the chain you mean contains. Before the first signature or transaction on that chain, the wallet adapter reads that block and refuses unless the hash matches (WalletError, reason wrong-chain). Ask the hub team for a block of their fork: it changes whenever they reset it. The examples read pins from .env as PIN_EIP155_<chainId>=<blockNumber>:<blockHash>. See Chain-instance pins.

The examples

The SDK repository has three runnable examples, each configured by a git-ignored .env copied from its .env.example: Start with the smoke test. It checks your key with one call, reads the catalog, then asks for a preview and a quote on every route and runs the pre-signing checks on each quote. It needs no funds, and signs nothing:
Then one order per lane you offer, with small amounts:
To run the browser demo through the proxy, start the proxy first (pnpm --filter @c8ntinuum-examples/proxy-server dev, then pnpm --filter @c8ntinuum-examples/bridge-demo dev). Through the proxy, the demo reaches the RPCs through its relay, POST /api/rpc/<chain>, so a keyed RPC URL stays on the server. The demo’s Connection card can also call the test hub directly, with your project id: every route but the order history is open that way.

Testing a refund

There is no way to force a refund: an order becomes refundable only once its deadline has passed with no fill (see Refunds). On a test hub:
  1. Get an order nobody will fill. Ask the hub team, or open one on the escrow yourself with an output no solver will fill (an absurd amount) and a short deadline.
  2. Wait in real time, until the source chain’s clock is past the deadline and the hub’s destination observer has read past it too. checkEvmRefund says not-yet until then.
  3. Refund it with refundEvmOrder (or pnpm refund --id <onchainOrderId>), and check that the escrow paid the wrapped coin back.
Never move a shared test chain’s clock (evm_increaseTime, evm_mine with a timestamp) to reach a deadline: every other user of that fork, and the hub’s own observers, run on the same clock.

Before going live

  • Use the production hub’s origin, and a secret key made for production, kept on your servers only.
  • List your production pages’ origins on your project, if your pages use the project id.
  • Keep pins only for test chains: a real network’s chain id is unique.
  • Put your own authentication in resolveUser if you serve pages through createInteropProxy.
  • Run the smoke test against production before you open the flow to users.