This commit is contained in:
pradyuman-verma 2021-12-16 11:42:11 +05:30
parent fa6886e033
commit e56ca991e7
No known key found for this signature in database
GPG Key ID: E36FD6BC8923221F
3 changed files with 167 additions and 149 deletions

View File

@ -3,92 +3,101 @@
pragma solidity ^0.7.0; pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import {DSMath} from "../../common/math.sol"; import { DSMath } from "../../common/math.sol";
import {Basic} from "../../common/basic.sol"; import { Basic } from "../../common/basic.sol";
import "./interface.sol"; import "./interface.sol";
contract Helpers is DSMath, Basic { contract Helpers is DSMath, Basic {
IMasterChefV2 immutable masterChefV2 = IMasterChefV2 immutable masterChefV2 =
IMasterChefV2(0xEF0881eC094552b2e128Cf945EF17a6752B4Ec5d); IMasterChefV2(0xEF0881eC094552b2e128Cf945EF17a6752B4Ec5d);
IMasterChef immutable masterChef = IMasterChef immutable masterChef =
IMasterChef(0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd); IMasterChef(0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd);
ISushiSwapFactory immutable factory = ISushiSwapFactory immutable factory =
ISushiSwapFactory(0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac); ISushiSwapFactory(0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac);
struct Metadata { struct Metadata {
uint256 poolId; uint256 poolId;
uint256 version; uint256 version;
address lpToken; address lpToken;
} }
function _deposit(Metadata memory data, uint256 _amount) internal { function _deposit(Metadata memory data, uint256 _amount) internal {
if(data.version == 2) if (data.version == 2)
masterChefV2.deposit(data.poolId, _amount, address(this)); masterChefV2.deposit(data.poolId, _amount, address(this));
else else masterChef.deposit(data.poolId, _amount);
masterChef.deposit(data.poolId, _amount); }
}
function _withdraw(Metadata memory data, uint256 _amount) internal { function _withdraw(Metadata memory data, uint256 _amount) internal {
if(data.version == 2) if (data.version == 2)
masterChefV2.withdraw(data.poolId, _amount, address(this)); masterChefV2.withdraw(data.poolId, _amount, address(this));
else else masterChef.withdraw(data.poolId, _amount);
masterChef.withdraw(data.poolId, _amount); }
}
function _harvest(Metadata memory data) internal { function _harvest(Metadata memory data) internal {
masterChefV2.harvest(data.poolId, address(this)); masterChefV2.harvest(data.poolId, address(this));
} }
function _withdrawAndHarvest(Metadata memory data, uint256 _amount) internal { function _withdrawAndHarvest(Metadata memory data, uint256 _amount)
if(data.version == 2) internal
masterChefV2.withdrawAndHarvest(data.poolId, _amount, address(this)); {
else _withdraw(data, _amount); if (data.version == 2)
} masterChefV2.withdrawAndHarvest(
data.poolId,
_amount,
address(this)
);
else _withdraw(data, _amount);
}
function _emergencyWithdraw(Metadata memory data) internal { function _emergencyWithdraw(Metadata memory data) internal {
if(data.version == 2) if (data.version == 2)
masterChefV2.emergencyWithdraw(data.poolId, address(this)); masterChefV2.emergencyWithdraw(data.poolId, address(this));
else else masterChef.emergencyWithdraw(data.poolId, address(this));
masterChef.emergencyWithdraw(data.poolId, address(this)); }
}
function _getPoolId(address tokenA, address tokenB) function _getPoolId(address tokenA, address tokenB)
internal internal
view view
returns (Metadata memory data) returns (Metadata memory data)
{ {
address pair = factory.getPair(tokenA, tokenB); address pair = factory.getPair(tokenA, tokenB);
uint256 length = masterChefV2.poolLength(); uint256 length = masterChefV2.poolLength();
data.version = 2; data.version = 2;
data.poolId = uint256(-1); data.poolId = uint256(-1);
for (uint256 i = 0; i < length; i++) { for (uint256 i = 0; i < length; i++) {
data.lpToken = masterChefV2.lpToken(i); data.lpToken = masterChefV2.lpToken(i);
if (pair == data.lpToken) { if (pair == data.lpToken) {
data.poolId = i; data.poolId = i;
break; break;
} }
} }
uint256 lengthV1 = masterChef.poolLength(); uint256 lengthV1 = masterChef.poolLength();
for (uint256 i = 0; i < lengthV1; i++) { for (uint256 i = 0; i < lengthV1; i++) {
(data.lpToken, , , ) = masterChef.poolInfo(i); (data.lpToken, , , ) = masterChef.poolInfo(i);
if (pair == data.lpToken) { if (pair == data.lpToken) {
data.poolId = i; data.poolId = i;
data.version = 1; data.version = 1;
break; break;
} }
} }
} }
function _getUserInfo(Metadata memory data) function _getUserInfo(Metadata memory data)
internal internal
view view
returns (uint256 lpAmount, uint256 rewardsAmount) returns (uint256 lpAmount, uint256 rewardsAmount)
{ {
if(data.version == 2) if (data.version == 2)
(lpAmount, rewardsAmount) = masterChefV2.userInfo(data.poolId, address(this)); (lpAmount, rewardsAmount) = masterChefV2.userInfo(
else data.poolId,
(lpAmount, rewardsAmount) = masterChef.userInfo(data.poolId, address(this)); address(this)
} );
else
(lpAmount, rewardsAmount) = masterChef.userInfo(
data.poolId,
address(this)
);
}
} }

View File

@ -2,116 +2,125 @@ pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
struct UserInfo { struct UserInfo {
uint256 amount; uint256 amount;
uint256 rewardDebt; uint256 rewardDebt;
} }
struct PoolInfo { struct PoolInfo {
IERC20 lpToken; // Address of LP token contract. IERC20 lpToken; // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool. SUSHIs to distribute per block. uint256 allocPoint; // How many allocation points assigned to this pool. SUSHIs to distribute per block.
uint256 lastRewardBlock; // Last block number that SUSHIs distribution occurs. uint256 lastRewardBlock; // Last block number that SUSHIs distribution occurs.
uint256 accSushiPerShare; // Accumulated SUSHIs per share, times 1e12. See below. uint256 accSushiPerShare; // Accumulated SUSHIs per share, times 1e12. See below.
} }
interface IERC20 { interface IERC20 {
function totalSupply() external view returns (uint256); function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256); function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256); function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 amount) external returns (bool); function approve(address spender, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value); event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
/// @notice EIP 2612 /// @notice EIP 2612
function permit( function permit(
address owner, address owner,
address spender, address spender,
uint256 value, uint256 value,
uint256 deadline, uint256 deadline,
uint8 v, uint8 v,
bytes32 r, bytes32 r,
bytes32 s bytes32 s
) external; ) external;
} }
interface IMasterChef { interface IMasterChef {
function poolLength() external view returns (uint256); function poolLength() external view returns (uint256);
function updatePool(uint256 pid) external returns (PoolInfo memory); function updatePool(uint256 pid) external returns (PoolInfo memory);
function poolInfo(uint256 pid) external view returns (address, uint256, uint256, uint256); function poolInfo(uint256 pid)
external
view
returns (
address,
uint256,
uint256,
uint256
);
function userInfo(uint256 _pid, address _user) function userInfo(uint256 _pid, address _user)
external external
view view
returns (uint256, uint256); returns (uint256, uint256);
function deposit( function deposit(uint256 pid, uint256 amount) external;
uint256 pid,
uint256 amount
) external;
function withdraw( function withdraw(uint256 pid, uint256 amount) external;
uint256 pid,
uint256 amount
) external;
function emergencyWithdraw(uint256 pid, address to) external; function emergencyWithdraw(uint256 pid, address to) external;
} }
interface IMasterChefV2 { interface IMasterChefV2 {
function poolLength() external view returns (uint256); function poolLength() external view returns (uint256);
function updatePool(uint256 pid) external returns (PoolInfo memory); function updatePool(uint256 pid) external returns (PoolInfo memory);
function lpToken(uint256 pid) external view returns (address); function lpToken(uint256 pid) external view returns (address);
function userInfo(uint256 _pid, address _user) function userInfo(uint256 _pid, address _user)
external external
view view
returns (uint256, uint256); returns (uint256, uint256);
function deposit( function deposit(
uint256 pid, uint256 pid,
uint256 amount, uint256 amount,
address to address to
) external; ) external;
function withdraw( function withdraw(
uint256 pid, uint256 pid,
uint256 amount, uint256 amount,
address to address to
) external; ) external;
function emergencyWithdraw(uint256 pid, address to) external; function emergencyWithdraw(uint256 pid, address to) external;
function harvest(uint256 pid, address to) external; function harvest(uint256 pid, address to) external;
function withdrawAndHarvest( function withdrawAndHarvest(
uint256 pid, uint256 pid,
uint256 amount, uint256 amount,
address to address to
) external; ) external;
} }
interface ISushiSwapFactory { interface ISushiSwapFactory {
function getPair(address tokenA, address tokenB) function getPair(address tokenA, address tokenB)
external external
view view
returns (address pair); returns (address pair);
function allPairs(uint256) external view returns (address pair); function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256); function allPairsLength() external view returns (uint256);
function feeTo() external view returns (address); function feeTo() external view returns (address);
function feeToSetter() external view returns (address); function feeToSetter() external view returns (address);
function createPair(address tokenA, address tokenB) function createPair(address tokenA, address tokenB)
external external
returns (address pair); returns (address pair);
} }

View File

@ -202,7 +202,7 @@ abstract contract SushipswapIncentiveResolver is Helpers, Events {
require(data.poolId != uint256(-1), "pool-does-not-exist"); require(data.poolId != uint256(-1), "pool-does-not-exist");
(uint256 lpAmount, uint256 rewardsAmount) = _getUserInfo(data); (uint256 lpAmount, uint256 rewardsAmount) = _getUserInfo(data);
_emergencyWithdraw(data); _emergencyWithdraw(data);
_eventName = "LogEmergencyWithdraw(address,addressuint256,uint256,uint256,uint256)"; _eventName = "LogEmergencyWithdraw(address,address,uint256,uint256,uint256,uint256)";
_eventParam = abi.encode( _eventParam = abi.encode(
token1, token1,
token2, token2,