mirror of
https://github.com/Instadapp/dsa-connectors.git
synced 2024-07-29 22:37:00 +00:00
223 lines
6.0 KiB
Solidity
223 lines
6.0 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.7.6;
|
|
pragma abicoder v2;
|
|
|
|
/**
|
|
* @title Ubiquity.
|
|
* @dev Ubiquity Dollar (uAD).
|
|
*/
|
|
|
|
import { TokenInterface } from "../../common/interfaces.sol";
|
|
import { IUbiquityBondingV2, IUbiquityMetaPool, I3Pool } from "./interfaces.sol";
|
|
import { Helpers } from "./helpers.sol";
|
|
import { Events } from "./events.sol";
|
|
|
|
abstract contract UbiquityResolver is Helpers, Events {
|
|
/**
|
|
* @dev Deposit into Ubiquity protocol
|
|
* @notice 3POOL (DAI / USDC / USDT) => METAPOOL (3CRV / uAD) => uAD3CRV-f => Ubiquity BondingShare
|
|
* @notice STEP 1 : 3POOL (DAI / USDC / USDT) => 3CRV
|
|
* @notice STEP 2 : METAPOOL(3CRV / UAD) => uAD3CRV-f
|
|
* @notice STEP 3 : uAD3CRV-f => Ubiquity BondingShare
|
|
* @param token Token deposited : DAI, USDC, USDT, 3CRV, uAD or uAD3CRV-f
|
|
* @param amount Amount of tokens to deposit (For max: `uint256(-1)`)
|
|
* @param durationWeeks Duration in weeks tokens will be locked (4-208)
|
|
* @param getId ID to retrieve amt.
|
|
* @param setId ID stores the bonding share id of tokens deposited.
|
|
*/
|
|
function deposit(
|
|
address token,
|
|
uint256 amount,
|
|
uint256 durationWeeks,
|
|
uint256 getId,
|
|
uint256 setId
|
|
)
|
|
external
|
|
payable
|
|
returns (string memory _eventName, bytes memory _eventParam)
|
|
{
|
|
address UAD3CRVf = getUADCRV3();
|
|
bool[6] memory tok = [
|
|
token == DAI, // 0
|
|
token == USDC, // 1
|
|
token == USDT, // 2
|
|
token == CRV3, // 3
|
|
token == getUAD(), // 4
|
|
token == UAD3CRVf // 5
|
|
];
|
|
|
|
require(
|
|
// DAI / USDC / USDT / CRV3 / UAD / UAD3CRVF
|
|
tok[0] || tok[1] || tok[2] || tok[3] || tok[4] || tok[5],
|
|
"Invalid token: must be DAI, USDC, USDT, 3CRV, uAD or uAD3CRV-f"
|
|
);
|
|
|
|
uint256 _amount = getUint(getId, amount);
|
|
uint256 lpAmount;
|
|
|
|
// Full balance if amount = -1
|
|
if (_amount == uint256(-1)) {
|
|
_amount = getTokenBal(TokenInterface(token));
|
|
}
|
|
|
|
// STEP 1 : SwapTo3CRV : Deposit DAI, USDC or USDT into 3Pool to get 3Crv LPs
|
|
// DAI / USDC / USDT
|
|
if (tok[0] || tok[1] || tok[2]) {
|
|
uint256[3] memory amounts1;
|
|
|
|
if (tok[0]) amounts1[0] = _amount;
|
|
else if (tok[1]) amounts1[1] = _amount;
|
|
else if (tok[2]) amounts1[2] = _amount;
|
|
|
|
approve(TokenInterface(token), Pool3, _amount);
|
|
I3Pool(Pool3).add_liquidity(amounts1, 0);
|
|
}
|
|
|
|
// STEP 2 : ProvideLiquidityToMetapool : Deposit in uAD3CRV pool to get uAD3CRV-f LPs
|
|
// DAI / USDC / USDT / CRV3 / UAD
|
|
if (tok[0] || tok[1] || tok[2] || tok[3] || tok[4]) {
|
|
uint256[2] memory amounts2;
|
|
address token2 = token;
|
|
uint256 _amount2;
|
|
|
|
if (tok[4]) {
|
|
_amount2 = _amount;
|
|
amounts2[0] = _amount2;
|
|
} else {
|
|
if (tok[3]) {
|
|
_amount2 = _amount;
|
|
} else {
|
|
token2 = CRV3;
|
|
_amount2 = getTokenBal(TokenInterface(token2));
|
|
}
|
|
amounts2[1] = _amount2;
|
|
}
|
|
|
|
approve(TokenInterface(token2), UAD3CRVf, _amount2);
|
|
lpAmount = IUbiquityMetaPool(UAD3CRVf).add_liquidity(amounts2, 0);
|
|
}
|
|
|
|
// STEP 3 : Farm/ApeIn : Deposit uAD3CRV-f LPs into UbiquityBondingV2 and get Ubiquity Bonding Shares
|
|
// UAD3CRVF
|
|
if (tok[5]) {
|
|
lpAmount = _amount;
|
|
}
|
|
|
|
address bonding = ubiquityManager.bondingContractAddress();
|
|
approve(TokenInterface(UAD3CRVf), bonding, lpAmount);
|
|
uint256 bondingShareId = IUbiquityBondingV2(bonding).deposit(
|
|
lpAmount,
|
|
durationWeeks
|
|
);
|
|
|
|
setUint(setId, bondingShareId);
|
|
|
|
_eventName = "LogDeposit(address,address,uint256,uint256,uint256,uint256,uint256,uint256)";
|
|
_eventParam = abi.encode(
|
|
address(this),
|
|
token,
|
|
amount,
|
|
bondingShareId,
|
|
lpAmount,
|
|
durationWeeks,
|
|
getId,
|
|
setId
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @dev Withdraw from Ubiquity protocol
|
|
* @notice Ubiquity BondingShare => uAD3CRV-f => METAPOOL (3CRV / uAD) => 3POOL (DAI / USDC / USDT)
|
|
* @notice STEP 1 : Ubiquity BondingShare => uAD3CRV-f
|
|
* @notice STEP 2 : uAD3CRV-f => METAPOOL(3CRV / UAD)
|
|
* @notice STEP 3 : 3CRV => 3POOL (DAI / USDC / USDT)
|
|
* @param bondingShareId Bonding Share Id to withdraw
|
|
* @param token Token to withdraw to : DAI, USDC, USDT, 3CRV, uAD or uAD3CRV-f
|
|
* @param getId ID
|
|
* @param setId ID
|
|
*/
|
|
function withdraw(
|
|
uint256 bondingShareId,
|
|
address token,
|
|
uint256 getId,
|
|
uint256 setId
|
|
)
|
|
external
|
|
payable
|
|
returns (string memory _eventName, bytes memory _eventParam)
|
|
{
|
|
address UAD3CRVf = getUADCRV3();
|
|
bool[6] memory tok = [
|
|
token == DAI, // 0
|
|
token == USDC, // 1
|
|
token == USDT, // 2
|
|
token == CRV3, // 3
|
|
token == getUAD(), // 4
|
|
token == UAD3CRVf // 5
|
|
];
|
|
|
|
require(
|
|
// DAI / USDC / USDT / CRV3 / UAD / UAD3CRVF
|
|
tok[0] || tok[1] || tok[2] || tok[3] || tok[4] || tok[5],
|
|
"Invalid token: must be DAI, USDC, USDT, 3CRV, uAD or uAD3CRV-f"
|
|
);
|
|
|
|
uint256 _bondingShareId = getUint(getId, bondingShareId);
|
|
|
|
// Get Bond
|
|
IUbiquityBondingV2.Bond memory bond = IUbiquityBondingV2(
|
|
ubiquityManager.bondingShareAddress()
|
|
).getBond(_bondingShareId);
|
|
|
|
require(address(this) == bond.minter, "Not bond owner");
|
|
|
|
// STEP 1 : Withdraw Ubiquity Bonding Shares to get back uAD3CRV-f LPs
|
|
address bonding = ubiquityManager.bondingContractAddress();
|
|
IUbiquityBondingV2(bonding).removeLiquidity(
|
|
bond.lpAmount,
|
|
_bondingShareId
|
|
);
|
|
|
|
// STEP 2 : Withdraw uAD3CRV-f LPs to get back uAD or 3Crv
|
|
// DAI / USDC / USDT / CRV3 / UAD
|
|
if (tok[0] || tok[1] || tok[2] || tok[3] || tok[4]) {
|
|
uint256 amount2 = getTokenBal(TokenInterface(UAD3CRVf));
|
|
IUbiquityMetaPool(UAD3CRVf).remove_liquidity_one_coin(
|
|
amount2,
|
|
tok[4] ? 0 : 1,
|
|
0
|
|
);
|
|
}
|
|
|
|
// STEP 3 : Withdraw 3Crv LPs from 3Pool to get back DAI, USDC or USDT
|
|
// DAI / USDC / USDT
|
|
if (tok[0] || tok[1] || tok[2]) {
|
|
uint256 amount1 = getTokenBal(TokenInterface(CRV3));
|
|
I3Pool(Pool3).remove_liquidity_one_coin(
|
|
amount1,
|
|
tok[0] ? 0 : (tok[1] ? 1 : 2),
|
|
0
|
|
);
|
|
}
|
|
|
|
uint256 amount = getTokenBal(TokenInterface(token));
|
|
|
|
setUint(setId, amount);
|
|
_eventName = "LogWithdraw(address,uint256,uint256,uint256,address,uint256,uint256,uint256)";
|
|
_eventParam = abi.encode(
|
|
address(this),
|
|
_bondingShareId,
|
|
bond.lpAmount,
|
|
bond.endBlock,
|
|
token,
|
|
amount,
|
|
getId,
|
|
setId
|
|
);
|
|
}
|
|
}
|
|
|
|
contract ConnectV2Ubiquity is UbiquityResolver {
|
|
string public constant name = "Ubiquity-v1";
|
|
}
|