This commit is contained in:
The3D 2020-11-10 14:57:09 +01:00
parent ee1e20568b
commit c81047ca93
3 changed files with 61 additions and 35 deletions

View File

@ -28,24 +28,30 @@ contract LendingPoolAddressesProvider is Ownable, ILendingPoolAddressesProvider
bytes32 private constant LENDING_RATE_ORACLE = 'LENDING_RATE_ORACLE'; bytes32 private constant LENDING_RATE_ORACLE = 'LENDING_RATE_ORACLE';
/** /**
* @dev Sets an address for an id, allowing to cover it or not with a proxy * @dev Sets an address for an id by updating a proxy implementation
* @param id The id * @param id The id
* @param newAddress The address to set, pass address(0) if a proxy is needed
* @param implementationAddress The address of the implementation if we want it covered by a proxy * @param implementationAddress The address of the implementation if we want it covered by a proxy
* address(0) if we don't want a proxy covering * address(0) if we don't want a proxy covering
*/ */
function setAddress( function setAddressAsProxy(
bytes32 id, bytes32 id,
address newAddress,
address implementationAddress address implementationAddress
) external override onlyOwner { ) external override onlyOwner {
if (implementationAddress != address(0)) { _updateImpl(id, implementationAddress);
_updateImpl(id, implementationAddress); emit AddressSet(id, implementationAddress, true);
emit AddressSet(id, implementationAddress, true); }
} else {
_addresses[id] = newAddress; /**
emit AddressSet(id, newAddress, false); * @dev Sets an address for an id replacing the address saved in the addresses map
} * @param id The id
* @param newAddress The address to set, pass address(0) if a proxy is needed
*/
function setAddress(
bytes32 id,
address newAddress
) external override onlyOwner {
_addresses[id] = newAddress;
emit AddressSet(id, newAddress, false);
} }
/** /**

View File

@ -20,7 +20,11 @@ interface ILendingPoolAddressesProvider {
function setAddress( function setAddress(
bytes32 id, bytes32 id,
address newAddress, address newAddress
) external;
function setAddressAsProxy(
bytes32 id,
address impl address impl
) external; ) external;

View File

@ -31,28 +31,61 @@ makeSuite('LendingPoolAddressesProvider', (testEnv: TestEnv) => {
await expect( await expect(
addressesProvider.setAddress( addressesProvider.setAddress(
utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')), utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')),
mockAddress, mockAddress
ZERO_ADDRESS
) )
).to.be.revertedWith(INVALID_OWNER_REVERT_MSG); ).to.be.revertedWith(INVALID_OWNER_REVERT_MSG);
await expect(
addressesProvider.setAddressAsProxy(
utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')),
mockAddress
)
).to.be.revertedWith(INVALID_OWNER_REVERT_MSG);
}); });
it('Tests adding both a proxied and non-proxied addres with `setAddress()`', async () => { it('Tests adding a proxied address with `setAddressAsProxy()`', async () => {
const {addressesProvider, users} = testEnv; const {addressesProvider, users} = testEnv;
const {INVALID_OWNER_REVERT_MSG} = ProtocolErrors; const {INVALID_OWNER_REVERT_MSG} = ProtocolErrors;
const currentAddressesProviderOwner = users[1]; const currentAddressesProviderOwner = users[1];
const mockNonProxiedAddress = createRandomAddress();
const nonProxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_NON_PROXIED'));
const mockLendingPool = await deployLendingPool(); const mockLendingPool = await deployLendingPool();
const proxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_PROXIED')); const proxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_PROXIED'));
const proxiedAddressSetReceipt = await waitForTx(
await addressesProvider
.connect(currentAddressesProviderOwner.signer)
.setAddressAsProxy(proxiedAddressId, mockLendingPool.address)
);
if (!proxiedAddressSetReceipt.events || proxiedAddressSetReceipt.events?.length < 1) {
throw new Error('INVALID_EVENT_EMMITED');
}
expect(proxiedAddressSetReceipt.events[0].event).to.be.equal('ProxyCreated');
expect(proxiedAddressSetReceipt.events[1].event).to.be.equal('AddressSet');
expect(proxiedAddressSetReceipt.events[1].args?.id).to.be.equal(proxiedAddressId);
expect(proxiedAddressSetReceipt.events[1].args?.newAddress).to.be.equal(
mockLendingPool.address
);
expect(proxiedAddressSetReceipt.events[1].args?.hasProxy).to.be.equal(true);
});
it('Tests adding a non proxied address with `setAddress()`', async () => {
const {addressesProvider, users} = testEnv;
const {INVALID_OWNER_REVERT_MSG} = ProtocolErrors;
const currentAddressesProviderOwner = users[1];
const mockNonProxiedAddress = createRandomAddress();
const nonProxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_NON_PROXIED'));
const nonProxiedAddressSetReceipt = await waitForTx( const nonProxiedAddressSetReceipt = await waitForTx(
await addressesProvider await addressesProvider
.connect(currentAddressesProviderOwner.signer) .connect(currentAddressesProviderOwner.signer)
.setAddress(nonProxiedAddressId, mockNonProxiedAddress, ZERO_ADDRESS) .setAddress(nonProxiedAddressId, mockNonProxiedAddress)
); );
expect(mockNonProxiedAddress.toLowerCase()).to.be.equal( expect(mockNonProxiedAddress.toLowerCase()).to.be.equal(
@ -70,22 +103,5 @@ makeSuite('LendingPoolAddressesProvider', (testEnv: TestEnv) => {
); );
expect(nonProxiedAddressSetReceipt.events[0].args?.hasProxy).to.be.equal(false); expect(nonProxiedAddressSetReceipt.events[0].args?.hasProxy).to.be.equal(false);
const proxiedAddressSetReceipt = await waitForTx(
await addressesProvider
.connect(currentAddressesProviderOwner.signer)
.setAddress(proxiedAddressId, ZERO_ADDRESS, mockLendingPool.address)
);
if (!proxiedAddressSetReceipt.events || proxiedAddressSetReceipt.events?.length < 2) {
throw new Error('INVALID_EVENT_EMMITED');
}
expect(proxiedAddressSetReceipt.events[0].event).to.be.equal('ProxyCreated');
expect(proxiedAddressSetReceipt.events[1].event).to.be.equal('AddressSet');
expect(proxiedAddressSetReceipt.events[1].args?.id).to.be.equal(proxiedAddressId);
expect(proxiedAddressSetReceipt.events[1].args?.newAddress).to.be.equal(
mockLendingPool.address
);
expect(proxiedAddressSetReceipt.events[1].args?.hasProxy).to.be.equal(true);
}); });
}); });