-
Notifications
You must be signed in to change notification settings - Fork 595
/
CollateralShort.sol
92 lines (72 loc) · 2.94 KB
/
CollateralShort.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;
// Inheritance
import "./Collateral.sol";
contract CollateralShort is Collateral {
constructor(
address _owner,
ICollateralManager _manager,
address _resolver,
bytes32 _collateralKey,
uint _minCratio,
uint _minCollateral
) public Collateral(_owner, _manager, _resolver, _collateralKey, _minCratio, _minCollateral) {}
function open(
uint collateral,
uint amount,
bytes32 currency
) external returns (uint id) {
// Transfer from will throw if they didn't set the allowance
IERC20(address(_synthsUSD())).transferFrom(msg.sender, address(this), collateral);
id = _open(collateral, amount, currency, true);
}
function close(uint id) external returns (uint amount, uint collateral) {
(amount, collateral) = _close(msg.sender, id);
IERC20(address(_synthsUSD())).transfer(msg.sender, collateral);
}
function deposit(
address borrower,
uint id,
uint amount
) external returns (uint principal, uint collateral) {
require(amount <= IERC20(address(_synthsUSD())).allowance(msg.sender, address(this)), "Allowance too low");
IERC20(address(_synthsUSD())).transferFrom(msg.sender, address(this), amount);
(principal, collateral) = _deposit(borrower, id, amount);
}
function withdraw(uint id, uint amount) external returns (uint principal, uint collateral) {
(principal, collateral) = _withdraw(id, amount);
IERC20(address(_synthsUSD())).transfer(msg.sender, amount);
}
function repay(
address borrower,
uint id,
uint amount
) external returns (uint principal, uint collateral) {
(principal, collateral) = _repay(borrower, msg.sender, id, amount);
}
function closeWithCollateral(uint id) external returns (uint amount, uint collateral) {
(amount, collateral) = _closeLoanByRepayment(msg.sender, id);
if (collateral > 0) {
IERC20(address(_synthsUSD())).transfer(msg.sender, collateral);
}
}
function repayWithCollateral(uint id, uint amount) external returns (uint principal, uint collateral) {
(principal, collateral) = _repayWithCollateral(msg.sender, id, amount);
}
// Needed for Lyra.
function getShortAndCollateral(address borrower, uint id) external view returns (uint principal, uint collateral) {
Loan memory loan = loans[id];
return (loan.amount, loan.collateral);
}
function draw(uint id, uint amount) external returns (uint principal, uint collateral) {
(principal, collateral) = _draw(id, amount);
}
function liquidate(
address borrower,
uint id,
uint amount
) external {
uint collateralLiquidated = _liquidate(borrower, id, amount);
IERC20(address(_synthsUSD())).transfer(msg.sender, collateralLiquidated);
}
}