Closed SidestreamColdMelon closed 8 months ago
makerdao/community
GitHub repoExecutive vote - Month DD, YYYY.md
TARGET_DATE
, generate Exec Doc Hash via make exec-hash date=$TARGET_DATE $URL
Insert your Exec Doc Hash here
⚠️ the scripts fails with date: illegal option -- d
, but the hash is generated in the next stepcast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
Insert your Exec Doc Hash here
0x5f259b9f850bb94dd51713ee60d6b979a9dd2a3c605286738643a7d26c173d390.8.16
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
block.timestamp + 30 days
)TARGET_DATE MakerDAO Executive Spell | Hash: EXEC_DOC_HASH
TARGET_DATE
in the description matches the Exec Doc target date// Hash: cast keccak -- "$(wget 'EXEC_DOC_URL' -q -O - 2>/dev/null)"
// ----- Section text -----
)// Instruction text
// Note:
(e.g.: // Note: Payments are skipped on goerli
)chainlog
version bump), the necessity of it is explained in the comment above prefixed with // Note:
Reasoning URL
and Authority URL
is present in the spell code under relevant section or instruction (depending on which row the url is present)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/
foundryup
rm -rf ./lib && 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 '36ff4adbcb35760614e0d2df864026991c23d028'
Submodule path 'lib/dss-test/lib/dss-interfaces': checked out '9bfd7afadd1f8c217ef05850b2555691786286cb'
Submodule path 'lib/dss-test/lib/forge-std': checked out '155d547c449afa8715f538d69454b83944117811'
Submodule path 'lib/dss-test/lib/forge-std/lib/ds-test': checked out 'e282159d5170298eb2455a6c05280ab5a73a4ef0'
dss-exec-lib
is synced as welldss-exec-lib
(run git submodule status
) matches the latest release version or newerdss-interfaces
library used inside lib/dss-exec-lib
matches submodule used inside lib/dss-test
dss-interfaces
dss-interfaces
import "dss-interfaces/dss/VatAbstract.sol";
)dss-interfaces
, OTHERWISE should be imported from therecast interface <contract_address>
commandLike
suffix (e.g. VatLike
)
WAD = 10 ** 18
RAY = 10 ** 27
RAD = 10 ** 45
internal
constant
HUNDRED = 10 ** 2
THOUSAND = 10 ** 3
MILLION = 10 ** 6
BILLION = 10 ** 9
internal
constant
make rates pct=<pct>
(e.g. pct=0.75, for 0.75%)X_PT_Y_Z_PCT_RATE
(e.g. ZERO_PT_SEVEN_FIVE_PCT_RATE
for 0.75%)internal
constant
UTC
timezoneUTC
timezoneMMM_DD_YYYY
(e.g. JAN_01_2023
for 2023-01-01)23:59:59 UTC
for the final day of something, 00:00:00 UTC
for the first day of something)internal
constant
GNU AGPLv3
licensevat
, dai
, dog
, ...)wards
or access control
PAUSE_PROXY
address was relied
(wards(PAUSE_PROXY)
is 1
)denied
(wards(deployer)
is 0
)MCD_ESM
address is already relied OR being relied
(wards(MCD_ESM)
is 1
) in this spell (as approved by Governance Facilitators, in order to allow de-authing the pause proxy during Emergency Shutdown, via denyProxy
)
❌ MCD_ESM
is not relied yetRely
events except for PAUSE_PROXY
and MCD_ESM
(using a block explorer like etherscan)code --diff etherscan.sol github. sol
)
addresses_deployers.sol
GNU AGPLv3
licensevat
, dai
, dog
, ...)
wards
or access control
PAUSE_PROXY
address was relied
(wards(PAUSE_PROXY)
is 1
)denied
(wards(deployer)
is 0
)MCD_ESM
address is already relied OR being relied
(wards(MCD_ESM)
is 1
) in this spell (as approved by Governance Facilitators, in order to allow de-authing the pause proxy during Emergency Shutdown, via denyProxy
)
❌ MCD_ESM
is not relied yetRely
events except for PAUSE_PROXY
and MCD_ESM
(using a block explorer like etherscan)code --diff etherscan.sol github. sol
)addresses_deployers.sol
GNU AGPLv3
licensevat
, dai
, dog
, ...)
wards
or access control
PAUSE_PROXY
address was relied
(wards(PAUSE_PROXY)
is 1
)denied
(wards(deployer)
is 0
)MCD_ESM
address is already relied OR being relied
(wards(MCD_ESM)
is 1
) in this spell (as approved by Governance Facilitators, in order to allow de-authing the pause proxy during Emergency Shutdown, via denyProxy
)
❌ MCD_ESM
is not relied yetRely
events except for PAUSE_PROXY
and MCD_ESM
(using a block explorer like etherscan)code --diff etherscan.sol github. sol
)addresses_deployers.sol
jug.ilk.duty
) is updatedDssExecLib.setIlkStabilityFee(ilk, rate, doDrip)
) is used// Increase ILK-A Stability Fee by X.XX% from X.XX% to X.XX%
pot.dsr
) is updatedDssExecLib.setDSR(rate, doDrip)
) is used// Increase DSR by X.XX% from X.XX% to X.XX%
make rates pct=<pct>
(e.g. pct=0.75, for 0.75%)spotter.ilk.mat
is updated, (DssExecLib.setIlkLiquidationRatio(ilk, pct_bps)
) is useddog.ilk.hole
is updated, (DssExecLib.setIlkMaxLiquidationAmount(ilk, amount)
) is usedvat.ilk.dust
is updated, (DssExecLib.setIlkMinVaultAmount(ilk, amount)
) is useddog.ilk.chop
is updated, (DssExecLib.setIlkLiquidationPenalty(ilk, pct_bps)
) is usedclip.buf
is updated, (DssExecLib.setStartingPriceMultiplicativeFactor(ilk, pct_bps)
) is usedclipperMom.clip.tolerance
is updated, (DssExecLib.setLiquidationBreakerPriceTolerance(clip, pct_bps)
) is usedclip.tail
is updated, (DssExecLib.setAuctionTimeBeforeReset(ilk, duration)
) is usedclip.cusp
is updated, (DssExecLib.setAuctionPermittedDrop(ilk, pct_bps)
) is usedclip.chip
is updated, (DssExecLib.setKeeperIncentivePercent(ilk, pct_bps)
) is usedclip.tip
is updated, (DssExecLib.setKeeperIncentiveFlatRate(ilk, amount)
) is usedcalc.tau
is updated, (DssExecLib.setLinearDecrease(calc, duration)
) is usedcalc.cut
or calc.step
are updated, DssExecLib.setStairstepExponentialDecrease(calc, duration, pct_bps)
is usedilk
) have AutoLine enabled (MCD_IAM_AUTO_LINE
)0
MCD_IAM_AUTO_LINE
) via DssExecLib.removeIlkFromAutoLine(ilk)
MCD_IAM_AUTO_LINE
) is present in the Exec Sheet0
via DssExecLib.setIlkDebtCeiling(ilk, amount)
vat.Line
) is updated accordingly, UNLESS specifically instructed not toAutoLine
parameters are updated
DssExecLib.setIlkAutoLineDebtCeiling(ilk, amount)
DssExecLib.setIlkAutoLineParameters(ilk, amount, gap, ttl)
vat.ilk.line
) is updatedilk
) have AutoLine
disabled previously or in the spellvat.Line
) is updated accordingly, UNLESS specifically instructed not to, via EITHER:global
set to true
in increaseIlkDebtCeiling
/decreaseIlkDebtCeiling
DssExecLib.setGlobalDebtCeiling(amount)
DssExecLib.increaseGlobalDebtCeiling(amount)
DssExecLib.decreaseGlobalDebtCeiling(amount)
ilk
) is removed from AutoLine (MCD_IAM_AUTO_LINE
) IF currently enabledvat.ilk.line
) is set to 0
vat.Line
) decreased by the total amount of offboarded ilkschop
) is set to 0
IF requested by governancetip
) is set to 0
IF requested by governancechip
) is set to 0
IF requested by governancehole
) is adjusted via DssExecLib.setIlkMaxLiquidationAmount(ilk, amount)
IF requested by governanceMCD_CLIP_
) is active (i.e. stopped
is 0
)spotter.ilk.mat
) being set very high in the spell (using DssExecLib.setValue(DssExecLib.spotter(), ilk, "mat", ratio)
)DssExecLib.linearInterpolation(name, target, ilk, what, startTime, start, end, duration)
)name
format matches "XXX-X Offboarding"target
matches DssExecLib.spotter()
addressilk
format matches collateral type (ilk
) name ("XXX-X"
)what
matches string "mat"
startTime
matches block.timestamp
start
uses variable CURRENT_XXX_A_MAT
start
matches current spotter.ilk.mat
valueend
uses variable TARGET_XXX_A_MAT
end
value matches the instructionend
allows liquidation of all remaining vaults (end
is bigger than collateral_type_collateralization_ratio * risk_multiplier_factor
)duration
matches the instructionDssExecLib.updateCollateralPrice(ilk)
IF collateral have no running oracle (i.e. relevant PIP_
contract have outdated zzz
value)_checkIlkClipper
helperdoc
is updated_updateDoc
helper is copied one-to-one from the archive and defined above actions
_updateDoc(ilk, doc)
is called in the spellDssExecLib.setIlkAutoLineParameters(ilk, amount, gap, ttl)
or DssExecLib.setIlkAutoLineDebtCeiling(ilk, amount)
vat.ilk.line
) update is requested by the Exec Docilk
) have AutoLine
disabled previously or in the spellvat.ilk.line
) is updated, via EITHER:vat.Line
) is updated accordingly, UNLESS specifically instructed not to, via EITHER:global
set to true
in increaseIlkDebtCeiling
/decreaseIlkDebtCeiling
DssExecLib.setGlobalDebtCeiling(amount)
DssExecLib.increaseGlobalDebtCeiling(amount)
DssExecLib.decreaseGlobalDebtCeiling(amount)
RwaLiquidationOracleLike(MIP21_LIQUIDATION_ORACLE).bump(ilk, val)
patternbump
explains val
computation via // Note: the formula is: "debt_ceiling * [ (1 + rwa_stability_fee ) ^ (minimum_deal_duration_in_years) ] * liquidation_ratio"
bump
provides locally executable formula (e.g. // bc -l <<< 'scale=18; 50000000 * e(l(1.07) * (3342/365)) * 1.00' | cast --to-wei
)debt_ceiling
in the executable formula matches new debt ceiling set in the spell or the maximum possible debt ceiling in case of the enabled AutoLinerwa_stability_fee
in the executable formula matches stability fee of the specified RWA found on chainminimum_deal_duration_in_years
in the executable formula matches number found in the Exec Doc of the spell containing relevant RWA onboardingliquidation_ratio
in the executable formula matches liquidation ratio of the specified RWA found on chainval
in the spellval
makes sense in context of the rate mechanismval
calculation is done once per ilk and added to make the total, with separate executable formulas provided in comments. The existing val
value can be retrieved by calling read()
on PIP_RWAXX
and converting the result into decimalDssExecLib.updateCollateralPrice(ilk)
.tell(ilk)
) AND debt ceiling is 0
(OR is being set to 0
in the current spell)RwaLiquidationOracle.tell(ilk)
call is presentRWAXX_A_INPUT_CONDUIT
is an instance of TinlakeMgr
(it is a Centrifuge integration), additional TinlakeMgr.tell()
call is present (in order to prevent further TIN
redemptions in the Centrifuge pool)MKR
transfers are presentaddresses_wallets.sol
ether
keywordether
keyword is used, comment is present on the same line // Note: ether is a keyword helper, only MKR is transferred here
testMKRPayments
testtestMKRPayments
matches number in the Exec DocDAI
surplus buffer transfers are presentaddresses_wallets.sol
testDAIPayments
testtestDAIPayments
matches number in the Exec DocMKR
or DAI
streams (DssVest
) are createdVestAbstract
interface is imported from dss-interfaces/dss/VestAbstract.sol
restrict
is used for each stream, UNLESS otherwise explicitly stated in the Exec Docusr
(Vest recipient address) matches Exec Docusr
address in the instruction is in the checksummed formatusr
address variable name match one found in addresses_wallets.sol
tot
(Total stream amount) matches Exec Docether
keyword is used, comment is present on the same line // Note: ether is a keyword helper, only MKR is transferred here
bgn
(Vest start timestamp) matches Exec Doctau
is expressed as bgn - fin
(i.e. MONTH_DD_YYYY - MONTH_DD_YYYY
)fin
(Vest end timestamp) matches Exec Doceta
(Vest cliff duration) matches the following logiceta
is explicitly specified in the Exec Doc, then the values matcheta
and clf
(Cliff end timestamp) are not specified in the Exec Doc, then eta
is 0
clf
is specified, but clf <= bgn
, then eta
is 0
clf
is specified and clf > bgn
, eta
is expressed as clf - bgn
(i.e. MONTH_DD_YYYY - MONTH_DD_YYYY
)mgr
(Vest manager address) is specified in the Exec Doc, matches the value, OTHERWISE matches address(0)
cap
) is enough for the new streamstot
divided by tau
) <=
the maximum vest streaming rate (cap
)tot
divided by tau
) >
the maximum vest streaming rate (cap
)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)cap
) is changed in the spelltotal
(the sum of all tot
values)testVestDAI
or testVestMKR
MKR
or DAI
vest termination (Yank
) is presentMCD_VEST_MKR_TREASURY
chainlog address is used for MKR stream yank
MCD_VEST_DAI
chainlog address is used for DAI stream yank
testYankDAI
or testYankMKR
ProxyLike(SUBDAO_PROXY).exec(SUBDAO_SPELL, abi.encodeWithSignature("execute()"));
addresses_deployers.sol
as an entryDelegateCall
context)vat
, etc. (Check comprehensively where the risk is high)PAUSE_PROXY
as their admin
(i.e. the party that can upgrade)admin
that is not PAUSE_PROXY
are not authed on any core contracts (Blocking)WardsAbstract(d3m.plan).rely(cfg.mom)
is safeplan.file("operator", operatorCfg.operator);
is safedelegatecall
CREATE2
(e.g. if it looks like a vanity address) do not have selfdestruct
in their codebytes32
value comes from and why it is neededGemAbstract gem = GemAbstract(RedeemableLike(d3m.pool).redeemable());
is safepool.file("king", aaveCfg.king);
is safedelegatecall
CREATE2
(e.g. if it looks like a vanity address) do not have selfdestruct
in their codebytes32
value comes from and why it is neededoracle.file("hub", address(hub));
is safedelegatecall
CREATE2
(e.g. if it looks like a vanity address) do not have selfdestruct
in their codebytes32
value comes from and why it is neededaddresses_mainnet.sol
testNewOrUpdatedChainlogValues
⚠️ Not done since this check was replaced in PR #374 with automatic checks within testChainlogIntegrity
and testChainlogValues
testspublic
/internal
immutable
visibility is only used when fetching addresses from the ChainLog
via DssExecLib.getChangelogAddress(key)
and constant
is used instead for static addresses
address
and wrap with Like
suffix interfaces inline (when making calls), UNLESS archive patterns permit otherwise (Such as MKR
)DssExecLib.vat()
)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)DssExecLib.address
file is not being modified by the spell PRpublic
skipped
modifier; OTHERWISE, it MUST have the skipped
modifierStability Fee Updates
via testGeneral
SparkLend D3M update
via testGeneral
D3M to Spark DAI Morpho Vault (DIRECT-SPARK-MORPHO-DAI)
via spell specific test testDirectSparkMorphoIntegration
and testGeneral
DSR Change
via testGeneral
SBE Parameter Updates
via testGeneral
Approve HVBank (RWA009-A) Dao Resolution
via testDaoResolutions
Spark Proxy Spell
via testSparkSpellIsExecuted
printenv | grep "FOUNDRY_\|DAPP_"
)make test
[PASS]
prefix.make test
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠃] Compiling...
[⠊] Compiling 5 files with 0.8.16
[⠢] Solc 0.8.16 finished in 3.22s
Compiler run successful!
Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 2119157)
[PASS] testStarknetSpell() (gas: 2324)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 49.54s (45.12s CPU time)
Ran 34 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 1981880)
[PASS] testCastOnTime() (gas: 1970729)
[PASS] testChainlogIntegrity() (gas: 7015781)
[PASS] testChainlogValues() (gas: 10298449)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testContractSize() (gas: 11117)
[SKIP] testDAIPayments() (gas: 0)
[PASS] testDaoResolutions() (gas: 13090)
[PASS] testDeployCost() (gas: 4399018)
[PASS] testDirectSparkMorphoIntegration() (gas: 3373428)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 30314876)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[SKIP] testMKRPayments() (gas: 0)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 446920)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 495684)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 3267871)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17640)
[PASS] testSparkSpellIsExecuted() (gas: 1976624)
[PASS] testUseEta() (gas: 352730)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 15 passed; 0 failed; 19 skipped; finished in 383.65s (971.90s CPU time)
Ran 2 test suites in 384.30s (433.18s CPU time): 17 tests passed, 0 failed, 19 skipped (36 total tests)
TLDR: Good to deploy
Preparation
makerdao/community
GitHub repoExecutive vote - Month DD, YYYY.md
TARGET_DATE
, generate Exec Doc Hash via make exec-hash date=$TARGET_DATE $URL
Insert your Exec Doc Hash here
⚠️ Script is not working on Maccast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
Insert your Exec Doc Hash here
0x5f259b9f850bb94dd51713ee60d6b979a9dd2a3c605286738643a7d26c173d39[x] 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 (SF) Changes
SparkLend D3M update
D3M to Spark DAI Morpho Vault (DIRECT-SPARK-MORPHO-DAI)
If this executive proposal passes, the D3M will be deployed to the Spark DAI Morpho Vault with the following parameters:
D3M DC-IAM Parameters:
Maximum Debt Ceiling (line): 100 million DAI
Target Available Debt (gap): 100 million DAI
Ceiling Increase Cooldown (ttl): 24 hours
Debt Write-off Timelock (tau) (Defines the time to elapse before debt can be written off after a D3M has been caged): 7 days
D3M Addresses:
Additional actions:
Dai Savings Rate (DSR) Change
Smart Burn Engine (SBE) Parameter Updates
Approve HVBank (RWA009-A) Dao Resolution
Trigger Spark Proxy Spell
[x] Ensure that instructions announced in the Exec Doc match instructions in the Exec Sheet
Base checks
0.8.16
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
block.timestamp + 30 days
)Spell description
TARGET_DATE MakerDAO Executive Spell | Hash: EXEC_DOC_HASH
TARGET_DATE
in the description matches the Exec Doc target date// Hash: cast keccak -- "$(wget 'EXEC_DOC_URL' -q -O - 2>/dev/null)"
Comments inside the spell
// ----- Section text -----
)// Instruction text
// Note:
(e.g.: // Note: Payments are skipped on goerli
)chainlog
version bump), the necessity of it is explained in the comment above prefixed with // Note:
Reasoning URL
and Authority URL
is present in the spell code under relevant section or instruction (depending on which row the url is present)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
foundryup
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 '36ff4adbcb35760614e0d2df864026991c23d028'
Submodule path 'lib/dss-test/lib/dss-interfaces': checked out '9bfd7afadd1f8c217ef05850b2555691786286cb'
Submodule path 'lib/dss-test/lib/forge-std': checked out '155d547c449afa8715f538d69454b83944117811'
Submodule path 'lib/dss-test/lib/forge-std/lib/ds-test': checked out 'e282159d5170298eb2455a6c05280ab5a73a4ef0'
dss-exec-lib
is synced as welldss-exec-lib
(run git submodule status
) matches the latest release version or newerdss-interfaces
library used inside lib/dss-exec-lib
matches submodule used inside lib/dss-test
IF interfaces are present in the spell
dss-interfaces
dss-interfaces
import "dss-interfaces/dss/VatAbstract.sol";
)dss-interfaces
, OTHERWISE should be imported from therecast interface <contract_address>
commandLike
suffix (e.g. VatLike
)
IF variable declarations are present in the spell
WAD = 10 ** 18
RAY = 10 ** 27
RAD = 10 ** 45
internal
constant
HUNDRED = 10 ** 2
THOUSAND = 10 ** 3
MILLION = 10 ** 6
BILLION = 10 ** 9
internal
constant
make rates pct=<pct>
(e.g. pct=0.75, for 0.75%)X_PT_Y_Z_PCT_RATE
(e.g. ZERO_PT_SEVEN_FIVE_PCT_RATE
for 0.75%)internal
constant
UTC
timezoneUTC
timezoneMMM_DD_YYYY
(e.g. JAN_01_2023
for 2023-01-01)23:59:59 UTC
for the final day of something, 00:00:00 UTC
for the first day of something)internal
constant
IF new contract is present in the spell (not yet on chainlog or new to chainlog)
DIRECT_SPARK_MORPHO_DAI_ORACLE: 0xA5AA14DEE8c8204e424A55776E53bfff413b02Af
[x] Source code is verified on etherscan
[x] Compilation optimizations match deployment settings defined in the source code repo
[x] 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
[x] Ensure PAUSE_PROXY
address was relied
(wards(PAUSE_PROXY)
is 1
)
[x] Ensure that contract deployer address was denied
(wards(deployer)
is 0
)
[ ] Ensure MCD_ESM
address is already relied OR being relied
(wards(MCD_ESM)
is 1
) in this spell (as approved by Governance Facilitators, in order to allow de-authing the pause proxy during Emergency Shutdown, via denyProxy
)
[x] Ensure that there are no other Rely
events except for PAUSE_PROXY
and MCD_ESM
(using a block explorer like etherscan)
[x] Source code matches corresponding github source code (e.g. diffcheck via vscode code --diff etherscan.sol github.sol
)
[x] Deployer address is included into addresses_deployers.sol
DIRECT_SPARK_MORPHO_DAI_PLAN: 0x374b5f915aaED790CBdd341E6f406910d648fD39
[x] Source code is verified on etherscan
[x] Compilation optimizations match deployment settings defined in the source code repo
[x] 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
[x] Ensure PAUSE_PROXY
address was relied
(wards(PAUSE_PROXY)
is 1
)
[x] Ensure that contract deployer address was denied
(wards(deployer)
is 0
)
[ ] Ensure MCD_ESM
address is already relied OR being relied
(wards(MCD_ESM)
is 1
) in this spell (as approved by Governance Facilitators, in order to allow de-authing the pause proxy during Emergency Shutdown, via denyProxy
)
[x] Ensure that there are no other Rely
events except for PAUSE_PROXY
and MCD_ESM
(using a block explorer like etherscan)
[x] Source code matches corresponding github source code (e.g. diffcheck via vscode code --diff etherscan.sol github.sol
)
[x] Deployer address is included into addresses_deployers.sol
DIRECT_SPARK_MORPHO_DAI_POOL: 0x9C259F14E5d9F35A0434cD3C4abbbcaA2f1f7f7E
[x] Source code is verified on etherscan
[x] Compilation optimizations match deployment settings defined in the source code repo
[x] 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
[x] Ensure PAUSE_PROXY
address was relied
(wards(PAUSE_PROXY)
is 1
)
[x] Ensure that contract deployer address was denied
(wards(deployer)
is 0
)
[ ] Ensure MCD_ESM
address is already relied OR being relied
(wards(MCD_ESM)
is 1
) in this spell (as approved by Governance Facilitators, in order to allow de-authing the pause proxy during Emergency Shutdown, via denyProxy
)
[x] Ensure that there are no other Rely
events except for PAUSE_PROXY
and MCD_ESM
(using a block explorer like etherscan)
[x] Source code matches corresponding github source code (e.g. diffcheck via vscode code --diff etherscan.sol github.sol
)
[x] Deployer address is included into addresses_deployers.sol
IF core system parameter changes are present in the instructions
jug.ilk.duty
) is updatedDssExecLib.setIlkStabilityFee(ilk, rate, doDrip)
) is used// Increase ILK-A Stability Fee by X.XX% from X.XX% to X.XX%
pot.dsr
) is updatedDssExecLib.setDSR(rate, doDrip)
) is used// Increase DSR by X.XX% from X.XX% to X.XX%
make rates pct=<pct>
(e.g. pct=0.75, for 0.75%)spotter.ilk.mat
is updated, (DssExecLib.setIlkLiquidationRatio(ilk, pct_bps)
) is useddog.ilk.hole
is updated, (DssExecLib.setIlkMaxLiquidationAmount(ilk, amount)
) is usedvat.ilk.dust
is updated, (DssExecLib.setIlkMinVaultAmount(ilk, amount)
) is useddog.ilk.chop
is updated, (DssExecLib.setIlkLiquidationPenalty(ilk, pct_bps)
) is usedclip.buf
is updated, (DssExecLib.setStartingPriceMultiplicativeFactor(ilk, pct_bps)
) is usedclipperMom.clip.tolerance
is updated, (DssExecLib.setLiquidationBreakerPriceTolerance(clip, pct_bps)
) is usedclip.tail
is updated, (DssExecLib.setAuctionTimeBeforeReset(ilk, duration)
) is usedclip.cusp
is updated, (DssExecLib.setAuctionPermittedDrop(ilk, pct_bps)
) is usedclip.chip
is updated, (DssExecLib.setKeeperIncentivePercent(ilk, pct_bps)
) is usedclip.tip
is updated, (DssExecLib.setKeeperIncentiveFlatRate(ilk, amount)
) is usedcalc.tau
is updated, (DssExecLib.setLinearDecrease(calc, duration)
) is usedcalc.cut
or calc.step
are updated, DssExecLib.setStairstepExponentialDecrease(calc, duration, pct_bps)
is usedIF debt ceiling changes are present in the instructions
ilk
) have AutoLine enabled (MCD_IAM_AUTO_LINE
)0
MCD_IAM_AUTO_LINE
) via DssExecLib.removeIlkFromAutoLine(ilk)
MCD_IAM_AUTO_LINE
) is present in the Exec Sheet0
via DssExecLib.setIlkDebtCeiling(ilk, amount)
vat.Line
) is updated accordingly, UNLESS specifically instructed not toAutoLine
parameters are updated
DssExecLib.setIlkAutoLineDebtCeiling(ilk, amount)
DssExecLib.setIlkAutoLineParameters(ilk, amount, gap, ttl)
vat.ilk.line
) is updatedilk
) have AutoLine
disabled previously or in the spellvat.Line
) is updated accordingly, UNLESS specifically instructed not to, via EITHER:global
set to true
in increaseIlkDebtCeiling
/decreaseIlkDebtCeiling
DssExecLib.setGlobalDebtCeiling(amount)
DssExecLib.increaseGlobalDebtCeiling(amount)
DssExecLib.decreaseGlobalDebtCeiling(amount)
IF onboarding is present
IF collateral offboarding is present in the spell
ilk
) is removed from AutoLine (MCD_IAM_AUTO_LINE
) IF currently enabledvat.ilk.line
) is set to 0
vat.Line
) decreased by the total amount of offboarded ilkschop
) is set to 0
IF requested by governancetip
) is set to 0
IF requested by governancechip
) is set to 0
IF requested by governancehole
) is adjusted via DssExecLib.setIlkMaxLiquidationAmount(ilk, amount)
IF requested by governanceMCD_CLIP_
) is active (i.e. stopped
is 0
)spotter.ilk.mat
) being set very high in the spell (using DssExecLib.setValue(DssExecLib.spotter(), ilk, "mat", ratio)
)DssExecLib.linearInterpolation(name, target, ilk, what, startTime, start, end, duration)
)name
format matches "XXX-X Offboarding"target
matches DssExecLib.spotter()
addressilk
format matches collateral type (ilk
) name ("XXX-X"
)what
matches string "mat"
startTime
matches block.timestamp
start
uses variable CURRENT_XXX_A_MAT
start
matches current spotter.ilk.mat
valueend
uses variable TARGET_XXX_A_MAT
end
value matches the instructionend
allows liquidation of all remaining vaults (end
is bigger than collateral_type_collateralization_ratio * risk_multiplier_factor
)duration
matches the instructionDssExecLib.updateCollateralPrice(ilk)
IF collateral have no running oracle (i.e. relevant PIP_
contract have outdated zzz
value)_checkIlkClipper
helperIF RWA updates are present
doc
is updated_updateDoc
helper is copied one-to-one from the archive and defined above actions
_updateDoc(ilk, doc)
is called in the spellDssExecLib.setIlkAutoLineParameters(ilk, amount, gap, ttl)
or DssExecLib.setIlkAutoLineDebtCeiling(ilk, amount)
vat.ilk.line
) update is requested by the Exec Docilk
) have AutoLine
disabled previously or in the spellvat.ilk.line
) is updated, via EITHER:DssExecLib.increaseIlkDebtCeiling(ilk, amount, global)
DssExecLib.decreaseIlkDebtCeiling(ilk, amount, global)
DssExecLib.setIlkDebtCeiling(ilk, amount)
vat.Line
) is updated accordingly, UNLESS specifically instructed not to, via EITHER:global
set to true
in increaseIlkDebtCeiling
/decreaseIlkDebtCeiling
DssExecLib.setGlobalDebtCeiling(amount)
DssExecLib.increaseGlobalDebtCeiling(amount)
DssExecLib.decreaseGlobalDebtCeiling(amount)
RwaLiquidationOracleLike(MIP21_LIQUIDATION_ORACLE).bump(ilk, val)
patternbump
explains val
computation via // Note: the formula is: "debt_ceiling * [ (1 + rwa_stability_fee ) ^ (minimum_deal_duration_in_years) ] * liquidation_ratio"
bump
provides locally executable formula (e.g. // bc -l <<< 'scale=18; 50000000 * e(l(1.07) * (3342/365)) * 1.00' | cast --to-wei
)debt_ceiling
in the executable formula matches new debt ceiling set in the spell or the maximum possible debt ceiling in case of the enabled AutoLinerwa_stability_fee
in the executable formula matches stability fee of the specified RWA found on chainminimum_deal_duration_in_years
in the executable formula matches number found in the Exec Doc of the spell containing relevant RWA onboardingliquidation_ratio
in the executable formula matches liquidation ratio of the specified RWA found on chainval
in the spellval
makes sense in context of the rate mechanismval
calculation is done once per ilk and added to make the total, with separate executable formulas provided in comments. The existing val
value can be retrieved by calling read()
on PIP_RWAXX
and converting the result into decimalDssExecLib.updateCollateralPrice(ilk)
.tell(ilk)
) AND debt ceiling is 0
(OR is being set to 0
in the current spell)RwaLiquidationOracle.tell(ilk)
call is presentRWAXX_A_INPUT_CONDUIT
is an instance of TinlakeMgr
(it is a Centrifuge integration), additional TinlakeMgr.tell()
call is present (in order to prevent further TIN
redemptions in the Centrifuge pool)IF payments are present in the spell
MKR
transfers are presentaddresses_wallets.sol
ether
keywordether
keyword is used, comment is present on the same line // Note: ether is a keyword helper, only MKR is transferred here
testMKRPayments
testtestMKRPayments
matches number in the Exec DocDAI
surplus buffer transfers are presentaddresses_wallets.sol
testDAIPayments
testtestDAIPayments
matches number in the Exec DocMKR
or DAI
streams (DssVest
) are createdVestAbstract
interface is imported from dss-interfaces/dss/VestAbstract.sol
restrict
is used for each stream, UNLESS otherwise explicitly stated in the Exec Docusr
(Vest recipient address) matches Exec Docusr
address in the instruction is in the checksummed formatusr
address variable name match one found in addresses_wallets.sol
tot
(Total stream amount) matches Exec Docether
keyword is used, comment is present on the same line // Note: ether is a keyword helper, only MKR is transferred here
bgn
(Vest start timestamp) matches Exec Doctau
is expressed as bgn - fin
(i.e. MONTH_DD_YYYY - MONTH_DD_YYYY
)fin
(Vest end timestamp) matches Exec Doceta
(Vest cliff duration) matches the following logiceta
is explicitly specified in the Exec Doc, then the values matcheta
and clf
(Cliff end timestamp) are not specified in the Exec Doc, then eta
is 0
clf
is specified, but clf <= bgn
, then eta
is 0
clf
is specified and clf > bgn
, eta
is expressed as clf - bgn
(i.e. MONTH_DD_YYYY - MONTH_DD_YYYY
)mgr
(Vest manager address) is specified in the Exec Doc, matches the value, OTHERWISE matches address(0)
cap
) is enough for the new streamstot
divided by tau
) <=
the maximum vest streaming rate (cap
)tot
divided by tau
) >
the maximum vest streaming rate (cap
)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)cap
) is changed in the spelltotal
(the sum of all tot
values)testVestDAI
or testVestMKR
MKR
or DAI
vest termination (Yank
) is presentMCD_VEST_MKR_TREASURY
chainlog address is used for MKR stream yank
MCD_VEST_DAI
chainlog address is used for DAI stream yank
testYankDAI
or testYankMKR
IF SubDAO-related content is present
ProxyLike(SUBDAO_PROXY).exec(SUBDAO_SPELL, abi.encodeWithSignature("execute()"));
addresses_deployers.sol
as an entryDelegateCall
context)vat
, etc. (Check comprehensively where the risk is high)PAUSE_PROXY
as their admin
(i.e. the party that can upgrade)admin
that is not PAUSE_PROXY
are not authed on any core contracts (Blocking)IF external contracts calls are present (Not SubDAOs, e.g. Starknet)
oracle.file("hub", address(hub));
delegatecall
CREATE2
(e.g. if it looks like a vanity address) do not have selfdestruct
in their codeWardsAbstract(d3m.plan).rely(cfg.mom);
plan.file("operator", operatorCfg.operator);
delegatecall
CREATE2
(e.g. if it looks like a vanity address) do not have selfdestruct
in their codeGemAbstract gem = GemAbstract(RedeemableLike(d3m.pool).redeemable());
delegatecall
CREATE2
(e.g. if it looks like a vanity address) do not have selfdestruct
in their codeIF spell interacts with ChainLog
addresses_mainnet.sol
testNewOrUpdatedChainlogValues
⚠️ Tested via testChainlogIntegrity()
and testChainlogValues()
instead![x] Ensure every spell variable is declared as public
/internal
[x] Ensure immutable
visibility is only used when fetching addresses from the ChainLog
via DssExecLib.getChangelogAddress(key)
and constant
is used instead for static addresses
address
and wrap with Like
suffix interfaces inline (when making calls), UNLESS archive patterns permit otherwise (Such as MKR
)DssExecLib.vat()
)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)[x] Spell actions match the corresponding Exec Doc
Tests
DssExecLib.address
file is not being modified by the spell PRpublic
skipped
modifier; OTHERWISE, it MUST have the skipped
modifiertestGeneral()
[x] SparkLend D3M update
✅ testGeneral()
[x] D3M to Spark DAI Morpho Vault (DIRECT-SPARK-MORPHO-DAI)
✅ testGetestDirectSparkMorphoIntegrationneral()
and testDirectSparkMorphoCage()
[x] DSR Change
✅ testGeneral()
[x] SBE Parameter Updates
✅ testGeneral()
[x] Approve HVBank (RWA009-A) Dao Resolution
✅ testDaoResolutions()
[x] Spark Proxy Spell
✅ testSparkSpellIsExecuted()
printenv | grep "FOUNDRY_\|DAPP_"
)make test
[PASS]
prefix._Insert your local test logs here_
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠰] Compiling...
[⠘] Compiling 5 files with 0.8.16
[⠒] Solc 0.8.16 finished in 5.45s
Compiler run successful!
Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 2119157)
[PASS] testStarknetSpell() (gas: 2324)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 47.72s (43.49s CPU time)
Ran 34 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 1981880)
[PASS] testCastOnTime() (gas: 1970729)
[PASS] testChainlogIntegrity() (gas: 7015781)
[PASS] testChainlogValues() (gas: 10298449)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testContractSize() (gas: 11117)
[SKIP] testDAIPayments() (gas: 0)
[PASS] testDaoResolutions() (gas: 13090)
[PASS] testDeployCost() (gas: 4399018)
[PASS] testDirectSparkMorphoIntegration() (gas: 3373428)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 30314876)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[SKIP] testMKRPayments() (gas: 0)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 446920)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 495684)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 3267871)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17640)
[PASS] testSparkSpellIsExecuted() (gas: 1976624)
[PASS] testUseEta() (gas: 352730)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 15 passed; 0 failed; 19 skipped; finished in 378.09s (878.28s CPU time)
Ran 2 test suites in 379.21s (425.81s CPU time): 17 tests passed, 0 failed, 19 skipped (36 total tests)
Ran 35 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 1981708)
[PASS] testCastOnTime() (gas: 1970557)
[PASS] testChainlogIntegrity() (gas: 7015609)
[PASS] testChainlogValues() (gas: 10298277)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testContractSize() (gas: 11117)
[SKIP] testDAIPayments() (gas: 0)
[PASS] testDaoResolutions() (gas: 13090)
[PASS] testDeployCost() (gas: 4399018)
[PASS] testDirectSparkMorphoCage() (gas: 3421847)
[PASS] testDirectSparkMorphoIntegration() (gas: 3373256)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 30314704)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[SKIP] testMKRPayments() (gas: 0)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 446920)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 495684)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 3267699)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17640)
[PASS] testSparkSpellIsExecuted() (gas: 1976452)
[PASS] testUseEta() (gas: 352730)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 16 passed; 0 failed; 19 skipped; finished in 471.94s (1009.96s CPU time)
Good to deploy 👍
The spell is deployed to https://etherscan.io/address/0xcD672aCc9885796a19b4bAf03Dba46c8cdB0882B#code Created Tenderly testnet: https://dashboard.tenderly.co/explorer/vnet/83e8d6a8-9567-45de-9041-8f68b880930f
false
UNLESS the contract size is too big AND all mitigation strategies (i.e.: removing revert strings) have failedmake diff-deployed-spell
or manually)DssExecLib
code is replaced, checked also manually and it matches!make check-deployed-spell
DssExecLib.address
filedeployed_spell_created
matches deployment timestamp
deployed_spell_block
matches deployment block number
make deploy-info tx=<tx>
matches config
deployed_spell_created
timestampdeployed_spell_block
block numberDssExecLib.address
file (e.g. look under the 'Files Changed' PR tab, etc.)Libraries Used
matches DssExecLib Latest Releasemake diff-archive-spell
for current date or make diff-archive-spell date="YYYY-MM-DD"
Tests
DssExecLib.address
file is not being modified by the spell PRprintenv | grep "FOUNDRY_\|DAPP_"
)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 0.8.16
[⠔] Solc 0.8.16 finished in 4.93s
Compiler run successful!
Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 2117894)
[PASS] testStarknetSpell() (gas: 2324)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 55.33s (51.89s CPU time)
Ran 35 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testBytecodeMatches() (gas: 4419337)
[PASS] testCastCost() (gas: 1980617)
[PASS] testCastOnTime() (gas: 1969466)
[PASS] testChainlogIntegrity() (gas: 7014518)
[PASS] testChainlogValues() (gas: 10297186)
[SKIP] testCollateralIntegrations() (gas: 0)
[SKIP] testContractSize() (gas: 0)
[SKIP] testDAIPayments() (gas: 0)
[PASS] testDaoResolutions() (gas: 13090)
[SKIP] testDeployCost() (gas: 0)
[PASS] testDirectSparkMorphoCage() (gas: 3420756)
[PASS] testDirectSparkMorphoIntegration() (gas: 3372165)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 30315710)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[SKIP] testMKRPayments() (gas: 0)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 446920)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 495684)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 3266608)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17640)
[PASS] testSparkSpellIsExecuted() (gas: 1975361)
[PASS] testUseEta() (gas: 352730)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 15 passed; 0 failed; 20 skipped; finished in 426.76s (1113.89s CPU time)
Ran 2 test suites in 427.55s (482.09s CPU time): 17 tests passed, 0 failed, 20 skipped (37 total tests)
tldr: good to handover :)
false
UNLESS the contract size is too big AND all mitigation strategies (i.e.: removing revert strings) have failedmake diff-deployed-spell
or manually)make check-deployed-spell
DssExecLib.address
filedeployed_spell_created
matches deployment timestamp
⚠️ DssSpell deployment timestamp does not match, but manual check passesdeployed_spell_block
matches deployment block number
⚠️DssSpell deployment block number does not match, but manual check passesmake deploy-info tx=<tx>
matches config
deployed_spell_created
timestampdeployed_spell_block
block numberDssExecLib.address
file (e.g. look under the 'Files Changed' PR tab, etc.)Libraries Used
matches DssExecLib Latest Releasemake diff-archive-spell
for current date or make diff-archive-spell date="YYYY-MM-DD"
DssExecLib.address
file is not being modified by the spell PRprintenv | grep "FOUNDRY_\|DAPP_"
)make test
Ran 35 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testBytecodeMatches() (gas: 4419337)
[PASS] testCastCost() (gas: 1981248)
[PASS] testCastOnTime() (gas: 1970097)
[PASS] testChainlogIntegrity() (gas: 7015149)
[PASS] testChainlogValues() (gas: 10297817)
[SKIP] testCollateralIntegrations() (gas: 0)
[SKIP] testContractSize() (gas: 0)
[SKIP] testDAIPayments() (gas: 0)
[PASS] testDaoResolutions() (gas: 13090)
[SKIP] testDeployCost() (gas: 0)
[PASS] testDirectSparkMorphoCage() (gas: 3421387)
[PASS] testDirectSparkMorphoIntegration() (gas: 3372796)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 30316341)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[SKIP] testMKRPayments() (gas: 0)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 446920)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 495684)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 3267239)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17640)
[PASS] testSparkSpellIsExecuted() (gas: 1975992)
[PASS] testUseEta() (gas: 352730)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 15 passed; 0 failed; 20 skipped; finished in 484.17s (1258.18s CPU time)
new-spells
is correctnew-spells
channel (via a separate "reply to" message, restating the address to avoid edits)
new-spells
new-spells
is correctnew-spells
channel (via a separate "reply to" message, restating the address to avoid edits)
new-spells
Description
This PR implements 2024-03-20 mainnet spell according to the relevant executive sheet
Contribution Checklist
Checklist
officeHours
modifier override30 days
unless otherwise specified)ETH_GAS_LIMIT="XXX" ETH_GAS_PRICE="YYY" make deploy
mainnet
contract on etherscanmake archive-spell
ormake date="YYYY-MM-DD" archive-spell
to make an archive directory and copyDssSpell.sol
,DssSpell.t.sol
,DssSpell.t.base.sol
, andDssSpellCollateralOnboarding.sol
squash and merge
this PR