# Drips Docs ## Accessing Drips Drips is an open-source application and protocol built on Ethereum, a publicly-accessible, global blockchain. While we've built the Drips App for simple interaction with Drips' underlying smart contracts, there are a multitude of alternative tools that enable interaction with the Drips Protocol, some of which are listed below. * [The Drips SDK][sd] is a Javascript SDK that allows any application or user-created code to interact directly with the Drips smart contracts and utilize the full feature set of the protocol in whatever way they wish. Drips contracts can be freely integrated into any website, dapp or application at any time using the SDK. * [Etherscan](https://etherscan.io/) is a block explorer and analytics platform for Ethereum. Other networks have similar block explorers, often also operated by Etherscan. The Drips contracts can be accessed using these block explorers at the addresses specified on the [Smart Contract and Subgraph Details](the-protocol/smart-contract-details) page. Other networks have similar block explorers. * [ethBuild][eb] is an educational sandbox for web3, including drag-and-drop programming and open source building blocks. With ethBuild, you can call a function on an Ethereum contract (for example, to create a Drip or Split configuration) by sending it a transaction with the function arguments in the data. * [MyEtherWallet][me] is a free, client side interface helping you interact with the Ethereum blockchain. Their easy-to-use, open-source platform allows you to generate wallets, interact with (Drips) smart contracts, and more. * The [web3.js Library][w3] makes it easy to interact with smart contracts on the Ethereum blockchain, including the Drips smart contracts. * The [ethers.js Library][et] is another Javascript library for interacting directly with Ethereum smart contracts, including the Drips smart contracts. [sd]: https://github.com/drips-network/sdk [sc]: the-protocol/smart-contract-details [eb]: https://eth.build/ [me]: https://www.myetherwallet.com/ [w3]: https://web3js.readthedocs.io/en/v1.7.5/ [et]: https://docs.ethers.io/v5/ ## FAQ #### Are there fees for using Drips? The Drips Protocol is free to use and does not impose any fees on users. Users will still need to pay gas fees to interact with the Drips Contracts as they would with any contract on Ethereum. Third-party apps building on Drips may choose to impose fees of their own. #### Can I split or stream funds directly to exchange-managed Ethereum addresses? No. When an address receives funds on Drips, the owner of that address needs to *collect* them before they are transferred to their wallet. Exchanges typically offer non-custodial addresses specifically for receiving ERC-20 tokens on various networks, but offer no way to sign contract interactions from those addresses. As a result, funds sent on Drips to such a custodial, exchange-managed address may be unrecoverable. For this reason, only split or stream funds to self-custodial wallets, such as externally-owned wallets (EOAs) or smart contract wallets (multisigs) like Safe. #### Do I need to have ETH in my account to send or receive tokens using Drips? Users of Drips generally do need to have ETH (or the analogous gas token to ETH on networks other than Ethereum) available in their wallet to cover transaction fees, if they wish to create streams or Splits to stream or share funds with others. Users do not need to have ETH in their accounts to receive funds from other users who are streaming or Splitting to them. However, they will need to have a small amount of ETH available in their account when they are ready to collect funds sent to them (again, to cover gas costs of sending the collect transaction). In certain situations, Drips may "sponsor" the claiming of projects or collecting of funds. In this case, the transaction screen will indicate that gas is "paid for by Drips". #### What happens to funds that have been streamed to a Github repository that is never claimed by its owner? For now, nothing happens to these funds and they will remain in Drips waiting for the repository owner to claim them forever. It's possible that in the future the governance of the Drips protocol will decide to change this, so that funds given to a Github repository that go unclaimed are donated to an alternative public goods fund like Gitcoin, or to some other cause. ## Managing Drip List and project visibility import Figure from '../../components/Figure' By default, newly-claimed projects and created Drip Lists are publicly visible across the Drips App, including on their owner's profiles. However, as the owner of a project or Drip List, you may choose to *hide* them. In addition, Drip Lists transferred to another address must be explicitly un-hidden before appearing on the new owner's public profile.
### Controlling visibility of a project or Drip List In order to hide or un-hide a project or Drip List, connect your wallet, navigate to the project or Drip List in question, click "Edit" next to its name, and toggle the "Hidden" switch. Lastly, confirm the change in your wallet. #### Visibility of transferred Drip Lists Drip Lists are represented on-chain as ERC-721 tokens (NFTs), and may thus be transferred between Ethereum addresses. Due to the nature of the blockchain, anyone may send any other address any token(s) they own, even without explicit consent by the receiving party. In order to prevent unwanted Drip Lists to inadvertedly appear on users' profiles, Drip Lists are **automatically hidden** upon transfer, with the caveats listed below. Should you receive a Drip List that you wish to display on your profile, simply un-hide it as described above. #### Effects of hiding a project or Drip List When a project or Drip List is hidden, it will: * no longer appear on their owner's public Drips profile, * be hidden behind a "Show hidden" toggle on the owner's own dashboard, * be greyed out on any other projects, Drip Lists, or users that already split or donated to the now-hidden project or Drip List pre-hiding, * no longer allow creating new donations or splits to it via the official Drips App, and * be hidden from Google and other search engines. However, due to Drips being an open & transparent, blockchain-based protocol: * Hidden projects or Drip Lists are **not** hidden on the Ethereum blockchain, and may be discovered by looking at raw blockchain data itself. * Users with direct links to hidden projects or Drip Lists **can still access them**, but the app will display a banner informing them that the project or Drip List is hidden. * If other projects or Drip Lists are (still) splitting funds to a now-hidden project or Drip List, the hidden project will **still appear** on those entities' pages, but will be greyed out and marked as hidden. * While the Drips App will generally prevent new funds from being sent to hidden projects or Drip Lists, **it is still possible to send funds** by interacting directly with the underlying smart contracts, through third-party apps, or if a split to a now-hidden project was established before it was hidden. ## Usage with a Safe multisig You can use the Drips App as a Safe App for conveniently proposing transactions to your Safe. #### Launching Drips as a Safe App Within your Safe's UI, simply navigate to the *Apps* tab and launch *Drips*. This is supported on Ethereum mainnet and [https://safe.filecoin.io/](https://safe.filecoin.io/), but on other networks you may need to add the respective Drips App URL as a "Custom Safe App". For example, on Optimism, click "Add custom Safe App" and enter `https://optimism.drips.network` as the URL. #### Interacting with Drips through a Safe You can generally interact with Drips the same way as you would with an EOA wallet. There are a few things to consider, however. ##### Edits to streams or balances only apply at the time the transaction is executed When you create, pause or edit a stream, the edits will only apply at the exact moment your Safe executes the transaction, not at the timestamp of proposal. For instance, this means that an outgoing stream that you pause will continue streaming until your Safe executes the pause transaction. When scheduling a stream for the future, ensure that the transaction is executed before its scheduled start date. Scheduled streams begin streaming at the time of transaction confirmation *or* any scheduled start date, depending on which date is later. ##### Some transactions are invalidated by updates to a Drips account's state Many interactions with the Drips app rely on a specific configuration of the account's stream receivers. Such transactions may fail if the configuration is altered between the proposal of the transaction and its actual execution. Thus, configuration-altering interactions must be made with extra care, because they may invalidate other pending transactions. Such interactions include: * Adding funds (Does not invalidate other pending transactions) * Collecting funds (Does not invalidate other pending transactions) * Creating a stream (Invalidates other pending transactions) * Editing a stream (Invalidates other pending transactions) * Deleting a stream (Invalidates other pending transactions) * Pausing / un-pausing a stream (Invalidates other pending transactions) When editing streams, all interactions are *scoped per ERC-20 token*, meaning that a transaction changing streams for token A never invalidates another interacting with token B. Additionally, edits to your Splits receivers will invalidate other transactions altering Splits receivers, but are not invalidated by any edits to your account's stream receivers. Consider the following example: * You propose a transaction that creates a new stream streaming token A. * Before executing that transaction, you propose another transaction that adds funds for a token A. * You execute the 1st transaction and a new stream is created, altering your account's state of stream receivers. * The 2nd transaction would fail if executed, because it relies on the account's specific state before the new stream was created. However, the following scenario works fine, because adding funds does not alter your account's stream receiver state: * You propose a transaction that adds funds for a token A to your Drips account. * Before executing that transaction, you propose another transaction that creates a new stream streaming token A. * You execute the first transaction, and funds are added to your Drips account. * You execute the second transaction, and the new stream is created. ## Administering a RetroPGF Round import Figure from '../../components/Figure' As a round administrator, you are responsible for managing the lifecycle of your RetroPGF round—from reviewing applications to publishing results and facilitating payouts. This guide covers the key administrative tasks after your round has been [created and published](/rpgf/create-your-round). ### 1. Reviewing Applications Once your round's application period begins, submissions will start appearing on the **"All applications"** screen of your round's page. Initially, all new submissions have a `Pending` status. Before the voting period starts, you must review these pending applications. You can select one or more applications from the list and use the panel on the right-hand side to approve or reject them in bulk. * **Pending & Rejected Applications**: These are only visible to you (the admins) and the original applicant. * **Approved Applications**: These are immediately made public on the round page (excluding any private data fields). Only approved applications will be visible to badgeholders during the voting phase. ### 2. Badgeholder Voting After application intake and review, [designated badgeholders can start casting their ballots](/rpgf/vote-on-a-round). #### Reviewing Ballots Click **Ballots -> View All** on the round screen while signed in as admin to view submitted ballots. You can export a list of all ballots, including which badgeholder voted for which application and how many votes they allocated, by clicking the "Download CSV" button in the top-right corner. #### Editing The Badgeholder List You can add additional badgeholders freely up until the **Distribution** phase beings. Please note that only badgeholders that have not yet cast a ballot can be *removed* from the round. Once a badgeholder has been added, they can immediately cast their ballot from the round view. #### Advanced: Uploading a ballot on behalf of a badgeholder In some cases, it may be operationally necessary for an admin to upload a ballot on behalf of a badgeholder. To do so, click the "Manually upload ballot" button on the **Ballots** screen. You will need to choose the Ethereum address of the badgeholder and upload a CSV or Excel file containing their ballot, matching the [format for badgeholder ballot uploads](http://localhost:5174/rpgf/vote-on-a-round#4-alternative-voting-via-spreadsheet-upload). :::warning Uploading a ballot on behalf of a badgeholder should only be done in exceptional circumstances, as it circumvents the standard voting process and may raise concerns about ballot integrity. Ensure you have explicit permission from the badgeholder before proceeding. A ballot uploaded by an admin will: * not be signed by the badgeholder's wallet, but the admin's. * be marked in the audit log as having been uploaded by an admin. ::: ### 3. Publishing Results After the voting period has officially ended, your next step is to tally the votes and publish the final results. #### Tallying Votes Navigate to the "All applications" screen, where a new card will prompt you to prepare the results. Drips provides several automated methods for tallying votes: * **Sum**: The total number of votes received by each project across all ballots. * **Average**: The average number of votes received by a project across all ballots. * **Median**: The median number of votes received by a project across all ballots. * **Spreadsheet Upload (CSV or XLSX)**: If you want to use a custom allocation method, you can upload a spreadsheet with your results. This process is similar to [uploading a ballot as a spreadsheet](/rpgf/vote-on-a-round#uploading-a-ballot-as-a-spreadsheet). You will first need to export the approved applications for your round, then re-upload the spreadsheet with at least `ID` and `Allocation` columns, where `ID` is the application ID and `Allocation` is the result you want to associate to that application. #### Reviewing and Publishing Once you select a tallying method and calculate the results, they will appear on the "All applications" screen. **At this stage, the results are visible only to you and other round admins.** You can review the outcome and sort the list by the amount of votes received, as well as download a CSV of all applications, which now includes the calculated results as well. When you are ready, click the **Publish results** button to make the final results public to everyone. ### 4. Distributing Rewards Rewards for RPGF rounds are sent via [Drip Lists](/support-your-dependencies/overview) directly to the winners' Drips Projects (their claimed GitHub repositories). #### Automatically Preparing a Drip List After you publish the results, a button to **"Prepare a Drip List"** will appear. This powerful feature automatically generates a new Drip List where the percentage splits match the final vote distribution. :::warning Percentages on Drip Lists have a maximum resolution of 4 digits past the decimal. This means that depending on the chosen ERC-20 token's resolution, final distribution amounts may not *perfectly* match the round results after being sent to the Drip List. ::: Once created, this Drip List will be publicly displayed in the "Distribution" section of your round's page. Anyone—including your organization, sponsors, or community members—can then fund this list with a one-time donation or a continuous stream of any ERC-20 token. #### Manually Linking Drip Lists You also have the option to create one or more Drip Lists manually and link them to your round. In the "Distribution" section, click **"Edit linked lists"** to add or remove any Drip List. Please note that linking or unlinking a Drip List only affects which lists are displayed publicly on your round's page. ### 5. Exporting Round Data For transparency, analysis, or record-keeping, you can download raw data from your round at any time. #### Application Data Navigate to the **"All applications"** page and click the "Download" button in the top right. This will export a CSV file containing all submitted data for every application, with one application per line. **This export includes all private fields.** #### Vote Data After the voting phase has started, navigate to the **"Ballots"** section of your round. The "Download CSV" button here will export a file containing the raw voting data. The CSV includes one line for application on each ballot, detailing which badgeholder voted for which application, the number of votes they allocated, and an application ID that can be used to cross-reference the data with the applications export. ### Audit Logs For security and compliance, Drips maintains an immutable audit log of all actions taken on your round. This includes actions such as approving or rejecting applications, publishing results, users submitting applications, KYC providers verifying identities, and more. To view the audit log for your round, head to **Settings** → **Audit log**. ## Applying to a RetroPGF Round import Figure from '../../components/Figure' Applying to a RetroPGF round on Drips allows you to showcase your past contributions and be considered for funding by the round organizers. This guide explains the application process from the perspective of an applicant. You can submit applications to any round that is currently in the "Registration" phase. ### Before You Apply: Your Drips Project All applications to an RPGF round must be submitted on behalf of a Drips *Project*. A Project on Drips is a claimed GitHub repository that can receive and split funds automatically. This means you must [claim a GitHub repository on Drips](/get-support/claim-your-repository) before or during the application process. :::info **Not an open-source project?** If you are an individual or organization without a dedicated GitHub repository, you can still apply by creating an otherwise empty GitHub repository to represent your entity on Drips. We are working on allowing applications with only an Ethereum address in the future. ::: :::info **On supported networks including Filecoin, Drips will cover the transaction fee ("gas") required for claiming a project.** You can disable gasless transactions under Settings → Gasless transactions. ::: #### How Payouts Work If your application is successful, any rewards from the round will be paid out directly to your Drips Project. These funds will then be automatically distributed according to your Project's configured splits between maintainers and dependencies. For example, if your Project is configured to forward 20% of incoming funds to its dependencies, that same 20% of any RetroPGF rewards sent to your project by the round organizers will be automatically forwarded to the open-source projects you rely on. :::info While optional, forwarding even a small percentage of funds to your software dependencies is a **great way to support the projects that enable your success**. Consider adding your key dependencies to your Project's splits for a fairer, more equitable open-source ecosystem. ::: ### How to Apply During a round's application phase, follow these steps to submit your application. #### 1. Start Your Application Navigate to the round's public page. If the application period is open, you will see an **Apply now** button in the top-right corner. Click it, then connect your Ethereum wallet and sign in with a free signature to begin. #### 2. Select Your Project You will be asked to select which of your claimed Drips Projects you are applying with. If you haven't claimed your project yet, you can use the **Claim new project** button to start that process first.
#### 3. Pick a category Choose from one of the available categories for the given round. The category you choose determines the application form fields shown in the next step. #### 4. Fill Out the Application Form Fill out the application form fields truthfully. The questions and required information are configured by the round's organizers to help round voters evaluate your project's impact. :::danger Fields **NOT** marked with a lock icon (🔒) are public. Any information you enter into these fields will be permanently published to the blockchain and will be publicly visible to everyone. Only enter sensitive information into fields that are marked as private. ::: #### 5. Submit Your Application Once you have filled out all the required fields, click submit. Submitting an application requires a blockchain transaction to create a permanent, verifiable record of your submission. :::info **On supported networks including Filecoin, Drips will cover the transaction fee ("gas") for you.** You can disable gasless transactions under **Settings** → **Gasless transactions**. ::: :::info Your application's public information will be uploaded to IPFS and **attested to on-chain** via the [Ethereum Attestation Service (EAS)](https://attest.sh/). After the round organizers have reviewed and approved your application, it will be publicly visible on Drips. ::: ### After You've Applied #### Checking Your Application Status After submitting, you can view your application and check its status. Initially, its status will be `Pending`. The round organizers will review it and change its status to either `Approved` or `Rejected`. * **Approved** applications become publicly visible on the round page (excluding any private data). * **Pending** and **Rejected** applications are only visible to you and the round admins. If your application was rejected by the round organizers, you have the option to "re-submit" it by making an edit anytime during the application period (See [Updating An Application](#updating-an-application)). Doing so will move its status back to `Pending`. To see all your submissions, navigate to the round's main page, sign in, and filter the list of applications by **"Own applications"**.
#### Verifying Your Identity (KYC/KYB) The round's organizers may require you to complete an external KYC (Know Your Customer) / KYB (Know Your Business) identitify verification process before you can receive any rewards. If KYC/KYB is required, you will see a notification on your application page with a link to start the process. Follow the instructions provided to complete your verification. :::info The specific provider used may vary between rounds. If you have any questions or concerns about the KYC/KYB process, please contact the round organizers directly. ::: #### Updating An Application You can update your application at any time during the round's application phase. To do so, navigate to the application you'd like to edit, ensure you're signed in as the applicant, and click "Edit" in the top right. Make the desired adjustments, then confirm with your wallet. Please note that **updating your application will move it back `Pending` status**, meaning it will need to be reviewed again by the round organizers. :::info **Want to change your application's logo or avatar?** Please update the avatar of the application's underlying Drips Project by clicking Edit on the project view. After updating the project avatar, your application's avatar is automatically going to update some time later (maximum 12 hours). ::: :::info Application information is fully historized. Anyone can see the history of an application by clicking the "History" button in the top-right corner of the application view. ::: #### Receiving Rewards Rewards are sent **directly to the Drips project you applied with**. Once sent by the round organizers, the funds received by your project will be split according to your configured list of maintainers and (optionally) dependencies, and become collectable by their recipients. You can check whether your connected address has any collectable funds by connecting your wallet to the Drips app and clicking the "Collect" button in the top-right corner. :::info Please note that depending on the chain that rewards are being distributed on, funds may reach you only after a short [settlement period](/get-support/claim-your-repository#settlement-of-future-funds). ::: ## Create a RetroPGF Round import Figure from '../../components/Figure' Retroactive Public Goods Funding (RetroPGF) on Drips allows communities to fund projects and contributors for their past impact. This process is organized into *Rounds*, each with its own timeline, budget, and participants. Creating a round begins with a private *Draft*. In this state, you and other designated *Admins* can collaboratively set up all the necessary parameters before making it public. Once all required settings are configured, you can *publish* the round, opening it up for applications and voting. :::warning Drips RPGF is currently only available for select partners. Interested in using Drips to run your RetroPGF round? [Get in touch](https://drips-network.notion.site/1e4c52c9599781b5a0aeca3e8eb1b3e4). :::
### Getting Started: Creating a Draft To start, navigate to the **RetroPGF** tab in the main Drips app menu. You may be asked to sign in with your wallet, which does not require a transaction or gas fees. An RPGF round on Drips always happens on one specific chain, so make sure you select the chain you want to create your round on using the network picker on the top right. On the "Your rounds" page, you will see all the rounds you are currently managing. Click the **+ New round** button to create a new draft. You will be taken to the main page for your new draft round. On the right, a **TO-DO** list tracks the required configuration steps you need to complete before you can publish. ### Configuring Your Draft Round Your round remains a private draft, invisible to the public, until you explicitly publish it. You can configure the settings in any order. The TO-DO list will update as you save your changes for each section. #### Name, Look & Feel First, give your round a unique identity. In the **Representation** settings (or by clicking **Settings** on the main draft page), you can configure the following: * **Round name**: The public name of your funding round. * **Emoji & Color**: Used to visually distinguish your round across the app. * **URL**: A custom, human-readable URL slug for your round's public page. * **Description**: A detailed description of your round's goals and purpose. This field supports Markdown for rich text formatting.
#### Schedule The **Schedule** section is where you define the timeline for your round's different phases: * **Application intake**: The period when projects can submit their applications to be considered for funding. * **Voting**: The period when designated *badgeholders* will vote on the submitted applications. * **Results**: The date and time when the voting results will be finalized and made public. :::caution Once your round is published, the schedule cannot be changed. Double-check all dates and times before publishing. :::
#### Badgeholders & Voting In the **Voting** section, you define who can vote and the rules of the voting process: * **Votes per voter**: The total number of votes each badgeholder can allocate across all projects. * **Maximum votes per project**: The maximum number of votes any single project can receive from a single badgeholder. * **Badgeholder guidelines link**: A URL pointing to a document that outlines the rules and expectations for badgeholders. Badgeholders will need to confirm having read this page before being able submit their ballot. * **Badgeholders**: The list of Ethereum addresses that will be granted voting power in the round. You can add them one by one, or upload a CSV with one Ethereum address per line.
#### Forms & Categories Lastly, set up the application form for your round on the **Applications** tab.
##### Creating Forms First, create one or more custom application forms by choosing from a variety of field types, including email, markdown, URL, and more. You can freely add, configure, and re-order fields within the form creator. :::info You can mark specific fields as **Private**. The content submitted to private fields will only be visible to the round's admins, which is useful for collecting sensitive information. ::: :::danger If you ask for any private or otherwise sensitive information, you **must** mark the field as private. All fields not marked as private will be publicly visible, and **immutably written on-chain** as part of the application attestation process. ::: ##### Creating Application Categories Next, create at least one application category. Each category is linked to a specific application form. When applying, applicants will select which category they are applying to, and the corresponding form will be presented to them. ### Optional Configuration While in the draft stage, you can also configure several optional settings to tailor the round to your specific needs. #### Adding Round Admins You can collaborate on configuring a draft round with multiple people. In the **Admins** section, you can add the Ethereum addresses of other users you want to grant administrative access to. Admins can edit all round settings, view private application data, and export voting data. #### KYC/KYB Drips has built-in KYC/KYB support to help you comply with regulatory requirements. To enable this, please [get in touch](https://drips-network.notion.site/1e4c52c9599781b5a0aeca3e8eb1b3e4) with the Drips team. ### Publishing Your Round Once you have completed all the items on the **TO-DO** list, the **Publish round** button will become active. Clicking this button will prompt you with a final confirmation. Remember, publishing is a permanent action—the round's URL and schedule cannot be edited later. After you confirm, your round will be live and accessible at its custom URL! You can use the **Share** button to easily spread the word. Now, projects and contributors can begin submitting their applications according to the schedule you defined. ## RetroPGF on Drips import Figure from '../../components/Figure' Retroactive Public Goods Funding (RPGF) is a powerful mechanism for funding impactful work that has already been completed. Instead of funding promises about future work, RPGF allows communities to identify and reward projects and individuals who have already provided demonstrable value. This "results-based" approach helps ensure that funds are directed effectively towards proven contributors. Drips provides a comprehensive, on-chain platform to run your own RPGF rounds from start to finish.
:::warning Drips RPGF is currently only available for select partners. Interested in using Drips to run your RetroPGF round? [Get in touch](https://drips-network.notion.site/1e4c52c9599781b5a0aeca3e8eb1b3e4). ::: ### The Anatomy of an RPGF Round On Drips, the entire RPGF process is organized into discrete events called *Rounds*. While every round is unique, they generally follow three main stages: 1. **Application**: Projects and individuals submit applications to showcase their past work and impact, hoping to be considered for funding. 2. **Voting**: A group of designated voters, often called *badgeholders*, review the applications and vote to allocate the round's funding pool among the applicants they believe have created the most value. 3. **Payout**: Once voting is complete, the results are tallied and the funds are distributed to the winning applicants based on the voting outcomes.
### Why Run Your RPGF Round on Drips? Drips is designed to be the best place to run your RPGF program. Our suite of tools provides a seamless experience for round administrators, applicants, and badgeholders alike. #### ↔️ A Complete End-to-End Solution Drips handles the entire lifecycle of your funding round. From building a custom application form and managing submissions to facilitating the voting process and executing the final payouts, our platform is a one-stop solution. #### 💸 Payouts Directly to GitHub Repositories Leveraging the core Drips protocol, you can distribute funds directly to open-source projects via their GitHub repositories.This eliminates the massive operational overhead of chasing down wallet addresses and ensures that funding reaches projects and their declared dependencies automatically. #### 📈 Amplified impact Projects receiving funds on Drips can forward a percentage of their funds to their software dependencies, which can greatly amplify the reach of your RetroPGF round. #### 🔒 Built-in KYC/KYB Drips works directly with different third-party providers to offer KYC/KYB services to round organizers. This makes it easy to ensure compliance with regulatory requirements without adding friction for applicants. #### ✏️ Fully Customizable Application Forms Every funding round is different. Drips features a flexible form builder that allows you to create a bespoke application experience tailored to your round's specific needs. You can add various field types and even mark certain fields as "private" to securely collect sensitive information that will only be visible to round administrators. Public application data is also attested to on-chain by applicants, ensuring transparency. #### 🔍 Transparent & Verifiable Data For full transparency and analysis, round admins can easily download the raw application and voting data at any time. This data is provided in a simple CSV format, allowing you to build custom dashboards, perform deeper analysis, or simply keep a record of your round's history. #### 🌟 A Best-in-Class User Experience We believe that great tools lead to great outcomes. We've obsessed over the details to provide a world-class experience for every participant. Applicants enjoy a straightforward submission process, while badgeholders are equipped with an intuitive interface to thoughtfully review applications and cast their votes. ### Where to Go Next Whether you're looking to run a funding round, apply for a grant, or help evaluate contributions, here are the guides for you. #### For Round Organizers If you want to create and manage your own RPGF round, these guides cover the entire process from start to finish. * [**Create your round**](/rpgf/create-your-round): A step-by-step walkthrough of setting up your round's parameters, schedule, and application form. * [**Administering your round**](/rpgf/administering-your-round): Learn how to review applications, publish results, and distribute rewards. #### For Applicants If you are a project or contributor looking to get recognized and funded for your past work, this guide is for you. * [**Apply to a round**](/rpgf/apply-to-a-round): Learn how to prepare your Drips Project and submit a strong application. #### For Badgeholders If you've been selected as a voter to help allocate funds based on your expertise, this guide explains your role. * [**Vote on a round**](/rpgf/vote-on-a-round): A complete guide to the voting process, from building your ballot to submitting your votes. ## Voting in a RetroPGF Round import Figure from '../../components/Figure' As a *badgeholder* in a Drips RetroPGF Round, your role is to evaluate the contributions of applicants and allocate votes to reward the impact you believe they've created. This guide will walk you through the voting process. To vote in a round, your Ethereum address must have been designated as a badgeholder by the round's administrators. :::info To understand the full lifecycle of a round, you can read our [introduction to RetroPGF](/rpgf/overview). ::: ### How to Vote The voting process is designed to be straightforward, allowing you to focus on making informed decisions. Your progress is saved locally in your browser as you build your ballot, so you can take your time and resume at any point. #### 1. Access the Round First, navigate to the public page of the round you wish to vote on. Once the voting phase is active, you will see a prompt to begin. Connect the wallet that has been designated as a badgeholder and sign in. This is a free, gas-less signature to verify your identity. Once signed in, click the **Vote now** button in the top-right corner of the page to enter the voting interface. :::info **Don't see the vote button?** Double-check you're connected with the correct voter wallet address. If you are but the Vote Now button still doesn't appear, reach out to the round's organizers. ::: #### 2. Build Your Ballot (Pick Applications) The first step is to review the list of all accepted applications. You can browse, search, and filter to find the projects you want to support. If the round organizers have provided voting guidelines, you will be prompted to review them here. You now have two options to proceed: 1. **Use the Web Interface:** Select applications by clicking the checkbox next to their name. This will add them to your personal ballot, which you will configure in the next step. 2. **Use a Spreadsheet:** If you prefer voting in a spreadsheet, skip to the [**Voting via spreadsheet**](#4-alternative-voting-via-spreadsheet-upload) section below.
#### 3. Allocate Votes (Web Interface) If you used the web interface to pick applications, click 'Assign votes' (or 'Step 3' in the voting panel) to proceed to your ballot. Here, you will see only the applications you chose. Enter the amount of votes you want to assign to each one. The interface will show you how many votes you have available to allocate in total, and will respect the "maximum votes per project" limit if one was set by the round's admins.
#### 4. Alternative: Voting via Spreadsheet Upload If you clicked **Vote using spreadsheet** in Step 2, a new window will open. This method allows you to download all applications, enter your votes in a spreadsheet program (like Excel or Google Sheets), and upload the file to submit your *entire* ballot at once. The process is as follows: 1. **Download the ballot template:** Click 'Download CSV' or 'Download XLSX' to get a file of all approved applications, including all data displayed in the Web UI. 2. **Make your vote allocations:** Open the file and find the **'Allocation'** column. Enter your votes (as integers, no fractions) for the projects you wish to support. Leave the 'Allocation' cell blank or enter '0' for projects you don't want to vote for. 3. **Upload your ballot:** Save your edited spreadsheet (as CSV or XLSX) and upload it in the 'Upload your result' section. Click 'Submit ballot' to confirm. :::info The spreadsheet must contain at least the `ID` and `Allocation` columns to be valid. Submitting a spreadsheet will overwrite any ballot selections you may have previously made in the web interface. ::: #### 5. Submit Your Ballot **If using the web interface:** Once you are satisfied with your vote allocation, click the 'Submit ballot' button at the bottom of the page. **If using the spreadsheet upload:** Your ballot is submitted when you click 'Submit ballot' in the upload modal. :::caution **Your ballot is private.** Once submitted, your ballot is recorded securely. Its contents are only visible to the round's administrators to ensure voter privacy. ::: ### Editing Your Ballot You can change your mind at any time while the voting period is still active. To edit your submission, simply return to the round's page. The button in the top-right will now say **Edit your ballot**. Clicking it will take you back to the voting interface, which will be pre-filled with your most recent submission (whether it came from the UI or a spreadsheet upload). From here, you can: * **Edit in the UI:** Manually adjust your project selections and vote allocations, then click 'Submit ballot' again. * **Overwrite with a new spreadsheet:** Click the **Update using spreadsheet** button. This will open the upload modal, and submitting a new file will replace your entire existing ballot. You can edit and resubmit as many times as you like before the voting period ends. import Figure from '../../components/Figure' ## Drip Lists On Drips, anyone can create a *Drip List* to flexibly send funds to a list of up to 200 open-source GitHub repositories, Ethereum addresses, or other Drip Lists at a time. As project maintainers come to Drips to claim their funds, they themselves are asked to provide a list of other projects they depend on, and can choose to automatically forward a percentage of their earnings to them. In this article, we'll go over how you can create your own *Drip List*, and start supporting it with continuous or instant donations using any ERC-20 token. :::info If you haven't yet, learn more about the Drips Dependency Tree in our [introduction](/). ::: ### Creating your Drip List To create a Drip List, open the [Drips App](https://www.drips.network/app), connect your wallet, and navigate to **Drip Lists → Create Drip List**. You'll be asked to specify which up to 200 individual GitHub repositories, Ethereum addresses, or other Drip Lists you’d like to forward what percentage of funds. Then, you’ll have a chance to immediately start supporting your list with a continuous donation or an instant one-time donation. Once done, funds will start moving immediately, and anyone can make donations to your list at any time. #### Collaborative Drip Lists Alternatively, you can invite any number of *collaborators* to vote on the recipients for a new Drip List with a [Collaborative Drip List](/support-your-dependencies/collaborative-drip-lists/creating-a-collaborative-drip-list). :::info If you choose to include someone else’s Drip List on yours, **make sure that you trust the list’s owner**, because they may at any point in the future change its recipients. ::: ### How funds flow through a Drip List You can think of your Drip List as a personal “money router” that automatically *splits* any incoming funds to its recipients after each [settlement period](/get-support/claim-your-repository#settlement-of-future-funds) (monthly on Ethereum Mainnet, daily on other chains). Anyone can establish one or more continuous or one-time donations to your list.
#### Continuous donations A continuous donation on Drips is an ongoing *stream* of funds, with per-second settlement. Let's say you'd like to support the projects on your Drip List with 500 USDC every month. To do so, you create a continuous donation to your list, configure it to stream 500 USDC over 30 days, and then top up your USDC balance on Drips with an initial amount. As soon as your account is funded, you'll see USDC funds stream to your list in real-time. The benefit of *streams* over monthly payments is that you're in full control: You can pause, alter or completely stop your stream even in the middle of the month. As your balance decreases, you can flexibly *top up* your Drips account with additional USDC to keep the stream running, or at any point withdraw any not-yet-streamed funds that are still on your Drips account. :::info Apart from supporting your Drip List with a continuous donation, you can also establish arbitrary *Token Streams* to any Ethereum address for any other usecase. To do so, head over to **Streams → Create Stream** in the Drips App. ::: #### Instant one-time donations If you prefer a single contribution, you can make an instant one-time donation to any Drip List. Once the donation is confirmed, it is queued for the next [settlement period](/get-support/claim-your-repository#settlement-of-future-funds) and will be distributed alongside any continuous donations. #### Settlement of funds While Continuous Donation streams to your Drip List is calculated per-second, funds in the global Drips Dependency Tree are automatically *split* after each [settlement period](/get-support/claim-your-repository#settlement-of-future-funds), which varies by network (monthly on Ethereum Mainnet, daily on other networks). This means that any funds you or others donate to your Drip List end up with the projects on the list (and, if applicable, their dependencies) once that period completes. You can at any point review the next settlement window by clicking the "Collect" button in the top-right, but please note that the settlement doesn't occur exactly at midnight, and the timing depends on the network where the Drip List operates. As a result of this, you can edit the recipients on your Drip List before the settlement finalizes, and this will cause *all* funds sent to your list within the last settlement period to be split according to the new configuration. :::info If you'd like to learn more about the technical details behind settlement, you can read through our technical [Drips inner workings](/the-protocol/advanced/drips-inner-workings) article. ::: #### Supporting other Drip Lists Drip Lists are *nestable*, meaning anyone can add anyone elses Drip List to *their* Drip List, and forward a specifc percentage of *its* income to the projects contained on the nested list. ## Accounts in Drips In this section we take a look at the Drips Protocol's driver-based account model and review the types of user accounts that are available in Drips V2 today. ### Background and Introduction Drips V2 comes with a driver-based account model, which opens the door to enabling many different types of user accounts to exchange funds with one another in Drips. What exactly does this mean? It means, for instance, that end-users can choose to stream or Split funds from an account that is directly associated with their Ethereum address, similar to how an ordinary Ethereum wallet works. Or they can choose to create one or more NFT-based accounts that will each have its own separate balance and Drips and Splits configurations, but will all be controlled by the Ethereum address holding the NFTs. Under the hood, each of these account types is enabled by an account driver which has been added into the Drips smart contracts by the Drips Team, and we expect that even more drivers will be deployed in the future to add support for new types of accounts. We'll dive into all of the details below, but from a high-level the most important things to keep in mind are: * **In Drips, multiple types of user accounts are able to control funds, including Ethereum addresses, NFT-based accounts and even GitHub repositories.** * **This is possible because of Drips' use of an extensible system of "account drivers", which govern the implementations of different account types through smart contracts.** #### What Do We Mean by "Accounts" in Drips? First, let's briefly review what we mean by an "account". For the purposes of Drips, what we mean is: * A unique identifier that corresponds one-to-one to an account that can send and receive funds (e.g. using streams or Splits) in the Drips Protocol. * A way to authenticate critical actions on that account, like withdrawing funds, or setting up new streams and Splits configurations. With that out of the way, let's take a look at some more of the technical details. ### Drips Account IDs As mentioned above, every user identity in Drips has an account ID. This account ID is a 32 byte number, where the bytes in the number are used to encode two other "component" IDs, as shown below: ![Diagram 1][u1] The **Driver ID** is the ID of the driver in the Drips smart contracts, which is responsible for Authenticating and managing funds for the account. The **Driver Sub-Account ID** is the ID of the account's specific place within the range of IDs managed by the driver, and is used to distinguish it from all of the other accounts managed by that driver. It's worth noting that most end-users will likely never have to consider such low-level technical details when using Drips, but in some cases, developers will. For developers building on Drips, the important thing to remember about account IDs is that every account ID always points to a single driver in Drips (which "manages" that ID, in a sense and authorizes the user's access), as well as a single "sub-account" in the space of accounts managed by that driver, which serves to separate the account's funds and configurations from those of others. ### Drips Account Drivers Now let's dive a bit deeper into what an account driver is and how it works. As discussed above, to allow for flexibility and extensibility in the types of accounts supported in Drips, we introduced the concept of account drivers in Drips V2. Each driver is responsible for managing a range of account IDs where the first 4 bytes of the account ID matches the ID with which the driver is registered in Drips. #### AddressDriver To understand this better through an example, let's consider AddressDriver, which is registered under ID 0 in Drips. This driver was the very first driver created by the Drips Team and its purpose is to enable each Ethereum address to manage a unique account in Drips. We can see how this works by looking at the code in the AddressDriver smart contract. As we can see, AddressDriver contains a `setDrips(...)` method which, when called, "Sets the message sender's drips configuration." Looking into the code a bit more, we see that AddressDriver also contains the helper methods `callerAccountId()` and `calcAccountId(address userAddr)`, which translate the message sender's address into a unique account ID within the range of account IDs controlled by AddressDriver. When `setDrips(...)` is called in AddressDriver, we can see that `callerAccountId()` is called to get the account ID for the message sender, and then another call is made to the `setDrips(...)` method in the Drips smart contract, passing this calculated account ID as a parameter. The end result is that AddressDriver translates between the identity feature it's interested in (in this case, the message sender's Ethereum address) and the more general account IDs utilized by the Drips. #### NFTDriver AddressDriver is probably the easiest driver to understand, because it intuitively matches how we most often think about accounts within Ethereum-based web3 apps. Namely, for most web3 apps we think "I connect with my Ethereum wallet (and its address)". However, another driver which may be even more useful to developers looking to build on Drips is NFTDriver. Instead of allowing a user to make changes to the "main" Drips account for their Ethereum address, with NFTDriver, developers can enable users to create an unlimited number of NFT-based accounts that are specific to their app, each with its own account balance and streaming settings. In practice, this kind of functionality is something that many app developers are interested in. Similar to AddressDriver, we can see how NFTDriver translates between NFTs and Drips account IDs by looking at the code. The first thing we notice is that NFTDriver itself is an ERC-721 contract which can mint and burn new NFT-based Drips accounts based on calls to `mint(...)`, which is callable by anyone. We can also see that the methods `_useNextTokenId()` and `nextTokenId()`, which are called in turn by `mint(...)`, play similar roles to the role that `callerAccountId()` and `calcAccountId(address userAddr)` play in AddressDriver. In particular, when `setDrips(...)` and other permissioned methods in NFTDriver are called, the code uses the modifier `onlyHolder(uint256 tokenId)` to check that the method is being called by the holder of the NFT token. Assuming it is, the call is then passed on to the corresponding method (e.g. in this case `setDrips()`) in the Drips smart contract, and the token ID is passed to Drips as the account ID of the account identity to make changes for. Here again, we can see how NFTDriver acts as a kind of translation layer between the account and the authorization features of interest (i.e. "does the sender hold this NFT?") and the more generalized account IDs required by Drips. The end result is that developers building on Drips are able to mint new NFT-based accounts, which will each have their own balances and settings for streaming and splitting, whenever they wish. And each such NFT also corresponds to a single underlying account ID in Drips. Having looked at AddressDriver and NFTDriver in detail, we can now see how the Drips Protocol's extensible account model enables many different types of accounts to be used, all of which still function similarly and interchangeably at the lowest level of the protocol. ### User Accounts and the Drips Javascript SDK When interacting with Drips through the Javascript SDK, most of these details are abstracted away from developers by convenience classes that hide the full complexity - including account IDs - for most common actions developers will wish to take. For instance, to build on the SDK and allow an end-user to collect funds streamed to them through Drips, a developer simply creates an [AddressDriverClient][ad] and calls the `collect()` method, which has a signature that looks like this: \> public async collect(tokenAddress: string, transferToAddress: string): Promisecontracttransaction You'll notice that this method signature contains no mention of any account IDs - it's all just ordinary Ethereum addresses (here \`\` is the Ethereum address that the user wishes to collect their funds to). On the other hand, for developers looking to build more sophisticated applications on top of Drips, it will likely be necessary for them to have a full understanding of the Drips account model and in some cases to interact with account IDs rather than simple Ethereum addresses, even if they are building on top of the SDK. For instance, one area where account IDs are heavily used is in the Drips subgraph, where many entity types in the subgraph schema refer to account IDs rather than Ethereum addresses and the corresponding query methods in the [DripsSubgraphClient][ds] in the SDK take accountId-based parameter values and also returns data that includes accountIds. So developers wishing to work directly with that data in its raw form will need to understand what the account IDs mean and how to unpack them. At the same time, as time goes on the Drips Team will likely be adding more and more convenience classes and helper code to the SDK to make working with account IDs as simple and easy as possible, in cases where it is required. #### RepoDriver TBD #### ImmutableSplitsDriver TBD ### Wrapping Up In this section, we did a deep dive into some of the technical aspects of Drips Protocol's flexible driver-based approach to managing user accounts. We also looked at the drivers the Drips Team shipped with Drips V2, which provide developers and users with the option to set up and manage Drips accounts based on either Ethereum addresses or NFTs. Hopefully you enjoyed this somewhat technical adventure :) One last note, the Drips Team plans to release more account drivers in the coming months, which should enable entirely new and different kinds of accounts in Drips. Stay tuned for more details! [ad]: https://github.com/radicle-dev/drips-js-sdk/blob/v2/src/AddressDriver/AddressDriverClient.ts [ds]: https://github.com/radicle-dev/drips-js-sdk/blob/v2/src/DripsSubgraph/DripsSubgraphClient.ts [u1]: /img/drips_user_identity-1.png ## Drips v2 features The goal of Drips v2 is to be the most powerful and feature-complete decentralized, autonomous, and non-custodial protocol for streaming and splitting funds in web3, with the following key features. #### Multi-Token Support (Any ERC20) Drips v2 allows streaming of any ERC20 token. #### No Wrapped Tokens Some streaming protocols require users to first wrap their tokens, introducing additional contracts as well as assumptions around trust and solvency. Drips v2 allows users to natively stream any ERC20 token - no wrapped tokens required. #### Gas-Optimized for Many-to-One Streams Most web3 streaming protocols only allow users to receive streams from small numbers of other users, and cannot practically support designs where hundreds or thousands of subscribers stream to a single recipient. In contrast, Drips v2 is architected to be extremely gas-efficient for both one-to-one streaming and many-to-one streaming use cases at real-world scales, targeting Ethereum mainnet. #### Scheduled Drips With Drips v2, users and developers have the ability to schedule streams to start and end at specific times in the future, allowing more precision around the total amount of funds streamed. #### Shared Stream Balances While other streaming protocols require users to top-up each stream that they create, leading to many transactions and high gas costs to maintain streams over time, Drips allows users to fund and top-up multiple streams using a single balance and a single transaction. #### A Flexible Identity Model Drips v2 also introduces a new, more flexible model for user identity and accounts, that provides additional options for different ways that users can create accounts and engage with the protocol. For example, an NFT or a Git repository can control an account in Drips. #### One Smart Contract / One Graph Drips uses one smart contract for streaming and splitting, enabling effortless and flexible token routing. For instance, in Drips, when one user streams funds to another, the recipient can set up a Splits configuration to automatically and continuously share a portion of all incoming funds streamed to them with whomever they wish. ## Overview The Drips protocol is a fully decentralized, non-custodial, autonomous, and gas-optimized protocol allowing you to schedule and structure your ERC-20 token transactions to particular addresses. The information provided herein are for educational purposes only.
Disclaimer: The Drips protocol operates in a fully decentralized and autonomous manner, like the Ethereum protocol with which it is integrated. Therefore, no entity or person controls or is in any way responsible for the ongoing operation, running, or functioning of the Drips protocol, nor does any entity or person have custody of any funds raised or streamed in the Drips protocol. You acknowledge that you are solely responsible for any interaction with the Drips protocol and any harm, damage or loss that may occur. There is no warranty, express or implied, for the Drips protocol and/or the software and/or any content. The Drips protocol and in particular the software is of experimental nature and available for use to the public on an “as-is” basis and no representations or warranties of any kind are made with respect to the Drips protocol, its operations and functionality, or its fitness for any specific purpose. BY ACCESSING THE DRIPS PROTOCOL, YOU ACKNOWLEDGE, UNDERSTAND AND AGREE THAT YOU USE THE DRIPS PROTOCOL AND THE SOFTWARE AT YOUR OWN RISK AND YOU ASSUME ANY COSTS, RESPONSIBILITY AND/OR ANY LIABILITY FOR ANY DAMAGES OR LOSSES YOU MAY INCUR, INCLUDING ANY SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF YOUR USE, OR INABILITY TO USE, THE DRIPS PROTOCOL AND/OR THE SOFTWARE.

There are three ways in which funds can be flowing in Drips protocol: * **Streaming** is moving funds between users over a period of time at a fixed per-second rate. * **Giving** is transferring an amount of funds between users immediately. * **Splitting** is transferring a fixed fraction of funds received by one user to another user. ### Streaming The streaming functionality sends funds over a period of time. To start streaming you need to configure a list of stream receivers and top up your streamable balance. Once you configure those, the funds flow will start automatically and will stop when the balance runs out. You can change the balance at any time, either top up more funds or withdraw any amount from what hasn't been streamed yet. The balance is updated every second, and there's no way to withdraw already-streamed funds. The list of receivers can be changed at any time with an immediate effect, but it'll never affect the past, only the streaming behavior during the present timestamp and in the future. For each ERC-20 token every user has a separate streams configuration and a separate balance, so you can configure streaming different tokens independently. The streams receivers list contains between 0 and 100 entries. By default, every account has an empty receivers list. An empty list means that there are no receivers, so nothing will be streamed to anybody. The list must be sorted, and it can't contain duplicate entries. Only streams receivers on your currently set list are receiving tokens streamed from you, so, when you add a receiver or remove one, it respectively starts or stops streaming to them. Every entry consists of a receiver user ID and a streaming rate, which is expressed in tokens per second. To increase precision the amount streamed every second has 9 extra decimals, so you express streaming rates with precision higher than one full token per second. For example, you can stream 2.5 tokens per second or 0.001 tokens per second. See [Streaming Fractional Amounts](/the-protocol/advanced/fractional-amounts) for more details. Optionally, each stream receivers list entry may contain a start timestamp and a maximum duration. If the start timestamp is in the future, streaming will be postponed until that timestamp. If the duration is set, streaming will stop after it elapses. The duration is relative to the start timestamp, or, if the start timestamp isn't set, the timestamp when the stream configuration is updated. Both balance and receivers list updates are done by calling the `setStreams` function of the [driver](/the-protocol/accounts-in-drips#drips-account-drivers) managing your user ID. You can't change the balance without updating the streams receivers list, but it's fine if both the old and the new lists are identical. You also can't update the streams receivers list without changing the balance, but it's fine if the balance change is zero. For details about how streaming is implemented see [Drips Inner Workings](/the-protocol/advanced/drips-inner-workings). ### Giving The Giving functionality transfers an amount of tokens to the chosen user. It's different from streaming because it's a one-time, immediate operation, and there's no streaming configuration involved. Since the funds are transferred into the protocol while giving, there is no need for a user to have a separate balance dedicated to a specific giving operation. Giving is done by calling the `give` function of the [driver](/the-protocol/accounts-in-drips#drips-account-drivers) managing your account ID. ### Splitting The Splitting functionality divides received funds and transfers them to other users. To split, you need to configure a list of splits receivers. Next, all funds you setup to be split will be distributed according to that configuration. Each user has a single splits receivers list which is applied to all ERC-20 tokens, so all received funds are split in the same way. Updating the splits configuration doesn't split funds that haven't been split yet. This means that unless funds are actually split, there's no guarantee that the current configuration will be used to split the funds, the user who received the funds may route them however they feel. If a splits configuration needs to be trusted to never change, `ImmutableSplitsDriver` may be used to create a dummy user who's only able to set their splits configuration once and can't change it afterward. The splits receivers list contains between 0 and 200 entries. By default, every user has an empty receivers list set. An empty list means that no funds are split, and 100% of the funds go to the user who received them. Each splits receiver on the list has a percentage assigned to them, which defines the fraction of received funds that will be transferred to that user when splitting. All the list entries must add up to no more than 100%, in which case the receiving user won't get any funds, and will transfer all received funds to others. The list must be sorted, and it can't contain duplicate entries. Splits configuration is updated by calling the `setSplits` function of the [driver](/the-protocol/accounts-in-drips#drips-account-drivers) managing your user ID. ### Receiving flow Received funds go through a few steps before they can be collected. * **Receiving drips** and **squeezing drips** gathers funds that have been dripped to you. * **Splitting** gets all received and squeezed drips, given funds and funds received from splitting, and distributes them according to the current splits configuration. * **Collecting** transfers out of the protocol funds left after splitting. ![Diagram 1][img1] #### Receive streams By receiving streams, you get the funds streamed to you in the past from all users. It doesn't matter how many people have been streaming. Receiving funds from them always has the same cost depending only on the length of the period from which you're receiving streams. You must receive streams for each ERC-20 token separately, each of them has an independent state. You only can receive streams from the already finished cycles. The entire timeline is globally divided into cycles of constant length defined on deployment, usually on a scale of days or weeks. Every timestamp during which somebody is streaming to you falls into a cycle. All the funds that have been streamed from anybody to you during a cycle become receivable only when the cycle ends, so nobody can change their streams anymore during that cycle. This reduces gas cost of receiving streams. See [Streams Inner Workings](/the-protocol/advanced/drips-inner-workings) for more technical details. Receiving streams is done by calling the `receiveStreams` function on the `Drips` contract. Anybody can call this function for any user ID. This is fine because the users can't be hurt when somebody triggers receiving streams for them, the caller only covers the gas cost, but the effects are the same, the user gets their streams received and prepared to be split. This function can't be used to perform a DoS attack on the user. #### Squeeze streams Squeezing streams is a companion to receiving streams. While receiving can be done only on funds streamed during the finished cycles, squeezing can be done only on funds streamed during the current cycle, which isn't finished yet. It allows receiving streams without waiting for the cycle to end, but it's more expensive in terms of gas usage. You must squeeze not only for each ERC-20 token separately, but also for each user from whom you want to squeeze streams. Any funds you don't squeeze will be receivable when the cycle ends. In order to squeeze streams from a user you need to provide that user's complete history of streams configurations from any point in the past until their current configuration. That history will be then analyzed to see how much they have streamed to you during the current cycle until now, and these funds will be squeezed. You don't need to squeeze the entire history you provide, you can choose which historical configurations you want to analyze, and skip all the rest. This is useful when a historical configuration has already been squeezed by you in the past or doesn't yield enough value to justify the gas cost, either because it was so short-lived, didn't stream to you at a high enough rate, or just didn't include you as a receiver. Squeezing streams is done by calling `squeezeStreams` on the `Drips` contract. Anybody can call this function for any user ID. This is fine because the users can't be hurt when somebody triggers squeezing streams for them, the caller only covers the gas cost, but the effects are the same, the user gets their streams squeezed and prepared to be split. This function can't be used to perform a DoS attack on the user. #### Split Splitting distributes funds you've received from all sources among users who you've configured as your [splits receivers](/the-protocol/overview#splitting). Splitting is done on your current splittable balance, which aggregates your received and squeezed streams, funds given to you, and funds split to you. The funds are split according to your current splits receivers list. Each of its entries contains a user ID and a percentage of splittable funds that they will receive. Any funds not split among the receivers will become collectable by you. Splitting is done by calling the `split` function on the `Drips`? contract. Anybody can call this function for any user ID, but they must pass the splits configuration that is currently set by that user, so their funds are always split according to their will. This makes setting splits receivers list somewhat bonding because right until you update it, anybody can split funds you've received according to that configuration. Receiving streams, squeezing streams and splitting being callable by anybody constitute a highly efficient system where funds are never stuck and can be always pushed to keep flowing in the network of splits. If you have a splits receiver configured, and you have some funds streamed, given or split to you, your splits receiver can perform all the necessary actions to get their splits from you, without bothering you. As the protocol is autonomous it runs without your intervention and the funds will keep moving in the network as long as your receiver benefits from it. This can go even further, because a splits receiver of your splits receiver may trigger a cascade of splitting to get their funds, it can go arbitrarily deep. #### Collect The Collecting functionality takes the funds left after splitting and transfer them out of the protocol, e.g. into your wallet. Collecting doesn't trigger splitting, you need to split in order to have collectable funds, even if you have an empty splits receivers list. Collecting is done by calling the `collect` function of the [driver](/the-protocol/accounts-in-drips#drips-account-drivers) managing your user ID. [img1]: /img/overview1.png ## Security At Drips, we take security seriously and have taken a number of steps to ensure the security of our smart contracts on Ethereum. #### High test coverage and fuzz tests Our codebase has a high level of unit test coverage and we used Foundry to fuzz-test the key features of our contracts. #### Security Reviews A complete audit of the smart contracts has been completed by [Spearbit](https://spearbit.com/) as of November 2023: See the [Spearbit Network Security Review](https://drive.google.com/file/d/1qj0tCxzkgQONzWTENFk5MKroH5D6PUVG/view?usp=drive_link) Previously to the Spearbit audit, we also worked with an independent security auditor to conduct smart contract security reviews during the development of the contracts: See the [Security Report](https://drive.google.com/file/d/1DoekwJ-D2p00rJ87-NoG0pj_hBv-rkYa/view?usp=drive_link) In addition, a member of the Drips core team is also a security auditor, so we were able to leverage their expertise in this area to perform an internal audit: See the [Internal Report](https://hackmd.io/6_EgTHw6TVGlfxls0iKMAQ?view) We also worked with Code4rena to conduct an audit contest where 26 wardens conducted analysis of the protocol and smart contracts and provided feedback: See the [Code4rena Report](https://code4rena.com/reports/2023-01-drips) Drips has a public [bug bounty program with Immunefi](https://immunefi.com/bounty/drips/). `BridgedGovernor` and `Giver` contracts were audited separately, see the [Cantina Security Report](https://drive.google.com/file/d/19EjEwN0LhGfWFqptZTZrOWv4vA7-exUM/view?usp=drive_link). The `RepoDriver` migration to Gelato was audited separately, see the [Cantina Security Report](https://drive.google.com/file/d/10LQ26EWpyIWm8G1PCSel8C_ZoShQBEHa/view?usp=drive_link). The `NetiveTokenUnwrapper`, `NFTDriver` custom URIs, `GelatoTaskOwner`, `RepoSubAccountDriver` and `RepoDeadlineDriver` were audited separately, see the [Cantina Security Report](https://drive.google.com/file/d/1GR6PD7gquDkFN1A3QUL3f0Pi9xH1-0T-/view?usp=drive_link). #### Certora Additionally, we have worked with the [Certora](https://www.certora.com/) team to formally verify certain parts of our smart contracts. This involved mathematically proving the correctness of our code, which helps to identify and eliminate potential vulnerabilities. While we are excited about the potential of using formal verification to improve the security of our smart contracts, it's important to note that this technology is still in its early stages and at an experimental level for Drips. However, we believe that it is important to stay at the forefront of technology and explore new approaches to smart contract security. By doing so, we hope to gain valuable insights and improve our security measures over time. You can read the [report from Certora](https://drive.google.com/file/d/1kWKDzjbTl69Vhl_HVyJjnwRojNgSzeDB/view?usp=drive_link), or explore [our work on invariants with the Certora prover in Github.](https://github.com/radicle-dev/drips-contracts/tree/certora) #### Risk Of course, it's important to note that despite our efforts to ensure the security of our smart contracts, there is always a certain level of risk involved. :::warning No system is completely immune to security threats, and it's impossible to guarantee that our smart contracts will never be exploited. ::: ## Smart Contract details ### Ethereum Mainnet | Key | Value | | :---------------------------- | :----------------------------------------- | | Chain | mainnet | | Deployment time | 2023-07-13T12:30:27Z | | Commit hash | afeba55f70a968ded7c0797a4211faa856e28fa0 | | Wallet | 0x823204FFd4fAa09fbf2AAc51A290233e829991a1 | | Deterministic deployer | 0x4e59b44847b379578588920cA78FbF26c0B4956C | | CREATE3 factory | 0x6aa3d87e99286946161dca02b97c5806fc5ed46f | | DripsDeployer salt | DripsDeployer | | DripsDeployer | 0x0c1Ea3a5434Bf8F135fD0c7258F0f25219fDB27f | | Drips | 0xd0Dd053392db676D57317CD4fe96Fc2cCf42D0b4 | | Drips cycle seconds | 604800 | | Drips logic | 0xb0C9B6D67608bE300398d0e4FB0cCa3891E1B33F | | Drips admin | 0x8dA8f82d2BbDd896822de723F55D6EdF416130ba | | Caller | 0x60F25ac5F289Dc7F640f948521d486C964A248e5 | | AddressDriver | 0x1455d9bD6B98f95dd8FEB2b3D60ed825fcef0610 | | AddressDriver ID | 0 | | AddressDriver logic | 0x3Ea1e774f98cc4C6359bbCB3238E3e60365Fa5c9 | | AddressDriver admin | 0x8dA8f82d2BbDd896822de723F55D6EdF416130ba | | NFTDriver | 0xcf9c49B0962EDb01Cdaa5326299ba85D72405258 | | NFTDriver ID | 1 | | NFTDriver logic | 0x3B11537D0d4276Ba9e41FFe04e9034280bd7af50 | | NFTDriver admin | 0x8dA8f82d2BbDd896822de723F55D6EdF416130ba | | ImmutableSplitsDriver | 0x1212975c0642B07F696080ec1916998441c2b774 | | ImmutableSplitsDriver ID | 2 | | ImmutableSplitsDriver logic | 0x2c338CDf00dFd5A9B3B6b0b78BB95352079AAF71 | | ImmutableSplitsDriver admin | 0x8dA8f82d2BbDd896822de723F55D6EdF416130ba | | RepoDriver | 0x770023d55D09A9C110694827F1a6B32D5c2b373E | | RepoDriver ID | 3 | | RepoDriver AnyApi operator | 0xa928d4b087AD35C46BA83331d8eEddb83152319b | | RepoDriver AnyApi job ID | 9af746c7cfbc415c9737b239df9a30ab | | RepoDriver AnyApi default fee | 1620000000000000000 | | RepoDriver logic | 0xfC446dB5E1255e837E95dB90c818C6fEb8e93ab0 | | RepoDriver admin | 0x8dA8f82d2BbDd896822de723F55D6EdF416130ba | This deployment is based on the 'v2\_ethereum\_deploy' tag from the Drips Smart Contracts repository. ### Sepolia Testnet | Key | Value | | :---------------------------- | :----------------------------------------- | | Chain | sepolia | | Deployment time | 2023-07-15T10:41:56Z | | Commit hash | afeba55f70a968ded7c0797a4211faa856e28fa0 | | Wallet | 0x341a08926dCa7fa7D135F96E4d76b696e5f6d38d | | Deterministic deployer | 0x4e59b44847b379578588920cA78FbF26c0B4956C | | CREATE3 factory | 0x6aa3d87e99286946161dca02b97c5806fc5ed46f | | DripsDeployer salt | DripsDeployerTest1 | | DripsDeployer | 0xa6030dD9D31FA2333Ee9f7feaCa6FB23c42a1d96 | | Drips | 0x74A32a38D945b9527524900429b083547DeB9bF4 | | Drips cycle seconds | 604800 | | Drips logic | 0xf103BDDB82B6177e5fE53c50351E33F4f3df955B | | Drips admin | 0x341a08926dCa7fa7D135F96E4d76b696e5f6d38d | | Caller | 0x09e04Cb8168bd0E8773A79Cc2099f19C46776Fee | | AddressDriver | 0x70E1E1437AeFe8024B6780C94490662b45C3B567 | | AddressDriver ID | 0 | | AddressDriver logic | 0x298F37fFd4B31d216B8954968cEe7EC5273CB891 | | AddressDriver admin | 0x341a08926dCa7fa7D135F96E4d76b696e5f6d38d | | NFTDriver | 0xdC773a04C0D6EFdb80E7dfF961B6a7B063a28B44 | | NFTDriver ID | 1 | | NFTDriver logic | 0xa6bD78d98720E2eA4B3E2887be7bA212C3aC5977 | | NFTDriver admin | 0x341a08926dCa7fa7D135F96E4d76b696e5f6d38d | | ImmutableSplitsDriver | 0xC3C1955bb50AdA4dC8a55aBC6d4d2a39242685c1 | | ImmutableSplitsDriver ID | 2 | | ImmutableSplitsDriver logic | 0xf5573880ECB9975E1645C8D18ef1A0393c685CC1 | | ImmutableSplitsDriver admin | 0x341a08926dCa7fa7D135F96E4d76b696e5f6d38d | | RepoDriver | 0xa71bdf410D48d4AA9aE1517A69D7E1Ef0c179b2B | | RepoDriver ID | 3 | | RepoDriver AnyApi operator | 0x0F9c6BCdE15dfFFD95Cfa8F9167b19B433af1abE | | RepoDriver AnyApi job ID | 9af746c7cfbc415c9737b239df9a30ab | | RepoDriver AnyApi default fee | 150000000000000000 | | RepoDriver logic | 0x7A9a2a29B8d98922Ea2E70c73B123e36C95d1515 | | RepoDriver admin | 0x341a08926dCa7fa7D135F96E4d76b696e5f6d38d | ## Applicant metrics import Figure from '../../components/Figure' When contributors apply to work on an issue, maintainers see a **Code Metrics** scorecard summarizing their public GitHub activity. This page explains how each metric is calculated and what the categorical labels mean.
### What Data Is Included #### Rolling 3-Year Window All Code Metrics are calculated over a rolling **3-year window** (\~1096 days), ending at the time metrics are computed. #### Eligible Pull Requests PR-based metrics only count pull requests that received **at least one comment or one review**. This filters out self-merges and automated dependency bumps, focusing on collaborative work. #### Reviews and Issues The **Reviews** and **Issues Opened** metrics come from your GitHub activity over the same rolling 3-year window. ### How Bins Work Each metric value is compared against a GitHub-wide benchmark of \~3.9 million users who opened at least one collaborative PR over a three-year reference period. Your percentile rank determines your categorical bin: | Percentile Range | Bin | | :--------------- | :------------- | | 0–24 | Very Low | | 25–49 | Low | | 50–74 | Medium | | 75–89 | High | | 90–98 | Very High | | 99+ | Extremely High | :::info For **PR Drop Rate** and **Average Merge Latency**, *lower* values are better. The percentile represents your raw ranking in the population distribution, and the interface indicates that lower values are preferable for these metrics by coloring their lowest bins as green and the highest bins as red. ::: ### Metric Calculations #### OSS Activity Score A composite score summarizing open-source collaboration activity. **Formula:** `OSS Activity Score = (0.40 × Reviews percentile) + (0.35 × PRs Opened percentile) + (0.25 × Issues Opened percentile)` Each component is first converted to a percentile against the benchmark, then combined. The resulting score is itself compared to the benchmark for OSS Activity Scores to determine the bin. #### Total Opened PRs **Formula:** `count(eligible PRs created in window)` Compared against benchmark thresholds for opened PR counts. #### Total Merged PRs **Formula:** `count(eligible PRs created in window where state = MERGED)` Compared against benchmark thresholds for merged PR counts. #### PR Merge Rate **Formula:** `Total Merged PRs / Total Opened PRs` A ratio from 0–100%. Compared against benchmark thresholds for merge rates. #### PR Drop Rate **Formula:** `Closed without merge / Opened non-draft PRs` Draft PRs are excluded. Lower values are better for this metric. #### Average Merge Latency (hrs) **Formula:** `mean(merged_at - created_at)` across eligible merged PRs, in hours. Lower values are better for this metric. #### Reviews **Formula:** `count(PR reviews submitted in window)` Compared against benchmark thresholds for review counts. #### Issues Opened **Formula:** `count(issues opened in window)` Compared against benchmark thresholds for issue counts. ### When a Bin May Be Hidden Bins require enough activity to be statistically meaningful. You may see the raw value while the bin is hidden. | Metric | Bin Appears When | | :----------------------------------------- | :--------------------------------------------------------------------- | | Total Opened PRs | ≥ 1 eligible PR | | Total Merged PRs | ≥ 1 eligible PR | | PR Merge Rate | ≥ 20 eligible PRs opened | | PR Drop Rate | ≥ 20 eligible non-draft PRs opened | | Average Merge Latency | ≥ 20 eligible merged PRs | | Reviews, Issues Opened, OSS Activity Score | ≥ 10 total OSS activities (PRs + Reviews + Issues) and ≥ 1 eligible PR | ### Languages Profile The **Languages** section shows your programming language breakdown as percentages, computed across your **lifetime PR history** (not windowed). For each PR, a weight is calculated from `additions + deletions` (or `changed_files` if zero). This weight is distributed across languages using the repository's language breakdown, then normalized into a final percentage. ### Population Baseline Benchmark thresholds are derived from GitHub Archive data covering **October 2022 through September 2025**. This baseline is fixed because GitHub's Events API changed its payload structure in late 2025, preventing consistent extension. Your individual metrics are still computed fresh from the GitHub GraphQL API—only the population reference points are frozen. ### Frequently Asked Questions #### How often are my metrics updated? Your metrics are computed when you first sign up for Drips Wave. After that, they are refreshed periodically via a background process. The rolling 3-year window moves forward with each refresh, so your metrics will naturally reflect your most recent activity over time. #### Why don't my GitHub stats match exactly? The scorecard applies filters that differ from GitHub's default profile views. Only PRs that received at least one comment or review are counted, which excludes self-merges and automated dependency bumps. Additionally, all metrics except the language profile are calculated over a rolling 3-year window rather than your full history, and only public repositories are included. #### Why do my metrics show "Unknown" or "Not enough data" despite having activity? If your GitHub account has enough data to satisfy the minimum thresholds for a metric but still shows "Unknown," the metrics may still be computing in the background. This process can take some time after initially signing up. If it's been more than an hour and you still see "Unknown," please [contact support](https://www.drips.network/wave/support). ## Drips Wave import Figure from '../../components/Figure' Drips Wave is a recurring bounty cycle designed to help ecosystems attract developers, accelerate maintenance, and grow their communities. Instead of one-off grants or long-term commitments, Wave creates a predictable rhythm of contribution where developers can "Fix, Merge, and Earn." By focusing on short, structured cycles, typically running for one week every month, Wave bridges the gap between available funding and the day-to-day work that maintainers need help with.
:::warning Drips Wave is currently launching with select partners, starting with the Stellar ecosystem in January 2026. Interested in running a Wave for your community? [Get in touch](https://drips-network.notion.site/1e4c52c9599781b5a0aeca3e8eb1b3e4). ::: ### Who is Drips Wave for? * **Ecosystems** such as the Stellar Development Foundation use Drips Wave to broadly incentivize contributions across their entire open-source ecosystem. * **Project Maintainers** within those ecosystems use Wave to attract new contributions, clear their backlog, and grow their community. * **Contributors** earn rewards while building a verifiable portfolio of work in top-tier open-source projects. ### The Anatomy of a Wave One or more **Wave Programs** run on a predictable cycle, with **Waves** occurring at regular intervals. Each Wave Program is centered around a specific open-source ecosystem (e.g., Stellar). A Wave is a synchronized event that concentrates community energy. While parameters can be adjusted, a typical Wave follows this lifecycle: 1. **Scoping**: Ecosystem maintainers apply their repositories to a Wave Program. Once approved by the program's organizers, maintainers add issues that they want the community to tackle during the upcoming Wave. These issues are tagged with specific Point values based on their complexity and impact. 2. **The Sprint**: The Wave opens for a set period (e.g., one week). Contributors browse available tasks, log in with their GitHub accounts, and submit pull requests to fix issues. For each resolved issue, contributors earn Points. 3. **Reward**: Progress is tracked automatically via points and leaderboards. Once the cycle concludes and work is verified, rewards are distributed to the successful contributors according to their share of Points earned during the Wave.
### Why Run a Wave Program on Drips? Wave is built to solve the "maintenance gap" in open-source funding. It provides the tooling to turn a budget into tangible code progress with minimal friction. #### 🔄 Predictable Rhythm Regularity breeds engagement. By running monthly cycles, you create a habit for contributors to return to your ecosystem. It keeps existing developers engaged while providing a reliable schedule for new ones to join. #### 🎯 Focused Impact Grants are great for big ideas, but Waves are for getting things done. Maintainers can direct community power toward specific roadmap blockers, bug fixes, or documentation needs that often fall through the cracks. #### 🚀 Accessible Entry Points For new developers, a massive codebase can be intimidating. Waves present scoped, manageable tasks that allow contributors to build a track record and earn trust (and income) quickly. It is an ideal funnel for discovering future core contributors. #### 🤖 Automated Operations Drips handles the heavy lifting of tracking contributions, managing the review flow, and calculating rewards. This reduces the administrative burden on maintainers, allowing them to focus on code reviews rather than spreadsheets. ### Getting Started Whether you are an ecosystem looking to boost activity or a developer ready to earn, here is how to get started. #### For Maintainers Learn how to leverage Drips Wave to clear your backlog and grow your contributor base. * [**Participating in a Wave**](/wave/maintainers/participating-in-a-wave): Learn how to apply your repositories for a Wave Program, add issues to a Wave, and manage contributions. * [**Understanding Points & Rewards**](/wave/points-and-rewards): A breakdown of how contributions are valued and how payouts work. * [**Applicant metrics**](/wave/applicant-metrics): How the Code Metrics scorecard and language profile are calculated. #### For Contributors Ready to fix, merge, and earn? * [**Join a Wave**](/wave/contributors/solving-issues-and-earning-rewards): How to find active Waves, and start contributing. * [**Understanding Points & Rewards**](/wave/points-and-rewards): A breakdown of how contributions are valued and how payouts work. * [**Applicant metrics**](/wave/applicant-metrics): How the Code Metrics scorecard and language profile are calculated. ## Understanding Points & Rewards import Figure from '../../components/Figure' Drips Wave uses a transparent, points-based system to quantify value and distribute rewards. Whether you are a Maintainer scoping work or a Contributor solving issues, understanding how points flow is key to maximizing your success in a Wave. ### The Point System Every contribution in a Wave is valued in **Points**. These points act similar to "shares" in the total Reward Pool for the given Wave. The more points a contributor earns relative to others, the larger their slice of the total rewards. :::warning **Important disclaimer**: Drips and Wave Program Organizers reserve the right to adjust the reward formula, manually adjust points, deduct points or withhold rewards for misbehavior, and/or distribute portions of the reward pool outside the standard Points-based formula (e.g., to incentivize maintainers contributing to the program). Depending on the Wave Program, additional rules may apply, such as a maximum cap on rewards per contributor. Please read the [Terms and Rules page](/wave/terms-and-rules) for additional details. ::: #### Base Points & Complexity When a Maintainer adds an issue to a Wave Program, they assign a **Complexity Level**. This determines the fixed number of points awarded upon resolution. | Complexity | Description | Total Points | | :---------- | :------------------------------------------------------------------------------------------- | :----------- | | **Trivial** | Typos, minor copy changes, or very small bug fixes. | **100** | | **Medium** | Standard feature work or involved bug fixes. Includes a 50-point complexity bonus. | **150** | | **High** | Complex architecture, refactors, or new integrations. Includes a 100-point complexity bonus. | **200** | ### Calculating Rewards At the end of a Wave cycle, the total Reward Budget (e.g., $50,000) is distributed among all contributors based on their share of the total points earned during that specific Wave. #### The Formula Your payout is not a fixed dollar amount per issue. Instead, it is dynamic based on the total activity in the Wave. At the end of each Wave, we calculate your percentage of all points issued during the Wave, and allocate the reward pool accordingly. #### The Leaderboard Participants can track their standing in real-time via **Wave Program → Leaderboard**. A higher rank indicates a higher point total, which directly correlates to a larger payout. :::warning **Important disclaimer**: Drips and Wave Program Organizers reserve the right to adjust the reward formula, manually adjust points, deduct points or withhold rewards for misbehavior, and/or distribute portions of the reward pool outside the standard Points-based formula (e.g., to incentivize maintainers contributing to the program). Depending on the Wave Program, additional rules may apply, such as a maximum cap on rewards per contributor. Please read the [Terms and Rules page](/wave/terms-and-rules) for additional details. ::: ### Payout Distribution Once a Wave concludes and the seven-day Compliment window closes, the distribution process begins. 1. **Calculation**: The leaderboard is finalized and individual allocations are calculated. 2. **Withdrawals**: Your Drips Wave account will reflect any earned rewards, which you can withdraw to a wallet. You'll receive an email notification when your rewards are available. See [Withdrawing Your Rewards](/wave/withdrawing-rewards) for detailed instructions. #### Requirements to Receive Funds To withdraw your rewards, you must have a verified identity (**KYC**). Since identity verification is required to apply for any issue in the first place, this will already be in place by the time you earn points. :::danger **KYC is Mandatory**: Identity verification is required to apply for issues and to withdraw any rewards you earn. See [Verifying your identity](/wave/contributors/solving-issues-and-earning-rewards#verifying-your-identity) for details. ::: ### Frequently Asked Questions #### What happens if an issue isn't finished on time? Wave cycles are strict timeboxes. If an issue is not marked as **Resolved** before the Wave ends, no points are awarded for that cycle. * **For Contributors**: If you are close to finishing, communicate with your maintainer. * **For Maintainers**: If the work is good but blocked by external factors, consider marking it resolved to ensure the contributor is rewarded. Otherwise, the issue rolls over to the next Wave. #### Can Maintainers earn points? Generally, points are reserved for Contributors solving issues. However, Wave Programs may have specific separate budgets or mechanisms to reward Maintainers for their administrative work (scoping, reviewing, and merging). #### Who decides the complexity? The Maintainer has the final say on an issue's complexity. If a Contributor believes an issue turned out to be much harder than "Trivial," they should discuss this with the Maintainer, who can update the complexity level before the issue is resolved. ## Drips Wave - Terms and Conditions ### 1. Introduction Bounty sprints (“**Drips Wave Programs**”) in which you may participate as a contributor or maintainer (“**you**”, “**your**” or “**Participant**”), are hosted on the platform (“**Wave Platform**”) developed by the Public Goods Association (“**Association**”, “**we**”, “**our**”), a Swiss association with its registered seat is in Zug. Drips Wave Programs are designed to reward genuine impact within a designated third-party ecosystem. Each Drips Wave Program may consist of a series of waves (“**Drips Waves**”). These terms and conditions (“**Terms**”) govern the access to and the participation in the Drips Wave Programs, in particular but without limitation, the rights and obligations of Participants arising from or in connection with the Drips Wave Programs. The Terms, together with any and all other documents referred to herein and any documentation made available on [https://docs.drips.network/wave/](https://docs.drips.network/wave/), govern your access to and participation in Drips Wave Programs, including all related tools, web applications, smart contracts, and Application Programming Interfaces (APIs) made available thereon. These Terms may be updated and modified from time to time. The Terms as so updated and modified are deemed effective as of the date they are published on the website [https://docs.drips.network/wave/terms-and-rules](https://docs.drips.network/wave/terms-and-rules). It is the Participant’s responsibility to periodically check for the most recent version of the Terms. By ticking the acceptance box, and/or by accessing, applying to participate in, or participating in any Drips Wave Program, you accept and agree to be bound by these Terms and any and all other terms, documents or policies incorporated herein by reference. ### 2. Responsibility Drips Wave Programs are initiated by third-party ecosystems (“**Wave Program Organizers**”). The Association is responsible for organizing the Drips Wave Programs and hosting the Drips Wave Programs on the website [https://www.drips.network/wave](https://www.drips.network/wave) (“**Drips Wave App**”). ### 3. Drips Wave Program Participants #### 3.1 Maintainers A maintainer (“**Maintainer**”) may submit a repository, containing a set of technical issues, for consideration in a Drips Wave Program. The Association and the Wave Program Organizer retain sole discretion to select which repositories are admitted to a Wave Program and may remove a repository at any time during the Drips Wave Program. If your repository was rejected, you may appeal the decision from the **Maintainers → Orgs and Repos** dashboard in the Drips Wave app by clicking **Appeal** on the rejected repository. Appeals submitted through any other channel will not be considered. The selection of a repository for a Drips Wave Program does not transfer ownership or control of that repository to the Association. The Association does not own, operate, manage, or control any repositories applying to or participating in a Drips Wave Program. #### 3.2 Contributors Contributors (“**Contributors**”) apply to work on issues listed in repositories and, subject to the impact of their contributions, may become eligible to earn Wave Rewards. ### 4. Eligibility To be eligible to participate in any Drips Wave Program, the Participant represents and warrants that: * You are 18 years old or qualify as an adult in your country of residence. * You, including your affiliates, officers, and directors, are not a citizen or resident of, and are not located in, any jurisdiction that is subject to comprehensive sanctions or embargoes imposed by the United Nations, Switzerland, the European Union, the United States, or any other relevant authorities. * Neither you nor any of your affiliates, officers, or directors are listed on, or owned or controlled by any person or entity listed on, the Overall List of Sanctioned Individuals, Entities and Organizations maintained by the Swiss State Secretariat for Economic Affairs (SECO), the EU Consolidated List of Persons, Groups, and Entities Subject to EU Financial Sanctions, the U.S. Department of Commerce’s Denied Persons or Entity List, the U.S. Department of Treasury’s Specially Designated Nationals or Blocked Persons Lists, the U.S. Department of State’s Debarred Parties List, or any other national or international sanctions or embargo list. * You, including your affiliates, officers, and directors, are not a resident or citizen of, and are not located in, any geographic area designated as non-cooperative with international anti-money-laundering (AML) principles or procedures by any intergovernmental organization, including the Financial Action Task Force (FATF). * You, including your affiliates, officers, and directors, are not domiciled in and are not organized under the laws of any jurisdiction whose legislation conflicts with the Drips Wave Programs. The Participant acknowledges and agrees that all determinations regarding eligibility, participation in Drips Wave Programs, and entitlement to Wave Rewards (as defined in Section 5) are made at the sole, absolute, and final discretion of the Association. This implies that the Association may accept, reject, suspend, or remove any Participant from any Drips Wave Program at any time, for any reason. ### 5. Waves Rewards #### 5.1 Wave Rewards Calculation For each Wave, a maximum reward pool (“**Total Reward Pool Size**”) is determined by the Association. Wave Rewards (“**Wave Rewards**”) are granted to Participants based on their performance within a Wave Program. Wave Rewards are calculated according to a point system (“**Points**”) developed by the Association to assess a Participant’s contributions to the Wave Program Organizers’ ecosystem. Points have no monetary value and do not constitute a currency, a means of exchange, or a store of value. Unless expressly stated otherwise, Points earned during a Wave or a Wave Program do not carry over to any subsequent Waves or future Wave Programs and automatically expire upon termination of the applicable Wave Program. The calculation and application of the exchange rate between Points and the Token are determined solely at the discretion of the Association and may be modified at any time. The Association may also establish limits on the maximum Wave Reward a Participant may be entitled to receive. All decisions made by the Association in relation to Wave Rewards are final. #### 5.2 Wave Rewards Denomination Wave Rewards are generally paid in the token of the Wave Program Organizer (“**Token**”). However, the Association may, for compliance, operational, or other legitimate reasons, settle Wave Rewards in other cryptocurrencies or in fiat currencies. #### 5.3 Wave Rewards Allocation The Participant understands that, in order to claim any Wave Reward, the Association or its appointed service provider (“**KYC Service Provider**”) may require all information, documentation, and evidence reasonably requested to complete the know-your-customer or know-your-business verification process (“**KYC / KYB Check**”). The Participant understands that the outcome of the KYC/KYB Check lies solely within the discretion of the Association and/or the KYC Service Provider. The Participant further accepts that the scope and requirements of the KYC / KYB Check may evolve over time and that additional information or documentation may be requested at a later stage. Each Participant may hold and use one single account on the Drips Wave App, and the KYC / KYB Check associated with that account must be completed by the natural person who actually uses it. Successful completion of the KYC / KYB Check, as well as continued compliance with these Terms, is a prerequisite for the allocation of any Wave Rewards. #### 5.4 Unclaimed Wave Rewards If a Participant fails to claim their Wave Rewards within a reasonable period of time as determined by the Association, the Association may deem such Rewards to be unclaimed. In such circumstances, the Association is entitled to retain, reallocate, or otherwise repurpose the unclaimed Wave Rewards for use in subsequent Drips Wave Programs. Participants acknowledge and agree that they shall have no further rights or claims to any Wave Rewards deemed unclaimed under this clause. #### 5.5 Other Variables In addition to Points, the Association may, at its sole discretion, consider other qualitative or quantitative factors to reward Maintainers’ contribution to Drips Wave Programs. The Association may therefore allocate part of the Total Reward Pool directly to a Maintainer, independently of the point‑based calculation. ### 6. Prohibited Activities The Participant shall refrain from engaging in any of the following prohibited activities (“**Prohibited Activities**”): * Engaging in any activity intended to generate Points or Wave Rewards through low-effort or bad-faith submissions, including but not limited to: * Submitting pull requests or contributions consisting solely of trivial typo corrections or similar low-value changes for the purpose of accumulating Points; * Submitting code, documentation, or other contributions generated by large language models (“**LLMs**”) that are of low quality, untested, or not understood by the Contributor; * Requesting repeated assignment to issues without reviewing their scope or without verifying whether the issue has already been assigned to another Contributor; or * Submitting code, documentation, or any other contribution that infringes, or may infringe, third‑party intellectual property rights, or that contains viruses, malware, or any other malicious components. * Manipulating the Point or Wave Reward mechanisms, for example by: * Creating or using multiple identities or accounts to apply for issues, influence Points, or affect rankings; * Sharing, transferring, selling, renting, lending, or otherwise trading an account, allowing any other person to use or contribute through your account, or using an account that is used or operated by another person; * Completing the KYC / KYB Check on behalf of another person, using an account whose KYC / KYB Check was completed by another person, or otherwise making your verified identity or identity documents available for another person’s account; * Creating or using any account, identity, email address, GitHub account, wallet address, or KYC identity in order to circumvent a suspension, ban, restriction, or any other enforcement measure previously applied to you or to an account you use; * Coordinating with others to submit or approve low-quality work, manipulate outcomes, or otherwise distort the integrity of the Drips Wave Programs; or * Submitting work that is not the Contributor’s own without proper attribution or authorization. * Introducing, attempting to introduce, or suggesting the introduction of vulnerabilities, backdoors, malware, or any other harmful code into any repository, or into the Drips Wave App and/or Wave Platform, supporting platform or the Network. * Interfering with, circumventing, or compromising the security, availability, or integrity of the Drips Wave App and/or Wave Platform associated infrastructure; * Disrupting, compromising, or otherwise damaging data or property owned by the Association or any other party; * Interfering with, or attempting to interfere with, the access of any user, host, or network, including, without limitation, by sending viruses, overloading, flooding, spamming, or creating, encouraging, or implementing Sybil attacks; * Attempting to circumvent geographic restrictions; * Encouraging or enabling any other individual or entity to engage in any of the foregoing or otherwise violate these Terms. If the Association determines, in its sole discretion, that a Participant has engaged in any Prohibited Activity, it may take the actions set forth in Section 7. ### 7. Remedies and Enforcement In the event that a Participant breaches these Terms, the Association may take any corrective or enforcement measures it deems appropriate. Such measures may include, without limitation, deducting Points earned in current or previous Waves, and temporarily or permanently suspending the Participant’s access to the Drips Wave App and their participation in any current or future Drips Wave Programs. The Association may also withhold or cancel any pending or future Wave Rewards or reclaim Wave Rewards that have already been distributed. Sharing or trading accounts, sharing or trading KYC identities, and evading a prior suspension, ban, or other enforcement measure through a new or different account are considered particularly severe breaches of these Terms. Such breaches will ordinarily result in the permanent suspension of the Participant and forfeiture of all Points and Wave Rewards, and the Association may extend these measures to every account, identity, and wallet address it reasonably believes to be linked to the breach. The Association reserves all other rights and remedies available under applicable law. ### 8. Wallet Claiming the Tokens from the Wave Rewards may require reliance on or an integration with third party products (e.g., a wallet, a network, or blockchain) that neither the Association nor the Wave Program Organizer control. In particular, neither the Association nor the Wave Program Organizer has control over the private keys of the Participant and the use of the wallet is subject to the terms and conditions of the respective third-party wallet provider. Neither the Association nor the Wave Program Organizer has custody or control of the wallets and Participants are solely responsible for the security of their wallet. Neither the Association nor the Wave Program Organizer is not responsible for managing and maintaining the security of Participant’s wallets. Tokens allocated to the Participant’s address can only be accessed with the Participant’s access data and/or private key. The Participant understands and accepts that if its private key or wallet password were lost or stolen, the access to the Participant’s Tokens allocated to the Participant’s address would be unrecoverable and would be permanently lost. Neither the Association nor the Wave Program Organizer has control over the Participant’s Tokens; therefore, the Participant shall have no recourse to seek any refunds, recovery or replacements from neither the Association, nor the Wave Program Organizer in the event that he/she cannot access the wallet and/or Tokens anymore and/or any Tokens are lost or stolen. ### 9. Data Privacy Policy The Association handles Participant’s personal information in accordance with Swiss law and its privacy policy, available at [https://www.drips.network/legal/privacy](https://www.drips.network/legal/privacy). ### 10. No Fees No fees are associated with the participation in the Drips Wave Programs. Participants may have to pay network gas fees to claim any Wave Rewards. ### 11. Warranty Disclaimer and Exclusion of Liability The access and use of the Drips Wave App and related infrastructure is made at your own risk. You understand and agree that the Drips Wave App and supporting infrastructure is provided on an “as is” and “as available” basis and that the Association expressly disclaims all warranties or conditions of any kind, whether express, implied, statutory or otherwise. The Association disclaims all liability for any losses arising from (i) failures or malfunctions of any blockchain or network, (ii) bugs or vulnerabilities in the Wave Platform Network, the Drips Wave App and respective supporting technology or any smart contract, (iii) code mergers into repositories (iv) hacks, exploits, or malicious attacks, and (v) any third-party services, products, or infrastructure (including wallets). Except in cases of gross negligence, fraud, or willful misconduct, the Association shall not be liable to the Participant for any damages arising out of or in connection with these Terms, including, without limitation, indirect or consequential damages such as loss of profit, loss of business opportunity, or reputational harm. ### 12. Indemnification To the fullest extent permitted by applicable law, the Participant will indemnify, defend and hold harmless the Association, the Association’s respective past, present, and future members of the board, founders, employees, officers, directors, contractors, consultants, suppliers, vendors, service providers, developers, subsidiaries, affiliates, agents, representatives, predecessors, successors and assignees (“**Association Parties**”) from and against all claims, demands, actions, damages, losses, costs and expenses (including attorneys’ fees) that arise from or relate to any violation of these Terms, including any inaccuracies in the provided representations and warranties, and any ensuing regulatory enforcement actions, whether arising from the Participant’s actions or omissions. The Association reserves the right to exercise sole control over the defense, at the Participant’s expense, of any claim subject to indemnification under this Section. This indemnity is in addition to, and not in lieu of, any other indemnities set forth in a written agreement between the Participant and the Association. ### 13. Intellectual Property The Association retains all rights, title and interest in and to its intellectual property rights. Participation in Drips Wave Programs does not assign, transfer, or otherwise convey to the Association any rights, title, or interests - including intellectual property rights - in any materials, code, or documentation contributed, made available or created by a Participant in connection with the Drips Wave Programs. The Contributor undertakes to contribute to repositories under the applicable open‑source licenses as communicated on the Drips Wave App and/or in the relevant repository. ### 14. Tax Considerations The Participant will bear sole responsibility for any and all taxes, levies, charges, and fees (including, where applicable, VAT) that may arise from the participation in the Drips Wave Programs, the allocation, receipt, holding, transfer, or use of Tokens provided pursuant to or otherwise associated with these Terms. The Participant is solely responsible for identifying and meeting all tax obligations as required by applicable laws. By accepting these Terms, the Participant acknowledges that neither the Association nor any Association Party shall be held responsible for any tax obligations of the Participant. The Participant also agrees to comply with all relevant tax laws, and to indemnify and hold harmless the Association and Association Parties against any liabilities arising from non-payment of such taxes or fees by the Participant. ### 15. Relationship of the Parties The Association and the Participant are independent parties. These Terms do not create, nor are they intended to create a partnership, franchise, joint venture, agency, fiduciary or employment relationship between the Association and the Participant. ### 16. Severability If any provision of these Terms is invalid, illegal or unenforceable in any jurisdiction, such invalidity, illegality or unenforceability shall not affect any other provision of the Terms or invalidate or render unenforceable such provision in any other jurisdiction. Upon such determination that any provision is invalid, illegal or unenforceable, the Terms shall be modified to effectuate the original intent of the original provision as closely as possible. ### 17. Governing Law and Jurisdiction These Terms and all claims relating to or arising out of these Terms, or the breach thereof, whether in contract, tort or otherwise, shall be governed by Swiss Law, excluding Swiss choice-of-law principles. Any dispute, controversy or claim arising out of, or in relation to, these Terms, including the validity, invalidity, breach, or termination thereof, shall be resolved by the ordinary courts in Zug, Switzerland. ## Withdrawing Your Rewards import Figure from '../../components/Figure' After a Wave ends and your contributions have been evaluated, your earnings are converted into **Reward Grants**. Each grant represents a portion of the reward pool you've earned, payable in USDC on the Stellar network. When a new grant is available, you'll receive a notification email. This guide walks you through the process of withdrawing your rewards to your Stellar wallet. ### Prerequisites Before you can withdraw rewards, you must: 1. **Complete KYC Verification**: Navigate to **Settings → Profile** and complete the identity verification process. You cannot withdraw any funds until your KYC status is approved. 2. **Have a Stellar Wallet**: You'll need a Stellar wallet that supports USDC. Popular options include [LOBSTR](https://lobstr.co/) (mobile app), [Ledger](https://www.ledger.com/) (via Ledger Live or compatible wallet), or any other wallet compatible with the Stellar network. You can also withdraw to a centralized exchange, provided it supports **USDC deposits specifically on the Stellar network**. 3. **Activate the wallet and enable the USDC Trustline**: * **Activation:** Your wallet must hold a small minimum balance of **XLM** (Stellar Lumens) to be active. * **Trustline:** You must explicitly enable the "USDC" asset for your wallet (this is called "setting a trustline"). Instructions for enabling USDC on the popular LOBSTR wallet can be found [here](https://lobstr.freshdesk.com/support/solutions/articles/151000001061-adding-custom-assets-in-lobstr). Please ensure to enable the "real" USDC asset, issued by Circle (issuer address: `GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN`), and not any similarly named assets from other issuers. * **Exchange Users:** If you are withdrawing directly to an exchange that supports USDC deposits on Stellar, the exchange's wallet generally already holds XLM and the trustline. You typically don't need to set this manually, but you **must** provide the correct **Memo** with your withdrawal request. :::info Our system attempts to detect if your address has a valid USDC trustline to help prevent common errors. However, this check is only for your convenience, and does not guarantee that your wallet or exchange is fully compatible or will successfully credit the funds. **We strongly recommend requesting a test transaction first** to verify that your specific wallet or exchange can receive USDC from our system before requesting the full withdrawal. ::: ### Viewing Your Grants To view your reward grants: 1. Navigate to **Wave → Reward Grants** in the Drips Wave app. 2. You'll see a list of all your grants, showing the Wave program name, amount, and current status. Click on any grant to view its details, including the full transaction history for that grant.
### Grant Statuses Each grant has a status indicating where it is in the withdrawal process: | Status | Description | | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | **Withdrawable** | The grant is ready. You can request a test transaction or full withdrawal. | | **Test Requested** | A $1 test transaction has been requested and is being processed. | | **Test Sent** | The test transaction has been sent on-chain to your provided address. Please verify receipt in your wallet before proceeding. | | **Withdrawal Pending** | A full withdrawal has been requested and is being processed. | | **Withdrawal Complete** | The full amount has been sent to your wallet. | ### The Withdrawal Process We recommend a two-step withdrawal process to ensure your wallet is correctly configured: #### Step 1: Request a Test Transaction Before withdrawing your full grant amount, we strongly recommend requesting a **test transaction** first. This sends $1 from your grant balance to your wallet to verify everything is set up correctly. 1. From the grant details page, click **Request test transaction**. 2. Enter your Stellar wallet address (starts with `G`). 3. If your wallet or exchange requires a **memo**, enter it in the memo field. This is common for centralized exchanges. 4. Review the details on the confirmation screen and check the box to confirm you understand the terms. 5. Click **Confirm** to submit the request. The test transaction has now been requested. It's usually sent within a few minutes, but in rare cases may take up to 3 days. :::warning **Important:** Drips Wave is not responsible for funds lost due to incorrect addresses, missing Memos, incompatible wallets, or exchange policies (such as minimum deposit limits). By requesting a withdrawal, you acknowledge that you have verified the destination details. **Exchange Users:** 1. **Network Selection:** Ensure you select the **Stellar (XLM)** network. Do **not** select Ethereum (ERC-20), Solana, or any other chain. 2. **Memos:** A missing Memo may result in loss of funds on exchanges. 3. **Minimum Deposits:** Some exchanges require a minimum deposit (e.g., 5 or 10 USDC). If the $1 test transaction is below this limit, it may not appear in your account. :::
#### Step 2: Request Full Withdrawal Once your test transaction has been successfully received: 1. Return to the grant details page and click **Request full withdrawal**. 2. Your wallet address and memo from the successful test transaction will be pre-filled for convenience. 3. Review all details carefully on the confirmation screen. 4. Check the confirmation box to acknowledge the terms and conditions. 5. Click **Confirm** to submit your withdrawal request. ### Processing Time **Test transactions** are usually sent within a few minutes, but in rare cases may take up to 3 days. **Full withdrawals** are usually processed within 1–3 business days. You'll receive an email notification when your transaction has been completed. If your transaction is taking longer than expected, please check the transaction history for any updates or contact our [support team](https://www.drips.network/wave/support). ### Transaction History Every grant maintains a complete transaction history. From the grant details page, you can view: * **Transaction type**: Test or Withdrawal * **Amount**: The USD value of the transaction * **Destination**: The Stellar address (hover to see full address and copy) * **Memo**: The memo included with the transaction, if any * **Status**: Pending, Complete, or Cancelled * **Requested date**: When you submitted the request * **Completed date**: When the transaction was finalized (if complete) * **Transaction hash**: A link to view the transaction on Stellar Expert (if complete). This link serves as proof that the funds were sent on-chain. ### Troubleshooting #### My test transaction failed or didn't arrive * **Check Minimums:** If withdrawing to an exchange, did the $1 transaction meet their minimum deposit requirement? (It may be credited only after you deposit enough to reach the threshold). * **Check Address/Memo:** Verify your wallet address is correct and you provided the correct memo, if required. * **Check Trustline:** Ensure you have not removed the USDC trustline since requesting the transaction. * **Check XLM Balance:** Check that your wallet is funded with enough **XLM** (Stellar requires a minimum balance of Lumens for accounts to receive other assets). #### I sent to the wrong address If your transaction is still pending, **cancel the withdrawal on your Reward Grants Dashboard and [contact our support team immediately](https://www.drips.network/wave/support)**. If it has already been completed, unfortunately, it cannot be reversed due to the nature of blockchain transactions. #### My exchange requires a memo but I forgot to include one If your transaction is still pending, **cancel the withdrawal on your Reward Grants Dashboard and [contact our support team immediately](https://www.drips.network/wave/support)**. If it has already been completed, unfortunately, it cannot be reversed due to the nature of blockchain transactions. In this case, please **contact your exchange's support team as soon as possible**. Exchanges may be able to manually credit deposits that are missing memos, but this is not guaranteed. #### My grant expired Grants have an expiration date. If you don't withdraw before this date, you may forfeit your rewards. Check the grant details page for the expiration date and ensure you complete the withdrawal process in time. ### Frequently Asked Questions #### Why do I need to verify my identity (KYC)? KYC (Know Your Customer) verification is required for regulatory compliance. We cannot process any withdrawals without completed identity verification. #### Can I withdraw to any wallet? You can withdraw to any Stellar wallet that supports USDC on Stellar and has the USDC trustline enabled. #### Can I withdraw directly to a centralized exchange? If the exchange supports direct USDC deposits on the Stellar network, yes. However, you must always include the correct memo (if provided by your exchange) with your withdrawal request. Exchanges use memos to credit incoming transfers to the right account. Always check your exchange's deposit instructions carefully to ensure USDC-Stellar support is available in your region. **We recommend requesting a test transaction first to ensure the address and memo are correct.** #### What currency are rewards paid in? All rewards are paid in USDC (USD Coin) on the Stellar network. #### Is there a minimum withdrawal amount? If you received a grant, you can withdraw it either in full or request a test transaction of $1 first. Partial withdrawals of amounts other than $1 or the full grant amount are not supported. #### Can I change my wallet address after requesting a withdrawal? While a withdrawal request generally cannot be changed once submitted, if you realize you made a mistake before it is processed, please [contact our support team](https://www.drips.network/wave/support) immediately. #### What if I have multiple grants? Each grant is managed independently. You can request tests and / or full withdrawals for each grant separately. ## Claim your open-source project import Figure from '../../components/Figure' import Video from '../../components/Video' A *Project* on Drips represents an open-source repository on GitHub, with support for other Git hosts coming soon. Every GitHub repository starts out on Drips as *unclaimed*. In this state, it can already be funded with a Drip List, or added as a dependency of another project. At any point, the project's maintainers can *claim* their project on Drips, configure a list of *maintainers* and *dependencies*, and collect any previously-received earnings. Future incoming funds are then automatically split as configured by the project maintainers, resulting in deeply-nested dependencies receiving their allocation. :::caution Want to claim your project for Drips for Privacy? Make sure you're using the [Optimism deployment of the Drips app](https://optimism.drips.network). ::: :::info If you haven't yet, learn more about the Drips Network's fundamentals in our [introduction](/). :::