Skip to content
Alpha & Strategy

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.

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.

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.

  • 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.

  • 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.
  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.

Use these calls here. Simulations preview the current state; each confirmed call is a separate transaction.

LAUResolve your player or venue above the call forms.
LAU.Purchase(address _t, uint256 _a)Simulate / call

Open this function to load its call form.

LAU.GetMarketRate(address _a)Read

Open this function to load its call form.

QINGResolve your player or venue above the call forms.
QING.Join(address UserToken)Simulate / call

Open this function to load its call form.

CHOA0x0f5a352fd4cA4850c2099C15B3600ff085B66197
CHOA.Chat(address Qing, string MSG)Simulate / call

Open this function to load its call form.

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.

  • 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.