# On-chain Vote: Recurring Spend for Committee Budgets

**URL:** <https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423>\
**Category:** Governance\
**Created:** [22 December 2024 15:53 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423 "2024-12-22T15:53:52Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![haloooloolo](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/haloooloolo/32/1155_2.png) [@haloooloolo](https://dao.rocketpool.net/u/haloooloolo)\
**Post date:** [22 December 2024 15:53 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/1 "2024-12-22T15:53:52Z")

</div>

Hello, pDAO!

So far we’ve relied on the team to execute funding for both management committees (IMC, GMC). We now have the ability to vote on these directly, as well as the ability to make scheduled periodic payouts. In addition to testnet, this has been trialed by the IMC [on mainnet through bootstrap](https://etherscan.io/tx/0xf502f7c036017eef26f9fc5141555c8ba7e045de5ff0dbaf931fd54db6e5d4c3). Now that pDAO on-chain governance is active, we should take advantage of it to remove that blocker from the team giving up some power.

Given that [RPIP-10](https://rpips.rocketpool.net/RPIPs/RPIP-10) specifies that “MCs SHALL be fully re-selected between 10-14 months from their last full selection”, the suggestion is to base the schedule on the latest allowed timing, i.e. vote in payouts up to the latest possible reward period the committee will have to be replaced by. If the MC changes sooner, the funding will still be correct for the new incoming MC and existing payment contracts can also be modified through another vote if needed.

The last selection for the GMC ended 2024-11-10, so we want to capture all payouts before 2026-01-10. This would mean 13 payouts.

The last selection for the IMC ended 2024-06-09, so we want to capture all payouts before 2025-08-09. This would mean 8 periods.

## Proposed GMC Payment Contract

`_contractName`: `GMC (2025-01)`  
`_recipientAddress`: `0x6efD08303F42EDb68F2D6464BCdCA0824e1C813a`  
`_amountPerPeriod`: `4702424536260456958231` (`4,702.42` RPL)  
`_periodLength`: `2419200 `  
`_startTime`: `1734586539`  
`_numPeriods`: `13`

## Proposed IMC Payment Contract

`_contractName`: `IMC (2025-01)`  
`_recipientAddress`: `0xb867EA3bBC909954d737019FEf5AB25dFDb38CB9 `  
`_amountPerPeriod`: `11361813617781227549820` (`11,361.81` RPL)  
`_periodLength`: `2419200 `  
`_startTime`: `1734586539`  
`_numPeriods`: `8`

> **Full explanation of contract parameters**
>
> `_contractName`  
> Just need something that is identifiable and can be typed in easily when claiming. Committee name plus date of the first claim seems like a reasonable choice.
> 
> `_recipientAddress`  
> Multisig addresses are in [RPIP-36](https://rpips.rocketpool.net/RPIPs/RPIP-36).
> 
> `_amountPerPeriod`  
> This one is a bit tricky. Payment contracts are set up to support a fixed amount of RPL per claim throughout their validity, but committee compensation is a share of inflation. The idea is to calculate the appropriate inflation share for the entire contract duration and then divide by the number of periods to get the correct total. The calculation was done with the following Python script:
> 
> ```python
> def calculate_inflation(initial_supply: int, days: int) -> int:
> supply = initial_supply
> 
> for _ in range(days):
> supply *= 1000133680617113500
> supply //= 10**18
> 
> return supply - initial_supply
> 
> def main():
> rpl_supply = 20988203069190289903554721 - 78407971276658331933618
> rpl_supply += calculate_inflation(rpl_supply, 27)
> 
> imc_periods = 8
> imc_inflation = calculate_inflation(rpl_supply, imc_periods * 28)
> imc_payout = imc_inflation * 285 * 500 // (imc_periods * 10**6)
> print(f"IMC: {imc_payout}")
> 
> gmc_periods = 13
> gmc_inflation = calculate_inflation(rpl_supply, gmc_periods * 28)
> gmc_payout = gmc_inflation * 285 * 205 // (gmc_periods * 10**6)
> print(f"GMC: {gmc_payout}")
> 
> if __name__ == ' __main__':
> main()
> 
> ```
> 
> It prints
> 
> ```auto
> IMC: 11361813617781227549820
> GMC: 4702424536260456958231
> 
> ```
> 
> The hardcoded constants are based on the following:
> 
> - [Inflation Rate](https://etherscan.io/address/0xD33526068D116cE69F19A9ee46F0bd304F21A51f#readContract#F5)
> - [Current Supply](https://etherscan.io/address/0xD33526068D116cE69F19A9ee46F0bd304F21A51f#readContract#F13)
> - [Last Inflation Amount](https://etherscan.io/tx/0x94ad8d617ee4d7f2169f19729ef0bc77c68cb2241105872cb1a0a85ad018fdee#eventlog#15)
> 
> The inflation share calculation is based on the 28.5% pDAO share ([RPIP-25](https://rpips.rocketpool.net/RPIPs/RPIP-25)) and the 50% IMC / 20.5% GMC shares ([RPIP-10](https://rpips.rocketpool.net/RPIPs/RPIP-10)) within that. The script also takes into account the idiosyncrasy that snapshot rewards are actually based on the day before, hence taking one period’s inflation off the supply and adding 27 days of inflation back on.
> 
> `_periodLength`  
> This is just the number of seconds in a reward period: `28 * 24 * 60 * 60 = 2419200`.
> 
> `_startTime`  
> The first payout is `_periodLength` after `_startTime`, so this should be the start of the current reward period rather than the end. [https://etherscan.io/address/0xEE4d2A71cF479e0D3d0c3c2C923dbfEB57E73111#readContract#F4](https://etherscan.io/address/0xEE4d2A71cF479e0D3d0c3c2C923dbfEB57E73111#readContract#F4) shows `1734586539`, which matches the last snapshot.
> 
> `_numPeriods`  
> This is discussed in the main post. 13 for GMC and 8 for IMC.

---

<div class="post-metadata">

**Author:** ![haloooloolo](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/haloooloolo/32/1155_2.png) [@haloooloolo](https://dao.rocketpool.net/u/haloooloolo)\
**Post date:** [22 December 2024 16:01 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/2 "2024-12-22T16:01:54Z")

</div>

Apologies for opening the poll immediately, but this needs to be submitted within roughly 4 days to make it in time for the next reward period. This is because on-chain votes take a total of three weeks:

- 1 week of delay for vote tree challenges
- 1 week of phase 1 voting (delegates and self-votes)
- 1 week to override delegates

If the consensus is strong (say 70%), it probably makes sense to submit. If not, we’ll have to wait another period and will have lots of time for the poll.

_Poll ([view on site](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/2))_

---

<div class="post-metadata">

**Author:** ![Valdorff](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/valdorff/32/319_2.png) [@Valdorff](https://dao.rocketpool.net/u/Valdorff)\
**Post date:** [22 December 2024 16:11 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/3 "2024-12-22T16:11:51Z")

</div>

Thanks @haloooloolo for putting that together. Since this is just executing something previously voted in (and it’s cancelable if things change), I’m happy to go ahead ASAP.

I reviewed the parameters (especially \_amountPerPeriod) and looks like we’re matching (there’s a minimal amount of rounding error, probably on my end, which amount to less than a billionth of an RPL, so deffo close enough).

> **Val's double checks the calculation**
>
> Parameters we need:
> 
> `_contractName`
> 
> - choices seem clear and unambiguous
> - GMC (2025-01)
> - IMC (2025-01)
> 
> `_recipientAddress`
> 
> - Multisig addresses are in [RPIP-36](https://rpips.rocketpool.net/RPIPs/RPIP-36) (and also in my Safe app)
> - GMC `0x6efD08303F42EDb68F2D6464BCdCA0824e1C813a`
> - IMC `0xb867EA3bBC909954d737019FEf5AB25dFDb38CB9`
> 
> On to `_amountPerPeriod`, which is the tough one.
> 
> - I’m doibg this a bit differently form Halo, which is good for checking. First I look at actual amounts transferred to pDAO treasury: [https://dune.com/queries/1264376](https://dune.com/queries/1264376)
> - `period_31_transfer=22343.284949727202292854`
> - `period_30_transfer=22259.814647920560318926`
> - Get rate of increase per period `period_mult=period_31_transfer/period_30_transfer=1.003749820163684`
> - `_amountPerPeriod=mc_share*sum([period_31_transfer*period_mult**i for i in range(1, 1+num_periods)])/num_periods`
> - For the GMC, mc\_share=.205 and num\_periods=13. We get `_amountPerPeriod = 4702.424536260458`
> - For the IMC, mc\_share=.5 and num\_periods=8. We get `_amountPerPeriod = 11361.81361778123`
> 
> `_periodLength`
> 
> - We’d like to align this with reward periods, so simply the number of seconds in 28 days. `28*24*60*60=2419200`
> 
> `_startTime`
> 
> - The first payout is \_periodLength after \_startTime, so we should set this to the start of the current period to make things line up.
> - [https://etherscan.io/address/0xEE4d2A71cF479e0D3d0c3c2C923dbfEB57E73111#readContract#F4](https://etherscan.io/address/0xEE4d2A71cF479e0D3d0c3c2C923dbfEB57E73111#readContract#F4) shows 1734586539, and cross-checking that on [epochconverter.com](http://epochconverter.com) shows the right time
> 
> `_numPeriods ` was discussed earlier. 13 for GMC and 8 for IMC.

---

<div class="post-metadata">

**Author:** ![drdoofus](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/drdoofus/32/403_2.png) [@drdoofus](https://dao.rocketpool.net/u/drdoofus)\
**Post date:** [23 December 2024 00:02 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/4 "2024-12-23T00:02:28Z")

</div>

The GMC is working through some things and we’d prefer this waited for another round. Very glad halooo is thinking about it and doing the prep work, though.

---

<div class="post-metadata">

**Author:** ![haloooloolo](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/haloooloolo/32/1155_2.png) [@haloooloolo](https://dao.rocketpool.net/u/haloooloolo)\
**Post date:** [26 December 2024 00:43 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/5 "2024-12-26T00:43:40Z")

</div>

Vote deferred. Here are the updated parameters if we’re targeting period 33.

`_contractName`: `GMC (2025-02)`  
`_recipientAddress`: `0x6efD08303F42EDb68F2D6464BCdCA0824e1C813a`  
`_amountPerPeriod`: `4711164165008686816503` (`4,711` RPL)  
`_periodLength`: `2419200 `  
`_startTime`: `1737005739`  
`_numPeriods`: `12`

`_contractName`: `IMC (2025-02)`  
`_recipientAddress`: `0xb867EA3bBC909954d737019FEf5AB25dFDb38CB9 `  
`_amountPerPeriod`: `11382996402453215228030` (`11,383` RPL)  
`_periodLength`: `2419200 `  
`_startTime`: `1737005739`  
`_numPeriods`: `7`

Will check back in a few weeks with another poll.

---

<div class="post-metadata">

**Author:** ![haloooloolo](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/haloooloolo/32/1155_2.png) [@haloooloolo](https://dao.rocketpool.net/u/haloooloolo)\
**Post date:** [10 January 2025 19:01 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/6 "2025-01-10T19:01:09Z")

</div>

This will take another period to sort out due to [On-chain Quorum & Initialization POAP](https://dao.rocketpool.net/t/on-chain-quorum-initialization-poap/3474).

---

<div class="post-metadata">

**Author:** ![langers](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/langers/32/92_2.png) [@langers](https://dao.rocketpool.net/u/langers)\
**Post date:** [13 January 2025 21:14 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/7 "2025-01-13T21:14:16Z")

</div>

Confirmed initialised vote power is now 100%. Well done @haloooloolo for sorting that out.

```auto
Initialised vote power: 86133.31411969055, which is 100% vote power.

```

I can get @kane to adjust the quorum to 15% this week to match snapshot.

---

<div class="post-metadata">

**Author:** ![haloooloolo](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/haloooloolo/32/1155_2.png) [@haloooloolo](https://dao.rocketpool.net/u/haloooloolo)\
**Post date:** [11 March 2025 13:37 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/8 "2025-03-11T13:37:45Z")

</div>

Ok, revisiting this a few months later now that on-chain vote power is fully intialized and [RPIP-68](https://rpips.rocketpool.net/RPIPs/RPIP-68) is actively being voted on. The aim here is still the same. We’d like to vote in a payment contract so that the committees can claim their budget every reward round without being dependent on a manual disbursement from the team.

These are the updated payment contract details to reflect the remainder of reward periods until the committees are bound to be reelected, each with an accompanying sentiment poll whether we move to an on-chain vote. Note that these polls are **contingent on RPIP-68** since the payment details assume a pDAO split of 27.5%.

Another important bit of context for the GMC budget vote specifically is that there is still an [ongoing discussion](https://dao.rocketpool.net/t/revised-gmc-split-proposal/3430/8) to revisit its 20.5% share of the pDAO budget. There is no agreement or RPIP for it yet, but if that comes to pass before the below contract expires, it would require another on-chain vote to modify the GMC payment contract. There is also a possibility that a revised split would change the budget for both committees, not only the GMC.

In terms of timing, starting a 7 day sentiment poll now allows us to start the onchain vote right after RPIP-68 passes (assuming both are successful). This would make the proposal executable one day after the reward snapshot in April, in time for both committees to claim and use their budgets.

## IMC

```auto
_contractName: IMC (2025-04)
_recipientAddress: 0xb867EA3bBC909954d737019FEf5AB25dFDb38CB9 
_amountPerPeriod: 11024625079120103834154 (11,024.63 RPL)
_periodLength: 2419200 (28 days)
_startTime: 1741844139 (March 13 05:35am UTC)
_numPeriods: 5

```

_Poll ([view on site](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/8))_

## GMC

```auto
_contractName: GMC (2025-04)
_recipientAddress: 0x6efD08303F42EDb68F2D6464BCdCA0824e1C813a
_amountPerPeriod: 4562789135567855102050 (4,562.79 RPL)
_periodLength: 2419200 (28 days)
_startTime: 1741844139 (March 13 05:35am UTC)
_numPeriods: 10

```

_Poll ([view on site](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/8))_

For a full explanation of the parameters, see the initial post in this thread.

> **Updated script for amount per period**
>
> ```auto
> def calculate_inflation(initial_supply: int, days: int) -> int:
> supply = initial_supply
> 
> for _ in range(days):
> supply *= 1000133680617113500
> supply //= 10**18
> 
> return supply - initial_supply
> 
> def main():
> rpl_supply = 21145902161625010994503424
> rpl_supply += calculate_inflation(rpl_supply, 27)
> 
> imc_periods = 5
> imc_inflation = calculate_inflation(rpl_supply, imc_periods * 28)
> imc_payout = imc_inflation * 275 * 500 // (imc_periods * 10**6)
> print(f"IMC: {imc_payout}")
> 
> gmc_periods = 10
> gmc_inflation = calculate_inflation(rpl_supply, gmc_periods * 28)
> gmc_payout = gmc_inflation * 275 * 205 // (gmc_periods * 10**6)
> print(f"GMC: {gmc_payout}")
> 
> if __name__ == ' __main__':
> main()
> 
> ```
> 
> ```auto
> IMC: 11024625079120103834154
> GMC: 4562789135567855102050
> 
> ```

---

<div class="post-metadata">

**Author:** ![haloooloolo](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/haloooloolo/32/1155_2.png) [@haloooloolo](https://dao.rocketpool.net/u/haloooloolo)\
**Post date:** [19 March 2025 23:08 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/9 "2025-03-19T23:08:32Z")

</div>

Seems like sentiment is positive for the IMC vote. There is now an [RPIP draft](https://github.com/rocket-pool/RPIPs/pull/324) for changes to the GMC budget, which doesn’t affect the IMC budget in its current state. The GMC contract details can be revisited for a vote next reward period if the RPIP is close to final by then.

I will raise the on-chain proposal for the IMC contract tomorrow when the current batch of Snapshot proposals has concluded. There is one small deviation from the details in the sentiment poll: I will use `IMC-2025-04` instead of `IMC (2025-04)` as the name since Smart Node doesn’t seem to like spaces in the proposal ID. I think I can get around this by going through the contract, but the hyphenated version seems more sensible to me anyhow. I don’t expect this to be controversial, but I’m posting it here in case anyone strongly prefers for me to use the original name.

---

<div class="post-metadata">

**Author:** ![haloooloolo](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/haloooloolo/32/1155_2.png) [@haloooloolo](https://dao.rocketpool.net/u/haloooloolo)\
**Post date:** [20 March 2025 04:24 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/10 "2025-03-20T04:24:51Z")

</div>

Proposal for IMC budget:  
[https://etherscan.io/tx/0xbd8f3dd876880e74d399bf0dbfb401459e429d3b9c2a21596d8dc60ef5ecf4e5](https://etherscan.io/tx/0xbd8f3dd876880e74d399bf0dbfb401459e429d3b9c2a21596d8dc60ef5ecf4e5)

---

<div class="post-metadata">

**Author:** ![Valdorff](https://dao.rocketpool.net/user_avatar/dao.rocketpool.net/valdorff/32/319_2.png) [@Valdorff](https://dao.rocketpool.net/u/Valdorff)\
**Post date:** [28 March 2025 05:57 UTC](https://dao.rocketpool.net/t/on-chain-vote-recurring-spend-for-committee-budgets/3423/11 "2025-03-28T05:57:49Z")

</div>

Figured I’d independently check the parameters and type it up:

node.rocketpool.net/vote provides the payload:

```auto
proposalTreasuryNewContract(
    IMC-2025-04,
    0xb867EA3bBC909954d737019FEf5AB25dFDb38CB9,
    11024625079120103834154,
    2419200,
    1741844139,
    5
)

```

And we can see what each of those components is by searching the function in the codebase real quick:  
`proposalTreasuryNewContract(string memory _contractName, address _recipientAddress, uint256 _amountPerPeriod, uint256 _periodLength, uint256 _startTime, uint256 _numPeriods)`

Name is fine. Address is indeed the IMC multisig. We’ll come back to amount at the end cuz it has real thinking. Period length in seconds is correct at 28 days: `28*24*60*60`. See below for start time. Num periods is in line with what’s desired for the current IMC selection cycle.

Start time has a little gotcha – we want that to be one period (28 days) before the first payout. That epoch time is March 13 at 5:35 GMT – that is indeed when the last period transition happened.

On to the amount. I use [https://dune.com/queries/1264376](https://dune.com/queries/1264376) to get per-period inflation rate by dividing the last two rplAmts, and also the starting rplAmt. Then we then want the average of the next 5 periods, and we want to adjust that by multiplying with 0.5 (the IMC share) and 27.5/28.5 (to account for the recent shift from pDAO to oDAO).

```python
>>> ultimate = 22595.578546027106873451
>>> penultimate = 22511.165722891375675992
>>> period_mult = ultimate/penultimate
>>> .5*(sum([ultimate*(period_mult**i) for i in range(1, 6)])/5)*(27.5/28.5)
11024.625079120106

```

An irrelevant 2 picoRPL difference, probably caused by my careless use of floats.  
So – I’m happy, and will be voting For.
