Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
ShuaJJ committed Mar 20, 2024
2 parents 220d49a + 9dfbe71 commit 7f33244
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 16 deletions.
2 changes: 1 addition & 1 deletion script/DeployFarm.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ contract DeployFarm is BaseScript {

RewardDistributor rd = new RewardDistributor(UN); // RewardDistributor 全局只需要一个即可

RewardTracker ulp = new RewardTracker("UNIT warp LP WETH/TINU", "ULP");
RewardTracker ulp = new RewardTracker("UNIT wrap LP WETH/TINU", "ULP");
UnitPriceFeed priceFeed = new UnitPriceFeed(); // 为ULP创建一个priceFeed
uint256 price = 1100000 * 1e18;
priceFeed.setLatestAnswer(int256(price));
Expand Down
121 changes: 121 additions & 0 deletions src/peripherals/FarmRouter.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
// // SPDX-License-Identifier: MIT

// pragma solidity ^0.8.21;

// import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
// import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import { IUniswapV2Router01 } from "../test/IUniswapV2Router01.sol";
// import { IWETH } from "../interfaces/IWETH.sol";
// import { IFarm } from "../interfaces/IFarm.sol";
// import { IVault } from "../interfaces/IVault.sol";

// import "forge-std/console.sol"; // test

// contract FarmRouter is Ownable {

// address public TINU;

// address public UN;

// address public uniswapRouter;

// address public WETH;

// address public farm;

// address public pair0;

// address public pair1;

// address public VAULT;

// constructor(
// address initialOnwer,
// address _tinu,
// address _un,
// address _WETH ,
// address _uniswapRouter,
// address _farm,
// address _pair0,
// address _pair1,
// address _VAULT
// ) Ownable(initialOnwer){
// TINU = _tinu;
// UN = _un;
// WETH = _WETH;
// uniswapRouter = _uniswapRouter;
// farm = _farm;
// pair0 = _pair0;
// pair1 = _pair1;
// VAULT = _VAULT;

// setApprove();
// }

// function setApprove() public {
// IWETH(WETH).approve(uniswapRouter, type(uint256).max );
// IERC20(TINU).approve(uniswapRouter, type(uint256).max );
// IERC20(UN).approve(uniswapRouter, type(uint256).max );
// }

// function depositETHAndAddLiquidity(
// uint256 tinuAmountOut, // mint多少tinu
// uint256 ethAmountInMax, // 用多少eth 质押
// uint256[] calldata amountA, // add ETH/TINU 的数量
// uint256 unAmountOut, // 买多少UN
// uint256 tinuAmountInMax, // 最多输入多说TINU
// uint256[] calldata amountB, // add TINU/UN 的数量
// uint256 _multiplierIndex // 倍数,
// ) public payable{
// require(msg.value > 0, "FarmRouter: value cannot be 0");
// IWETH(WETH).deposit{value: msg.value}();
// // uint256 ethBalance = IWETH(WETH).balanceOf(address(this));
// IWETH(WETH).transfer(VAULT, ethAmountInMax);
// IVault(VAULT).increaseCollateral(WETH, address(this));
// IVault(VAULT).increaseDebt(WETH, tinuAmountOut , address(this));
// // ( uint256 tokenAssets, uint256 tinuDebt ) = IVault(VAULT).vaultOwnerAccount(address(this), address(WETH));
// // console.log("depositETHAndAddLiquidity", tokenAssets, tinuDebt);
// IUniswapV2Router01(uniswapRouter).addLiquidity(
// WETH,
// TINU,
// amountA[0],
// amountA[1],
// 0,
// 0,
// address(this),
// block.timestamp+1
// );

// address[] memory path1 = new address[](2);
// path1[0] = TINU;
// path1[1] = UN;

// IUniswapV2Router01(uniswapRouter).swapTokensForExactTokens(
// uint(unAmountOut),
// uint(tinuAmountInMax),
// path1,
// address(this),
// block.timestamp+1
// );

// IUniswapV2Router01(uniswapRouter).addLiquidity(
// UN,
// TINU,
// amountB[0],
// amountB[1],
// 0,
// 0,
// address(this),
// block.timestamp+1
// );

// uint256 lp0Amount = IERC20(pair0).balanceOf(address(this));
// uint256 lp1Amount = IERC20(pair1).balanceOf(address(this));

// IERC20(pair0).approve(address(farm), type(uint256).max );
// IERC20(pair1).approve(address(farm), type(uint256).max );

// IFarm(farm).depositAndLock(0, _multiplierIndex, lp0Amount, address(msg.sender));
// IFarm(farm).depositAndLock(1, _multiplierIndex, lp1Amount, address((msg.sender)));
// }
// }
15 changes: 10 additions & 5 deletions src/peripherals/FarmRouter2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ contract FarmRouter2 is Ownable, IFlashLoan {
IERC20(_pair).approve(_ulp, 2**256-1);
}

function compound(address _ulp, address _account, uint8 _lockDay) public {
require( IRewardTracker(_ulp).claimable(_account) > 0, "FarmRouter: claimable cannot be 0");
IRewardTracker(_ulp).claimForAccount(_account, address(this));
address _unTinuPair = UniswapV2Library.pairFor(UNISWAP_FACTORY, UN, TINU);
address _unUlp = uLps[_unTinuPair];
_deposit(_unUlp, UN, _unTinuPair, _lockDay, msg.sender);
}

function depositETH(uint8 lock) public payable {
require(msg.value > 0, "FarmRouter: value cannot be 0");
IWETH(WETH).deposit{value: msg.value}();
Expand All @@ -93,10 +101,6 @@ contract FarmRouter2 is Ownable, IFlashLoan {
_deposit(_uLP, _depositToken, _pair, _lockDay, msg.sender);
}

function relock(address _collateralToken, uint256 _lockIndex, uint8 _lockDay) public {

}

// amount: ulp amount
function withdraw(address _uLP, uint256 _lockIndex, address _receiver) public {
address _pair = pairs[_uLP];
Expand Down Expand Up @@ -130,7 +134,9 @@ contract FarmRouter2 is Ownable, IFlashLoan {
address _uLP = uLps[addLP.pair];
IRewardTracker(_uLP).stakeForAccount(address(this), addLP.account, addLP.pair, liquidity, addLP.lockDay);

uint256 balance0 = IERC20(_uLP).balanceOf(VAULT);
IERC20(_uLP).transferFrom(addLP.account, VAULT, liquidity);
uint256 balance1 = IERC20(_uLP).balanceOf(VAULT);
IVault(VAULT).increaseCollateral(_collateralToken, addLP.account);

} else if(fcData.callType == 1) {
Expand Down Expand Up @@ -158,7 +164,6 @@ contract FarmRouter2 is Ownable, IFlashLoan {
IERC20(token0).transfer(_sender, amount0);
}


// uint256 tinuBalance2 = IERC20(TINU).balanceOf(address(this));
// (uint256 tokenAssets, uint256 debt) = IVault(VAULT).vaultOwnerAccount(msg.sender, _collateralToken);
}
Expand Down
13 changes: 3 additions & 10 deletions src/staking/RewardTracker.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ pragma solidity ^0.8.21;
import "../interfaces/IRewardDistributor.sol";
import "../interfaces/IRewardTracker.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "forge-std/console.sol"; // test
// import "forge-std/console.sol"; // test

contract RewardTracker is IERC20, IRewardTracker {

Expand Down Expand Up @@ -183,8 +183,6 @@ contract RewardTracker is IERC20, IRewardTracker {
uint256 supply = totalStakedAmounts;
uint256 pendingRewards = IRewardDistributor(distributor).pendingRewards(address(this)) * PRECISION;
uint256 nextCumulativeRewardPerToken = cumulativeRewardPerToken + (pendingRewards / supply);
// return claimableReward[_account].add(
// stakedAmount.mul(nextCumulativeRewardPerToken.sub(previousCumulatedRewardPerToken[_account])).div(PRECISION));
return claimableReward[_account] + (stakedAmount * (nextCumulativeRewardPerToken - previousCumulatedRewardPerToken[_account]) / PRECISION);
}

Expand All @@ -209,13 +207,12 @@ contract RewardTracker is IERC20, IRewardTracker {

totalSupply = totalSupply + _amount;
balances[_account] = balances[_account] + _amount;
console.log("_mint:", _account, balances[_account], _amount);

emit Transfer(address(0), _account, _amount);
}

function _burn(address _account, uint256 _amount) internal {
require(_account != address(0), "RewardTracker: burn from the zero address");
console.log("_burn:", _account, balances[_account] , _amount);
balances[_account] = balances[_account] - _amount;
totalSupply = totalSupply - _amount;

Expand All @@ -225,19 +222,15 @@ contract RewardTracker is IERC20, IRewardTracker {
function _transfer(address _sender, address _recipient, uint256 _amount) private {
require(_sender != address(0), "RewardTracker: transfer from the zero address");
require(_recipient != address(0), "RewardTracker: transfer to the zero address");

balances[_sender] = balances[_sender] - _amount;
balances[_recipient] = balances[_recipient] + _amount;

emit Transfer(_sender, _recipient,_amount);
}

function _approve(address _owner, address _spender, uint256 _amount) private {
require(_owner != address(0), "RewardTracker: approve from the zero address");
require(_spender != address(0), "RewardTracker: approve to the zero address");

allowances[_owner][_spender] = _amount;

emit Approval(_owner, _spender, _amount);
}

Expand Down Expand Up @@ -308,7 +301,7 @@ contract RewardTracker is IERC20, IRewardTracker {
require(stakedAmounts[_account] >= _pointAmount, "RewardTracker: _pointAmount exceeds stakedAmount");

stakedAmounts[_account] = stakedAmount - _pointAmount;
// console.log("_unstake:", totalStakedAmounts, _pointAmount);

totalStakedAmounts = totalStakedAmounts - _pointAmount;

uint256 depositBalance = depositBalances[_account][_depositToken];
Expand Down

0 comments on commit 7f33244

Please sign in to comment.