Bridge
COTI's own bridges, called directly from DEVOXPAD.
Two different things are called the bridge
Conflating them is what used to send people away. The privacy bridge moves a token between its public and private form on COTI itself. The cross-chain bridge moves COTI between Ethereum and COTI. Only the second one ever leaves the chain.
Each asset has a verified PrivacyBridge contract on COTI with public deposit and withdraw functions. Any wallet can call them, so there is no reason to open another site to do it. You approve and sign here.
What COTI actually bridges
Seven assets, and nothing else is offered. Each entry below was read off the deployed contract rather than copied from a table, because docs drift and deployments do not.
- COTI, the native coin, through PrivacyBridgeCotiNative
- gCOTI, the treasury governance token
- WETH, quoted against the ETH oracle feed
- WBTC, which carries eight decimals rather than eighteen
- USDT and USDC.e, both six decimals
- WADA, Cardano's token wrapped onto COTI
The contract reverts with DecimalsMismatch unless the public token and its private twin agree. A six decimal stablecoin treated as eighteen would misprice by a factor of a trillion, so DEVOXPAD carries each asset's real precision.
Why a quote expires
The bridge charges its fee in native COTI and converts through COTI's price oracle. To stop a transfer being priced against a quote you never saw, the estimate returns the oracle timestamps it used and the transfer has to hand them back.
(, uint256 cotiLastUpdated,) = oracle.getPriceWithMeta("COTI");
if (cotiLastUpdated != expectedCotiTimestamp)
revert OracleTimestampMismatch(expectedCotiTimestamp, cotiLastUpdated);It is an equality check, not a tolerance, so a quote is void the moment the oracle publishes again. DEVOXPAD re-quotes in the same click that signs, and if the oracle still beats you to it the error says so in words instead of hex.
What happens when you press the button
- 1Re-quote
The fee and the oracle timestamps are refreshed so the transfer is bound to a price that is current.
- 2Approve
The bridge is allowed to pull the token. Going private approves the public token; coming back approves the private twin, whose allowance must be cleared first because PrivateERC20 refuses a non-zero to non-zero change.
- 3Cross
deposit mints the private twin, withdraw burns it and releases the original. One transaction, on COTI, signed here.
For native COTI it is taken out of the amount you send, so you receive slightly less than you deposited. For every ERC20 it is charged separately in COTI and the full token amount crosses untouched.
Ethereum and back
This route has no contract on either side. COTI's own configuration names its destinations recipient addresses, and its relayer credits the far chain when it sees a transfer arrive. That is a plain token transfer, so DEVOXPAD builds it, switches your wallet to the right chain, and signs it here like any other transaction.
eth_getCode 0x61bf10a1a27b2d99de0a59a06200a62ed579d685 -> "0x" an account, not a contract
COTI does not publish addresses for its testnet routes, so none of them were taken on faith. Each was recovered from transfers that had already completed, by asking COTI's tracking service for real crossings and then reading on chain where those transfers actually went.
- Sepolia side: one recipient, confirmed across 16 of 16 transfers of both tokens
- COTI side: one recipient, confirmed across 8 of 8 native and 25 of 25 gCOTI transfers
- One recipient per chain shared by both tokens, the same shape mainnet uses
Neither side takes a destination argument, so the relayer pays out to the sending address on the far chain. Send from a wallet you control, never from an exchange account.
COTI carries COTI and gCOTI on this route and nothing else, which is why the token list is two items long rather than a menu of assets that would never arrive.
Following a transfer
A privacy crossing settles in one transaction, so the receipt is the confirmation and it lands in your history immediately. Cross-chain transfers are the slow kind, and those are read back from COTI's own tracking service rather than inferred from balance changes.
GET https://testnet-apps-1-gw.coti.io/workflow-orchestrator-service
/tracking/get-all-transactions?wallet_address=0x..&page=1&page_size=8
# page_size must be a multiple of four: each transfer occupies four rowsIf COTI's service is unreachable the bridge still works, because the crossing happens on chain and the tracker only reports on it. DEVOXPAD degrades to what it can prove rather than blocking the transfer.