For researchers

Submit work to the swarm

The Client workspace is for researchers and developers who send quantum simulation jobs. Workers around the world bid, compute, and prove — you track progress and pay from your client balance.

Quick path

  1. 01 · FundClaim Client faucet credits (10 test $WQC / day). This balance pays escrow — separate from Node rewards.
  2. 02 · Quote & submitOn Submit Task, set qubits, paste circuit JSON, pick an output mode, then submit when escrow looks right.
  3. 03 · Watch progressStatus updates on the submit page. History and spend live under Task History.
  4. 04 · Read the ledgerEvery lock, debit, and refund appears in the Ledger.

Using Submit Task

The form quotes escrow from qubit count, gate count, and security level before you send. Insufficient balance disables submit until you top up via the faucet.

FieldWhat it does
Qubit countWidth of the circuit (UI range 1–32). Must match the largest qubit index in your JSON.
Security levelFRI proof tier: low / normal / high / ultra. Higher tiers cost more escrow and take longer.
Output modeWhat result you want back — see modes below. Switching modes loads a matching sample circuit.
Circuit JSONAn array of gate objects. Gate count drives the quote. Invalid JSON is rejected before submit.
Shots / classical bitsOnly for sample_counts. Shots is how many times to sample; classical bits size the bitstring register.
Observables JSONOnly for expectation. Named Pauli terms with coefficients (see the sample on the form).

Output modes

  • statevector_scalar

    Full statevector / scalar readout for the simulated amplitudes. Good default for small circuits (Bell state sample uses H + CNOT).

  • sample_counts

    Measurement sampling. Add MEASURE gates that map qubit → cbit, set shots and classical bit count.

  • expectation

    Observable expectation values. Provide an observables list (e.g. Pauli ZZ). Circuit itself is usually unitary; measurements are encoded in the observables, not MEASURE gates.

Circuit JSON

Circuits are a JSON array. Each gate is { "type": "…", "params": … }. Qubit indices are zero-based.

[
  {"type": "H", "params": [0]},
  {"type": "CNOT", "params": [0, 1]},
  {"type": "MEASURE", "params": {"qubit": 0, "cbit": 0}},
  {"type": "MEASURE", "params": {"qubit": 1, "cbit": 1}}
]

Supported gates

  • Single-qubit: H X Y Z S T RX RY RZ
  • Two-qubit: CNOT CZ
  • Three-qubit: CCNOT
  • Measure: MEASURE { qubit, cbit }
  • Also accepted in the IR: RESET, IF (advanced / limited)

Rotation gates take [qubit, angle] style params; Pauli / Clifford take qubit indices only.

Not supported (yet)

  • OpenQASM / Qiskit / Cirq import — paste WQC circuit JSON only (OpenQASM is deferred).
  • Arbitrary custom gate matrices or opaque black-box unitaries.
  • Noise models, mid-circuit feed-forward beyond the limited IF path, or classical control programs.
  • Turning test $WQC into mainnet value — faucet credits are experimental only.

Escrow, status, and money

  • On submit, escrow is locked from your client balance (testnet) or via L2 permit (mainnet).
  • As slices complete, escrow is debited; unused remainder is refunded when the task settles.
  • Task History shows Used / Returned per task; Ledger is the full passbook (lock, debit, refund, faucet).
  • Status flow is roughly pending → dispatched → finalizing → completed (or failed). The submit page polls until a terminal status.

Hard limits

The orchestrator rejects submit payloads that break these rules. If Submit Task returns an error, match the message to a row below.

LimitValueWhen it applies / typical reject reason
qubit_count> 0 (UI 1–32)Always. Must be ≥ every qubit index in the circuit.
security_levellow | normal | high | ultraAlways. Other values are rejected.
circuitnon-empty JSON arrayAlways. Empty circuits are rejected.
output_modestatevector_scalar | sample_counts | expectationAlways. Anything else → unsupported output_mode.
classical_bit_count1–16sample_counts only. > 16 → classical_bit_count exceeds distribution limit 16.
shots≥ 1sample_counts only.
MEASURE / IF cbit0 … classical_bit_count−1sample_counts. Out-of-range cbit is rejected.
Terminal MEASURE count≥ 1 and ≤ 20 measured qubitssample_counts requires terminal MEASURE; too many measured wires exceed the compact register (≤ 20).
Mid-circuit sample_counts qubit_count≤ 20If the circuit uses mid-circuit MEASURE / IF semantics, qubit_count > 20 is rejected (dense trajectory limit).
Terminal-only sample_counts qubit_countMay exceed 20Allowed when all MEASURE are terminal and slicing can shrink to ≤ 20 measured qubits. Still needs workers that can bid.
expectation + MEASUREnot allowedexpectation circuits must be unitary — MEASURE is rejected.
expectation observablesrequired, valid PaulisEmpty / invalid observables or labels wider than qubit_count are rejected.
OpenQASM / Qiskit / Cirqnot acceptedPaste WQC circuit JSON only (OpenQASM import is deferred).

Source of truth: orchestrator ValidateSubmitRequest / MaxSampleCountsClassicalBits=16, MaxSampleCountsCompactQubits=20.

Practical guidance

  • Larger qubit counts and higher security levels need more escrow and more worker RAM — start small (2–8 qubits, normal) while learning.
  • Very wide or deep circuits may wait longer for a worker that can hold the slice, or fail if no node can bid — even when under the hard limits above.
  • Faucet is once per UTC day per balance type (Client vs Node). Plan experiments around that if you burn through escrow quickly.
  • Client and Node share one login but separate balances. Submitting jobs never spends Node reward funds.

Client vs Node

Client pays for work; Node earns by running the miner. Switch with the Client / Node toggle in the header anytime.

Looking to lend spare PC capacity instead? See the worker guide or start dash.