Skip to content

Meta — DSS Bundling

TL;DR: chatAndSnipe does Chat → pay 1 AFFECTION → Purchase(AFFECTION, 1e18) → receive 1 LAU in one tx. Pays for itself if chat-MAI value + 1 LAU accrued > 1 AFFECTION + gas. Easy arithmetic, usually green.

Why this matters

Two things in Dysnomia want to happen together but don't have to: chatting at a LAU's venue (earns MAI) and Purchasing LAU (accumulates your own Soul's token). DSS staples them into one call. The result is that every chat you send also racks up a bit of your own LAU — effectively two revenue streams per tx instead of one.

DSS is not magic: you're spending 1 AFFECTION per chat to buy 1 LAU. The economic question is whether that trade is favorable for you, given your own LAU's underlying asset and your AFFECTION supply.

The numbers

The chatAndSnipe flow

From DSS (copied verbatim from the docs' flow):

1. Call LAU.Chat(text)
2. Transfer 1 AFFECTION from caller to contract
3. Call LAU.Purchase(AFFECTION, 1e18)
4. Transfer 1 LAU back to caller
Step Who pays what Who gets what
1. Chat Caller pays gas Chat gets delivered; MAI minted to the chatter's YUE (capped 1 token, CHOA)
2. Transfer 1 AFFECTION Caller → DSS DSS holds 1 AFFECTION
3. Purchase DSS spends 1 AFFECTION DSS receives LAU via LAU's Purchase rate
4. Transfer 1 LAU back DSS → Caller Caller's LAU balance +1 LAU

The contract has setLAU, chatAndSnipe, chat, withdrawLAU. onlyOwner gates all of them — DSS is single-user by design.

Economic identity (per chat)

  • Ingoing to you: 1 MAI (QING's underlying asset) + 1 LAU
  • Outgoing from you: 1 AFFECTION + gas

You net if value(1 MAI) + value(1 LAU) > value(1 AFFECTION) + gas.

Prerequisites

  • You must pre-approve AFFECTION to the DSS contract (IERC20(AFFECTION).approve(dss, max)).
  • You must have ≥ 1 AFFECTION per call.
  • You must own the DSS contract (onlyOwner); deploy your own.

The play

  1. Deploy DSS once per LAU you want to stack. One LAU → one DSS. If you're stacking multiple LAUs, you need multiple DSS contracts (one per LAU).
  2. Front-load AFFECTION. Deposit enough AFFECTION to cover your planned chat volume. Approve max once so you're not paying approval gas every cycle.
  3. Run the arithmetic per call. If 1 AFFECTION > 1 LAU + 1 MAI, you're losing money chatAndSniping. Use plain chat instead (step 1 only).
  4. Use chat (not chatAndSnipe) when AFFECTION is scarce or expensive. DSS still routes the chat for you and preserves the approval chain; you just skip the snipe.
  5. Batch withdrawals, not deposits. withdrawLAU(amount) is onlyOwner and pulls LAU out of the DSS contract in one tx. Let LAU accumulate for a week, then withdraw once; don't pay gas to pull 1 LAU at a time.
  6. Chain venues only where the asset → AFFECTION rate is favorable. Your LAU's Purchase(AFFECTION, 1e18) uses the LAU's GetMarketRate chain. See Economic: Market Rates — if the 777-floor piecewise is active, your Purchase returns wildly variable LAU amounts. Sanity-check before spraying chats.
  7. (inferred) Pair DSS with guest-list refreshes. A chatAndSnipe call doesn't Join — if _list[UserToken] expired and CoverCharge > 0, the Chat step reverts with PayCover. Pre-Join (cheaply during a valid window), then spray chatAndSnipes. See Venues: Guest-List Rotation.

Worked example

You own 1,000 AFFECTION and want to farm MAI at a QING whose asset is WPLS. Your LAU at that venue has a market rate where 1 AFFECTION Purchases ~0.5 LAU.

Plan: run 100 chatAndSnipe calls over a week.

  • Outgoing: 100 AFFECTION + gas_100
  • Incoming: 100 MAI (≤ 100 WPLS worth, capped 1 per chat) + 50 LAU

Was it worth it?

  • 50 LAU is bankable (each LAU is backed by its own Soul's asset basket — see Power: Yuan Composition).
  • 100 MAI → 100 WPLS equivalent minted to your YUE.
  • Cost: 100 AFFECTION + gas. If AFFECTION is ~0.2 WPLS, that's 20 WPLS-equivalent spent.

Net positive: +80 WPLS-equivalent MAI + 50 LAU intangibles, minus gas. Green.

Failure mode: your LAU's rate has drifted so 1 AFFECTION = 0.001 LAU. Now 100 AFFECTION buys 0.1 LAU — economically rounds to nothing. Stay on chat, not chatAndSnipe, until rates recover.

Gotchas

  • Chat reverts ⇒ whole tx reverts. If _list expired or cover unpaid or QING is Forbidden, chatAndSnipe reverts the whole thing and you still pay gas for the attempt.
  • chatAndSnipe doesn't Join. Cover-charge refreshes are your problem. The DSS contract has no Join path.
  • One AFFECTION per call regardless of rate. The 1e18 hardcode in step 3 means you always spend exactly 1 AFFECTION, even if the rate gives you 0.0001 LAU.
  • DSS is onlyOwner. You can't share a DSS contract with co-players. Each player deploys their own.
  • AFFECTION approval is to the DSS, not the LAU. If you approve(LAU, max) you've done nothing for DSS. Approve the DSS address specifically.
  • No re-entrancy but also no slippage protection. If LAU's rate drops mid-call your Purchase executes at the new rate with no floor. See Economic: Market Rates.
  • (inferred) Chat MAI cap still applies. Bundling doesn't exempt the 1-token chat MAI ceiling — each chatAndSnipe still earns up to 1 MAI. Don't expect DSS to boost chat rewards.
  • setLAU exists. You can repoint the DSS to a different LAU if your strategy changes. But AFFECTION approval transfers with you — confirm the new LAU's Purchase path accepts AFFECTION.

Where it cross-connects