Skip to content

Commit

Permalink
Increase coverage and add events rebalancer (#548)
Browse files Browse the repository at this point in the history
## Motivation
Test coverage was horrible, this PR cleans up a lot of tech debt
  • Loading branch information
RensR authored Feb 23, 2024
1 parent f1b67e0 commit 25bd13e
Show file tree
Hide file tree
Showing 9 changed files with 671 additions and 93 deletions.
25 changes: 18 additions & 7 deletions contracts/gas-snapshots/rebalancer.gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,27 @@ OCR3Base_setOCR3Config:testSignerCannotBeZeroAddressReverts() (gas: 23717)
OCR3Base_setOCR3Config:testTooManySignersReverts() (gas: 19838)
OCR3Base_setOCR3Config:testTransmitterCannotBeZeroAddressReverts() (gas: 46567)
OCR3Base_transmit:testConfigDigestMismatchReverts() (gas: 24788)
OCR3Base_transmit:testForkedChainReverts() (gas: 46905)
OCR3Base_transmit:testForkedChainReverts() (gas: 42804)
OCR3Base_transmit:testNonIncreasingSequenceNumberReverts() (gas: 30480)
OCR3Base_transmit:testNonUniqueSignatureReverts() (gas: 64488)
OCR3Base_transmit:testNonUniqueSignatureReverts() (gas: 60396)
OCR3Base_transmit:testSignatureOutOfRegistrationReverts() (gas: 26088)
OCR3Base_transmit:testTransmit2SignersSuccess_gas() (gas: 56900)
OCR3Base_transmit:testTransmit2SignersSuccess_gas() (gas: 56875)
OCR3Base_transmit:testUnAuthorizedTransmitterReverts() (gas: 28578)
OCR3Base_transmit:testUnauthorizedSignerReverts() (gas: 48820)
OCR3Base_transmit:testUnauthorizedSignerReverts() (gas: 44719)
OCR3Base_transmit:testWrongNumberOfSignaturesReverts() (gas: 25641)
Rebalancer__report:test_EmptyReportReverts() (gas: 11135)
Rebalancer_addLiquidity:test_addLiquiditySuccess() (gas: 249272)
Rebalancer_rebalanceLiquidity:test_InsufficientLiquidityReverts() (gas: 19548)
Rebalancer_rebalanceLiquidity:test_InvalidRemoteChainReverts() (gas: 162313)
Rebalancer_rebalanceLiquidity:test_rebalanceBetweenPoolsSuccess() (gas: 7936550)
Rebalancer_rebalanceLiquidity:test_rebalanceBetweenPoolsSuccess_AlreadyFinalized() (gas: 7522482)
Rebalancer_rebalanceLiquidity:test_rebalanceLiquiditySuccess() (gas: 346467)
Rebalancer_rebalanceLiquidity:test_rebalanceBetweenPoolsSuccess() (gas: 8095658)
Rebalancer_rebalanceLiquidity:test_rebalanceBetweenPoolsSuccess_AlreadyFinalized() (gas: 7591176)
Rebalancer_rebalanceLiquidity:test_rebalanceLiquiditySuccess() (gas: 348848)
Rebalancer_removeLiquidity:test_InsufficientLiquidityReverts() (gas: 156472)
Rebalancer_removeLiquidity:test_OnlyOwnerReverts() (gas: 10967)
Rebalancer_removeLiquidity:test_removeLiquiditySuccess() (gas: 207747)
Rebalancer_setCrossChainRebalancer:test_OnlyOwnerReverts() (gas: 17039)
Rebalancer_setCrossChainRebalancer:test_ZeroAddressReverts() (gas: 21630)
Rebalancer_setCrossChainRebalancer:test_ZeroChainSelectorReverts() (gas: 13102)
Rebalancer_setCrossChainRebalancer:test_setCrossChainRebalancerSuccess() (gas: 157929)
Rebalancer_setLocalLiquidityContainer:test_OnlyOwnerReverts() (gas: 10986)
Rebalancer_setLocalLiquidityContainer:test_setLocalLiquidityContainerSuccess() (gas: 2887034)
51 changes: 39 additions & 12 deletions contracts/src/v0.8/rebalancer/Rebalancer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ contract Rebalancer is IRebalancer, OCR3Base {
error InvalidRemoteChain(uint64 chainSelector);
error ZeroChainSelector();
error InsufficientLiquidity(uint256 requested, uint256 available);
error EmptyReport();

event LiquidityTransferred(
uint64 indexed ocrSeqNum,
Expand All @@ -38,8 +39,16 @@ contract Rebalancer is IRebalancer, OCR3Base {
bytes bridgeSpecificData,
bytes bridgeReturnData
);
event LiquidityAdded(address indexed provider, uint256 indexed amount);
event LiquidityRemoved(address indexed remover, uint256 indexed amount);
event LiquidityAddedToContainer(address indexed provider, uint256 indexed amount);
event LiquidityRemovedFromContainer(address indexed remover, uint256 indexed amount);
event LiquidityContainerSet(address indexed newLiquidityContainer);
event CrossChainRebalancerSet(
uint64 indexed remoteChainSelector,
IBridgeAdapter localBridge,
address remoteToken,
address remoteRebalancer,
bool enabled
);

event FinalizationFailed(
uint64 indexed ocrSeqNum,
Expand All @@ -55,7 +64,6 @@ contract Rebalancer is IRebalancer, OCR3Base {
bool enabled;
}

// solhint-disable-next-line chainlink-solidity/all-caps-constant-storage-variables
string public constant override typeAndVersion = "Rebalancer 1.0.0-dev";

/// @notice The token that this pool manages liquidity for.
Expand Down Expand Up @@ -111,7 +119,7 @@ contract Rebalancer is IRebalancer, OCR3Base {
i_localToken.approve(address(s_localLiquidityContainer), amount);
s_localLiquidityContainer.provideLiquidity(amount);

emit LiquidityAdded(msg.sender, amount);
emit LiquidityAddedToContainer(msg.sender, amount);
}

/// @notice Removes liquidity from the system and sends it to the caller, so the owner.
Expand All @@ -125,7 +133,7 @@ contract Rebalancer is IRebalancer, OCR3Base {
s_localLiquidityContainer.withdrawLiquidity(amount);
i_localToken.safeTransfer(msg.sender, amount);

emit LiquidityRemoved(msg.sender, amount);
emit LiquidityRemovedFromContainer(msg.sender, amount);
}

/// @notice Transfers liquidity to another chain.
Expand Down Expand Up @@ -210,7 +218,7 @@ contract Rebalancer is IRebalancer, OCR3Base {
try
remoteRebalancer.localBridge.finalizeWithdrawERC20(
remoteRebalancer.remoteRebalancer, // remoteSender: the remote rebalancer
address(this), // localReceiver: us
address(this), // localReceiver: this contract
bridgeSpecificPayload
)
{
Expand Down Expand Up @@ -243,6 +251,14 @@ contract Rebalancer is IRebalancer, OCR3Base {
IRebalancer.LiquidityInstructions memory instructions = abi.decode(report, (IRebalancer.LiquidityInstructions));

uint256 sendInstructions = instructions.sendLiquidityParams.length;
uint256 receiveInstructions = instructions.receiveLiquidityParams.length;

// There should always be instructions to send or receive, if not, the report is invalid
// and we revert to save the gas of the signature validation of OCR.
if (sendInstructions == 0 && receiveInstructions == 0) {
revert EmptyReport();
}

for (uint256 i = 0; i < sendInstructions; ++i) {
_rebalanceLiquidity(
instructions.sendLiquidityParams[i].remoteChainSelector,
Expand All @@ -253,7 +269,6 @@ contract Rebalancer is IRebalancer, OCR3Base {
);
}

uint256 receiveInstructions = instructions.receiveLiquidityParams.length;
for (uint256 i = 0; i < receiveInstructions; ++i) {
_receiveLiquidity(
instructions.receiveLiquidityParams[i].remoteChainSelector,
Expand All @@ -262,8 +277,6 @@ contract Rebalancer is IRebalancer, OCR3Base {
ocrSeqNum
);
}

// todo emit?
}

// ================================================================
Expand Down Expand Up @@ -301,15 +314,19 @@ contract Rebalancer is IRebalancer, OCR3Base {

/// @notice Sets a list of cross chain liquidity managers.
/// @dev Will update the list of supported dest chains if the chain is new.
function setCrossChainRebalancer(CrossChainRebalancerArgs[] calldata crossChainRebalancers) external onlyOwner {
function setCrossChainRebalancers(CrossChainRebalancerArgs[] calldata crossChainRebalancers) external onlyOwner {
for (uint256 i = 0; i < crossChainRebalancers.length; ++i) {
setCrossChainRebalancer(crossChainRebalancers[i]);
_setCrossChainRebalancer(crossChainRebalancers[i]);
}
}

function setCrossChainRebalancer(CrossChainRebalancerArgs calldata crossChainLiqManager) external onlyOwner {
_setCrossChainRebalancer(crossChainLiqManager);
}

/// @notice Sets a single cross chain liquidity manager.
/// @dev Will update the list of supported dest chains if the chain is new.
function setCrossChainRebalancer(CrossChainRebalancerArgs calldata crossChainLiqManager) public onlyOwner {
function _setCrossChainRebalancer(CrossChainRebalancerArgs calldata crossChainLiqManager) internal {
if (crossChainLiqManager.remoteChainSelector == 0) {
revert ZeroChainSelector();
}
Expand All @@ -333,6 +350,14 @@ contract Rebalancer is IRebalancer, OCR3Base {
remoteToken: crossChainLiqManager.remoteToken,
enabled: crossChainLiqManager.enabled
});

emit CrossChainRebalancerSet(
crossChainLiqManager.remoteChainSelector,
crossChainLiqManager.localBridge,
crossChainLiqManager.remoteToken,
crossChainLiqManager.remoteRebalancer,
crossChainLiqManager.enabled
);
}

/// @notice Gets the local liquidity container.
Expand All @@ -344,5 +369,7 @@ contract Rebalancer is IRebalancer, OCR3Base {
/// @dev Only the owner can call this function.
function setLocalLiquidityContainer(ILiquidityContainer localLiquidityContainer) external onlyOwner {
s_localLiquidityContainer = localLiquidityContainer;

emit LiquidityContainerSet(address(localLiquidityContainer));
}
}
Loading

0 comments on commit 25bd13e

Please sign in to comment.