buyCollateral updated

This commit is contained in:
Richa-iitr 2022-09-03 00:28:11 +05:30
parent 75c092c266
commit 8250831342
3 changed files with 99 additions and 41 deletions

View File

@ -116,10 +116,10 @@ contract Events {
event LogBuyCollateral(
address indexed market,
address indexed token,
uint256 indexed baseAmount,
uint256 minCollateralAmt,
uint256 collateralAmount,
address indexed buyToken,
uint256 indexed baseSellAmt,
uint256 unitAmt,
uint256 buyAmount,
uint256 getId,
uint256 setId
);

View File

@ -18,6 +18,14 @@ abstract contract Helpers is DSMath, Basic {
uint256 setId;
}
struct BuyCollateralData {
address market;
address sellToken;
address buyAsset;
uint256 unitAmt;
uint256 baseSellAmt;
}
enum Action {
REPAY,
DEPOSIT,
@ -121,7 +129,9 @@ abstract contract Helpers is DSMath, Basic {
amt_ = amt_ == uint256(-1) ? initialBal : amt_;
if (token_ == getBaseToken(params.market)) {
uint256 balance = CometInterface(params.market).balanceOf(params.from);
uint256 balance = CometInterface(params.market).balanceOf(
params.from
);
//if there are supplies, ensure withdrawn amount is not greater than supplied i.e can't borrow using withdraw.
if (balance > 0) {
require(amt_ <= balance, "withdraw-amt-greater-than-supplies");
@ -211,4 +221,72 @@ abstract contract Helpers is DSMath, Basic {
return amt;
}
function _buyCollateral(
BuyCollateralData memory params,
uint256 getId,
uint256 setId
) internal returns (string memory eventName_, bytes memory eventParam_) {
uint256 sellAmt_ = getUint(getId, params.baseSellAmt);
require(
params.market != address(0) && params.buyAsset != address(0),
"invalid market/token address"
);
require(
params.sellToken == getBaseToken(params.market),
"invalid-sell-token"
);
bool isEth = params.sellToken == ethAddr;
params.sellToken = isEth ? wethAddr : params.sellToken;
if (sellAmt_ == uint256(-1)) {
sellAmt_ = isEth
? address(this).balance
: TokenInterface(params.sellToken).balanceOf(address(this));
}
isEth = params.buyAsset == ethAddr;
params.buyAsset = isEth ? wethAddr : params.buyAsset;
convertEthToWeth(isEth, TokenInterface(params.sellToken), sellAmt_);
uint256 slippageAmt_ = convert18ToDec(
TokenInterface(params.buyAsset).decimals(),
wmul(
params.unitAmt,
convertTo18(
TokenInterface(params.sellToken).decimals(),
sellAmt_
)
)
);
approve(TokenInterface(params.sellToken), params.market, sellAmt_);
CometInterface(params.market).buyCollateral(
params.buyAsset,
slippageAmt_,
sellAmt_,
address(this)
);
uint256 buyAmt_ = CometInterface(params.market).quoteCollateral(
params.buyAsset,
sellAmt_
);
require(slippageAmt_ <= buyAmt_, "too-much-slippage");
convertWethToEth(isEth, TokenInterface(params.buyAsset), buyAmt_);
setUint(setId, sellAmt_);
eventName_ = "LogBuyCollateral(address,address,uint256,uint256,uint256,uint256,uint256)";
eventParam_ = abi.encode(
params.market,
params.buyAsset,
sellAmt_,
params.unitAmt,
buyAmt_,
getId,
setId
);
}
}

View File

@ -714,17 +714,19 @@ abstract contract CompoundV3Resolver is Events, Helpers {
* @dev Buy collateral asset absorbed, from the market.
* @notice Buy collateral asset to increase protocol base reserves until targetReserves is reached.
* @param market The address of the market from where to withdraw.
* @param asset The collateral asset to purachase.
* @param minCollateralAmt Minimum amount of collateral expected to be received.
* @param baseAmt Amount of base asset to be sold for collateral.
* @param sellToken base token. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
* @param buyAsset The collateral asset to purachase. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
* @param unitAmt Minimum amount of collateral expected to be received.
* @param baseSellAmt Amount of base asset to be sold for collateral.
* @param getId ID to retrieve amt.
* @param setId ID stores the amount of base tokens sold.
*/
function buyCollateral(
address market,
address asset,
uint256 minCollateralAmt,
uint256 baseAmt,
address sellToken,
address buyAsset,
uint256 unitAmt,
uint256 baseSellAmt,
uint256 getId,
uint256 setId
)
@ -732,36 +734,14 @@ abstract contract CompoundV3Resolver is Events, Helpers {
payable
returns (string memory eventName_, bytes memory eventParam_)
{
uint256 amt_ = getUint(getId, baseAmt);
require(
market != address(0) && asset != address(0),
"invalid market/token address"
);
bool isEth = asset == ethAddr;
address token_ = isEth ? wethAddr : asset;
TokenInterface tokenContract = TokenInterface(token_);
convertEthToWeth(isEth, tokenContract, amt_);
approve(TokenInterface(getBaseToken(market)), market, amt_);
CometInterface(market).buyCollateral(
asset,
minCollateralAmt,
amt_,
address(this)
);
uint256 collAmt = CometInterface(market).quoteCollateral(asset, amt_);
setUint(setId, amt_);
eventName_ = "LogBuyCollateral(address,address,uint256,uint256,uint256,uint256,uint256)";
eventParam_ = abi.encode(
market,
token_,
amt_,
minCollateralAmt,
collAmt,
(eventName_, eventParam_) = _buyCollateral(
BuyCollateralData({
market: market,
sellToken: sellToken,
buyAsset: buyAsset,
unitAmt: unitAmt,
baseSellAmt: baseSellAmt
}),
getId,
setId
);