diff --git a/contracts/mainnet/connectors/fluid/events.sol b/contracts/mainnet/connectors/fluid/events.sol new file mode 100644 index 00000000..f395b49d --- /dev/null +++ b/contracts/mainnet/connectors/fluid/events.sol @@ -0,0 +1,14 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +contract Events { + event LogOperate ( + address vaultAddress, + uint256 nftId, + int256 newCol, + int256 newDebt, + address to, + uint256 getId, + uint256 setId + ); +} \ No newline at end of file diff --git a/contracts/mainnet/connectors/fluid/interface.sol b/contracts/mainnet/connectors/fluid/interface.sol new file mode 100644 index 00000000..57912726 --- /dev/null +++ b/contracts/mainnet/connectors/fluid/interface.sol @@ -0,0 +1,47 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +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 + /// @param newDebt_ new debt. If positive then borrow, if negative then payback, if 0 then do nohing + /// @param to_ address where withdraw or borrow should go. If address(0) then msg.sender + /// @return nftId_ if 0 then this returns the newly created NFT Id else returns the same NFT ID + /// @return final supply amount. Mainly if max withdraw using type(int).min then this is useful to get perfect amount else remain same as newCol_ + /// @return final borrow amount. Mainly if max payback using type(int).min then this is useful to get perfect amount else remain same as newDebt_ + function operate( + uint256 nftId_, // if 0 then new position + int256 newCol_, // if negative then withdraw + int256 newDebt_, // if negative then payback + address to_ // address at which the borrow & withdraw amount should go to. If address(0) then it'll go to msg.sender + ) + external + returns ( + uint256, // nftId_ + int256, // final supply amount if - then withdraw + int256 // final borrow amount if - then payback + ); + + struct ConstantViews { + address liquidity; + address factory; + address adminImplementation; + address secondaryImplementation; + address supplyToken; + address borrowToken; + uint8 supplyDecimals; + uint8 borrowDecimals; + uint vaultId; + bytes32 liquidityTotalSupplySlot; + bytes32 liquidityTotalBorrowSlot; + bytes32 liquiditySupplyExchangePriceSlot; + bytes32 liquidityBorrowExchangePriceSlot; + bytes32 liquidityUserSupplySlot; + bytes32 liquidityUserBorrowSlot; + } + + function constantsView() external view returns (ConstantViews memory constantsView_); +} \ No newline at end of file diff --git a/contracts/mainnet/connectors/fluid/main.sol b/contracts/mainnet/connectors/fluid/main.sol new file mode 100644 index 00000000..69b62fc7 --- /dev/null +++ b/contracts/mainnet/connectors/fluid/main.sol @@ -0,0 +1,44 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +/** + * @title Fluid. + * @dev Lending & Borrowing. + */ + +import { Stores } from "../../common/stores.sol"; +import { Events } from "./events.sol"; +import { IVault } from "./interface.sol"; + +abstract contract FluidConnector is Events, Stores { + // todo: add logics when user wants to deposit weth + + function operate( + address vaultAddress_, + uint256 nftId_, // if 0 then new position + int256 newCol_, // if negative then withdraw + int256 newDebt_, // if negative then payback + address to_, + uint256 getId_, + uint256 setId_ + ) external payable + returns (string memory _eventName, bytes memory _eventParam) + { + nftId_ = getUint(getId_, nftId_); + + IVault vault_ = IVault(vaultAddress_); + + IVault.ConstantViews memory vaultDetails_ = vault_.constantsView(); + + (nftId_, newCol_, newDebt_) = vault_.operate(nftId_, newCol_, newDebt_, to_); + + setUint(setId_, nftId_); + + _eventName = "LogOperate(address,uint256,uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode(vaultAddress_, nftId_, newCol_, newDebt_, to_, getId_, setId_); + } +} + +contract ConnectV2Fluid is FluidConnector { + string public constant name = "Fluid-v1.0"; +} \ No newline at end of file