30817:decentralized-crowdfunding

Decentralized Crowdfunding

covers3030

dangershony

published
2025-12-02

NIP-3030

Decentralized Crowdfunding

draft optional

Implemented in Angor, Angor Hub and Angor Profile.

Terms

  • founder - creator of the crowdfunding campaign
  • investor - investor of the crowdfunding campaign
  • projectIdentifier - the unique identifier of the project on the specific implementation of the protocol

Decentralized Crowdfunding Protocol

The protocol utilizes the Nostr network to create a decentralized crowdfunding platform. The protocol allows founders to create crowdfunding campaigns and investors to invest in them. The protocol is relying on standard Nostr events for the majority of metadata, except for the specific events defined in this NIP.

Campaign Setup

The founder creates a funding campaign by sending a 3030 event to the Nostr network. Then a Bitcoin transaction that includes the event identifier is sent to the blockchain with the identifier as OP_RETURN value.

Any software can implement the protocol, with different security models for wallets.

Campaign Browser

Campaign software should be entirely clientside, either as a stand-alone app, or as a purely frontend webpage.

It should find all the published kind: 3030 events, then use the nostrPubKey field in the content to query for profile NIP-01 (kind: 0) and NIP-78 data.

Tags (d) used by the protocol are:

  • ['angor:members']
  • ['angor:project']
  • ['angor:faq']
  • ['angor:media']

It should additionally query and indexer of the blockchain (e.g. Bitcoin) to find the transactions with the event identifier in the OP_RETURN field.

Event 3030: Create a funding campaign.

Event Content

{
    "founderKey": <string, Bitcoin public key of the founder>,
    "founderRecoveryKey": <string, Bitcoin public key of the founder recovery key>,
    "projectIdentifier": <string, unique identifier of the project>,
    "startDate": <int, UNIX timestamp of the start date of the campaign>,
    "penaltyDays": <int, number of days after the end date of the campaign when the penalty is applied>,
    "expiryDate": <int, UNIX timestamp of the end date of the campaign>,
    "targetAmount": <int, target amount of the campaign in sats>,
    "stages":
    [{"amountToRelease":25,"releaseDate": <int, UNIX timestamp of the release date of the stage>},
    {"amountToRelease":25,"releaseDate": <int, UNIX timestamp of the release date of the stage>},
    {"amountToRelease":25,"releaseDate": <int, UNIX timestamp of the release date of the stage>},
    {"amountToRelease":25,"releaseDate": <int, UNIX timestamp of the release date of the stage>}]]
}

Event 3031: Campaign seeders.

Event Content

WORK-IN-PROGRESS: Multiple decisions needs to be made during final implementation.

Add "eventId" as a "d" tag.

{
    "projectIdentifier": <string, unique identifier of the project>,
    "projectSeeders":{"threshold":0,"secretHashes":[]}
}

Additional

The full P2P Funding Protocol can be found BCIP-0005

Cited links

Discussion

Connect a key to comment.