Skip to content

Commit

Permalink
Merge pull request #35 from makerdao/fix/psm-checklists
Browse files Browse the repository at this point in the history
[PSM Checklists] General improvements after feedback
  • Loading branch information
amusingaxl authored Aug 20, 2024
2 parents e2376d4 + a787516 commit 4276a70
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 50 deletions.
2 changes: 2 additions & 0 deletions .wordlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ ExecLib
Filable
Fileable
fileables
FOREACH
Getter
github
goerli
Expand Down Expand Up @@ -92,6 +93,7 @@ Onboardings
OpenZeppelin
OSM
params
permalink
permissioned
permissioning
permittedDrop
Expand Down
107 changes: 58 additions & 49 deletions spell/psm-checklists.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

## PSM Migration Checklist

- [ ] IF contracts are being on-boarded in the current spell, execute the full [LitePSM On-boarding Checklist](#litepsm-on-boarding-checklist)
- [ ] IF a PSM is deprecated in the migration, execute the full [PSM Off-boarding Checklist](#psm-off-boarding-checklist)
- [ ] IF LitePSM MOM is being on-boarded in the current spell, execute the full [LitePSM MOM Onboarding Checklist](#litepsm-mom-onboarding-checklist)
- [ ] IF LitePSM contracts are being on-boarded in the current spell, execute the full [LitePSM Onboarding Checklist](#litepsm-onboarding-checklist)
- [ ] IF a PSM is deprecated in the migration, execute the full [PSM Offboarding Checklist](#psm-offboarding-checklist)
- [ ] IF present, max amount of gems to move (`dstWant`) matches the Exec Sheet
- [ ] IF present, min amount of gems to keep (`srcKeep`) matches the Exec Sheet
- Source PSM:
Expand All @@ -30,10 +31,10 @@
- [ ] `vat.vice()` is unchanged after the spell execution
- [ ] `vat.sin(MCD_PAUSE_PROXY)` is unchanged after the spell execution

## LitePSM On-boarding Checklist
## LitePSM MOM Onboarding Checklist

- Deployed Contracts
- `DssLitePsm`
- `DssLitePsmMom`
- [ ] Optimizer is **enabled**
- [ ] Optimize runs is set to `200`
- [ ] Contract has been reviewed by minimum 2 specialized [Active Ecosystem Actors](https://mips.makerdao.com/mips/details/MIP101#2-8-2-active-ecosystem-actors)
Expand All @@ -44,15 +45,19 @@
- [ ] EITHER code diff check for each individual file
- [ ] OR bytecode verification tool such as `forge verify-bytecode`
- [ ] Deployed contract matches the code in the [repo](https://github.com/makerdao/dss-lite-psm/)
- Constructor params:
- [ ] ilk is named `LITE-PSM-{TOKEN_SYMBOL}-A` (i.e. `LITE-PSM-USDC-A`)
- [ ] `gem` matches the expected token address
- [ ] `daiJoin` matches `MCD_JOIN_DAI` from the chainlog
- [ ] `pocket` matches the pocket address in the Exec Sheet
- [ ] Deployer no longer has privileged access (`wards(deployer) == 0`)
- [ ] `MCD_PAUSE_PROXY` has been authed (i.e. `require(WardsLike(LITE_PSM).wards(MCD_PAUSE_PROXY) == 1)`)
- [ ] Sanity check: `DssLitePsm` has `type(uint256).max` approval to spend `gem` on behalf of `pocket`
- `DssLitePsmMom`
- [ ] Deployer is no longer the `owner`
- [ ] `MCD_PAUSE_PROXY` is the `owner` of the contract (i.e. `require(MomLike(MOM).owner() == MCD_PAUSE_PROXY`))
- Initialization:
- `DssLitePsmMom`:
- [ ] The chief (`MCD_ADM`) is set as the `authority` (i.e. `MomLike(MOM).setAuthority(MCD_ADM)`)
- Test Coverage:
- `DssLitePsmMom`:
- [ ] The chief (`MCD_ADM`) is set as the `authority` (i.e. `MomLike(MOM).setAuthority(MCD_ADM)`)

## LitePSM Onboarding Checklist

- Deployed Contracts
- `DssLitePsm`
- [ ] Optimizer is **enabled**
- [ ] Optimize runs is set to `200`
- [ ] Contract has been reviewed by minimum 2 specialized [Active Ecosystem Actors](https://mips.makerdao.com/mips/details/MIP101#2-8-2-active-ecosystem-actors)
Expand All @@ -63,43 +68,50 @@
- [ ] EITHER code diff check for each individual file
- [ ] OR bytecode verification tool such as `forge verify-bytecode`
- [ ] Deployed contract matches the code in the [repo](https://github.com/makerdao/dss-lite-psm/)
- [ ] Deployer is no longer the `owner`
- [ ] `MCD_PAUSE_PROXY` is the `owner` of the contract (i.e. `require(MomLike(MOM).owner() == MCD_PAUSE_PROXY`))
- Constructor params:
- [ ] ilk is named `LITE-PSM-{TOKEN_SYMBOL}-A` (i.e. `LITE-PSM-USDC-A`)
- [ ] `gem` matches the expected token address
- [ ] `daiJoin` matches `MCD_JOIN_DAI` from the chainlog
- [ ] `pocket` matches the pocket address in the Exec Sheet
- [ ] Deployer no longer has privileged access (`wards(deployer) == 0`)
- [ ] `MCD_PAUSE_PROXY` has been authed (i.e. `require(WardsLike({LITE_PSM}).wards(MCD_PAUSE_PROXY) == 1)`)
- [ ] Sanity check: `DssLitePsm` has `type(uint256).max` approval to spend `gem` on behalf of `pocket`
- `LitePsmJob`
- [ ] Uses the default Solidity version in [`dss-cron`](https://github.com/makerdao/dss-cron)
- [ ] Optimizer is **enabled**
- [ ] Deployed contract matches the code in the [repo](https://github.com/makerdao/dss-cron)
- Constructor params:
- [ ] `_sequencer` matches `CRON_SEQUENCER` address from the chainlog
- [ ] `_litePsm` matches `DssLitePsm` address
- [ ] `_litePsm` matches `{LITE_PSM}` address
- [ ] `_rushThreshold` matches the Exec Sheet (it might be named as "fill threshold")
- [ ] `_gushThreshold` matches the Exec Sheet (it might be named as "trim threshold")
- [ ] `_cutThreshold` matches the Exec Sheet (it might be named as "chug threshold")
- Initialization
- `DssLitePsm`:
- [ ] `buf` is set to the value specified in the Exec Sheet
- [ ] `vow` is set to `MCD_VOW` from the chainlog
- [ ] `MCD_PAUSE_PROXY` is whitelisted to execute swaps with no fees (i.e. `KissLike(LITE_PSM).kiss(MCD_PAUSE_PROXY)`)
- [ ] `DssLitePsmMom` is authed (i.e. `RelyLike(LITE_PSM).rely(MOM)`)
- `DssLitePsmMom`:
- [ ] The chief (`MCD_ADM`) is set as the `authority` (i.e. `MomLike(MOM).setAuthority(MCD_ADM)`)
- [ ] `MCD_PAUSE_PROXY` is whitelisted to execute swaps with no fees (i.e. `KissLike({LITE_PSM}).kiss(MCD_PAUSE_PROXY)`)
- [ ] `DssLitePsmMom` is authed (i.e. `RelyLike({LITE_PSM}).rely(MOM)`)
- `LitePsmJob`:
- [ ] Job is added to `CRON_SEQUENCER`
- [ ] `MCD_VAT`: new ilk is initialized
- [ ] `MCD_JUG`: new ilk is initialized
- `MCD_VAT`:
- [ ] New ilk is initialized
- `MCD_JUG`:
- [ ] New ilk is initialized
- `MCD_SPOT`:
- [ ] Sanity check: Dai parity (`par`) current value is 1 (`1 * RAY`)
- [ ] Collateralization ratio (`mat`) is set to 100% (`1 * WAD`) for the ilk
- IF a new `pip` is being used:
- [ ] Collateralization ratio (`mat`) is set to 100% (`1 * RAY`) for the ilk
- [ ] IF a new `pip` is being used:
- [ ] `pip` is set for the ilk
- [ ] `pip` is a `DSValue` instance
- [ ] The value on `pip` is set to 1 (`1 * WAD`)
- [ ] `pip` deployer is no longer the `owner`
- [ ] `MCD_PAUSE_PROXY` is the `owner` on `pip`
- OTHERWISE when reusing an existing `pip`:
- [ ] OTHERWISE when reusing an existing `pip`:
- [ ] `pip` is set for the ilk
- [ ] `pip` in the chainlog matches `gem` symbol (i.e. `PIP_USDC` for `USDC`)
- [ ] `ILK_REGISTRY`: new ilk is added to the registry
- `ILK_REGISTRY`:
- [ ] New ilk is added to the registry
- `CHAINLOG`:
- [ ] `DssLitePsm` is added to the chainlog and `addresses_mainnet.sol` according to the Exec Sheet
- [ ] `pocket` is added to the chainlog and `addresses_mainnet.sol` according to the Exec Sheet
Expand All @@ -110,41 +122,38 @@
- `DssLitePsm`:
- [ ] `vow` is set to `MCD_VOW`
- [ ] `buf` matches the Exec Sheet
- [ ] `MCD_PAUSE_PROXY` is whitelisted to execute swaps with no fees (i.e. `KissLike(LITE_PSM).bud(MCD_PAUSE_PROXY) == 1`)
- [ ] `DssLitePsmMom` is authed (i.e. `WardsLike(LITE_PSM).wards(MOM) == 1`)
- [ ] `MCD_PAUSE_PROXY` is whitelisted to execute swaps with no fees (i.e. `KissLike({LITE_PSM}).bud(MCD_PAUSE_PROXY) == 1`)
- [ ] `DssLitePsmMom` is authed (i.e. `WardsLike({LITE_PSM}).wards(MOM) == 1`)
- E2E tests:
- [ ] `buyGem` works as expected
- [ ] `sellGem` works as expected
- [ ] `buyGemNoFee` works as expected
- [ ] `sellGemNoFee` works as expected
- `DssLitePsmMom`:
- Chief (`MCD_ADM`) is set as the `authority` (i.e. `MomLike(MOM).authority() == MCD_ADM`)
- E2E tests:
- [ ] `halt` works as expected
- [ ] `halt` prevents new swaps in `{LITE_PSM}`
- `LitePsmJob`:
- [ ] Job is added to `CRON_SEQUENCER` (i.e.: `SequencerLike(CRON_SEQUENCER).hasJob(LITE_PSM_JOB) == true`)
- [ ] `_sequencer` matches `CRON_SEQUENCER` address from the chainlog
- [ ] `_litePsm` matches `DssLitePsm` address
- [ ] `_rushThreshold` matches the Exec Sheet (it might be named as "fill threshold")
- [ ] `_gushThreshold` matches the Exec Sheet (it might be named as "trim threshold")
- [ ] `_cutThreshold` matches the Exec Sheet (it might be named as "chug threshold")
- [ ] `sequencer` matches `CRON_SEQUENCER` address from the chainlog
- [ ] `litePsm` matches `{LITE_PSM}` address
- [ ] `rushThreshold` matches the Exec Sheet (it might be named as "fill threshold")
- [ ] `gushThreshold` matches the Exec Sheet (it might be named as "trim threshold")
- [ ] `cutThreshold` matches the Exec Sheet (it might be named as "chug threshold")
- E2E tests:
- [ ] `workable` returns the correct value:
- [ ] IF `rush() > 0`, returns `(true, litePsm.fill.selector)`
- [ ] OTHERWISE IF `cut() > 0`, returns `(true, litePsm.chug.selector)`
- [ ] OTHERWISE IF `gush() > 0`, returns `(true, litePsm.trim.selector)`
- [ ] OTHERWISE returns `(false, "")`
- [ ] `work` has the desired effect:
- [ ] IF `rush() > 0`, `fill` is called
- [ ] OTHERWISE IF `cut() > 0`, `chug` is called
- [ ] OTHERWISE IF `gush() > 0`, `trim` is called
- [ ] OTHERWISE reverts
- [ ] `MCD_VAT`: `urns[ilk][LITE_PSM].ink` is set to the max value that will not cause an overflow (`int256(type(uint256).max / RAY)`)
- [ ] `MCD_JUG`: Stability fee (`duty`) is set to 0% (`1 * RAY`) for the ilk (:information_source: covered in `config.sol`)
- `work` has the desired effect:
- [ ] IF `rush() > _rushThreshold`, `fill` is called
- [ ] OTHERWISE IF `cut() > _cutThreshold`, `chug` is called
- [ ] OTHERWISE IF `gush() > _gushThreshold`, `trim` is called
- [ ] OTHERWISE it reverts
- `MCD_VAT`:
- [ ] `urns[ilk][{LITE_PSM}].ink` is set to the max value that will not cause an overflow (`int256(type(uint256).max / RAY)`)
- `MCD_JUG`:
- [ ] Stability fee (`duty`) is set to 0% (`1 * RAY`) for the ilk (:information_source: covered in `config.sol`)
- `MCD_SPOT`:
- [ ] `spotter(DST_ILK).mat` is set to 100% (`1 * RAY`) (:information_source: covered in `config.sol`)
- [ ] `spotter(DST_ILK).pip` is set correctly
- [ ] `CHAINLOG`: version is bumped: `{x}.{y}.{z+1}` (:information_source: covered in `config.sol`)
- `CHAINLOG`:
- [ ] Version is bumped: `{x}.{y}.{z+1}` (:information_source: covered in `config.sol`)
- `ILK_REGISTRY`:
- [ ] New ilk is added to the registry
- [ ] `name` matches `gem` name
Expand All @@ -155,7 +164,7 @@
- [ ] `gemJoin` is set to `address(0)`
- [ ] `clip` is set to `address(0)`

## PSM Off-boarding Checklist
## PSM Offboarding Checklist

- [ ] ilk is removed from `AutoLine`
- [ ] ilk `line` is set to `0`
Expand Down
7 changes: 6 additions & 1 deletion spell/spell-reviewer-mainnet-checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,11 @@
* [`DssExecLib.setGlobalDebtCeiling(amount)`](https://github.com/makerdao/dss-exec-lib/blob/v0.0.9/src/DssExecLib.sol#L428)
* [`DssExecLib.increaseGlobalDebtCeiling(amount)`](https://github.com/makerdao/dss-exec-lib/blob/v0.0.9/src/DssExecLib.sol#L436)
* [`DssExecLib.decreaseGlobalDebtCeiling(amount)`](https://github.com/makerdao/dss-exec-lib/blob/v0.0.9/src/DssExecLib.sol#L445C14-L445C39)
* IF additional dependencies (i.e. `./src/dependencies/` directory) are present:
* [ ] IF the dependencies contracts/libraries have been audited
* [ ] Each contract/library exactly matches (i.e. diff check) the source code of the latest audited version
* [ ] OTHERWISE obtain the permalink to the relevant repository from a trusted party (i.e. Gov Facilitators)
* [ ] Each contract/library exactly matches (i.e. diff check) the source code from the permalink
* IF onboarding is present
* [ ] Insert and follow the relevant checklists below:
* [Collateral Onboarding](./collateral-onboarding-checklist.md)
Expand Down Expand Up @@ -294,7 +299,7 @@
* Minor -> Core Module (DSS) Update (e.g. Flapper) (0.++.0)
* Patch -> Collateral addition or addition/modification (0.0.++)
* [ ] New addresses are added to the `addresses_mainnet.sol`
* [ ] Changes are tested via `testNewOrUpdatedChainlogValues`
* [ ] Changes are tested via `testChainlogIntegrity` and `testChainlogValues`
* [ ] Ensure every spell variable is declared as `public`/`internal`
* [ ] Ensure `immutable` visibility is only used when fetching addresses from the `ChainLog` via `DssExecLib.getChangelogAddress(key)` and `constant` is used instead for static addresses
* [ ] Fetch addresses as type `address` and wrap with `Like` suffix interfaces inline (when making calls), UNLESS archive patterns permit otherwise (Such as `MKR`)
Expand Down

0 comments on commit 4276a70

Please sign in to comment.