Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/pi0neerpat/dao-proposal-pipeline


https://github.com/pi0neerpat/dao-proposal-pipeline

Last synced: 27 days ago
JSON representation

Awesome Lists containing this project

README

        


DAO Proposal Pipeline



Twitter: pi0neeroat

An opinionated set of tools to generate, review, and submit DAO proposals.

# How it works

1. Generate proposals via the CLI
2. Verify using the standard PR review process
3. Merged proposals in the `/gov-output` folder are automatically published in the app

Fork the repo for your DAO and deploy `/app` to Vercel.

## Governance CLI

Proposals are first drafted by creating a new file in `/gov-input` folder.

Then the `propose` command is used to generate bytecode (if necessary) and create a publish-ready proposal in `/gov-output`.

```bash
yarn propose [action flag] [option flag] [path to input json]
```

All available flags can also be viewed with

```bash
yarn propose --help
```

The input for the proposal is a json file in the "gov-inputs/[network]" folder. You can find basic templates in these folders.

All JSON inputs have these required fields:

- `chainid`: the chainId of the desired network.
- `network`: the desired network to be submitted on.
- `proposalType`: the type of proposal. This must be in camel case with the first letter capitalized e.g. "AddCollateral"
- `ODGovernor_Address`: the address of the OD_Governor. if you don't want to enter this manually use the `--auto` flag.
- `description`: a description of the proposal being made.

Contract addresses with the "\_Address" suffix can be automatically added by the generation script with the `--auto` flag.

For example:

```
yarn propose -g --auto /gov-input/anvil/new-AddCollateral.json
```

will fill in`ProtocolToken_Address, ODGovernor_Address, SAFEEngine_Address, OracleRelayer_Address, LiquidationEngine_Address, TaxCollector_Address, GlobalSettlement_Address` from `script/anvil/deployment/AnvilContracts.t.sol`

The output is always a JSON file which includes at least the following `proposalParams`:

```
{
"proposalId": uint256,
"targets": address[],
"values": uint256[]
"calldatas": bytes[],
"description": string,
"descriptionHash": bytes32
}
```

The JSON output may also include extra params for informative purposes and for execution params for the scripts themselves. Please do not alter the generated outputs in any way. This will invalidate the proposal.

## Steps for submitting a proposal

1. Fill in necessarry data in the input Json template.
2. Generate the Proposal with

```bash
yarn propose -g --auto /gov-input/new-ProposalType.json
```

3. If you haven't delegated your tokens you can delegate to yourself with

```bash
yarn propose -d /gov-output/11111111-proposalType.json
```

4. Commit and push your changes so someone else can use the generate script to with the same params to verify the output is correct.
5. After Verification, Submit the proposal with

```bash
yarn propose -s /gov-output/11111111-proposalType.json
```

6. Vote on a proposal with

```bash
yarn propose -v /gov-output/11111111-proposalType.json
```

7. Queue a proposal with

```bash
yarn propose -q /gov-output/11111111-proposalType.json
```

8. Execute a proposal with

```bash
yarn propose -x /gov-output/11111111-proposalType.json
```

**note:**
If you want to use the `--delegate` flag to delegate your tokens, you must add the `ProtocolToken_Address` field to the input json, or use the `--auto` flag when generating the proposal.

## Proposal Types

### Add Collateral

Add a new ERC20 as collateral to the system.

Template: [`new-AddCollateral.json`](gov-input/anvil/new-AddCollateral.json)

**Required json fields**

- newCollateralAddress: the token address of the proposed collateral to be added.
- newCollateralType: the symbol of the collateral token e.g. ARB
- SAFEEngineCollateralParams:
- collateralDebtCeiling: RAD, The maximum amount of debt that can be generated with the collateral type
- collateralDebtFloor: RAD, The minimum amount of debt that must be generated by a SAFE using the collateral
- TaxCollectorCollateralParams:
- stabilityFee: RAY, the per collateral stability fee.
- LiquidationEngineCollateralParams:
- newCAHChild: This will be automatically added in the generation script. you can leave this empty.
- liquidationPenalty: WAD, Penalty applied to every liquidation involving this collateral type.
- liquidationQuantity: RAD, Max amount of system coins to request in one auction for this collateral type.
- OracleRelayerCollateralParams:
- delayedOracle: Usually a DelayedOracle that enforces delays to fresh price feeds.
- safetyCRatio: RAY, CRatio used to compute the 'safePrice' - the price used when generating debt in SAFEEngine.
- liquidationCRatio: RAY, CRatio used to compute the 'liquidationPrice' the price used when liquidating SAFEs.
- CollateralAuctionHouseParams: - maxDiscount: WAD, Maximum discount at which collateral is being sold - minimumBid: WAD, Minimum acceptable bid - minDiscount: WAD, Minimum discount at which collateral is being sold - perSecondDiscountUpdateRate: RAY, Rate at which the discount will be updated in an auction.
This script proposes adding a new collateral to the system (deploys new contracts via the collateral join, collateral auction house factories and it adds the correct authorizations to the needed contracts).

### Modify Parameters

Modify any parameters in a `Modifiable.sol` contract.

Template: [`new-ModifyParameters.json`](gov-input/anvil/new-ModifyParameters.json)

**Required JSON vars:**

- `objectArray`: each object in the array can be a param to be modified. Each object must contain:
- `target`: the address of the target contract.
- `param`: the name of the param to be modified.
- `type`: the data type of the input data.
- `data`: the input data. this can be a string, uint or an address. depending on the requirement of the parameter that is being modified.

### Update PIDController Params

Update the redemption rate PI controller.

Template: [`new-UpdatePIDController.json`](gov-input/anvil/new-UpdatePIDController.json)

To update the PI controller you simply make a ModifyParameters proposal with all the PI controller params you would like to modify listed as individual params in the `objectArray`.

> NOTE: see [`IPIDController.sol`](src/interfaces/IPIDController.sol) for more information about this.

### ERC20 Transfer

Transfer ERC20 tokens from the TimelockController or any target contract.

Template: [`newERC20Transfer.json`](gov-input/anvil/newERC20Transfer.json)

You can propose multiple transfers in the same proposal by adding multiple transfer objects to the `objectArray`

**Required json vars:**

- `objectArray`: each object in the objectArray is a proposed transfer.
- `erc20Token`: the address of the token to be transfered
- `transferTo`: the address of the token recipient
- `amount`: the amount to be transfered in wei.

# Using cast to generate calldata

Here are some helpful examples using Foundry to generate calldata for the TargetsAndCalldata template.

```bash

- `cast calldata "someFunc(address,uint256)" 0x... 1`
- governance: `cast calldata "setProposalThreshold(uint256)" 2000000000000000000000`
- nitro pool: `cast calldata "addRewards(uint256,uint256)" 8500000000000000000000 10000000000000000000000`
- erc20 approve: `cast calldata "approve(address,uint256)" 0xa14259d4E57609cF21d40AD2C8EBAc59Ca059F42 10000000000000000000000`
- `cast to-wei 2222222`

```