Summary
Overall, we consider the spell to be ready for deployment and safe.
Deployment verification
[Ethereum] Onboard the Diamond PAU Controller on the new Grove allocator instance
Diamond PAU
- ALMProxy matches with diamond-pau v1.13.0
- Controller matches with diamond-pau v1.13.0
- RateLimits matches with diamond-pau v1.13.0
- AccessControls matches with diamond-pau v1.13.0
- Beacon matches with diamond-pau v1.13.0
- PAUFactory matches with diamond-pau v1.13.0
- BasinFacet matches with diamond-pau v1.13.0
- USDSFacet matches with diamond-pau v1.13.0
- PSMFacet matches with diamond-pau v1.13.0
- Note: All contracts match. Their executable bytecode (creation and runtime) is identical to a local build of the tagged source. The only difference is the contract metadata hash, which does not affect execution and differs only because the deployer’s build included an extra dependency (
lib/nfat) that the repository does not declare.
PAU Administered Agent
- AdministeredAgent matches with pau-administered-agent v1.0.0
- Note: The contract matches. Their executable bytecode (creation and runtime) is identical to a local build of the tagged source. The only difference is the contract metadata hash, which does not affect execution and differs only because the deployer compiled this contract as a submodule of the parent repo, so every source path carries a
lib/pau-administered-agent/prefix.
PAU Assembler
- DefaultPAUAssembler matches with pau-assemblers v1.0.0
- Note: The contract matches. Its executable runtime bytecode is identical to a local build of the tagged source. The only difference is the metadata hash, which does not affect execution. The deployed version was built before the audit comment fixes (
d7d6f084604d4f7e45879a3b15d03ee870231467) and so does not include them.
Allocator
- AllocatorBuffer matches with dss-allocator @ 6e99d87
- AllocatorVault matches with dss-allocator @ 6e99d87
Wiring setup
- Wired selectors:
usds_VERSION()->VERSION()usds_usds()->usds()usds_setVault(address)->setVault(address)usds_mint(uint256)->mint(uint256)usds_burn(uint256)->burn(uint256)usds_vault()->vault()usds_mintRateLimitKey()->mintRateLimitKey()usds_burnRateLimitKey()->burnRateLimitKey()
- All operational functions are wired correctly.
- Note: the
DEFAULT_ADMIN_ROLE()andALLOCATOR_ROLE()ABI functions are not wired.
- Wired selectors:
psm_VERSION()->VERSION()psm_dai()->dai()psm_daiUSDS()->daiUSDS()psm_psm()->psm()psm_usdc()->usdc()psm_usds()->usds()psm_swapUSDSToUSDC(uint256)->swapUSDSToUSDC(uint256)psm_swapUSDCToUSDS(uint256)->swapUSDCToUSDS(uint256)psm_to18ConversionFactor()->to18ConversionFactor()psm_usdcToUSDSSwapRateLimitKey()->usdcToUSDSSwapRateLimitKey()psm_usdsToUSDCSwapRateLimitKey()->usdsToUSDCSwapRateLimitKey()
- All operational functions are wired correctly.
- Note: the
DEFAULT_ADMIN_ROLE()andALLOCATOR_ROLE()ABI functions are not wired.
- Wired selectors:
basin_VERSION()->VERSION()basin_deposit(address,address,uint256,uint256)->deposit(address,address,uint256,uint256)basin_withdraw(address,address,uint256,uint256)->withdraw(address,address,uint256,uint256)basin_getDepositRateLimitKey(address,address)->getDepositRateLimitKey(address,address)basin_getWithdrawRateLimitKey(address,address)->getWithdrawRateLimitKey(address,address)
- All operational functions are wired correctly.
- Note: the
DEFAULT_ADMIN_ROLE()andALLOCATOR_ROLE()ABI functions are not wired.
Roles setup
DEFAULT_ADMIN_ROLE-> Ethereum.GROVE_PROXYALLOCATOR_ROLE-> AdministeredAgent- All roles assigned correctly, no other roles granted
DEFAULT_ADMIN_ROLE-> Ethereum.GROVE_PROXYCONTROLLER-> Controller- All roles assigned correctly, no other roles granted
DEFAULT_ADMIN_ROLE-> Ethereum.GROVE_PROXYCONTROLLER-> Controller- All roles assigned correctly, no other roles granted
admin-> Ethereum.GROVE_PROXYactor-> Ethereum.ALM_RELAYERactor-> Ethereum.GROVE_PRIMARY_RELAYER_OPERATORactor-> Ethereum.GROVE_SECONDARY_RELAYER_OPERATORrevoker-> Ethereum.ALM_FREEZERgrantor-> none- All roles assigned correctly, no other roles granted
DEFAULT_ADMIN_ROLE-> Ethereum.PAUSE_PROXY- All roles assigned correctly, no other roles granted
Configuration
Set before the spell
proxy()-> ALMProxyrateLimits()-> RateLimitsaccessControls()-> AccessControlsbeacon()-> Beaconusds_usds()-> Ethereum.USDSpsm_dai()-> Ethereum.DAIpsm_daiUSDS()-> Ethereum.DAI_USDSpsm_psm()-> Ethereum.PSMpsm_usdc()-> Ethereum.USDCpsm_usds()-> Ethereum.USDS
roles-> Ethereum.ALLOCATOR_ROLESbuffer-> AllocatorBuffervat-> Ethereum.VATilk->ALLOCATOR-GROVE-AusdsJoin-> UsdsJoinusds-> Ethereum.USDSjug-> MCD_JUG (set by June 18 spell)wards-> Ethereum.GROVE_PROXY (set by June 18 spell)
wards-> Ethereum.GROVE_PROXY (set by June 18 spell)- USDS
allowance[AllocatorVault]= type(uint256).max - USDS
allowance[ALMProxy]= 0
Set by the spell
usds_vault()-> AllocatorVault
wards-> ALMProxy (added, Ethereum.GROVE_PROXY retained)
- USDS
allowance[ALMProxy]= type(uint256).max
LIMIT_USDS_MINT= 5,000,000e18, slope= 5,000,000e18 / 1 daysLIMIT_USDS_BURN= 5,000,000e18, slope= 5,000,000e18 / 1 daysLIMIT_USDS_TO_USDC= 5,000,000e6, slope= 5,000,000e6 / 1 daysLIMIT_USDC_TO_USDS= 5,000,000e6, slope= 5,000,000e6 / 1 daysLIMIT_BASIN_DEPOSIT(USDS, JTRSY basin)= 5,000,000e18, slope= 5,000,000e18 / 1 daysLIMIT_BASIN_WITHDRAW(USDS, JTRSY basin)= unlimitedLIMIT_BASIN_WITHDRAW(USDC, JTRSY basin)= unlimitedLIMIT_BASIN_DEPOSIT(USDS, BUIDL basin)= 5,000,000e18, slope= 5,000,000e18 / 1 daysLIMIT_BASIN_WITHDRAW(USDS, BUIDL basin)= unlimitedLIMIT_BASIN_WITHDRAW(USDC, BUIDL basin)= unlimited
[Ethereum] Onboard the Tokenized Treasury Instances (Basin: JTRSY + BUIDL)
JTRSY
- GroveBasin matches with grove-basin v1.0.0
- UsdsUsdcPocket matches with grove-basin v1.0.0
- JTRSYTokenRedeemer matches with grove-basin v1.0.0
BUIDL
- GroveBasin matches with grove-basin v1.0.0
- UsdsUsdcPocket matches with grove-basin v1.0.0
- BUIDLTokenRedeemer matches with grove-basin v1.0.0
Rate providers
- FixedRateProvider matches with grove-basin v1.0.0
- ChronicleRateProvider (JTRSY
creditToken) matches with grove-basin v1.0.0 - ChronicleRateProvider (BUIDL
creditToken) matches with grove-basin v1.0.0
Configuration
JTRSY:
collateralToken-> USDCcollateralTokenRateProvider-> FixedRateProvidercreditToken-> JTRSYcreditTokenRateProvider-> ChronicleRateProviderliquidityProvider-> ALMProxypocket-> UsdsUsdcPocketswapToken-> USDSswapTokenRateProvider-> FixedRateProvider
BUIDL:
collateralToken-> USDCcollateralTokenRateProvider-> FixedRateProvidercreditToken-> BUIDLcreditTokenRateProvider-> ChronicleRateProviderliquidityProvider-> ALMProxypocket-> UsdsUsdcPocketswapToken-> USDSswapTokenRateProvider-> FixedRateProvider
Roles setup
JTRSY:
OWNER_ROLE-> TimelockControllerMANAGER_ADMIN_ROLE-> Ethereum.GROVE_PROXYREDEEMER_CONTRACT_ROLE-> JTRSYTokenRedeemerREDEEMER_ROLE-> SafeProxy, matches the proposalPAUSER_ROLE-> Ethereum.ALM_FREEZERMANAGER_ROLE-> Ethereum.ALM_RELAYER
BUIDL:
OWNER_ROLE-> TimelockControllerMANAGER_ADMIN_ROLE-> Ethereum.GROVE_PROXYREDEEMER_CONTRACT_ROLE-> BUIDLTokenRedeemerREDEEMER_ROLE-> 0x488F27168a19472c51f003fbC5b75B1ACc3B7b4c, matches the proposalPAUSER_ROLE-> Ethereum.ALM_FREEZERMANAGER_ROLE-> Ethereum.ALM_RELAYER
[Ethereum] Swap USDC to USDS in Grove SubProxy
- Token: Ethereum.USDC
- Swap amount:
1_102_056_359999USDC - Covered by tests:
GroveEthereum_20260702_Test.test_ETHEREUM_swapUsdcToUsdsViaPsm()GroveEthereum_20260702_Test.test_ETHEREUM_subProxyUsdsNetDelta()
[Ethereum] Treasury Distribution — 800,000 USDS to the Grove Foundation Multisig
- Token: Ethereum.USDS
- Destination address: Ethereum.GROVE_FOUNDATION
- Amount:
800,000USDS - Covered by tests:
GroveEthereum_20260702_Test.test_ETHEREUM_treasuryDistributionToGroveFoundation()GroveEthereum_20260702_Test.test_ETHEREUM_subProxyUsdsNetDelta()