feat: update contract

This commit is contained in:
Shriya Tyagi 2024-01-11 03:06:36 +04:00
parent 3cab2e4527
commit 9f22da24d3
3 changed files with 68 additions and 37 deletions

View File

@ -2,13 +2,12 @@
pragma solidity ^0.8.2;
contract Events {
event LogOperate (
event LogOperate(
address vaultAddress,
uint256 nftId,
int256 newCol,
int256 newDebt,
address to,
uint256 getId,
uint256 setId
uint256[] getIds,
uint256[] setIds
);
}
}

View File

@ -2,7 +2,6 @@
pragma solidity ^0.8.2;
interface IVault {
/// @dev Single function which handles supply, withdraw, borrow & payback
/// @param nftId_ NFT ID for interaction. If 0 then create new NFT/position.
/// @param newCol_ new collateral. If positive then deposit, if negative then withdraw, if 0 then do nohing
@ -43,5 +42,8 @@ interface IVault {
bytes32 liquidityUserBorrowSlot;
}
function constantsView() external view returns (ConstantViews memory constantsView_);
}
function constantsView()
external
view
returns (ConstantViews memory constantsView_);
}

View File

@ -28,7 +28,7 @@ abstract contract FluidConnector is Events, Stores {
* For max deposit use type(uint25).max, for max withdraw use type(uint25).min.
* @param newDebt_ New debt. If positive then borrow, if negative then payback, if 0 then do nothing
* For max payback use type(uint25).min.
* @param to_ Address where withdraw or borrow should go. If address(0) then msg.sender
* @param repayApproveAmt_ In case of max amount for payback, this amount will be approved for spending.
* @param getIds_ Array of 5 elements to retrieve IDs:
* Nft Id, Supply amount, Withdraw amount, Borrow Amount, Payback Amount
* @param setIds_ Array of 5 elements to store IDs generated:
@ -39,85 +39,115 @@ abstract contract FluidConnector is Events, Stores {
uint256 nftId_,
int256 newCol_,
int256 newDebt_,
address to_,
uint256[] memory getIds_, // nft id, supply amount, withdraw amount, Borrow Amount, Payback Amount
uint256 repayApproveAmt_,
uint256[] memory getIds_,
uint256[] memory setIds_
)
external
payable
returns (string memory _eventName, bytes memory _eventParam)
{
if (getIds_[1] > 0 && getIds_[2] > 0) {
revert ("Supply and withdraw amount get IDs cannot be > 0 at once.");
revert("Supply and withdraw get IDs cannot both be > 0.");
}
if (getIds_[3] > 0 && getIds_[4] > 0) {
revert ("Borrow and payback amount get IDs cannot be > 0 at once.");
revert("Borrow and payback get IDs cannot both be > 0.");
}
if (setIds_[1] > 0 && setIds_[2] > 0) {
revert ("Supply and withdraw amount get IDs cannot be > 0 at once.");
revert("Supply and withdraw set IDs cannot both be > 0.");
}
if (setIds_[3] > 0 && setIds_[4] > 0) {
revert ("Borrow and payback amount get IDs cannot be > 0 at once.");
revert("Borrow and payback set IDs cannot both be > 0.");
}
nftId_ = getUint(getIds_[0], nftId_);
// newCol_ = getIds_[1] > 0 ? getUint(getIds_[1], newCol_) : getUint(getIds_[2], newCol_);
newCol_ = getIds_[1] > 0
? int256(getUint(getIds_[1], uint256(newCol_)))
: getIds_[2] > 0
? -int256(getUint(getIds_[2], uint256(newCol_)))
: newCol_;
// newDebt_ = getIds_[3] > 0 ? getUint(getIds_[3], newDebt_) : getUint(getIds_[4], newDebt_);
newDebt_ = getIds_[3] > 0
? int256(getUint(getIds_[3], uint256(newDebt_)))
: getIds_[4] > 0
? -int256(getUint(getIds_[4], uint256(newDebt_)))
: newDebt_;
IVault vault_ = IVault(vaultAddress_);
IVault.ConstantViews memory vaultDetails_ = vault_.constantsView();
uint256 colEthAmount_;
uint256 debtEthAmount_;
uint256 ethAmount_;
bool isColMax_ = newCol_ == type(int256).max;
if (newCol_ > 0) {
if (vaultDetails_.supplyToken == getMaticAddr()) {
colEthAmount_ = uint256(newCol_);
ethAmount_ = isColMax_
? address(this).balance
: uint256(newCol_);
} else {
if (isColMax_) {
newCol_ = int256(
TokenInterface(vaultDetails_.supplyToken).balanceOf(
address(this)
)
);
}
TokenInterface(vaultDetails_.supplyToken).approve(
vaultAddress_,
uint256(newCol_)
);
colEthAmount_ = 0;
}
}
bool isPaybackMax_ = newDebt_ == type(int256).min;
if (newDebt_ < 0) {
if (vaultDetails_.borrowToken == getMaticAddr()) {
debtEthAmount_ = uint256(-1 * newDebt_);
ethAmount_ = isPaybackMax_
? repayApproveAmt_
: uint256(-1 * newDebt_);
} else {
TokenInterface(vaultDetails_.borrowToken).approve(
vaultAddress_,
uint256(-1 * newDebt_)
);
debtEthAmount_ = 0;
isPaybackMax_
? TokenInterface(vaultDetails_.borrowToken).approve(
vaultAddress_,
repayApproveAmt_
)
: TokenInterface(vaultDetails_.borrowToken).approve(
vaultAddress_,
uint256(-1 * newDebt_)
);
}
}
(nftId_, newCol_, newDebt_) = vault_.operate{
value: colEthAmount_ + debtEthAmount_
}(nftId_, newCol_, newDebt_, to_);
(nftId_, newCol_, newDebt_) = vault_.operate{value: ethAmount_}(
nftId_,
newCol_,
newDebt_,
address(this)
);
setUint(setIds_[0], nftId_);
// setIds_[1] > 0 ? setUint(setIds_[1], newCol_) : setUint(setIds_[2], newCol_);
// setIds_[3] > 0 ? setUint(setIds_[3], newDebt_) : setUint(setIds_[4], newDebt_);
_eventName = "LogOperate(address,uint256,int256,int256,address,uint256[],uint256[])";
setIds_[1] > 0
? setUint(setIds_[1], uint256(newCol_))
: setUint(setIds_[2], uint256(newCol_)); // If setIds_[2] != 0, it will set the ID.
setIds_[3] > 0
? setUint(setIds_[3], uint256(newDebt_))
: setUint(setIds_[4], uint256(newDebt_)); // If setIds_[4] != 0, it will set the ID.
_eventName = "LogOperate(address,uint256,int256,int256,uint256[],uint256[])";
_eventParam = abi.encode(
vaultAddress_,
nftId_,
newCol_,
newDebt_,
to_,
getIds_,
setIds_
);