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 2025-02-21 #454

Merged
merged 17 commits into from
Feb 22, 2025
Merged

Mainnet spell 2025-02-21 #454

merged 17 commits into from
Feb 22, 2025

Conversation

SidestreamStrongStrawberry
Copy link
Collaborator

Description

Spell crafted based on the relevant Executive 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

@@ -22,6 +22,7 @@ export FOUNDRY_LIBRARIES="lib/dss-exec-lib/src/DssExecLib.sol:DssExecLib:$DSS_EX
export FOUNDRY_OPTIMIZER=false
export FOUNDRY_OPTIMIZER_RUNS=200
export FOUNDRY_ROOT_CHAINID=1
export FOUNDRY_GAS_LIMIT=18446744073709551615
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

NOTE: I've increased gas limit for the tests due to the error arising from testArbitrumTokenGatewayIntegration function. More specifically, the error EvmError: MemoryOOG is thrown by arbitrumDomain.relayFromHost(false) line in the test, when this env variable is not present. Chosen FOUNDRY_GAS_LIMIT value is arbitrary and is simply twice bigger than the default value specified in the foundry docs. This adjustment should not affect execution of the spell on the mainnet.

@SidestreamColdMelon
Copy link
Contributor

TLDR: Good to deploy

Development Stage

  • Install stable Foundry version
    • Find the first Foundry release that is older than 7 days from now
    • Install the specified version via foundryup --version git_tag_name
      Document the installation logs containing installed versions below:
      foundryup: use - forge 1.0.0-stable (e144b82070 2025-02-13T20:02:34.979686000Z)
      foundryup: use - cast 1.0.0-stable (e144b82070 2025-02-13T20:02:34.979686000Z)
      foundryup: use - anvil 1.0.0-stable (e144b82070 2025-02-13T20:02:34.979686000Z)
      foundryup: use - chisel 1.0.0-stable (e144b82070 2025-02-13T20:02:34.979686000Z)
      
  • 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=493289147#gid=493289147
    • 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 Yes
        • Global Line Modifier No
        • Order of Operations Issues No
      • Checksums Amount
        • Total Amount of USDS Transfers 3,122,823
        • Total Amount of SKY Transfers 988,000
      • Rate Adjustments
        • Reduce ETH-A Stability Fee by 2.00 percentage points from 9.75% to 7.75%
        • Reduce ETH-B Stability Fee by 2.00 percentage points from 10.25% to 8.25%
        • Reduce ETH-C Stability Fee by 2.00 percentage points from 9.50% to 7.50%
        • Reduce WSTETH-A Stability Fee by 2.00 percentage points from 10.75% to 8.75%
        • Reduce WSTETH-B Stability Fee by 2.00 percentage points from 10.50% to 8.50%
        • Reduce WBTC-A Stability Fee by 1.50 percentage points from 14.25% to 12.75%
        • Reduce WBTC-B Stability Fee by 1.50 percentage points from 14.75% to 13.25%
        • Reduce WBTC-C Stability Fee by 1.50 percentage points from 14.00% to 12.50%
        • Increase ALLOCATOR-SPARK-A Stability Fee by 1.89 percentage points from 1.33% to 3.22%
        • Reduce DSR by 2.50 percentage points from 7.25% to 4.75%
        • Reduce SSR by 2.25 percentage points from 8.75% to 6.50%
      • Init Arbitrum Token Bridge
        • Init Arbitrum Token Bridge by calling TokenGatewayInit.initGateways using the following parameters:
        • Set parameter l1GatewayInstance.gateway: (ERC1967Proxy: 0x84b9700E28B23F873b82c1BEb23d86C091b6079E)
        • Set parameter l1GatewayInstance.gatewayImp: (L1TokenGateway: 0x12eDe82637d5507026D4CDb3515B4b022Ed157b1)
        • Set parameter l2GatewayInstance.gateway: (ERC1967Proxy: 0x13F7F24CA959359a4D710D32c715D4bce273C793)
        • Set parameter l2GatewayInstance.gatewayImp: (L2TokenGateway: 0xD404eD36D6976BdCad8ABbcCC9F09ef07e33A9A8)
        • Set parameter l2GatewayInstance.spell: (L2TokenGatewaySpell: 0x3D4357c3944F7A5b6a0B5b67B36588BA45D3f49D)
        • Set parameter cfg.l1Router: (L1GatewayRouter (ERC1967Proxy): 0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef)
        • Set parameter cfg.inbox: (Inbox(ERC1967Proxy): 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f)
        • Set parameter cfg.l1Tokens: (array [USDS, SUSDS])
        • Set parameter cfg.l2Tokens: (array [Usds(ERC1967Proxy): 0x6491c05A82219b8D1479057361ff1654749b876b, SUsds(ERC1967Proxy): 0xdDb46999F8891663a8F2828d25298f70416d7610])
        • Set parameter cfg.maxWithdraws: (array [type(uint256).max, type(uint256).max])
        • Set parameter cfg.xchainMsg.maxGas: 350000
        • Set parameter cfg.xchainMsg.gasPriceBid: 100000000
        • Set parameter cfg.xchainMsg.maxSubmissionCost: 1316000000000000
      • Unwind SBE liquidity
        • Unwind SBE liquidity by calling UniV2PoolWithdraw.withdraw using the following parameter:
        • Set parameter usdsToLeave: 7,500,000 * 1e18
        • Sweep USDS returned by the SBE from the PauseProxy to the Surplus Buffer
      • SBE Parameter Changes
        • Decrease vow.hump by 50 million DAI, from 120 million to 70 million DAI
        • Decrease vow.bump by 15,000 DAI, from 25,000 to 10,000 DAI
        • Increase splitter.burn by 30.00 percentage points, from 70% to 100%
        • Decrease splitter.hop by 14,773 seconds, from 15,649 seconds to 876 seconds
      • ALLOCATOR-SPARK-A DC-IAM parameter changes
        • Increase DC-IAM gap by 400 million, from 100 million to 500 million USDS
        • Increase DC-IAM line by 4 billion USDS, from 1 billion USDS to 5 billion USDS
        • ttl: 86,400 seconds (unchanged)
      • Modify emergency spells in the chainlog
        • Update the value of EMSP_CLIP_BREAKER_FAB in the Chainlog to 0x867852D30bb3CB1411fB4e404FAE28EF742b1023
        • Update the value of EMSP_LINE_WIPE_FAB in the Chainlog to 0x8646F8778B58a0dF118FacEdf522181bA7277529
        • Add Standby spell to the chainlog, key: EMSP_LITE_PSM_HALT_FAB ,value: 0xB261b73698F6dBC03cB1E998A3176bdD81C3514A
        • Add Standby spell to the chainlog, key: EMSP_SPLITTER_STOP ,value: 0x12531afC02aC18a9597Cfe8a889b7B948243a60b
      • AD Compensation
        • BLUE - 4,000 USDS - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Bonapublica - 4,000 USDS - 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
        • Byteron - 4,000 USDS - 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
        • Cloaky - 4,000 USDS - 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
        • JuliaChang - 4,000 USDS - 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
        • PBG - 387 USDS - 0x8D4df847dB7FfE0B46AF084fE031F7691C6478c2
      • Atlas Core Development USDS Payments
        • BLUE - 83,601 USDS - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Cloaky - 18,835 USDS - 0x9244F47D70587Fa2329B89B6f503022b63Ad54A
      • Atlas Core Development SKY Payments
        • BLUE - 550,000 SKY - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Cloaky - 438,000 SKY - 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
      • Top-up of the Integration Boost
        • Integration Boost - 3,000,000 USDS - 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7
      • Spark Proxy Spell
        • Execute Spark Spell at 0x9EAa8d72BD731BE8eD71D768a912F6832492071e
  • 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 a good compromise for readability
    • 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
    • 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
        ⚠️ ChainlogAbstract is present in dss-interfaces, but it's acceptable to redefine since only a single method is used in the spell
      • 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)
    • ℹ️ EMSP_CLIP_BREAKER_FAB deployed to 0x867852D30bb3CB1411fB4e404FAE28EF742b1023
      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ No with 200 runs matches config defined in foundry.toml
      • GNU AGPLv3 license
      • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
        ℹ️ No constructor arguments
      • 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)
        ℹ️ Using source code at a052bb416fae2e03b64756c87eb67ec1a1a818a1 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
    • ℹ️ EMSP_LINE_WIPE_FAB deployed to 0x8646F8778B58a0dF118FacEdf522181bA7277529
      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ No with 200 runs matches config defined in foundry.toml
      • GNU AGPLv3 license
      • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
        ℹ️ No constructor arguments
      • 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)
        ℹ️ Using source code at a052bb416fae2e03b64756c87eb67ec1a1a818a1 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
    • ℹ️ EMSP_LITE_PSM_HALT_FAB deployed to 0xB261b73698F6dBC03cB1E998A3176bdD81C3514A
      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ No with 200 runs matches config defined in foundry.toml
      • GNU AGPLv3 license
      • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
        ℹ️ No constructor arguments
      • 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)
        ℹ️ Using source code at a052bb416fae2e03b64756c87eb67ec1a1a818a1 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
    • ℹ️ EMSP_SPLITTER_STOP deployed to 0x12531afC02aC18a9597Cfe8a889b7B948243a60b
      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ No with 200 runs matches config defined in foundry.toml
      • GNU AGPLv3 license
      • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
        ℹ️ No constructor arguments
      • 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)
        ℹ️ Using source code at a052bb416fae2e03b64756c87eb67ec1a1a818a1 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
    • ℹ️ ARBITRUM_TOKEN_BRIDGE deployed to 0x84b9700E28B23F873b82c1BEb23d86C091b6079E
      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ Yes with 200 runs is default, since optimisations aren't defined in foundry.toml
      • GNU AGPLv3 license
        ⚠️ The licence is MIT, as ERC1967Proxy contract is developed by OpenZeppelin (as expected)
      • 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)
        ℹ️ Using source code at aedb60f1a7efe2edb8a80611c2e601d262c03997 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
    • ℹ️ ARBITRUM_TOKEN_BRIDGE_IMP deployed to 0x12eDe82637d5507026D4CDb3515B4b022Ed157b1
      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ Yes with 200 runs is default, since optimisations aren't defined in foundry.toml
      • GNU AGPLv3 license
      • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
        ℹ️ Implementation contract can't be initialised due to _disableInitializers()
      • 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)
        ℹ️ Using source code at aedb60f1a7efe2edb8a80611c2e601d262c03997 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
    • ℹ️ L2_ARBITRUM_TOKEN_BRIDGE deployed to 0x13F7F24CA959359a4D710D32c715D4bce273C793
      • Source code is verified on etherscan
        ℹ️ Since the contract is deployed to arbitrum, it's verified on arbiscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ Yes with 200 runs is default, since optimisations aren't defined in foundry.toml
      • GNU AGPLv3 license
        ⚠️ The licence is MIT, as ERC1967Proxy contract is developed by OpenZeppelin (as expected)
      • 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)
          ⚠️ There is no MCD_PAUSE_PROXY on arbitrum, instead arbitrum-specific authority address ARBITRUM_GOV_RELAY.l2GovernanceRelay() is relied as expected
        • 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)
        ℹ️ Using source code at aedb60f1a7efe2edb8a80611c2e601d262c03997 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
        ⚠️ This file contains only mainnet deployers. There are currently no arbitrum-specific list of deployers
    • ℹ️ L2_ARBITRUM_TOKEN_BRIDGE_IMP deployed to 0xD404eD36D6976BdCad8ABbcCC9F09ef07e33A9A8
      • Source code is verified on etherscan
        ℹ️ Since the contract is deployed to arbitrum, it's verified on arbiscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ Yes with 200 runs is default, since optimisations aren't defined in foundry.toml
      • GNU AGPLv3 license
      • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
        ℹ️ Implementation contract can't be initialised due to _disableInitializers()
      • 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)
        ℹ️ Using source code at aedb60f1a7efe2edb8a80611c2e601d262c03997 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
        ⚠️ This file contains only mainnet deployers. There are currently no arbitrum-specific list of deployers
    • ℹ️ L2_ARBITRUM_TOKEN_BRIDGE_SPELL deployed to 0x3D4357c3944F7A5b6a0B5b67B36588BA45D3f49D
      • Source code is verified on etherscan
        ℹ️ Since the contract is deployed to arbitrum, it's verified on arbiscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ Yes with 200 runs is default, since optimisations aren't defined in foundry.toml
      • 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)
        ℹ️ Using source code at aedb60f1a7efe2edb8a80611c2e601d262c03997 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
        ⚠️ This file contains only mainnet deployers. There are currently no arbitrum-specific list of deployers
    • ℹ️ L2_USDS deployed to 0x6491c05A82219b8D1479057361ff1654749b876b
      • Source code is verified on etherscan
        ℹ️ Since the contract is deployed to arbitrum, it's verified on arbiscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ Yes with 200 runs as defined in foundry.toml
      • GNU AGPLv3 license
        ⚠️ The licence is MIT, as ERC1967Proxy contract is developed by OpenZeppelin (as expected)
      • 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)
          ⚠️ There is no MCD_PAUSE_PROXY on arbitrum, instead arbitrum-specific authority address ARBITRUM_GOV_RELAY.l2GovernanceRelay() is relied as expected
        • 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)
        ℹ️ Using source code at 45bf759ba046b66dd115842ee8b9205a64e7bab6 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
        ⚠️ This file contains only mainnet deployers. There are currently no arbitrum-specific list of deployers
      • ℹ️ Implementation contract deployed to 0x8479c0125db3A0a72d3C61809FaB4039bFcFBec3 matches audited source code
    • ℹ️ L2_SUSDS deployed to 0xdDb46999F8891663a8F2828d25298f70416d7610
      • Source code is verified on etherscan
        ℹ️ Since the contract is deployed to arbitrum, it's verified on arbiscan
      • Compilation optimizations match deployment settings defined in the source code repo
        ℹ️ Yes with 200 runs as defined in foundry.toml
      • GNU AGPLv3 license
        ⚠️ The licence is MIT, as ERC1967Proxy contract is developed by OpenZeppelin (as expected)
      • 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)
          ⚠️ There is no MCD_PAUSE_PROXY on arbitrum, instead arbitrum-specific authority address ARBITRUM_GOV_RELAY.l2GovernanceRelay() is relied as expected
        • 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)
        ℹ️ Using source code at e1d160aba17e95e8cec3d6bf50f310fbed9f28d6 from the publicly available audit
      • Deployer address is included into addresses_deployers.sol
        ⚠️ This file contains only mainnet deployers. There are currently no arbitrum-specific list of deployers
      • ℹ️ Implementation contract deployed to 0x5Aee6b37d6E31860804575AeE3e2f368A0a428E7 matches audited source code
    • ℹ️ ARBITRUM_ROUTER at 0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef
      • The contract is not added to chainlog, and is not controlled by Maker/Sky, but present in the official arbitrum docs as L1 Gateway Router
    • ℹ️ ARBITRUM_INBOX at 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f
      • The contract is not added to chainlog, and is not controlled by Maker/Sky, but present in the official arbitrum docs as Delayed Inbox
  • IF core system parameter changes are present in the instructions
    • ℹ️ Not present in the list above, but updated in this spell:
      • sUSDS.ssr is updated via .drip() + .file as in the archive
      • MCD_VOW.hump is updated via DssExecLib.setValue and matches the archive (RAD)
      • MCD_VOW.bump is updated via DssExecLib.setValue and matches the archive (RAD)
      • MCD_SPLIT.burn is updated via DssExecLib.setValue and matches the archive (WAD)
      • MCD_SPLIT.hop is updated via DssExecLib.setValue and matches the archive (seconds)
        • REWARDS_LSMKR_USDS.rewardsDuration is also updated via REWARDS_LSMKR_USDS.setRewardsDuration as the base test requires rewardsDuration to match hop even if burn is set to 100% (so all funds are sent to FlapperUniV2SwapOnly, and none to the StakingRewards). Technically, the test can be adjusted to account for the burn variable, but it's also fine to update rewardsDuration instead.
  • IF debt ceiling changes are present in the instructions
  • IF additional dependencies (i.e. ./src/dependencies/ directory) are present:
    • ℹ️ dependencies/arbitrum-token-bridge/L1TokenGatewayInstance.sol: audit, source code
      • 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
    • ℹ️ dependencies/arbitrum-token-bridge/L2TokenGatewayInstance.sol: audit, source code
      • 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
    • ℹ️ dependencies/arbitrum-token-bridge/L2TokenGatewaySpell.sol: audit, source code
      • 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
    • ℹ️ dependencies/arbitrum-token-bridge/TokenGatewayInit.sol: audit, source code
      • 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
    • ℹ️ dependencies/univ2-pool-migrator/UniV2PoolWithdraw.sol, source code
      • 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 crypto 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
    • Insert and follow the relevant checklists below:
  • IF RWA offboardings are present
  • IF payments are present in the spell
    • IF MKR transfers are present ℹ️ Note: not MKR, but SKY 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
        ℹ️ Not applicable to SKY transfers
      • 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 last year, all payments are tested via testPayments
      • Sum of all MKR transfers tested in testMKRPayments matches number in the Exec Sheet
    • IF DAI surplus buffer transfers are present ℹ️ Note: not DAI, but USDS 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 last year, all payments are tested via testPayments
      • 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
        ⚠️ This will be properly tested in the next stage, during tenderly simulation
    • 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
      ⚠️ ARBITRUM_INBOX and ARBITRUM_ROUTER contracts (that ARBITRUM_GOV_RELAY calls under the hood inside TokenGatewayInit.initGateways) are upgradable, but since it's an official deployment listed in the Arbitrum docs (under Delayed Inbox and L1 Gateway Router), we don't expect any surprizes. Their official docs also don't list any planned upgrades
    • Target Contract is included in the ChainLog
      ℹ️ All contracts developed by Sky ecosystems and used in the spell are added to chainlog, unless they are L2 addresses
    • 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
      ℹ️ And additionally via testAddChainlogKeys and testUpdateChainlogKeys
  • 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
      aa50c11
    • 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
      • Rate Adjustments
        • Tested via testGeneral
      • Init Arbitrum Token Bridge
        • Tested via testArbitrumTokenGatewayIntegration
      • Unwind SBE liquidity
        • Tested via testUnwindSurplusBuffer
      • SBE Parameter Changes
        • Tested via testGeneral
      • ALLOCATOR-SPARK-A DC-IAM parameter changes
        • Tested via testGeneral
      • Modify emergency spells in the chainlog
        • Tested via testChainlogIntegrity, testChainlogValues, testAddChainlogKeys and testUpdateChainlogKeys
      • AD Compensation
        • Tested via testPayments
      • Atlas Core Development USDS Payments
        • Tested via testPayments
      • Atlas Core Development SKY Payments
        • Tested via testPayments
      • Top-up of the Integration Boost
        • 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_")
    • IF a new module is initialized via the spell, the tests must include
      • Sanity checks of the constructor arguments
      • Sanity checks of all values added/updated by the spell function
      • End-to-end "happy path" interaction with the module
    • 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...
[⠘] Compiling 4 files with Solc 0.8.16
[⠃] Solc 0.8.16 finished in 2.81s
Compiler run successful!

Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 4205513)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 97.69s (90.30s 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 45 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testAddChainlogKeys() (gas: 4153401)
[SKIP] testAllocatorIntegration() (gas: 0)
[PASS] testArbitrumTokenGatewayIntegration() (gas: 38635781117)
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 4071760)
[PASS] testCastOnTime() (gas: 4068360)
[PASS] testChainlogIntegrity() (gas: 9513500)
[PASS] testChainlogValues() (gas: 13908487)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testContractSize() (gas: 15832)
[SKIP] testDaoResolutions() (gas: 0)
[PASS] testDeployCost() (gas: 5840007)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 37470427)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 4951853)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458207)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 497372)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 5602033)
[PASS] testPayments() (gas: 4257413)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17530)
[PASS] testSparkSpellIsExecuted() (gas: 4073127)
[PASS] testSplitter() (gas: 4536203)
[PASS] testSystemTokens() (gas: 5420941)
[PASS] testUnwindSurplusBuffer() (gas: 4101140)
[PASS] testUpdateChainlogKeys() (gas: 4120467)
[PASS] testUseEta() (gas: 354708)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testVestSKYmint() (gas: 0)
[SKIP] testVestUSDS() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 21 passed; 0 failed; 24 skipped; finished in 568.76s (1602.10s CPU time)

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
      ℹ️ https://github.com/makerdao/community/blob/master/governance/votes/Executive%20vote%20-%20February%2021%2C%202025.md
    • 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/6774aae11f98ee634b3f7711b8cdfab37edb4b86/governance/votes/Executive%20vote%20-%20February%2021%2C%202025.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
      0xead72cdc3e272b8b7384f318da766fd90391dbb535cf10848486477a952fc5bd
    • 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
      0xead72cdc3e272b8b7384f318da766fd90391dbb535cf10848486477a952fc5bd
    • 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
      • Stability Fee Adjustments
        • Reduce ETH-A SF by 2.00 percentage points from 9.75% to 7.75%.
        • Reduce ETH-B SF by 2.00 percentage points from 10.25% to 8.25%.
        • Reduce ETH-C SF by 2.00 percentage points from 9.50% to 7.50%.
        • Reduce WSTETH-A SF by 2.00 percentage points from 10.75% to 8.75%.
        • Reduce WSTETH-B SF by 2.00 percentage points from 10.50% to 8.50%.
        • Reduce WBTC-A SF by 1.50 percentage points from 14.25% to 12.75%.
        • Reduce WBTC-B SF by 1.50 percentage points from 14.75% to 13.25%.
        • Reduce WBTC-C SF by 1.50 percentage points from 14.00% to 12.50%.
        • Increase ALLOCATOR-SPARK-A SF by 1.89 percentage points from 1.33% to 3.22%.
      • Savings Rate Reductions
        • Reduce DSR by 2.50 percentage points from 7.25% to 4.75%.
        • Reduce SSR by 2.25 percentage points from 8.75% to 6.50%.
      • Arbitrum Token Bridge Initialization
        • l1GatewayInstance.gateway: (ERC1967Proxy: 0x84b9700E28B23F873b82c1BEb23d86C091b6079E)
        • l1GatewayInstance.gatewayImp: (L1TokenGateway: 0x12eDe82637d5507026D4CDb3515B4b022Ed157b1)
        • l2GatewayInstance.gateway: (ERC1967Proxy: 0x13F7F24CA959359a4D710D32c715D4bce273C793)
        • l2GatewayInstance.gatewayImp: (L2TokenGateway: 0xD404eD36D6976BdCad8ABbcCC9F09ef07e33A9A8)
        • l2GatewayInstance.spell: (L2TokenGatewaySpell: 0x3D4357c3944F7A5b6a0B5b67B36588BA45D3f49D)
        • cfg.l1Router: (L1GatewayRouter (ERC1967Proxy): 0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef)
        • cfg.inbox: (Inbox(ERC1967Proxy): 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f)
        • cfg.l1Tokens: (array [USDS, SUSDS])
        • cfg.l2Tokens: (array [Usds(ERC1967Proxy): 0x6491c05A82219b8D1479057361ff1654749b876b, SUsds(ERC1967Proxy): 0xdDb46999F8891663a8F2828d25298f70416d7610])
        • cfg.maxWithdraws: (array [type(uint256).max, type(uint256).max])
        • cfg.xchainMsg.maxGas: 350000
        • cfg.xchainMsg.gasPriceBid: 100000000
        • cfg.xchainMsg.maxSubmissionCost: 1316000000000000
      • Smart Burn Engine Liquidity Unwind
        • The withdraw function in the UniV2PoolWithdraw script will be invoked.
        • 15 million USDS worth of protocol-owned LP tokens will remain in the SBE (7.5 million USDS & the equivalent amount in SKY).
        • The recovered SKY tokens will be sent to (and remain in) the Pause Proxy.
        • The USDS portion will subsequently be transferred from the Pause Proxy to the Surplus Buffer.
      • Smart Burn Engine Parameter Changes
        • MCD Vow:
          • hump (trigger for surplus auctions once exceeded): 70 million DAI
          • bump (the lot size allocated per operation): 10,000 DAI
        • Splitter:
          • burn: 100% (All surplus will be directed to burning)
          • hop (minimum interval between consecutive kick operations): 876 seconds
      • ALLOCATOR-SPARK-A DC-IAM Parameter Changes
        • Increase DC-IAM Target Available Debt (gap) by 400 million USDS from 100 million USDS to 500 million USDS.
        • Increase DC-IAM Maximum Debt Ceiling (line) by 4 billion USDS from 1 billion USDS to 5 billion USDS.
        • The Ceiling Increase Cooldown (ttl) will remain unchanged at 24 hours.
      • Standby Spell Chainlog Changes
        • Update the value of Standby Spell key EMSP_CLIP_BREAKER_FAB to 0x867852d30bb3cb1411fb4e404fae28ef742b1023
        • Update the value of Standby Spell key EMSP_LINE_WIPE_FAB to 0x8646f8778b58a0df118facedf522181ba7277529
        • Add Standby Spell:
          • key: EMSP_LITE_PSM_HALT_FAB
          • value: 0xB261b73698F6dBC03cB1E998A3176bdD81C3514A
        • Add Standby Spell:
          • key: EMSP_SPLITTER_STOP
          • value: 0x12531afC02aC18a9597Cfe8a889b7B948243a60b
      • Aligned Delegate Compensation for January 2025
        • BLUE 4,000 USDS 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Bonapublica 4,000 USDS 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
        • Byteron 4,000 USDS 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
        • Cloaky 4,000 USDS 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
        • JuliaChang 4,000 USDS 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
        • PBG 387 USDS 0x8D4df847dB7FfE0B46AF084fE031F7691C6478c2
      • Atlas Core Development Payments
        • BLUE 83,601 USDS 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Cloaky 18,835 USDS 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
        • BLUE 550,000 SKY 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Cloaky 438,000 SKY 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
      • Integration Boost Funding
        • 3 million USDS will be transferred to 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7
      • Spark Proxy Spell
        • Spark Proxy Spell will be executed at 0x9EAa8d72BD731BE8eD71D768a912F6832492071e
    • Office hours value in the Exec Doc matches the spell
    • Sum of all payments in the Exec Doc matches the tests
      • 988,000 SKY
    • 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

@0xp3th1um
Copy link
Collaborator

0xp3th1um commented Feb 21, 2025

Good to deploy!

Mainnet Executive Spell Review Checklist

Development Stage

  • Install stable Foundry version

    • Find the first Foundry release that is older than 7 days from now
    • Install the specified version via foundryup --version git_tag_name
      Document the installation logs containing installed versions below:
      foundryup: installing foundry (version stable, tag stable)
      foundryup: downloading forge, cast, anvil, and chisel for stable version
      ######################################################################### 100.0%
      x forge
      x cast
      x anvil
      x chisel
      foundryup: downloading manpages
      ######################################################################### 100.0%
      foundryup: use - forge 1.0.0-stable (e144b82070 2025-02-13T20:02:34.979686000Z)
      foundryup: use - cast 1.0.0-stable (e144b82070 2025-02-13T20:02:34.979686000Z)
      foundryup: use - anvil 1.0.0-stable (e144b82070 2025-02-13T20:02:34.979686000Z)
      foundryup: use - chisel 1.0.0-stable (e144b82070 2025-02-13T20:02:34.979686000Z)
      
  • 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=493289147#gid=493289147
    • 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
      • Rate Adjustments

        • Reduce ETH-A Stability Fee by 2.00 percentage points from 9.75% to 7.75%

        • Reduce ETH-B Stability Fee by 2.00 percentage points from 10.25% to 8.25%

        • Reduce ETH-C Stability Fee by 2.00 percentage points from 9.50% to 7.50%

        • Reduce WSTETH-A Stability Fee by 2.00 percentage points from 10.75% to 8.75%

        • Reduce WSTETH-B Stability Fee by 2.00 percentage points from 10.50% to 8.50%

        • Reduce WBTC-A Stability Fee by 1.50 percentage points from 14.25% to 12.75%

        • Reduce WBTC-B Stability Fee by 1.50 percentage points from 14.75% to 13.25%

        • Reduce WBTC-C Stability Fee by 1.50 percentage points from 14.00% to 12.50%

        • Increase ALLOCATOR-SPARK-A Stability Fee by 1.89 percentage points from 1.33% to 3.22%

        • Reduce DSR by 2.50 percentage points from 7.25% to 4.75%

        • Reduce SSR by 2.25 percentage points from 8.75% to 6.50%

      • Init Arbitrum Token Bridge
        Init Arbitrum Token Bridge by calling TokenGatewayInit.initGateways using the following parameters:

        • Set parameter l1GatewayInstance.gateway: (ERC1967Proxy: 0x84b9700E28B23F873b82c1BEb23d86C091b6079E)
        • Set parameter l1GatewayInstance.gatewayImp: (L1TokenGateway: 0x12eDe82637d5507026D4CDb3515B4b022Ed157b1)
        • Set parameter l2GatewayInstance.gateway: (ERC1967Proxy: 0x13F7F24CA959359a4D710D32c715D4bce273C793)
        • Set parameter l2GatewayInstance.gatewayImp: (L2TokenGateway: 0xD404eD36D6976BdCad8ABbcCC9F09ef07e33A9A8)
        • Set parameter l2GatewayInstance.spell: (L2TokenGatewaySpell: 0x3D4357c3944F7A5b6a0B5b67B36588BA45D3f49D)
        • Set parameter cfg.l1Router: (L1GatewayRouter (ERC1967Proxy): 0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef)
        • Set parameter cfg.inbox: (Inbox(ERC1967Proxy): 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f)
        • Set parameter cfg.l1Tokens: (array [USDS, SUSDS])
        • Set parameter cfg.l2Tokens: (array [Usds(ERC1967Proxy): 0x6491c05A82219b8D1479057361ff1654749b876b, SUsds(ERC1967Proxy): 0xdDb46999F8891663a8F2828d25298f70416d7610])
        • Set parameter cfg.maxWithdraws: (array [type(uint256).max, type(uint256).max])
        • Set parameter cfg.xchainMsg.maxGas: 350000- Set parameter cfg.xchainMsg.gasPriceBid: 100000000
        • Set parameter cfg.xchainMsg.maxSubmissionCost: 1316000000000000
      • Unwind SBE liquidity
        Unwind SBE liquidity by calling UniV2PoolWithdraw.withdraw using the following parameter:

        • Set parameter usdsToLeave: 7,500,000 * 1e18
        • Sweep USDS returned by the SBE from the PauseProxy to the Surplus Buffer
      • ALLOCATOR-SPARK-A DC-IAM parameter changes

        • Increase DC-IAM gap by 400 million, from 100 million to 500 million USDS
        • Increase DC-IAM line by 4 billion USDS, from 1 billion USDS to 5 billion USDS
        • ttl: 86,400 seconds (unchanged)
      • Modify emergency spells in the chainlog

        • Update the value of EMSP_CLIP_BREAKER_FAB in the Chainlog to 0x867852D30bb3CB1411fB4e404FAE28EF742b1023
        • Update the value of EMSP_LINE_WIPE_FAB in the Chainlog to 0x8646F8778B58a0dF118FacEdf522181bA7277529
        • Add Standby spell to the chainlog, key: EMSP_LITE_PSM_HALT_FAB ,value: 0xB261b73698F6dBC03cB1E998A3176bdD81C3514A
        • Add Standby spell to the chainlog, key: EMSP_SPLITTER_STOP ,value: 0x12531afC02aC18a9597Cfe8a889b7B948243a60b
      • AD Compensation

        • BLUE - 4,000 USDS - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Bonapublica - 4,000 USDS - 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
        • Byteron - 4,000 USDS - 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
        • Cloaky - 4,000 USDS - 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
        • JuliaChang - 4,000 USDS - 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
        • PBG - 387 USDS - 0x8D4df847dB7FfE0B46AF084fE031F7691C6478c2
      • Atlas Core Development USDS Payments

        • BLUE - 83,601 USDS - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Cloaky - 18,835 USDS - 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
      • Atlas Core Development SKY Payments

        • BLUE - 550,000 SKY - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Cloaky - 438,000 SKY - 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
      • Top-up of the Integration Boost

        • Integration Boost - 3,000,000 USDS - 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7
      • Spark Proxy Spell

        • Execute Spark Spell at 0x9EAa8d72BD731BE8eD71D768a912F6832492071e
  • 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

    • 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)

    • EMSP_CLIP_BREAKER_FAB - 0x867852D30bb3CB1411fB4e404FAE28EF742b1023

      • 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
    • EMSP_LINE_WIPE_FAB - 0x8646F8778B58a0dF118FacEdf522181bA7277529

      • 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
    • EMSP_LITE_PSM_HALT_FAB - 0xB261b73698F6dBC03cB1E998A3176bdD81C3514A

      • 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
    • EMSP_SPLITTER_STOP - 0x12531afC02aC18a9597Cfe8a889b7B948243a60b

      • 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
    • ARBITRUM_TOKEN_BRIDGE - 0x84b9700E28B23F873b82c1BEb23d86C091b6079E

      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
      • GNU AGPLv3 license
        ℹ️ It uses the MIT license, but it is ok since it is developed by a third party
      • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
      • IF new contract have concept of wards or access control
        ℹ️ the contract is a proxy but the concept of wards exist in the corresponding implmentation!
        • 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
    • ARBITRUM_TOKEN_BRIDGE_IMP - 0x12eDe82637d5507026D4CDb3515B4b022Ed157b1

      • 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, ...)
        ℹ️ The checks below are performed in the corresponding proxy above!
      • 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
    • L2_ARBITRUM_TOKEN_BRIDGE - 0x13F7F24CA959359a4D710D32c715D4bce273C793

      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
      • GNU AGPLv3 license
        ℹ️ It uses the MIT license, but it is ok since it is developed by a third party
      • Every maker-related constructor argument matches chainlog (e.g. vat, dai, dog, ...)
      • IF new contract have concept of wards or access control
        ℹ️ the contract is a proxy but the concept of wards exist in the corresponding implmentation!
        • Ensure PAUSE_PROXY address was relied (wards(PAUSE_PROXY) is 1)
          ℹ️ There is no PAUSE_PROXY on Arbitrum, but the equivalent address for Arbitrum ir relayed properly
        • 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
        ℹ️ It is not included, but we can bypass it because this is an Arbitrum deployment
    • L2_ARBITRUM_TOKEN_BRIDGE_IMP - 0xD404eD36D6976BdCad8ABbcCC9F09ef07e33A9A8

      • 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, ...)
        ℹ️ The checks below are performed in the corresponding proxy above!
      • 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
        ℹ️ It is not included, but we can bypass it because this is an Arbitrum deployment
    • L2_ARBITRUM_TOKEN_BRIDGE_SPELL - 0x3D4357c3944F7A5b6a0B5b67B36588BA45D3f49D

      • 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
        ℹ️ It is not included, but we can bypass it because this is an Arbitrum deployment
    • L2_USDS - 0x6491c05A82219b8D1479057361ff1654749b876b

      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
      • GNU AGPLv3 license
        ℹ️ It uses the MIT 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)
          ℹ️ There is no PAUSE_PROXY on Arbitrum, but the equivalent address for Arbitrum ir relayed properly
        • 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
        ℹ️ It is not included, but we can bypass it because this is an Arbitrum deployment
    • L2_SUSDS - 0xdDb46999F8891663a8F2828d25298f70416d7610

      • Source code is verified on etherscan
      • Compilation optimizations match deployment settings defined in the source code repo
      • GNU AGPLv3 license
        ℹ️ It uses the MIT 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)
          ℹ️ There is no PAUSE_PROXY on Arbitrum, but the equivalent address for Arbitrum ir relayed properly
        • 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
        ℹ️ It is not included, but we can bypass it because this is an Arbitrum deployment
  • 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 onboarding is present

  • IF PSM migration, onboarding or offboarding is present:

  • IF D3M onboarding is present, insert and follow D3M Checklist

  • IF crypto 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

    • Insert and follow the relevant checklists below:
  • IF RWA offboardings are present

  • IF payments are present in the spell

    • IF MKR transfers are present
      ℹ️ Performing the checks for SKY transfers instead!
      • 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
        ⚠️ This is required for SKY transfers
      • IF 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
        ⚠️ This method is deprecated; tested with testPayments instead!
      • Sum of all MKR transfers tested in testMKRPayments matches number in the Exec Sheet
    • IF DAI surplus buffer transfers are present
      ℹ️ Used as an intermediate step in order to transfer USDS, the checks are performed below
      • 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 USDS surplus buffer transfers are present
      ℹ️ Added extra checks for USDS
      • 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 testPayments test
      • Sum of all USDS 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
        ℹ️ This can be checked later on the Tenderly simulation!
    • 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
      ℹ️ Some contracts are upgradeable but they are official Arbitrum deployments, so we consider this no-risk factor.
    • 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
      786ce52

    • 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
      [x] Rate Adjustments
      testGeneral() and editing config.sol properly
      [x] Init Arbitrum Token Bridge
      testArbitrumTokenGatewayIntegration()
      [x] Unwind SBE liquidity
      testUnwindSurplusBuffer()
      [x] SBE Parameter Changes
      testGeneral() and editing config.sol properly
      [x] ALLOCATOR-SPARK-A DC-IAM parameter changes
      testGeneral() and editing config.sol properly
      [x] Modify emergency spells in the chainlog
      testAddChainlogKeys(), testUpdateChainlogKeys(), testChainlogIntegrity() & testChainlogValues()
      [x] AD Compensation
      testPayments()
      [x] Atlas Core Development USDS Payments
      testPayments()
      [x] Atlas Core Development SKY Payments
      testPayments()
      [x] Top-up of the Integration Boost
      testPayments()
      [x] Spark Proxy Spell
      testSparkSpellIsExecuted()
      [x] Bump chainlog version and chainlog additions
      testChainlogIntegrity() & testChainlogValues()

    • Ensure that any other env variable does not affect execution of the tests (for example, by inspecting the output of printenv | grep "FOUNDRY_\|DAPP_")

    • IF a new module is initialized via the spell, the tests must include

      • Sanity checks of the constructor arguments
      • Sanity checks of all values added/updated by the spell function
      • End-to-end "happy path" interaction with the module
    • 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...
[⠑] Compiling 4 files with Solc 0.8.16
[⠘] Solc 0.8.16 finished in 1.69s
Compiler run successful!

Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 4171032)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 84.51s (77.01s 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 45 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testAddChainlogKeys() (gas: 4118920)
[SKIP] testAllocatorIntegration() (gas: 0)
[PASS] testArbitrumTokenGatewayIntegration() (gas: 38635762050)
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 4037278)
[PASS] testCastOnTime() (gas: 4033878)
[PASS] testChainlogIntegrity() (gas: 9470398)
[PASS] testChainlogValues() (gas: 13865385)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testContractSize() (gas: 15832)
[SKIP] testDaoResolutions() (gas: 0)
[PASS] testDeployCost() (gas: 5840007)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 37427325)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 4917372)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458207)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 497372)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 5567552)
[PASS] testPayments() (gas: 4222932)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17530)
[PASS] testSparkSpellIsExecuted() (gas: 4038645)
[PASS] testSplitter() (gas: 4501721)
[PASS] testSystemTokens() (gas: 5386460)
[PASS] testUnwindSurplusBuffer() (gas: 4066658)
[PASS] testUpdateChainlogKeys() (gas: 4085985)
[PASS] testUseEta() (gas: 354708)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testVestSKYmint() (gas: 0)
[SKIP] testVestUSDS() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 21 passed; 0 failed; 24 skipped; finished in 547.38s (1943.34s CPU time)

Ran 2 test suites in 548.53s (631.90s CPU time): 23 tests passed, 0 failed, 24 skipped (47 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/6774aae11f98ee634b3f7711b8cdfab37edb4b86/governance/votes/Executive%20vote%20-%20February%2021%2C%202025.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>"
        
        Commit hash: 6774aae11f98ee634b3f7711b8cdfab37edb4b86
    • 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
      0xead72cdc3e272b8b7384f318da766fd90391dbb535cf10848486477a952fc5bd

    • 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
      0xead72cdc3e272b8b7384f318da766fd90391dbb535cf10848486477a952fc5bd

    • 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

      • Stability Fee Adjustments
        The Stability Fees (SF) for the vault types listed below will be adjusted as follows:

        • Reduce ETH-A SF by 2.00 percentage points from 9.75% to 7.75%.
        • Reduce ETH-B SF by 2.00 percentage points from 10.25% to 8.25%.
        • Reduce ETH-C SF by 2.00 percentage points from 9.50% to 7.50%.
        • Reduce WSTETH-A SF by 2.00 percentage points from 10.75% to 8.75%.
        • Reduce WSTETH-B SF by 2.00 percentage points from 10.50% to 8.50%.
        • Reduce WBTC-A SF by 1.50 percentage points from 14.25% to 12.75%.
        • Reduce WBTC-B SF by 1.50 percentage points from 14.75% to 13.25%.
        • Reduce WBTC-C SF by 1.50 percentage points from 14.00% to 12.50%.
        • Increase ALLOCATOR-SPARK-A SF by 1.89 percentage points from 1.33% to 3.22%.
      • Savings Rate Reductions
        The DAI Savings Rate (DSR) and the SKY Savings Rate (SSR) will be decreased as follows:

        • Reduce DSR by 2.50 percentage points from 7.25% to 4.75%.
        • Reduce SSR by 2.25 percentage points from 8.75% to 6.50%.
      • Arbitrum Token Bridge Initialization
        The Arbitrum Token Bridge will be initialized by calling TokenGatewayInit.initGateways using the following parameters:

        • l1GatewayInstance.gateway: (ERC1967Proxy: 0x84b9700E28B23F873b82c1BEb23d86C091b6079E)
        • l1GatewayInstance.gatewayImp: (L1TokenGateway: 0x12eDe82637d5507026D4CDb3515B4b022Ed157b1)
        • l2GatewayInstance.gateway: (ERC1967Proxy: 0x13F7F24CA959359a4D710D32c715D4bce273C793)
        • l2GatewayInstance.gatewayImp: (L2TokenGateway: 0xD404eD36D6976BdCad8ABbcCC9F09ef07e33A9A8)
        • l2GatewayInstance.spell: (L2TokenGatewaySpell: 0x3D4357c3944F7A5b6a0B5b67B36588BA45D3f49D)
        • cfg.l1Router: (L1GatewayRouter (ERC1967Proxy): 0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef)
        • cfg.inbox: (Inbox(ERC1967Proxy): 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f)
        • cfg.l1Tokens: (array [USDS, SUSDS])
        • cfg.l2Tokens: (array [Usds(ERC1967Proxy): 0x6491c05A82219b8D1479057361ff1654749b876b, SUsds(ERC1967Proxy): 0xdDb46999F8891663a8F2828d25298f70416d7610])
        • cfg.maxWithdraws: (array [type(uint256).max, type(uint256).max])
        • cfg.xchainMsg.maxGas: 350000
        • cfg.xchainMsg.gasPriceBid: 100000000
        • cfg.xchainMsg.maxSubmissionCost: 1316000000000000
      • Smart Burn Engine Liquidity Unwind
        part of the Smart Burn Engine’s LP-held tokens will be unwound to the Pause Proxy by executing the following actions:

        • The withdraw function in the UniV2PoolWithdraw script will be invoked.
        • 15 million USDS worth of protocol-owned LP tokens will remain in the SBE (7.5 million USDS & the equivalent amount in SKY).
        • The recovered SKY tokens will be sent to (and remain in) the Pause Proxy.
        • The USDS portion will subsequently be transferred from the Pause Proxy to the Surplus Buffer.
      • Smart Burn Engine Parameter Changes
        The Smart Burn Engine parameters below will be changed as follows:

        • MCD Vow:
          • hump (trigger for surplus auctions once exceeded): 70 million DAI
          • bump (the lot size allocated per operation): 10,000 DAI
        • Splitter:
          • burn: 100% (All surplus will be directed to burning)
          • hop (minimum interval between consecutive kick operations): 876 seconds
      • ALLOCATOR-SPARK-A DC-IAM Parameter Changes
        The ALLOCATOR-SPARK-A DC-IAM parameters below will be changed as follows:

        • Increase DC-IAM Target Available Debt (gap) by 400 million USDS from 100 million USDS to 500 million USDS.
        • Increase DC-IAM Maximum Debt Ceiling (line) by 4 billion USDS from 1 billion USDS to 5 billion USDS.
        • The Ceiling Increase Cooldown (ttl) will remain unchanged at 24 hours.
      • Standby Spell Chainlog Changes
        The Chainlog keys below will be updated as follows:

        • Update the value of Standby Spell key EMSP_CLIP_BREAKER_FAB to 0x867852d30bb3cb1411fb4e404fae28ef742b1023
        • Update the value of Standby Spell key EMSP_LINE_WIPE_FAB to 0x8646f8778b58a0df118facedf522181ba7277529
        • Add Standby Spell:
          • key: EMSP_LITE_PSM_HALT_FAB
          • value: 0xB261b73698F6dBC03cB1E998A3176bdD81C3514A
        • Add Standby Spell:
          • key: EMSP_SPLITTER_STOP
          • value: 0x12531afC02aC18a9597Cfe8a889b7B948243a60b
      • Aligned Delegate Compensation for January 2025
        A total of 20,387 USDS will be distributed to six Aligned Delegates as compensation for January 2025:

        • BLUE 4,000 USDS 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
        • Bonapublica 4,000 USDS 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3
        • Byteron 4,000 USDS 0xc2982e72D060cab2387Dba96b846acb8c96EfF66
        • Cloaky 4,000 USDS 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
        • JuliaChang 4,000 USDS 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7
        • PBG 387 USDS 0x8D4df847dB7FfE0B46AF084fE031F7691C6478c2
      • Atlas Core Development Payments
        A total of 102,436 USDS and 988,000 SKY will be transferred to two Atlas Core Development contributors and their teams:

        • USDS Token Transfers
          • BLUE 83,601 USDS 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
          • Cloaky 18,835 USDS 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
        • SKY Token Transfers
          • BLUE 550,000 SKY 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf
          • Cloaky 438,000 SKY 0x9244F47D70587Fa2329B89B6f503022b63Ad54A5
      • Integration Boost Funding
        3 million USDS will be transferred to 0xD6891d1DFFDA6B0B1aF3524018a1eE2E608785F7 to continue funding the Integration Boost initiative.

      • Spark Proxy Spell
        a Spark Proxy Spell will be executed at 0x9EAa8d72BD731BE8eD71D768a912F6832492071e.

    • 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

@SidestreamStrongStrawberry
Copy link
Collaborator Author

.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx
 
 ╔═╗ ╔═╗ ╦ ╦ ╔╗╔ ╔╦╗ ╦═╗ ╦ ╦         Portable and modular toolkit
 ╠╣  ║ ║ ║ ║ ║║║  ║║ ╠╦╝ ╚╦╝    for Ethereum Application Development 
 ╚   ╚═╝ ╚═╝ ╝╚╝ ═╩╝ ╩╚═  ╩                 written in Rust.

.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx

Repo       : https://github.com/foundry-rs/
Book       : https://book.getfoundry.sh/                      
Chat       : https://t.me/foundry_rs/                         
Support    : https://t.me/foundry_support/
Contribute : https://github.com/orgs/foundry-rs/projects/2/

.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx

foundryup: installing foundry (version stable, tag stable)
foundryup: downloading latest forge, cast, anvil, and chisel
################################################################################################################################################################################################################################################ 100.0%
foundryup: downloading manpages
################################################################################################################################################################################################################################################ 100.0%
foundryup: installed - forge Version: 1.0.0-stable
Commit SHA: e144b82070619b6e10485c38734b4d4d45aebe04
Build Timestamp: 2025-02-13T20:02:34.979686000Z (1739476954)
Build Profile: maxperf
foundryup: installed - cast Version: 1.0.0-stable
Commit SHA: e144b82070619b6e10485c38734b4d4d45aebe04
Build Timestamp: 2025-02-13T20:02:34.979686000Z (1739476954)
Build Profile: maxperf
foundryup: installed - anvil Version: 1.0.0-stable
Commit SHA: e144b82070619b6e10485c38734b4d4d45aebe04
Build Timestamp: 2025-02-13T20:02:34.979686000Z (1739476954)
Build Profile: maxperf
foundryup: installed - chisel Version: 1.0.0-stable
Commit SHA: e144b82070619b6e10485c38734b4d4d45aebe04
Build Timestamp: 2025-02-13T20:02:34.979686000Z (1739476954)
Build Profile: maxperf
foundryup: done!

@0xp3th1um
Copy link
Collaborator

TLDR: Good to handover!

Deployed Stage

  • Crafter's comment in the PR
    • Contains relevant Foundry installation logs
    • Contains a URL to the deployed spell
      • URL matches the spell address declared in config.sol
    • Contains a URL to the Tenderly Testnet
  • 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)
      ℹ️ The script returns a diff (due to lib inclusion) but the code matches when checked 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
          timestamp = 1740160139
        • deployed_spell_block block number
          block: 21896310
      • 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
      b2052d7
    • 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 1.75s
Compiler run successful!

Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 4582232)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 93.64s (89.10s 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 45 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testAddChainlogKeys() (gas: 4530120)
[SKIP] testAllocatorIntegration() (gas: 0)
[PASS] testArbitrumTokenGatewayIntegration() (gas: 38636262920)
[PASS] testBytecodeMatches() (gas: 5868308)
[PASS] testCastCost() (gas: 4448478)
[PASS] testCastOnTime() (gas: 4445078)
[PASS] testChainlogIntegrity() (gas: 9984398)
[PASS] testChainlogValues() (gas: 14379385)
[SKIP] testCollateralIntegrations() (gas: 0)
[SKIP] testContractSize() (gas: 0)
[SKIP] testDaoResolutions() (gas: 0)
[SKIP] testDeployCost() (gas: 0)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 37943422)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 5453628)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458207)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 497372)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 5978752)
[PASS] testPayments() (gas: 4634132)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17530)
[PASS] testSparkSpellIsExecuted() (gas: 4449845)
[PASS] testSplitter() (gas: 4912921)
[PASS] testSystemTokens() (gas: 5797660)
[PASS] testUnwindSurplusBuffer() (gas: 4477858)
[PASS] testUpdateChainlogKeys() (gas: 4497185)
[PASS] testUseEta() (gas: 354708)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testVestSKYmint() (gas: 0)
[SKIP] testVestUSDS() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 20 passed; 0 failed; 25 skipped; finished in 617.93s (2232.20s CPU time)

Ran 2 test suites in 619.12s (711.57s CPU time): 22 tests passed, 0 failed, 25 skipped (47 total tests)

@SidestreamColdMelon
Copy link
Contributor

TLDR: good to handover

Deployed Stage

  • Crafter's comment in the PR
    • Contains relevant Foundry installation logs
    • Contains a URL to the deployed spell
      • URL matches the spell address declared in config.sol
    • Contains a URL to the Tenderly Testnet
  • 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)
    • 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. The only major difference between deployed and the imported library is the new setRWAIlkDebtCeiling method, which is not used in this 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
      b2052d7
    • 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: 4661280)
[PASS] testStarknetSpell() (gas: 2302)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 94.15s (90.64s 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 45 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testAddChainlogKeys() (gas: 4609168)
[SKIP] testAllocatorIntegration() (gas: 0)
[PASS] testArbitrumTokenGatewayIntegration() (gas: 38636582712)
[PASS] testBytecodeMatches() (gas: 5868308)
[PASS] testCastCost() (gas: 4527527)
[PASS] testCastOnTime() (gas: 4524127)
[PASS] testChainlogIntegrity() (gas: 10083209)
[PASS] testChainlogValues() (gas: 14478196)
[SKIP] testCollateralIntegrations() (gas: 0)
[SKIP] testContractSize() (gas: 0)
[SKIP] testDaoResolutions() (gas: 0)
[SKIP] testDeployCost() (gas: 0)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 38042233)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testLitePSMs() (gas: 5552439)
[SKIP] testLockstakeIlkIntegration() (gas: 0)
[SKIP] testMedianReaders() (gas: 0)
[SKIP] testNewAuthorizations() (gas: 0)
[SKIP] testNewCronJobs() (gas: 0)
[PASS] testNextCastTime() (gas: 458207)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 497372)
[SKIP] testOracleList() (gas: 0)
[SKIP] testOsmReaders() (gas: 0)
[PASS] testPSMs() (gas: 6057800)
[PASS] testPayments() (gas: 4721041)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17530)
[PASS] testSparkSpellIsExecuted() (gas: 4528894)
[PASS] testSplitter() (gas: 4991970)
[PASS] testSystemTokens() (gas: 5876708)
[PASS] testUnwindSurplusBuffer() (gas: 4556907)
[PASS] testUpdateChainlogKeys() (gas: 4576234)
[PASS] testUseEta() (gas: 354708)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testVestSKY() (gas: 0)
[SKIP] testVestSKYmint() (gas: 0)
[SKIP] testVestUSDS() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 20 passed; 0 failed; 25 skipped; finished in 558.98s (1583.03s CPU time)

Ran 2 test suites in 559.60s (653.13s CPU time): 22 tests passed, 0 failed, 25 skipped (47 total tests)
  • Additional checks
    • testBytecodeMatches pass
    • No delegatecall code inside verified code
    • No selfdestruct code inside verified code

@0xp3th1um
Copy link
Collaborator

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
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

@SidestreamColdMelon SidestreamColdMelon merged commit 5074678 into master Feb 22, 2025
2 checks passed
@SidestreamColdMelon SidestreamColdMelon deleted the 2025-02-21 branch February 22, 2025 02:51
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.

5 participants