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 2023-11-29 #372

Merged
merged 13 commits into from
Nov 30, 2023
Merged

Mainnet spell 2023-11-29 #372

merged 13 commits into from
Nov 30, 2023

Conversation

SidestreamColdMelon
Copy link
Contributor

@SidestreamColdMelon SidestreamColdMelon commented Nov 22, 2023

Description

This PR implements upcoming 2023-11-29 mainnet spell based on the executive sheet provided by governance facilitators.

Contribution Checklist

  • 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

@SidestreamColdMelon SidestreamColdMelon self-assigned this Nov 22, 2023
@SidestreamColdMelon SidestreamColdMelon marked this pull request as ready for review November 28, 2023 18:33
@SidestreamSweatyPumpkin
Copy link
Contributor

Good to deploy

Mainnet Executive Spell Review Checklist

Mainnet 2023-11-29

Spell Actions (Per Exec Doc):

  • Decrease PSM-GUSD-A Debt Ceiling
    • The Debt Ceiling (line) will be set to 0.
    • The vault will be removed from the Debt Ceiling Instant Access Module (AutoLine).
  • Increase Coinbase Custody (RWA014-A) Debt Ceiling
    • The Debt Ceiling (line) will be increased by 1 billion DAI from 500 million DAI to 1.5 billion DAI.
  • Decrease WBTC-A, WBTC-B, and WBTC-C Stability Fee
    • The WBTC-A Stability Fee (SF) will be decreased by 0.07%, from 5.86% to 5.79%.
    • The WBTC-B Stability Fee (SF) will be decreased by 0.07%, from 6.36% to 6.29%.
    • The WBTC-C Stability Fee (SF) will be decreased by 0.07%, from 5.61% to 5.54%.
  • Smart Burn Engine Parameter Optimization
    • The bump (lot size) parameter will be increased by 10,000, from 20,000 to 30,000 DAI.
    • The hop (frequency) parameter will be increased by 9,460, from 6,308 to 15,768 seconds.
  • Approve RWA Foundation Dao Resolution
    • The DAO Resolution with IPFS hash QmPiEHtt8rkVtSibBXMrhEzHUmSriXWz4AL2bjscq8dUvU will be approved.
  • DAI transfer to cover Andromeda Legal expenses
    • 201,738 DAI will be transfered to 0xc4dB894A11B1eACE4CDb794d0753A3cB7A633767.
  • Cease MKR and DAI Vest Streams for Steakhouse and TechOps
    • Steakhouse DAI stream ID 19
    • TechOps DAI stream ID 18
    • Steakhouse MKR stream ID 32
    • TechOps MKR stream ID 33
  • Set up MKR and DAI Vest Streams for Ecosystem Facilitator
    • Ecosystem 2023-12-01 00:00:00 to 2024-11-30 23:59:59 504,000.00 DAI 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75
    • Ecosystem 2023-12-01 00:00:00 to 2024-11-30 23:59:59 216.00 MKR 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75
  • Spark Protocol Proxy-Spell

Development Stage

  • Office Hours
    • On (Collateral Onboarding, Keepers, Integrations, ...)
    • Matches Exec Doc
  • 30 days spell expiry in constructor (block.timestamp + 30 days)
  • Exec Doc Hash
    • Search the 'Community' GitHub repo for the corresponding Exec Doc
    • Ensure Exec Doc file name follows the format Executive vote - Month DD, YYYY.md
    • Extract permanent raw Url link via Github
      https://raw.githubusercontent.com/makerdao/community/6645652102491fa254c4a165ab62d53dcf50337b/governance/votes/Executive%20vote%20-%20November%2029%2C%202023.md
    • Generate Exec Doc Hash using this URL
      • Automatically: using make exec-hash $URL
      • Manually: using cast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
        0xbd47c214fb16080be97b08f3cf5b45ca9b3d5ff7bbc2057501534e05d84823ea
  • Spell Description
    • Description follows the format TARGET_DATE MakerDAO Executive Spell | Hash: EXEC_DOC_HASH)
    • Target date in description matches the Exec Doc target date
    • Exec Doc Hash in description matches your locally generated Exec Doc Hash
    • Accompanying comment above spell description
      • Comment follows the format // Hash: cast keccak -- "$(wget 'EXEC_DOC_URL' -q -O - 2>/dev/null)"
      • Exec Doc URL in comment matches your Raw Exec Doc URL
        • does not but the contents are the same
      • Exec Doc URL in comment refers to the 'Community' GitHub repo
  • Ensure the comments inside the spell action are correct:
    • Every Section text from the Exec Sheet should be copied as comment to the spell code (above the code segment that implements the action)
      • is surrounded by the set of dashes (E.g. // ----- Section text -----)
    • Every Instruction text Exec Sheet should be:
      • copied to the spell code as // Instruction text
      • have newline above it
    • Every Reasoning URL and Authority URL from the Exec Sheet should be present under relevant section or instruction in the spell code (depending on which row the link is present)
      • Every Reasoning URL and Authority URL should 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/
    • If action in the spell doesn't have relevant instruction (e.g.: chainlog version bump), it should have explanation prefixed with // Note:
    • If an instruction can not be taken, it should have a comment under the instruction prefixed with // Note: (e.g.: // Note: Payments are skipped on goerli)
  • Local Environment Actions
    • Update Foundry by running foundryup
    • Reinstall libraries
      • Remove libraries by deleting the lib folder
      • Install libraries using git submodule update --init --recursive
        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 '4ad127cf53eeaddfb7b8ad56dd4b13e57d6a0067'
        Submodule path 'lib/dss-test/lib/dss-interfaces': checked out '9bfd7afadd1f8c217ef05850b2555691786286cb'
        Submodule path 'lib/dss-test/lib/forge-std': checked out 'aea0b2685bebc883c09f5554d7fb481e85d0564d'
        Submodule path 'lib/dss-test/lib/forge-std/lib/ds-test': checked out 'cd98eff28324bfac652e63a239a60632a761790b'
    • Dependency checks
      • dss-exec-lib
        • if submodule upgrades are present make sure dss-exec-lib is synced as well
        • git submodule hash (run git submodule status) matches the latest release version or newer (NOTE: dss-exec-lib as installed locally will use GitHub code more recent than the 0.0.9 release)
      • dss-test
  • Interface Checks
    • dss-interfaces
      • used in the current spell
      • cleanup previous ones
      • ensure only single import layout is used (e.g. import "dss-interfaces/dss/VatAbstract.sol";)
    • Static Interfaces
      • ensure they match dss-interfaces (Where there is a mismatch, use cast interface as the source of truth)
      • check on-chain interface of deployed contract via cast interface <contract_address> to ensure correctness
      • interface naming style should match with Like suffix (e.g. VatLike), with some exceptions
      • ensure they only list used functions in spell code
  • Rate constants used are correct
    • Manual check 1: using make rates pct=<pct> (e.g. pct=0.75, for 0.75%)
    • Manual check 2: Compare against IPFS
    • Variable name conforms to X_PT_Y_Z_PCT_RATE (e.g. ZERO_PT_SEVEN_FIVE_PCT_RATE for 0.75%)
    • Variable visibility declared as internal
    • State mutability declared as constant
  • Constants Match
    • Precision unit constants used match their defined values
      • WAD = 10 ** 18
      • RAY = 10 ** 27
      • RAD = 10 ** 45
      • Variable visibility declared as internal
      • State mutability declared as constant
      • Ensure they match with ds-math and the Numerical Ranges
    • Math unit constants used match their defined values
      • HUNDRED = 10 ** 2
      • THOUSAND = 10 ** 3
      • MILLION = 10 ** 6
      • BILLION = 10 ** 9
      • Variable visibility declared as internal
      • State mutability declared as constant
      • Ensure they match with config
    • Timestamp constants used are correct
      • Ensure the timestamp converts to the correct date
      • Variable naming matches MONTH_DD_YYYY (e.g. MAY_01_2023 for 2023-05-01)
      • Time of day makes logical sense (i.e. 23:59:59 for the final day of something, 00:00:00 for the first day of something) in the context of timestamp usage
      • Variable visibility declared as internal
      • State mutability declared as constant
  • Deployed Contracts (not yet on chainlog or new to chainlog)
    • Verified on etherscan
    • Optimizations match Repo
    • GNU AGPLv3 license
    • Constructor args ok (e.g. vat, dai, dog, ...)
    • Wards ok (pause proxy relied, deployer denied)
      • MCD_ESM is already relied / being relied in this spell (as approved by Governance Facilitators) in order to allow de-authing the pause proxy during Emergency Shutdown, via denyProxy.
    • Matches corresponding github source code (i.e. diffcheck via vscode code --diff etherscan.sol github.sol)
    • Ensure deployer address is included into addresses_deployers.sol (to keep up to date)
  • Core System Parameter Changes
  • Debt Ceiling Changes
  • Onboarding (insert relevant checklists inline here)
  • Offboarding (Lerp mat)
    • 1st Stage Spell Actions
      • Remove Ilk from Autoline
      • Set Ilks Debt Ceilings to 0
      • Cache Ilks line to Reduce in the Global Debt Ceiling
      • Decrease Global Debt Ceiling by Total Amount of Offboarded Ilks line Cached
    • 2nd Stage Spell Actions
      • Set Ilk Liquidation Penalty chop to 0
      • Set Keeper Incentive Flat Rate tip to 0
      • Check IF chip is required to be adjusted as well
      • Use DssExecLib.linearInterpolation
        • name Format matches "XXX-A Offboarding"
        • target matches spotter
        • ilk Format matches "XXX-A"
        • what matches mat
        • startTime matches block.timestamp
        • start matches Var CURRENT_XXX_A_MAT
        • end matches Var TARGET_XXX_A_MAT (Match Exec Doc & Risk Computations)
          • Check IF Target mat Covers All Remaining Vaults CR times Risk Multiplier Factor
        • duration matches Exec Doc
  • RWA Updates
    • doc (Using the _updateDoc helper or otherwise)
      • init the RwaLiquidationOracle to reset the doc
      • Sanity Check pip must be set (not the zero address)
      • ilk follows format "RWAXXX-A"
      • val price ignored (0) if init has already been called
      • doc new legal document (IPFS HASH) matches Exec Doc
      • tau parameter used is the old tau value
    • Debt Ceiling changes (line)
      • Autoline (line) + Liquidation Oracle Price Bump (val)
        • Enable Autoline
          • ilk follows format "RWAXXX-A"
          • line (max debt ceiling)
          • gap
          • ttl
      • Debt Ceiling (line) + Liquidation Oracle Price Bump (val)
        • Increase Ilk Debt Ceiling (set DC + increase Global DC)
      • bump RwaLiquidationOracle with new computed increased price (val)
        • ensure val is set accordingly with autoline max debt ceiling (line)
        • val should enable DAI to be drawn over the loan period while taking into account the configured ink amount, interest rate and liquidation ratio (see below)
          • New val is calculated with line * [(1 + duty) ** years] * mat - rounded up - and makes sense in context of the rate mechanism. Minimum duration is usually in the Exec Doc of the spell with the RWAXXX ilk onboarding.
          • Comment explaining val formula (Debt ceiling * [ (1 + RWA stability fee ) ^ (minimum deal duration in years) ] * liquidation ratio) is present
          • Accompanying comment above bump line in format // XXM * 1.XX^X * X.XX as a WAD corresponding to the val calculation formula (e.g. // 15M * 1.03^2 * 1.00 as a WAD) is present along with the calculation formula on the line above
          • IF combining val of multiple RWA ilks being combined, val calculation is done once per ilk and added to make the total, with workings provided in code comments. The existing val value can be retrieved by calling read() on PIP_RWAXX and converting the result into decimal.
      • Poke spotter to pull in the new price
    • Soft Liquidation (tell)
      • Call RwaLiquidationOracle.tell(ilk)
      • IF RWAXX_A_INPUT_CONDUIT is an instance of TinlakeMgr (it is a Centrifuge integration)
        • Call TinlakeMgr.tell() to prevent further TIN redemptions in the Centrifuge pool.
  • Payments
    • MKR transfers
      • Recipient addresses match Exec Doc
      • Transfer values match Exec Doc
        • All values are specified with at least 2 decimals
        • Sum of all values matches Exec Doc
      • Follows archive patterns
    • DAI Surplus Buffer transfers
      • Recipient addresses match Exec Doc
      • Transfer values match Exec Doc
        • All values are specified with 2 decimals
        • Sum of all values matches Exec Doc
      • Follows previous patterns
    • Create New MKR/DAI Streams (DssVest)
      • DssVestLike interface is correct
      • Check for all streams (MKR, DAI)
        • restrict is used for each stream unless otherwise stated in the Exec Doc
        • usr (Vest recipient address) matches Exec Doc
        • tot (Total stream amount) matches Exec Doc
          • Use ether to express decimal (non-integer) values of tot
          • Where vest amount is expressed in 'per year' or similar in the Exec Doc, account for leap days
        • bgn (Vest start timestamp) matches Exec Doc
        • tau (Vest total duration) matches Exec Doc
          • tau is expressed as 'bgn - fin' (i.e. MONTH_DD_YYYY - MONTH_DD_YYYY)
          • fin (Vest end timestamp) matches Exec Doc
        • eta (Vest cliff duration) matches Exec Doc
          • If the Exec Doc does not specify a cliff date (clf), eta is 0
          • clf (Cliff end timestamp) matches Exec Doc
          • If clf <= bgn, eta is 0
          • If clf > bgn
            • eta is expressed as 'clf - bgn' (i.e. MONTH_DD_YYYY - MONTH_DD_YYYY)
        • mgr (Vest manager address) matches Exec Doc
          • If the Exec Doc does not specify a manager address, mgr is address(0)
      • Max vesting rate (cap) check (MKR, DAI)
        • 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
          • Round new cap up with 2 significant figure precision (i.e. 2446 becomes 2500)
          • Notify Governance Facilitators for addition in Exec Doc AND Exec Sheet
          • Ensure that cap change is noted in the Exec Doc
          • New cap value matches Exec Doc
      • MKR Streams (DssVestTransferrable)
        • Increase vest contract's MKR allowance by the cumulative tot (total of new MKR vest amounts)
        • Ensure allowance increase follows archive patterns
    • Terminate Existing MKR/DAI Streams (Yank)
      • Yanked stream ID matches Exec Doc
      • Use MCD_VEST_MKR_TREASURY for MKR yank
      • Use MCD_VEST_DAI for DAI yank
    • Ensure Recipient Addresses match addresses_wallets.sol
  • SubDAO Content
    • SubDAO SubProxy spell execution
      • SubDAO spell address matches Exec Doc
      • 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
      • Executed using ProxyLike(SUBDAO_PROXY).exec(SUBDAO_SPELL, abi.encodeWithSignature("execute()"));
      • Execution is NOT delegate call
      • Reviewer Note: Gas cost may be very high as SubDAO spells execute within the main cast execution. (Also note that low level call gas estimation is not done by our scripts)
    • Maker Core (main spell) SubDAO actions (i.e. operate in 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 are verified (Blocking if not true)
      • Upgradable SubDAO contracts
        • Any 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 Doc and are correct. SubDAO addresses being authed or given any permissions MUST be in the Exec Doc. 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 Doc (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)
  • External Contracts Calls (Not SubDAOs, e.g. Starknet)
    • Target Contract don't block spell execution
    • External call is NOT delegate call
    • Target Contract doesn't have permissions on the Vat
    • Target Contract doesn't do anything untoward (e.g. interacting with unsafe contracts)
    • Contracts deployed via CREATE2 (e.g. if it looks like a vanity address) do not have selfdestruct in their code
    • MCD Pause Proxy doesn't give any approvals
    • All possible actions of the Target Contract are documented
    • Target contract is not upgradable
    • Target Contract is included in the ChainLog
    • Test Coverage is comprehensive
  • ChainLog
    • Increment ChainLog version 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.++)
  • addresses_mainnet.sol matches spell code
  • Ensure every spell variable is declared as public/internal
  • Ensure immutable visibility is only used when fetching addresses from the ChainLog via DssExecLib.getChangelogAddress 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)
  • Spell actions match the corresponding Exec Doc
  • Tests
    • Ensure each spell action has sufficient test coverage
      • Decrease PSM-GUSD-A Debt Ceiling - tested in config
      • Increase Coinbase Custody (RWA014-A) Debt Ceiling - tested via dedicated test
      • Decrease WBTC-A, WBTC-B, and WBTC-C Stability Fee - tested in config
      • Smart Burn Engine Parameter Optimization - tested in config
      • Approve RWA Foundation Dao Resolution - tested in the dedicated test
      • DAI transfer to cover Andromeda Legal expenses - tested in the dedicated test
      • Cease MKR and DAI Vest Streams for Steakhouse and TechOps - tested in the dedicated test
      • Set up MKR and DAI Vest Streams for Ecosystem Facilitator - tested in the dedicated test
      • Spark Protocol Proxy-Spell - tested in the dedicated test
    • Ensure every test function is declared as public if enabled or private if disabled
    • 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
      060b9ee
    • Check all tests are passing locally using make test
      • Ensure that only ETH_RPC_URL is being used from env (i.e. no match, block or similar are active in your env)
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠒] Compiling...
No files changed, compilation skipped

Running 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1305220)
[PASS] testStarknetSpell() (gas: 2346)
Test result: ok. 2 passed; 0 failed; 0 skipped; finished in 300.36s

Running 25 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testAuth() (gas: 9223371487106115444)
[PASS] testAuthInSources() (gas: 9223371487099356762)
[PASS] testBytecodeMatches() (gas: 2706555)
[PASS] testCastCost() (gas: 1153135)
[PASS] testChainlogValues() (gas: 10099735)
[PASS] testChainlogVersionBump() (gas: 4811968)
[PASS] testContractSize() (gas: 8962)
[PASS] testDAIPayments() (gas: 1221125)
[PASS] testDaoResolutions() (gas: 13047)
[PASS] testDeployCost() (gas: 2691327)
[PASS] testFailNotScheduled() (gas: 14442)
[PASS] testFailTooEarly() (gas: 13585)
[PASS] testFailTooLate() (gas: 13562)
[PASS] testFailWrongDay() (gas: 13585)
[PASS] testGeneral() (gas: 36875198)
[PASS] testNextCastTime() (gas: 353637)
[PASS] testOnTime() (gas: 1148819)
[PASS] testPSMs() (gas: 2585454)
[PASS] testRWApriceBump() (gas: 1168652)
[PASS] testSparkSpellIsExecuted() (gas: 1152355)
[PASS] testUseEta() (gas: 352324)
[PASS] testVestDAI() (gas: 1251723)
[PASS] testVestMKR() (gas: 1242198)
[PASS] testYankDAI() (gas: 1174286)
[PASS] testYankMKR() (gas: 1267215)
Test result: ok. 25 passed; 0 failed; 0 skipped; finished in 939.41s

Ran 2 test suites: 27 tests passed, 0 failed, 0 skipped (27 total tests)

@0xdecr1pto
Copy link
Contributor

0xdecr1pto commented Nov 29, 2023

Mainnet 2023-11-29

Spell Actions (Per Exec Doc):

  • Decrease PSM-GUSD-A Debt Ceiling
    • The Debt Ceiling (line) will be set to 0.
    • The vault will be removed from the Debt Ceiling Instant Access Module (AutoLine).
  • Increase Coinbase Custody (RWA014-A) Debt Ceiling
    • The Debt Ceiling (line) will be increased by 1 billion DAI from 500 million DAI to 1.5 billion DAI.
  • Decrease WBTC-A, WBTC-B, and WBTC-C Stability Fee
    • The WBTC-A Stability Fee (SF) will be decreased by 0.07%, from 5.86% to 5.79%.
    • The WBTC-B Stability Fee (SF) will be decreased by 0.07%, from 6.36% to 6.29%.
    • The WBTC-C Stability Fee (SF) will be decreased by 0.07%, from 5.61% to 5.54%.
  • Smart Burn Engine Parameter Optimization
    • The bump (lot size) parameter will be increased by 10,000, from 20,000 to 30,000 DAI.
    • The hop (frequency) parameter will be increased by 9,460, from 6,308 to 15,768 seconds.
  • Approve RWA Foundation Dao Resolution
    • The DAO Resolution with IPFS hash QmPiEHtt8rkVtSibBXMrhEzHUmSriXWz4AL2bjscq8dUvU will be approved.
  • DAI transfer to cover Andromeda Legal expenses
    • 201,738 DAI will be transfered to 0xc4dB894A11B1eACE4CDb794d0753A3cB7A633767.
  • Cease MKR and DAI Vest Streams for Steakhouse and TechOps
    • Steakhouse DAI stream ID 19
    • TechOps DAI stream ID 18
    • Steakhouse MKR stream ID 32
    • TechOps MKR stream ID 33
  • Set up MKR and DAI Vest Streams for Ecosystem Facilitator
    • Ecosystem 2023-12-01 00:00:00 to 2024-11-30 23:59:59 504,000.00 DAI 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75
    • Ecosystem 2023-12-01 00:00:00 to 2024-11-30 23:59:59 216.00 MKR 0xFCa6e196c2ad557E64D9397e283C2AFe57344b75
  • Spark Protocol Proxy-Spell

Development Stage

  • Office Hours
    • Matches Exec Doc
  • 30 days spell expiry in constructor (block.timestamp + 30 days)
  • Exec Doc Hash
    • Search the 'Community' GitHub repo for the corresponding Exec Doc
    • Ensure Exec Doc file name follows the format Executive vote - Month DD, YYYY.md
    • Extract permanent raw Url link via Github
      https://raw.githubusercontent.com/makerdao/community/6645652102491fa254c4a165ab62d53dcf50337b/governance/votes/Executive%20vote%20-%20November%2029%2C%202023.md
    • Generate Exec Doc Hash using this URL
      • Automatically: using make exec-hash $URL
      • Manually: using cast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
        0xbd47c214fb16080be97b08f3cf5b45ca9b3d5ff7bbc2057501534e05d84823ea
  • Spell Description
    • Description follows the format TARGET_DATE MakerDAO Executive Spell | Hash: EXEC_DOC_HASH)
    • Target date in description matches the Exec Doc target date
    • Exec Doc Hash in description matches your locally generated Exec Doc Hash
    • Accompanying comment above spell description
      • Comment follows the format // Hash: cast keccak -- "$(wget 'EXEC_DOC_URL' -q -O - 2>/dev/null)"
      • Exec Doc URL in comment matches your Raw Exec Doc URL
        • does not but the contents are the same
      • Exec Doc URL in comment refers to the 'Community' GitHub repo
  • Ensure the comments inside the spell action are correct:
    • Every Section text from the Exec Sheet should be copied as comment to the spell code (above the code segment that implements the action)
      • is surrounded by the set of dashes (E.g. // ----- Section text -----)
    • Every Instruction text Exec Sheet should be:
      • copied to the spell code as // Instruction text
      • have newline above it
    • Every Reasoning URL and Authority URL from the Exec Sheet should be present under relevant section or instruction in the spell code (depending on which row the link is present)
      • Every Reasoning URL and Authority URL should 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/
    • If action in the spell doesn't have relevant instruction (e.g.: chainlog version bump), it should have explanation prefixed with // Note:
    • If an instruction can not be taken, it should have a comment under the instruction prefixed with // Note: (e.g.: // Note: Payments are skipped on goerli)
  • Local Environment Actions
    • Update Foundry by running foundryup
    • Reinstall libraries
      • Remove libraries by deleting the lib folder
      • Install libraries using git submodule update --init --recursive
        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 '4ad127cf53eeaddfb7b8ad56dd4b13e57d6a0067'
        Submodule path 'lib/dss-test/lib/dss-interfaces': checked out '9bfd7afadd1f8c217ef05850b2555691786286cb'
        Submodule path 'lib/dss-test/lib/forge-std': checked out 'aea0b2685bebc883c09f5554d7fb481e85d0564d'
        Submodule path 'lib/dss-test/lib/forge-std/lib/ds-test': checked out 'cd98eff28324bfac652e63a239a60632a761790b'
    • Dependency checks
      • dss-exec-lib
        • if submodule upgrades are present make sure dss-exec-lib is synced as well
        • git submodule hash (run git submodule status) matches the latest release version or newer (NOTE: dss-exec-lib as installed locally will use GitHub code more recent than the 0.0.9 release)
      • dss-test
  • Interface Checks
    • dss-interfaces
      • used in the current spell
      • cleanup previous ones
      • ensure only single import layout is used (e.g. import "dss-interfaces/dss/VatAbstract.sol";)
    • Static Interfaces
      • ensure they match dss-interfaces (Where there is a mismatch, use cast interface as the source of truth)
      • check on-chain interface of deployed contract via cast interface <contract_address> to ensure correctness
      • interface naming style should match with Like suffix (e.g. VatLike), with some exceptions
      • ensure they only list used functions in spell code
  • Rate constants used are correct
    • Manual check 1: using make rates pct=<pct> (e.g. pct=0.75, for 0.75%)
    • Manual check 2: Compare against IPFS
    • Variable name conforms to X_PT_Y_Z_PCT_RATE (e.g. ZERO_PT_SEVEN_FIVE_PCT_RATE for 0.75%)
    • Variable visibility declared as internal
    • State mutability declared as constant
  • Constants Match
    • Precision unit constants used match their defined values
      • WAD = 10 ** 18
      • RAY = 10 ** 27
      • Variable visibility declared as internal
      • State mutability declared as constant
      • Ensure they match with ds-math and the Numerical Ranges
    • Math unit constants used match their defined values
      • THOUSAND = 10 ** 3
      • MILLION = 10 ** 6
      • BILLION = 10 ** 9
      • Variable visibility declared as internal
      • State mutability declared as constant
      • Ensure they match with config
    • Timestamp constants used are correct
      • Ensure the timestamp converts to the correct date
      • Variable naming matches MONTH_DD_YYYY (e.g. MAY_01_2023 for 2023-05-01)
      • Time of day makes logical sense (i.e. 23:59:59 for the final day of something, 00:00:00 for the first day of something) in the context of timestamp usage
      • Variable visibility declared as internal
      • State mutability declared as constant
  • Core System Parameter Changes
    • Stability Fee jug.ilk.duty (setIlkStabilityFee)
      • WBTC-A // Decrease the WBTC-A Stability Fee (SF) by 0.07%, from 5.86% to 5.79%
      • WBTC-B // Decrease the WBTC-B Stability Fee (SF) by 0.07%, from 6.36% to 6.29%
      • WBTC-C // Decrease the WBTC-C Stability Fee (SF) by 0.07%, from 5.61% to 5.54%
    • Dai Savings Rate pot.dsr (setDSR)
      • Double check that PCT_RATE is correct
        • Check manually via make rates pct=<pct> (e.g. pct=0.75, for 0.75%)
        • Compare against IPFS
  • Debt Ceiling Changes
    • vat.ilk.line changes (per ilk)
      • Collateral type (ilk) is not RWAXXX (For RWA refer to the designated section of the checklist)
      • Either is used depending on the EXEC DOC contents:
    • vat.Line changes (Global Line)
      • alternative approach - is ok // use low lvl API to reduce global line
  • RWA Updates
    • Debt Ceiling changes (line)
      • Autoline (line) + Liquidation Oracle Price Bump (val)
        • Enable Autoline
          • ilk follows format "RWAXXX-A"
          • line (max debt ceiling)
          • gap
          • ttl
      • Debt Ceiling (line) + Liquidation Oracle Price Bump (val)
        • Increase Ilk Debt Ceiling (set DC + increase Global DC)
      • bump RwaLiquidationOracle with new computed increased price (val)
        • ensure val is set accordingly with autoline max debt ceiling (line)
        • val should enable DAI to be drawn over the loan period while taking into account the configured ink amount, interest rate and liquidation ratio (see below)
          • New val is calculated with line * [(1 + duty) ** years] * mat - rounded up - and makes sense in context of the rate mechanism. Minimum duration is usually in the Exec Doc of the spell with the RWAXXX ilk onboarding.
          • Comment explaining val formula (Debt ceiling * [ (1 + RWA stability fee ) ^ (minimum deal duration in years) ] * liquidation ratio) is present
          • Accompanying comment above bump line in format // XXM * 1.XX^X * X.XX as a WAD corresponding to the val calculation formula (e.g. // 15M * 1.03^2 * 1.00 as a WAD) is present along with the calculation formula on the line above
          • IF combining val of multiple RWA ilks being combined, val calculation is done once per ilk and added to make the total, with workings provided in code comments. The existing val value can be retrieved by calling read() on PIP_RWAXX and converting the result into decimal.
      • Poke spotter to pull in the new price
  • Payments
    • DAI Surplus Buffer transfers
      • Recipient addresses match Exec Doc
        • Transfer 201,738 Dai to 0xc4dB894A11B1eACE4CDb794d0753A3cB7A633767
      • Transfer values match Exec Doc
        • All values are specified with 2 decimals
        • Sum of all values matches Exec Doc
      • Follows previous patterns
    • Create New MKR/DAI Streams (DssVest)
      • DssVestLike interface is correct
      • Check for all streams (MKR, DAI)
        • restrict is used for each stream unless otherwise stated in the Exec Doc
        • usr (Vest recipient address) matches Exec Doc
        • tot (Total stream amount) matches Exec Doc
          • Use ether to express decimal (non-integer) values of tot
          • Where vest amount is expressed in 'per year' or similar in the Exec Doc, account for leap days
        • bgn (Vest start timestamp) matches Exec Doc
        • tau (Vest total duration) matches Exec Doc
          • tau is expressed as 'bgn - fin' (i.e. MONTH_DD_YYYY - MONTH_DD_YYYY)
          • fin (Vest end timestamp) matches Exec Doc
        • eta (Vest cliff duration) matches Exec Doc
          • If the Exec Doc does not specify a cliff date (clf), eta is 0
          • clf (Cliff end timestamp) matches Exec Doc
          • If clf <= bgn, eta is 0
          • If clf > bgn
            • eta is expressed as 'clf - bgn' (i.e. MONTH_DD_YYYY - MONTH_DD_YYYY)
        • mgr (Vest manager address) matches Exec Doc
          • If the Exec Doc does not specify a manager address, mgr is address(0)
      • Max vesting rate (cap) check (MKR, DAI)
        • 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
          • Round new cap up with 2 significant figure precision (i.e. 2446 becomes 2500)
          • Notify Governance Facilitators for addition in Exec Doc AND Exec Sheet
          • Ensure that cap change is noted in the Exec Doc
          • New cap value matches Exec Doc
      • MKR Streams (DssVestTransferrable)
        • Increase vest contract's MKR allowance by the cumulative tot (total of new MKR vest amounts)
        • Ensure allowance increase follows archive patterns
    • Terminate Existing MKR/DAI Streams (Yank)
      • Yanked stream ID matches Exec Doc
      • Use MCD_VEST_MKR_TREASURY for MKR yank
      • Use MCD_VEST_DAI for DAI yank
    • Ensure Recipient Addresses match addresses_wallets.sol
  • SubDAO Content
    • SubDAO SubProxy spell execution
      • SubDAO spell address matches Exec Doc
      • 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
      • Executed using ProxyLike(SUBDAO_PROXY).exec(SUBDAO_SPELL, abi.encodeWithSignature("execute()"));
      • Execution is NOT delegate call
      • Reviewer Note: Gas cost may be very high as SubDAO spells execute within the main cast execution. (Also note that low level call gas estimation is not done by our scripts)
    • Maker Core (main spell) SubDAO actions (i.e. operate in 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 are verified (Blocking if not true)
      • Upgradable SubDAO contracts
        • Any 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 Doc and are correct. SubDAO addresses being authed or given any permissions MUST be in the Exec Doc. 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 Doc (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)
  • addresses_mainnet.sol matches spell code
  • Ensure every spell variable is declared as public/internal
  • Ensure immutable visibility is only used when fetching addresses from the ChainLog via DssExecLib.getChangelogAddress 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)
  • Spell actions match the corresponding Exec Doc
  • Tests
    • Ensure each spell action has sufficient test coverage
      • Dao resolution - tested via test
      • Increase the RWA014-A (Coinbase Custody) debt ceiling by 1b DAI, from 500M to 1.5b - tested via test
      • Stability Fee Changes - tested in config
      • Reduce PSM-GUSD-A Debt Ceiling - tested in config
      • SBE parameter changes - tested in config
      • Andromeda Legal Expenses - tested via test
      • Trigger Spark Proxy Spell - tested via test
      • DAI transfer to cover Andromeda Legal expenses - tested via test
      • Yank MKR and DAI Vest Streams for Steakhouse and TechOps - tested via test
      • Set up MKR and DAI Vest Streams for Ecosystem Facilitator - tested via test
    • Ensure every test function is declared as public if enabled or private if disabled
    • 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
      060b9ee
    • Check all tests are passing locally using make test
      • Ensure that only ETH_RPC_URL is being used from env (i.e. no match, block or similar are active in your env)
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠘] Compiling...
[⠒] Compiling 7 files with 0.8.16
[⠑] Solc 0.8.16 finished in 4.41s
Compiler run successful

Running 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1305450)
[PASS] testStarknetSpell() (gas: 2346)
Test result: ok. 2 passed; 0 failed; finished in 41.68s

Running 25 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testAuth() (gas: 9223371487106115444)
[PASS] testAuthInSources() (gas: 9223371487099356762)
[PASS] testBytecodeMatches() (gas: 2706555)
[PASS] testCastCost() (gas: 1153365)
[PASS] testChainlogValues() (gas: 10099965)
[PASS] testChainlogVersionBump() (gas: 4812198)
[PASS] testContractSize() (gas: 8962)
[PASS] testDAIPayments() (gas: 1221815)
[PASS] testDaoResolutions() (gas: 13047)
[PASS] testDeployCost() (gas: 2691327)
[PASS] testFailNotScheduled() (gas: 14442)
[PASS] testFailTooEarly() (gas: 13585)
[PASS] testFailTooLate() (gas: 13562)
[PASS] testFailWrongDay() (gas: 13585)
[PASS] testGeneral() (gas: 36875428)
[PASS] testNextCastTime() (gas: 353637)
[PASS] testOnTime() (gas: 1149049)
[PASS] testPSMs() (gas: 2585638)
[PASS] testRWApriceBump() (gas: 1168882)
[PASS] testSparkSpellIsExecuted() (gas: 1152585)
[PASS] testUseEta() (gas: 352324)
[PASS] testVestDAI() (gas: 1251953)
[PASS] testVestMKR() (gas: 1242428)
[PASS] testYankDAI() (gas: 1174516)
[PASS] testYankMKR() (gas: 1267445)
Test result: ok. 25 passed; 0 failed; finished in 954.93s

@0xdecr1pto
Copy link
Contributor

Good to deploy!

@SidestreamColdMelon
Copy link
Contributor Author

The spell was deployed to 0x4F09EbaA1A5e52EB95c97f3b9fa3fb398D004698

I've casted it on a regular tenderly fork and also tried new tenderly DevNet feature

@0xdecr1pto
Copy link
Contributor

Deployed Stage

  • Deployed Spell is Verified
    • Optimization Enabled: No
    • Other Settings: default evmVersion, GNU AGPLv3 license
      - is london version, but is ok as per previous spell reviews.
  • Deployed Spell Code matches GitHub
    • diffcheck etherscan source against spell PR (via make diff-deployed-spell)
  • Deployed Spell Etherscan Checks
    • automated checks via make check-deployed-spell
      • verified
      • license type matches
      • solc version matches
      • optimizations are disabled
      • dss-exec-lib library address used (under 'Libraries Used') matches the hardcoded local DssExecLib.address file
        • Check again that the PR did not modify the DssExecLib.address file (e.g. look under the 'Files Changed' PR tab, etc.)
      • 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
      • 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)
  • Archive matches src
    • make diff-archive-spell for current date or or date="YYYY-MM-DD" make diff-archive-spell (date as per target Exec Doc date)
    • 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
      ef35be0
    • Check all tests are passing locally using make test
      • Ensure that only ETH_RPC_URL is being used from env (i.e. no match, block or similar are active in your env)
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠒] Compiling...
[⠃] Compiling 4 files with 0.8.16
[⠑] Solc 0.8.16 finished in 4.24s
Compiler run successful

Running 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1304875)
[PASS] testStarknetSpell() (gas: 2346)
Test result: ok. 2 passed; 0 failed; finished in 40.38s

Running 25 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testAuth() (gas: 9223371487106115444)
[PASS] testAuthInSources() (gas: 9223371487099356762)
[PASS] testBytecodeMatches() (gas: 2706555)
[PASS] testCastCost() (gas: 1152790)
[PASS] testChainlogValues() (gas: 10099390)
[PASS] testChainlogVersionBump() (gas: 4811623)
[PASS] testContractSize() (gas: 8962)
[PASS] testDAIPayments() (gas: 1220665)
[PASS] testDaoResolutions() (gas: 13047)
[PASS] testDeployCost() (gas: 2691327)
[PASS] testFailNotScheduled() (gas: 14442)
[PASS] testFailTooEarly() (gas: 13585)
[PASS] testFailTooLate() (gas: 13562)
[PASS] testFailWrongDay() (gas: 13585)
[PASS] testGeneral() (gas: 36876950)
[PASS] testNextCastTime() (gas: 353637)
[PASS] testOnTime() (gas: 1148474)
[PASS] testPSMs() (gas: 2585178)
[PASS] testRWApriceBump() (gas: 1168307)
[PASS] testSparkSpellIsExecuted() (gas: 1152010)
[PASS] testUseEta() (gas: 352324)
[PASS] testVestDAI() (gas: 1251378)
[PASS] testVestMKR() (gas: 1241853)
[PASS] testYankDAI() (gas: 1173941)
[PASS] testYankMKR() (gas: 1266870)
Test result: ok. 25 passed; 0 failed; finished in 963.30s

@0xdecr1pto
Copy link
Contributor

Good to handover

@SidestreamSweatyPumpkin
Copy link
Contributor

SidestreamSweatyPumpkin commented Nov 29, 2023

Good to handover

Deployed Stage

  • Deployed Spell is Verified
    • Optimization Enabled: No
    • Other Settings: default evmVersion, GNU AGPLv3 license
      • NOTE: london evmVersion but it's ok as per the number of recent spell deployments.
  • Deployed Spell Code matches GitHub
    • diffcheck etherscan source against spell PR (via make diff-deployed-spell)
  • Deployed Spell Etherscan Checks
    • automated checks via make check-deployed-spell
      • verified
      • license type matches
      • solc version matches
      • optimizations are disabled
      • dss-exec-lib library address used (under 'Libraries Used') matches the hardcoded local DssExecLib.address file
        • Check again that the PR did not modify the DssExecLib.address file (e.g. look under the 'Files Changed' PR tab, etc.)
      • 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
      • 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)
  • Archive matches src
    • make diff-archive-spell for current date or or date="YYYY-MM-DD" make diff-archive-spell (date as per target Exec Doc date)
    • 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
      ef35be0
    • Check all tests are passing locally using make test
      • Ensure that only ETH_RPC_URL is being used from env (i.e. no match, block or similar are active in your env)
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠒] Compiling...
[⠆] Compiling 4 files with 0.8.16
[⠘] Solc 0.8.16 finished in 1.63s
Compiler run successful!

Running 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1305220)
[PASS] testStarknetSpell() (gas: 2346)
Test result: ok. 2 passed; 0 failed; 0 skipped; finished in 30.66s

Running 25 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testAuth() (gas: 9223371487106115444)
[PASS] testAuthInSources() (gas: 9223371487099356762)
[PASS] testBytecodeMatches() (gas: 2706555)
[PASS] testCastCost() (gas: 1153135)
[PASS] testChainlogValues() (gas: 10099735)
[PASS] testChainlogVersionBump() (gas: 4811968)
[PASS] testContractSize() (gas: 8962)
[PASS] testDAIPayments() (gas: 1221355)
[PASS] testDaoResolutions() (gas: 13047)
[PASS] testDeployCost() (gas: 2691327)
[PASS] testFailNotScheduled() (gas: 14442)
[PASS] testFailTooEarly() (gas: 13585)
[PASS] testFailTooLate() (gas: 13562)
[PASS] testFailWrongDay() (gas: 13585)
[PASS] testGeneral() (gas: 36877295)
[PASS] testNextCastTime() (gas: 353637)
[PASS] testOnTime() (gas: 1148819)
[PASS] testPSMs() (gas: 2585454)
[PASS] testRWApriceBump() (gas: 1168652)
[PASS] testSparkSpellIsExecuted() (gas: 1152355)
[PASS] testUseEta() (gas: 352324)
[PASS] testVestDAI() (gas: 1251723)
[PASS] testVestMKR() (gas: 1242198)
[PASS] testYankDAI() (gas: 1174286)
[PASS] testYankMKR() (gas: 1267215)
Test result: ok. 25 passed; 0 failed; 0 skipped; finished in 1031.81s

Ran 2 test suites: 27 tests passed, 0 failed, 0 skipped (27 total tests)

Copy link
Contributor

@SidestreamSweatyPumpkin SidestreamSweatyPumpkin left a comment

Choose a reason for hiding this comment

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

  • Check that the spell address posted by the crafter in new-spells is correct
    • Confirm the address in new-spells (via a thumbs up message reaction, )
  • Ensure that no commits or changes have occurred since the spell was deployed and archived
  • Approve spell PR for merge via 'Approve' review option

@0xdecr1pto
Copy link
Contributor

  • Check that the spell address posted by the crafter in new-spells is correct
    • Confirm the address in new-spells (via a thumbs up message reaction, )
  • Ensure that no commits or changes have occurred since the spell was deployed and archived
  • Approve spell PR for merge via 'Approve' review option

@SidestreamColdMelon SidestreamColdMelon merged commit 3d6ad2b into master Nov 30, 2023
@SidestreamColdMelon SidestreamColdMelon deleted the 2023-11-29 branch November 30, 2023 07:55
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.

4 participants