A bonding-curve token protocol for decentralised event pre-financing, revenue sharing, and secondary market liquidity — with Pyth oracle integration, DAO governance, and Solana Mobile support.
DaddyX introduces a bonding-curve token model that lets fans financially back live events on Solana and earn a share of actual ticket revenue. Organisers set a supply of $DADDYX tokens per event. Each purchase automatically raises the price by a configurable step factor S, and pays the previous holder a configurable payout factor P.
After the event, a Pyth Network oracle reports verified gross revenue on-chain, and token holders claim a pro-rata share from the escrow pool. The constraint S > P is enforced at the program level, making circular buy–sell exploits economically irrational.
DaddyX is non-custodial, permissionless for fans, and governed by a $DADDYX DAO for platform parameters and treasury decisions. The full stack includes a Rust/Anchor smart program, a React frontend, an Express API backend, Pyth oracle infrastructure, and native Solana Mobile Stack support.
Live events in emerging markets — particularly Africa and the Gulf — face a dual financing problem: organisers cannot access traditional credit, and fans have no mechanism to share in event upside. Ticket revenues are opaque, reconciliation is slow, and there is no secondary market for early supporters.
Existing Web3 ticketing projects focus on NFT collectibles but fail to create real economic alignment between fans and event success. They treat tokens as receipts, not as instruments.
DaddyX treats the $DADDYX token as a financial instrument: it appreciates with demand, pays holders on resale, and distributes actual revenue after settlement — verified by Pyth oracle infrastructure.
The protocol has four layers:
Let P₀ be the initial token price, S the step factor, and P_f the payout factor. All values are in basis points (BPS) on-chain.
When buyer n+1 purchases from buyer n:
The geometric growth ensures early backers get the lowest entry price and highest percentage gain on any subsequent resale. Simulating 20 purchases at S=1.5, P=1.2, P₀=0.05 SOL:
A naive bonding curve allows circular attacks: wallet A buys, B buys to pay A, A buys back, repeat. Each cycle extracts value from the escrow.
DaddyX prevents this via the S > P constraint:
The Anchor program rejects any event initialisation where step_factor_bps ≤ payout_factor_bps, enforcing this invariant at genesis.
The DaddyX program is written in Rust using the Anchor framework (v0.31+) and deployed on Solana devnet at:
Key instruction set (13 instructions):
initialize_platform — Bootstraps PlatformConfig with admin and fee BPSapply_as_creator — Creates CreatorProfile in Pending stateapprove_creator / suspend_creator — Admin gating (DAO-controlled in v2)initialize_event — Creates EventConfig PDA, validates S>P, sets oracle pubkeypurchase_token — Transfers SOL, updates TokenState, pays previous ownerraise_price — Owner pre-pays discount cost to raise token price floorreport_revenue — Pyth oracle-signed instruction to record gross revenueclaim_revenue — Token holder claims pro-rata $DADDYX share after settlementcancel_event / claim_refund — Full escrow refund on cancellationrequest_milestone_release / approve_milestone_release — Staged escrow for campaign fundingThe oracle stack has three components: a Pyth Price Publisher for SOL/USD pricing, a Revenue Reporter service that ingests ticket scanner APIs and point-of-sale data, and a Multi-sig Settlement Committee that signs the final report_revenue transaction.
DaddyX uses Pyth Network's Push Oracle to obtain a real-time SOL/USD price at the moment of revenue reporting. This prevents oracle manipulation by pinning revenue reporting to a time-weighted average price (TWAP) window.
// oracle/src/pyth-reporter.ts
import { PythSolanaReceiver } from "@pythnetwork/pyth-solana-receiver";
import { Connection, PublicKey, Keypair } from "@solana/web3.js";
const SOL_USD_FEED_ID =
"0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d";
export async function fetchSolUsdPrice(
connection: Connection
): Promise<number> {
const receiver = new PythSolanaReceiver({ connection });
const feedAccount = await receiver.getFeedAccountAddress(
0, // PYTHNET_SHARD
SOL_USD_FEED_ID
);
const priceData = await receiver.fetchPriceData(feedAccount);
// Use the EMA price for manipulation resistance
return priceData.emaPrice.price * Math.pow(10, priceData.emaPrice.expo);
}
export async function buildRevenueReport(opts: {
eventId: string;
grossTicketRevenue: number; // in USD
connection: Connection;
oracleSigner: Keypair;
}): Promise<RevenueReport> {
const solUsd = await fetchSolUsdPrice(opts.connection);
const grossRevenueSol = opts.grossTicketRevenue / solUsd;
return {
eventId: opts.eventId,
grossRevenueSol,
solUsdAtSettlement: solUsd,
reportedAt: Date.now(),
oraclePubkey: opts.oracleSigner.publicKey.toBase58(),
};
}The Revenue Reporter is a Node.js service that polls registered ticketing APIs (TicketDaddy, Eventbrite, custom POS webhooks) after each event's end timestamp. It aggregates gross sales, requests a Pyth TWAP, and submits the signed report_revenue instruction.
// oracle/src/revenue-reporter.ts
import { Program, AnchorProvider } from "@coral-xyz/anchor";
import { buildRevenueReport, fetchSolUsdPrice } from "./pyth-reporter";
export async function reportEventRevenue(
program: Program,
eventPda: PublicKey,
oracleSigner: Keypair
) {
// 1. Fetch gross revenue from ticketing APIs
const grossUsd = await aggregateTicketRevenue(eventPda.toBase58());
// 2. Get SOL/USD from Pyth (TWAP over 15-minute window)
const connection = program.provider.connection;
const solUsd = await fetchSolUsdPrice(connection);
const grossSol = Math.floor((grossUsd / solUsd) * 1e9); // lamports
// 3. Submit on-chain — oracle must be the event's nominated key
const tx = await program.methods
.reportRevenue(new BN(grossSol))
.accounts({
eventConfig: eventPda,
oracle: oracleSigner.publicKey,
systemProgram: SystemProgram.programId,
})
.signers([oracleSigner])
.rpc();
console.log("Revenue reported:", { grossUsd, grossSol, solUsd, tx });
return tx;
}For high-value events (>$50K gross), settlement requires a 3-of-5 Squads multisig. Oracle committee members include: DaddyX core, TicketDaddy operations, an independent auditor, and two community-elected validators. This prevents single-point oracle failure and collusion risk.
The $DADDYX token is the native governance token of the platform. It is distinct from event-specific tokens and represents protocol-level ownership. $DADDYX holders vote on proposals, elect oracle committee members, and control the platform treasury.
Adjust platform fee BPS, settlement thresholds, oracle operator set
Allocate community treasury to grants, liquidity, buybacks
Deploy new Anchor program version, migrate state
Pause purchases/settlements in response to exploit
Governance is deployed using Realms (SPL Governance v3) on Solana. Voting power is calculated as token holdings at snapshot block, with optional delegation support.
// governance/src/dao-setup.ts
import {
withCreateRealm,
withCreateGovernance,
withCreateProposal,
VoteThresholdPercentage,
VoteTipping,
GovernanceConfig,
} from "@solana/spl-governance";
import { PublicKey, Transaction } from "@solana/web3.js";
const GOVERNANCE_PROGRAM_ID = new PublicKey(
"GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw"
);
const DADDYX_MINT = new PublicKey(
"DADXYk1rGoVtokenMintXXXXXXXXXXXXXXXXXXXXXXXX" // mainnet address
);
export const GOVERNANCE_CONFIG: GovernanceConfig = {
// Minimum tokens to create a proposal
minCommunityTokensToCreateProposal: BigInt(100_000 * 1e6), // 100K $DADDYX
// Quorum — 2% of circulating supply for standard proposals
communityVoteThreshold: new VoteThresholdPercentage({ percent: 2 }),
// Vote duration: 3 days standard, 7 days treasury
baseVotingTime: 3 * 24 * 60 * 60, // seconds
// Early approval if >67% voted yes with >10% quorum
communityVoteTipping: VoteTipping.Early,
// Timelock before execution
votingCoolOffTime: 48 * 60 * 60, // 48 hours
// Deposit required to submit proposal (returned on completion)
minCouncilTokensToCreateProposal: BigInt(0),
};
export async function createDaddyXRealm(
connection: Connection,
payer: Keypair
): Promise<PublicKey> {
const instructions: TransactionInstruction[] = [];
const realmPda = await withCreateRealm(
instructions,
GOVERNANCE_PROGRAM_ID,
3, // program version
"DaddyX DAO",
payer.publicKey,
DADDYX_MINT,
payer.publicKey,
undefined, // no council token
MintMaxVoteWeightSource.FULL_SUPPLY_FRACTION,
new BN(1)
);
const tx = new Transaction().add(...instructions);
await sendAndConfirmTransaction(connection, tx, [payer]);
return realmPda;
}Platform fees (default 3% of each $DADDYX token purchase) flow into the treasury PDA. The DAO votes quarterly on allocation across three buckets:
The DaddyX mobile client is built with Expo + React Native using @solana-mobile/mobile-wallet-adapter-protocol. It targets Android 11+ with SMS support, with a progressive web fallback for iOS.
# Install Solana Mobile dependencies
pnpm add @solana-mobile/mobile-wallet-adapter-protocol \
@solana-mobile/wallet-standard-mobile \
@solana/wallet-adapter-react \
@solana/web3.js \
@coral-xyz/anchor// mobile/src/hooks/useMobileWallet.ts
import { useCallback, useMemo } from "react";
import {
transact,
Web3MobileWallet,
} from "@solana-mobile/mobile-wallet-adapter-protocol-web3js";
import {
Connection,
PublicKey,
Transaction,
clusterApiUrl,
} from "@solana/web3.js";
const DADDYX_APP_IDENTITY = {
name: "DaddyX",
uri: "https://daddyx.io",
icon: "favicon.png",
};
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
export function useMobileWallet() {
const connect = useCallback(async (): Promise<PublicKey> => {
return await transact(async (wallet: Web3MobileWallet) => {
const { accounts } = await wallet.authorize({
cluster: "devnet",
identity: DADDYX_APP_IDENTITY,
});
if (!accounts.length) throw new Error("No accounts authorized");
return new PublicKey(accounts[0].publicKey);
});
}, []);
const signAndSendTransaction = useCallback(
async (transaction: Transaction): Promise<string> => {
return await transact(async (wallet: Web3MobileWallet) => {
const { accounts } = await wallet.authorize({
cluster: "devnet",
identity: DADDYX_APP_IDENTITY,
});
const { blockhash, lastValidBlockHeight } =
await connection.getLatestBlockhash();
transaction.recentBlockhash = blockhash;
transaction.feePayer = new PublicKey(accounts[0].publicKey);
const signedTxs = await wallet.signTransactions({
transactions: [transaction],
});
const signature = await connection.sendRawTransaction(
signedTxs[0].serialize()
);
await connection.confirmTransaction({
signature,
blockhash,
lastValidBlockHeight,
});
return signature;
});
},
[]
);
return { connect, signAndSendTransaction };
}// mobile/src/screens/EventScreen.tsx
import { useState } from "react";
import { View, Text, Pressable, Alert } from "react-native";
import { Program, AnchorProvider, BN } from "@coral-xyz/anchor";
import { useMobileWallet } from "../hooks/useMobileWallet";
import { DADDYX_PROGRAM_ID, IDL } from "../constants/program";
interface PurchaseTokenProps {
eventPda: string;
tokenId: number;
currentPriceLamports: number;
stepFactorBps: number;
}
export function PurchaseTokenButton({
eventPda,
tokenId,
currentPriceLamports,
stepFactorBps,
}: PurchaseTokenProps) {
const { connect, signAndSendTransaction } = useMobileWallet();
const [loading, setLoading] = useState(false);
const purchasePrice =
(currentPriceLamports * stepFactorBps) / 10_000;
async function handlePurchase() {
try {
setLoading(true);
const walletPubkey = await connect();
// Build the purchase_token instruction
const program = new Program(IDL, DADDYX_PROGRAM_ID);
const ix = await program.methods
.purchaseToken(tokenId, new BN(purchasePrice))
.accounts({
eventConfig: new PublicKey(eventPda),
buyer: walletPubkey,
systemProgram: SystemProgram.programId,
})
.instruction();
const tx = new Transaction().add(ix);
const signature = await signAndSendTransaction(tx);
Alert.alert(
"🎉 Token Backed!",
`You paid ${purchasePrice / 1e9} SOL\nTx: ${signature.slice(0, 16)}…`
);
} catch (err) {
Alert.alert("Error", String(err));
} finally {
setLoading(false);
}
}
return (
<Pressable
onPress={handlePurchase}
disabled={loading}
style={{
backgroundColor: "#ffb690",
borderRadius: 9999,
paddingVertical: 16,
paddingHorizontal: 32,
alignItems: "center",
}}
>
<Text style={{ color: "#000", fontWeight: "700", fontSize: 14 }}>
{loading ? "Signing…" : `Back This Event · ${(purchasePrice / 1e9).toFixed(3)} SOL`}
</Text>
</Pressable>
);
}At event venues, DaddyX displays a Solana Pay QR code that deep-links to the mobile app with the event PDA pre-populated. Fans scan, confirm, and hold $DADDYX tokens — all within 3 seconds on-device.
// Generate a Solana Pay deep link for event venue QR codes
import { encodeURL, createTransfer } from "@solana/pay";
import BigNumber from "bignumber.js";
export function generateEventQR(opts: {
recipientEscrowPda: PublicKey;
purchasePriceSol: number;
eventId: string;
tokenId: number;
}): URL {
return encodeURL({
recipient: opts.recipientEscrowPda,
amount: new BigNumber(opts.purchasePriceSol),
splToken: undefined, // native SOL
reference: [new PublicKey(Buffer.from(opts.eventId))],
label: "DaddyX",
message: `Back event ${opts.eventId} · Token #${opts.tokenId}`,
memo: `DADDYX:${opts.eventId}:${opts.tokenId}`,
});
}DaddyX integrates with the Solana Mobile notification service to push alerts when: a fan's token is purchased (triggering their payout), revenue is settled, or a token they hold is approaching the top of the price curve.
// mobile/src/notifications.ts
import { SolanaMobileWalletAdapterProtocol } from "@solana-mobile/mobile-wallet-adapter-protocol";
export const NOTIFICATION_EVENTS = {
TOKEN_RESOLD: "daddyx.token.resold", // you received payout
REVENUE_SETTLED: "daddyx.revenue.settled", // claim your share
PRICE_MILESTONE: "daddyx.price.milestone", // your token 2x'd
EVENT_CANCELLED: "daddyx.event.cancelled", // claim refund
} as const;
export async function subscribeToEventNotifications(
wallet: PublicKey,
eventId: string,
tokenId: number
): Promise<void> {
await fetch("/api/notifications/subscribe", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
wallet: wallet.toBase58(),
eventId,
tokenId,
events: Object.values(NOTIFICATION_EVENTS),
}),
});
}The platform charges a configurable fee on each $DADDYX token purchase (default 3%):
Fees accumulate in the platform treasury PDA, governed by the $DADDYX DAO. The governance token — $DADDYX — entitles holders to:
DaddyX creates a new primitive for the live events industry: a bonding-curve token that pre-finances events, rewards early believers, and distributes actual revenue — all on Solana, all non-custodial. The mathematical constraint S > P makes the system exploit-resistant. The Anchor program handles all financial logic on-chain.
The Pyth oracle infrastructure provides tamper-resistant revenue data. The $DADDYX DAO ensures the protocol evolves in response to community needs, not just team priorities. And the Solana Mobile integration brings the experience to fans at the venue — scan, back, earn.
We believe fan-powered event finance is a category with global applicability, starting from underserved markets in Africa and the Gulf where traditional pre-financing infrastructure is weakest. $DADDYX is the token that makes it all happen.
Back the event. Earn from the night.