Fund ideas. On-chain.

Kickstarter-style crowdfunding with no middleman: pledge ETH to a campaign, the creator claims it if the goal is met — otherwise every backer pulls their own refund. A 1% platform fee keeps the lights on.

Campaigns—
Platform fee—
Fees accrued—
🚀

Launch a campaign

Set a funding goal and a deadline. Backers pledge ETH; you claim it all on success.

Campaigns loading…

Loading campaigns…

Live Activity (recent events from the chain)

EventDetailsBlockTx
Loading…
showing the latest 15 events

How it works (using the dApp + the on-chain flow)

🧭

How to use

  1. Connect your wallet — press “Connect Wallet” (top-right). The dApp runs on Sepolia testnet; if the chain badge shows another network, open ⚙ Settings and pick Sepolia, then top up with faucet ETH.
  2. Launch a campaign — in the “Launch a campaign” card, fill in Goal (ETH) and Duration (days) and press “Create campaign”.
  3. Pledge to a campaign — on any Active card in Campaigns, enter an amount and press “Pledge”. Creators cannot pledge to their own campaign.
  4. Claim or refund after the deadline — if the goal was met, the creator presses “Claim funds”; otherwise every backer presses “Refund my … ETH” to pull their pledge back.
  5. Owner controls — if you are the factory owner, Platform Controls lets you “Update fee” (basis points, max 1000) or “Withdraw” accrued fees to any address.
  6. Watch the chain — Live Activity shows the latest events from the network; press ↻ Refresh to re-sync.
⛓️

The process — what happens on-chain

  1. CrowdFundFactory.createCampaign() deploys a fresh CrowdFundCampaign for the caller, registers it in the allCampaigns index and the isCampaign whitelist, and emits CampaignCreated. The platform fee is frozen per campaign at creation.
  2. CrowdFundCampaign.pledge() receives each backer’s ETH, updating pledged and totalPledged until the deadline; it reverts zero pledges and blocks the creator from self-funding.
  3. CrowdFundCampaign.status() resolves the lifecycle at the deadline: Successful when totalPledged ≥ goal, otherwise Failed.
  4. CrowdFundCampaign.claim() pays out on success: state is settled first (checks-effects-interactions), the platform fee is sent to the factory via CrowdFundFactory.creditFees(), then the rest goes to the creator — all guarded by ReentrancyGuard.
  5. CrowdFundCampaign.refund() lets each backer pull their own ETH on failure; the entitlement is zeroed before the transfer, making refunds DoS-proof.
  6. CrowdFundFactory.setFeeBps() / withdrawFees() are owner-only: the fee is capped at 1000 bps and only affects future campaigns, and accrued fees are withdrawn with a pull transfer.
🗺️

Flow graph

After the deadline, status() resolves the branch: goal met → the creator claims (the platform fee is credited to the factory); goal missed → each backer pulls a refund.

goal met goal missed Create campaign CrowdFundFactory Pledge ETH CrowdFundCampaign Deadline check Campaign · status() Claim funds Campaign · claim() Pull refund Campaign · refund()