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

Mainnet Spell 2024-11-14 #439

Merged
merged 16 commits into from
Nov 14, 2024
Merged

Mainnet Spell 2024-11-14 #439

merged 16 commits into from
Nov 14, 2024

Conversation

SidestreamIcedMango
Copy link
Contributor

Description

This PR implements the 2024-11-14 mainnet spell based on the relevant exec sheet

Contribution Checklist

  • PR title starts with (PE-<TICKET_NUMBER>)
  • Code approved
  • Tests approved
  • CI Tests pass

Checklist

  • Every contract variable/method declared as public/external private/internal
  • Consider if this PR needs the officeHours modifier override
  • Verify expiration (30 days unless otherwise specified)
  • Verify hash in the description matches here
  • Validate all addresses used are in changelog or known
  • Notify any external teams affected by the spell so they have the opportunity to review
  • Deploy spell ETH_GAS_LIMIT="XXX" ETH_GAS_PRICE="YYY" make deploy
  • Verify mainnet contract on etherscan
  • Change test to use mainnet spell address and deploy timestamp
  • Run make archive-spell or make date="YYYY-MM-DD" archive-spell to make an archive directory and copy DssSpell.sol, DssSpell.t.sol, DssSpell.t.base.sol, and DssSpellCollateralOnboarding.sol
  • squash and merge this PR

src/DssSpell.sol Outdated Show resolved Hide resolved
src/DssSpell.sol Outdated Show resolved Hide resolved
@@ -626,22 +674,37 @@ contract DssSpellTest is DssSpellTestBase {
int256 sky;
}

function testPayments() public skipped { // add the `skipped` modifier to skip
function testPayments() public { // add the `skipped` modifier to skip
bool ignoreTotalSupplyDaiUsds = true; // Set to false unless there is SubDAO spell interference
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is actually needed not only because there is about ~9m USDS that is minted by the Spark spell, thanks to the new allocator system onboarded last time. But also due to the sUSDS.drip() call which changes the USDS total supply and MIP21_LIQUIDATION_ORACLE.cull which changes surplus buffer balance.

All in all, it's very hard to account for those changes in the tests and I'm fine to just ignore the total change for now, once this happens. Manually checked that it matches when the mentioned calls are removed

@oddaf
Copy link
Member

oddaf commented Nov 13, 2024

TL/DR: Good to deploy

Mainnet Executive Spell Review Checklist

Development Stage

  • Preparation
    • Exec Sheet for the specified date is found in the "Executive Vote Implementation Process" google sheet
      Insert URL to the specific sheet here https://docs.google.com/spreadsheets/d/1w_z5WpqxzwreCcaveB2Ye1PP5B8QAHDglzyxKHG3CHw/edit?gid=281786326#gid=281786326
    • Using Exec Sheet URL from the above, read spell instructions from the Exec Sheet and list them below
      List all instructions announced in the Exec Sheet
      • Stability Fee Changes
        Increase ETH-A Stability Fee by 2 percentage point from 6.25% to 8.25%
        Increase ETH-B Stability Fee by 2 percentage point from 6.75% to 8.75%
        Increase ETH-C Stability Fee by 2 percentage point from 6.00% to 8.00%
        Increase WSTETH-A Stability Fee by 2 percentage point from 7.25% to 9.25%
        Increase WSTETH-B Stability Fee by 2 percentage point from 7.00% to 9.00%
        Increase WBTC-A Stability Fee by 2 percentage point from 9.25% to 11.25%
        Increase WBTC-B Stability Fee by 2 percentage point from 9.75% to 11.75%
        Increase WBTC-C Stability Fee by 2 percentage point from 9.00% to 11.00%
      • Savings Rate Changes
        Increase DSR by 2 percentage point from 5.50% to 7.50%
        Increase SSR by 2 percentage point from 6.50% to 8.50%
      • Increase SparkLend D3M Buffer Parameter
        Increase the DIRECT-SPARK-DAI buffer parameter by 50 million DAI from 50 million DAI to 100 million DAI.
      • Update Gelato Keeper Treasury Address
        Update DssExecLib.setContract: GELATO_PAYMENT_ADAPTER - "treasury" to 0x5041c60C75633F29DEb2AED79cB0A9ed79202415
      • ConsolFreight Debt Write-Off and DAO Resolution
        Account for the accumulated stability fee by calling jug.drip("RWA003-A")
        Write-off the debt of RWA003-A by calling rwaLiqOrcl.cull("RWA003-A", RWA003_A_URN)
        Approve ConsolFreight Dao Resolution with IPFS hash QmX4DdVBiDBjLXYT4J4jC1XMdTn2Q7Ao8L66pKB8N3yETA
      • Sky Ecosystem Liquidity Bootstrapping Funding
        Transfer 4,000,000 DAI to the Pause Proxy from the Surplus Buffer
        Convert 4,000,000 DAI to USDS using DAI_USDS
        Transfer 4,000,000 USDS from PauseProxy to 0xD8507ef0A59f37d15B5D7b630FA6EEa40CE4AFdD
      • Integration Boost Funding
        Transfer 3,000,000 DAI to the Pause Proxy from the Surplus Buffer
        Convert 3,000,000 DAI to USDS using DAI_USDS
        Transfer 3,000,000 USDS from PauseProxy to 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7
      • Set Facilitator DAI Payment Streams
        JanSky | 2024-10-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-10-01 00:00:00 | 168,000 DAI | 0xf3F868534FAD48EF5a228Fe78669cf242745a755 | Restricted: Yes
        Endgame Edge | 2024-10-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-10-01 00:00:00 | 168,000 DAI | 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 | Restricted: Yes
        Ecosystem | 2024-12-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-12-01 00:00:00 | 84,000 DAI | 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 | Restricted: Yes
      • Set Facilitator MKR Payment Streams
        JanSky | 2024-10-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-10-01 00:00:00 | 72.00 MKR | 0xf3F868534FAD48EF5a228Fe78669cf242745a755 | Restricted: Yes
        Endgame Edge | 2024-10-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-10-01 00:00:00 | 72.00 MKR | 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 | Restricted: Yes
        Ecosystem | 2024-12-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-12-01 00:00:00 | 36.00 MKR | 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 | Restricted: Yes
      • Aligned Delegate DAI Compensation
        JuliaChang - 109168 DAI - 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
        Cloaky - 58412 DAI - 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
        BLUE - 54167 DAI - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        Byteron - 34517 DAI - 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
        vigilant - 16155 DAI - 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
        Kohla (Cloaky) - 10000 DAI - 0x73dFC091Ad77c03F2809204fCF03C0b9dccf8c7a
        Ennoia (Cloaky) - 10000 DAI - 0xA7364a1738D0bB7D1911318Ca3FB3779A8A58D7b
        Bonapublica - 8333 DAI - 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
        Rocky - 7796 DAI - 0xC31637BDA32a0811E39456A59022D2C386cb2C85
      • Aligned Delegate MKR Compensation
        BLUE - 13.75 MKR - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        Cloaky - 29.25 MKR - 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
        JuliaChang - 28.75 MKR - 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
        Byteron - 9.68 MKR - 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
        vigilant - 2.43 MKR - 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
        Bonapublica - 2.06 MKR - 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
        Rocky - 1.17 MKR - 0xC31637BDA32a0811E39456A59022D2C386cb2C85
      • Spark Proxy Spell
        Execute Spark Proxy Spell at 0x8a3aaeAC45Cf3D76Cf82b0e4C63cCfa8c72BDCa7
  • Base checks
    • Current solc version 0.8.16
    • Office hours is true IF spell introduces a major change that can affect external parties (e.g.: keepers are affected in case of collateral offboarding) OTHERWISE explicitly set to false
    • Office hours value matches the Exec Sheet
    • 30 days spell expiry set in the constructor (block.timestamp + 30 days)
  • Spell description
    • Description follows the format TARGET_DATE MakerDAO Executive Spell | Hash: EXEC_DOC_HASH
    • TARGET_DATE in the description matches the target date
    • Accompanying comment above spell description follows the format // Hash: cast keccak -- "$(wget 'EXEC_DOC_URL' -q -O - 2>/dev/null)"
  • Comments inside the spell
    • Every Section text from the Exec Sheet is copied to the spell code as a comment surrounded by the set of dashes (E.g. // ----- Section text -----)
    • Every Instruction text from the Exec Sheet is copied to the spell code as // Instruction text
    • Every Instruction text have newline above it
    • IF an instruction can not be taken, it should have explanation under the instruction prefixed with // Note: (e.g.: // Note: Payments are skipped on goerli)
    • IF action in the spell doesn't have relevant instruction (e.g.: chainlog version bump), the necessity of it is explained in the comment above prefixed with // Note:
    • Every proof url from the Exec Sheet, such as Reasoning URL and Authority URL is present in the spell code under relevant section or instruction (depending on which row the url is present)
    • Every proof url from the Exec Sheet, such as Reasoning URL and Authority URL have prefix derived from the url itself
      • // Executive Vote: if URL starts with https://vote.makerdao.com/executive/
      • // Poll: if URL starts with https://vote.makerdao.com/polling/
      • // Forum: if URL starts with https://forum.makerdao.com/t/
      • // MIP: if URL starts with https://mips.makerdao.com/mips/details/
  • Dependency checks
    • Update Foundry by running foundryup
    • Reinstall libraries by running rm -rf ./lib && git submodule update --init --recursive
      Insert checked out submodule paths here
      Submodule path 'lib/dss-exec-lib': checked out '69b658f35d8618272cd139dfc18c5713caf6b96b'
      Submodule path 'lib/dss-exec-lib/lib/dss-interfaces': checked out '9bfd7afadd1f8c217ef05850b2555691786286cb'
      Submodule path 'lib/dss-exec-lib/lib/forge-std': checked out '0aa99eb8456693c015350c5e6c4f442ebe912f77'
      Submodule path 'lib/dss-exec-lib/lib/forge-std/lib/ds-test': checked out 'cd98eff28324bfac652e63a239a60632a761790b'
      Submodule path 'lib/dss-test': checked out 'a8a7b151c39282d4ddab8cb4ead2d80342df588f'
      Submodule path 'lib/dss-test/lib/dss-interfaces': checked out '9bfd7afadd1f8c217ef05850b2555691786286cb'
      Submodule path 'lib/dss-test/lib/forge-std': checked out '978ac6fadb62f5f0b723c996f64be52eddba6801'
    • IF submodule upgrades are present, make sure dss-exec-lib is synced as well
    • git submodule hash of dss-exec-lib (run git submodule status) matches the latest release version or newer
    • dss-interfaces library used inside lib/dss-exec-lib matches submodule used inside lib/dss-test
  • IF interfaces are present in the spell
    • Interfaces imported from dss-interfaces
      • No unused dss-interfaces
      • Only single import layout is used (e.g. import "dss-interfaces/dss/VatAbstract.sol";)
    • Static Interfaces
      • No unused static interfaces
      • Declared static interface not present in the dss-interfaces, OTHERWISE should be imported from there
      • Interface matches deployed contract using cast interface <contract_address> command
      • Interface naming style should match with Like suffix (e.g. VatLike)
      • Each static interface declare only functions actually used in the spell code
  • IF variable declarations are present in the spell
    • IF precision units are present
      • Precision units used in the spell match their defined values:
        • WAD = 10 ** 18
        • RAY = 10 ** 27
        • RAD = 10 ** 45
      • Precision units match with Numerical Ranges
      • Each variable visibility is declared as internal
      • Each variable state mutability is declared as constant
    • IF math units are present
      • Match their defined values:
        • HUNDRED = 10 ** 2
        • THOUSAND = 10 ** 3
        • MILLION = 10 ** 6
        • BILLION = 10 ** 9
      • Match with config
      • Each variable visibility is declared as internal
      • Each variable state mutability is declared as constant
    • IF rates are present
      • Rates match generated locally via make rates pct=<pct> (e.g. pct=0.75, for 0.75%)
      • Rates match IPFS document
      • Rate variable name conforms to X_PT_Y_Z_PCT_RATE (e.g. ZERO_PT_SEVEN_FIVE_PCT_RATE for 0.75%)
      • Rate variable visibility declared as internal
      • Rate variable state mutability declared as constant
    • IF timestamps are present
      • Comment above timestamp states full date including UTC timezone
      • Timestamp converts back to the correct date
      • Timestamp converts back to the UTC timezone
      • Variable naming matches MMM_DD_YYYY (e.g. JAN_01_2023 for 2023-01-01)
      • Time of day makes logical sense in the context of timestamp usage (i.e. 23:59:59 UTC for the final day of something, 00:00:00 UTC for the first day of something)
      • Each variable visibility is declared as internal
      • Each variable state mutability is declared as constant
  • IF new contract is present in the spell (not yet on chainlog or new to chainlog)
    • Source code is verified on etherscan
    • Compilation optimizations match deployment settings defined in the source code repo
    • GNU AGPLv3 license
    • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
    • IF new contract have concept of wards or access control
      • Ensure PAUSE_PROXY address was relied (wards(PAUSE_PROXY) is 1)
      • Ensure that contract deployer address was denied (wards(deployer) is 0)
      • Ensure that there are no other Rely events except for PAUSE_PROXY (using a block explorer like etherscan)
    • Source code matches corresponding github source code (e.g. diffcheck via vscode code --diff etherscan.sol github.sol)
    • Deployer address is included into addresses_deployers.sol
  • IF core system parameter changes are present in the instructions
  • IF debt ceiling changes are present in the instructions
  • 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
  • IF PSM migration, onboarding or offboarding is present:
  • IF D3M onboarding is present, insert and follow D3M Checklist
  • IF collateral offboarding is present in the spell
    • 1st stage collateral offboarding
      • Collateral type (ilk) is removed from AutoLine (MCD_IAM_AUTO_LINE) IF currently enabled
      • Collateral debt ceiling (vat.ilk.line) is set to 0
      • Global debt ceiling (vat.Line) decreased by the total amount of offboarded ilks
    • 2nd stage collateral offboarding
      • All actions from the 1st stage offboarding are previously taken (EITHER in the current or past spells – check the archive)
      • Collateral liquidation penalty (chop) is set to 0 IF requested by governance
      • Flat keeper incentive (tip) is set to 0 IF requested by governance
      • Relative keeper incentive (chip) is set to 0 IF requested by governance
      • Max liquidation amount (hole) is adjusted via DssExecLib.setIlkMaxLiquidationAmount(ilk, amount) IF requested by governance
      • Relevant clipper contract (MCD_CLIP_) is active (i.e. stopped is 0)
      • Liquidations are triggered via (depending on governance instruction):
        • EITHER liquidation ratio (spotter.ilk.mat) being set very high in the spell (using DssExecLib.setValue(DssExecLib.spotter(), ilk, "mat", ratio))
        • OR via enabling linear interpolation (DssExecLib.linearInterpolation(name, target, ilk, what, startTime, start, end, duration))
          • Ensure name format matches "XXX-X Offboarding"
          • Ensure target matches DssExecLib.spotter() address
          • Ensure ilk format matches collateral type (ilk) name ("XXX-X")
          • Ensure what matches string "mat"
          • Ensure startTime matches block.timestamp
          • Ensure start uses variable CURRENT_XXX_A_MAT
          • Ensure start matches current spotter.ilk.mat value
          • Ensure end uses variable TARGET_XXX_A_MAT
          • Ensure end value matches the instruction
          • Ensure end allows liquidation of all remaining vaults (end is bigger than collateral_type_collateralization_ratio * risk_multiplier_factor)
          • Ensure duration matches the instruction
      • Spotter price is updated via DssExecLib.updateCollateralPrice(ilk) IF collateral have no running oracle (i.e. relevant PIP_ contract have outdated zzz value)
      • Spotter price is updated after all other actions
      • Offboarding is tested at least via _checkIlkClipper helper
  • IF RWA updates are present
    • IF doc is updated
      • _updateDoc helper is copied one-to-one from the archive and defined above actions
      • _updateDoc(ilk, doc) is called in the spell
    • IF debt ceiling is updated
      • IF AutoLine update is requested by the Exec Sheet
      • IF regular debt ceiling (vat.ilk.line) update is requested by the Exec Sheet
      • Liquidation oracle price is bumped via RwaLiquidationOracleLike(MIP21_LIQUIDATION_ORACLE).bump(ilk, val) pattern
        • Comment above bump explains val computation via // Note: the formula is: "debt_ceiling * [ (1 + rwa_stability_fee ) ^ (minimum_deal_duration_in_years) ] * liquidation_ratio"
        • Comment above bump provides locally executable formula (e.g. // bc -l <<< 'scale=18; 50000000 * e(l(1.07) * (3342/365)) * 1.00' | cast --to-wei)
          • The formula matches the example provided above
          • debt_ceiling in the executable formula matches new debt ceiling set in the spell or the maximum possible debt ceiling in case of the enabled AutoLine
          • rwa_stability_fee in the executable formula matches stability fee of the specified RWA found on chain
          • minimum_deal_duration_in_years in the executable formula matches number found in the Exec Sheet of the spell containing relevant RWA onboarding
          • liquidation_ratio in the executable formula matches liquidation ratio of the specified RWA found on chain
          • Executing formula locally provides integer number that matches the val in the spell
        • val makes sense in context of the rate mechanism
      • IF multiple RWA ilks are being combined into one, val calculation is done once per ilk and added to make the total, with separate executable formulas provided in comments. The existing val value can be retrieved by calling read() on PIP_RWAXX and converting the result into decimal
      • Oracle price is updated via DssExecLib.updateCollateralPrice(ilk)
      • IF soft liquidation explicitly requested to be triggered (via .tell(ilk)) AND debt ceiling is 0 (OR is being set to 0 in the current spell)
        • RwaLiquidationOracle.tell(ilk) call is present
        • IF RWAXX_A_INPUT_CONDUIT is an instance of TinlakeMgr (it is a Centrifuge integration), additional TinlakeMgr.tell() call is present (in order to prevent further TIN redemptions in the Centrifuge pool)
  • IF payments are present in the spell
    • IF MKR transfers are present
      • Recipient address in the instruction is in the checksummed format
      • Recipient address matches Exec Sheet
      • Recipient address variable name matches one found in addresses_wallets.sol
      • Transfer amount matches Exec Sheet
      • Transfer amount is specified with (at least) 2 decimals using ether keyword
      • IF ether keyword is used, comment is present on the same line // Note: ether is a keyword helper, only MKR is transferred here
      • The transfers are tested via testMKRPayments test
      • Sum of all MKR transfers tested in testMKRPayments matches number in the Exec Sheet
    • IF DAI surplus buffer transfers are present
      • Recipient address in the instruction is in the checksummed format
      • Recipient address matches Exec Sheet
      • Recipient address variable name matches one found in addresses_wallets.sol
      • Transfer amount matches Exec Sheet
      • The transfers are tested via testDAIPayments test
      • Sum of all DAI transfers tested in testDAIPayments matches number in the Exec Sheet
    • IF MKR or DAI streams (DssVest) are created
      • VestAbstract interface is imported from dss-interfaces/dss/VestAbstract.sol
      • restrict is used for each stream, UNLESS otherwise explicitly stated in the Exec Sheet
      • usr (Vest recipient address) matches Exec Sheet
      • usr address in the instruction is in the checksummed format
      • usr address variable name match one found in addresses_wallets.sol
      • tot (Total stream amount) matches Exec Sheet
      • IF ether keyword is used, comment is present on the same line // Note: ether is a keyword helper, only MKR is transferred here
      • IF vest amount is expressed in 'per year' or similar in the Exec Sheet, account for leap days
      • bgn (Vest start timestamp) matches Exec Sheet
      • tau is expressed as bgn - fin (i.e. MONTH_DD_YYYY - MONTH_DD_YYYY)
      • fin (Vest end timestamp) matches Exec Sheet
      • eta (Vest cliff duration) matches the following logic
        • IF eta is explicitly specified in the Exec Sheet, then the values match
        • IF eta and clf (Cliff end timestamp) are not specified in the Exec Sheet, then eta is 0
        • IF clf is specified, but clf <= bgn, then eta is 0
        • IF clf is specified and clf > bgn, eta is expressed as clf - bgn (i.e. MONTH_DD_YYYY - MONTH_DD_YYYY)
      • IF mgr (Vest manager address) is specified in the Exec Sheet, matches the value, OTHERWISE matches address(0)
      • Ensure that max vesting rate (cap) is enough for the new streams
        • The maximum vesting rate (tot divided by tau) <= the maximum vest streaming rate (cap)
        • The maximum vesting rate (tot divided by tau) > the maximum vest streaming rate (cap)
        • Calculate new cap value equal to 10% greater than the new maximum vesting rate, then round new cap up with 2 significant figure precision (i.e. 2446 becomes 2500)
      • IF max vesting rate (cap) is changed in the spell
        • Governance facilitators were notified
        • Exec Sheet contain explicit instruction
        • Exec Sheet contain explicit instruction
      • IF MKR stream (DssVestTransferrable) is present
        • Vest contract's MKR allowance increased by the cumulative total (the sum of all tot values)
        • Ensure allowance increase follows archive patterns
      • Tested via testVestDAI or testVestMKR
    • IF MKR or DAI vest termination (Yank) is present
      • Yanked stream ID matches Exec Sheet
      • MCD_VEST_MKR_TREASURY chainlog address is used for MKR stream yank
      • MCD_VEST_DAI chainlog address is used for DAI stream yank
      • Tested via testYankDAI or testYankMKR
  • IF SubDAO-related content is present
    • IF SubDAO provides SubProxy spell address
      • SubDAO spell address matches Exec Sheet
      • Executed via ProxyLike(SUBDAO_PROXY).exec(SUBDAO_SPELL, abi.encodeWithSignature("execute()"));
      • Execution is NOT delegate call
      • IF SubDAO spell deployer is a smart contract (e.g. multisig or factory), ensure the deployer address is in addresses_deployers.sol as an entry
      • Ensure that SubDAO spell have enough gas and does not revert with "out of gas" error inside simulation. Note: low level call gas estimation is not done by our scripts
    • IF SubDAO provides instructions to be executed by the main spell (i.e. that will operate within Pause Proxy DelegateCall context)
      • No SubDAO contract being interacted with is authed on a core contract like vat, etc. (Check comprehensively where the risk is high)
      • SubDAO contract licensing and optimizations generally do not matter (except where they pose a security risk)
      • SubDAO contracts and all libraries / dependencies have verified source code (Blocking)
      • Upgradable SubDAO contracts
        • Upgradable contracts have the PAUSE_PROXY as their admin (i.e. the party that can upgrade)
        • Any upgradable SubDAO contracts with an admin that is not PAUSE_PROXY are not authed on any core contracts (Blocking)
      • All SubDAO content addresses (i.e. provided contract addresses or EOAs) present in the Maker Core spell are present in the Exec Sheet and are correct. SubDAO addresses being authed or given any permissions MUST be in the Exec Sheet. SubDAO addresses being called must be confirmed by the SubDAO spell team.
      • IF addresses not PR'ed in by the SubDAO team (use git blame for example), SubDAO content addresses all have inline comment for provenance or source being OKed by SubDAO
      • SubDAO actions match Exec Sheet (only where inline with main spell code) and do not affect core contracts
      • Core contract knock-on actions (such as offboarding or setting DC to 0) are present in the exec and match the code
      • External calls for SubDAO content are NOT delegate call
      • Code does not have untoward behavior within the scope of Maker Core Contracts (e.g. up to the SubDAO proxy)
  • IF external contracts calls are present (Not SubDAOs, e.g. Starknet)
    • Target Contract doesn't block spell execution
    • External call is NOT delegatecall
    • Target Contract doesn't have permissions on the Vat
    • Target Contract doesn't do anything untoward (e.g. interacting with unsafe contracts)
    • Contracts deployed via CREATE2 (e.g. if it looks like a vanity address) do not have selfdestruct in their code
    • MCD Pause Proxy doesn't give any approvals
    • All possible actions of the Target Contract are documented
    • Target contract is not upgradable
    • Target Contract is included in the ChainLog
    • Test Coverage is comprehensive
  • IF spell interacts with ChainLog
    • ChainLog version is incremented based on update type
      • Major -> New Vat (++.0.0)
      • 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 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)
    • Use the DssExecLib Core Address Helpers where possible (e.g. DssExecLib.vat())
    • Where addresses are fetched from the ChainLog, the variable name must match the value of the ChainLog key for that address (e.g. MCD_VAT rather than vat), except where the archive pattern differs from this pattern (e.g. MKR)

Pre-Deployment Stage

  • Wait till the Exec Doc is merged
  • Exec Doc checks
    • Exec Doc for the specified date is found in the makerdao/community GitHub repo
    • Exec Doc file name follows the format Executive vote - Month DD, YYYY.md
    • Extract permanent URL to the raw markdown file and paste it below
      Insert your Raw Exec Doc URL here
      https://raw.githubusercontent.com/makerdao/community/0a85403ea3fc07ade010d5b96668b2c340650801/governance/votes/Executive%20vote%20-%20November%2014%2C%202024.md
    • Ensure the URL uses commit hash that introduced last change to the Exec Doc, NOT merge commit
      • IF there is no local copy of makerdao/community GitHub repo), run:
        git clone https://github.com/makerdao/community
        
      • OTHERWISE, ensure it is pointing to the latest commit on master:
        git switch master && git pull origin master
        
      • Get the latest commit hash for the exec doc:
        git log --pretty=oneline -1 -- "<LOCAL_PATH_TO_EXEC_DOC>"
        
    • Using Exec Doc URL from the above and the TARGET_DATE, generate Exec Doc Hash via make exec-hash date=$TARGET_DATE $URL
      Insert your Exec Doc Hash here
      0x5ae05fabba4e9371876847dac746aa08b007867f50e5b53b34d1379e88daf94a
    • Using Exec Doc URL from the above, generate Exec Doc Hash via cast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
      Insert your Exec Doc Hash here
      0x5ae05fabba4e9371876847dac746aa08b007867f50e5b53b34d1379e88daf94a
    • Make sure that hash above doesn't match keccak hash of the empty string (0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470)
    • Using Exec Doc URL from the above, read spell instructions from the Exec Doc and list them below
      List all instructions announced in the Exec Doc

Proposal Details

Stability Fee Increases

If this executive proposal passes, then the following Stability Fee increases will take place:

  • Increase the ETH-A Stability Fee by 2 percentage point from 6.25% to 8.25%.
  • Increase the ETH-B Stability Fee by 2 percentage point from 6.75% to 8.75%.
  • Increase the ETH-C Stability Fee by 2 percentage point from 6.00% to 8.00%.
  • Increase the WSTETH-A Stability Fee by 2 percentage point from 7.25% to 9.25%.
  • Increase the WSTETH-B Stability Fee by 2 percentage point from 7.00% to 9.00%.
  • Increase the WBTC-A Stability Fee by 2 percentage point from 9.25% to 11.25%.
  • Increase the WBTC-B Stability Fee by 2 percentage point from 9.75% to 11.75%.
  • Increase the WBTC-C Stability Fee by 2 percentage point from 9.00% to 11.00%.

Savings Rate Increases

If this executive proposal passes, the then following savings rate increases will take place:

Due to how the SparkLend DAI Interest Rate Model (IRM) functions, this will also results in an approximately 2 percentage point increase in the SparkLend Effective DAI Borrow Rate.

Sky Ecosystem Liquidity Bootstrapping Funding

If this executive proposal passes, then 4 million USDS will be transferred to the Sky Ecosystem Liquidity Bootstrapping multisig at 0xD8507ef0A59f37d15B5D7b630FA6EEa40CE4AFdD.

To facilitate the transfer of USDS the following actions will occur:

  • Transfer 4 million DAI from the Surplus Buffer to the Pause Proxy.
  • Convert this DAI to USDS using the DAI_USDS converter.
  • Transfer the resulting 4 million USDS to the destination address.

Integration Boost Funding

If this executive proposal passes, then 3 million USDS will be transferred to the Sky Ecosystem Integration Boost multisig at 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7.

To facilitate the transfer of USDS the following actions will occur:

  • Transfer 3 million DAI from the Surplus Buffer to the Pause Proxy.
  • Convert this DAI to USDS using the DAI_USDS converter.
  • Transfer the resulting 3 million USDS to the destination address.

SparkLend Buffer Increase

If this executive proposal passes, then the DIRECT-SPARK-DAI (buffer) parameter on mainnet will be increased by 50 million DAI from 50 million DAI to 100 million DAI.

Gelato Keeper Treasury Address Update

If this executive proposal passes, then the Gelato Keeper Treasury address will be updated to 0x5041c60C75633F29DEb2AED79cB0A9ed79202415.

ConsolFreight (RWA-003) Debt Write-Off and Associated DAO Resolution Approval

If this executive proposal passes, then the following actions will take place.

Debt Write-off

If this executive proposal passes, the outstanding debt of the RWA-003 vault will be written off by calling cull() on the vault's oracle. Prior to this, drip() will be called on the Jug to ensure that all accrued interest is accounted for. This will reduce the Surplus Buffer to cover the outstanding debt of the vault.

Please review this forum post from Steakhouse for the particulars of the events leading to this action.

DAO Resolution Approval

If this executive proposal passes, the DAO Resolution with the IPFS hash QmX4DdVBiDBjLXYT4J4jC1XMdTn2Q7Ao8L66pKB8N3yETA will be approved.

This will authorize RWA Foundation to receive any recovered funds from ConsolFreight and to use them to fund operational expenses.

Facilitator Vesting Stream Creation

If this executive proposal passes, the following vesting streams will be created.

Note that DssVestSuckable for USDS and DSSVestTransferrable for SKY are not yet available. As a result, short streams for equivalent values of DAI and MKR are used. It is hoped that by the end of January, when these streams expire, it will be possible to switch the streams for these budgets to USDS and SKY, as detailed in The Atlas.

DAI Streams

Facilitator Address Amount (DAI) Start Date End Date
JanSky 0xf3F868534FAD48EF5a228Fe78669cf242745a755 168,000 2024-10-01 2025-01-31
Endgame Edge 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 168,000 2024-10-01 2025-01-31
Ecosystem 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 84,000 2024-12-01 2025-01-31

MKR Streams

Facilitator Address Amount (MKR) Start Date End Date
JanSky 0xf3F868534FAD48EF5a228Fe78669cf242745a755 72.00 2024-10-01 2025-01-31
Endgame Edge 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 72.00 2024-10-01 2025-01-31
Ecosystem 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 36.00 2024-12-01 2025-01-31

Aligned Delegate Compensation for September 2024

If this executive proposal passes, then a total of 308,548 DAI and 87.09 MKR will be distributed as Aligned Delegate compensation for September 2024, as detailed below.

Note that these payments mark the transition to a new payment system. They are still denominated in DAI and MKR, the stated currencies in The Atlas at the time these payments were earned. These payments will empty out the now defunct DAI and MKR buffers and future payments will be made in USDS, as stated in the updated Atlas.

DAI Payments

Delegate Amount (DAI) Address
JuliaChang 109,168 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
Cloaky 58,412 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
BLUE 54,167 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
Byteron 34,517 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
vigilant 16,155 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
Kohla (Cloaky) 10,000 0x73dFC091Ad77c03F2809204fCF03C0b9dccf8c7a
Ennoia (Cloaky) 10,000 0xA7364a1738D0bB7D1911318Ca3FB3779A8A58D7b
Bonapublica 8,333 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
Rocky 7,796 0xC31637BDA32a0811E39456A59022D2C386cb2C85

MKR Payments

Delegate Amount (MKR) Address
Cloaky 29.25 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
JuliaChang 28.75 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
BLUE 13.75 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
Byteron 9.68 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
vigilant 2.43 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
Bonapublica 2.06 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
Rocky 1.17 0xC31637BDA32a0811E39456A59022D2C386cb2C85

Spark Proxy Spell

If this executive proposal passes, then the Spark Proxy Spell prepared by Phoenix Labs and reviewed by Wintermute and Certora at 0x8a3aaeAC45Cf3D76Cf82b0e4C63cCfa8c72BDCa7 will be executed. The expected inclusions are:

  • Office hours value in the Exec Doc matches the spell
  • Sum of all payments in the Exec Doc matches the tests
  • Exec Doc URL in the spell comment matches your Raw Exec Doc URL above
  • Exec Doc URL in the spell comment refers to the https://github.com/makerdao/community repository
  • Every action present in the spell code is present in the Exec Doc
  • Every action in the Exec Doc is present in the spell code
  • IF new commits are present in the spell
    • Copy relevant checklist items from the above and redo them
    • Ensure newly added code is covered by tests
    • Check if chainlog needs to be updated
    • Copy over and redo "Tests" section from the above
  • Tests
    • Ensure that the DssExecLib.address file is not being modified by the spell PR
    • Check all CI tests are passing as at the latest commit
      Insert most recent commit hash where CI was passing
      10650cd
    • Ensure every test function is declared as public
      • IF the test needs to run, it MUST NOT have the skipped modifier; OTHERWISE, it MUST have the skipped modifier
    • Ensure each spell action has sufficient test coverage
      List actions for which coverage was checked here
      • Stability Fee Changes: testGeneral
      • Savings Rate Changes: testGeneral
      • Increase SparkLend D3M Buffer Parameter: testSparkLendD3MBuffer
      • Update Gelato Keeper Treasury Address: testGelatoKeeperTreasuryAddress
      • ConsolFreight Debt Write-Off and DAO Resolution: testConsoleFreightDebtWriteOff
      • Sky Ecosystem Liquidity Bootstrapping Funding: testPayments
      • Integration Boost Funding: testPayments
      • Set Facilitator DAI Payment Streams: testVestDAI
      • Set Facilitator MKR Payment Streams: testVestMKR
      • Aligned Delegate DAI Compensation: testPayments
      • Aligned Delegate MKR Compensation: testPayments
      • Spark Proxy Spell: testSparkSpellIsExecuted
    • Ensure that any other env variable does not affect execution of the tests (for example, by inspecting the output of printenv | grep "FOUNDRY_\|DAPP_")
    • Check all tests are passing locally using make test
      • Ensure every test listed in the coverage item above is present in the logs and with the [PASS] prefix.
_Insert your local test logs here_
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠒] Compiling...
No files changed, compilation skipped

Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 3752028)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 53.15s (48.98s CPU time)

Warning: the following cheatcode(s) are deprecated and will be removed in future versions:
  snapshot(): replaced by `snapshotState`
  revertTo(uint256): replaced by `revertToState`
Ran 42 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testAllocatorIntegration() (gas: 0)
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 3584859)
[PASS] testCastOnTime() (gas: 3580564)
[SKIP] testChainlogIntegrity() (gas: 0)
[PASS] testChainlogValues() (gas: 13321923)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testConsoleFreightDebtWriteOff() (gas: 3610019)
[PASS] testContractSize() (gas: 15810)
[PASS] testDaoResolutions() (gas: 16326)
[PASS] testDeployCost() (gas: 3893778)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGelatoKeeperTreasuryAddress() (gas: 3585060)
[PASS] testGeneral() (gas: 34921953)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 4605287)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458603)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 498744)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 5031808)
[PASS] testPayments() (gas: 3950263)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17618)
[PASS] testSparkLendD3MBuffer() (gas: 3588986)
[PASS] testSparkSpellIsExecuted() (gas: 3586523)
[PASS] testSplitter() (gas: 4246602)
[PASS] testSystemTokens() (gas: 4885318)
[PASS] testUseEta() (gas: 354786)
[PASS] testVestDAI() (gas: 3879214)
[PASS] testVestMKR() (gas: 3829486)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 22 passed; 0 failed; 20 skipped; finished in 353.18s (831.29s CPU time)

Ran 2 test suites in 353.87s (406.33s CPU time): 24 tests passed, 0 failed, 20 skipped (44 total tests)
  • IF all checks pass, make sure to include explicit "Good to deploy" comment

@SidestreamColdMelon
Copy link
Contributor

TLDR: good to deploy

Development Stage

  • Preparation
    • Exec Sheet for the specified date is found in the "Executive Vote Implementation Process" google sheet
      Insert URL to the specific sheet here
    • Using Exec Sheet URL from the above, read spell instructions from the Exec Sheet and list them below
      List all instructions announced in the Exec Sheet
      • Repeating Checklist Item
        • Office Hours On
        • Global Line Modifier No
        • Order of Operations Issues No
      • Checksums Amount (if none enter 0)
        • Total Amount of DAI Transfers 308548
        • Total Amount of MKR Transfers 87.09
        • Total USDS Transfers 7000000
      • Stability Fee Changes
        • Increase ETH-A Stability Fee by 2 percentage point from 6.25% to 8.25%
        • Increase ETH-B Stability Fee by 2 percentage point from 6.75% to 8.75%
        • Increase ETH-C Stability Fee by 2 percentage point from 6.00% to 8.00%
        • Increase WSTETH-A Stability Fee by 2 percentage point from 7.25% to 9.25%
        • Increase WSTETH-B Stability Fee by 2 percentage point from 7.00% to 9.00%
        • Increase WBTC-A Stability Fee by 2 percentage point from 9.25% to 11.25%
        • Increase WBTC-B Stability Fee by 2 percentage point from 9.75% to 11.75%
        • Increase WBTC-C Stability Fee by 2 percentage point from 9.00% to 11.00%
      • Savings Rate Changes
        • Increase DSR by 2 percentage point from 5.50% to 7.50%
        • Increase SSR by 2 percentage point from 6.50% to 8.50%
      • Increase SparkLend D3M Buffer Parameter
        • Increase the DIRECT-SPARK-DAI buffer parameter by 50 million DAI from 50 million DAI to 100 million DAI.
      • Update Gelato Keeper Treasury Address
        • Update DssExecLib.setContract: GELATO_PAYMENT_ADAPTER - "treasury" to 0x5041c60C75633F29DEb2AED79cB0A9ed79202415
      • ConsolFreight Debt Write-Off and DAO Resolution
        • Account for the accumulated stability fee by calling jug.drip("RWA003-A")
        • Write-off the debt of RWA003-A by calling rwaLiqOrcl.cull("RWA003-A", RWA003_A_URN)
        • Approve ConsolFreight Dao Resolution with IPFS hash QmX4DdVBiDBjLXYT4J4jC1XMdTn2Q7Ao8L66pKB8N3yETA
      • Sky Ecosystem Liquidity Bootstrapping Funding
        • Transfer 4,000,000 DAI to the Pause Proxy from the Surplus Buffer
        • Convert 4,000,000 DAI to USDS using DAI_USDS
        • Transfer 4,000,000 USDS from PauseProxy to 0xD8507ef0A59f37d15B5D7b630FA6EEa40CE4AFdD
      • Integration Boost Funding
        • Transfer 3,000,000 DAI to the Pause Proxy from the Surplus Buffer
        • Convert 3,000,000 DAI to USDS using DAI_USDS
        • Transfer 3,000,000 USDS from PauseProxy to 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7
      • Set Facilitator DAI Payment Streams
        • JanSky | 2024-10-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-10-01 00:00:00 | 168,000 DAI | 0xf3F868534FAD48EF5a228Fe78669cf242745a755 | Restricted: Yes
        • Endgame Edge | 2024-10-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-10-01 00:00:00 | 168,000 DAI | 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 | Restricted: Yes
        • Ecosystem | 2024-12-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-12-01 00:00:00 | 84,000 DAI | 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 | Restricted: Yes
      • Set Facilitator MKR Payment Streams
        • JanSky | 2024-10-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-10-01 00:00:00 | 72.00 MKR | 0xf3F868534FAD48EF5a228Fe78669cf242745a755 | Restricted: Yes
        • Endgame Edge | 2024-10-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-10-01 00:00:00 | 72.00 MKR | 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 | Restricted: Yes
        • Ecosystem | 2024-12-01 00:00:00 to 2025-01-31 23:59:59 | Cliff: 2024-12-01 00:00:00 | 36.00 MKR | 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 | Restricted: Yes
      • Aligned Delegate DAI Compensation
        • JuliaChang - 109168 DAI - 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
        • Cloaky - 58412 DAI - 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
        • BLUE - 54167 DAI - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Byteron - 34517 DAI - 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
        • vigilant - 16155 DAI - 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
        • Kohla (Cloaky) - 10000 DAI - 0x73dFC091Ad77c03F2809204fCF03C0b9dccf8c7a
        • Ennoia (Cloaky) - 10000 DAI - 0xA7364a1738D0bB7D1911318Ca3FB3779A8A58D7b
        • Bonapublica - 8333 DAI - 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
        • Rocky - 7796 DAI - 0xC31637BDA32a0811E39456A59022D2C386cb2C85
      • Aligned Delegate MKR Compensation
        • BLUE - 13.75 MKR - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Cloaky - 29.25 MKR - 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
        • JuliaChang - 28.75 MKR - 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
        • Byteron - 9.68 MKR - 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
        • vigilant - 2.43 MKR - 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
        • Bonapublica - 2.06 MKR - 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
        • Rocky - 1.17 MKR - 0xC31637BDA32a0811E39456A59022D2C386cb2C85
      • Spark Proxy Spell
        • Execute Spark Proxy Spell at 0x8a3aaeAC45Cf3D76Cf82b0e4C63cCfa8c72BDCa7
  • Base checks
    • Current solc version 0.8.16
    • Office hours is true IF spell introduces a major change that can affect external parties (e.g.: keepers are affected in case of collateral offboarding) OTHERWISE explicitly set to false
    • Office hours value matches the Exec Sheet
    • 30 days spell expiry set in the constructor (block.timestamp + 30 days)
  • Spell description
    • Description follows the format TARGET_DATE MakerDAO Executive Spell | Hash: EXEC_DOC_HASH
    • TARGET_DATE in the description matches the target date
    • Accompanying comment above spell description follows the format // Hash: cast keccak -- "$(wget 'EXEC_DOC_URL' -q -O - 2>/dev/null)"
  • Comments inside the spell
    • Every Section text from the Exec Sheet is copied to the spell code as a comment surrounded by the set of dashes (E.g. // ----- Section text -----)
    • Every Instruction text from the Exec Sheet is copied to the spell code as // Instruction text
    • Every Instruction text have newline above it
      ⚠️ Not always followed, but in those cases matches the archive. Not a blocker
    • IF an instruction can not be taken, it should have explanation under the instruction prefixed with // Note: (e.g.: // Note: Payments are skipped on goerli)
    • IF action in the spell doesn't have relevant instruction (e.g.: chainlog version bump), the necessity of it is explained in the comment above prefixed with // Note:
    • Every proof url from the Exec Sheet, such as Reasoning URL and Authority URL is present in the spell code under relevant section or instruction (depending on which row the url is present)
    • Every proof url from the Exec Sheet, such as Reasoning URL and Authority URL have prefix derived from the url itself
      • // Executive Vote: if URL starts with https://vote.makerdao.com/executive/
      • // Poll: if URL starts with https://vote.makerdao.com/polling/
      • // Forum: if URL starts with https://forum.makerdao.com/t/
      • // MIP: if URL starts with https://mips.makerdao.com/mips/details/
  • Dependency checks
    • Update Foundry by running foundryup
      foundryup: installed - forge 0.2.0 (4817280 2024-11-13T00:20:59.079036000Z)
      foundryup: installed - cast 0.2.0 (4817280 2024-11-13T00:20:59.133279000Z)
      foundryup: installed - anvil 0.2.0 (4817280 2024-11-13T00:20:59.147349000Z)
      foundryup: installed - chisel 0.2.0 (4817280 2024-11-13T00:20:59.119584000Z)
      
    • Reinstall libraries by running rm -rf ./lib && git submodule update --init --recursive
      Insert checked out submodule paths here
      Submodule path 'lib/dss-exec-lib': checked out '69b658f35d8618272cd139dfc18c5713caf6b96b'
      Submodule path 'lib/dss-test': checked out 'a8a7b151c39282d4ddab8cb4ead2d80342df588f'
    • IF submodule upgrades are present, make sure dss-exec-lib is synced as well
    • git submodule hash of dss-exec-lib (run git submodule status) matches the latest release version or newer
    • dss-interfaces library used inside lib/dss-exec-lib matches submodule used inside lib/dss-test
  • IF interfaces are present in the spell
    • Interfaces imported from dss-interfaces
      • No unused dss-interfaces
      • Only single import layout is used (e.g. import "dss-interfaces/dss/VatAbstract.sol";)
    • Static Interfaces
      • No unused static interfaces
      • Declared static interface not present in the dss-interfaces, OTHERWISE should be imported from there
      • Interface matches deployed contract using cast interface <contract_address> command
      • Interface naming style should match with Like suffix (e.g. VatLike)
      • Each static interface declare only functions actually used in the spell code
  • IF variable declarations are present in the spell
    • IF precision units are present
      • Precision units used in the spell match their defined values:
        • WAD = 10 ** 18
        • RAY = 10 ** 27
        • RAD = 10 ** 45
      • Precision units match with Numerical Ranges
      • Each variable visibility is declared as internal
      • Each variable state mutability is declared as constant
    • IF math units are present
      • Match their defined values:
        • HUNDRED = 10 ** 2
        • THOUSAND = 10 ** 3
        • MILLION = 10 ** 6
        • BILLION = 10 ** 9
      • Match with config
      • Each variable visibility is declared as internal
      • Each variable state mutability is declared as constant
    • IF rates are present
      • Rates match generated locally via make rates pct=<pct> (e.g. pct=0.75, for 0.75%)
      • Rates match IPFS document
      • Rate variable name conforms to X_PT_Y_Z_PCT_RATE (e.g. ZERO_PT_SEVEN_FIVE_PCT_RATE for 0.75%)
      • Rate variable visibility declared as internal
      • Rate variable state mutability declared as constant
    • IF timestamps are present
      • Comment above timestamp states full date including UTC timezone
      • Timestamp converts back to the correct date
      • Timestamp converts back to the UTC timezone
      • Variable naming matches MMM_DD_YYYY (e.g. JAN_01_2023 for 2023-01-01)
      • Time of day makes logical sense in the context of timestamp usage (i.e. 23:59:59 UTC for the final day of something, 00:00:00 UTC for the first day of something)
      • Each variable visibility is declared as internal
      • Each variable state mutability is declared as constant
  • IF new contract is present in the spell (not yet on chainlog or new to chainlog)
    • Source code is verified on etherscan
    • Compilation optimizations match deployment settings defined in the source code repo
    • GNU AGPLv3 license
    • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
    • IF new contract have concept of wards or access control
      • Ensure PAUSE_PROXY address was relied (wards(PAUSE_PROXY) is 1)
      • Ensure that contract deployer address was denied (wards(deployer) is 0)
      • Ensure that there are no other Rely events except for PAUSE_PROXY (using a block explorer like etherscan)
    • Source code matches corresponding github source code (e.g. diffcheck via vscode code --diff etherscan.sol github.sol)
    • Deployer address is included into addresses_deployers.sol
  • IF core system parameter changes are present in the instructions
    • ℹ️ ssr rate is manually updated via the code that matches the archive, as no specific helper exist yet in DssExecLib for the new tokens
  • IF debt ceiling changes are present in the instructions
  • 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
  • IF PSM migration, onboarding or offboarding is present:
  • IF D3M onboarding is present, insert and follow D3M Checklist
  • IF collateral offboarding is present in the spell
    • 1st stage collateral offboarding
      • Collateral type (ilk) is removed from AutoLine (MCD_IAM_AUTO_LINE) IF currently enabled
      • Collateral debt ceiling (vat.ilk.line) is set to 0
      • Global debt ceiling (vat.Line) decreased by the total amount of offboarded ilks
    • 2nd stage collateral offboarding
      • All actions from the 1st stage offboarding are previously taken (EITHER in the current or past spells – check the archive)
      • Collateral liquidation penalty (chop) is set to 0 IF requested by governance
      • Flat keeper incentive (tip) is set to 0 IF requested by governance
      • Relative keeper incentive (chip) is set to 0 IF requested by governance
      • Max liquidation amount (hole) is adjusted via DssExecLib.setIlkMaxLiquidationAmount(ilk, amount) IF requested by governance
      • Relevant clipper contract (MCD_CLIP_) is active (i.e. stopped is 0)
      • Liquidations are triggered via (depending on governance instruction):
        • EITHER liquidation ratio (spotter.ilk.mat) being set very high in the spell (using DssExecLib.setValue(DssExecLib.spotter(), ilk, "mat", ratio))
        • OR via enabling linear interpolation (DssExecLib.linearInterpolation(name, target, ilk, what, startTime, start, end, duration))
          • Ensure name format matches "XXX-X Offboarding"
          • Ensure target matches DssExecLib.spotter() address
          • Ensure ilk format matches collateral type (ilk) name ("XXX-X")
          • Ensure what matches string "mat"
          • Ensure startTime matches block.timestamp
          • Ensure start uses variable CURRENT_XXX_A_MAT
          • Ensure start matches current spotter.ilk.mat value
          • Ensure end uses variable TARGET_XXX_A_MAT
          • Ensure end value matches the instruction
          • Ensure end allows liquidation of all remaining vaults (end is bigger than collateral_type_collateralization_ratio * risk_multiplier_factor)
          • Ensure duration matches the instruction
      • Spotter price is updated via DssExecLib.updateCollateralPrice(ilk) IF collateral have no running oracle (i.e. relevant PIP_ contract have outdated zzz value)
      • Spotter price is updated after all other actions
      • Offboarding is tested at least via _checkIlkClipper helper
  • IF RWA updates are present
    • ℹ️ Write-Off istruction is present (done via drip and cull per exec sheet, and per new WIP checklist)
    • IF doc is updated
      • _updateDoc helper is copied one-to-one from the archive and defined above actions
      • _updateDoc(ilk, doc) is called in the spell
    • IF debt ceiling is updated
      • IF AutoLine update is requested by the Exec Sheet
      • IF regular debt ceiling (vat.ilk.line) update is requested by the Exec Sheet
      • Liquidation oracle price is bumped via RwaLiquidationOracleLike(MIP21_LIQUIDATION_ORACLE).bump(ilk, val) pattern
        • Comment above bump explains val computation via // Note: the formula is: "debt_ceiling * [ (1 + rwa_stability_fee ) ^ (minimum_deal_duration_in_years) ] * liquidation_ratio"
        • Comment above bump provides locally executable formula (e.g. // bc -l <<< 'scale=18; 50000000 * e(l(1.07) * (3342/365)) * 1.00' | cast --to-wei)
          • The formula matches the example provided above
          • debt_ceiling in the executable formula matches new debt ceiling set in the spell or the maximum possible debt ceiling in case of the enabled AutoLine
          • rwa_stability_fee in the executable formula matches stability fee of the specified RWA found on chain
          • minimum_deal_duration_in_years in the executable formula matches number found in the Exec Sheet of the spell containing relevant RWA onboarding
          • liquidation_ratio in the executable formula matches liquidation ratio of the specified RWA found on chain
          • Executing formula locally provides integer number that matches the val in the spell
        • val makes sense in context of the rate mechanism
      • IF multiple RWA ilks are being combined into one, val calculation is done once per ilk and added to make the total, with separate executable formulas provided in comments. The existing val value can be retrieved by calling read() on PIP_RWAXX and converting the result into decimal
      • Oracle price is updated via DssExecLib.updateCollateralPrice(ilk)
      • IF soft liquidation explicitly requested to be triggered (via .tell(ilk)) AND debt ceiling is 0 (OR is being set to 0 in the current spell)
        • RwaLiquidationOracle.tell(ilk) call is present
        • IF RWAXX_A_INPUT_CONDUIT is an instance of TinlakeMgr (it is a Centrifuge integration), additional TinlakeMgr.tell() call is present (in order to prevent further TIN redemptions in the Centrifuge pool)
  • IF payments are present in the spell
    • IF MKR transfers are present
      • Recipient address in the instruction is in the checksummed format
      • Recipient address matches Exec Sheet
      • Recipient address variable name matches one found in addresses_wallets.sol
      • Transfer amount matches Exec Sheet
      • Transfer amount is specified with (at least) 2 decimals using ether keyword
      • IF ether keyword is used, comment is present on the same line // Note: ether is a keyword helper, only MKR is transferred here
      • The transfers are tested via testMKRPayments test
        • ⚠️ Since 2024-09-27 the function was refactored into testPayments where MKR payments are tested among others
      • Sum of all MKR transfers tested in testMKRPayments matches number in the Exec Sheet
    • IF DAI surplus buffer transfers are present
      • Recipient address in the instruction is in the checksummed format
      • Recipient address matches Exec Sheet
      • Recipient address variable name matches one found in addresses_wallets.sol
      • Transfer amount matches Exec Sheet
      • The transfers are tested via testDAIPayments test
        • ⚠️ Since 2024-09-27 the function was refactored into testPayments where DAI payments are tested among others
      • Sum of all DAI transfers tested in testDAIPayments matches number in the Exec Sheet
    • IF MKR or DAI streams (DssVest) are created
      • VestAbstract interface is imported from dss-interfaces/dss/VestAbstract.sol
      • restrict is used for each stream, UNLESS otherwise explicitly stated in the Exec Sheet
      • usr (Vest recipient address) matches Exec Sheet
      • usr address in the instruction is in the checksummed format
      • usr address variable name match one found in addresses_wallets.sol
        • ⚠️ 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 address is called VOTEWIZARD in the file, but is called Endgame Edge in the instruction. Expected, since it's historically the same team. Nevertheless the receiver address match instruction
      • tot (Total stream amount) matches Exec Sheet
      • IF ether keyword is used, comment is present on the same line // Note: ether is a keyword helper, only MKR is transferred here
      • IF vest amount is expressed in 'per year' or similar in the Exec Sheet, account for leap days
      • bgn (Vest start timestamp) matches Exec Sheet
      • tau is expressed as bgn - fin (i.e. MONTH_DD_YYYY - MONTH_DD_YYYY)
        • ⚠️ This check is incorrectly formulated, as tau can't be negative number (it's unsigned uint256), it should be expressed as fin - bgn. Nevertheless, the code is correct
      • fin (Vest end timestamp) matches Exec Sheet
      • eta (Vest cliff duration) matches the following logic
        • IF eta is explicitly specified in the Exec Sheet, then the values match
        • IF eta and clf (Cliff end timestamp) are not specified in the Exec Sheet, then eta is 0
        • IF clf is specified, but clf <= bgn, then eta is 0
        • IF clf is specified and clf > bgn, eta is expressed as clf - bgn (i.e. MONTH_DD_YYYY - MONTH_DD_YYYY)
      • IF mgr (Vest manager address) is specified in the Exec Sheet, matches the value, OTHERWISE matches address(0)
      • Ensure that max vesting rate (cap) is enough for the new streams
        • The maximum vesting rate (tot divided by tau) <= the maximum vest streaming rate (cap)
        • The maximum vesting rate (tot divided by tau) > the maximum vest streaming rate (cap)
        • Calculate new cap value equal to 10% greater than the new maximum vesting rate, then round new cap up with 2 significant figure precision (i.e. 2446 becomes 2500)
      • IF max vesting rate (cap) is changed in the spell
        • Governance facilitators were notified
        • Exec Sheet contain explicit instruction
        • Exec Sheet contain explicit instruction
      • IF MKR stream (DssVestTransferrable) is present
        • Vest contract's MKR allowance increased by the cumulative total (the sum of all tot values)
        • Ensure allowance increase follows archive patterns
      • Tested via testVestDAI or testVestMKR
    • IF MKR or DAI vest termination (Yank) is present
      • Yanked stream ID matches Exec Sheet
      • MCD_VEST_MKR_TREASURY chainlog address is used for MKR stream yank
      • MCD_VEST_DAI chainlog address is used for DAI stream yank
      • Tested via testYankDAI or testYankMKR
  • IF SubDAO-related content is present
    • IF SubDAO provides SubProxy spell address
      • SubDAO spell address matches Exec Sheet
      • Executed via ProxyLike(SUBDAO_PROXY).exec(SUBDAO_SPELL, abi.encodeWithSignature("execute()"));
      • Execution is NOT delegate call
      • IF SubDAO spell deployer is a smart contract (e.g. multisig or factory), ensure the deployer address is in addresses_deployers.sol as an entry
      • Ensure that SubDAO spell have enough gas and does not revert with "out of gas" error inside simulation. Note: low level call gas estimation is not done by our scripts
        ℹ️ This will be properly checked during casting on tenderly, but local trace doesn't show any reverts
    • IF SubDAO provides instructions to be executed by the main spell (i.e. that will operate within Pause Proxy DelegateCall context)
      • No SubDAO contract being interacted with is authed on a core contract like vat, etc. (Check comprehensively where the risk is high)
      • SubDAO contract licensing and optimizations generally do not matter (except where they pose a security risk)
      • SubDAO contracts and all libraries / dependencies have verified source code (Blocking)
      • Upgradable SubDAO contracts
        • Upgradable contracts have the PAUSE_PROXY as their admin (i.e. the party that can upgrade)
        • Any upgradable SubDAO contracts with an admin that is not PAUSE_PROXY are not authed on any core contracts (Blocking)
      • All SubDAO content addresses (i.e. provided contract addresses or EOAs) present in the Maker Core spell are present in the Exec Sheet and are correct. SubDAO addresses being authed or given any permissions MUST be in the Exec Sheet. SubDAO addresses being called must be confirmed by the SubDAO spell team.
      • IF addresses not PR'ed in by the SubDAO team (use git blame for example), SubDAO content addresses all have inline comment for provenance or source being OKed by SubDAO
      • SubDAO actions match Exec Sheet (only where inline with main spell code) and do not affect core contracts
      • Core contract knock-on actions (such as offboarding or setting DC to 0) are present in the exec and match the code
      • External calls for SubDAO content are NOT delegate call
      • Code does not have untoward behavior within the scope of Maker Core Contracts (e.g. up to the SubDAO proxy)
  • IF external contracts calls are present (Not SubDAOs, e.g. Starknet)
    • ℹ️ In the spell we're calling GELATO_PAYMENT_ADAPTER.file to update treasury address. But as GELATO_PAYMENT_ADAPTER is a NetworkPaymentAdapter contract developed and deployed by MakerDAO it is not considered external. The underlying file function doesn't do any calls to the new treasury contract. New treasury contract 0x5041c60C75633F29DEb2AED79cB0A9ed79202415 interface matches expected INetworkTreasury interface
    • Target Contract doesn't block spell execution
    • External call is NOT delegatecall
    • Target Contract doesn't have permissions on the Vat
    • Target Contract doesn't do anything untoward (e.g. interacting with unsafe contracts)
    • Contracts deployed via CREATE2 (e.g. if it looks like a vanity address) do not have selfdestruct in their code
    • MCD Pause Proxy doesn't give any approvals
    • All possible actions of the Target Contract are documented
    • Target contract is not upgradable
    • Target Contract is included in the ChainLog
    • Test Coverage is comprehensive
  • IF spell interacts with ChainLog
    • ChainLog version is incremented based on update type
      • Major -> New Vat (++.0.0)
      • 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 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)
    • Use the DssExecLib Core Address Helpers where possible (e.g. DssExecLib.vat())
    • Where addresses are fetched from the ChainLog, the variable name must match the value of the ChainLog key for that address (e.g. MCD_VAT rather than vat), except where the archive pattern differs from this pattern (e.g. MKR)
  • Tests
    • Ensure that the DssExecLib.address file is not being modified by the spell PR
    • Check all CI tests are passing as at the latest commit
      Insert most recent commit hash where CI was passing
      7b2e5df
    • Ensure every test function is declared as public
      • IF the test needs to run, it MUST NOT have the skipped modifier; OTHERWISE, it MUST have the skipped modifier
    • Ensure each spell action has sufficient test coverage
      List actions for which coverage was checked here
      • Stability Fee Changes
        • Tested via testGeneral
      • Savings Rate Changes
        • Tested via testGeneral
      • Increase SparkLend D3M Buffer Parameter
        • Tested via testSparkLendD3MBuffer
      • Update Gelato Keeper Treasury Address
        • Tested via testGelatoKeeperTreasuryAddress
      • ConsolFreight Debt Write-Off and DAO Resolution
        • Tested via testConsoleFreightDebtWriteOff and testDaoResolutions
      • Sky Ecosystem Liquidity Bootstrapping Funding
        • Tested via testPayments
      • Integration Boost Funding
        • Tested via testPayments
      • Set Facilitator DAI Payment Streams
        • Tested via testVestDAI
      • Set Facilitator MKR Payment Streams
        • Tested via testVestMKR
      • Aligned Delegate DAI Compensation
        • Tested via testPayments
      • Aligned Delegate MKR Compensation
        • Tested via testPayments
      • Spark Proxy Spell
        • Tested via testSparkSpellIsExecuted
    • Ensure that any other env variable does not affect execution of the tests (for example, by inspecting the output of printenv | grep "FOUNDRY_\|DAPP_")
    • Check all tests are passing locally using make test
      • Ensure every test listed in the coverage item above is present in the logs and with the [PASS] prefix.
_Insert your local test logs here_
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠊] Compiling...
No files changed, compilation skipped

Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 3673228)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 19.03s (17.49s CPU time)

Warning: the following cheatcode(s) are deprecated and will be removed in future versions:
  revertTo(uint256): replaced by `revertToState`
  snapshot(): replaced by `snapshotState`
Ran 42 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testAllocatorIntegration() (gas: 0)
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 3506059)
[PASS] testCastOnTime() (gas: 3501764)
[SKIP] testChainlogIntegrity() (gas: 0)
[PASS] testChainlogValues() (gas: 13243123)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testConsoleFreightDebtWriteOff() (gas: 3531219)
[PASS] testContractSize() (gas: 15810)
[PASS] testDaoResolutions() (gas: 16326)
[PASS] testDeployCost() (gas: 3893778)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGelatoKeeperTreasuryAddress() (gas: 3517944)
[PASS] testGeneral() (gas: 34843153)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 4563835)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458603)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 498150)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 4968768)
[PASS] testPayments() (gas: 3871463)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17618)
[PASS] testSparkLendD3MBuffer() (gas: 3510186)
[PASS] testSparkSpellIsExecuted() (gas: 3507723)
[PASS] testSplitter() (gas: 4167802)
[PASS] testSystemTokens() (gas: 4822278)
[PASS] testUseEta() (gas: 354786)
[PASS] testVestDAI() (gas: 3816174)
[PASS] testVestMKR() (gas: 3750686)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 22 passed; 0 failed; 20 skipped; finished in 115.42s (279.44s CPU time)

Ran 2 test suites in 115.84s (134.45s CPU time): 24 tests passed, 0 failed, 20 skipped (44 total tests)

Pre-Deployment Stage

  • Wait till the Exec Doc is merged
  • Exec Doc checks
    • Exec Doc for the specified date is found in the makerdao/community GitHub repo
    • Exec Doc file name follows the format Executive vote - Month DD, YYYY.md
    • Extract permanent URL to the raw markdown file and paste it below
      Insert your Raw Exec Doc URL here
      https://raw.githubusercontent.com/makerdao/community/aa58678ff632f8e25047a345709cd3c9f1819e4f/governance/votes/Executive%20vote%20-%20November%2014%2C%202024.md
    • Ensure the URL uses commit hash that introduced last change to the Exec Doc, NOT merge commit
      • IF there is no local copy of makerdao/community GitHub repo), run:
        git clone https://github.com/makerdao/community
        
      • OTHERWISE, ensure it is pointing to the latest commit on master:
        git switch master && git pull origin master
        
      • Get the latest commit hash for the exec doc:
        git log --pretty=oneline -1 -- "<LOCAL_PATH_TO_EXEC_DOC>"
        
    • Using Exec Doc URL from the above and the TARGET_DATE, generate Exec Doc Hash via make exec-hash date=$TARGET_DATE $URL
      Insert your Exec Doc Hash here
      0xbe93b128518195d2240db74a5a56bf32b10dfaf81cddc790be66b4509c94ed95
    • Using Exec Doc URL from the above, generate Exec Doc Hash via cast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
      Insert your Exec Doc Hash here
      0xbe93b128518195d2240db74a5a56bf32b10dfaf81cddc790be66b4509c94ed95
    • Make sure that hash above doesn't match keccak hash of the empty string (0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470)
    • Using Exec Doc URL from the above, read spell instructions from the Exec Doc and list them below
      List all instructions announced in the Exec Doc
      • General info
        • total of 308,548 DAI and 87.09 MKR will be distributed as Aligned Delegate compensation for September 2024, as detailed below.
        • This executive proposal includes an office-hours modifier that means that it can only be executed between 14:00 and 21:00 UTC, Monday - Friday.
      • Stability Fee Increases
        • Increase the ETH-A Stability Fee by 2 percentage point from 6.25% to 8.25%.
        • Increase the ETH-B Stability Fee by 2 percentage point from 6.75% to 8.75%.
        • Increase the ETH-C Stability Fee by 2 percentage point from 6.00% to 8.00%.
        • Increase the WSTETH-A Stability Fee by 2 percentage point from 7.25% to 9.25%.
        • Increase the WSTETH-B Stability Fee by 2 percentage point from 7.00% to 9.00%.
        • Increase the WBTC-A Stability Fee by 2 percentage point from 9.25% to 11.25%.
        • Increase the WBTC-B Stability Fee by 2 percentage point from 9.75% to 11.75%.
        • Increase the WBTC-C Stability Fee by 2 percentage point from 9.00% to 11.00%.
      • Savings Rate Increases
        • Increase the Dai Savings Rate (DSR) by 2 percentage point from 5.50% to 7.50%.
        • Increase the Sky Savings Rate (SSR) by 2 percentage point from 6.50% to 8.50%.
      • Sky Ecosystem Liquidity Bootstrapping Funding
        • 4 million USDS will be transferred to the Sky Ecosystem Liquidity Bootstrapping multisig at 0xD8507ef0A59f37d15B5D7b630FA6EEa40CE4AFdD.
      • Integration Boost Funding
        • 3 million USDS will be transferred to the Sky Ecosystem Integration Boost multisig at 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7.
      • SparkLend Buffer Increase
        • DIRECT-SPARK-DAI (buffer) parameter on mainnet will be increased by 50 million DAI from 50 million DAI to 100 million DAI.
      • Gelato Keeper Treasury Address Update
        • Gelato Keeper Treasury address will be updated to 0x5041c60C75633F29DEb2AED79cB0A9ed79202415.
      • ConsolFreight (RWA-003) Debt Write-Off and Associated DAO Resolution Approval
        • debt of the RWA-003 vault will be written off by calling cull() on the vault's oracle
        • Prior to this, drip() will be called on the Jug to ensure that all accrued interest is accounted for
        • DAO Resolution with the IPFS hash QmX4DdVBiDBjLXYT4J4jC1XMdTn2Q7Ao8L66pKB8N3yETA will be approved.
      • Facilitator Vesting Stream Creation
        • DAI Streams
          • Facilitator Address Amount (DAI) Start Date End Date
          • JanSky 0xf3F868534FAD48EF5a228Fe78669cf242745a755 168,000 2024-10-01 2025-01-31
          • Endgame Edge 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 168,000 2024-10-01 2025-01-31
          • Ecosystem 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 84,000 2024-12-01 2025-01-31
        • MKR Streams
          • Facilitator Address Amount (MKR) Start Date End Date
          • JanSky 0xf3F868534FAD48EF5a228Fe78669cf242745a755 72.00 2024-10-01 2025-01-31
          • Endgame Edge 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 72.00 2024-10-01 2025-01-31
          • Ecosystem 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 36.00 2024-12-01 2025-01-31
      • Aligned Delegate Compensation for September 2024
        • DAI Payments
          • Delegate Amount (DAI) Address
          • JuliaChang 109,168 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
          • Cloaky 58,412 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
          • BLUE 54,167 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
          • Byteron 34,517 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
          • vigilant 16,155 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
          • Kohla (Cloaky) 10,000 0x73dFC091Ad77c03F2809204fCF03C0b9dccf8c7a
          • Ennoia (Cloaky) 10,000 0xA7364a1738D0bB7D1911318Ca3FB3779A8A58D7b
          • Bonapublica 8,333 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
          • Rocky 7,796 0xC31637BDA32a0811E39456A59022D2C386cb2C85
        • MKR Payments
          • Delegate Amount (MKR) Address
          • Cloaky 29.25 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
          • JuliaChang 28.75 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
          • BLUE 13.75 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
          • Byteron 9.68 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
          • vigilant 2.43 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
          • Bonapublica 2.06 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
          • Rocky 1.17 0xC31637BDA32a0811E39456A59022D2C386cb2C85
      • Spark Proxy Spell
        • Spark Proxy Spell prepared by Phoenix Labs and reviewed by Wonderland and Certora at 0x8a3aaeAC45Cf3D76Cf82b0e4C63cCfa8c72BDCa7 will be executed
    • Office hours value in the Exec Doc matches the spell
    • Sum of all payments in the Exec Doc matches the tests
    • Exec Doc URL in the spell comment matches your Raw Exec Doc URL above
    • Exec Doc URL in the spell comment refers to the https://github.com/makerdao/community repository
    • Every action present in the spell code is present in the Exec Doc
    • Every action in the Exec Doc is present in the spell code
  • IF new commits are present in the spell
    • Copy relevant checklist items from the above and redo them
    • Ensure newly added code is covered by tests
    • Check if chainlog needs to be updated
    • Copy over and redo "Tests" section from the above
  • IF all checks pass, make sure to include explicit "Good to deploy" comment

@oddaf
Copy link
Member

oddaf commented Nov 13, 2024

TLDR: Good to deploy

Pre-Deployment Stage

  • Wait till the Exec Doc is merged
  • Exec Doc checks
    • Exec Doc for the specified date is found in the makerdao/community GitHub repo
    • Exec Doc file name follows the format Executive vote - Month DD, YYYY.md
    • Extract permanent URL to the raw markdown file and paste it below
      Insert your Raw Exec Doc URL here
      https://raw.githubusercontent.com/makerdao/community/aa58678ff632f8e25047a345709cd3c9f1819e4f/governance/votes/Executive%20vote%20-%20November%2014%2C%202024.md
    • Ensure the URL uses commit hash that introduced last change to the Exec Doc, NOT merge commit
      • IF there is no local copy of makerdao/community GitHub repo), run:
        git clone https://github.com/makerdao/community
        
      • OTHERWISE, ensure it is pointing to the latest commit on master:
        git switch master && git pull origin master
        
      • Get the latest commit hash for the exec doc:
        git log --pretty=oneline -1 -- "<LOCAL_PATH_TO_EXEC_DOC>"
        
    • Using Exec Doc URL from the above and the TARGET_DATE, generate Exec Doc Hash via make exec-hash date=$TARGET_DATE $URL
      Insert your Exec Doc Hash here
      0xbe93b128518195d2240db74a5a56bf32b10dfaf81cddc790be66b4509c94ed95
    • Using Exec Doc URL from the above, generate Exec Doc Hash via cast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
      Insert your Exec Doc Hash here
      0xbe93b128518195d2240db74a5a56bf32b10dfaf81cddc790be66b4509c94ed95
    • Make sure that hash above doesn't match keccak hash of the empty string (0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470)
    • Using Exec Doc URL from the above, read spell instructions from the Exec Doc and list them below
      List all instructions announced in the Exec Doc

Proposal Details

Stability Fee Increases

If this executive proposal passes, then the following Stability Fee increases will take place:

  • Increase the ETH-A Stability Fee by 2 percentage point from 6.25% to 8.25%.
  • Increase the ETH-B Stability Fee by 2 percentage point from 6.75% to 8.75%.
  • Increase the ETH-C Stability Fee by 2 percentage point from 6.00% to 8.00%.
  • Increase the WSTETH-A Stability Fee by 2 percentage point from 7.25% to 9.25%.
  • Increase the WSTETH-B Stability Fee by 2 percentage point from 7.00% to 9.00%.
  • Increase the WBTC-A Stability Fee by 2 percentage point from 9.25% to 11.25%.
  • Increase the WBTC-B Stability Fee by 2 percentage point from 9.75% to 11.75%.
  • Increase the WBTC-C Stability Fee by 2 percentage point from 9.00% to 11.00%.

Savings Rate Increases

If this executive proposal passes, the then following savings rate increases will take place:

Due to how the SparkLend DAI Interest Rate Model (IRM) functions, this will also results in an approximately 2 percentage point increase in the SparkLend Effective DAI Borrow Rate.

Sky Ecosystem Liquidity Bootstrapping Funding

If this executive proposal passes, then 4 million USDS will be transferred to the Sky Ecosystem Liquidity Bootstrapping multisig at 0xD8507ef0A59f37d15B5D7b630FA6EEa40CE4AFdD.

To facilitate the transfer of USDS the following actions will occur:

  • Transfer 4 million DAI from the Surplus Buffer to the Pause Proxy.
  • Convert this DAI to USDS using the DAI_USDS converter.
  • Transfer the resulting 4 million USDS to the destination address.

Integration Boost Funding

If this executive proposal passes, then 3 million USDS will be transferred to the Sky Ecosystem Integration Boost multisig at 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7.

To facilitate the transfer of USDS the following actions will occur:

  • Transfer 3 million DAI from the Surplus Buffer to the Pause Proxy.
  • Convert this DAI to USDS using the DAI_USDS converter.
  • Transfer the resulting 3 million USDS to the destination address.

SparkLend Buffer Increase

If this executive proposal passes, then the DIRECT-SPARK-DAI (buffer) parameter on mainnet will be increased by 50 million DAI from 50 million DAI to 100 million DAI.

Gelato Keeper Treasury Address Update

If this executive proposal passes, then the Gelato Keeper Treasury address will be updated to 0x5041c60C75633F29DEb2AED79cB0A9ed79202415.

ConsolFreight (RWA-003) Debt Write-Off and Associated DAO Resolution Approval

If this executive proposal passes, then the following actions will take place.

Debt Write-off

If this executive proposal passes, the outstanding debt of the RWA-003 vault will be written off by calling cull() on the vault's oracle. Prior to this, drip() will be called on the Jug to ensure that all accrued interest is accounted for. This will reduce the Surplus Buffer to cover the outstanding debt of the vault.

Please review this forum post from Steakhouse for the particulars of the events leading to this action.

DAO Resolution Approval

If this executive proposal passes, the DAO Resolution with the IPFS hash QmX4DdVBiDBjLXYT4J4jC1XMdTn2Q7Ao8L66pKB8N3yETA will be approved.

This will authorize RWA Foundation to receive any recovered funds from ConsolFreight and to use them to fund operational expenses.

Facilitator Vesting Stream Creation

If this executive proposal passes, the following vesting streams will be created.

Note that DssVestSuckable for USDS and DSSVestTransferrable for SKY are not yet available. As a result, short streams for equivalent values of DAI and MKR are used. It is hoped that by the end of January, when these streams expire, it will be possible to switch the streams for these budgets to USDS and SKY, as detailed in The Atlas.

DAI Streams

Facilitator Address Amount (DAI) Start Date End Date
JanSky 0xf3F868534FAD48EF5a228Fe78669cf242745a755 168,000 2024-10-01 2025-01-31
Endgame Edge 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 168,000 2024-10-01 2025-01-31
Ecosystem 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 84,000 2024-12-01 2025-01-31

MKR Streams

Facilitator Address Amount (MKR) Start Date End Date
JanSky 0xf3F868534FAD48EF5a228Fe78669cf242745a755 72.00 2024-10-01 2025-01-31
Endgame Edge 0x9E72629dF4fcaA2c2F5813FbbDc55064345431b1 72.00 2024-10-01 2025-01-31
Ecosystem 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75 36.00 2024-12-01 2025-01-31

Aligned Delegate Compensation for September 2024

If this executive proposal passes, then a total of 308,548 DAI and 87.09 MKR will be distributed as Aligned Delegate compensation for September 2024, as detailed below.

Note that these payments mark the transition to a new payment system. They are still denominated in DAI and MKR, the stated currencies in The Atlas at the time these payments were earned. These payments will empty out the now defunct DAI and MKR buffers and future payments will be made in USDS, as stated in the updated Atlas.

DAI Payments

Delegate Amount (DAI) Address
JuliaChang 109,168 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
Cloaky 58,412 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
BLUE 54,167 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
Byteron 34,517 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
vigilant 16,155 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
Kohla (Cloaky) 10,000 0x73dFC091Ad77c03F2809204fCF03C0b9dccf8c7a
Ennoia (Cloaky) 10,000 0xA7364a1738D0bB7D1911318Ca3FB3779A8A58D7b
Bonapublica 8,333 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
Rocky 7,796 0xC31637BDA32a0811E39456A59022D2C386cb2C85

MKR Payments

Delegate Amount (MKR) Address
Cloaky 29.25 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818
JuliaChang 28.75 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
BLUE 13.75 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
Byteron 9.68 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
vigilant 2.43 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61
Bonapublica 2.06 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
Rocky 1.17 0xC31637BDA32a0811E39456A59022D2C386cb2C85

Spark Proxy Spell

If this executive proposal passes, then the Spark Proxy Spell prepared by Phoenix Labs and reviewed by Wonderland and Certora at 0x8a3aaeAC45Cf3D76Cf82b0e4C63cCfa8c72BDCa7 will be executed.

  • Office hours value in the Exec Doc matches the spell
  • Sum of all payments in the Exec Doc matches the tests
  • Exec Doc URL in the spell comment matches your Raw Exec Doc URL above
  • Exec Doc URL in the spell comment refers to the https://github.com/makerdao/community repository
  • Every action present in the spell code is present in the Exec Doc
  • Every action in the Exec Doc is present in the spell code
  • IF new commits are present in the spell
    • Copy relevant checklist items from the above and redo them
    • Ensure newly added code is covered by tests
    • Check if chainlog needs to be updated
    • Copy over and redo "Tests" section from the above
  • Tests
    • Ensure that the DssExecLib.address file is not being modified by the spell PR
    • Check all CI tests are passing as at the latest commit
      Insert most recent commit hash where CI was passing
      7b2e5df
    • Ensure every test function is declared as public
      • IF the test needs to run, it MUST NOT have the skipped modifier; OTHERWISE, it MUST have the skipped modifier
    • Ensure each spell action has sufficient test coverage
      List actions for which coverage was checked here
      • Stability Fee Changes: testGeneral
      • Savings Rate Changes: testGeneral
      • Increase SparkLend D3M Buffer Parameter: testSparkLendD3MBuffer
      • Update Gelato Keeper Treasury Address: testGelatoKeeperTreasuryAddress
      • ConsolFreight Debt Write-Off and DAO Resolution: testConsoleFreightDebtWriteOff
      • Sky Ecosystem Liquidity Bootstrapping Funding: testPayments
      • Integration Boost Funding: testPayments
      • Set Facilitator DAI Payment Streams: testVestDAI
      • Set Facilitator MKR Payment Streams: testVestMKR
      • Aligned Delegate DAI Compensation: testPayments
      • Aligned Delegate MKR Compensation: testPayments
      • Spark Proxy Spell: testSparkSpellIsExecuted
    • Ensure that any other env variable does not affect execution of the tests (for example, by inspecting the output of printenv | grep "FOUNDRY_\|DAPP_")
    • Check all tests are passing locally using make test
      • Ensure every test listed in the coverage item above is present in the logs and with the [PASS] prefix.
_Insert your local test logs here_
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠒] Compiling...
No files changed, compilation skipped

Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 3672487)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 95.07s (90.83s CPU time)

Warning: the following cheatcode(s) are deprecated and will be removed in future versions:
  revertTo(uint256): replaced by `revertToState`
  snapshot(): replaced by `snapshotState`
Ran 42 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testAllocatorIntegration() (gas: 0)
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 3505318)
[PASS] testCastOnTime() (gas: 3501023)
[SKIP] testChainlogIntegrity() (gas: 0)
[PASS] testChainlogValues() (gas: 13242382)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testConsoleFreightDebtWriteOff() (gas: 3530478)
[PASS] testContractSize() (gas: 15810)
[PASS] testDaoResolutions() (gas: 16326)
[PASS] testDeployCost() (gas: 3893778)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGelatoKeeperTreasuryAddress() (gas: 3517203)
[PASS] testGeneral() (gas: 34842412)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 4563094)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458603)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 498150)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 4968175)
[PASS] testPayments() (gas: 3870722)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17618)
[PASS] testSparkLendD3MBuffer() (gas: 3509445)
[PASS] testSparkSpellIsExecuted() (gas: 3506982)
[PASS] testSplitter() (gas: 4167061)
[PASS] testSystemTokens() (gas: 4821685)
[PASS] testUseEta() (gas: 354786)
[PASS] testVestDAI() (gas: 3815581)
[PASS] testVestMKR() (gas: 3749945)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 22 passed; 0 failed; 20 skipped; finished in 458.21s (1194.36s CPU time)

Ran 2 test suites in 458.90s (553.29s CPU time): 24 tests passed, 0 failed, 20 skipped (44 total tests)
  • IF all checks pass, make sure to include explicit "Good to deploy" comment

@SidestreamIcedMango
Copy link
Contributor Author

@oddaf
Copy link
Member

oddaf commented Nov 14, 2024

TLDR: Good to handover

Deployed Stage

  • Source code settings
    • Deployed spell is verified on etherscan
    • Optimization enabled: false UNLESS the contract size is too big AND all mitigation strategies (i.e.: removing revert strings) have failed
    • Default evmVersion
    • GNU AGPLv3 license
  • Source code validity
    • Deployed spell code matches source on github. (can be checked via make diff-deployed-spell or manually)
      • ⚠️ Script fails to run (flattening returns some differences in dss-exec-lib, an interface was used on verification instead of the actual implementation in the script flattening: https://www.diffchecker.com/9k8RYaGH/), but manual inspection matches, as well as the deployed bytecode.
    • No new changes are made after previously given "good to deploy"
  • Deployed spell Etherscan checks
    • Automated checks via make check-deployed-spell
      • Verified
      • Valid license
      • Version matches
      • Optimizations are disabled
      • dss-exec-lib library address used (under 'Libraries Used') matches the hardcoded local DssExecLib.address file
      • deployed_spell_created matches deployment timestamp
      • deployed_spell_block matches deployment block number
    • Manual checks
      • Ensure make deploy-info tx=<tx> matches config
        • deployed_spell_created timestamp
        • deployed_spell_block block number
      • Check again that the PR did not modify the DssExecLib.address file (e.g. look under the 'Files Changed' PR tab, etc.)
      • Ensure Etherscan Libraries Used matches DssExecLib Latest Release
      • (For your tests to be accurate) git submodule hash matches dss-exec-lib latest release's tag commit and inspect diffs if doesn't match to ensure expected behaviour (Currently Non-Critical pending the next DssExecLib release, double check that the ExecLib used by the contract matches the latest release)
  • Tenderly Testnet checks
    • A testnet with the name matching spell description is found at maker dashboard
    • The testnet name is unique (previous testnets does not have the same name)
    • Cast transaction is set to the correct "receiver" (matches deployed spell address)
    • All actions are executed in the transaction trace
    • No reverts are present that block execution
    • No out-of-gas errors are present
  • Archive checks
    • make diff-archive-spell for current date or make diff-archive-spell date="YYYY-MM-DD"
    • Ensure date corresponds to target Exec Doc date
  • Tests
    • Ensure that the DssExecLib.address file is not being modified by the spell PR
    • Check all CI tests are passing as at the latest commit
      Insert most recent commit hash where CI was passing
      e3a51a3
    • Ensure that any other env variable does not affect execution of the tests (for example, by inspecting the output of printenv | grep "FOUNDRY_\|DAPP_")
    • Check all tests are passing locally using make test
_Insert your local test logs here_
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠒] Compiling...
No files changed, compilation skipped

Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 3760751)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 59.45s (57.19s CPU time)

Warning: the following cheatcode(s) are deprecated and will be removed in future versions:
  revertTo(uint256): replaced by `revertToState`
  snapshot(): replaced by `snapshotState`
Ran 42 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testAllocatorIntegration() (gas: 0)
[PASS] testBytecodeMatches() (gas: 3916432)
[PASS] testCastCost() (gas: 3593582)
[PASS] testCastOnTime() (gas: 3589287)
[SKIP] testChainlogIntegrity() (gas: 0)
[PASS] testChainlogValues() (gas: 13330646)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testConsoleFreightDebtWriteOff() (gas: 3618742)
[SKIP] testContractSize() (gas: 0)
[PASS] testDaoResolutions() (gas: 16326)
[SKIP] testDeployCost() (gas: 0)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGelatoKeeperTreasuryAddress() (gas: 3605467)
[PASS] testGeneral() (gas: 34932773)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 4651358)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458603)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 498744)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 5038786)
[PASS] testPayments() (gas: 3958986)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17618)
[PASS] testSparkLendD3MBuffer() (gas: 3597709)
[PASS] testSparkSpellIsExecuted() (gas: 3595246)
[PASS] testSplitter() (gas: 4255325)
[PASS] testSystemTokens() (gas: 4892296)
[PASS] testUseEta() (gas: 354786)
[PASS] testVestDAI() (gas: 3886192)
[PASS] testVestMKR() (gas: 3838209)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 21 passed; 0 failed; 21 skipped; finished in 404.59s (932.76s CPU time)

Ran 2 test suites in 405.38s (464.04s CPU time): 23 tests passed, 0 failed, 21 skipped (44 total tests)

@SidestreamColdMelon
Copy link
Contributor

TLDR: good to handover

Deployed Stage

  • Source code settings
  • Source code validity
    • Deployed spell code matches source on github. (can be checked via make diff-deployed-spell or manually)
    • No new changes are made after previously given "good to deploy"
  • Deployed spell Etherscan checks
    • Automated checks via make check-deployed-spell
      • Verified
      • Valid license
      • Version matches
      • Optimizations are disabled
      • dss-exec-lib library address used (under 'Libraries Used') matches the hardcoded local DssExecLib.address file
      • deployed_spell_created matches deployment timestamp
      • deployed_spell_block matches deployment block number
    • Manual checks
      • Ensure make deploy-info tx=<tx> matches config
        • deployed_spell_created timestamp
        • deployed_spell_block block number
      • Check again that the PR did not modify the DssExecLib.address file (e.g. look under the 'Files Changed' PR tab, etc.)
      • Ensure Etherscan Libraries Used matches DssExecLib Latest Release
      • (For your tests to be accurate) git submodule hash matches dss-exec-lib latest release's tag commit and inspect diffs if doesn't match to ensure expected behaviour (Currently Non-Critical pending the next DssExecLib release, double check that the ExecLib used by the contract matches the latest release)
        ⚠️ The hash doesn't match as in multiple previous spells. Latest release v0.0.9 has hash of c0d3c6c made on Feb 1, 2022, while git submodule lib/dss-exec-lib is set to track the latest commit 69b658f made on Jan 23, 2023. Here is the diff between the latest release and the submodule: makerdao/dss-exec-lib@v0.0.9...69b658f#diff-72201ff20380f5c7fc89281be3ad2dd6bd5a992f246d41d6d9d97f71e078d40d. The only major difference between deployed and the imported library is the new setRWAIlkDebtCeiling, which is not used in this particular spell
  • Tenderly Testnet checks
    • A testnet with the name matching spell description is found at maker dashboard
    • The testnet name is unique (previous testnets does not have the same name)
    • Cast transaction is set to the correct "receiver" (matches deployed spell address)
    • All actions are executed in the transaction trace
    • No reverts are present that block execution
    • No out-of-gas errors are present
  • Archive checks
    • make diff-archive-spell for current date or make diff-archive-spell date="YYYY-MM-DD"
    • Ensure date corresponds to target Exec Doc date
  • Tests
    • Ensure that the DssExecLib.address file is not being modified by the spell PR
    • Check all CI tests are passing as at the latest commit
      Insert most recent commit hash where CI was passing
      e3a51a3
    • Ensure that any other env variable does not affect execution of the tests (for example, by inspecting the output of printenv | grep "FOUNDRY_\|DAPP_")
    • Check all tests are passing locally using make test
_Insert your local test logs here_
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠊] Compiling...
[⠒] Compiling 4 files with Solc 0.8.16
[⠘] Solc 0.8.16 finished in 2.63s
Compiler run successful with warnings:
Warning (2018): Function state mutability can be restricted to view
   --> src/DssSpell.t.base.sol:983:5:
    |
983 |     function _getOSMPrice(address pip) internal returns (uint256) {
    |     ^ (Relevant source part starts here and spans across multiple lines).

Warning (2018): Function state mutability can be restricted to view
   --> src/DssSpell.t.base.sol:999:5:
    |
999 |     function _getUNIV2LPPrice(address pip) internal returns (uint256) {
    |     ^ (Relevant source part starts here and spans across multiple lines).

Warning (2018): Function state mutability can be restricted to pure
    --> src/DssSpell.t.base.sol:2174:5:
     |
2174 |     function _getSignatures(bytes32 signHash) internal returns (bytes memory signatures, address[] memory signers) {
     |     ^ (Relevant source part starts here and spans across multiple lines).

Warning (2018): Function state mutability can be restricted to view
    --> src/DssSpell.t.base.sol:2366:5:
     |
2366 |     function _checkTransferrableVestMkrAllowance() internal {
     |     ^ (Relevant source part starts here and spans across multiple lines).

Warning (2018): Function state mutability can be restricted to view
    --> src/DssSpell.t.base.sol:2722:5:
     |
2722 |     function _testContractSize() internal {
     |     ^ (Relevant source part starts here and spans across multiple lines).

Warning (2018): Function state mutability can be restricted to view
    --> src/DssSpell.t.sol:1036:5:
     |
1036 |     function testDaoResolutions() public { // add the `skipped` modifier to skip
     |     ^ (Relevant source part starts here and spans across multiple lines).


Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 3730694)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.42s (15.58s CPU time)

Warning: the following cheatcode(s) are deprecated and will be removed in future versions:
  snapshot(): replaced by `snapshotState`
  revertTo(uint256): replaced by `revertToState`
Ran 42 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testAllocatorIntegration() (gas: 0)
[PASS] testBytecodeMatches() (gas: 3916432)
[PASS] testCastCost() (gas: 3563525)
[PASS] testCastOnTime() (gas: 3559230)
[SKIP] testChainlogIntegrity() (gas: 0)
[PASS] testChainlogValues() (gas: 13300589)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testConsoleFreightDebtWriteOff() (gas: 3588685)
[SKIP] testContractSize() (gas: 0)
[PASS] testDaoResolutions() (gas: 16326)
[SKIP] testDeployCost() (gas: 0)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGelatoKeeperTreasuryAddress() (gas: 3575410)
[PASS] testGeneral() (gas: 34902716)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 4621301)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458603)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 498043)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 5014740)
[PASS] testPayments() (gas: 3928929)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17618)
[PASS] testSparkLendD3MBuffer() (gas: 3567652)
[PASS] testSparkSpellIsExecuted() (gas: 3565189)
[PASS] testSplitter() (gas: 4225268)
[PASS] testSystemTokens() (gas: 4868251)
[PASS] testUseEta() (gas: 354786)
[PASS] testVestDAI() (gas: 3862147)
[PASS] testVestMKR() (gas: 3808152)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 21 passed; 0 failed; 21 skipped; finished in 119.70s (309.89s CPU time)

Ran 2 test suites in 120.14s (136.12s CPU time): 23 tests passed, 0 failed, 21 skipped (44 total tests)
  • Additional checks
    • testBytecodeMatches pass
    • No delegatecall code inside verified code
    • No selfdestruct code inside verified code

Copy link
Contributor

@SidestreamColdMelon SidestreamColdMelon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Handover and Merge Stage

  • Check that the spell address posted by the crafter in new-spells is correct
  • Confirm the address in the new-spells channel (via a separate "reply to" message, restating the address to avoid edits)
    • Wait until responsible governance facilitator confirms handover in new-spells
  • Ensure that no changes were made to the code since the spell was deployed and archived
  • Approve spell PR for merge via 'Approve' review option

Copy link
Member

@oddaf oddaf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Handover and Merge Stage

  • Check that the spell address posted by the crafter in new-spells is correct
  • Confirm the address in the new-spells channel (via a separate "reply to" message, restating the address to avoid edits)
    • Wait until responsible governance facilitator confirms handover in new-spells
  • Ensure that no changes were made to the code since the spell was deployed and archived
  • Approve spell PR for merge via 'Approve' review option

@SidestreamIcedMango SidestreamIcedMango merged commit 928aa1d into master Nov 14, 2024
3 checks passed
@SidestreamIcedMango SidestreamIcedMango deleted the 2024-11-14 branch November 14, 2024 16:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants