Docs / Cross-chain / Bridge

Dogecoin ↔ DogeOS

Bridge

DogeSoftBridge 2.6.0-ds-standard on DogeOS testnet: DU$T live, 6 confirmations, 2-of-3 attesters, ds-standard bridge inscriptions.

Live

Doge Soft Bridge moves DRC-20 Coins between Dogecoin L1 and DogeOS. Outward is lock-and-mint; back is burn-and-release. Both sides are settled by DogeSoftBridge 2.6.0-ds-standard, a multi-attester contract on DogeOS, not a single hot-wallet approver. Every bridge inscription uses the Doge Soft Inscription Standard.

ℹ️

DogeOS testnet: successful round trip. bridge.dogesoft.io Β· first coin: DU$T. The first full DU$T round trip (Dogecoin β†’ DogeOS β†’ Dogecoin) completed on 19 October 2026. Robinhood Chain is coming soon.

Deployment

ParameterValue
ChainDogeOS ChikyΕ« testnet, chain id 6281971 (0x5fdaf3)
Bridge contractDogeSoftBridge 2.6.0-ds-standard at 0x762d952DDc9bbF11b8442347D2D1B66934703036
wDU$T0xC1b2889D74Bb9D615E4ce852777FE7583e79b8dA (18 decimals)
L1 custodyD9K5fqJ6vhs3FfUgiEn69SYZJQQvtsB2Su
L1 confirmations6
Attester threshold2 of 3
Per transfermin 1, max 10,000,000
Reserve cap1,000,000 DU$T total minted; the reserve attestation goes stale after 7 days, which pauses new mints
Admin changesTimelocked (queue, wait, execute)
RPC / explorerhttps://rpc.testnet.dogeos.com Β· blockscout.testnet.dogeos.com

DRC-20 uses 8 decimals on L1; wrapped coins use 18 decimals on DogeOS. Native DOGE is not bridged. Earlier Soft Bridge contracts are retired.

Deposit: Dogecoin β†’ DogeOS

  1. Get a ref. The bridge issues ref = keccak256(abi.encode(keccak256("DOGEOS_EVM"), recipient, nonce)). The ref is a fingerprint of your DogeOS address, and its signed record is public at GET /ds/ref/<ref>.
  2. Inscribe. Send a normal DRC-20 transfer to custody with the ds tag: {"p":"drc-20","op":"transfer","tick":"DU$T","amt":"1000","ds":{"action":"BRIDGE_L1_DEPOSIT","ref":"0x…"}}
  3. Verify. Doge Soft's indexer waits for 6 confirmations and checks that the sender really held the DU$T, so a false inscription can't get through.
  4. Attest. At least 2 of 3 registered attesters sign the mint digest, which covers the ref and nonce.
  5. Mint. mintFromL1Tx rebuilds the ref from the recipient and nonce, refuses a mismatch, and refuses a ref that was already used. wDU$T can only go to the address the ref was made for.

Withdraw: DogeOS β†’ Dogecoin

  1. Burn. Call burnForRelease on the wrapped token with your Dogecoin address. The contract issues a request id.
  2. Release. Custody inscribes a DRC-20 transfer back to you tagged BRIDGE_L1_RELEASE, with ref = the request id.
  3. Settle. After 6 L1 confirmations, 2 of 3 attesters sign and settleRelease closes the request on chain. Each request id settles once.

Bridge verbs

VerbWhere
BRIDGE_L1_DEPOSITUser's DRC-20 transfer to custody. ref = recipient fingerprint.
BRIDGE_L1_RELEASECustody's DRC-20 transfer back to the user. ref = request id.
BRIDGE_L2_INTENTIntent record issued by Doge Soft services.

Safety rails

  • Single-use refs for deposits and releases.
  • 2-of-3 attesters; one key can't mint or settle. The threshold and attester set are public: attesterThreshold(), getAttesters().
  • Timelocked admin actions and a pause switch.
  • Reserve cap: 1,000,000 DU$T total minted. A stale reserve attestation (older than 7 days) pauses new mints; it never puts funds at risk.
  • Per-transfer limits: min 1, max 10,000,000.

Public HTTP

Base: https://bridge.dogesoft.io. Signing keys never belong in a browser.

EndpointDescription
GET /healthService health.
GET /api/bridge/statusOperational status and custody address.
GET /api/tokens/drc20Coin catalog with wrap address and exists flag.
GET /api/tokens/wdrc20/:tickerWrapped address for one ticker.
POST /api/bridge/l1/sessionOpen a deposit (ticker, amountHuman, recipientEvm). Returns custody, ref and the inscription body.
GET /api/bridge/session/:sessionKeyPoll a deposit.
GET /api/bridge/historyBridge history.
POST /api/bridge/l2/withdrawOpen a withdraw.
POST /api/bridge/l2/withdraw/:withdrawId/submitSubmit the burn tx hash; the server checks the receipt itself.
GET /api/bridge/balance/:chain/:addressBalance helper.