// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import {Assertion} from "../lib/credible-std/Assertion.sol";
interface ILendingPoolAddressesProvider {
function owner() external view returns (address);
function getEmergencyAdmin() external view returns (address);
function getPoolAdmin() external view returns (address);
}
// Radiant Lending Pool on Arbitrum that got hacked and drained
contract LendingPoolAddressesProviderAssertions is Assertion {
ILendingPoolAddressesProvider public lendingPoolAddressesProvider =
ILendingPoolAddressesProvider(0x091d52CacE1edc5527C99cDCFA6937C1635330E4); //arbitrum
function triggers() external view override {
// Trigger on any storage change to catch ownership modifications
registerStorageChangeTrigger(this.assertionOwnerChange.selector);
registerStorageChangeTrigger(this.assertionEmergencyAdminChange.selector);
registerStorageChangeTrigger(this.assertionPoolAdminChange.selector);
}
// Check if the owner has changed
function assertionOwnerChange() external view {
ph.forkPreTx();
address prevOwner = lendingPoolAddressesProvider.owner();
ph.forkPostTx();
address newOwner = lendingPoolAddressesProvider.owner();
require(prevOwner == newOwner, "Owner has changed");
}
// Check if the emergency admin has changed
function assertionEmergencyAdminChange() external view {
ph.forkPreTx();
address prevEmergencyAdmin = lendingPoolAddressesProvider.getEmergencyAdmin();
ph.forkPostTx();
address newEmergencyAdmin = lendingPoolAddressesProvider.getEmergencyAdmin();
require(prevEmergencyAdmin == newEmergencyAdmin, "Emergency admin has changed");
}
// Check if the pool admin has changed
function assertionPoolAdminChange() external view {
ph.forkPreTx();
address prevPoolAdmin = lendingPoolAddressesProvider.getPoolAdmin();
ph.forkPostTx();
address newPoolAdmin = lendingPoolAddressesProvider.getPoolAdmin();
require(prevPoolAdmin == newPoolAdmin, "Pool admin has changed");
}
}