Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PSM Checklists] General improvements after feedback #35

Merged
merged 6 commits into from
Aug 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading