This maps each Scope-facing data point to where it comes from, how we index it, where we aggregate it, and how it reaches the Scope page.
Scope should not infer Pumpfun protocol state in the browser.
The data should flow like this:
on-chain events/accounts
-> solar-flare parser
-> hermaus-rs processor event
-> Redpanda topic
-> azura-rs metadata-service aggregation
-> Talos read/scope state
-> azura-monorepo Scope UI
Simple card indicators should follow the existing cashback pattern:
Pump create metadata
-> PumpfunMetadata
-> prod.svm.pumpfun_metadata
-> metadata-service canonical metadata
-> Talos metadata
-> Scope card icon / hover / filter
Running totals and chart markers need event streams:
Pump / Pump Fees / Agent event
-> prod.svm.pumpfun_fee_events or prod.svm.pumpfun_agent_events
-> metadata-service rollup
-> Talos chart/tradefeed marker + Scope hover payload
| Scope Data | Source of Truth | Raw Fields / Events | First Indexing Owner | Topic / Store | Aggregation Owner | Scope Output |
|---|---|---|---|---|---|---|
| Offchain-created indicator | Pump create event | CreateEvent.user, CreateEvent.creator; derive user != creator |
solar-flare |
prod.svm.pumpfun_metadata |
metadata-service canonical metadata | metadata.isOffchainCreated |
| Cashback indicator | Pump create event | CreateEventV2.is_cashback_enabled |
already mostly exists in solar-flare |
prod.svm.pumpfun_metadata |
metadata-service canonical metadata | metadata.isCashbackEnabled |
| Mayhem indicator | Pump create/trade/bonding curve | is_mayhem_mode, mayhem_mode |
solar-flare |
prod.svm.pumpfun_metadata, trades |
metadata-service / Talos | metadata.isMayhemMode |
| Mayhem countdown | Pump launch/create timestamp | CreateEvent.timestamp or pool/card launch timestamp |
solar-flare / Talos |
metadata/card state | Talos normalizes | metadata.mayhemEndsAt |
| Mayhem active/finished | Derived from launch time | default: now < launchedAt + 24h |
Talos | Talos state | Talos | metadata.mayhemStatus |
| Mayhem bot trades | Static wallet + trade user | TradeEvent.user == BwWK17cbHxwWBKZkUYvzxLcNQ1YVyaFezduWbtm2de6s |
solar-flare trade parser already has trader/user |
prod.svm.trades |
Talos trade annotation | chart/tradefeed actorTags: ["mayhem_bot"] |
| Creator address | Pump create/bonding curve/set creator | creator, SetCreatorEvent, bonding curve creator |
solar-flare |
prod.svm.pumpfun_metadata |
metadata-service canonical metadata | metadata.creator |
| Creator fee accrued | Pump/PumpSwap trade events | TradeEvent.creator_fee, creator_fee_basis_points; PumpSwap coin creator fee fields |
solar-flare |
prod.svm.trades and/or prod.svm.pumpfun_fee_events |
metadata-service fee rollup | creatorRewards.totalFees |
| Creator fee claimed | Pump/PumpSwap claim events | CollectCreatorFeeEvent.creator_fee, CollectCoinCreatorFeeEvent.coin_creator_fee |
solar-flare |
prod.svm.pumpfun_fee_events |
metadata-service fee rollup | creatorRewards.claimed + chart marker |
| Creator unclaimed | Derived | totalFees - claimed/distributed, or vault/account balance for exact state |
metadata-service | Postgres rollup | metadata-service | creatorRewards.unclaimed |
| Creator fee authority | Pump Fees sharing config | SharingConfig.admin / creator authority fields |
solar-flare account/event parser |
prod.svm.pumpfun_fee_events or metadata |
metadata-service | creatorRewards.feeAuthority |
| Locked/unlocked fee authority | Pump Fees sharing config | likely SharingConfig.admin_revoked; exact product meaning still needs confirmation |
solar-flare |
prod.svm.pumpfun_fee_events or metadata |
metadata-service | creatorRewards.locked |
| Fee share rows | Pump Fees sharing config | SharingConfig.shareholders[] { address, share_bps } |
solar-flare |
prod.svm.pumpfun_fee_events or metadata |
metadata-service | creatorRewards.shares[] |
| Per-share amounts | Derived from totals + share bps | share_amount = total_or_claimed * share_bps / 10_000 |
metadata-service | Postgres rollup | metadata-service | creatorRewards.shares[].amount |
| GitHub/social profile | Pump Fees social PDA/events | SocialFeePda.user_id, platform, SocialFeePdaCreatedEvent, SocialFeePdaClaimedEvent |
solar-flare |
prod.svm.pumpfun_fee_events |
metadata-service profile enrichment | creatorRewards.shares[].profile |
| Social fee claimed | Pump Fees social claim event | SocialFeePdaClaimedEvent.amount_claimed, lifetime_claimed, claimable_before |
solar-flare |
prod.svm.pumpfun_fee_events |
metadata-service fee rollup | hover totals + chart marker |
| Charity indicator | donate.gg token route + Pump Fees donation state | donate.gg /{chainId}/tokens/{address} active config; DonationFeePda events |
metadata-service + solar-flare |
Postgres metadata + optional fee events | metadata-service | metadata.charity.enabled |
| Charity name/icon | donate.gg charity APIs | charity name, logo, website/social fields |
metadata-service | Postgres metadata cache | metadata-service | charity.allocations[].name/iconUrl |
| Charity allocation | donate.gg active config | active config charities + weights | metadata-service | Postgres metadata cache | metadata-service | charity.allocations[].weightBps |
| Agent indicator | Agent Payments program | AgentInitializeEvent or TokenAgentPayments account exists |
solar-flare |
prod.svm.pumpfun_agent_events |
metadata-service agent rollup | metadata.agent.enabled |
| Agent payment authority | Agent Payments account/events | TokenAgentPayments.authority, AgentUpdateAuthorityEvent.new_authority |
solar-flare |
prod.svm.pumpfun_agent_events |
metadata-service latest-state rollup | agent.paymentAuthority |
| Agent rate | Agent Payments account/events | TokenAgentPayments.buyback_bps, AgentUpdateBuybackBpsEvent.new_buyback_bps |
solar-flare |
prod.svm.pumpfun_agent_events |
metadata-service latest-state rollup | agent.rateBps |
| Agent revenue | Agent payment accepted events | AgentAcceptPaymentEvent.amount |
solar-flare |
prod.svm.pumpfun_agent_events |
metadata-service agent rollup | agent.revenue |
| Agent buybacks | Agent distribute/buyback events | AgentDistributePaymentsEvent.buyback_amount, AgentBuybackTriggerEvent.currency_mint_amount_for_buyback |
solar-flare |
prod.svm.pumpfun_agent_events |
metadata-service agent rollup | agent.buybacks |
| Agent claimed | Agent withdrawals | AgentWithdrawEvent.amount |
solar-flare |
prod.svm.pumpfun_agent_events |
metadata-service agent rollup | agent.claimed |
| Agent unclaimed | Derived or account/vault state | revenue - buybacks - claimed, or live vault balances for exact state |
metadata-service | Postgres rollup / account snapshot | metadata-service | agent.unclaimed |
| Tokens bought back and burned | Agent buyback event/account | tokens_bought_back_and_burned, new_tokens_bought_and_burned_for_currency |
solar-flare |
prod.svm.pumpfun_agent_events |
metadata-service agent rollup | agent.tokensBoughtBackAndBurned |
flowchart TD
Trade["Pump/PumpSwap trades"] --> Accrued["creator fee accrued"]
Claim["CollectCreatorFee events"] --> Claimed["creator fee claimed"]
Dist["DistributeCreatorFees events"] --> Distributed["creator fee distributed"]
Sharing["SharingConfig account/events"] --> Shares["shareholders + bps"]
Social["SocialFeePda events"] --> Profiles["GitHub/social identity"]
Accrued --> Rollup["metadata-service creatorRewards rollup"]
Claimed --> Rollup
Distributed --> Rollup
Shares --> Rollup
Profiles --> Rollup
Rollup --> Talos["Talos metadata/read model"]
Talos --> Scope["Scope fee hover"]
Recommended formulas:
creator_total_fees =
sum(Pump TradeEvent.creator_fee)
+ sum(PumpSwap coin creator fees)
creator_claimed =
sum(CollectCreatorFeeEvent.creator_fee)
+ sum(CollectCoinCreatorFeeEvent.coin_creator_fee)
creator_unclaimed =
creator_total_fees - creator_claimed/distributed
share_amount =
relevant_total * share_bps / 10_000
Open decision:
Confirm whether "locked" means SharingConfig.admin_revoked.
flowchart TD
Init["AgentInitializeEvent"] --> Enabled["agent enabled"]
Init --> Authority["payment authority"]
Init --> Rate["buyback bps / rate"]
AuthUpdate["AgentUpdateAuthorityEvent"] --> Authority
RateUpdate["AgentUpdateBuybackBpsEvent"] --> Rate
Payment["AgentAcceptPaymentEvent"] --> Revenue["revenue"]
Distribute["AgentDistributePaymentsEvent"] --> Distributed["distributed"]
Buyback["AgentBuybackTriggerEvent"] --> Buybacks["buybacks"]
Withdraw["AgentWithdrawEvent"] --> Claimed["claimed"]
Account["TokenAgentPaymentInCurrency account"] --> ExactTotals["latest account totals"]
Revenue --> Rollup["metadata-service agent rollup"]
Buybacks --> Rollup
Claimed --> Rollup
Authority --> Rollup
Rate --> Rollup
ExactTotals --> Rollup
Rollup --> Talos["Talos metadata/read model"]
Talos --> Scope["Scope agent hover"]
Recommended formulas:
agent_rate =
latest buyback_bps / 100
agent_revenue =
sum(AgentAcceptPaymentEvent.amount)
agent_buybacks =
sum(AgentDistributePaymentsEvent.buyback_amount)
or sum(AgentBuybackTriggerEvent.currency_mint_amount_for_buyback)
agent_claimed =
sum(AgentWithdrawEvent.amount)
agent_unclaimed =
revenue - buybacks - claimed
For exact live state, prefer account snapshots for TokenAgentPayments and TokenAgentPaymentInCurrency.
flowchart TD
Token["Token address + chain id"] --> DonateToken["donate.gg token route"]
DonateToken --> Config["active charity config"]
Config --> CharityIds["charity IDs + weights"]
CharityIds --> CharityApi["donate.gg charity endpoints"]
CharityApi --> Display["name/logo/socials"]
Display --> Metadata["metadata-service charity metadata"]
Metadata --> Talos["Talos Scope payload"]
Talos --> Scope["Scope charity hover"]
Best lookup:
GET https://www.donate.gg/api/v1/{chainId}/tokens/{address}
Use charity endpoints to hydrate:
name
logo
website/socials
enabled/verified state
allocation weights
flowchart TD
Create["Pump create event"] --> Flag["isMayhemMode"]
Create --> LaunchTime["launch timestamp"]
LaunchTime --> EndsAt["mayhemEndsAt = launch + 24h"]
Trade["Pump trades"] --> BotCheck["trader == Mayhem bot"]
BotCheck --> TradeTag["actorTag: mayhem_bot"]
Flag --> Talos["Talos Scope metadata"]
EndsAt --> Talos
TradeTag --> Talos
Talos --> Scope["Mayhem icon, countdown, chart/tradefeed labels"]
Static Mayhem bot:
BwWK17cbHxwWBKZkUYvzxLcNQ1YVyaFezduWbtm2de6s
Default active/finished rule:
active if now < launched_at + 24h
finished otherwise
| Repo | Responsibility |
|---|---|
solar-flare |
Decode Pump/Pump Fees/Agent events and account-derived fields |
hermaus-rs |
Wrap decoded records into processor events and publish Redpanda topics |
azura-rs metadata-service |
Consume topics, aggregate rollups, hydrate donate.gg, write Postgres/ClickHouse |
talos-v2 |
Consume normalized metadata/events, expose Scope fields, tag chart/tradefeed |
azura-monorepo |
Render icons, hovers, filters, countdowns, chart markers |
prod.svm.pumpfun_metadata
prod.svm.pumpfun_fee_events
prod.svm.pumpfun_agent_events
prod.svm.trades
- Does "locked" exactly mean
SharingConfig.admin_revoked? - Should unclaimed values be event-derived or account/vault-balance-derived?
- For agent buybacks, does product want allocated buyback amount or executed buyback amount?
- Does Mayhem always finish exactly 24h after launch, or can migration/completion override it?