{"id":"811bcc6490899ef5ee6dda027d3a6f36aa3f2dddd7bd63df0bc573eb4119aad3","pubkey":"fb61b93d864e4f0eba766bb8556f2dc0262e8e985012e29ba28508dd52067d98","created_at":1764704237,"kind":30817,"tags":[["d","decentralized-crowdfunding"],["title","Decentralized Crowdfunding"],["k","3030"],["client","nostrhub.io"]],"content":"# NIP-3030\n\nDecentralized Crowdfunding\n---\n\n`draft` `optional`\n\nImplemented in [Angor](https://github.com/block-core/angor), [Angor Hub](https://github.com/block-core/angor-hub) and [Angor Profile](https://github.com/block-core/angor-profile).\n\n## Terms\n\n- `founder` - creator of the crowdfunding campaign\n- `investor` - investor of the crowdfunding campaign\n- `projectIdentifier` - the unique identifier of the project on the specific implementation of the protocol\n\n## Decentralized Crowdfunding Protocol\n\nThe 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.\n\n### Campaign Setup\n\nThe `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.\n\nAny software can implement the protocol, with different security models for wallets.\n\n### Campaign Browser\n\n`Campaign` software should be entirely clientside, either as a stand-alone app, or as a purely frontend webpage.\n\nIt should find all the published `kind: 3030` events, then use the `nostrPubKey` field in the content to query for profile [NIP-01](01.md) (`kind: 0`) and [NIP-78](78.md) data.\n\nTags (`d`) used by the protocol are:\n\n- ['angor:members']\n- ['angor:project']\n- ['angor:faq']\n- ['angor:media']\n\nIt should additionally query and indexer of the blockchain (e.g. Bitcoin) to find the transactions with the `event identifier` in the OP_RETURN field.\n\n### Event `3030`: Create a funding campaign.\n\n**Event Content**\n\n```json\n{\n    \"founderKey\": <string, Bitcoin public key of the founder>,\n    \"founderRecoveryKey\": <string, Bitcoin public key of the founder recovery key>,\n    \"projectIdentifier\": <string, unique identifier of the project>,\n    \"startDate\": <int, UNIX timestamp of the start date of the campaign>,\n    \"penaltyDays\": <int, number of days after the end date of the campaign when the penalty is applied>,\n    \"expiryDate\": <int, UNIX timestamp of the end date of the campaign>,\n    \"targetAmount\": <int, target amount of the campaign in sats>,\n    \"stages\":\n    [{\"amountToRelease\":25,\"releaseDate\": <int, UNIX timestamp of the release date of the stage>},\n    {\"amountToRelease\":25,\"releaseDate\": <int, UNIX timestamp of the release date of the stage>},\n    {\"amountToRelease\":25,\"releaseDate\": <int, UNIX timestamp of the release date of the stage>},\n    {\"amountToRelease\":25,\"releaseDate\": <int, UNIX timestamp of the release date of the stage>}]]\n}\n```\n\n### Event `3031`: Campaign seeders.\n\n**Event Content**\n\nWORK-IN-PROGRESS: Multiple decisions needs to be made during final implementation.\n\nAdd \"eventId\" as a \"d\" tag.\n\n```json\n{\n    \"projectIdentifier\": <string, unique identifier of the project>,\n    \"projectSeeders\":{\"threshold\":0,\"secretHashes\":[]}\n}\n```\n\n## Additional\n\nThe full P2P Funding Protocol can be found [BCIP-0005](https://github.com/block-core/bcips/blob/main/bcip-0005.md)","sig":"3014cf5d3f096c44a9c1d606426fa28e8a9f2b77c94bb1872f08166d3186c3199591be709d91b3883ce74cb1fc55a7252aa9693622ccba45c94ca48e16345681"}