ds tag, verbs
Inscription standard
The Doge Soft ds tag {action, ref}, the verb registry (DeFi, marketplace, launchpad, bridge, governance), and size limits.
The Inscription Standard says what a transaction is (a sale, a swap, a launch, a bridge deposit, a governance action). Marketplace and DeFi tags go on chain when assets move. A governance action is the inscription itself. Listings, offers, bids and cancels stay signed records.
The indexer reads Dogecoin Core. That index is the source of truth for the orbit.
The tag
{"ds":{"action":"<VERB>","ref":"<Doge Soft-issued id>"}}
- That's the whole tag.
actionis an UPPERCASE verb.refnames the record. Nothing else sits insideds. - Example:
{"p":"drc-20","op":"transfer","tick":"DU$T","amt":"1000","ds":{"action":"BOND","ref":"โฆ"}} - The signature is on that record. It is a Dogecoin
signmessageover the textDoge Soft ref record, a newline, then the JSON of the record. The orbit returns the record, the signer address, and the signature. Any Dogecoin wallet can check the signature against that signer. Doge Soft signs these records today. A partner record uses the samesignmessagewhen the orbit issues one. - Where it rides: for trades, the tag is an
OP_RETURNnote inside the trade transaction itself. That means no extra transaction, and Doggy Market and ord parsers ignore it.
Verbs
| Area | Verbs | Notes |
|---|---|---|
| DeFi | SWAP BOND ADD_LP REMOVE_LP CLAIM STAKE UNSTAKE AIRDROP PAYOUT | Tag on the DeFi transaction that moves the coins. |
| Marketplace | BUY AUCTION_SOLD OFFER_ACCEPT GIFT BUNDLE PARTIAL_FILL COLLECTION_TRANSFER | One tag on the transaction that spends the dog. See Marketplace. |
| Launchpad | LAUNCH_DEPLOY LAUNCH_MINT | The art itself stays a plain Doginal (see below). |
| Governance | GOV_CREATE GOV_UPDATE GOV_PROPOSE GOV_VOTE GOV_FINALIZE GOV_EXECUTE GOV_CANCEL GOV_DELEGATE GOV_APPOINT GOV_REMOVE GOV_RESIGN GOV_TRANSFER_AUTHORITY | The inscription is the decision. See Governance. |
| Security | ANCHOR REFUND | Proof anchors and refunds from Doge Soft services. |
| Bridge | BRIDGE_L1_DEPOSIT BRIDGE_L1_RELEASE BRIDGE_L2_INTENT | text/plain;charset=utf8, Soft Bridge only. Only Doge Soft services can create them. Deposit and release bodies are a plain DRC-20 transfer with ds = {action, ref} only. For example: {"p":"drc-20","op":"transfer","tick":"DU$T","amt":"1000","ds":{"action":"BRIDGE_L1_DEPOSIT","ref":"0x?"}} For a deposit, Doge Soft issues the ref as keccak256(abi.encode(keccak256("DOGEOS_EVM"), recipient, nonce)) The signed record is at GET /ds/ref/<ref> and DogeSoftBridge 2.6.0 rebuilds the ref on chain, so the recipient cannot be swapped. For a release, the ref is the bridge request id and can be settled once. BRIDGE_L2_INTENT is the text Soft Bridge (Doge Soft services only) with action and ref on the envelope. |
Marketplace
Anyone can run a marketplace on these seven verbs. The tag goes on the one transaction that spends the dog. One tag covers both sides. Price, seller and buyer are the outputs of that transaction.
{"ds":{"action":"BUY","ref":"r_1"}}
- Same shape for every verb. Swap
BUYforAUCTION_SOLD,OFFER_ACCEPT,GIFT,BUNDLE,PARTIAL_FILLorCOLLECTION_TRANSFER. It is oneOP_RETURNof at most 80 bytes, appended after the seller's payment output. GIFThas no price.BUNDLE,PARTIAL_FILLandCOLLECTION_TRANSFERname every dog those inputs moved.- The ref is the long form of that sale. Doge Soft signs that record with the same
Dogecoin
signmessageafter the outputs check. The indexer, reading Core, is the source of truth for the orbit. - A listing, offer, bid or cancel is a signed record in that marketplace's own book. It is not an inscription, and it does not get a tag. Moving the dog anywhere else closes the listing.
- Who signs. The seller signs
SIGHASH_SINGLE|ANYONECANPAY(0x83) on their payment output. The buyer, bidder or offer signer usesSIGHASH_ALL, so the tag is already in the template before they sign. - Royalties are the collection record. A claim inscribes one creator-signed
LAUNCH_DEPLOYrecord withroyalty_bpsandpay_to. Every marketplace on these verbs reads that inscription. The sale tag does not carry a royalty. A marketplace fee stays with that marketplace. - The orbit lists these verbs with the rest of the standard. A listing is not an inscription.
Launchpad and art
- The art is a plain Doginal:
"ord" <parts> <content-type> <n-1> <chunk> ? <0> <chunk>, with 240-byte chunks. Big files span a chain of reveal transactions (multi-reveal is live), and the inscription id is the first reveal's txid +i0. Every Doginals wallet, market and explorer shows it normally. - LAUNCH_DEPLOY is a collection record:
{"ds":{"action":"LAUNCH_DEPLOY","ref":"lp_<slug>"},"name":"?","supply":100,"sig":"?"}.sigis the creator'ssignmessageover that collection record. Therefnames the Doge Soft ref record, signed withsignmessagethe same way as every other verb. A launch may also store a royalty for its own buyers. That number stays on the collection record and is not copied into a marketplace tag. - LAUNCH_MINT is the tag on the buyer's mint transaction. Lazy mints inscribe nothing until someone buys.
Governance
A collection, a trait, or a council can inscribe its own organization. The indexer rebuilds it from
Dogecoin Core. That rebuild is the source of truth. The organization picks the electorate in
GOV_CREATE. The governance id is that inscription's id.
- Body.
application/json.dsis still onlyactionand an optionalref. The rules sit beside it. - The orbit checks the body and returns the
application/jsonand its SHA-256. You inscribe that JSON with your wallet. Arefon it names the samesignmessagerecord as every other verb. - Electorates.
wallet_allowlistwithone_walletis the council the indexer can tally now.doginal_holderanddoginal_traitare valid founding configs for a collection or a trait. Those ballots are stored and are not counted until holder-at-snapshot is indexed.openis not counted. - Shares.
asset_unitsnames aunit_ledger_ref. This category does not mint that ledger. A 100ร100 grid is 10,000 units in that later ledger, not 1,000 members, and not a governance verb. - Tally. Quorum holds when
participating ร 10000 โฅ quorum_bps ร eligible_weight. The proposal passes when quorum holds andyes ร 10000 โฅ approval_bps ร (yes + no)and at least one yes or no was counted. Abstain joins quorum only when the founding config says so. Setapproval_bpsto 5001 for a strict majority of yes against no. The indexer recomputes this. A finalize inscription that disagrees is rejected. - Ballots. The
voterstring is not a signature. The indexer counts a ballot when that address holds the vote inscription and is on the allowlist. The first in-window ballot sticks. Order is block height, then transaction id, then inscription index. - Custody. A passed proposal authorizes a spend. Two custodians of a 2-of-3 still sign.
Replacing a signer moves the coins to a new output.
GOV_EXECUTErecords a transaction id and does not mark the effect verified. Delegation is recorded and is not applied to weight yet. - Read it. Explorer ยท Governance.
Not part of this standard
- Dogecoin Names keeps its own signed format (
"p":"dns"with a registrarsig). See Names. - DRC-20 deploy, mint and transfer are their own protocol. They stay positional, so every DRC-20 wallet reads them.
Sizes
- Each push is at most 520 bytes (Dogecoin's limit). Doginals content uses 240-byte chunks, at most 1,500 bytes of
pushes per reveal, and each reveal's
scriptSigstays under 1,650 bytes. - An
OP_RETURNnote is at most 80 bytes, and only one is allowed per transaction.
Signing with the wallet
window.dogesoft.signPsbt(psbt, options) returns
{ hex, psbtHex, signedPsbtHex, psbtBase64, signedPsbtBase64, txHex? }.
hex, psbtHex and signedPsbtHex are the signed PSBT in hex;
psbtBase64 and signedPsbtBase64 are the same PSBT in base64.
txHex is the broadcast-ready raw transaction, returned when
finalize or autoFinalize is set and every input is signed.
See PSBTs.