diff --git a/contracts/mainnet/connectors/merkleDistributor/events.sol b/contracts/mainnet/connectors/merkleDistributor/events.sol new file mode 100644 index 0000000..a8a64a1 --- /dev/null +++ b/contracts/mainnet/connectors/merkleDistributor/events.sol @@ -0,0 +1,23 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +contract Events { + event LogClaim( + uint256 cumulativeAmount, + address fToken, + uint256 cycle, + bytes32[] merkleProof, + uint256 rewardsClaimed, + uint256 setId + ); + + event LogClaimOnBehalf( + address recipient_, + uint256 cumulativeAmount, + address fToken, + uint256 cycle, + bytes32[] merkleProof, + uint256 rewardsClaimed, + uint256 setId + ); +} diff --git a/contracts/mainnet/connectors/merkleDistributor/interface.sol b/contracts/mainnet/connectors/merkleDistributor/interface.sol new file mode 100644 index 0000000..c00c4a8 --- /dev/null +++ b/contracts/mainnet/connectors/merkleDistributor/interface.sol @@ -0,0 +1,12 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +interface IFluidMerkleDistributor { + function claim( + address recipient_, + uint256 cumulativeAmount_, + address fToken_, + uint256 cycle_, + bytes32[] calldata merkleProof_ + ) external; +} \ No newline at end of file diff --git a/contracts/mainnet/connectors/merkleDistributor/main.sol b/contracts/mainnet/connectors/merkleDistributor/main.sol new file mode 100644 index 0000000..92cf663 --- /dev/null +++ b/contracts/mainnet/connectors/merkleDistributor/main.sol @@ -0,0 +1,107 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +import {Basic} from "../../common/basic.sol"; +import {Events} from "./events.sol"; +import {IFluidMerkleDistributor} from "./interface.sol"; +import {TokenInterface} from "../../common/interfaces.sol"; + +abstract contract FluidMerkle is Basic, Events { + IFluidMerkleDistributor internal constant MERKLE_DISTRIBUTOR = + IFluidMerkleDistributor(0x1d3D6d38Da24E9Ff3B17693f6971CAe62c3AA1DE); + + TokenInterface internal constant TOKEN = + TokenInterface(0x6f40d4A6237C257fff2dB00FA0510DeEECd303eb); + + /** + * @dev Claims rewards from Fluid merkle distributor contract + * @param cumulativeAmount_ Total reward cumulated since reward inception. + * @param fToken_ Address of fToken on which rewards are being distributed. + * @param cycle_ Current epoch cycle. + * @param merkleProof_ Merkle proof that validates this claim. + * @param setId_ Id to set the rewards received. + */ + function claim( + uint256 cumulativeAmount_, + address fToken_, + uint256 cycle_, + bytes32[] calldata merkleProof_, + uint256 setId_ + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 rewardsBeforeBal_ = TOKEN.balanceOf(address(this)); + + MERKLE_DISTRIBUTOR.claim( + address(this), + cumulativeAmount_, + fToken_, + cycle_, + merkleProof_ + ); + + uint256 rewardsClaimed_ = TOKEN.balanceOf(address(this)) - + rewardsBeforeBal_; + + _eventName = "LogClaim(uint256,address,uint256,bytes32[],uint256,uint256)"; + _eventParam = abi.encode( + cumulativeAmount_, + fToken_, + cycle_, + merkleProof_, + rewardsClaimed_, + setId_ + ); + } + + /** + * @dev Claims rewards from Fluid merkle distributor contract + * @param cumulativeAmount_ Total reward cumulated since reward inception. + * @param fToken_ Address of fToken on which rewards are being distributed. + * @param cycle_ Current epoch cycle. + * @param merkleProof_ Merkle proof that validates this claim. + * @param setId_ Id to set the rewards received. + */ + function claimOnBehalf( + address recipient_, + uint256 cumulativeAmount_, + address fToken_, + uint256 cycle_, + bytes32[] calldata merkleProof_, + uint256 setId_ + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 rewardsBeforeBal_ = TOKEN.balanceOf(recipient_); + + MERKLE_DISTRIBUTOR.claim( + recipient_, + cumulativeAmount_, + fToken_, + cycle_, + merkleProof_ + ); + + uint256 rewardsClaimed_ = TOKEN.balanceOf(recipient_) - + rewardsBeforeBal_; + + _eventName = "LogClaimOnBehalf(address,uint256,address,uint256,bytes32[],uint256,uint256)"; + _eventParam = abi.encode( + recipient_, + cumulativeAmount_, + fToken_, + cycle_, + merkleProof_, + rewardsClaimed_, + setId_ + ); + } +} + +contract ConnectV2FluidMerkleClaim is FluidMerkle { + string public constant name = "Fluid-Merkle-v1.0"; +}