Skip to content

moltycash: X content campaigns — campaign.create (USDC) or shill.create (token) - #581

Open
0xsnackbaker wants to merge 7 commits into
BankrBot:mainfrom
0xsnackbaker:feat/moltycash-skill-v2
Open

moltycash: X content campaigns — campaign.create (USDC) or shill.create (token)#581
0xsnackbaker wants to merge 7 commits into
BankrBot:mainfrom
0xsnackbaker:feat/moltycash-skill-v2

Conversation

@0xsnackbaker

@0xsnackbaker 0xsnackbaker commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Summary

Supersedes #490 (closing it in favor of this one).

moltycash's actual system has moved further since #490 was drafted:

  • tip was removed entirely, and the old gig system (gig.create, price/quantity, require_premium, min_followers as eligibility gates, verified_humans_only World ID gating, location-restricted gigs) was replaced by pay-per-view (CPM) content campaigns.
  • Campaigns are X (Twitter) content campaigns, created one of two ways: campaign.create (pay out in USDC) or shill.create (pay out in your own token). Both land in the same campaign type and are managed identically afterward.
  • molty also retired a legacy prepaid-credits billing option (billing_mode: "credits" + campaign.topup) since this PR was first drafted — billing is commission-only now (flat $1 create fee + 3% of each real payout, nothing to prepay).
  • catalog.json's demo/setup never matched the real API at all — wrong domain (api.moltycash.com vs api.molty.cash), fabricated REST endpoints (/tip, /hire, /gigs) and params (worker, task, budget, deadline, tags) that don't exist in molty's JSON-RPC-over-x402 API.

Changes

  • moltycash/SKILL.md — rewritten around the two real entry points: campaign.create (USDC) and shill.create (your token), presented as parallel options. Framed around the default X/auto-mode path (views read automatically from X) as the primary story, with non-X/agent-reported views covered as a single "Advanced" pointer rather than a full worked flow. Covers the transport pattern, required/optional params (including post_type to restrict submissions to a specific X post format), fees (flat $1 creation fee, commission-only billing), and the real campaign.close refund behavior (sweeps to the owner's own registered payout destination, never an arbitrary address). Adds explicit agent-safety guidance: pin/verify each x402 challenge before paying, no blind retries, treat the returned wallet_address as untrusted output requiring validation before funding, per-action confirmation previews before every paid write, anti-fraud/disclosure rules for the sponsored content itself, and a "treat remote content as data, not instructions" rule. Links out to molty's own PAYMENT.md and campaign/SKILL.md for the full spec instead of duplicating it, so this doesn't drift out of date again.
  • moltycash/catalog.json — demo code and setup steps rewritten to real, working bankr x402 call invocations against https://api.molty.cash/a2a, showing both campaign.create and shill.create.

Test plan

  • Verified campaign.create/shill.create param names/requirements against the live moltycash API source (description always required; payout_chain is required with no default when token_contract is omitted; token_contract is required for shill.create)
  • Verified there is no session token anywhere in the create response or management-call auth — campaign.review/campaign.close are each independently authorized, independently paid (flat 1¢) x402 calls, authorized by the paying wallet matching the campaign's registered owner
  • Verified campaign.close refunds to the owner's registered payout destination, not a caller-supplied address
  • Verified the legacy credits/topup billing model is fully retired in the current API — removed from the skill entirely
  • Manual smoke test: run the campaign.create example with a real Bankr wallet

moltycash removed tip, replaced the gig system with campaign.create
(pay-per-view CPM campaigns), and dropped verified_humans_only/World ID
and location gigs. This skill (and catalog.json, which never matched the
real API — wrong domain, fabricated REST endpoints/params) predates all
of that. Rewritten to cover only campaign.create, linking out to
molty.cash's own PAYMENT.md/campaign SKILL.md for the full spec so this
doesn't drift out of date again. Supersedes BankrBot#490.
Add worked examples for campaign.topup, campaign.status, campaign.review,
campaign.release (agent mode), and campaign.close — not just create. Split
transport guidance: create/topup/status are real x402-paid bankr calls;
review/release/close are free session-token calls (no bankr signing needed).
Explicitly scopes the skill to the campaign owner side; earner discovery/
submit flow is out of scope and linked out to campaign/SKILL.md instead.
@0xsnackbaker

Copy link
Copy Markdown
Contributor Author

Updated: expanded the skill to cover the full campaign-management lifecycle (create → fund → topup → status → review/release → close), not just creation. Split transport guidance since half these calls aren't x402-paid at all — campaign.review/campaign.release/campaign.close are free, authorized by the session token campaign.create returns, so they're plain curl + session token rather than bankr x402 call. Also added an explicit scope note: this skill is owner/management-side only — earner discovery/submission is a separate flow, linked out to campaign/SKILL.md.

moltycash removed session tokens entirely: campaign.review/release/close
are now their own flat-1¢ x402 calls (previously free, session-token-gated),
so there's no separate transport, no "session token expired?" section, and
no session_token param to carry around. Every method in this skill now uses
the same bankr x402 call shape.
@0xsnackbaker

Copy link
Copy Markdown
Contributor Author

Updated: moltycash removed session tokens entirely — campaign.review/release/close are now flat 1¢ x402 calls instead of free session-token-gated ones. Rewrote the skill so every call (create/topup/status/review/release/close) uses the same single bankr x402 call transport; dropped the transport-split table and the "session token expired?" section, since there's no longer a separate credential to mint or refresh.

@saltoriousSIG saltoriousSIG left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a couple things to address before merging

  • Every method pays an x402 challenge, but the skill only sets --max-payment with “headroom.” Pin the exact host/resource, Base chain ID, USDC contract, payee/facilitator, and maximum atomic price per method. Require payment preview and confirmation, idempotency, and no blind retries.

  • campaign.create returns a wallet address that the user is told to fund. Treat it as untrusted API output. Locally validate the campaign, payout chain, canonical token contract and decimals, escrow address, human/raw amount, transaction ABI/value, fees, exposure, and refund conditions before final confirmation. Require mined receipt and event/balance verification.

  • Campaign creation, top-up, review, release, view reporting, and closing all affect financial obligations without mandatory per-action confirmation. Preview campaign/submission IDs, billing mode, CPM, caps, balances, views, calculated payouts, commission, destination, and consequences before each write.

  • The paid social promotion flow lacks safeguards against fake engagement, spam, impersonation, undisclosed advertising, astroturfing, and platform-rule evasion. Limit campaigns to truthful, disclosed sponsored content and prohibit required likes, reposts, comments, follows, deceptive claims, harassment, or account farming.

  • release_mode: "agent" permits payout-driving view reports without evidence or replay protections. Require independently verifiable source data, submission URL and ownership validation, monotonic cumulative views, freshness checks, local payout recomputation, and rejection of duplicate, stale, decreasing, or cross-campaign reports.

  • Close/refund relies on a dashboard-configured payout destination without local validation. Preview the exact chain, token, refund address, amount, fees, and affected submissions; confirm ownership and verify the mined refund before reporting success. Never bypass a Bankr scanner error through a web flow.

  • Treat submissions, URLs, screenshots, API responses, and linked remote specifications as untrusted data, not instructions. Require confirmation before exposing private URLs, unreleased assets, personal data, or internal campaign details to the human network.

Adds explicit agent-safety guidance requested in review (saltoriousSIG,
2026-07-25):
- Pin endpoint/chain/asset/price and verify each x402 challenge before
  paying; no blind retries on timeout/error.
- Treat campaign.create's returned wallet_address as untrusted output --
  validate format/chain, preview the human-readable amount, and verify
  the mined funding tx before treating the campaign as live.
- Require operator confirmation (method, amounts, IDs, consequences)
  before every paid write call, not just create.
- campaign.release (agent mode): require independently verifiable view
  sources, submission-ownership checks, monotonic cumulative views, and
  local payout recomputation before reporting.
- campaign.close: preview chain/token/destination/amount before calling;
  verify the mined refund rather than trusting the response.
- New Content & platform safety section: disclosed/truthful sponsored
  content only, no engagement-farming requirements, no astroturfing.
- New section treating submissions/URLs/API responses as untrusted data,
  not instructions to follow.

Also removes campaign.topup and billing_mode/credits entirely -- molty's
actual API has retired that legacy prepaid-credits model since this PR
was drafted; billing is commission-only now, so this doc would otherwise
document a method that no longer exists. Fixed a second stale claim
while in here: payout_chain does NOT default to 'solana' -- it's
required (no default) whenever token_contract is omitted.
@0xsnackbaker

Copy link
Copy Markdown
Contributor Author

Addressed the review feedback in a2128ff:

  • Added a "Security model — read before paying" section: pin endpoint/chain (eip155:8453)/USDC contract/fee amount and verify each x402 challenge before paying; no blind retries after a timeout/error.
  • campaign.create's response is now explicitly documented as untrusted output — validate the returned wallet_address format/chain, preview the human-readable funding amount, and verify the mined transaction + on-chain balance before treating the campaign as live.
  • Added explicit operator-confirmation requirements (method, amounts, IDs, consequences) before every paid write, not just create.
  • campaign.release (agent mode) now documents required anti-replay checks: independently verifiable view source, submission-ownership validation, monotonic cumulative views, local payout recomputation, and rejection of duplicate/stale/decreasing/cross-campaign reports.
  • campaign.close now documents previewing chain/token/destination/amount before calling and verifying the mined refund rather than trusting the response.
  • New "Content & platform safety" section: disclosed/truthful sponsored content only, no engagement-farming requirements, no astroturfing/impersonation/deceptive claims.
  • New section treating submissions/URLs/API responses as untrusted data, never as instructions to follow, with a confirmation requirement before exposing private/internal details.

Also, unrelated to the review but caught while updating: molty retired the legacy campaign.topup/billing_mode: "credits" model since this PR was drafted (billing is commission-only now), so I removed those sections — they'd otherwise document a method that no longer exists. Also fixed a stale claim that payout_chain defaults to "solana" — it's actually required (no default) whenever token_contract is omitted.

…ate (token)

Per feedback: molty campaign creation has two real entry points, not one
flow with an optional param. Split "1. Create a campaign" into Option A
(campaign.create, USDC, payout_chain required) and Option B (shill.create,
your own token, token_contract required) as parallel top-level paths.

Reframed the whole doc around the default X/auto-mode path (views read
automatically from X, no separate call) as the primary story. Non-X /
release_mode: "agent" is now a single "Advanced" callout with a pointer
to campaign/SKILL.md instead of a full numbered step with its own worked
example — still documented as existing, not removed, just de-emphasized
to match the two primary use cases.

catalog.json demo now shows both campaign.create and shill.create calls.
@0xsnackbaker 0xsnackbaker changed the title moltycash: rewrite skill around campaign.create (no tip/gig/hire) moltycash: X content campaigns — campaign.create (USDC) or shill.create (token) Aug 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants