When emergency migrating the underlying MoneyShelf to the MoneyVault, in a rather unfortunate twist, the USDC is left behind in the MoneyShelf contract and not moved.
Being good at extortion is not traditionally a correlated indicator that one is good at coding blockchain frameworks. There is a lack of understanding of the underlying Default framework for managing modules. Not only does the code-base not rely on interfaces for modules and interchangeable contracts throughout the codebase, it also doesn't have a mechanism to do any of the moving activities of assets from old module to new module, and doesn't even leverage the existing INIT function for the new MoneyVault module.
When doing the EmergencyMigration all the USDC associated with MoneyShelf is left with MoneyShelf, leaving the GodFather unable to remove the USDC that isn't there in the MoneyVault. This is only really the start of the woes for our soon to be very angry GodFather.
A test has been added to demonstrate this
When modules are upgraded, the internal pointers are all updated and in theory all relevant Policies notified. What is needed is a mechanism to transfer all the assets stored in the old module to the new one (and metadata if that was needed). A few other changes are needed to fully fix this but the main one is the USDC. Much as I wouldn't want to mess with the Default framework, it does seem to lack a Module TERMINATE(address _newModule) function which would allow an old module to transfer any assets to its upgrade. This could be then called in the Kernel _upgradeModule function alongside the INIT() of the new function, all gated with onlyKernel()
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.