Closed SidestreamIcedMango closed 6 months ago
Good to deploy:
Preparation
Dss-Cron Update Update D3MJob in the sequencer (0x238b4E35dAed6100C6162fAE4510261f88996EC9): "sequencer.removeJob(0x1Bb799509b0B039345f910dfFb71eEfAc7022323); sequencer.addJob(0x2Ea4aDE144485895B923466B4521F5ebC03a0AeF);"
Launch Funding Transfers Launch Project - 5358007 DAI - 0x3C5142F28567E6a0F172fd0BaaF1f2847f49D02F Launch Project - 1969.17 MKR - 0x3C5142F28567E6a0F172fd0BaaF1f2847f49D02F
Bug Bounty Payouts Immunefi Bounty - 5000 DAI - 0x7119f398b6C06095c6E8964C1f58e7C1BAa79E18 Bug Bounty - 50000 DAI - 0xa24EC79bdF03bB325F36878573B13AedFEd0717f
Whistle-blower Bounty Payout Compacter (Whistleblower) - 20.84 MKR - 0xbbd4bC3FE72691663c6ffE984Bcdb6C6E6b3a8Dd
Stability Scope Parameter Changes ETH-A: Decrease the Stability Fee by 2 percentage points from 10.25% to 8.25% ETH-B: Decrease the Stability Fee by 2 percentage points from 10.75% to 8.75% ETH-C: Decrease the Stability Fee by 2 percentage points from 10.00% to 8.00% WSTETH-A: Decrease the Stability Fee by 2 percentage points from 11.25% to 9.25% WSTETH-B: Decrease the Stability Fee by 2 percentage points from 11.00% to 9.00% WBTC-A: Decrease the Stability Fee by 2 percentage points from 11.75% to 9.75% WBTC-B: Decrease the Stability Fee by 2 percentage points from 12.25% to 10.25% WBTC-C: Decrease the Stability Fee by 2 percentage points from 11.50% to 9.50% DSR: Decrease the Dai Savings Rate by 2 percentage points from 10.00% to 8.00%
Delegate Compensation BLUE - 41.67 MKR - 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf Cloaky - 41.67 MKR - 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818 BONAPUBLICA - 28.23 MKR - 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3 TRUE NAME - 27.52 MKR - 0x612F7924c367575a0Edf21333D96b15F1B345A5d JuliaChang - 24.20 MKR - 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7 vigilant - 13.89 MKR - 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61 Pipkin - 13.44 MKR - 0x0E661eFE390aE39f90a58b04CF891044e56DEDB7 JAG - 7.17 MKR - 0x58D1ec57E4294E4fe650D1CB12b96AE34349556f Byteron - 6.72 MKR - 0xc2982e72D060cab2387Dba96b846acb8c96EfF66 UPMaker - 3.58 MKR - 0xbB819DF169670DC71A16F58F55956FE642cc6BcD
Spark Spell Trigger Spark Proxy Spell at 0x901E4450f01ae1A2615E384b9104888Cb9Cb02FF
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
)TARGET_DATE MakerDAO Executive Spell | Hash: EXEC_DOC_HASH
TARGET_DATE
in the description matches the 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
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
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 controlPAUSE_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
)Rely
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 updatedDssExecLib.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 Sheetilk
) 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 Sheet 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 SheetDAI
surplus buffer transfers are presentaddresses_wallets.sol
testDAIPayments
testtestDAIPayments
matches number in the Exec SheetMKR
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 Sheetusr
(Vest recipient address) matches Exec Sheetusr
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 Sheetether
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 Sheettau
is expressed as bgn - fin
(i.e. MONTH_DD_YYYY - MONTH_DD_YYYY
)fin
(Vest end timestamp) matches Exec Sheeteta
(Vest cliff duration) matches the following logiceta
is explicitly specified in the Exec Sheet, then the values matcheta
and clf
(Cliff end timestamp) are not specified in the Exec Sheet, 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 Sheet, 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)delegatecall
CREATE2
(e.g. if it looks like a vanity address) do not have selfdestruct
in their codeaddresses_mainnet.sol
testNewOrUpdatedChainlogValues
public
/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
modifiertestCronSequencerD3MJobReplaced
testMKRPayments
and testDAIPayments
testDAIPayments
testMKRPayments
testGeneral
testMKRPayments
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 110 files with Solc 0.8.16
[⠰] Solc 0.8.16 finished in 6.20s
Compiler run successful!
Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1580553)
[PASS] testStarknetSpell() (gas: 2324)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 29.10s (26.36s CPU time)
Ran 34 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 1437707)
[PASS] testCastOnTime() (gas: 1434625)
[PASS] testChainlogIntegrity() (gas: 5938426)
[PASS] testChainlogValues() (gas: 9792345)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testContractSize() (gas: 11139)
[PASS] testCronSequencerD3MJobReplaced() (gas: 1445917)
[PASS] testDAIPayments() (gas: 1491285)
[SKIP] testDaoResolutions() (gas: 0)
[PASS] testDeployCost() (gas: 2870321)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 28296221)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testMKRPayments() (gas: 1542227)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 353796)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 13444)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 2727767)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17610)
[PASS] testSparkSpellIsExecuted() (gas: 1440520)
[PASS] testUseEta() (gas: 352484)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 16 passed; 0 failed; 18 skipped; finished in 330.39s (688.34s CPU time)
Ran 2 test suites in 331.52s (359.49s CPU time): 18 tests passed, 0 failed, 18 skipped (36 total tests)
[x] Wait till the Exec Doc is merged
Exec Doc checks
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 herecast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
keccak
hash of the empty string (0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
)Authorization: Atlas Section 2.6.3
Proposal: Forum post
If this executive proposal passes, the following transfers totalling 208.09 MKR for Aligned Delegate Compensation will be made to qualifying Aligned Delegates.
Delegate | Amount (MKR) | Address |
---|---|---|
BLUE | 41.67 | 0xb6C09680D822F162449cdFB8248a7D3FC26Ec9Bf |
Cloaky | 41.67 | 0x869b6d5d8FA7f4FFdaCA4D23FFE0735c5eD1F818 |
BONAPUBLICA | 28.23 | 0x167c1a762B08D7e78dbF8f24e5C3f1Ab415021D3 |
TRUE NAME | 27.52 | 0x612F7924c367575a0Edf21333D96b15F1B345A5d |
JuliaChang | 24.20 | 0x252abAEe2F4f4b8D39E5F12b163eDFb7fac7AED7 |
vigilant | 13.89 | 0x2474937cB55500601BCCE9f4cb0A0A72Dc226F61 |
Pipkin | 13.44 | 0x0E661eFE390aE39f90a58b04CF891044e56DEDB7 |
JAG | 7.17 | 0x58D1ec57E4294E4fe650D1CB12b96AE34349556f |
Byteron | 6.72 | 0xc2982e72D060cab2387Dba96b846acb8c96EfF66 |
UPMaker | 3.58 | 0xbB819DF169670DC71A16F58F55956FE642cc6BcD |
As a bounty for the information leading to the derecognition of AD TrueName, the following transfer will be made, if this executive proposal passes:
If this executive proposal passes, as per the recommendation of the Stability Scope Advisory Council Member, BA Labs, the following SFs will be changed:
If this executive proposal passes, as per the recommendation of the Stability Scope Advisory Council Member, BA Labs, the following change to the DSR will be made:
If this executive proposal passes, the Keeper Network's D3MJob will be updated through the following contract calls:
sequencer.removeJob(0x1Bb799509b0B039345f910dfFb71eEfAc7022323)
sequencer.addJob(0x2Ea4aDE144485895B923466B4521F5ebC03a0AeF)
The updated code may be seen in this GitHub Pull Request.
If this executive proposal passes, the following tansfers will be made to the Launch Project at 0x3C5142F28567E6a0F172fd0BaaF1f2847f49D02F:
If this executive proposal passes, the following transfers will be made as part of the Bug Bounty Program:
The post-mortem for this report may be found in this forum post.
If this executive proposal passes, a Spark Proxy Spell at 0x901E4450f01ae1A2615E384b9104888Cb9Cb02FF will be triggered. It contains the following change:
Activate a new Dai Interest Rate Module to reduce the Spark Effective Dai Borrow Rate by 2 percentage points from 11% to 9%.
TLDR: good to deploy
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
)TARGET_DATE MakerDAO Executive Spell | Hash: EXEC_DOC_HASH
TARGET_DATE
in the description matches the 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
foundryup: installed - forge 0.2.0 (7469d79 2024-05-15T00:18:18.633013000Z)
foundryup: installed - cast 0.2.0 (7469d79 2024-05-15T00:18:18.644069000Z)
foundryup: installed - anvil 0.2.0 (7469d79 2024-05-15T00:18:18.602980000Z)
foundryup: installed - chisel 0.2.0 (7469d79 2024-05-15T00:18:18.619052000Z)
rm -rf ./lib && git submodule update --init --recursive
Insert checked out submodule paths here
Submodule path 'lib/dss-exec-lib': checked out '69b658f35d8618272cd139dfc18c5713caf6b96b'
Submodule path 'lib/dss-test': checked out '36ff4adbcb35760614e0d2df864026991c23d028'
dss-exec-lib
is synced as welldss-exec-lib
(run git submodule status
) matches the latest release version or newer
ℹ️ Submodule hash 69b658f35d8618272cd139dfc18c5713caf6b96b
matches latest commit from a year agodss-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
, ...)CRON_SEQUENCER
ILK_REGISTRY
DIRECT_HUB
wards
or access controlPAUSE_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
)Rely
events except for PAUSE_PROXY
and MCD_ESM
(using a block explorer like etherscan)code --diff etherscan.sol github.sol
)
ℹ️ Matches source code found in https://github.com/makerdao/dss-cron/pull/24 at the 0ed6b36d5d83bb53c99d7ede00f004e327760f8c
commit: D3MJob.sol, IJob.soladdresses_deployers.sol
ℹ️ Present as Deployer of FlapperUniv2
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%
:warning: The comments do not match exactly, but convey the same 3 numbers per ilkpot.dsr
) is updatedDssExecLib.setDSR(rate, doDrip)
) is used// Increase DSR by X.XX% from X.XX% to X.XX%
:warning: The comment does not match exactly, but conveys the same 3 numbersmake 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 updatedDssExecLib.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 Sheetilk
) 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 Sheet 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 SheetDAI
surplus buffer transfers are presentaddresses_wallets.sol
testDAIPayments
testtestDAIPayments
matches number in the Exec SheetMKR
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 Sheetusr
(Vest recipient address) matches Exec Sheetusr
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 Sheetether
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 Sheettau
is expressed as bgn - fin
(i.e. MONTH_DD_YYYY - MONTH_DD_YYYY
)fin
(Vest end timestamp) matches Exec Sheeteta
(Vest cliff duration) matches the following logiceta
is explicitly specified in the Exec Sheet, then the values matcheta
and clf
(Cliff end timestamp) are not specified in the Exec Sheet, 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 Sheet, 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)delegatecall
CREATE2
(e.g. if it looks like a vanity address) do not have selfdestruct
in their codeaddresses_mainnet.sol
testNewOrUpdatedChainlogValues
:warning: This is no longer required after the refactoring PR was merged: https://github.com/makerdao/spells-mainnet/pull/374. Now testChainlogIntegrity
and testChainlogValues
ensures that chainlog values matches addresses defined in the addresses_mainnet.sol
, that version was bumped and that number of keys matches config (did not change)public
/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
modifiertestCronSequencerD3MJobReplaced
testDAIPayments
and testMKRPayments
testDAIPayments
testMKRPayments
testGeneral
testMKRPayments
testSparkSpellIsExecuted
testChainlogIntegrity
and testChainlogValues
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 Solc 0.8.16
[⠢] Solc 0.8.16 finished in 2.07s
Compiler run successful!
Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1581471)
[PASS] testStarknetSpell() (gas: 2324)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 42.60s (36.95s CPU time)
Ran 34 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 1438625)
[PASS] testCastOnTime() (gas: 1435543)
[PASS] testChainlogIntegrity() (gas: 5939344)
[PASS] testChainlogValues() (gas: 9793263)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testContractSize() (gas: 11139)
[PASS] testCronSequencerD3MJobReplaced() (gas: 1446835)
[PASS] testDAIPayments() (gas: 1492203)
[SKIP] testDaoResolutions() (gas: 0)
[PASS] testDeployCost() (gas: 2870321)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 28297139)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testMKRPayments() (gas: 1543145)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 353796)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 13444)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 2728685)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17610)
[PASS] testSparkSpellIsExecuted() (gas: 1441438)
[PASS] testUseEta() (gas: 352484)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 16 passed; 0 failed; 18 skipped; finished in 396.83s (840.42s CPU time)
Ran 2 test suites in 397.98s (439.43s CPU time): 18 tests passed, 0 failed, 18 skipped (36 total tests)
makerdao/community
GitHub repo
ℹ️ https://github.com/makerdao/community/blob/master/governance/votes/Executive%20Vote%20-%20May%2016%2C%202024.mdExecutive 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
:warning: The script fails with date: illegal option -- d
, but it's a known problem and the hash is checked belowcast keccak -- "$(curl '$URL' -o - 2>/dev/null)"
Insert your Exec Doc Hash here
0xcdf22bbf7c42be8c09b48ce49b0365b8f061e4d674387b176d9eb9d563e706b2keccak
hash of the empty string (0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
)Reassessing after commit d11b72e, good to deploy:
IF payments are present in the spell
DAI
surplus buffer transfers are presentaddresses_wallets.sol
testDAIPayments
testtestDAIPayments
matches number in the Exec SheetTests
DssExecLib.address
file is not being modified by the spell PRpublic
skipped
modifier; OTHERWISE, it MUST have the skipped
modifiertestCronSequencerD3MJobReplaced
testMKRPayments
and testDAIPayments
testDAIPayments
testMKRPayments
testGeneral
testMKRPayments
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 Solc 0.8.16
[⠒] Solc 0.8.16 finished in 4.86s
Compiler run successful!
Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1581701)
[PASS] testStarknetSpell() (gas: 2324)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 28.97s (26.27s CPU time)
Ran 34 tests for src/DssSpell.t.sol:DssSpellTest
[SKIP] testBytecodeMatches() (gas: 0)
[PASS] testCastCost() (gas: 1438855)
[PASS] testCastOnTime() (gas: 1435773)
[PASS] testChainlogIntegrity() (gas: 5939574)
[PASS] testChainlogValues() (gas: 9793493)
[SKIP] testCollateralIntegrations() (gas: 0)
[PASS] testContractSize() (gas: 11139)
[PASS] testCronSequencerD3MJobReplaced() (gas: 1447065)
[PASS] testDAIPayments() (gas: 1492433)
[SKIP] testDaoResolutions() (gas: 0)
[PASS] testDeployCost() (gas: 2870321)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 28297369)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testMKRPayments() (gas: 1543375)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 353796)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 13444)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 2728915)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17610)
[PASS] testSparkSpellIsExecuted() (gas: 1441668)
[PASS] testUseEta() (gas: 352484)
[SKIP] testVestDAI() (gas: 0)
[SKIP] testVestMKR() (gas: 0)
[SKIP] testYankDAI() (gas: 0)
[SKIP] testYankMKR() (gas: 0)
Suite result: ok. 16 passed; 0 failed; 18 skipped; finished in 341.26s (714.04s CPU time)
Ran 2 test suites in 342.39s (370.23s CPU time): 18 tests passed, 0 failed, 18 skipped (36 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
:warning: The script says it doesn't match, but it's a known issue with the script. The value is manually checked belowdeployed_spell_block
matches deployment block number
:warning: The script says it doesn't match, but it's a known issue with the script. The value is manually checked belowmake 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 Releasec0d3c6c
made on Feb 1, 2022, while git submodule of lib/dss-exec-lib
is set to track the latest commit 69b658f
made on Jan 23, 2023 Here is the diff between the latest release and the submodule hash: https://github.com/makerdao/dss-exec-lib/compare/v0.0.9...69b658f35d8618272cd139dfc18c5713caf6b96b#diff-72201ff20380f5c7fc89281be3ad2dd6bd5a992f246d41d6d9d97f71e078d40d. The only major difference between deployed and the imported library is the new setRWAIlkDebtCeiling
, which we're not using in this spellmake 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
_Insert your local test logs here_
./scripts/test-dssspell-forge.sh no-match="" match="" block=""
Using DssExecLib at: 0x8De6DDbCd5053d32292AAA0D2105A32d108484a6
[⠊] Compiling...
[⠒] Compiling 4 files with Solc 0.8.16
[⠑] Solc 0.8.16 finished in 2.56s
Compiler run successful!
Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1580378)
[PASS] testStarknetSpell() (gas: 2324)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 37.64s (35.32s CPU time)
Ran 34 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testBytecodeMatches() (gas: 2886356)
[PASS] testCastCost() (gas: 1437532)
[PASS] testCastOnTime() (gas: 1434450)
[PASS] testChainlogIntegrity() (gas: 5938251)
[PASS] testChainlogValues() (gas: 9792170)
[SKIP] testCollateralIntegrations() (gas: 0)
[SKIP] testContractSize() (gas: 0)
[PASS] testCronSequencerD3MJobReplaced() (gas: 1445742)
[PASS] testDAIPayments() (gas: 1491110)
[SKIP] testDaoResolutions() (gas: 0)
[SKIP] testDeployCost() (gas: 0)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 28298143)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testMKRPayments() (gas: 1542052)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 353796)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 13444)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 2727592)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17610)
[PASS] testSparkSpellIsExecuted() (gas: 1440345)
[PASS] testUseEta() (gas: 352484)
[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 389.35s (893.84s CPU time)
Ran 2 test suites in 390.69s (426.99s CPU time): 17 tests passed, 0 failed, 19 skipped (36 total tests)
testBytecodeMatches
passdelegatecall
inside verified codeselfdestruct
present in the deployed codeGood 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 timestampdeployed_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"
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 108 files with Solc 0.8.16
[⠒] Solc 0.8.16 finished in 6.95s
Compiler run successful!
Ran 2 tests for src/test/starknet.t.sol:StarknetTests
[PASS] testStarknet() (gas: 1581471)
[PASS] testStarknetSpell() (gas: 2324)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 26.72s (25.05s CPU time)
Ran 34 tests for src/DssSpell.t.sol:DssSpellTest
[PASS] testBytecodeMatches() (gas: 2886356)
[PASS] testCastCost() (gas: 1438625)
[PASS] testCastOnTime() (gas: 1435543)
[PASS] testChainlogIntegrity() (gas: 5939344)
[PASS] testChainlogValues() (gas: 9793263)
[SKIP] testCollateralIntegrations() (gas: 0)
[SKIP] testContractSize() (gas: 0)
[PASS] testCronSequencerD3MJobReplaced() (gas: 1446835)
[PASS] testDAIPayments() (gas: 1492203)
[SKIP] testDaoResolutions() (gas: 0)
[SKIP] testDeployCost() (gas: 0)
[SKIP] testEsmAuth() (gas: 0)
[PASS] testGeneral() (gas: 28299236)
[SKIP] testIlkClipper() (gas: 0)
[SKIP] testL2ArbitrumSpell() (gas: 0)
[SKIP] testL2OptimismSpell() (gas: 0)
[SKIP] testLerpSurplusBuffer() (gas: 0)
[PASS] testMKRPayments() (gas: 1543145)
[SKIP] testMedianizers() (gas: 0)
[SKIP] testNewIlkRegistryValues() (gas: 0)
[PASS] testNextCastTime() (gas: 353796)
[SKIP] testOSMs() (gas: 0)
[SKIP] testOffboardings() (gas: 0)
[PASS] testOfficeHours() (gas: 13444)
[SKIP] testOracleList() (gas: 0)
[PASS] testPSMs() (gas: 2728685)
[SKIP] testRemoveChainlogValues() (gas: 0)
[PASS] testRevertIfNotScheduled() (gas: 17610)
[PASS] testSparkSpellIsExecuted() (gas: 1441438)
[PASS] testUseEta() (gas: 352484)
[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 311.48s (653.06s CPU time)
Ran 2 test suites in 312.75s (338.19s CPU time): 17 tests passed, 0 failed, 19 skipped (36 total tests)
Description
This PR implements the 2024-05-16 mainnet spell based on the relevant exec sheet
Contribution Checklist
(PE-<TICKET_NUMBER>)
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