Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bribe treasury split #8

Closed
wants to merge 2 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 27 additions & 4 deletions src/BribeInitiative.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,14 @@ contract BribeInitiative is IInitiative, IBribeInitiative {
/// Double linked list of LQTY allocated by a user at a given epoch
mapping(address => DoubleLinkedList.List) internal lqtyAllocationByUserAtEpoch;

// bribe treasury
address public immutable bribeTreasury;

constructor(address _governance, address _bold, address _bribeToken) {
governance = IGovernance(_governance);
bold = IERC20(_bold);
bribeToken = IERC20(_bribeToken);
bribeTreasury = address(new BribeTreasury());
}

modifier onlyGovernance() {
Expand All @@ -54,8 +58,8 @@ contract BribeInitiative is IInitiative, IBribeInitiative {

/// @inheritdoc IBribeInitiative
function depositBribe(uint128 _boldAmount, uint128 _bribeTokenAmount, uint16 _epoch) external {
bold.safeTransferFrom(msg.sender, address(this), _boldAmount);
bribeToken.safeTransferFrom(msg.sender, address(this), _bribeTokenAmount);
bold.safeTransferFrom(msg.sender, bribeTreasury, _boldAmount);
bribeToken.safeTransferFrom(msg.sender, bribeTreasury, _bribeTokenAmount);

uint16 epoch = governance.epoch();
require(_epoch > epoch, "BribeInitiative: only-future-epochs");
Expand Down Expand Up @@ -119,8 +123,9 @@ contract BribeInitiative is IInitiative, IBribeInitiative {
bribeTokenAmount += bribeTokenAmount_;
}

if (boldAmount != 0) bold.safeTransfer(msg.sender, boldAmount);
if (bribeTokenAmount != 0) bribeToken.safeTransfer(msg.sender, bribeTokenAmount);
if (boldAmount != 0 || bribeTokenAmount != 0) {
IBribeTreasury(bribeTreasury).claimBribes(msg.sender, bribeTokenAmount, boldAmount);
}
}

/// @inheritdoc IInitiative
Expand Down Expand Up @@ -221,3 +226,21 @@ contract BribeInitiative is IInitiative, IBribeInitiative {
/// @inheritdoc IInitiative
function onClaimForInitiative(uint16, uint256) external virtual override onlyGovernance {}
}

interface IBribeTreasury {
function claimBribes(address caller, uint256 bribeTokenAmt, uint256 boldAmount) external;
}

contract BribeTreasury is IBribeTreasury {
address public immutable bribeInitiative;

constructor() {
bribeInitiative = msg.sender;
}

function claimBribes(address caller, uint256 bribeTokenAmt, uint256 boldAmount) external {
require(msg.sender == bribeInitiative, "BribeTreasury: invalid-sender");
IBribeInitiative(bribeInitiative).bold().transfer(caller, boldAmount);
IBribeInitiative(bribeInitiative).bribeToken().transfer(caller, bribeTokenAmt);
}
}