The protocol can't receive rewards because of low gas limits on ETH transfers
The hardcoded gas limit of the Asset::transferETH() function, used to transfer ETH in the protocol, is too low and will result unwanted reverts.\\nETH transfers in the protocol are always done via Asset::transferETH(), which performs a low-level call with an hardcoded gas limit of 10_000:\\n```\\n(bool success,) = recipient.call{value: amount, gas: 10_000}('');\\nif (!success) {revert ETH_TRANSFER_FAILED();}\\n```\\n\\nThe hardcoded `10_000` gas limit is not high enough for the protocol to be able receive and distribute rewards. Rewards are currently only available for native ETH, an are received by Rio via:\\nPartial withdrawals\\nETH in excess of `32ETH` on full withdrawals\\nThe flow to receive rewards requires two steps:\\nAn initial call to EigenPod::verifyAndProcessWithdrawals(), which queues a withdrawal to the Eigenpod owner: an `RioLRTOperatorDelegator` instance\\nA call to DelayedWithdrawalRouter::claimDelayedWithdrawals().\\nThe call to DelayedWithdrawalRouter::claimDelayedWithdrawals() triggers the following flow:\\nETH are transferred to the RioLRTOperatorDelegator instance, where the `receive()` function is triggered.\\nThe `receive()` function of RioLRTOperatorDelegator transfers ETH via Asset::transferETH() to the RioLRTRewardDistributor, where another `receive()` function is triggered.\\nThe `receive()` function of RioLRTRewardDistributor transfers ETH via Asset::transferETH() to the `treasury`, the `operatorRewardPool` and the `RioLRTDepositPool`.\\nThe gas is limited at `10_000` in step `2` and is not enough to perform step `3`, making it impossible for the protocol to receive rewards and leaving funds stuck.\\nPOC\\nAdd the following imports to RioLRTOperatorDelegator.t.sol:\\n```\\nimport {IRioLRTOperatorRegistry} from 'contracts/interfaces/IRioLRTOperatorRegistry.sol';\\nimport {RioLRTOperatorDelegator} from 'contracts/restaking/RioLRTOperatorDelegator.sol';\\nimport {CredentialsProofs, BeaconWithdrawal} from 'test/utils/beacon-chain/MockBeaconChain.sol';\\n```\\n\\nthen copy-paste:\\n```\\nfunction test_outOfGasOnRewards() public {\\n    address alice = makeAddr("alice");\\n    uint256 initialBalance = 40e18;\\n    deal(alice, initialBalance);\\n    vm.prank(alice);\\n    reETH.token.approve(address(reETH.coordinator), type(uint256).max);\\n\\n    //->Operator delegator and validators are added to the protocol\\n    uint8 operatorId = addOperatorDelegator(reETH.operatorRegistry, address(reETH.rewardDistributor));\\n    RioLRTOperatorDelegator operatorDelegator =\\n        RioLRTOperatorDelegator(payable(reETH.operatorRegistry.getOperatorDetails(operatorId).delegator));\\n\\n    //-> Alice deposits ETH in the protocol\\n    vm.prank(alice);\\n    reETH.coordinator.depositETH{value: initialBalance}();\\n    \\n    //-> Rebalance is called and the ETH deposited in a validator\\n    vm.prank(EOA, EOA);\\n    reETH.coordinator.rebalance(ETH_ADDRESS);\\n\\n    //-> Create a new validator with a 40ETH balance and verify his credentials.\\n    //-> This is to "simulate" rewards accumulation\\n    uint40[] memory validatorIndices = new uint40[](1);\\n    IRioLRTOperatorRegistry.OperatorPublicDetails memory details = reETH.operatorRegistry.getOperatorDetails(operatorId);\\n    bytes32 withdrawalCredentials = operatorDelegator.withdrawalCredentials();\\n    beaconChain.setNextTimestamp(block.timestamp);\\n    CredentialsProofs memory proofs;\\n    (validatorIndices[0], proofs) = beaconChain.newValidator({\\n        balanceWei: 40 ether,\\n        withdrawalCreds: abi.encodePacked(withdrawalCredentials)\\n    });\\n    \\n    //-> Verify withdrawal crendetials\\n    vm.prank(details.manager);\\n    reETH.operatorRegistry.verifyWithdrawalCredentials(\\n        operatorId,\\n        proofs.oracleTimestamp,\\n        proofs.stateRootProof,\\n        proofs.validatorIndices,\\n        proofs.validatorFieldsProofs,\\n        proofs.validatorFields\\n    );\\n\\n    //-> Process a full withdrawal, 8ETH (40ETH - 32ETH) will be queued withdrawal as "rewards"\\n    verifyAndProcessWithdrawalsForValidatorIndexes(address(operatorDelegator), validatorIndices);\\n\\n    //-> Call `claimDelayedWithdrawals` to claim the withdrawal\\n    delayedWithdrawalRouter.claimDelayedWithdrawals(address(operatorDelegator), 1); //❌ Reverts for out-of-gas\\n}\\n```\\n
Remove the hardcoded `10_000` gas limit in Asset::transferETH(), at least on ETH transfers where the destination is a protocol controlled contract.
The protocol is unable to receive rewards and the funds will be stucked.
```\\n(bool success,) = recipient.call{value: amount, gas: 10_000}('');\\nif (!success) {revert ETH_TRANSFER_FAILED();}\\n```\\n