QTG v3 Overview
What is QTG?
One-liner: A “secure courier system” that safely automates asset movements between exchanges. Think about what it takes to send coins between exchanges. To move USDC from Upbit to Binance:- Submit a withdrawal request
- Confirm the withdrawal went through
- Confirm it arrived on the other side
- Intervene manually if something fails…
The courier company analogy
Comparing QTG to a courier company makes the concept intuitive:Where QTG fits
Most wallet and key-management platforms compete on custody — who holds the keys, in what hardware, behind which treasury UI. QTG competes on a different axis: operational control depth, while staying non-custodial.QTG sits in the 'deep control, non-custodial' corner — control depth comparable to enterprise custody platforms, without holding your keys.
Direct comparison
QTG is a movement control plane: signing, policy, and budget are coded into the path right before your strategy code can touch funds. You get deep control — allowlists, an approval/risk policy plane, a budget ledger, and reservation gates — while staying non-custodial and priced for a small team. And because QTG sits in your signal → movement loop, it is designed to judge “this withdrawal is abnormal for this strategy’s state” — context a custody vendor structurally cannot see.
The threat QTG is built for isn’t an external attacker stealing your keys — it’s your own strategy code bugging out at 3am and trying to move 10× the intended size to the wrong venue, in a loop. A valid key just signs it. QTG’s policy layer is the gate that stops it.
Movement Guard Architecture
- Graph-based Plan Template: Defines the execution graph as nodes and edges
- Universal Transport: CEX (Upbit/Binance/Bybit/Coinbase/OKX, plus Bithumb in Pro), CCTP, CCIP, USDT0/LayerZero, Gateway, and Hyperliquid topup. deBridge is illustrative only — it is not implemented.
- Executor/Signer Protocol: A standard interface that allows executors to be written in any language
- Compiled Plan Hash: Approval is bound to “this exact plan” — the plan cannot be tampered with after approval
Why “v3”? v1 (transfer_guard) was originally a CEX-only transfer guard. v2 was a step execution refactoring plan, but as the v2 design progressed, the conclusion was “a full redesign is better.” v1 was deleted, the v2 planning docs were kept as historical reference only, and v3 started as a clean slate.
Why was it built?
1. Why it was separated from Hummingbot
Asset movements between exchanges were originally embedded inside the Hummingbot trading bot. The problems were:- Trading logic and transfer logic mixed together: If the bot died, the transfer died with it
- No security boundary: Trading strategies called withdrawal APIs directly — a strategy bug meant asset exposure risk
- Lack of operational visibility: Hard to track “how far along is this transfer right now”
2. CEX → Bridge expansion
Sending between CEX exchanges alone is straightforward. But for DeFi strategies you need:- CEX withdrawal → on-chain wallet → bridge to another chain → deposit into a DEX
The full flow at a glance
What happens at each stage?
Stage 1 — Intake (Movement creation)- An external system requests “send this amount using this template”
- The Plan compiler validates the graph + generates a deterministic hash
- This hash is what gets approved — it guarantees “what I approved is what gets executed”
- The operator reviews the compiled_plan_hash and approves or rejects
- On approval, frontier nodes transition from
BLOCKED→READY - If not approved within the TTL, the movement expires automatically
- The Node Dispatcher picks up READY nodes and executes them:
preflight→ precondition checks (can we withdraw? is the address correct?)prepare→ prepare the action to execute (create a PreparedAction)sign→ request a signature from the Signer if neededsubmit→ actually execute (submit withdrawal, burn tx, etc.)
- The Node Observer polls submitted nodes waiting for completion
- When a node completes, the frontier advances to the next node
- All nodes complete →
COMPLETED - Unrecoverable failure →
FAILED - Ambiguous state (withdrawal went through but deposit not confirmed) →
MANUAL_INTERVENTION
Concrete Proving Lanes
Routes that are “actually E2E verified” — not just “theoretically possible”:- CEX Lane: withdrawal → withdrawal confirm → deposit confirm (Upbit/Binance/Bybit/Coinbase/OKX; Bithumb via the Pro adapter)
- EVM Wallet: CEX withdrawal → receive/finality confirmation on EVM chain
- CCTP Lane: burn → attestation → mint → mint_receive_observe → mint_finality (5 nodes)
- Gateway Lane: intent (EIP-712 sign + API) → mint → finality (3 nodes)