The bridge and wrapped coins
You are looking at an old version of this page: revision #80 by zoobc.how, 2026-10-26 20:39 UTC. See the current version
The bridge connects ZooBC with Bitcoin and Ethereum. Coins deposited at a custody address on those chains appear on ZooBC as wrapped coins, one for one, and can be sent back the same way. No single party runs it: the registered nodes vote, and the chain mints or burns only when two thirds of them agree.
The bridge coins
Four of the fourteen genesis coins are bridge coins:
| Coin | Stands for |
|---|---|
| ZBTC | bitcoin |
| ZETH | ether |
| ZUSDC | USDC, an ERC-20 token on Ethereum |
| ZUSDT | USDT, an ERC-20 token on Ethereum |
Each has a custody address on its home chain, fixed in the genesis and committed to the genesis hash. GET /api/v1/bridge/coins lists the four. The other ten genesis coins have no custody address. Symbols of 4 or 5 characters that start or end with Z are reserved for this namespace, so no user token can take a bridge coin's name (see issuing a token).
Keepers and votes
A ZooBC node watches no foreign chain. A separate keeper program, zbc-bridge, runs beside a node that has a bridge configuration. It watches the custody addresses and votes on ZooBC with AttestEvent transactions (see triggers and attestations): a deposit vote's event id starts with ZBRDEP1: and a withdrawal vote's with ZBWDR1:. Each vote is a fee-free duty, sent with a fee of exactly 0 from the node's own key.
Deposit: coins in
- The user sends coins to the custody address on Bitcoin or Ethereum.
- Each keeper that sees the confirmed deposit sends an attestation naming the deposit and a value: the token, the amount and the ZooBC recipient.
- At the end of every block the chain tallies the votes. When two thirds of the registered nodes (8 of 11, for example) have attested exactly the same value, every node mints that amount to the recipient, one for one and with no bridge fee, and the event is closed for good.
Suspended seats neither vote nor count, but the bar stays at two thirds of the whole registry. Two safeguards apply on top:
- A daily cap. If a deposit would take one day's mints of a coin (the last 5,760 blocks) above the larger of one whole coin and 10 % of its supply, every seat that is not suspended must agree, and never fewer than two thirds of all seats.
- The registry floor. No bridge decision resolves while the registry is below its floor of max(3,
min_registry_size) seats and distinct owners (see two-thirds rules).
Withdrawal: coins out
- The user sends the wrapped coin with an ordinary TransferToken to the custody account, with the message
ZBW1|followed by the destination address. That transfer is the request: no BurnToken is involved, and the user sends nothing on the foreign chain. - Keepers act only once the request is final, which takes between about 3 and about 27 hours after its block (see finality and rollback). Each keeper's vote names the request, the token, the amount and the destination, and carries that keeper's signature for the foreign chain.
- When two thirds agree, every node checks the request again and burns those units from the custody account.
- The keepers' collected signatures, readable through the API, authorise the release of the coins to the destination.
An event that receives no new attestation for 720 blocks (3 hours) drops out of consideration.
Wrapped coins on ZooBC
Once minted, a wrapped coin is an ordinary genesis token with 8 decimals: it can be sent, escrowed, streamed, offered in a swap or traded on a market. Its supply changes only through the bridge, and MintToken and BurnToken are refused on it. Bridge mints are not split by the recipient's split policy (see split and transact policies). Burns of wrapped coins are counted in the chain's burn tally, which for ZBC itself stays at zero.