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(_synthoUSD())).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(_synthoUSD())).transfer(msg.sender, collateral); } function deposit( address borrower, uint id, uint amount ) external returns (uint principal, uint collateral) { require(amount <= IERC20(address(_synthoUSD())).allowance(msg.sender, address(this)), "Allowance too low"); IERC20(address(_synthoUSD())).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(_synthoUSD())).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(_synthoUSD())).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(_synthoUSD())).transfer(msg.sender, collateralLiquidated); } }