diff --git a/contracts/core/Controller.sol b/contracts/core/Controller.sol index 1a6f7f030..f4889a0fa 100644 --- a/contracts/core/Controller.sol +++ b/contracts/core/Controller.sol @@ -21,43 +21,43 @@ import {CalleeInterface} from "../interfaces/CalleeInterface.sol"; /** * Controller Error Codes - * CO1: sender is not fullPauser - * CO2: sender is not partialPauser - * CO3: callee is not a whitelisted address - * CO4: system is partially paused - * CO5: system is fully paused - * CO6: msg.sender is not authorized to run action - * CO7: invalid addressbook address - * CO8: invalid owner address - * CO9: invalid input - * CO10: fullPauser cannot be set to address zero - * CO11: partialPauser cannot be set to address zero - * CO12: can not run actions for different owners - * CO13: can not run actions on different vaults - * CO14: invalid final vault state - * CO15: can not run actions on inexistent vault - * CO16: cannot deposit long otoken from this address - * CO17: otoken is not whitelisted to be used as collateral - * CO18: otoken used as collateral is already expired - * CO19: can not withdraw an expired otoken - * CO20: cannot deposit collateral from this address - * CO21: asset is not whitelisted to be used as collateral - * CO22: can not withdraw collateral from a vault with an expired short otoken - * CO23: otoken is not whitelisted to be minted - * CO24: can not mint expired otoken - * CO25: cannot burn from this address - * CO26: can not burn expired otoken - * CO27: otoken is not whitelisted to be redeemed - * CO28: can not redeem un-expired otoken - * CO29: asset prices not finalized yet - * CO30: can't settle vault with no otoken - * CO31: can not settle vault with un-expired otoken - * CO32: can not settle undercollateralized vault - * CO33: can not liquidate vault - * CO34: can not leave less than collateral dust - * CO35: invalid vault id - * CO36: cap amount should be greater than zero - * CO37: collateral exceed naked margin cap + * C1: sender is not full pauser + * C2: sender is not partial pauser + * C3: callee is not a whitelisted address + * C4: system is partially paused + * C5: system is fully paused + * C6: msg.sender is not authorized to run action + * C7: invalid addressbook address + * C8: invalid owner address + * C9: invalid input + * C10: fullPauser cannot be set to address zero + * C11: partialPauser cannot be set to address zero + * C12: can not run actions for different owners + * C13: can not run actions on different vaults + * C14: invalid final vault state + * C15: can not run actions on inexistent vault + * C16: cannot deposit long otoken from this address + * C17: otoken is not whitelisted to be used as collateral + * C18: otoken used as collateral is already expired + * C19: can not withdraw an expired otoken + * C20: cannot deposit collateral from this address + * C21: asset is not whitelisted to be used as collateral + * C22: can not withdraw collateral from a vault with an expired short otoken + * C23: otoken is not whitelisted to be minted + * C24: can not mint expired otoken + * C25: cannot burn from this address + * C26: can not burn expired otoken + * C27: otoken is not whitelisted to be redeemed + * C28: can not redeem un-expired otoken + * C29: asset prices not finalized yet + * C30: can't settle vault with no otoken + * C31: can not settle vault with un-expired otoken + * C32: can not settle undercollateralized vault + * C33: can not liquidate vault + * C34: can not leave less than collateral dust + * C35: invalid vault id + * C36: cap amount should be greater than zero + * C37: collateral exceed naked margin cap */ /** @@ -234,7 +234,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @notice modifier to check if sender is the fullPauser address */ modifier onlyFullPauser { - require(msg.sender == fullPauser, "CO1"); + require(msg.sender == fullPauser, "C1"); _; } @@ -243,7 +243,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @notice modifier to check if the sender is the partialPauser address */ modifier onlyPartialPauser { - require(msg.sender == partialPauser, "CO2"); + require(msg.sender == partialPauser, "C2"); _; } @@ -265,7 +265,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade */ modifier onlyWhitelistedCallee(address _callee) { if (callRestricted) { - require(_isCalleeWhitelisted(_callee), "CO3"); + require(_isCalleeWhitelisted(_callee), "C3"); } _; @@ -275,14 +275,14 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @dev check if the system is not in a partiallyPaused state */ function _isNotPartiallyPaused() internal view { - require(!systemPartiallyPaused, "CO4"); + require(!systemPartiallyPaused, "C4"); } /** * @dev check if the system is not in an fullyPaused state */ function _isNotFullyPaused() internal view { - require(!systemFullyPaused, "CO5"); + require(!systemFullyPaused, "C5"); } /** @@ -291,7 +291,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _accountOwner owner of a vault */ function _isAuthorized(address _sender, address _accountOwner) internal view { - require((_sender == _accountOwner) || (operators[_accountOwner][_sender]), "CO6"); + require((_sender == _accountOwner) || (operators[_accountOwner][_sender]), "C6"); } /** @@ -300,8 +300,8 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _owner account owner address */ function initialize(address _addressBook, address _owner) external initializer { - require(_addressBook != address(0), "CO7"); - require(_owner != address(0), "CO8"); + require(_addressBook != address(0), "C7"); + require(_owner != address(0), "C8"); __Ownable_init(_owner); __ReentrancyGuard_init_unchained(); @@ -330,7 +330,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _partiallyPaused new boolean value to set systemPartiallyPaused to */ function setSystemPartiallyPaused(bool _partiallyPaused) external onlyPartialPauser { - require(systemPartiallyPaused != _partiallyPaused, "CO9"); + require(systemPartiallyPaused != _partiallyPaused, "C9"); systemPartiallyPaused = _partiallyPaused; @@ -339,11 +339,11 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade /** * @notice allows the fullPauser to toggle the systemFullyPaused variable and fully pause or fully unpause the system - * @dev can only be called by the fullPauser + * @dev can only be called by the fullyPauser * @param _fullyPaused new boolean value to set systemFullyPaused to */ function setSystemFullyPaused(bool _fullyPaused) external onlyFullPauser { - require(systemFullyPaused != _fullyPaused, "CO9"); + require(systemFullyPaused != _fullyPaused, "C9"); systemFullyPaused = _fullyPaused; @@ -356,11 +356,9 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _fullPauser new fullPauser address */ function setFullPauser(address _fullPauser) external onlyOwner { - require(_fullPauser != address(0), "CO10"); - require(fullPauser != _fullPauser, "CO9"); - + require(_fullPauser != address(0), "C10"); + require(fullPauser != _fullPauser, "C9"); emit FullPauserUpdated(fullPauser, _fullPauser); - fullPauser = _fullPauser; } @@ -370,11 +368,9 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _partialPauser new partialPauser address */ function setPartialPauser(address _partialPauser) external onlyOwner { - require(_partialPauser != address(0), "CO11"); - require(partialPauser != _partialPauser, "CO9"); - + require(_partialPauser != address(0), "C11"); + require(partialPauser != _partialPauser, "C9"); emit PartialPauserUpdated(partialPauser, _partialPauser); - partialPauser = _partialPauser; } @@ -385,7 +381,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _isRestricted new call restriction state */ function setCallRestriction(bool _isRestricted) external onlyOwner { - require(callRestricted != _isRestricted, "CO9"); + require(callRestricted != _isRestricted, "C9"); callRestricted = _isRestricted; @@ -399,7 +395,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _isOperator new boolean value that expresses if the sender is giving or revoking privileges for _operator */ function setOperator(address _operator, bool _isOperator) external { - require(operators[msg.sender][_operator] != _isOperator, "CO9"); + require(operators[msg.sender][_operator] != _isOperator, "C9"); operators[msg.sender][_operator] = _isOperator; @@ -420,7 +416,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _cap cap amount, should be scaled by collateral asset decimals */ function setNakedCap(address _collateral, uint256 _cap) external onlyOwner { - require(_cap > 0, "CO36"); + require(_cap > 0, "C36"); nakedCap[_collateral] = _cap; @@ -489,7 +485,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @return amount of collateral that can be taken out */ function getProceed(address _owner, uint256 _vaultId) external view returns (uint256) { - (MarginVault.Vault memory vault, uint256 typeVault, ) = getVault(_owner, _vaultId); + (MarginVault.Vault memory vault, uint256 typeVault, ) = getVaultWithDetails(_owner, _vaultId); (uint256 netValue, bool isExcess) = calculator.getExcessCollateral(vault, typeVault); @@ -529,30 +525,34 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @return amount of collateral to pay out */ function getPayout(address _otoken, uint256 _amount) public view returns (uint256) { - uint256 rate = calculator.getExpiredPayoutRate(_otoken); - return rate.mul(_amount).div(10**BASE); + return calculator.getExpiredPayoutRate(_otoken).mul(_amount).div(10**BASE); } /** * @dev return if an expired oToken is ready to be settled, only true when price for underlying, * strike and collateral assets at this specific expiry is available in our Oracle module + * @param _otoken oToken + */ + function isSettlementAllowed(address _otoken) external view returns (bool) { + (address underlying, address strike, address collateral, uint256 expiry) = _getOtokenDetails(_otoken); + return _canSettleAssets(underlying, strike, collateral, expiry); + } + + /** + * @dev return if underlying, strike, collateral are all allowed to be settled * @param _underlying oToken underlying asset * @param _strike oToken strike asset * @param _collateral oToken collateral asset * @param _expiry otoken expiry timestamp * @return True if the oToken has expired AND all oracle prices at the expiry timestamp have been finalized, False if not */ - function isSettlementAllowed( + function canSettleAssets( address _underlying, address _strike, address _collateral, uint256 _expiry - ) public view returns (bool) { - bool isUnderlyingFinalized = oracle.isDisputePeriodOver(_underlying, _expiry); - bool isStrikeFinalized = oracle.isDisputePeriodOver(_strike, _expiry); - bool isCollateralFinalized = oracle.isDisputePeriodOver(_collateral, _expiry); - - return isUnderlyingFinalized && isStrikeFinalized && isCollateralFinalized; + ) external view returns (bool) { + return _canSettleAssets(_underlying, _strike, _collateral, _expiry); } /** @@ -570,9 +570,17 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @return True if the otoken has expired, False if not */ function hasExpired(address _otoken) external view returns (bool) { - uint256 otokenExpiryTimestamp = OtokenInterface(_otoken).expiryTimestamp(); + return now >= OtokenInterface(_otoken).expiryTimestamp(); + } - return now >= otokenExpiryTimestamp; + /** + * @notice return a specific vault + * @param _owner account owner + * @param _vaultId vault id of vault to return + * @return Vault struct that corresponds to the _vaultId of _owner + */ + function getVault(address _owner, uint256 _vaultId) external view returns (MarginVault.Vault memory) { + return (vaults[_owner][_vaultId]); } /** @@ -581,7 +589,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _vaultId vault id of vault to return * @return Vault struct that corresponds to the _vaultId of _owner, vault type and the latest timestamp when the vault was updated */ - function getVault(address _owner, uint256 _vaultId) + function getVaultWithDetails(address _owner, uint256 _vaultId) public view returns ( @@ -593,6 +601,24 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade return (vaults[_owner][_vaultId], vaultType[_owner][_vaultId], vaultLatestUpdate[_owner][_vaultId]); } + /** + * @notice get cap amount for collateral asset + * @param _asset collateral asset address + * @return cap amount + */ + function getNakedCap(address _asset) external view returns (uint256) { + return nakedCap[_asset]; + } + + /** + * @notice get amount of collateral deposited in all naked margin vaults + * @param _asset collateral asset address + * @return naked pool balance + */ + function getNakedPoolBalance(address _asset) external view returns (uint256) { + return nakedPoolBalance[_asset]; + } + /** * @notice execute a variety of actions * @dev for each action in the action array, execute the corresponding action, only one vault can be modified @@ -628,8 +654,8 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade ) { // check if this action is manipulating the same vault as all other actions, if a vault has already been updated if (vaultUpdated) { - require(vaultOwner == action.owner, "CO12"); - require(vaultId == action.vaultId, "CO13"); + require(vaultOwner == action.owner, "C12"); + require(vaultId == action.vaultId, "C13"); } vaultUpdated = true; vaultId = action.vaultId; @@ -670,10 +696,10 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _vaultId vault id of the final vault */ function _verifyFinalState(address _owner, uint256 _vaultId) internal view { - (MarginVault.Vault memory vault, uint256 typeVault, ) = getVault(_owner, _vaultId); + (MarginVault.Vault memory vault, uint256 typeVault, ) = getVaultWithDetails(_owner, _vaultId); (, bool isValidVault) = calculator.getExcessCollateral(vault, typeVault); - require(isValidVault, "CO14"); + require(isValidVault, "C14"); } /** @@ -688,7 +714,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade { uint256 vaultId = accountVaultCounter[_args.owner].add(1); - require(_args.vaultId == vaultId, "CO15"); + require(_args.vaultId == vaultId, "C15"); // store new vault accountVaultCounter[_args.owner] = vaultId; @@ -707,15 +733,15 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade notPartiallyPaused onlyAuthorized(msg.sender, _args.owner) { - require(_checkVaultId(_args.owner, _args.vaultId), "CO35"); + require(_checkVaultId(_args.owner, _args.vaultId), "C35"); // only allow vault owner or vault operator to deposit long otoken - require((_args.from == msg.sender) || (_args.from == _args.owner), "CO16"); + require((_args.from == msg.sender) || (_args.from == _args.owner), "C16"); - require(whitelist.isWhitelistedOtoken(_args.asset), "CO17"); + require(whitelist.isWhitelistedOtoken(_args.asset), "C17"); OtokenInterface otoken = OtokenInterface(_args.asset); - require(now < otoken.expiryTimestamp(), "CO18"); + require(now < otoken.expiryTimestamp(), "C18"); vaults[_args.owner][_args.vaultId].addLong(_args.asset, _args.amount, _args.index); @@ -734,11 +760,11 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade notPartiallyPaused onlyAuthorized(msg.sender, _args.owner) { - require(_checkVaultId(_args.owner, _args.vaultId), "CO35"); + require(_checkVaultId(_args.owner, _args.vaultId), "C35"); OtokenInterface otoken = OtokenInterface(_args.asset); - require(now < otoken.expiryTimestamp(), "CO19"); + require(now < otoken.expiryTimestamp(), "C19"); vaults[_args.owner][_args.vaultId].removeLong(_args.asset, _args.amount, _args.index); @@ -757,18 +783,18 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade notPartiallyPaused onlyAuthorized(msg.sender, _args.owner) { - require(_checkVaultId(_args.owner, _args.vaultId), "CO35"); + require(_checkVaultId(_args.owner, _args.vaultId), "C35"); // only allow vault owner or vault operator to deposit collateral - require((_args.from == msg.sender) || (_args.from == _args.owner), "CO20"); + require((_args.from == msg.sender) || (_args.from == _args.owner), "C20"); - require(whitelist.isWhitelistedCollateral(_args.asset), "CO21"); + require(whitelist.isWhitelistedCollateral(_args.asset), "C21"); - (, uint256 typeVault, ) = getVault(_args.owner, _args.vaultId); + (, uint256 typeVault, ) = getVaultWithDetails(_args.owner, _args.vaultId); if (typeVault == 1) { nakedPoolBalance[_args.asset] = nakedPoolBalance[_args.asset].add(_args.amount); - require(nakedPoolBalance[_args.asset] <= nakedCap[_args.asset], "CO37"); + require(nakedPoolBalance[_args.asset] <= nakedCap[_args.asset], "C37"); } vaults[_args.owner][_args.vaultId].addCollateral(_args.asset, _args.amount, _args.index); @@ -788,14 +814,14 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade notPartiallyPaused onlyAuthorized(msg.sender, _args.owner) { - require(_checkVaultId(_args.owner, _args.vaultId), "CO35"); + require(_checkVaultId(_args.owner, _args.vaultId), "C35"); - (MarginVault.Vault memory vault, uint256 typeVault, ) = getVault(_args.owner, _args.vaultId); + (MarginVault.Vault memory vault, uint256 typeVault, ) = getVaultWithDetails(_args.owner, _args.vaultId); if (_isNotEmpty(vault.shortOtokens)) { OtokenInterface otoken = OtokenInterface(vault.shortOtokens[0]); - require(now < otoken.expiryTimestamp(), "CO22"); + require(now < otoken.expiryTimestamp(), "C22"); } if (typeVault == 1) { @@ -819,12 +845,12 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade notPartiallyPaused onlyAuthorized(msg.sender, _args.owner) { - require(_checkVaultId(_args.owner, _args.vaultId), "CO35"); - require(whitelist.isWhitelistedOtoken(_args.otoken), "CO23"); + require(_checkVaultId(_args.owner, _args.vaultId), "C35"); + require(whitelist.isWhitelistedOtoken(_args.otoken), "C23"); OtokenInterface otoken = OtokenInterface(_args.otoken); - require(now < otoken.expiryTimestamp(), "CO24"); + require(now < otoken.expiryTimestamp(), "C24"); vaults[_args.owner][_args.vaultId].addShort(_args.otoken, _args.amount, _args.index); @@ -844,14 +870,14 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade onlyAuthorized(msg.sender, _args.owner) { // check that vault id is valid for this vault owner - require(_checkVaultId(_args.owner, _args.vaultId), "CO35"); + require(_checkVaultId(_args.owner, _args.vaultId), "C35"); // only allow vault owner or vault operator to burn otoken - require((_args.from == msg.sender) || (_args.from == _args.owner), "CO25"); + require((_args.from == msg.sender) || (_args.from == _args.owner), "C25"); OtokenInterface otoken = OtokenInterface(_args.otoken); // do not allow burning expired otoken - require(now < otoken.expiryTimestamp(), "CO26"); + require(now < otoken.expiryTimestamp(), "C26"); // remove otoken from vault vaults[_args.owner][_args.vaultId].removeShort(_args.otoken, _args.amount, _args.index); @@ -871,14 +897,14 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade OtokenInterface otoken = OtokenInterface(_args.otoken); // check that otoken to redeem is whitelisted - require(whitelist.isWhitelistedOtoken(_args.otoken), "CO27"); + require(whitelist.isWhitelistedOtoken(_args.otoken), "C27"); - (address collateral, address underlying, address strike, , uint256 expiry, ) = otoken.getOtokenDetails(); + (address collateral, address underlying, address strike, uint256 expiry) = _getOtokenDetails(address(otoken)); // only allow redeeming expired otoken - require(now >= expiry, "CO28"); + require(now >= expiry, "C28"); - require(isSettlementAllowed(underlying, strike, collateral, expiry), "CO29"); + require(_canSettleAssets(underlying, strike, collateral, expiry), "C29"); uint256 payout = getPayout(_args.otoken, _args.amount); @@ -895,9 +921,9 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _args SettleVaultArgs structure */ function _settleVault(Actions.SettleVaultArgs memory _args) internal onlyAuthorized(msg.sender, _args.owner) { - require(_checkVaultId(_args.owner, _args.vaultId), "CO35"); + require(_checkVaultId(_args.owner, _args.vaultId), "C35"); - (MarginVault.Vault memory vault, uint256 typeVault, ) = getVault(_args.owner, _args.vaultId); + (MarginVault.Vault memory vault, uint256 typeVault, ) = getVaultWithDetails(_args.owner, _args.vaultId); OtokenInterface otoken; @@ -910,7 +936,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade bool hasShort = _isNotEmpty(vault.shortOtokens); bool hasLong = _isNotEmpty(vault.longOtokens); - require(hasShort || hasLong, "CO30"); + require(hasShort || hasLong, "C30"); otoken = hasShort ? OtokenInterface(vault.shortOtokens[0]) : OtokenInterface(vault.longOtokens[0]); @@ -921,17 +947,17 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade } } - (address collateral, address underlying, address strike, , uint256 expiry, ) = otoken.getOtokenDetails(); + (address collateral, address underlying, address strike, uint256 expiry) = _getOtokenDetails(address(otoken)); // do not allow settling vault with un-expired otoken - require(now >= expiry, "CO31"); - require(isSettlementAllowed(underlying, strike, collateral, expiry), "CO29"); + require(now >= expiry, "C31"); + require(_canSettleAssets(underlying, strike, collateral, expiry), "C29"); (uint256 payout, bool isValidVault) = calculator.getExcessCollateral(vault, typeVault); // require that vault is valid (has excess collateral) before settling // to avoid allowing settling undercollateralized naked margin vault - require(isValidVault, "CO32"); + require(isValidVault, "C32"); delete vaults[_args.owner][_args.vaultId]; @@ -953,7 +979,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade * @param _args liquidation action arguments struct */ function _liquidate(Actions.LiquidateArgs memory _args) internal notPartiallyPaused { - require(_checkVaultId(_args.owner, _args.vaultId), "CO35"); + require(_checkVaultId(_args.owner, _args.vaultId), "C35"); // check if vault is undercollateralized // the price is the amount of collateral asset to pay per 1 repaid debt(otoken) @@ -964,7 +990,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade _args.roundId ); - require(isUnderCollat, "CO33"); + require(isUnderCollat, "C33"); // amount of collateral to offer to liquidator uint256 collateralToSell = _args.amount.mul(price).div(1e8); @@ -972,7 +998,7 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade // if vault is partially liquidated (amount of short otoken is still greater than zero) // make sure remaining collateral amount is greater than dust amount if (vault.shortAmounts[0].sub(_args.amount) > 0) { - require(vault.collateralAmounts[0].sub(collateralToSell) >= collateralDust, "CO34"); + require(vault.collateralAmounts[0].sub(collateralToSell) >= collateralDust, "C34"); } // burn short otoken from liquidator address, index of short otoken hardcoded at 0 @@ -1057,7 +1083,10 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade uint256 ) { - (MarginVault.Vault memory vault, uint256 typeVault, uint256 latestUpdateTimestamp) = getVault(_owner, _vaultId); + (MarginVault.Vault memory vault, uint256 typeVault, uint256 latestUpdateTimestamp) = getVaultWithDetails( + _owner, + _vaultId + ); (bool isUnderCollat, uint256 price, uint256 collateralDust) = calculator.isLiquidatable( vault, typeVault, @@ -1069,21 +1098,48 @@ contract Controller is Initializable, OwnableUpgradeSafe, ReentrancyGuardUpgrade } /** - * @notice get cap amount for collateral asset - * @param _asset collateral asset address - * @return cap amount + * @dev get otoken detail, from both otoken versions */ - function getNakedCap(address _asset) external view returns (uint256) { - return nakedCap[_asset]; + function _getOtokenDetails(address _otoken) + internal + view + returns ( + address, + address, + address, + uint256 + ) + { + OtokenInterface otoken = OtokenInterface(_otoken); + try otoken.getOtokenDetails() returns ( + address collateral, + address underlying, + address strike, + uint256, + uint256 expiry, + bool + ) { + return (collateral, underlying, strike, expiry); + } catch { + return (otoken.collateralAsset(), otoken.underlyingAsset(), otoken.strikeAsset(), otoken.expiryTimestamp()); + } } /** - * @notice get amount of collateral deposited in all naked margin vaults - * @param _asset collateral asset address - * @return naked pool balance + * @dev return if an expired oToken is ready to be settled, only true when price for underlying, + * strike and collateral assets at this specific expiry is available in our Oracle module + * @return True if the oToken has expired AND all oracle prices at the expiry timestamp have been finalized, False if not */ - function getNakedPoolBalance(address _asset) external view returns (uint256) { - return nakedPoolBalance[_asset]; + function _canSettleAssets( + address _underlying, + address _strike, + address _collateral, + uint256 _expiry + ) internal view returns (bool) { + return + oracle.isDisputePeriodOver(_underlying, _expiry) && + oracle.isDisputePeriodOver(_strike, _expiry) && + oracle.isDisputePeriodOver(_collateral, _expiry); } /** diff --git a/contracts/core/MarginCalculator.sol b/contracts/core/MarginCalculator.sol index cad64886f..4987c09fb 100644 --- a/contracts/core/MarginCalculator.sol +++ b/contracts/core/MarginCalculator.sol @@ -364,8 +364,6 @@ contract MarginCalculator is Ownable { function getExpiredPayoutRate(address _otoken) external view returns (uint256) { require(_otoken != address(0), "MarginCalculator: Invalid token address"); - OtokenInterface otoken = OtokenInterface(_otoken); - ( address collateral, address underlying, @@ -373,7 +371,7 @@ contract MarginCalculator is Ownable { uint256 strikePrice, uint256 expiry, bool isPut - ) = otoken.getOtokenDetails(); + ) = _getOtokenDetails(_otoken); require(now >= expiry, "MarginCalculator: Otoken not expired yet"); @@ -1072,7 +1070,7 @@ contract MarginCalculator is Ownable { vaultDetails.longStrikePrice, vaultDetails.longExpiryTimestamp, vaultDetails.isLongPut - ) = long.getOtokenDetails(); + ) = _getOtokenDetails(address(long)); vaultDetails.longCollateralDecimals = uint256(ERC20Interface(vaultDetails.longCollateralAsset).decimals()); } @@ -1086,7 +1084,7 @@ contract MarginCalculator is Ownable { vaultDetails.shortStrikePrice, vaultDetails.shortExpiryTimestamp, vaultDetails.isShortPut - ) = short.getOtokenDetails(); + ) = _getOtokenDetails(address(short)); vaultDetails.shortCollateralDecimals = uint256( ERC20Interface(vaultDetails.shortCollateralAsset).decimals() ); @@ -1249,4 +1247,42 @@ contract MarginCalculator is Ownable { return _underlyingPrice.isGreaterThan(_strikePrice) ? _underlyingPrice.sub(_strikePrice) : ZERO; } + + /** + * @dev get otoken detail, from both otoken versions + */ + function _getOtokenDetails(address _otoken) + internal + view + returns ( + address, + address, + address, + uint256, + uint256, + bool + ) + { + OtokenInterface otoken = OtokenInterface(_otoken); + try otoken.getOtokenDetails() returns ( + address collateral, + address underlying, + address strike, + uint256 strikePrice, + uint256 expiry, + bool isPut + ) { + return (collateral, underlying, strike, strikePrice, expiry, isPut); + } catch { + // v1 otoken + return ( + otoken.collateralAsset(), + otoken.underlyingAsset(), + otoken.strikeAsset(), + otoken.strikePrice(), + otoken.expiryTimestamp(), + otoken.isPut() + ); + } + } } diff --git a/contracts/libs/Actions.sol b/contracts/libs/Actions.sol index c32f709ef..08c70aba7 100644 --- a/contracts/libs/Actions.sol +++ b/contracts/libs/Actions.sol @@ -9,6 +9,30 @@ import {MarginVault} from "./MarginVault.sol"; * @title Actions * @author Opyn Team * @notice A library that provides a ActionArgs struct, sub types of Action structs, and functions to parse ActionArgs into specific Actions. + * errorCode + * A1 can only parse arguments for open vault actions + * A2 cannot open vault for an invalid account + * A3 cannot open vault with an invalid type + * A4 can only parse arguments for mint actions + * A5 cannot mint from an invalid account + * A6 can only parse arguments for burn actions + * A7 cannot burn from an invalid account + * A8 can only parse arguments for deposit actions + * A9 cannot deposit to an invalid account + * A10 can only parse arguments for withdraw actions + * A11 cannot withdraw from an invalid account + * A12 cannot withdraw to an invalid account + * A13 can only parse arguments for redeem actions + * A14 cannot redeem to an invalid account + * A15 can only parse arguments for settle vault actions + * A16 cannot settle vault for an invalid account + * A17 cannot withdraw payout to an invalid account + * A18 can only parse arguments for liquidate action + * A19 cannot liquidate vault for an invalid account owner + * A20 cannot send collateral to an invalid account + * A21 cannot parse liquidate action with no round id + * A22 can only parse arguments for call actions + * A23 target address cannot be address(0) */ library Actions { // possible actions that can be performed @@ -163,8 +187,8 @@ library Actions { * @return arguments for a open vault action */ function _parseOpenVaultArgs(ActionArgs memory _args) internal pure returns (OpenVaultArgs memory) { - require(_args.actionType == ActionType.OpenVault, "Actions: can only parse arguments for open vault actions"); - require(_args.owner != address(0), "Actions: cannot open vault for an invalid account"); + require(_args.actionType == ActionType.OpenVault, "A1"); + require(_args.owner != address(0), "A2"); // if not _args.data included, vault type will be 0 by default uint256 vaultType; @@ -175,7 +199,7 @@ library Actions { } // for now we only have 2 vault types - require(vaultType < 2, "Actions: cannot open vault with an invalid type"); + require(vaultType < 2, "A3"); return OpenVaultArgs({owner: _args.owner, vaultId: _args.vaultId, vaultType: vaultType}); } @@ -186,8 +210,8 @@ library Actions { * @return arguments for a mint action */ function _parseMintArgs(ActionArgs memory _args) internal pure returns (MintArgs memory) { - require(_args.actionType == ActionType.MintShortOption, "Actions: can only parse arguments for mint actions"); - require(_args.owner != address(0), "Actions: cannot mint from an invalid account"); + require(_args.actionType == ActionType.MintShortOption, "A4"); + require(_args.owner != address(0), "A5"); return MintArgs({ @@ -206,8 +230,8 @@ library Actions { * @return arguments for a burn action */ function _parseBurnArgs(ActionArgs memory _args) internal pure returns (BurnArgs memory) { - require(_args.actionType == ActionType.BurnShortOption, "Actions: can only parse arguments for burn actions"); - require(_args.owner != address(0), "Actions: cannot burn from an invalid account"); + require(_args.actionType == ActionType.BurnShortOption, "A6"); + require(_args.owner != address(0), "A7"); return BurnArgs({ @@ -228,9 +252,9 @@ library Actions { function _parseDepositArgs(ActionArgs memory _args) internal pure returns (DepositArgs memory) { require( (_args.actionType == ActionType.DepositLongOption) || (_args.actionType == ActionType.DepositCollateral), - "Actions: can only parse arguments for deposit actions" + "A8" ); - require(_args.owner != address(0), "Actions: cannot deposit to an invalid account"); + require(_args.owner != address(0), "A9"); return DepositArgs({ @@ -251,10 +275,10 @@ library Actions { function _parseWithdrawArgs(ActionArgs memory _args) internal pure returns (WithdrawArgs memory) { require( (_args.actionType == ActionType.WithdrawLongOption) || (_args.actionType == ActionType.WithdrawCollateral), - "Actions: can only parse arguments for withdraw actions" + "A10" ); - require(_args.owner != address(0), "Actions: cannot withdraw from an invalid account"); - require(_args.secondAddress != address(0), "Actions: cannot withdraw to an invalid account"); + require(_args.owner != address(0), "A11"); + require(_args.secondAddress != address(0), "A12"); return WithdrawArgs({ @@ -273,8 +297,8 @@ library Actions { * @return arguments for a redeem action */ function _parseRedeemArgs(ActionArgs memory _args) internal pure returns (RedeemArgs memory) { - require(_args.actionType == ActionType.Redeem, "Actions: can only parse arguments for redeem actions"); - require(_args.secondAddress != address(0), "Actions: cannot redeem to an invalid account"); + require(_args.actionType == ActionType.Redeem, "A13"); + require(_args.secondAddress != address(0), "A14"); return RedeemArgs({receiver: _args.secondAddress, otoken: _args.asset, amount: _args.amount}); } @@ -285,21 +309,18 @@ library Actions { * @return arguments for a settle vault action */ function _parseSettleVaultArgs(ActionArgs memory _args) internal pure returns (SettleVaultArgs memory) { - require( - _args.actionType == ActionType.SettleVault, - "Actions: can only parse arguments for settle vault actions" - ); - require(_args.owner != address(0), "Actions: cannot settle vault for an invalid account"); - require(_args.secondAddress != address(0), "Actions: cannot withdraw payout to an invalid account"); + require(_args.actionType == ActionType.SettleVault, "A15"); + require(_args.owner != address(0), "A16"); + require(_args.secondAddress != address(0), "A17"); return SettleVaultArgs({owner: _args.owner, vaultId: _args.vaultId, to: _args.secondAddress}); } function _parseLiquidateArgs(ActionArgs memory _args) internal pure returns (LiquidateArgs memory) { - require(_args.actionType == ActionType.Liquidate, "Actions: can only parse arguments for liquidate action"); - require(_args.owner != address(0), "Actions: cannot liquidate vault for an invalid account owner"); - require(_args.secondAddress != address(0), "Actions: cannot send collateral to an invalid account"); - require(_args.data.length == 32, "Actions: cannot parse liquidate action with no round id"); + require(_args.actionType == ActionType.Liquidate, "A18"); + require(_args.owner != address(0), "A19"); + require(_args.secondAddress != address(0), "A20"); + require(_args.data.length == 32, "A21"); // decode chainlink round id from _args.data uint256 roundId = abi.decode(_args.data, (uint256)); @@ -320,8 +341,8 @@ library Actions { * @return arguments for a call action */ function _parseCallArgs(ActionArgs memory _args) internal pure returns (CallArgs memory) { - require(_args.actionType == ActionType.Call, "Actions: can only parse arguments for call actions"); - require(_args.secondAddress != address(0), "Actions: target address cannot be address(0)"); + require(_args.actionType == ActionType.Call, "A22"); + require(_args.secondAddress != address(0), "A23"); return CallArgs({callee: _args.secondAddress, data: _args.data}); } diff --git a/contracts/libs/MarginVault.sol b/contracts/libs/MarginVault.sol index 11a17e84c..1cc418ce4 100644 --- a/contracts/libs/MarginVault.sol +++ b/contracts/libs/MarginVault.sol @@ -7,6 +7,19 @@ pragma experimental ABIEncoderV2; import {SafeMath} from "../packages/oz/SafeMath.sol"; +/** + * MarginVault Error Codes + * V1: invalid short otoken amount + * V2: invalid short otoken index + * V3: short otoken address mismatch + * V4: invalid long otoken amount + * V5: invalid long otoken index + * V6: long otoken address mismatch + * V7: invalid collateral amount + * V8: invalid collateral token index + * V9: collateral token address mismatch + */ + /** * @title MarginVault * @author Opyn Team @@ -47,7 +60,7 @@ library MarginVault { uint256 _amount, uint256 _index ) external { - require(_amount > 0, "MarginVault: invalid short otoken amount"); + require(_amount > 0, "V1"); // valid indexes in any array are between 0 and array.length - 1. // if adding an amount to an preexisting short oToken, check that _index is in the range of 0->length-1 @@ -55,15 +68,9 @@ library MarginVault { _vault.shortOtokens.push(_shortOtoken); _vault.shortAmounts.push(_amount); } else { - require( - (_index < _vault.shortOtokens.length) && (_index < _vault.shortAmounts.length), - "MarginVault: invalid short otoken index" - ); + require((_index < _vault.shortOtokens.length) && (_index < _vault.shortAmounts.length), "V2"); address existingShort = _vault.shortOtokens[_index]; - require( - (existingShort == _shortOtoken) || (existingShort == address(0)), - "MarginVault: short otoken address mismatch" - ); + require((existingShort == _shortOtoken) || (existingShort == address(0)), "V3"); _vault.shortAmounts[_index] = _vault.shortAmounts[_index].add(_amount); _vault.shortOtokens[_index] = _shortOtoken; @@ -84,8 +91,8 @@ library MarginVault { uint256 _index ) external { // check that the removed short oToken exists in the vault at the specified index - require(_index < _vault.shortOtokens.length, "MarginVault: invalid short otoken index"); - require(_vault.shortOtokens[_index] == _shortOtoken, "MarginVault: short otoken address mismatch"); + require(_index < _vault.shortOtokens.length, "V2"); + require(_vault.shortOtokens[_index] == _shortOtoken, "V3"); uint256 newShortAmount = _vault.shortAmounts[_index].sub(_amount); @@ -108,7 +115,7 @@ library MarginVault { uint256 _amount, uint256 _index ) external { - require(_amount > 0, "MarginVault: invalid long otoken amount"); + require(_amount > 0, "V4"); // valid indexes in any array are between 0 and array.length - 1. // if adding an amount to an preexisting short oToken, check that _index is in the range of 0->length-1 @@ -116,15 +123,9 @@ library MarginVault { _vault.longOtokens.push(_longOtoken); _vault.longAmounts.push(_amount); } else { - require( - (_index < _vault.longOtokens.length) && (_index < _vault.longAmounts.length), - "MarginVault: invalid long otoken index" - ); + require((_index < _vault.longOtokens.length) && (_index < _vault.longAmounts.length), "V5"); address existingLong = _vault.longOtokens[_index]; - require( - (existingLong == _longOtoken) || (existingLong == address(0)), - "MarginVault: long otoken address mismatch" - ); + require((existingLong == _longOtoken) || (existingLong == address(0)), "V6"); _vault.longAmounts[_index] = _vault.longAmounts[_index].add(_amount); _vault.longOtokens[_index] = _longOtoken; @@ -145,8 +146,8 @@ library MarginVault { uint256 _index ) external { // check that the removed long oToken exists in the vault at the specified index - require(_index < _vault.longOtokens.length, "MarginVault: invalid long otoken index"); - require(_vault.longOtokens[_index] == _longOtoken, "MarginVault: long otoken address mismatch"); + require(_index < _vault.longOtokens.length, "V5"); + require(_vault.longOtokens[_index] == _longOtoken, "V6"); uint256 newLongAmount = _vault.longAmounts[_index].sub(_amount); @@ -169,7 +170,7 @@ library MarginVault { uint256 _amount, uint256 _index ) external { - require(_amount > 0, "MarginVault: invalid collateral amount"); + require(_amount > 0, "V7"); // valid indexes in any array are between 0 and array.length - 1. // if adding an amount to an preexisting short oToken, check that _index is in the range of 0->length-1 @@ -177,15 +178,9 @@ library MarginVault { _vault.collateralAssets.push(_collateralAsset); _vault.collateralAmounts.push(_amount); } else { - require( - (_index < _vault.collateralAssets.length) && (_index < _vault.collateralAmounts.length), - "MarginVault: invalid collateral token index" - ); + require((_index < _vault.collateralAssets.length) && (_index < _vault.collateralAmounts.length), "V8"); address existingCollateral = _vault.collateralAssets[_index]; - require( - (existingCollateral == _collateralAsset) || (existingCollateral == address(0)), - "MarginVault: collateral token address mismatch" - ); + require((existingCollateral == _collateralAsset) || (existingCollateral == address(0)), "V9"); _vault.collateralAmounts[_index] = _vault.collateralAmounts[_index].add(_amount); _vault.collateralAssets[_index] = _collateralAsset; @@ -206,8 +201,8 @@ library MarginVault { uint256 _index ) external { // check that the removed collateral exists in the vault at the specified index - require(_index < _vault.collateralAssets.length, "MarginVault: invalid collateral asset index"); - require(_vault.collateralAssets[_index] == _collateralAsset, "MarginVault: collateral token address mismatch"); + require(_index < _vault.collateralAssets.length, "V8"); + require(_vault.collateralAssets[_index] == _collateralAsset, "V9"); uint256 newCollateralAmount = _vault.collateralAmounts[_index].sub(_amount); diff --git a/contracts/tests/OtokenImplV1.sol b/contracts/tests/OtokenImplV1.sol new file mode 100644 index 000000000..0766ba3f9 --- /dev/null +++ b/contracts/tests/OtokenImplV1.sol @@ -0,0 +1,64 @@ +pragma solidity =0.6.10; + +import {ERC20PermitUpgradeable} from "../packages/oz/upgradeability/erc20-permit/ERC20PermitUpgradeable.sol"; +import {AddressBookInterface} from "../interfaces/AddressBookInterface.sol"; + +/** + * SPDX-License-Identifier: UNLICENSED + * @dev The Otoken inherits ERC20PermitUpgradeable because we need to use the init instead of constructor + * This is V1 implementation, with no getOtokenDetails() + */ +contract OtokenImplV1 is ERC20PermitUpgradeable { + address public addressBook; + address public controller; + address public underlyingAsset; + address public strikeAsset; + address public collateralAsset; + + uint256 public strikePrice; + uint256 public expiryTimestamp; + + bool public isPut; + + bool public inited = false; + + function init( + address _addressBook, + address _underlyingAsset, + address _strikeAsset, + address _collateralAsset, + uint256 _strikePrice, + uint256 _expiryTimestamp, + bool _isPut + ) external initializer { + inited = true; + controller = AddressBookInterface(_addressBook).getController(); + underlyingAsset = _underlyingAsset; + strikeAsset = _strikeAsset; + collateralAsset = _collateralAsset; + strikePrice = _strikePrice; + expiryTimestamp = _expiryTimestamp; + isPut = _isPut; + string memory tokenName = "ETHUSDC/1597511955/200P/USDC"; + string memory tokenSymbol = "oETHUSDCP"; + __ERC20_init_unchained(tokenName, tokenSymbol); + __ERC20Permit_init(tokenName); + _setupDecimals(8); + } + + function mintOtoken(address _to, uint256 _amount) external { + _mint(_to, _amount); + } + + function burnOtoken(address account, uint256 amount) external { + _burn(account, amount); + } + + function getChainId() external view returns (uint256 chainId) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + // solhint-disable-next-line no-inline-assembly + assembly { + chainId := chainid() + } + } +} diff --git a/docs/contracts-documentation/core/Controller.md b/docs/contracts-documentation/core/Controller.md index 865847ca5..f39f8f8ce 100644 --- a/docs/contracts-documentation/core/Controller.md +++ b/docs/contracts-documentation/core/Controller.md @@ -42,6 +42,8 @@ Contract that controls the Gamma Protocol and the interaction of all sub contrac - `refreshConfiguration() (external)` +- `setNakedCap(address _collateral, uint256 _cap) (external)` + - `operate(struct Actions.ActionArgs[] _actions) (external)` - `sync(address _owner, uint256 _vaultId) (external)` @@ -56,13 +58,21 @@ Contract that controls the Gamma Protocol and the interaction of all sub contrac - `getPayout(address _otoken, uint256 _amount) (public)` -- `isSettlementAllowed(address _underlying, address _strike, address _collateral, uint256 _expiry) (public)` +- `isSettlementAllowed(address _otoken) (external)` + +- `canSettleAssets(address _underlying, address _strike, address _collateral, uint256 _expiry) (external)` - `getAccountVaultCounter(address _accountOwner) (external)` - `hasExpired(address _otoken) (external)` -- `getVault(address _owner, uint256 _vaultId) (public)` +- `getVault(address _owner, uint256 _vaultId) (external)` + +- `getVaultWithDetails(address _owner, uint256 _vaultId) (public)` + +- `getNakedCap(address _asset) (external)` + +- `getNakedPoolBalance(address _asset) (external)` - `_runActions(struct Actions.ActionArgs[] _actions) (internal)` @@ -98,6 +108,10 @@ Contract that controls the Gamma Protocol and the interaction of all sub contrac - `_isLiquidatable(address _owner, uint256 _vaultId, uint256 _roundId) (internal)` +- `_getOtokenDetails(address _otoken) (internal)` + +- `_canSettleAssets(address _underlying, address _strike, address _collateral, uint256 _expiry) (internal)` + - `_refreshConfigInternal() (internal)` ## Events: @@ -138,6 +152,8 @@ Contract that controls the Gamma Protocol and the interaction of all sub contrac - `Donated(address donator, address asset, uint256 amount)` +- `NakedCapUpdated(address collateral, uint256 cap)` + ### Modifier `notPartiallyPaused()` modifier to check if the system is not partially paused, where only redeem and settleVault is allowed @@ -216,7 +232,7 @@ use donate() instead of direct transfer() to store the balance in assetBalance allows the partialPauser to toggle the systemPartiallyPaused variable and partially pause or partially unpause the system -can only be called by the partialPauser +can only be called by the pauser #### Parameters: @@ -226,7 +242,7 @@ can only be called by the partialPauser allows the fullPauser to toggle the systemFullyPaused variable and fully pause or fully unpause the system -can only be called by the fullPauser +can only be called by the pauser #### Parameters: @@ -280,6 +296,18 @@ can only be updated by the vault owner updates the configuration of the controller. can only be called by the owner +### Function `setNakedCap(address _collateral, uint256 _cap) external` + +set cap amount for collateral asset used in naked margin + +can only be called by owner + +#### Parameters: + +- `_collateral`: collateral asset address + +- `_cap`: cap amount, should be scaled by collateral asset decimals + ### Function `operate(struct Actions.ActionArgs[] _actions) external` execute a number of actions on specific vaults @@ -376,7 +404,7 @@ get an oToken's payout/cash value after expiry, in the collateral asset - amount of collateral to pay out -### Function `isSettlementAllowed(address _underlying, address _strike, address _collateral, uint256 _expiry) → bool public` +### Function `isSettlementAllowed(address _otoken) → bool external` return if an expired oToken is ready to be settled, only true when price for underlying, @@ -384,6 +412,14 @@ strike and collateral assets at this specific expiry is available in our Oracle #### Parameters: +- `_otoken`: oToken + +### Function `canSettleAssets(address _underlying, address _strike, address _collateral, uint256 _expiry) → bool external` + +return if underlying, strike, collateral are all allowed to be settled + +#### Parameters: + - `_underlying`: oToken underlying asset - `_strike`: oToken strike asset @@ -420,7 +456,21 @@ check if an oToken has expired - True if the otoken has expired, False if not -### Function `getVault(address _owner, uint256 _vaultId) → struct MarginVault.Vault, uint256, uint256 public` +### Function `getVault(address _owner, uint256 _vaultId) → struct MarginVault.Vault external` + +return a specific vault + +#### Parameters: + +- `_owner`: account owner + +- `_vaultId`: vault id of vault to return + +#### Return Values: + +- Vault struct that corresponds to the _vaultId of _owner + +### Function `getVaultWithDetails(address _owner, uint256 _vaultId) → struct MarginVault.Vault, uint256, uint256 public` return a specific vault @@ -434,6 +484,30 @@ return a specific vault - Vault struct that corresponds to the _vaultId of _owner, vault type and the latest timestamp when the vault was updated +### Function `getNakedCap(address _asset) → uint256 external` + +get cap amount for collateral asset + +#### Parameters: + +- `_asset`: collateral asset address + +#### Return Values: + +- cap amount + +### Function `getNakedPoolBalance(address _asset) → uint256 external` + +get amount of collateral deposited in all naked margin vaults + +#### Parameters: + +- `_asset`: collateral asset address + +#### Return Values: + +- naked pool balance + ### Function `_runActions(struct Actions.ActionArgs[] _actions) → bool, address, uint256 internal` execute a variety of actions @@ -618,6 +692,20 @@ check if a vault is liquidatable in a specific round id - vault struct, isLiquidatable, true if vault is undercollateralized, the price of 1 repaid otoken and the otoken collateral dust amount +### Function `_getOtokenDetails(address _otoken) → address, address, address, uint256 internal` + +get otoken detail, from both otoken versions + +### Function `_canSettleAssets(address _underlying, address _strike, address _collateral, uint256 _expiry) → bool internal` + +return if an expired oToken is ready to be settled, only true when price for underlying, + +strike and collateral assets at this specific expiry is available in our Oracle module + +#### Return Values: + +- True if the oToken has expired AND all oracle prices at the expiry timestamp have been finalized, False if not + ### Function `_refreshConfigInternal() internal` updates the internal configuration of the controller @@ -693,3 +781,7 @@ emits an event when the call action restriction changes ### Event `Donated(address donator, address asset, uint256 amount)` emits an event when a donation transfer executed + +### Event `NakedCapUpdated(address collateral, uint256 cap)` + +emits an event when naked cap is updated diff --git a/docs/contracts-documentation/core/MarginCalculator.md b/docs/contracts-documentation/core/MarginCalculator.md index f69dc27cf..8d720b9ae 100644 --- a/docs/contracts-documentation/core/MarginCalculator.md +++ b/docs/contracts-documentation/core/MarginCalculator.md @@ -8,8 +8,6 @@ Calculator module that checks if a given vault is valid, calculates margin requi - `setCollateralDust(address _collateral, uint256 _dust) (external)` -- `setCollateralCap(address _collateral, uint256 _cap) (external)` - - `setUpperBoundValues(address _underlying, address _strike, address _collateral, bool _isPut, uint256[] _timesToExpiry, uint256[] _values) (external)` - `updateUpperBoundValue(address _underlying, address _strike, address _collateral, bool _isPut, uint256 _timeToExpiry, uint256 _value) (external)` @@ -20,8 +18,6 @@ Calculator module that checks if a given vault is valid, calculates margin requi - `getCollateralDust(address _collateral) (external)` -- `getCollateralCap(address _collateral) (external)` - - `getTimesToExpiry(address _underlying, address _strike, address _collateral, bool _isPut) (external)` - `getMaxPrice(address _underlying, address _strike, address _collateral, bool _isPut, uint256 _timeToExpiry) (external)` @@ -74,12 +70,12 @@ Calculator module that checks if a given vault is valid, calculates margin requi - `_getCashValue(struct FixedPointInt256.FixedPointInt _strikePrice, struct FixedPointInt256.FixedPointInt _underlyingPrice, bool _isPut) (internal)` +- `_getOtokenDetails(address _otoken) (internal)` + ## Events: - `CollateralDustUpdated(address collateral, uint256 dust)` -- `CollateralCapUpdated(address collateral, uint256 cap)` - - `TimeToExpiryAdded(bytes32 productHash, uint256 timeToExpiry)` - `MaxPriceAdded(bytes32 productHash, uint256 timeToExpiry, uint256 value)` @@ -110,18 +106,6 @@ can only be called by owner - `_dust`: dust amount, should be scaled by collateral asset decimals -### Function `setCollateralCap(address _collateral, uint256 _cap) external` - -set cap amount for collateral asset used in naked margin - -can only be called by owner - -#### Parameters: - -- `_collateral`: collateral asset address - -- `_cap`: cap amount, should be scaled by collateral asset decimals - ### Function `setUpperBoundValues(address _underlying, address _strike, address _collateral, bool _isPut, uint256[] _timesToExpiry, uint256[] _values) external` set product upper bound values @@ -202,18 +186,6 @@ get dust amount for collateral asset - dust amount -### Function `getCollateralCap(address _collateral) → uint256 external` - -get cap amount for collateral asset - -#### Parameters: - -- `_collateral`: collateral asset address - -#### Return Values: - -- cap amount - ### Function `getTimesToExpiry(address _underlying, address _strike, address _collateral, bool _isPut) → uint256[] external` get times to expiry for a specific product @@ -694,13 +666,13 @@ cash value = max(underlying price - strike price, 0) - `_isPut`: option type, true for put and false for call option -### Event `CollateralDustUpdated(address collateral, uint256 dust)` +### Function `_getOtokenDetails(address _otoken) → address, address, address, uint256, uint256, bool internal` -emits an event when collateral dust is updated +get otoken detail, from both otoken versions -### Event `CollateralCapUpdated(address collateral, uint256 cap)` +### Event `CollateralDustUpdated(address collateral, uint256 dust)` -emits an event when collateral cap is updated +emits an event when collateral dust is updated ### Event `TimeToExpiryAdded(bytes32 productHash, uint256 timeToExpiry)` diff --git a/docs/contracts-documentation/libs/Actions.md b/docs/contracts-documentation/libs/Actions.md index a7471ebb7..d1782f086 100644 --- a/docs/contracts-documentation/libs/Actions.md +++ b/docs/contracts-documentation/libs/Actions.md @@ -2,6 +2,54 @@ A library that provides a ActionArgs struct, sub types of Action structs, and functions to parse ActionArgs into specific Actions. +errorCode + +A1 can only parse arguments for open vault actions + +A2 cannot open vault for an invalid account + +A3 cannot open vault with an invalid type + +A4 can only parse arguments for mint actions + +A5 cannot mint from an invalid account + +A6 can only parse arguments for burn actions + +A7 cannot burn from an invalid account + +A8 can only parse arguments for deposit actions + +A9 cannot deposit to an invalid account + +A10 can only parse arguments for withdraw actions + +A11 cannot withdraw from an invalid account + +A12 cannot withdraw to an invalid account + +A13 can only parse arguments for redeem actions + +A14 cannot redeem to an invalid account + +A15 can only parse arguments for settle vault actions + +A16 cannot settle vault for an invalid account + +A17 cannot withdraw payout to an invalid account + +A18 can only parse arguments for liquidate action + +A19 cannot liquidate vault for an invalid account owner + +A20 cannot send collateral to an invalid account + +A21 cannot parse liquidate action with no round id + +A22 can only parse arguments for call actions + +A23 target address cannot be address(0) + ## Functions: - `_parseOpenVaultArgs(struct Actions.ActionArgs _args) (internal)` diff --git a/docs/contracts-documentation/tests/OtokenImplV1.md b/docs/contracts-documentation/tests/OtokenImplV1.md new file mode 100644 index 000000000..a5917194a --- /dev/null +++ b/docs/contracts-documentation/tests/OtokenImplV1.md @@ -0,0 +1,25 @@ +# `OtokenImplV1` + +SPDX-License-Identifier: UNLICENSED + +The Otoken inherits ERC20PermitUpgradeable because we need to use the init instead of constructor + +This is V1 implementation, with no getOtokenDetails() + +## Functions: + +- `init(address _addressBook, address _underlyingAsset, address _strikeAsset, address _collateralAsset, uint256 _strikePrice, uint256 _expiryTimestamp, bool _isPut) (external)` + +- `mintOtoken(address _to, uint256 _amount) (external)` + +- `burnOtoken(address account, uint256 amount) (external)` + +- `getChainId() (external)` + +### Function `init(address _addressBook, address _underlyingAsset, address _strikeAsset, address _collateralAsset, uint256 _strikePrice, uint256 _expiryTimestamp, bool _isPut) external` + +### Function `mintOtoken(address _to, uint256 _amount) external` + +### Function `burnOtoken(address account, uint256 amount) external` + +### Function `getChainId() → uint256 chainId external` diff --git a/docs/control-flow/Gamma.png b/docs/control-flow/Gamma.png index 8c0a37f45..65c295c33 100644 Binary files a/docs/control-flow/Gamma.png and b/docs/control-flow/Gamma.png differ diff --git a/docs/control-flow/GammaController.png b/docs/control-flow/GammaController.png index 49407a418..1e1cf4280 100644 Binary files a/docs/control-flow/GammaController.png and b/docs/control-flow/GammaController.png differ diff --git a/docs/control-flow/GammaHighLevel.png b/docs/control-flow/GammaHighLevel.png index 15066cbe7..282d24048 100644 Binary files a/docs/control-flow/GammaHighLevel.png and b/docs/control-flow/GammaHighLevel.png differ diff --git a/docs/uml/GammaAddressbook.png b/docs/uml/GammaAddressbook.png index c1478f914..42c9d460d 100644 Binary files a/docs/uml/GammaAddressbook.png and b/docs/uml/GammaAddressbook.png differ diff --git a/docs/uml/GammaAddressbook.svg b/docs/uml/GammaAddressbook.svg index f520a40b4..322fdd69b 100644 --- a/docs/uml/GammaAddressbook.svg +++ b/docs/uml/GammaAddressbook.svg @@ -27,15 +27,15 @@   addresses: mapping(bytes32=>address) External: -    setOtokenImpl(_otokenImpl: address) -    getOtokenImpl(): address +    getOtokenImpl(): address +    getOtokenFactory(): address    getWhitelist(): address    getController(): address    getMarginPool(): address    getMarginCalculator(): address    getLiquidationManager(): address    getOracle(): address -    getOtokenFactory(): address +    setOtokenImpl(_otokenImpl: address)    setOtokenFactory(_otokenFactory: address)    setWhitelist(_whitelist: address)    setController(_controller: address) diff --git a/docs/uml/GammaCalculator.png b/docs/uml/GammaCalculator.png index 13e50854a..33a9e64db 100644 Binary files a/docs/uml/GammaCalculator.png and b/docs/uml/GammaCalculator.png differ diff --git a/docs/uml/GammaCalculator.svg b/docs/uml/GammaCalculator.svg index 843bb160c..7083818df 100644 --- a/docs/uml/GammaCalculator.svg +++ b/docs/uml/GammaCalculator.svg @@ -4,69 +4,66 @@ - - + + UmlClassDiagram - + 0 - -MarginCalculator - -Internal: -   SCALING_FACTOR: uint256 -   BASE: uint256 -   oracleDeviation: uint256 -   ZERO: FPI.FixedPointInt -   dust: mapping(address=>uint256) -   cap: mapping(address=>uint256) -   timesToExpiryForProduct: mapping(bytes32=>uint256[]) -   maxPriceAtTimeToExpiry: mapping(bytes32=>mapping(uint256=>uint256)) -   spotShock: mapping(bytes32=>uint256) -Public: -   AUCTION_TIME: uint256 -   oracle: OracleInterface - -Internal: -    _getDebtPrice(_vaultCollateral: FPI.FixedPointInt, _vaultDebt: FPI.FixedPointInt, _cashValue: FPI.FixedPointInt, _spotPrice: FPI.FixedPointInt, _auctionStartingTime: uint256, _collateralDecimals: uint256, _isPut: bool): uint256 -    _getExpiredCashValue(_underlying: address, _strike: address, _expiryTimestamp: uint256, _strikePrice: uint256, _isPut: bool): FPI.FixedPointInt -    _getNakedMarginRequired(_productHash: bytes32, _shortAmount: FPI.FixedPointInt, _underlyingPrice: FPI.FixedPointInt, _strikePrice: FPI.FixedPointInt, _shortExpiryTimestamp: uint256, _isPut: bool): FPI.FixedPointInt -    _findUpperBoundValue(_productHash: bytes32, _expiryTimestamp: uint256): FPI.FixedPointInt -    _getPutSpreadMarginRequired(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortStrike: FPI.FixedPointInt, _longStrike: FPI.FixedPointInt): FPI.FixedPointInt -    _getCallSpreadMarginRequired(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortStrike: FPI.FixedPointInt, _longStrike: FPI.FixedPointInt): FPI.FixedPointInt -    _convertAmountOnLivePrice(_amount: FPI.FixedPointInt, _assetA: address, _assetB: address): FPI.FixedPointInt -    _convertAmountOnExpiryPrice(_amount: FPI.FixedPointInt, _assetA: address, _assetB: address, _expiry: uint256): FPI.FixedPointInt -    _getMarginRequired(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): (FPI.FixedPointInt, FPI.FixedPointInt) -    _getVaultDetails(_vault: MarginVault.Vault, _vaultType: uint256): VaultDetails -    _getExpiredSpreadCashValue(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortCashValue: FPI.FixedPointInt, _longCashValue: FPI.FixedPointInt): FPI.FixedPointInt -    _isNotEmpty(_assets: address[]): bool -    _checkIsValidVault(_vault: MarginVault.Vault, _vaultDetails: VaultDetails) -    _isMarginableLong(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): bool -    _isMarginableCollateral(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): bool -    _getProductHash(_underlying: address, _strike: address, _collateral: address, _isPut: bool): bytes32 -    _getCashValue(_strikePrice: FPI.FixedPointInt, _underlyingPrice: FPI.FixedPointInt, _isPut: bool): FPI.FixedPointInt -External: -    getTimesToExpiry(_underlying: address, _strike: address, _collateral: address, _isPut: bool): uint256[] -    setCollateralDust(_collateral: address, _dust: uint256) -    setUpperBoundValues(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timesToExpiry: uint256[], _values: uint256[]) -    updateUpperBoundValue(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timeToExpiry: uint256, _value: uint256) -    setSpotShock(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _shockValue: uint256) -    setOracleDeviation(_deviation: uint256) -    getCollateralDust(_collateral: address): uint256 -    getCollateralCap(_collateral: address): uint256 -    setCollateralCap(_collateral: address, _cap: uint256) -    getMaxPrice(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timeToExpiry: uint256): uint256 -    getSpotShock(_underlying: address, _strike: address, _collateral: address, _isPut: bool): uint256 -    getOracleDeviation(): uint256 -    getNakedMarginRequired(_underlying: address, _strike: address, _collateral: address, _shortAmount: uint256, _strikePrice: uint256, _underlyingPrice: uint256, _shortExpiryTimestamp: uint256, _collateralDecimals: uint256, _isPut: bool): uint256 -    getExpiredPayoutRate(_otoken: address): uint256 -    isLiquidatable(_vault: MarginVault.Vault, _vaultType: uint256, _vaultLatestUpdate: uint256, _roundId: uint256): (bool, uint256, uint256) -    getMarginRequired(_vault: MarginVault.Vault, _vaultType: uint256): (FPI.FixedPointInt, FPI.FixedPointInt) -Public: -    <<event>> CollateralDustUpdated(collateral: address, dust: uint256) -    <<event>> CollateralCapUpdated(collateral: address, cap: uint256) + +MarginCalculator + +Internal: +   SCALING_FACTOR: uint256 +   BASE: uint256 +   oracleDeviation: uint256 +   ZERO: FPI.FixedPointInt +   dust: mapping(address=>uint256) +   timesToExpiryForProduct: mapping(bytes32=>uint256[]) +   maxPriceAtTimeToExpiry: mapping(bytes32=>mapping(uint256=>uint256)) +   spotShock: mapping(bytes32=>uint256) +Public: +   AUCTION_TIME: uint256 +   oracle: OracleInterface + +Internal: +    _getExpiredCashValue(_underlying: address, _strike: address, _expiryTimestamp: uint256, _strikePrice: uint256, _isPut: bool): FPI.FixedPointInt +    _getMarginRequired(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): (FPI.FixedPointInt, FPI.FixedPointInt) +    _getNakedMarginRequired(_productHash: bytes32, _shortAmount: FPI.FixedPointInt, _underlyingPrice: FPI.FixedPointInt, _strikePrice: FPI.FixedPointInt, _shortExpiryTimestamp: uint256, _isPut: bool): FPI.FixedPointInt +    _findUpperBoundValue(_productHash: bytes32, _expiryTimestamp: uint256): FPI.FixedPointInt +    _getPutSpreadMarginRequired(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortStrike: FPI.FixedPointInt, _longStrike: FPI.FixedPointInt): FPI.FixedPointInt +    _getCallSpreadMarginRequired(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortStrike: FPI.FixedPointInt, _longStrike: FPI.FixedPointInt): FPI.FixedPointInt +    _convertAmountOnLivePrice(_amount: FPI.FixedPointInt, _assetA: address, _assetB: address): FPI.FixedPointInt +    _convertAmountOnExpiryPrice(_amount: FPI.FixedPointInt, _assetA: address, _assetB: address, _expiry: uint256): FPI.FixedPointInt +    _getDebtPrice(_vaultCollateral: FPI.FixedPointInt, _vaultDebt: FPI.FixedPointInt, _cashValue: FPI.FixedPointInt, _spotPrice: FPI.FixedPointInt, _auctionStartingTime: uint256, _collateralDecimals: uint256, _isPut: bool): uint256 +    _getVaultDetails(_vault: MarginVault.Vault, _vaultType: uint256): VaultDetails +    _getExpiredSpreadCashValue(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortCashValue: FPI.FixedPointInt, _longCashValue: FPI.FixedPointInt): FPI.FixedPointInt +    _isNotEmpty(_assets: address[]): bool +    _checkIsValidVault(_vault: MarginVault.Vault, _vaultDetails: VaultDetails) +    _isMarginableLong(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): bool +    _isMarginableCollateral(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): bool +    _getProductHash(_underlying: address, _strike: address, _collateral: address, _isPut: bool): bytes32 +    _getCashValue(_strikePrice: FPI.FixedPointInt, _underlyingPrice: FPI.FixedPointInt, _isPut: bool): FPI.FixedPointInt +    _getOtokenDetails(_otoken: address): (address, address, address, uint256, uint256, bool) +External: +    setCollateralDust(_collateral: address, _dust: uint256) +    setUpperBoundValues(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timesToExpiry: uint256[], _values: uint256[]) +    updateUpperBoundValue(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timeToExpiry: uint256, _value: uint256) +    setSpotShock(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _shockValue: uint256) +    setOracleDeviation(_deviation: uint256) +    getCollateralDust(_collateral: address): uint256 +    getTimesToExpiry(_underlying: address, _strike: address, _collateral: address, _isPut: bool): uint256[] +    getMaxPrice(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timeToExpiry: uint256): uint256 +    getSpotShock(_underlying: address, _strike: address, _collateral: address, _isPut: bool): uint256 +    getOracleDeviation(): uint256 +    getNakedMarginRequired(_underlying: address, _strike: address, _collateral: address, _shortAmount: uint256, _strikePrice: uint256, _underlyingPrice: uint256, _shortExpiryTimestamp: uint256, _collateralDecimals: uint256, _isPut: bool): uint256 +    getExpiredPayoutRate(_otoken: address): uint256 +    isLiquidatable(_vault: MarginVault.Vault, _vaultType: uint256, _vaultLatestUpdate: uint256, _roundId: uint256): (bool, uint256, uint256) +    getMarginRequired(_vault: MarginVault.Vault, _vaultType: uint256): (FPI.FixedPointInt, FPI.FixedPointInt) +Public: +    <<event>> CollateralDustUpdated(collateral: address, dust: uint256)    <<event>> TimeToExpiryAdded(productHash: bytes32, timeToExpiry: uint256)    <<event>> MaxPriceAdded(productHash: bytes32, timeToExpiry: uint256, value: uint256)    <<event>> MaxPriceUpdated(productHash: bytes32, timeToExpiry: uint256, oldValue: uint256, newValue: uint256) @@ -105,8 +102,8 @@ 0struct0->0 - - + + @@ -122,8 +119,8 @@ 0struct1->0 - - + + @@ -141,8 +138,8 @@ 0struct2->0 - - + + diff --git a/docs/uml/GammaController.png b/docs/uml/GammaController.png index 534ebc8b3..5af6ed2b2 100644 Binary files a/docs/uml/GammaController.png and b/docs/uml/GammaController.png differ diff --git a/docs/uml/GammaController.svg b/docs/uml/GammaController.svg index 3b189cf5e..db3484653 100644 --- a/docs/uml/GammaController.svg +++ b/docs/uml/GammaController.svg @@ -4,79 +4,89 @@ - - + + UmlClassDiagram - + 0 - -Controller - -Internal: -   BASE: uint256 -   accountVaultCounter: mapping(address=>uint256) -   vaults: mapping(address=>mapping(uint256=>MarginVault.Vault)) -   operators: mapping(address=>mapping(address=>bool)) -   vaultType: mapping(address=>mapping(uint256=>uint256)) -   vaultLatestUpdate: mapping(address=>mapping(uint256=>uint256)) -Public: -   addressbook: AddressBookInterface -   whitelist: WhitelistInterface -   oracle: OracleInterface -   calculator: MarginCalculatorInterface -   pool: MarginPoolInterface -   partialPauser: address -   fullPauser: address -   systemPartiallyPaused: bool -   systemFullyPaused: bool -   callRestricted: bool - -Internal: -    _mintOtoken(_args: Actions.MintArgs) -    _isNotPartiallyPaused() -    _isAuthorized(_sender: address, _accountOwner: address) -    _runActions(_actions: Actions.ActionArgs[]): (bool, address, uint256) -    _verifyFinalState(_owner: address, _vaultId: uint256) -    _openVault(_args: Actions.OpenVaultArgs) -    _depositLong(_args: Actions.DepositArgs) -    _withdrawLong(_args: Actions.WithdrawArgs) -    _depositCollateral(_args: Actions.DepositArgs) -    _withdrawCollateral(_args: Actions.WithdrawArgs) -    _isNotFullyPaused() -    _burnOtoken(_args: Actions.BurnArgs) -    _redeem(_args: Actions.RedeemArgs) -    _settleVault(_args: Actions.SettleVaultArgs) -    _liquidate(_args: Actions.LiquidateArgs) -    _call(_args: Actions.CallArgs) -    _checkVaultId(_accountOwner: address, _vaultId: uint256): bool -    _isNotEmpty(_array: address[]): bool -    _isCalleeWhitelisted(_callee: address): bool -    _isLiquidatable(_owner: address, _vaultId: uint256, _roundId: uint256): (MarginVault.Vault, bool, uint256, uint256) -    _refreshConfigInternal() -External: -    refreshConfiguration() -    initialize(_addressBook: address, _owner: address) -    setSystemPartiallyPaused(_partiallyPaused: bool) -    setSystemFullyPaused(_fullyPaused: bool) -    setFullPauser(_fullPauser: address) -    setPartialPauser(_partialPauser: address) -    setCallRestriction(_isRestricted: bool) -    setOperator(_operator: address, _isOperator: bool) -    donate(_asset: address, _amount: uint256) -    operate(_actions: Actions.ActionArgs[]) -    sync(_owner: address, _vaultId: uint256) -    isOperator(_owner: address, _operator: address): bool -    getConfiguration(): (address, address, address, address) -    getProceed(_owner: address, _vaultId: uint256): uint256 -    isLiquidatable(_owner: address, _vaultId: uint256, _roundId: uint256): (bool, uint256, uint256) -    getAccountVaultCounter(_accountOwner: address): uint256 -    hasExpired(_otoken: address): bool + +Controller + +Internal: +   BASE: uint256 +   accountVaultCounter: mapping(address=>uint256) +   vaults: mapping(address=>mapping(uint256=>MarginVault.Vault)) +   operators: mapping(address=>mapping(address=>bool)) +   vaultType: mapping(address=>mapping(uint256=>uint256)) +   vaultLatestUpdate: mapping(address=>mapping(uint256=>uint256)) +   nakedCap: mapping(address=>uint256) +   nakedPoolBalance: mapping(address=>uint256) +Public: +   addressbook: AddressBookInterface +   whitelist: WhitelistInterface +   oracle: OracleInterface +   calculator: MarginCalculatorInterface +   pool: MarginPoolInterface +   partialPauser: address +   fullPauser: address +   systemPartiallyPaused: bool +   systemFullyPaused: bool +   callRestricted: bool + +Internal: +    _isNotPartiallyPaused() +    _isNotFullyPaused() +    _isAuthorized(_sender: address, _accountOwner: address) +    _runActions(_actions: Actions.ActionArgs[]): (bool, address, uint256) +    _verifyFinalState(_owner: address, _vaultId: uint256) +    _openVault(_args: Actions.OpenVaultArgs) +    _depositLong(_args: Actions.DepositArgs) +    _withdrawLong(_args: Actions.WithdrawArgs) +    _depositCollateral(_args: Actions.DepositArgs) +    _withdrawCollateral(_args: Actions.WithdrawArgs) +    _mintOtoken(_args: Actions.MintArgs) +    _burnOtoken(_args: Actions.BurnArgs) +    _redeem(_args: Actions.RedeemArgs) +    _settleVault(_args: Actions.SettleVaultArgs) +    _liquidate(_args: Actions.LiquidateArgs) +    _call(_args: Actions.CallArgs) +    _checkVaultId(_accountOwner: address, _vaultId: uint256): bool +    _isNotEmpty(_array: address[]): bool +    _isCalleeWhitelisted(_callee: address): bool +    _isLiquidatable(_owner: address, _vaultId: uint256, _roundId: uint256): (MarginVault.Vault, bool, uint256, uint256) +    _getOtokenDetails(_otoken: address): (address, address, address, uint256) +    _canSettleAssets(_underlying: address, _strike: address, _collateral: address, _expiry: uint256): bool +    _refreshConfigInternal() +External: +    initialize(_addressBook: address, _owner: address) +    donate(_asset: address, _amount: uint256) +    setSystemPartiallyPaused(_partiallyPaused: bool) +    setSystemFullyPaused(_fullyPaused: bool) +    setFullPauser(_fullPauser: address) +    setPartialPauser(_partialPauser: address) +    setCallRestriction(_isRestricted: bool) +    setOperator(_operator: address, _isOperator: bool) +    refreshConfiguration() +    setNakedCap(_collateral: address, _cap: uint256) +    operate(_actions: Actions.ActionArgs[]) +    sync(_owner: address, _vaultId: uint256) +    isOperator(_owner: address, _operator: address): bool +    getConfiguration(): (address, address, address, address) +    getProceed(_owner: address, _vaultId: uint256): uint256 +    isLiquidatable(_owner: address, _vaultId: uint256, _roundId: uint256): (bool, uint256, uint256) +    isSettlementAllowed(_otoken: address): bool +    canSettleAssets(_underlying: address, _strike: address, _collateral: address, _expiry: uint256): bool +    getAccountVaultCounter(_accountOwner: address): uint256 +    hasExpired(_otoken: address): bool +    getVault(_owner: address, _vaultId: uint256): MarginVault.Vault +    getNakedCap(_asset: address): uint256 +    getNakedPoolBalance(_asset: address): uint256 Public: -    <<event>> PartialPauserUpdated(oldPartialPauser: address, newPartialPauser: address) -    <<event>> AccountOperatorUpdated(accountOwner: address, operator: address, isSet: bool) +    <<event>> AccountOperatorUpdated(accountOwner: address, operator: address, isSet: bool) +    <<event>> VaultOpened(accountOwner: address, vaultId: uint256, vaultType: uint256)    <<event>> LongOtokenDeposited(otoken: address, accountOwner: address, from: address, vaultId: uint256, amount: uint256)    <<event>> LongOtokenWithdrawed(otoken: address, AccountOwner: address, to: address, vaultId: uint256, amount: uint256)    <<event>> CollateralAssetDeposited(asset: address, accountOwner: address, from: address, vaultId: uint256, amount: uint256) @@ -88,20 +98,20 @@    <<event>> VaultLiquidated(liquidator: address, receiver: address, vaultOwner: address, auctionPrice: uint256, auctionStartingRound: uint256, collateralPayout: uint256, debtAmount: uint256, vaultId: uint256)    <<event>> CallExecuted(from: address, to: address, data: bytes)    <<event>> FullPauserUpdated(oldFullPauser: address, newFullPauser: address) -    <<event>> VaultOpened(accountOwner: address, vaultId: uint256, vaultType: uint256) +    <<event>> PartialPauserUpdated(oldPartialPauser: address, newPartialPauser: address)    <<event>> SystemPartiallyPaused(isPaused: bool)    <<event>> SystemFullyPaused(isPaused: bool)    <<event>> CallRestricted(isRestricted: bool)    <<event>> Donated(donator: address, asset: address, amount: uint256) -    <<modifier>> notPartiallyPaused() -    <<modifier>> notFullyPaused() -    <<modifier>> onlyFullPauser() -    <<modifier>> onlyPartialPauser() -    <<modifier>> onlyAuthorized(_sender: address, _accountOwner: address) -    <<modifier>> onlyWhitelistedCallee(_callee: address) -    getPayout(_otoken: address, _amount: uint256): uint256 -    isSettlementAllowed(_underlying: address, _strike: address, _collateral: address, _expiry: uint256): bool -    getVault(_owner: address, _vaultId: uint256): (MarginVault.Vault, uint256, uint256) +    <<event>> NakedCapUpdated(collateral: address, cap: uint256) +    <<modifier>> notPartiallyPaused() +    <<modifier>> notFullyPaused() +    <<modifier>> onlyFullPauser() +    <<modifier>> onlyPartialPauser() +    <<modifier>> onlyAuthorized(_sender: address, _accountOwner: address) +    <<modifier>> onlyWhitelistedCallee(_callee: address) +    getPayout(_otoken: address, _amount: uint256): uint256 +    getVaultWithDetails(_owner: address, _vaultId: uint256): (MarginVault.Vault, uint256, uint256) diff --git a/docs/uml/GammaOracle.png b/docs/uml/GammaOracle.png index d01266953..578cd3487 100644 Binary files a/docs/uml/GammaOracle.png and b/docs/uml/GammaOracle.png differ diff --git a/docs/uml/GammaOracle.svg b/docs/uml/GammaOracle.svg index 7354f177f..bd1566114 100644 --- a/docs/uml/GammaOracle.svg +++ b/docs/uml/GammaOracle.svg @@ -26,15 +26,15 @@   migrated: bool External: -    setExpiryPrice(_asset: address, _expiryTimestamp: uint256, _price: uint256) -    migrateOracle(_asset: address, _expiries: uint256[], _prices: uint256[]) +    migrateOracle(_asset: address, _expiries: uint256[], _prices: uint256[]) +    endMigration()    setAssetPricer(_asset: address, _pricer: address)    setLockingPeriod(_pricer: address, _lockingPeriod: uint256)    setDisputePeriod(_pricer: address, _disputePeriod: uint256)    setDisputer(_disputer: address)    setStablePrice(_asset: address, _price: uint256)    disputeExpiryPrice(_asset: address, _expiryTimestamp: uint256, _price: uint256) -    endMigration() +    setExpiryPrice(_asset: address, _expiryTimestamp: uint256, _price: uint256)    getPrice(_asset: address): uint256    getExpiryPrice(_asset: address, _expiryTimestamp: uint256): (uint256, bool)    getPricer(_asset: address): address diff --git a/docs/uml/GammaUML.png b/docs/uml/GammaUML.png index 3a89fc721..8d4e786e7 100644 Binary files a/docs/uml/GammaUML.png and b/docs/uml/GammaUML.png differ diff --git a/docs/uml/GammaUML.svg b/docs/uml/GammaUML.svg index fc8838e5a..dd2378d27 100644 --- a/docs/uml/GammaUML.svg +++ b/docs/uml/GammaUML.svg @@ -4,120 +4,130 @@ - - + + UmlClassDiagram - + 0 - -AddressBook - -Private: -   OTOKEN_IMPL: bytes32 -   OTOKEN_FACTORY: bytes32 -   WHITELIST: bytes32 -   CONTROLLER: bytes32 -   MARGIN_POOL: bytes32 -   MARGIN_CALCULATOR: bytes32 -   LIQUIDATION_MANAGER: bytes32 -   ORACLE: bytes32 -   addresses: mapping(bytes32=>address) - -External: -    setOtokenImpl(_otokenImpl: address) -    getOtokenImpl(): address -    getWhitelist(): address -    getController(): address -    getMarginPool(): address -    getMarginCalculator(): address -    getLiquidationManager(): address -    getOracle(): address -    getOtokenFactory(): address -    setOtokenFactory(_otokenFactory: address) -    setWhitelist(_whitelist: address) -    setController(_controller: address) -    setMarginPool(_marginPool: address) -    setMarginCalculator(_marginCalculator: address) -    setLiquidationManager(_liquidationManager: address) -    setOracle(_oracle: address) -Public: -    <<event>> ProxyCreated(id: bytes32, proxy: address) -    <<event>> AddressAdded(id: bytes32, add: address) -    getAddress(_key: bytes32): address -    setAddress(_key: bytes32, _address: address) -    updateImpl(_id: bytes32, _newAddress: address) + +AddressBook + +Private: +   OTOKEN_IMPL: bytes32 +   OTOKEN_FACTORY: bytes32 +   WHITELIST: bytes32 +   CONTROLLER: bytes32 +   MARGIN_POOL: bytes32 +   MARGIN_CALCULATOR: bytes32 +   LIQUIDATION_MANAGER: bytes32 +   ORACLE: bytes32 +   addresses: mapping(bytes32=>address) + +External: +    getOtokenImpl(): address +    getOtokenFactory(): address +    getWhitelist(): address +    getController(): address +    getMarginPool(): address +    getMarginCalculator(): address +    getLiquidationManager(): address +    getOracle(): address +    setOtokenImpl(_otokenImpl: address) +    setOtokenFactory(_otokenFactory: address) +    setWhitelist(_whitelist: address) +    setController(_controller: address) +    setMarginPool(_marginPool: address) +    setMarginCalculator(_marginCalculator: address) +    setLiquidationManager(_liquidationManager: address) +    setOracle(_oracle: address) +Public: +    <<event>> ProxyCreated(id: bytes32, proxy: address) +    <<event>> AddressAdded(id: bytes32, add: address) +    getAddress(_key: bytes32): address +    setAddress(_key: bytes32, _address: address) +    updateImpl(_id: bytes32, _newAddress: address) 1 - -Controller - -Internal: -   BASE: uint256 -   accountVaultCounter: mapping(address=>uint256) -   vaults: mapping(address=>mapping(uint256=>MarginVault.Vault)) -   operators: mapping(address=>mapping(address=>bool)) -   vaultType: mapping(address=>mapping(uint256=>uint256)) -   vaultLatestUpdate: mapping(address=>mapping(uint256=>uint256)) -Public: -   addressbook: AddressBookInterface -   whitelist: WhitelistInterface -   oracle: OracleInterface -   calculator: MarginCalculatorInterface -   pool: MarginPoolInterface -   partialPauser: address -   fullPauser: address -   systemPartiallyPaused: bool -   systemFullyPaused: bool -   callRestricted: bool - -Internal: -    _mintOtoken(_args: Actions.MintArgs) -    _isNotPartiallyPaused() -    _isAuthorized(_sender: address, _accountOwner: address) -    _runActions(_actions: Actions.ActionArgs[]): (bool, address, uint256) -    _verifyFinalState(_owner: address, _vaultId: uint256) -    _openVault(_args: Actions.OpenVaultArgs) -    _depositLong(_args: Actions.DepositArgs) -    _withdrawLong(_args: Actions.WithdrawArgs) -    _depositCollateral(_args: Actions.DepositArgs) -    _withdrawCollateral(_args: Actions.WithdrawArgs) -    _isNotFullyPaused() -    _burnOtoken(_args: Actions.BurnArgs) -    _redeem(_args: Actions.RedeemArgs) -    _settleVault(_args: Actions.SettleVaultArgs) -    _liquidate(_args: Actions.LiquidateArgs) -    _call(_args: Actions.CallArgs) -    _checkVaultId(_accountOwner: address, _vaultId: uint256): bool -    _isNotEmpty(_array: address[]): bool -    _isCalleeWhitelisted(_callee: address): bool -    _isLiquidatable(_owner: address, _vaultId: uint256, _roundId: uint256): (MarginVault.Vault, bool, uint256, uint256) -    _refreshConfigInternal() -External: -    refreshConfiguration() -    initialize(_addressBook: address, _owner: address) -    setSystemPartiallyPaused(_partiallyPaused: bool) -    setSystemFullyPaused(_fullyPaused: bool) -    setFullPauser(_fullPauser: address) -    setPartialPauser(_partialPauser: address) -    setCallRestriction(_isRestricted: bool) -    setOperator(_operator: address, _isOperator: bool) -    donate(_asset: address, _amount: uint256) -    operate(_actions: Actions.ActionArgs[]) -    sync(_owner: address, _vaultId: uint256) -    isOperator(_owner: address, _operator: address): bool -    getConfiguration(): (address, address, address, address) -    getProceed(_owner: address, _vaultId: uint256): uint256 -    isLiquidatable(_owner: address, _vaultId: uint256, _roundId: uint256): (bool, uint256, uint256) -    getAccountVaultCounter(_accountOwner: address): uint256 -    hasExpired(_otoken: address): bool + +Controller + +Internal: +   BASE: uint256 +   accountVaultCounter: mapping(address=>uint256) +   vaults: mapping(address=>mapping(uint256=>MarginVault.Vault)) +   operators: mapping(address=>mapping(address=>bool)) +   vaultType: mapping(address=>mapping(uint256=>uint256)) +   vaultLatestUpdate: mapping(address=>mapping(uint256=>uint256)) +   nakedCap: mapping(address=>uint256) +   nakedPoolBalance: mapping(address=>uint256) +Public: +   addressbook: AddressBookInterface +   whitelist: WhitelistInterface +   oracle: OracleInterface +   calculator: MarginCalculatorInterface +   pool: MarginPoolInterface +   partialPauser: address +   fullPauser: address +   systemPartiallyPaused: bool +   systemFullyPaused: bool +   callRestricted: bool + +Internal: +    _isNotPartiallyPaused() +    _isNotFullyPaused() +    _isAuthorized(_sender: address, _accountOwner: address) +    _runActions(_actions: Actions.ActionArgs[]): (bool, address, uint256) +    _verifyFinalState(_owner: address, _vaultId: uint256) +    _openVault(_args: Actions.OpenVaultArgs) +    _depositLong(_args: Actions.DepositArgs) +    _withdrawLong(_args: Actions.WithdrawArgs) +    _depositCollateral(_args: Actions.DepositArgs) +    _withdrawCollateral(_args: Actions.WithdrawArgs) +    _mintOtoken(_args: Actions.MintArgs) +    _burnOtoken(_args: Actions.BurnArgs) +    _redeem(_args: Actions.RedeemArgs) +    _settleVault(_args: Actions.SettleVaultArgs) +    _liquidate(_args: Actions.LiquidateArgs) +    _call(_args: Actions.CallArgs) +    _checkVaultId(_accountOwner: address, _vaultId: uint256): bool +    _isNotEmpty(_array: address[]): bool +    _isCalleeWhitelisted(_callee: address): bool +    _isLiquidatable(_owner: address, _vaultId: uint256, _roundId: uint256): (MarginVault.Vault, bool, uint256, uint256) +    _getOtokenDetails(_otoken: address): (address, address, address, uint256) +    _canSettleAssets(_underlying: address, _strike: address, _collateral: address, _expiry: uint256): bool +    _refreshConfigInternal() +External: +    initialize(_addressBook: address, _owner: address) +    donate(_asset: address, _amount: uint256) +    setSystemPartiallyPaused(_partiallyPaused: bool) +    setSystemFullyPaused(_fullyPaused: bool) +    setFullPauser(_fullPauser: address) +    setPartialPauser(_partialPauser: address) +    setCallRestriction(_isRestricted: bool) +    setOperator(_operator: address, _isOperator: bool) +    refreshConfiguration() +    setNakedCap(_collateral: address, _cap: uint256) +    operate(_actions: Actions.ActionArgs[]) +    sync(_owner: address, _vaultId: uint256) +    isOperator(_owner: address, _operator: address): bool +    getConfiguration(): (address, address, address, address) +    getProceed(_owner: address, _vaultId: uint256): uint256 +    isLiquidatable(_owner: address, _vaultId: uint256, _roundId: uint256): (bool, uint256, uint256) +    isSettlementAllowed(_otoken: address): bool +    canSettleAssets(_underlying: address, _strike: address, _collateral: address, _expiry: uint256): bool +    getAccountVaultCounter(_accountOwner: address): uint256 +    hasExpired(_otoken: address): bool +    getVault(_owner: address, _vaultId: uint256): MarginVault.Vault +    getNakedCap(_asset: address): uint256 +    getNakedPoolBalance(_asset: address): uint256 Public: -    <<event>> PartialPauserUpdated(oldPartialPauser: address, newPartialPauser: address) -    <<event>> AccountOperatorUpdated(accountOwner: address, operator: address, isSet: bool) +    <<event>> AccountOperatorUpdated(accountOwner: address, operator: address, isSet: bool) +    <<event>> VaultOpened(accountOwner: address, vaultId: uint256, vaultType: uint256)    <<event>> LongOtokenDeposited(otoken: address, accountOwner: address, from: address, vaultId: uint256, amount: uint256)    <<event>> LongOtokenWithdrawed(otoken: address, AccountOwner: address, to: address, vaultId: uint256, amount: uint256)    <<event>> CollateralAssetDeposited(asset: address, accountOwner: address, from: address, vaultId: uint256, amount: uint256) @@ -129,357 +139,354 @@    <<event>> VaultLiquidated(liquidator: address, receiver: address, vaultOwner: address, auctionPrice: uint256, auctionStartingRound: uint256, collateralPayout: uint256, debtAmount: uint256, vaultId: uint256)    <<event>> CallExecuted(from: address, to: address, data: bytes)    <<event>> FullPauserUpdated(oldFullPauser: address, newFullPauser: address) -    <<event>> VaultOpened(accountOwner: address, vaultId: uint256, vaultType: uint256) +    <<event>> PartialPauserUpdated(oldPartialPauser: address, newPartialPauser: address)    <<event>> SystemPartiallyPaused(isPaused: bool)    <<event>> SystemFullyPaused(isPaused: bool)    <<event>> CallRestricted(isRestricted: bool)    <<event>> Donated(donator: address, asset: address, amount: uint256) -    <<modifier>> notPartiallyPaused() -    <<modifier>> notFullyPaused() -    <<modifier>> onlyFullPauser() -    <<modifier>> onlyPartialPauser() -    <<modifier>> onlyAuthorized(_sender: address, _accountOwner: address) -    <<modifier>> onlyWhitelistedCallee(_callee: address) -    getPayout(_otoken: address, _amount: uint256): uint256 -    isSettlementAllowed(_underlying: address, _strike: address, _collateral: address, _expiry: uint256): bool -    getVault(_owner: address, _vaultId: uint256): (MarginVault.Vault, uint256, uint256) +    <<event>> NakedCapUpdated(collateral: address, cap: uint256) +    <<modifier>> notPartiallyPaused() +    <<modifier>> notFullyPaused() +    <<modifier>> onlyFullPauser() +    <<modifier>> onlyPartialPauser() +    <<modifier>> onlyAuthorized(_sender: address, _accountOwner: address) +    <<modifier>> onlyWhitelistedCallee(_callee: address) +    getPayout(_otoken: address, _amount: uint256): uint256 +    getVaultWithDetails(_owner: address, _vaultId: uint256): (MarginVault.Vault, uint256, uint256) 2 - -MarginCalculator - -Internal: -   SCALING_FACTOR: uint256 -   BASE: uint256 -   oracleDeviation: uint256 -   ZERO: FPI.FixedPointInt -   dust: mapping(address=>uint256) -   cap: mapping(address=>uint256) -   timesToExpiryForProduct: mapping(bytes32=>uint256[]) -   maxPriceAtTimeToExpiry: mapping(bytes32=>mapping(uint256=>uint256)) -   spotShock: mapping(bytes32=>uint256) -Public: -   AUCTION_TIME: uint256 -   oracle: OracleInterface - -Internal: + +MarginCalculator + +Internal: +   SCALING_FACTOR: uint256 +   BASE: uint256 +   oracleDeviation: uint256 +   ZERO: FPI.FixedPointInt +   dust: mapping(address=>uint256) +   timesToExpiryForProduct: mapping(bytes32=>uint256[]) +   maxPriceAtTimeToExpiry: mapping(bytes32=>mapping(uint256=>uint256)) +   spotShock: mapping(bytes32=>uint256) +Public: +   AUCTION_TIME: uint256 +   oracle: OracleInterface + +Internal: +    _getExpiredCashValue(_underlying: address, _strike: address, _expiryTimestamp: uint256, _strikePrice: uint256, _isPut: bool): FPI.FixedPointInt +    _getMarginRequired(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): (FPI.FixedPointInt, FPI.FixedPointInt) +    _getNakedMarginRequired(_productHash: bytes32, _shortAmount: FPI.FixedPointInt, _underlyingPrice: FPI.FixedPointInt, _strikePrice: FPI.FixedPointInt, _shortExpiryTimestamp: uint256, _isPut: bool): FPI.FixedPointInt +    _findUpperBoundValue(_productHash: bytes32, _expiryTimestamp: uint256): FPI.FixedPointInt +    _getPutSpreadMarginRequired(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortStrike: FPI.FixedPointInt, _longStrike: FPI.FixedPointInt): FPI.FixedPointInt +    _getCallSpreadMarginRequired(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortStrike: FPI.FixedPointInt, _longStrike: FPI.FixedPointInt): FPI.FixedPointInt +    _convertAmountOnLivePrice(_amount: FPI.FixedPointInt, _assetA: address, _assetB: address): FPI.FixedPointInt +    _convertAmountOnExpiryPrice(_amount: FPI.FixedPointInt, _assetA: address, _assetB: address, _expiry: uint256): FPI.FixedPointInt    _getDebtPrice(_vaultCollateral: FPI.FixedPointInt, _vaultDebt: FPI.FixedPointInt, _cashValue: FPI.FixedPointInt, _spotPrice: FPI.FixedPointInt, _auctionStartingTime: uint256, _collateralDecimals: uint256, _isPut: bool): uint256 -    _getExpiredCashValue(_underlying: address, _strike: address, _expiryTimestamp: uint256, _strikePrice: uint256, _isPut: bool): FPI.FixedPointInt -    _getNakedMarginRequired(_productHash: bytes32, _shortAmount: FPI.FixedPointInt, _underlyingPrice: FPI.FixedPointInt, _strikePrice: FPI.FixedPointInt, _shortExpiryTimestamp: uint256, _isPut: bool): FPI.FixedPointInt -    _findUpperBoundValue(_productHash: bytes32, _expiryTimestamp: uint256): FPI.FixedPointInt -    _getPutSpreadMarginRequired(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortStrike: FPI.FixedPointInt, _longStrike: FPI.FixedPointInt): FPI.FixedPointInt -    _getCallSpreadMarginRequired(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortStrike: FPI.FixedPointInt, _longStrike: FPI.FixedPointInt): FPI.FixedPointInt -    _convertAmountOnLivePrice(_amount: FPI.FixedPointInt, _assetA: address, _assetB: address): FPI.FixedPointInt -    _convertAmountOnExpiryPrice(_amount: FPI.FixedPointInt, _assetA: address, _assetB: address, _expiry: uint256): FPI.FixedPointInt -    _getMarginRequired(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): (FPI.FixedPointInt, FPI.FixedPointInt) -    _getVaultDetails(_vault: MarginVault.Vault, _vaultType: uint256): VaultDetails -    _getExpiredSpreadCashValue(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortCashValue: FPI.FixedPointInt, _longCashValue: FPI.FixedPointInt): FPI.FixedPointInt -    _isNotEmpty(_assets: address[]): bool -    _checkIsValidVault(_vault: MarginVault.Vault, _vaultDetails: VaultDetails) -    _isMarginableLong(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): bool -    _isMarginableCollateral(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): bool -    _getProductHash(_underlying: address, _strike: address, _collateral: address, _isPut: bool): bytes32 -    _getCashValue(_strikePrice: FPI.FixedPointInt, _underlyingPrice: FPI.FixedPointInt, _isPut: bool): FPI.FixedPointInt -External: -    getTimesToExpiry(_underlying: address, _strike: address, _collateral: address, _isPut: bool): uint256[] -    setCollateralDust(_collateral: address, _dust: uint256) -    setUpperBoundValues(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timesToExpiry: uint256[], _values: uint256[]) -    updateUpperBoundValue(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timeToExpiry: uint256, _value: uint256) -    setSpotShock(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _shockValue: uint256) -    setOracleDeviation(_deviation: uint256) -    getCollateralDust(_collateral: address): uint256 -    getCollateralCap(_collateral: address): uint256 -    setCollateralCap(_collateral: address, _cap: uint256) -    getMaxPrice(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timeToExpiry: uint256): uint256 -    getSpotShock(_underlying: address, _strike: address, _collateral: address, _isPut: bool): uint256 -    getOracleDeviation(): uint256 -    getNakedMarginRequired(_underlying: address, _strike: address, _collateral: address, _shortAmount: uint256, _strikePrice: uint256, _underlyingPrice: uint256, _shortExpiryTimestamp: uint256, _collateralDecimals: uint256, _isPut: bool): uint256 -    getExpiredPayoutRate(_otoken: address): uint256 -    isLiquidatable(_vault: MarginVault.Vault, _vaultType: uint256, _vaultLatestUpdate: uint256, _roundId: uint256): (bool, uint256, uint256) -    getMarginRequired(_vault: MarginVault.Vault, _vaultType: uint256): (FPI.FixedPointInt, FPI.FixedPointInt) -Public: -    <<event>> CollateralDustUpdated(collateral: address, dust: uint256) -    <<event>> CollateralCapUpdated(collateral: address, cap: uint256) -    <<event>> TimeToExpiryAdded(productHash: bytes32, timeToExpiry: uint256) -    <<event>> MaxPriceAdded(productHash: bytes32, timeToExpiry: uint256, value: uint256) -    <<event>> MaxPriceUpdated(productHash: bytes32, timeToExpiry: uint256, oldValue: uint256, newValue: uint256) -    <<event>> SpotShockUpdated(product: bytes32, spotShock: uint256) -    <<event>> OracleDeviationUpdated(oracleDeviation: uint256) -    constructor(_oracle: address) -    getExcessCollateral(_vault: MarginVault.Vault, _vaultType: uint256): (uint256, bool) +    _getVaultDetails(_vault: MarginVault.Vault, _vaultType: uint256): VaultDetails +    _getExpiredSpreadCashValue(_shortAmount: FPI.FixedPointInt, _longAmount: FPI.FixedPointInt, _shortCashValue: FPI.FixedPointInt, _longCashValue: FPI.FixedPointInt): FPI.FixedPointInt +    _isNotEmpty(_assets: address[]): bool +    _checkIsValidVault(_vault: MarginVault.Vault, _vaultDetails: VaultDetails) +    _isMarginableLong(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): bool +    _isMarginableCollateral(_vault: MarginVault.Vault, _vaultDetails: VaultDetails): bool +    _getProductHash(_underlying: address, _strike: address, _collateral: address, _isPut: bool): bytes32 +    _getCashValue(_strikePrice: FPI.FixedPointInt, _underlyingPrice: FPI.FixedPointInt, _isPut: bool): FPI.FixedPointInt +    _getOtokenDetails(_otoken: address): (address, address, address, uint256, uint256, bool) +External: +    setCollateralDust(_collateral: address, _dust: uint256) +    setUpperBoundValues(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timesToExpiry: uint256[], _values: uint256[]) +    updateUpperBoundValue(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timeToExpiry: uint256, _value: uint256) +    setSpotShock(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _shockValue: uint256) +    setOracleDeviation(_deviation: uint256) +    getCollateralDust(_collateral: address): uint256 +    getTimesToExpiry(_underlying: address, _strike: address, _collateral: address, _isPut: bool): uint256[] +    getMaxPrice(_underlying: address, _strike: address, _collateral: address, _isPut: bool, _timeToExpiry: uint256): uint256 +    getSpotShock(_underlying: address, _strike: address, _collateral: address, _isPut: bool): uint256 +    getOracleDeviation(): uint256 +    getNakedMarginRequired(_underlying: address, _strike: address, _collateral: address, _shortAmount: uint256, _strikePrice: uint256, _underlyingPrice: uint256, _shortExpiryTimestamp: uint256, _collateralDecimals: uint256, _isPut: bool): uint256 +    getExpiredPayoutRate(_otoken: address): uint256 +    isLiquidatable(_vault: MarginVault.Vault, _vaultType: uint256, _vaultLatestUpdate: uint256, _roundId: uint256): (bool, uint256, uint256) +    getMarginRequired(_vault: MarginVault.Vault, _vaultType: uint256): (FPI.FixedPointInt, FPI.FixedPointInt) +Public: +    <<event>> CollateralDustUpdated(collateral: address, dust: uint256) +    <<event>> TimeToExpiryAdded(productHash: bytes32, timeToExpiry: uint256) +    <<event>> MaxPriceAdded(productHash: bytes32, timeToExpiry: uint256, value: uint256) +    <<event>> MaxPriceUpdated(productHash: bytes32, timeToExpiry: uint256, oldValue: uint256, newValue: uint256) +    <<event>> SpotShockUpdated(product: bytes32, spotShock: uint256) +    <<event>> OracleDeviationUpdated(oracleDeviation: uint256) +    constructor(_oracle: address) +    getExcessCollateral(_vault: MarginVault.Vault, _vaultType: uint256): (uint256, bool) 2struct0 - -<<struct>> -VaultDetails - -shortUnderlyingAsset: address -shortStrikeAsset: address -shortCollateralAsset: address -longUnderlyingAsset: address -longStrikeAsset: address -longCollateralAsset: address -shortStrikePrice: uint256 -shortExpiryTimestamp: uint256 -shortCollateralDecimals: uint256 -longStrikePrice: uint256 -longExpiryTimestamp: uint256 -longCollateralDecimals: uint256 -collateralDecimals: uint256 -vaultType: uint256 -isShortPut: bool -isLongPut: bool -hasLong: bool -hasShort: bool -hasCollateral: bool + +<<struct>> +VaultDetails + +shortUnderlyingAsset: address +shortStrikeAsset: address +shortCollateralAsset: address +longUnderlyingAsset: address +longStrikeAsset: address +longCollateralAsset: address +shortStrikePrice: uint256 +shortExpiryTimestamp: uint256 +shortCollateralDecimals: uint256 +longStrikePrice: uint256 +longExpiryTimestamp: uint256 +longCollateralDecimals: uint256 +collateralDecimals: uint256 +vaultType: uint256 +isShortPut: bool +isLongPut: bool +hasLong: bool +hasShort: bool +hasCollateral: bool 2struct0->2 - - + + 2struct1 - -<<struct>> -ShortScaledDetails - -shortAmount: FPI.FixedPointInt -shortStrike: FPI.FixedPointInt -shortUnderlyingPrice: FPI.FixedPointInt + +<<struct>> +ShortScaledDetails + +shortAmount: FPI.FixedPointInt +shortStrike: FPI.FixedPointInt +shortUnderlyingPrice: FPI.FixedPointInt 2struct1->2 - - + + 2struct2 - -<<struct>> -OtokenDetails - -otokenUnderlyingAsset: address -otokenCollateralAsset: address -otokenStrikeAsset: address -otokenExpiry: uint256 -isPut: bool + +<<struct>> +OtokenDetails + +otokenUnderlyingAsset: address +otokenCollateralAsset: address +otokenStrikeAsset: address +otokenExpiry: uint256 +isPut: bool 2struct2->2 - - + + 3 - -MarginPool - -Internal: -   assetBalance: mapping(address=>uint256) -Public: -   addressBook: address -   farmer: address - -External: -    getStoredBalance(_asset: address): uint256 -    batchTransferToPool(_asset: address[], _user: address[], _amount: uint256[]) -    batchTransferToUser(_asset: address[], _user: address[], _amount: uint256[]) -    farm(_asset: address, _receiver: address, _amount: uint256) -    setFarmer(_farmer: address) -Public: -    <<event>> TransferToPool(asset: address, user: address, amount: uint256) -    <<event>> TransferToUser(asset: address, user: address, amount: uint256) -    <<event>> FarmerUpdated(oldAddress: address, newAddress: address) -    <<event>> AssetFarmed(asset: address, receiver: address, amount: uint256) -    <<modifier>> onlyController() -    <<modifier>> onlyFarmer() -    constructor(_addressBook: address) -    transferToPool(_asset: address, _user: address, _amount: uint256) -    transferToUser(_asset: address, _user: address, _amount: uint256) + +MarginPool + +Internal: +   assetBalance: mapping(address=>uint256) +Public: +   addressBook: address +   farmer: address + +External: +    getStoredBalance(_asset: address): uint256 +    batchTransferToPool(_asset: address[], _user: address[], _amount: uint256[]) +    batchTransferToUser(_asset: address[], _user: address[], _amount: uint256[]) +    farm(_asset: address, _receiver: address, _amount: uint256) +    setFarmer(_farmer: address) +Public: +    <<event>> TransferToPool(asset: address, user: address, amount: uint256) +    <<event>> TransferToUser(asset: address, user: address, amount: uint256) +    <<event>> FarmerUpdated(oldAddress: address, newAddress: address) +    <<event>> AssetFarmed(asset: address, receiver: address, amount: uint256) +    <<modifier>> onlyController() +    <<modifier>> onlyFarmer() +    constructor(_addressBook: address) +    transferToPool(_asset: address, _user: address, _amount: uint256) +    transferToUser(_asset: address, _user: address, _amount: uint256) 4 - -Oracle - -Internal: -   disputer: address -   pricerLockingPeriod: mapping(address=>uint256) -   pricerDisputePeriod: mapping(address=>uint256) -   assetPricer: mapping(address=>address) -   storedPrice: mapping(address=>mapping(uint256=>Price)) -   stablePrice: mapping(address=>uint256) -Public: -   migrated: bool - -External: -    setExpiryPrice(_asset: address, _expiryTimestamp: uint256, _price: uint256) -    migrateOracle(_asset: address, _expiries: uint256[], _prices: uint256[]) -    setAssetPricer(_asset: address, _pricer: address) -    setLockingPeriod(_pricer: address, _lockingPeriod: uint256) -    setDisputePeriod(_pricer: address, _disputePeriod: uint256) -    setDisputer(_disputer: address) -    setStablePrice(_asset: address, _price: uint256) -    disputeExpiryPrice(_asset: address, _expiryTimestamp: uint256, _price: uint256) -    endMigration() -    getPrice(_asset: address): uint256 -    getExpiryPrice(_asset: address, _expiryTimestamp: uint256): (uint256, bool) -    getPricer(_asset: address): address -    getDisputer(): address -    getPricerLockingPeriod(_pricer: address): uint256 -    getPricerDisputePeriod(_pricer: address): uint256 -    getChainlinkRoundData(_asset: address, _roundId: uint80): (uint256, uint256) -Public: -    <<event>> DisputerUpdated(newDisputer: address) -    <<event>> PricerUpdated(asset: address, pricer: address) -    <<event>> PricerLockingPeriodUpdated(pricer: address, lockingPeriod: uint256) -    <<event>> PricerDisputePeriodUpdated(pricer: address, disputePeriod: uint256) -    <<event>> ExpiryPriceUpdated(asset: address, expiryTimestamp: uint256, price: uint256, onchainTimestamp: uint256) -    <<event>> ExpiryPriceDisputed(asset: address, expiryTimestamp: uint256, disputedPrice: uint256, newPrice: uint256, disputeTimestamp: uint256) -    <<event>> StablePriceUpdated(asset: address, price: uint256) -    isLockingPeriodOver(_asset: address, _expiryTimestamp: uint256): bool -    isDisputePeriodOver(_asset: address, _expiryTimestamp: uint256): bool + +Oracle + +Internal: +   disputer: address +   pricerLockingPeriod: mapping(address=>uint256) +   pricerDisputePeriod: mapping(address=>uint256) +   assetPricer: mapping(address=>address) +   storedPrice: mapping(address=>mapping(uint256=>Price)) +   stablePrice: mapping(address=>uint256) +Public: +   migrated: bool + +External: +    migrateOracle(_asset: address, _expiries: uint256[], _prices: uint256[]) +    endMigration() +    setAssetPricer(_asset: address, _pricer: address) +    setLockingPeriod(_pricer: address, _lockingPeriod: uint256) +    setDisputePeriod(_pricer: address, _disputePeriod: uint256) +    setDisputer(_disputer: address) +    setStablePrice(_asset: address, _price: uint256) +    disputeExpiryPrice(_asset: address, _expiryTimestamp: uint256, _price: uint256) +    setExpiryPrice(_asset: address, _expiryTimestamp: uint256, _price: uint256) +    getPrice(_asset: address): uint256 +    getExpiryPrice(_asset: address, _expiryTimestamp: uint256): (uint256, bool) +    getPricer(_asset: address): address +    getDisputer(): address +    getPricerLockingPeriod(_pricer: address): uint256 +    getPricerDisputePeriod(_pricer: address): uint256 +    getChainlinkRoundData(_asset: address, _roundId: uint80): (uint256, uint256) +Public: +    <<event>> DisputerUpdated(newDisputer: address) +    <<event>> PricerUpdated(asset: address, pricer: address) +    <<event>> PricerLockingPeriodUpdated(pricer: address, lockingPeriod: uint256) +    <<event>> PricerDisputePeriodUpdated(pricer: address, disputePeriod: uint256) +    <<event>> ExpiryPriceUpdated(asset: address, expiryTimestamp: uint256, price: uint256, onchainTimestamp: uint256) +    <<event>> ExpiryPriceDisputed(asset: address, expiryTimestamp: uint256, disputedPrice: uint256, newPrice: uint256, disputeTimestamp: uint256) +    <<event>> StablePriceUpdated(asset: address, price: uint256) +    isLockingPeriodOver(_asset: address, _expiryTimestamp: uint256): bool +    isDisputePeriodOver(_asset: address, _expiryTimestamp: uint256): bool 4struct0 - -<<struct>> -Price - -price: uint256 -timestamp: uint256 + +<<struct>> +Price + +price: uint256 +timestamp: uint256 4struct0->4 - - + + 5 - -Otoken - -Private: -   STRIKE_PRICE_SCALE: uint256 -   STRIKE_PRICE_DIGITS: uint256 -Public: -   controller: address -   underlyingAsset: address -   strikeAsset: address -   collateralAsset: address -   strikePrice: uint256 -   expiryTimestamp: uint256 -   isPut: bool - -Internal: -    _getNameAndSymbol(): (tokenName: string, tokenSymbol: string) -    _getDisplayedStrikePrice(_strikePrice: uint256): string -    _uintTo2Chars(number: uint256): string -    _getOptionType(_isPut: bool): (shortString: string, longString: string) -    _slice(_s: string, _start: uint256, _end: uint256): string -    _getMonth(_month: uint256): (shortString: string, longString: string) -External: -    init(_addressBook: address, _underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiryTimestamp: uint256, _isPut: bool) -    getOtokenDetails(): (address, address, address, uint256, uint256, bool) -    mintOtoken(account: address, amount: uint256) -    burnOtoken(account: address, amount: uint256) + +Otoken + +Private: +   STRIKE_PRICE_SCALE: uint256 +   STRIKE_PRICE_DIGITS: uint256 +Public: +   controller: address +   underlyingAsset: address +   strikeAsset: address +   collateralAsset: address +   strikePrice: uint256 +   expiryTimestamp: uint256 +   isPut: bool + +Internal: +    _getNameAndSymbol(): (tokenName: string, tokenSymbol: string) +    _getDisplayedStrikePrice(_strikePrice: uint256): string +    _uintTo2Chars(number: uint256): string +    _getOptionType(_isPut: bool): (shortString: string, longString: string) +    _slice(_s: string, _start: uint256, _end: uint256): string +    _getMonth(_month: uint256): (shortString: string, longString: string) +External: +    init(_addressBook: address, _underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiryTimestamp: uint256, _isPut: bool) +    getOtokenDetails(): (address, address, address, uint256, uint256, bool) +    mintOtoken(account: address, amount: uint256) +    burnOtoken(account: address, amount: uint256) 6 - -OtokenFactory - -Private: -   idToAddress: mapping(bytes32=>address) -   MAX_EXPIRY: uint256 -Public: -   addressBook: address -   otokens: address[] - -Internal: -    _getOptionId(_underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiry: uint256, _isPut: bool): bytes32 -External: -    createOtoken(_underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiry: uint256, _isPut: bool): address -    getOtokensLength(): uint256 -    getOtoken(_underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiry: uint256, _isPut: bool): address -    getTargetOtokenAddress(_underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiry: uint256, _isPut: bool): address -Public: -    <<event>> OtokenCreated(tokenAddress: address, creator: address, underlying: address, strike: address, collateral: address, strikePrice: uint256, expiry: uint256, isPut: bool) -    constructor(_addressBook: address) + +OtokenFactory + +Private: +   idToAddress: mapping(bytes32=>address) +   MAX_EXPIRY: uint256 +Public: +   addressBook: address +   otokens: address[] + +Internal: +    _getOptionId(_underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiry: uint256, _isPut: bool): bytes32 +External: +    createOtoken(_underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiry: uint256, _isPut: bool): address +    getOtokensLength(): uint256 +    getOtoken(_underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiry: uint256, _isPut: bool): address +    getTargetOtokenAddress(_underlyingAsset: address, _strikeAsset: address, _collateralAsset: address, _strikePrice: uint256, _expiry: uint256, _isPut: bool): address +Public: +    <<event>> OtokenCreated(tokenAddress: address, creator: address, underlying: address, strike: address, collateral: address, strikePrice: uint256, expiry: uint256, isPut: bool) +    constructor(_addressBook: address) 7 - -OtokenSpawner - -Private: -   SALT: bytes32 - -Internal: -    _spawn(logicContract: address, initializationCalldata: bytes): address -    _computeAddress(logicContract: address, initializationCalldata: bytes): (target: address) + +OtokenSpawner + +Private: +   SALT: bytes32 + +Internal: +    _spawn(logicContract: address, initializationCalldata: bytes): address +    _computeAddress(logicContract: address, initializationCalldata: bytes): (target: address) 6->7 - - + + 8 - -Whitelist - -Internal: -   whitelistedProduct: mapping(bytes32=>bool) -   whitelistedCollateral: mapping(address=>bool) -   whitelistedOtoken: mapping(address=>bool) -   whitelistedCallee: mapping(address=>bool) -Public: -   addressBook: address - -External: -    whitelistCollateral(_collateral: address) -    isWhitelistedProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool): bool -    isWhitelistedOtoken(_otoken: address): bool -    isWhitelistedCallee(_callee: address): bool -    whitelistProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool) -    blacklistProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool) -    isWhitelistedCollateral(_collateral: address): bool -    blacklistCollateral(_collateral: address) -    whitelistOtoken(_otokenAddress: address) -    blacklistOtoken(_otokenAddress: address) -    whitelistCallee(_callee: address) -    blacklistCallee(_callee: address) -Public: -    <<event>> ProductWhitelisted(productHash: bytes32, underlying: address, strike: address, collateral: address, isPut: bool) -    <<event>> ProductBlacklisted(productHash: bytes32, underlying: address, strike: address, collateral: address, isPut: bool) -    <<event>> CollateralWhitelisted(collateral: address) -    <<event>> CollateralBlacklisted(collateral: address) -    <<event>> OtokenWhitelisted(otoken: address) -    <<event>> OtokenBlacklisted(otoken: address) -    <<event>> CalleeWhitelisted(_callee: address) -    <<event>> CalleeBlacklisted(_callee: address) -    <<modifier>> onlyFactory() -    constructor(_addressBook: address) + +Whitelist + +Internal: +   whitelistedProduct: mapping(bytes32=>bool) +   whitelistedCollateral: mapping(address=>bool) +   whitelistedOtoken: mapping(address=>bool) +   whitelistedCallee: mapping(address=>bool) +Public: +   addressBook: address + +External: +    isWhitelistedProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool): bool +    isWhitelistedCollateral(_collateral: address): bool +    isWhitelistedOtoken(_otoken: address): bool +    isWhitelistedCallee(_callee: address): bool +    whitelistProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool) +    blacklistProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool) +    whitelistCollateral(_collateral: address) +    blacklistCollateral(_collateral: address) +    whitelistOtoken(_otokenAddress: address) +    blacklistOtoken(_otokenAddress: address) +    whitelistCallee(_callee: address) +    blacklistCallee(_callee: address) +Public: +    <<event>> ProductWhitelisted(productHash: bytes32, underlying: address, strike: address, collateral: address, isPut: bool) +    <<event>> ProductBlacklisted(productHash: bytes32, underlying: address, strike: address, collateral: address, isPut: bool) +    <<event>> CollateralWhitelisted(collateral: address) +    <<event>> CollateralBlacklisted(collateral: address) +    <<event>> OtokenWhitelisted(otoken: address) +    <<event>> OtokenBlacklisted(otoken: address) +    <<event>> CalleeWhitelisted(_callee: address) +    <<event>> CalleeBlacklisted(_callee: address) +    <<modifier>> onlyFactory() +    constructor(_addressBook: address) diff --git a/docs/uml/GammaWhitelist.png b/docs/uml/GammaWhitelist.png index 7860ee9ba..01d3bda61 100644 Binary files a/docs/uml/GammaWhitelist.png and b/docs/uml/GammaWhitelist.png differ diff --git a/docs/uml/GammaWhitelist.svg b/docs/uml/GammaWhitelist.svg index 3184b92a9..bf7b1b80a 100644 --- a/docs/uml/GammaWhitelist.svg +++ b/docs/uml/GammaWhitelist.svg @@ -24,13 +24,13 @@   addressBook: address External: -    whitelistCollateral(_collateral: address) -    isWhitelistedProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool): bool +    isWhitelistedProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool): bool +    isWhitelistedCollateral(_collateral: address): bool    isWhitelistedOtoken(_otoken: address): bool    isWhitelistedCallee(_callee: address): bool    whitelistProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool)    blacklistProduct(_underlying: address, _strike: address, _collateral: address, _isPut: bool) -    isWhitelistedCollateral(_collateral: address): bool +    whitelistCollateral(_collateral: address)    blacklistCollateral(_collateral: address)    whitelistOtoken(_otokenAddress: address)    blacklistOtoken(_otokenAddress: address) diff --git a/test/integration-tests/longCallSpreadExpireItm.test.ts b/test/integration-tests/longCallSpreadExpireItm.test.ts index f86e9222c..fe81ac71b 100644 --- a/test/integration-tests/longCallSpreadExpireItm.test.ts +++ b/test/integration-tests/longCallSpreadExpireItm.test.ts @@ -268,7 +268,7 @@ contract('Long Call Spread Option expires Itm flow', ([accountOwner1, nakedBuyer const longOtokenSupplyBefore = new BigNumber(await lowerStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -336,7 +336,7 @@ contract('Long Call Spread Option expires Itm flow', ([accountOwner1, nakedBuyer assert.equal(longOtokenSupplyBefore.minus(scaledOptionsAmount).toString(), longOtokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -430,7 +430,7 @@ contract('Long Call Spread Option expires Itm flow', ([accountOwner1, nakedBuyer const lowerStrikeCallSupplyBefore = new BigNumber(await lowerStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), scaledCollateralAmount) assert.equal(vaultStateBefore[1], true) @@ -471,7 +471,7 @@ contract('Long Call Spread Option expires Itm flow', ([accountOwner1, nakedBuyer assert.equal(lowerStrikeCallSupplyBefore.toString(), lowerStrikeCallSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/longCallSpreadExpireOtm.test.ts b/test/integration-tests/longCallSpreadExpireOtm.test.ts index 7db278a7f..0a015e11a 100644 --- a/test/integration-tests/longCallSpreadExpireOtm.test.ts +++ b/test/integration-tests/longCallSpreadExpireOtm.test.ts @@ -267,7 +267,7 @@ contract('Long Call Spread Option expires Otm flow', ([accountOwner1, nakedBuyer const lowerStrikeCallSupplyBefore = new BigNumber(await lowerStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -322,7 +322,7 @@ contract('Long Call Spread Option expires Otm flow', ([accountOwner1, nakedBuyer ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -397,7 +397,7 @@ contract('Long Call Spread Option expires Otm flow', ([accountOwner1, nakedBuyer const lowerStrikeCallSupplyBefore = new BigNumber(await lowerStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), scaledCollateralAmount) assert.equal(vaultStateBefore[1], true) @@ -438,7 +438,7 @@ contract('Long Call Spread Option expires Otm flow', ([accountOwner1, nakedBuyer assert.equal(lowerStrikeCallSupplyBefore.toString(), lowerStrikeCallSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/longCallSpreadPreExpiry.test.ts b/test/integration-tests/longCallSpreadPreExpiry.test.ts index c12f054ce..64ebf6d6e 100644 --- a/test/integration-tests/longCallSpreadPreExpiry.test.ts +++ b/test/integration-tests/longCallSpreadPreExpiry.test.ts @@ -232,7 +232,7 @@ contract('Long Call Spread Option closed before expiry flow', ([accountOwner1, n const marginPoolLongOtokenBalanceBefore = new BigNumber(await lowerStrikeCall.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -324,7 +324,7 @@ contract('Long Call Spread Option closed before expiry flow', ([accountOwner1, n ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -370,7 +370,7 @@ contract('Long Call Spread Option closed before expiry flow', ([accountOwner1, n const marginPoolLongOtokenBalanceBefore = new BigNumber(await lowerStrikeCall.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -434,7 +434,7 @@ contract('Long Call Spread Option closed before expiry flow', ([accountOwner1, n ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -472,7 +472,7 @@ contract('Long Call Spread Option closed before expiry flow', ([accountOwner1, n const marginPoolLowerStrikeCallBalanceBefore = new BigNumber(await lowerStrikeCall.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -527,7 +527,7 @@ contract('Long Call Spread Option closed before expiry flow', ([accountOwner1, n assert.equal(marginPoolLowerStrikeCallBalanceBefore.toString(), marginPoolLowerStrikeCallBalanceAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/longPutExpireItm.test.ts b/test/integration-tests/longPutExpireItm.test.ts index 5d346e854..2d08f5c3f 100644 --- a/test/integration-tests/longPutExpireItm.test.ts +++ b/test/integration-tests/longPutExpireItm.test.ts @@ -228,7 +228,7 @@ contract('Long Put Spread Option closed ITM flow', ([accountOwner1, accountOwner const marginPoolLongOtokenBalanceBefore = new BigNumber(await higherStrikePut.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -320,7 +320,7 @@ contract('Long Put Spread Option closed ITM flow', ([accountOwner1, accountOwner ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -365,7 +365,7 @@ contract('Long Put Spread Option closed ITM flow', ([accountOwner1, accountOwner const marginPoolLongOtokenBalanceBefore = new BigNumber(await higherStrikePut.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -429,7 +429,7 @@ contract('Long Put Spread Option closed ITM flow', ([accountOwner1, accountOwner ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -466,7 +466,7 @@ contract('Long Put Spread Option closed ITM flow', ([accountOwner1, accountOwner const higherStrikePutSupplyBefore = new BigNumber(await higherStrikePut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -519,7 +519,7 @@ contract('Long Put Spread Option closed ITM flow', ([accountOwner1, accountOwner ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/longPutExpireOtm.test.ts b/test/integration-tests/longPutExpireOtm.test.ts index 675320051..677538aa4 100644 --- a/test/integration-tests/longPutExpireOtm.test.ts +++ b/test/integration-tests/longPutExpireOtm.test.ts @@ -269,7 +269,7 @@ contract('Long Put Spread Option expires Otm flow', ([accountOwner1, nakedBuyer, const longOtokenSupplyBefore = new BigNumber(await higherStrikePut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -328,7 +328,7 @@ contract('Long Put Spread Option expires Otm flow', ([accountOwner1, nakedBuyer, ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -400,7 +400,7 @@ contract('Long Put Spread Option expires Otm flow', ([accountOwner1, nakedBuyer, const scaledPayoutAmount = createTokenAmount(collateralPayout, usdcDecimals) // Check that after expiry, the vault excess balance has updated as expected - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBeforeSettlement = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBeforeSettlement[0].toString(), scaledPayoutAmount) assert.equal(vaultStateBeforeSettlement[1], true) @@ -438,7 +438,7 @@ contract('Long Put Spread Option expires Otm flow', ([accountOwner1, nakedBuyer, assert.equal(shortOtokenSupplyBefore.toString(), shortOtokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/longPutPreExpiry.test.ts b/test/integration-tests/longPutPreExpiry.test.ts index 838926632..c25e81e98 100644 --- a/test/integration-tests/longPutPreExpiry.test.ts +++ b/test/integration-tests/longPutPreExpiry.test.ts @@ -228,7 +228,7 @@ contract('Long Put Spread Option closed before expiry flow', ([accountOwner1, bu const marginPoolLongOtokenBalanceBefore = new BigNumber(await higherStrikePut.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -320,7 +320,7 @@ contract('Long Put Spread Option closed before expiry flow', ([accountOwner1, bu ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -365,7 +365,7 @@ contract('Long Put Spread Option closed before expiry flow', ([accountOwner1, bu const marginPoolLongOtokenBalanceBefore = new BigNumber(await higherStrikePut.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -429,7 +429,7 @@ contract('Long Put Spread Option closed before expiry flow', ([accountOwner1, bu ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -466,7 +466,7 @@ contract('Long Put Spread Option closed before expiry flow', ([accountOwner1, bu const higherStrikePutSupplyBefore = new BigNumber(await higherStrikePut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -519,7 +519,7 @@ contract('Long Put Spread Option closed before expiry flow', ([accountOwner1, bu ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/nakedCallExpireItm.test.ts b/test/integration-tests/nakedCallExpireItm.test.ts index 26b011289..f1dd67aaf 100644 --- a/test/integration-tests/nakedCallExpireItm.test.ts +++ b/test/integration-tests/nakedCallExpireItm.test.ts @@ -188,7 +188,7 @@ contract('Naked Call Option expires Itm flow', ([accountOwner1, buyer]) => { const oTokenSupplyBefore = new BigNumber(await ethCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -249,7 +249,7 @@ contract('Naked Call Option expires Itm flow', ([accountOwner1, buyer]) => { assert.equal(oTokenSupplyBefore.toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/nakedCallExpireOtm.test.ts b/test/integration-tests/nakedCallExpireOtm.test.ts index 431322bce..dcf78c1c5 100644 --- a/test/integration-tests/nakedCallExpireOtm.test.ts +++ b/test/integration-tests/nakedCallExpireOtm.test.ts @@ -189,7 +189,7 @@ contract('Naked Call Option expires Otm flow', ([accountOwner1, buyer]) => { const oTokenSupplyBefore = new BigNumber(await ethCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -240,7 +240,7 @@ contract('Naked Call Option expires Otm flow', ([accountOwner1, buyer]) => { assert.equal(oTokenSupplyBefore.toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultBefore[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/nakedCallPreExpiry.test.ts b/test/integration-tests/nakedCallPreExpiry.test.ts index feb6d1e80..8be7a24ce 100644 --- a/test/integration-tests/nakedCallPreExpiry.test.ts +++ b/test/integration-tests/nakedCallPreExpiry.test.ts @@ -151,7 +151,7 @@ contract('Naked Call Option closed before expiry flow', ([accountOwner1]) => { const oTokenSupplyBefore = new BigNumber(await ethCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -225,7 +225,7 @@ contract('Naked Call Option closed before expiry flow', ([accountOwner1]) => { assert.equal(oTokenSupplyBefore.plus(scaledOptionsAmount).toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -266,7 +266,7 @@ contract('Naked Call Option closed before expiry flow', ([accountOwner1]) => { const oTokenSupplyBefore = new BigNumber(await ethCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -313,7 +313,7 @@ contract('Naked Call Option closed before expiry flow', ([accountOwner1]) => { assert.equal(oTokenSupplyBefore.minus(scaledOptionsAmount).toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/nakedMarginCallPreExpiry.test.ts b/test/integration-tests/nakedMarginCallPreExpiry.test.ts index 46fd13979..250b2a27b 100644 --- a/test/integration-tests/nakedMarginCallPreExpiry.test.ts +++ b/test/integration-tests/nakedMarginCallPreExpiry.test.ts @@ -233,7 +233,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui const userWethAfter = new BigNumber(await weth.balanceOf(accountOwner1)) const poolWethAfter = new BigNumber(await weth.balanceOf(marginPool.address)) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) assert.equal( userWethBefore.minus(userWethAfter).toString(), @@ -279,7 +279,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui wethDecimals, isPut, ) - const userVaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const amountToWithdraw = new BigNumber(userVaultBefore[0].collateralAmounts[0]).minus(collateralNeeded) const withdrawArgs = [ { @@ -297,7 +297,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui await controllerProxy.operate(withdrawArgs, {from: accountOwner1}) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const userCollateralAfter = new BigNumber(await weth.balanceOf(accountOwner1)) assert.equal( @@ -317,7 +317,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui scaledUnderlyingPrice = scaleBigNum(underlyingPrice, 8) await oracle.setRealTimePrice(weth.address, scaledUnderlyingPrice) - await expectRevert(controllerProxy.sync(accountOwner1, vaultCounter, {from: accountOwner1}), 'CO14') + await expectRevert(controllerProxy.sync(accountOwner1, vaultCounter, {from: accountOwner1}), 'C14') roundId = new BigNumber(10) await oracle.setChainlinkRoundData(weth.address, roundId, scaledUnderlyingPrice, (await time.latest()).toString()) @@ -332,7 +332,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui await controllerProxy.sync(accountOwner1, vaultCounter, {from: accountOwner1}) - const userVault = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVault = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) assert.equal( userVault[2].toString(), @@ -395,12 +395,16 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui ] const liquidatorCollateralBalanceBefore = new BigNumber(await weth.balanceOf(liquidator)) - const vaultBeforeLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultBeforeLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] await controllerProxy.operate(liquidateArgs, {from: liquidator}) const liquidatorCollateralBalanceAfter = new BigNumber(await weth.balanceOf(liquidator)) - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultAfterLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] assert.equal(vaultAfterLiquidation.shortAmounts[0].toString(), '0', 'Vault was not fully liquidated') assert.isAtMost( @@ -512,7 +516,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui const userWethAfter = new BigNumber(await weth.balanceOf(accountOwner1)) const poolWethAfter = new BigNumber(await weth.balanceOf(marginPool.address)) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) assert.equal( userWethBefore.minus(userWethAfter).toString(), @@ -617,18 +621,22 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui }, ] - const vaultBeforeLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultBeforeLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] const liquidatorWethBefore = new BigNumber(await weth.balanceOf(liquidator)) const poolWethBefore = new BigNumber(await weth.balanceOf(marginPool.address)) - const userVaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) await controllerProxy.operate(mintLiquidateArgs, {from: liquidator}) const liquidatorWethAfter = new BigNumber(await weth.balanceOf(liquidator)) const poolWethAfter = new BigNumber(await weth.balanceOf(marginPool.address)) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) - const liquidatorVaultAfter = await controllerProxy.getVault(liquidator, liquidatorVaultCounter) - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) + const liquidatorVaultAfter = await controllerProxy.getVaultWithDetails(liquidator, liquidatorVaultCounter) + const vaultAfterLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] assert.equal(vaultAfterLiquidation.shortAmounts[0].toString(), '0', 'Vault was not fully liquidated') assert.isAtMost( @@ -677,7 +685,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui 'Liquidator vault short amount mismatch', ) assert.equal( - userVaultAfter[0].collateralAmounts[0].toString(), + new BigNumber(userVaultAfter[0].collateralAmounts[0].toString()).toString(), new BigNumber(userVaultBefore[0].collateralAmounts[0]).minus(new BigNumber(isLiquidatable[1])).toString(), 'User vault short amount mismatch after liquidation', ) @@ -698,7 +706,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui await time.increaseTo(optionExpiry.toNumber() + 10) - const userVaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const amountToWithdraw = new BigNumber(await controllerProxy.getProceed(accountOwner1, vaultCounter)) const withdrawArgs = [ @@ -717,7 +725,7 @@ contract('Naked margin: call position pre expiry', ([owner, accountOwner1, liqui await controllerProxy.operate(withdrawArgs, {from: accountOwner1}) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const userCollateralAfter = new BigNumber(await weth.balanceOf(accountOwner1)) assert.equal( diff --git a/test/integration-tests/nakedMarginPutPreExpiry.test.ts b/test/integration-tests/nakedMarginPutPreExpiry.test.ts index 0ddd4f277..175f77f9c 100644 --- a/test/integration-tests/nakedMarginPutPreExpiry.test.ts +++ b/test/integration-tests/nakedMarginPutPreExpiry.test.ts @@ -231,7 +231,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 const userUsdcAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) const poolUsdcAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) assert.equal( userUsdcBefore.minus(userUsdcAfter).toString(), @@ -277,7 +277,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 usdcDecimals, isPut, ) - const userVaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const amountToWithdraw = new BigNumber(userVaultBefore[0].collateralAmounts[0]).minus( new BigNumber(collateralNeeded), ) @@ -297,7 +297,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 await controllerProxy.operate(withdrawArgs, {from: accountOwner1}) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const userCollateralAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) assert.equal( @@ -317,7 +317,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 scaledUnderlyingPrice = scaleBigNum(underlyingPrice, 8) await oracle.setRealTimePrice(weth.address, scaledUnderlyingPrice) - await expectRevert(controllerProxy.sync(accountOwner1, vaultCounter, {from: accountOwner1}), 'CO14') + await expectRevert(controllerProxy.sync(accountOwner1, vaultCounter, {from: accountOwner1}), 'C14') roundId = new BigNumber(10) await oracle.setChainlinkRoundData(weth.address, roundId, scaledUnderlyingPrice, (await time.latest()).toString()) @@ -332,7 +332,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 await controllerProxy.sync(accountOwner1, vaultCounter, {from: accountOwner1}) - const userVault = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVault = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) assert.equal( userVault[2].toString(), @@ -395,12 +395,16 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 ] const liquidatorCollateralBalanceBefore = new BigNumber(await usdc.balanceOf(liquidator)) - const vaultBeforeLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultBeforeLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] await controllerProxy.operate(liquidateArgs, {from: liquidator}) const liquidatorCollateralBalanceAfter = new BigNumber(await usdc.balanceOf(liquidator)) - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultAfterLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] assert.equal(vaultAfterLiquidation.shortAmounts[0].toString(), '0', 'Vault was not fully liquidated') assert.isAtMost( @@ -512,7 +516,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 const userUsdcAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) const poolUsdcAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) assert.equal( userUsdcBefore.minus(userUsdcAfter).toString(), @@ -617,18 +621,22 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 }, ] - const vaultBeforeLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultBeforeLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] const liquidatorUsdcBefore = new BigNumber(await usdc.balanceOf(liquidator)) const poolUsdcBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) - const userVaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) await controllerProxy.operate(mintLiquidateArgs, {from: liquidator}) const liquidatorUsdcAfter = new BigNumber(await usdc.balanceOf(liquidator)) const poolUsdcAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) - const liquidatorVaultAfter = await controllerProxy.getVault(liquidator, liquidatorVaultCounter) - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) + const liquidatorVaultAfter = await controllerProxy.getVaultWithDetails(liquidator, liquidatorVaultCounter) + const vaultAfterLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] assert.equal(vaultAfterLiquidation.shortAmounts[0].toString(), '0', 'Vault was not fully liquidated') assert.isAtMost( @@ -638,7 +646,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 ) .dividedBy(new BigNumber(10 ** usdcDecimals)) .toNumber(), - errorDelta, + new BigNumber(errorDelta).toNumber(), 'Vault collateral mismatch after liquidation', ) assert.equal( @@ -700,7 +708,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 await time.increaseTo(optionExpiry.toNumber() + 10) - const userVaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const amountToWithdraw = new BigNumber(await controllerProxy.getProceed(accountOwner1, vaultCounter)) const withdrawArgs = [ @@ -719,7 +727,7 @@ contract('Naked margin: put position pre expiry', ([owner, accountOwner1, buyer1 await controllerProxy.operate(withdrawArgs, {from: accountOwner1}) - const userVaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const userVaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const userCollateralAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) assert.equal( diff --git a/test/integration-tests/nakedPutExpireITM.test.ts b/test/integration-tests/nakedPutExpireITM.test.ts index 86a1eae6a..a823e3a22 100644 --- a/test/integration-tests/nakedPutExpireITM.test.ts +++ b/test/integration-tests/nakedPutExpireITM.test.ts @@ -190,7 +190,7 @@ contract('Naked Put Option expires Itm flow', ([accountOwner1, buyer]) => { const oTokenSupplyBefore = new BigNumber(await ethPut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -242,7 +242,7 @@ contract('Naked Put Option expires Itm flow', ([accountOwner1, buyer]) => { assert.equal(oTokenSupplyBefore.toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/nakedPutExpireOTM.test.ts b/test/integration-tests/nakedPutExpireOTM.test.ts index abb6d9afa..383e02833 100644 --- a/test/integration-tests/nakedPutExpireOTM.test.ts +++ b/test/integration-tests/nakedPutExpireOTM.test.ts @@ -189,7 +189,7 @@ contract('Naked Put Option expires Otm flow', ([accountOwner1, buyer]) => { const oTokenSupplyBefore = new BigNumber(await ethPut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBeforeExpiry = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBeforeExpiry[0].toString(), '0') assert.equal(vaultStateBeforeExpiry[1], true) @@ -245,7 +245,7 @@ contract('Naked Put Option expires Otm flow', ([accountOwner1, buyer]) => { assert.equal(oTokenSupplyBefore.toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/nakedPutPreExpiry.test.ts b/test/integration-tests/nakedPutPreExpiry.test.ts index 8b80a9bae..1af4f3f74 100644 --- a/test/integration-tests/nakedPutPreExpiry.test.ts +++ b/test/integration-tests/nakedPutPreExpiry.test.ts @@ -152,7 +152,7 @@ contract('Naked Put Option closed before expiry flow', ([accountOwner1]) => { const oTokenSupplyBefore = new BigNumber(await ethPut.totalSupply()) // Check that the vault has 0 exess collateral - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0', 'Incorrect amount of excess collateral') assert.equal(vaultStateBefore[1], true, 'Incorrect boolean of excess collateral') @@ -239,7 +239,7 @@ contract('Naked Put Option closed before expiry flow', ([accountOwner1]) => { ) // Check that we have 0 excess collateral in the vault after - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0', 'Incorrect amount of excess collateral') assert.equal(vaultStateAfter[1], true, 'Incorrect boolean of excess collateral') @@ -280,7 +280,7 @@ contract('Naked Put Option closed before expiry flow', ([accountOwner1]) => { const oTokenSupplyBefore = new BigNumber(await ethPut.totalSupply()) // Check that there is 0 excess collateral - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0', 'Incorrect amount of excess collateral') assert.equal(vaultStateBefore[1], true, 'Incorrect boolean of excess collateral') @@ -327,7 +327,7 @@ contract('Naked Put Option closed before expiry flow', ([accountOwner1]) => { assert.equal(oTokenSupplyBefore.minus(scaledOptionsAmount).toString(), oTokenSupplyAfter.toString()) // Check that there is 0 excess collateral after - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0', 'Incorrect amount of excess collateral') assert.equal(vaultStateAfter[1], true, 'Incorrect boolean of excess collateral') diff --git a/test/integration-tests/rollover.test.ts b/test/integration-tests/rollover.test.ts index b98676205..024c7e6ef 100644 --- a/test/integration-tests/rollover.test.ts +++ b/test/integration-tests/rollover.test.ts @@ -179,7 +179,7 @@ contract('Rollover Naked Put Option flow', ([accountOwner1, accountOperator1, bu const oTokenSupplyBefore = new BigNumber(await ethPut1.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -256,7 +256,7 @@ contract('Rollover Naked Put Option flow', ([accountOwner1, accountOperator1, bu assert.equal(oTokenSupplyBefore.plus(scaledOptionsAmount).toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -302,7 +302,7 @@ contract('Rollover Naked Put Option flow', ([accountOwner1, accountOperator1, bu const oToken2SupplyBefore = new BigNumber(await ethPut2.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -373,7 +373,7 @@ contract('Rollover Naked Put Option flow', ([accountOwner1, accountOperator1, bu assert.equal(oToken2SupplyBefore.plus(scaledOptionsAmount).toString(), oToken2SupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -461,7 +461,7 @@ contract('Rollover Naked Put Option flow', ([accountOwner1, accountOperator1, bu const scaledCollateralAmount1 = createTokenAmount(collateralAmount1, usdcDecimals) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBeforeExpiry = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBeforeExpiry[0].toString(), '0') assert.equal(vaultStateBeforeExpiry[1], true) @@ -551,7 +551,7 @@ contract('Rollover Naked Put Option flow', ([accountOwner1, accountOperator1, bu assert.equal(oToken2SupplyBefore.plus(scaledOptionsAmount).toString(), oToken2SupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/shortCallSpreadExpireItm.test.ts b/test/integration-tests/shortCallSpreadExpireItm.test.ts index 020742efe..0ab3581f3 100644 --- a/test/integration-tests/shortCallSpreadExpireItm.test.ts +++ b/test/integration-tests/shortCallSpreadExpireItm.test.ts @@ -280,7 +280,7 @@ contract('Short Call Spread Option expires Itm flow', ([accountOwner1, nakedBuye const longOtokenSupplyBefore = new BigNumber(await higherStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -341,7 +341,7 @@ contract('Short Call Spread Option expires Itm flow', ([accountOwner1, nakedBuye ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -414,7 +414,7 @@ contract('Short Call Spread Option expires Itm flow', ([accountOwner1, nakedBuye const shortOtokenSupplyBefore = new BigNumber(await higherStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const strikePriceChange = Math.max(expirySpotPrice - higherStrike, 0) const collateralAmount = optionsAmount @@ -456,7 +456,7 @@ contract('Short Call Spread Option expires Itm flow', ([accountOwner1, nakedBuye assert.equal(shortOtokenSupplyBefore.toString(), shortOtokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/shortCallSpreadExpireOtm.test.ts b/test/integration-tests/shortCallSpreadExpireOtm.test.ts index 87ef98145..e5ae3f54a 100644 --- a/test/integration-tests/shortCallSpreadExpireOtm.test.ts +++ b/test/integration-tests/shortCallSpreadExpireOtm.test.ts @@ -280,7 +280,7 @@ contract('Short Call Spread Option expires Otm flow', ([accountOwner1, nakedBuye const longOtokenSupplyBefore = new BigNumber(await higherStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -342,7 +342,7 @@ contract('Short Call Spread Option expires Otm flow', ([accountOwner1, nakedBuye ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -410,7 +410,7 @@ contract('Short Call Spread Option expires Otm flow', ([accountOwner1, nakedBuye const shortOtokenSupplyBefore = new BigNumber(await higherStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const strikePriceChange = Math.max(expirySpotPrice - higherStrike, 0) const collateralAmount = optionsAmount @@ -452,7 +452,7 @@ contract('Short Call Spread Option expires Otm flow', ([accountOwner1, nakedBuye assert.equal(shortOtokenSupplyBefore.toString(), shortOtokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/shortCallSpreadPreExpiry.test.ts b/test/integration-tests/shortCallSpreadPreExpiry.test.ts index 7720af8d2..2bfece062 100644 --- a/test/integration-tests/shortCallSpreadPreExpiry.test.ts +++ b/test/integration-tests/shortCallSpreadPreExpiry.test.ts @@ -232,7 +232,7 @@ contract('Short Call Spread Option closed before expiry flow', ([accountOwner1, const marginPoolLongOtokenBalanceBefore = new BigNumber(await higherStrikeCall.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -337,7 +337,7 @@ contract('Short Call Spread Option closed before expiry flow', ([accountOwner1, ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -388,7 +388,7 @@ contract('Short Call Spread Option closed before expiry flow', ([accountOwner1, const marginPoolLongOtokenBalanceBefore = new BigNumber(await higherStrikeCall.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -465,7 +465,7 @@ contract('Short Call Spread Option closed before expiry flow', ([accountOwner1, ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -508,7 +508,7 @@ contract('Short Call Spread Option closed before expiry flow', ([accountOwner1, const higherStrikeCallSupplyBefore = new BigNumber(await higherStrikeCall.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -561,7 +561,7 @@ contract('Short Call Spread Option closed before expiry flow', ([accountOwner1, ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/shortPutSpreadExpireItm.test.ts b/test/integration-tests/shortPutSpreadExpireItm.test.ts index d200bcc8d..8ce9a799d 100644 --- a/test/integration-tests/shortPutSpreadExpireItm.test.ts +++ b/test/integration-tests/shortPutSpreadExpireItm.test.ts @@ -279,7 +279,7 @@ contract('Short Put Spread Option expires Itm flow', ([accountOwner1, nakedBuyer const longOtokenSupplyBefore = new BigNumber(await lowerStrikePut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -344,7 +344,7 @@ contract('Short Put Spread Option expires Itm flow', ([accountOwner1, nakedBuyer ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -421,7 +421,7 @@ contract('Short Put Spread Option expires Itm flow', ([accountOwner1, nakedBuyer const scaledPayoutAmount = createTokenAmount(collateralPayout, usdcDecimals) // Check that after expiry, the vault excess balance has updated as expected - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBeforeSettlement = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBeforeSettlement[0].toString(), scaledPayoutAmount) assert.equal(vaultStateBeforeSettlement[1], true) @@ -459,7 +459,7 @@ contract('Short Put Spread Option expires Itm flow', ([accountOwner1, nakedBuyer assert.equal(shortOtokenSupplyBefore.toString(), shortOtokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/shortPutSpreadExpireOtm.test.ts b/test/integration-tests/shortPutSpreadExpireOtm.test.ts index 6890c232a..4283350d1 100644 --- a/test/integration-tests/shortPutSpreadExpireOtm.test.ts +++ b/test/integration-tests/shortPutSpreadExpireOtm.test.ts @@ -280,7 +280,7 @@ contract('Short Put Spread Option expires Otm flow', ([accountOwner1, nakedBuyer const longOtokenSupplyBefore = new BigNumber(await lowerStrikePut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -341,7 +341,7 @@ contract('Short Put Spread Option expires Otm flow', ([accountOwner1, nakedBuyer ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -413,7 +413,7 @@ contract('Short Put Spread Option expires Otm flow', ([accountOwner1, nakedBuyer const scaledPayoutAmount = createTokenAmount(collateralPayout, usdcDecimals) // Check that after expiry, the vault excess balance has updated as expected - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBeforeSettlement = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBeforeSettlement[0].toString(), scaledPayoutAmount) assert.equal(vaultStateBeforeSettlement[1], true) @@ -451,7 +451,7 @@ contract('Short Put Spread Option expires Otm flow', ([accountOwner1, nakedBuyer assert.equal(shortOtokenSupplyBefore.toString(), shortOtokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/shortPutSpreadPreExpiry.test.ts b/test/integration-tests/shortPutSpreadPreExpiry.test.ts index 3027f8f28..843fb4a38 100644 --- a/test/integration-tests/shortPutSpreadPreExpiry.test.ts +++ b/test/integration-tests/shortPutSpreadPreExpiry.test.ts @@ -231,7 +231,7 @@ contract('Short Put Spread Option closed before expiry flow', ([accountOwner1, n const marginPoolLongOtokenBalanceBefore = new BigNumber(await lowerStrikePut.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -336,7 +336,7 @@ contract('Short Put Spread Option closed before expiry flow', ([accountOwner1, n ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -387,7 +387,7 @@ contract('Short Put Spread Option closed before expiry flow', ([accountOwner1, n const marginPoolLongOtokenBalanceBefore = new BigNumber(await lowerStrikePut.balanceOf(marginPool.address)) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -464,7 +464,7 @@ contract('Short Put Spread Option closed before expiry flow', ([accountOwner1, n ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter1) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter1) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -506,7 +506,7 @@ contract('Short Put Spread Option closed before expiry flow', ([accountOwner1, n const lowerStrikePutSupplyBefore = new BigNumber(await lowerStrikePut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -559,7 +559,7 @@ contract('Short Put Spread Option closed before expiry flow', ([accountOwner1, n ) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner2, vaultCounter2) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner2, vaultCounter2) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/integration-tests/yieldFarming.test.ts b/test/integration-tests/yieldFarming.test.ts index e45630eda..fa526a04c 100644 --- a/test/integration-tests/yieldFarming.test.ts +++ b/test/integration-tests/yieldFarming.test.ts @@ -298,7 +298,7 @@ contract('Yield Farming: Naked Put Option closed before expiry flow', ([admin, a const oTokenSupplyBefore = new BigNumber(await cusdcEthPut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -355,7 +355,7 @@ contract('Yield Farming: Naked Put Option closed before expiry flow', ([admin, a assert.equal(oTokenSupplyBefore.plus(scaledOptionsAmount).toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) @@ -400,7 +400,7 @@ contract('Yield Farming: Naked Put Option closed before expiry flow', ([admin, a const oTokenSupplyBefore = new BigNumber(await cusdcEthPut.totalSupply()) // Check that we start at a valid state - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateBefore = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) assert.equal(vaultStateBefore[0].toString(), '0') assert.equal(vaultStateBefore[1], true) @@ -460,7 +460,7 @@ contract('Yield Farming: Naked Put Option closed before expiry flow', ([admin, a assert.equal(oTokenSupplyBefore.toString(), oTokenSupplyAfter.toString()) // Check that we end at a valid state - const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultAfter = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const vaultStateAfter = await calculator.getExcessCollateral(vaultAfter[0], vaultAfter[1]) assert.equal(vaultStateAfter[0].toString(), '0') assert.equal(vaultStateAfter[1], true) diff --git a/test/unit-tests/Actions.test.ts b/test/unit-tests/Actions.test.ts index 556e6f9df..10f73e0fe 100644 --- a/test/unit-tests/Actions.test.ts +++ b/test/unit-tests/Actions.test.ts @@ -40,10 +40,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: ZERO_ADDR, } - await expectRevert( - actionTester.testParseDespositAction(data), - 'Actions: can only parse arguments for deposit actions', - ) + await expectRevert(actionTester.testParseDespositAction(data), 'A8') }) it('should not be able to parse an invalid sender address', async () => { const data = { @@ -57,7 +54,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: ZERO_ADDR, } - await expectRevert(actionTester.testParseDespositAction(data), 'Actions: cannot deposit to an invalid account') + await expectRevert(actionTester.testParseDespositAction(data), 'A9') }) it('should be able to parse arguments for a deposit long action', async () => { const actionType = ActionType.DepositLongOption @@ -132,10 +129,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: ZERO_ADDR, } - await expectRevert( - actionTester.testParseOpenVaultAction(data), - 'Actions: can only parse arguments for open vault actions', - ) + await expectRevert(actionTester.testParseOpenVaultAction(data), 'A1') }) it('should not be able to parse an invalid owner address', async () => { const actionType = ActionType.OpenVault @@ -156,10 +150,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert( - actionTester.testParseOpenVaultAction(data), - 'Actions: cannot open vault for an invalid account', - ) + await expectRevert(actionTester.testParseOpenVaultAction(data), 'A2') }) it('should be able to parse arguments for an open vault action', async () => { const actionType = ActionType.OpenVault @@ -201,10 +192,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: ZERO_ADDR, } - await expectRevert( - actionTester.testParseRedeemAction(data), - 'Actions: can only parse arguments for redeem actions', - ) + await expectRevert(actionTester.testParseRedeemAction(data), 'A13') }) it('should be able to parse arguments for an redeem action', async () => { @@ -255,10 +243,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert( - actionTester.testParseSettleVaultAction(data), - 'Actions: can only parse arguments for settle vault actions', - ) + await expectRevert(actionTester.testParseSettleVaultAction(data), 'A15') }) it('should not be able to parse an invalid owner address', async () => { const actionType = ActionType.SettleVault @@ -279,10 +264,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert( - actionTester.testParseSettleVaultAction(data), - 'Actions: cannot settle vault for an invalid account', - ) + await expectRevert(actionTester.testParseSettleVaultAction(data), 'A16') }) it('should be able to parse arguments for a settle vault action', async () => { const actionType = ActionType.SettleVault @@ -329,10 +311,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert( - actionTester.testParseSettleVaultAction(data), - 'Actions: cannot withdraw payout to an invalid account', - ) + await expectRevert(actionTester.testParseSettleVaultAction(data), 'A17') }) }) @@ -356,10 +335,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert( - actionTester.testParseWithdrawAction(data), - 'Actions: can only parse arguments for withdraw actions', - ) + await expectRevert(actionTester.testParseWithdrawAction(data), 'A10') }) it('should not be able to parse an invalid sender address', async () => { const actionType = ActionType.WithdrawCollateral @@ -380,7 +356,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert(actionTester.testParseWithdrawAction(data), 'Actions: cannot withdraw to an invalid account') + await expectRevert(actionTester.testParseWithdrawAction(data), 'A12') }) it('should not be able to parse an invalid owner address', async () => { const actionType = ActionType.WithdrawCollateral @@ -401,7 +377,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert(actionTester.testParseWithdrawAction(data), 'Actions: cannot withdraw from an invalid account') + await expectRevert(actionTester.testParseWithdrawAction(data), 'A11') }) it('should be able to parse arguments for a withdraw long action', async () => { const actionType = ActionType.WithdrawLongOption @@ -476,7 +452,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: ZERO_ADDR, } - await expectRevert(actionTester.testParseMintAction(data), 'Actions: can only parse arguments for mint actions') + await expectRevert(actionTester.testParseMintAction(data), 'A4') }) it('should not be able to parse an invalid sender address', async () => { const actionType = ActionType.MintShortOption @@ -497,7 +473,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert(actionTester.testParseMintAction(data), 'Actions: cannot mint from an invalid account') + await expectRevert(actionTester.testParseMintAction(data), 'A5') }) it('should be able to parse arguments for a mint short action', async () => { const actionType = ActionType.MintShortOption @@ -579,7 +555,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert(actionTester.testParseBurnAction(data), 'Actions: can only parse arguments for burn actions') + await expectRevert(actionTester.testParseBurnAction(data), 'A6') }) it('should not be able to parse an invalid sender address', async () => { const actionType = ActionType.BurnShortOption @@ -600,7 +576,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { data: bytesArgs, } - await expectRevert(actionTester.testParseBurnAction(data), 'Actions: cannot burn from an invalid account') + await expectRevert(actionTester.testParseBurnAction(data), 'A7') }) it('should be able to parse arguments for a burn short action', async () => { const actionType = ActionType.BurnShortOption @@ -675,7 +651,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { index: 0, } - await expectRevert(actionTester.testParseCallAction(data), 'Actions: can only parse arguments for call actions') + await expectRevert(actionTester.testParseCallAction(data), 'A22') }) it('should not be able to parse an invalid sender address (call target address)', async () => { const data = { @@ -689,7 +665,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { index: 0, } - await expectRevert(actionTester.testParseCallAction(data), 'Actions: target address cannot be address(0)') + await expectRevert(actionTester.testParseCallAction(data), 'A23') }) it('should be able to parse arguments for a call action', async () => { const data = { @@ -724,10 +700,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { index: 0, } - await expectRevert( - actionTester.testParseLiquidateActions(data), - 'Actions: can only parse arguments for liquidate action', - ) + await expectRevert(actionTester.testParseLiquidateActions(data), 'A18') }) it('should not be able to parse a Liquidate action with invalid vault owner address', async () => { @@ -742,10 +715,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { index: 0, } - await expectRevert( - actionTester.testParseLiquidateActions(data), - 'Actions: cannot liquidate vault for an invalid account owner', - ) + await expectRevert(actionTester.testParseLiquidateActions(data), 'A19') }) it('should not be able to parse a Liquidate action with invalid receiver address', async () => { @@ -760,10 +730,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { index: 0, } - await expectRevert( - actionTester.testParseLiquidateActions(data), - 'Actions: cannot send collateral to an invalid account', - ) + await expectRevert(actionTester.testParseLiquidateActions(data), 'A20') }) it('should not be able to parse a Liquidate action with no chainlink round id', async () => { @@ -778,10 +745,7 @@ contract('Actions', ([owner, random, random2, random3, liquidator]) => { index: 0, } - await expectRevert( - actionTester.testParseLiquidateActions(data), - 'Actions: cannot parse liquidate action with no round id', - ) + await expectRevert(actionTester.testParseLiquidateActions(data), 'A21') }) it('should parse a Liquidate action', async () => { diff --git a/test/unit-tests/controller.test.ts b/test/unit-tests/controller.test.ts index 60fcc7b91..388e77e9d 100644 --- a/test/unit-tests/controller.test.ts +++ b/test/unit-tests/controller.test.ts @@ -9,6 +9,7 @@ import { ControllerInstance, AddressBookInstance, OwnedUpgradeabilityProxyInstance, + OtokenImplV1Instance, } from '../../build/types/truffle-types' import BigNumber from 'bignumber.js' import {createTokenAmount, createScaledNumber} from '../utils' @@ -17,6 +18,7 @@ const {expectRevert, expectEvent, time} = require('@openzeppelin/test-helpers') const CallTester = artifacts.require('CallTester.sol') const MockERC20 = artifacts.require('MockERC20.sol') +const OtokenImplV1 = artifacts.require('OtokenImplV1.sol') const MockOtoken = artifacts.require('MockOtoken.sol') const MockOracle = artifacts.require('MockOracle.sol') const OwnedUpgradeabilityProxy = artifacts.require('OwnedUpgradeabilityProxy.sol') @@ -46,7 +48,7 @@ enum ActionType { contract( 'Controller', - ([owner, accountOwner1, accountOwner2, accountOperator1, holder1, fullPauser, partialPauser, random, donor]) => { + ([owner, accountOwner1, accountOwner2, accountOperator1, holder1, partialPauser, fullPauser, random, donor]) => { // ERC20 mock let usdc: MockERC20Instance let weth: MockERC20Instance @@ -126,13 +128,13 @@ contract( it('should revert when calling initialize with addressbook equal to zero', async () => { const controllerImplementation = await Controller.new() - await expectRevert(controllerImplementation.initialize(ZERO_ADDR, owner), 'CO7') + await expectRevert(controllerImplementation.initialize(ZERO_ADDR, owner), 'C7') }) it('should revert when calling initialize with owner equal to zero', async () => { const controllerImplementation = await Controller.new() - await expectRevert(controllerImplementation.initialize(addressBook.address, ZERO_ADDR), 'CO8') + await expectRevert(controllerImplementation.initialize(addressBook.address, ZERO_ADDR), 'C8') }) }) @@ -154,7 +156,7 @@ contract( }) it('should revert when set an already operator', async () => { - await expectRevert(controllerProxy.setOperator(accountOperator1, true, {from: accountOwner1}), 'CO9') + await expectRevert(controllerProxy.setOperator(accountOperator1, true, {from: accountOwner1}), 'C9') }) it('should be able to remove operator', async () => { @@ -168,7 +170,7 @@ contract( }) it('should revert when removing an already removed operator', async () => { - await expectRevert(controllerProxy.setOperator(accountOperator1, false, {from: accountOwner1}), 'CO9') + await expectRevert(controllerProxy.setOperator(accountOperator1, false, {from: accountOwner1}), 'C9') }) }) @@ -199,7 +201,7 @@ contract( data: ZERO_ADDR, }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: random}), 'CO6') + await expectRevert(controllerProxy.operate(actionArgs, {from: random}), 'C6') }) it('should revert opening a vault a vault with id equal to zero', async () => { @@ -215,7 +217,7 @@ contract( data: ZERO_ADDR, }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO15') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C15') }) it('should revert opening multiple vaults in the same operate call', async () => { @@ -242,7 +244,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO13') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C13') }) it('should revert opening a vault with vault type other than 0 or 1', async () => { @@ -261,10 +263,7 @@ contract( }, ] - await expectRevert( - controllerProxy.operate(actionArgs, {from: accountOwner1}), - 'Actions: cannot open vault with an invalid type', - ) + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'A3') }) it('should revert opening multiple vaults for different owners in the same operate call', async () => { @@ -292,7 +291,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO12') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C12') }) it('should open vault', async () => { @@ -386,7 +385,7 @@ contract( ] await longOtoken.approve(marginPool.address, longToDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO17') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C17') }) it('should revert depositing long with invalid vault id', async () => { @@ -410,7 +409,7 @@ contract( ] await longOtoken.approve(marginPool.address, longToDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO35') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C35') }) it('should revert depositing long from an address that is not the msg.sender nor the owner account address', async () => { @@ -432,7 +431,7 @@ contract( await longOtoken.approve(marginPool.address, longToDeposit, {from: random}) await longOtoken.approve(marginPool.address, longToDeposit, {from: accountOperator1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOperator1}), 'CO16') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOperator1}), 'C16') }) it('should deposit long otoken into vault from account owner', async () => { @@ -458,7 +457,7 @@ contract( const marginPoolBalanceAfter = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const senderBalanceAfter = new BigNumber(await longOtoken.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -506,14 +505,14 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const senderBalanceBefore = new BigNumber(await longOtoken.balanceOf(accountOperator1)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await longOtoken.approve(marginPool.address, longToDeposit, {from: accountOperator1}) await controllerProxy.operate(actionArgs, {from: accountOperator1}) const marginPoolBalanceAfter = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const senderBalanceAfter = new BigNumber(await longOtoken.balanceOf(accountOperator1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -565,14 +564,14 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const senderBalanceBefore = new BigNumber(await longOtoken.balanceOf(accountOwner1)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await longOtoken.approve(marginPool.address, longToDeposit.multipliedBy(2).toString(), {from: accountOwner1}) await controllerProxy.operate(actionArgs, {from: accountOwner1}) const marginPoolBalanceAfter = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const senderBalanceAfter = new BigNumber(await longOtoken.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -614,10 +613,7 @@ contract( ] await longOtoken.approve(marginPool.address, longToDeposit, {from: accountOwner1}) - await expectRevert( - controllerProxy.operate(actionArgs, {from: accountOwner1}), - 'MarginVault: invalid long otoken amount', - ) + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'V4') }) it('should revert depositing an expired long otoken', async () => { @@ -654,7 +650,7 @@ contract( ] await expiredLongOtoken.approve(marginPool.address, longToDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO18') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C18') }) it('should revert when vault have more than 1 long otoken', async () => { @@ -749,10 +745,7 @@ contract( }, ] - await expectRevert( - controllerProxy.operate(actionArgs, {from: accountOwner1}), - 'MarginVault: invalid long otoken index', - ) + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'V5') }) it('should revert withdrawing long otoken from random address other than account owner or operator', async () => { @@ -773,14 +766,14 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: random}), 'CO6') + await expectRevert(controllerProxy.operate(actionArgs, {from: random}), 'C6') }) it('should revert withdrawing long otoken amount greater than the vault balance', async () => { const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) assert.isAbove(vaultCounter.toNumber(), 0, 'Account owner have no vault') - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) const longToWithdraw = new BigNumber(vaultBefore.longAmounts[0]).plus(1) const actionArgs = [ { @@ -818,7 +811,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO35') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C35') }) it('should withdraw long otoken to any random address where msg.sender is account owner', async () => { @@ -840,13 +833,13 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const receiverBalanceBefore = new BigNumber(await longOtoken.balanceOf(random)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await controllerProxy.operate(actionArgs, {from: accountOwner1}) const marginPoolBalanceAfter = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const receiverBalanceAfter = new BigNumber(await longOtoken.balanceOf(random)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), @@ -891,13 +884,13 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const receiverBalanceBefore = new BigNumber(await longOtoken.balanceOf(random)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await controllerProxy.operate(actionArgs, {from: accountOperator1}) const marginPoolBalanceAfter = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const receiverBalanceAfter = new BigNumber(await longOtoken.balanceOf(random)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), @@ -946,13 +939,13 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const receiverBalanceBefore = new BigNumber(await longOtoken.balanceOf(accountOwner1)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await controllerProxy.operate(actionArgs, {from: accountOwner1}) const marginPoolBalanceAfter = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const receiverBalanceAfter = new BigNumber(await longOtoken.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), @@ -976,7 +969,7 @@ contract( const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) assert.isAbove(vaultCounter.toNumber(), 0, 'Account owner have no vault') - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) const longToWithdraw = new BigNumber(vaultBefore.longAmounts[0]) const actionArgs = [ @@ -998,7 +991,7 @@ contract( const marginPoolBalanceAfter = new BigNumber(await longOtoken.balanceOf(marginPool.address)) const receiverBalanceAfter = new BigNumber(await longOtoken.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), @@ -1056,7 +1049,7 @@ contract( ] await expiredLongOtoken.approve(marginPool.address, longToDeposit, {from: accountOwner1}) await controllerProxy.operate(actionArgs, {from: accountOwner1}) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultId))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultId) assert.equal(vaultAfter.longOtokens.length, 1, 'Vault long otoken array length mismatch') assert.equal( vaultAfter.longOtokens[0], @@ -1075,7 +1068,7 @@ contract( await time.increase(3601) // increase time with one hour in seconds const vaultId = new BigNumber('1') - const vault = (await controllerProxy.getVault(accountOwner1, vaultId))[0] + const vault = await controllerProxy.getVault(accountOwner1, vaultId) const longToWithdraw = new BigNumber(vault.longAmounts[0]) const actionArgs = [ { @@ -1096,7 +1089,7 @@ contract( 'Long otoken is not expired yet', ) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO19') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C19') }) }) }) @@ -1132,7 +1125,7 @@ contract( const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -1177,14 +1170,14 @@ contract( const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceBefore = new BigNumber(await usdc.balanceOf(accountOperator1)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOperator1}) await controllerProxy.operate(actionArgs, {from: accountOperator1}) const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceAfter = new BigNumber(await usdc.balanceOf(accountOperator1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -1229,7 +1222,7 @@ contract( ] await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO35') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C35') }) it('should revert depositing long from an address that is not the msg.sender nor the owner account address', async () => { @@ -1251,7 +1244,7 @@ contract( await usdc.approve(marginPool.address, collateralToDeposit, {from: random}) await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOperator1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOperator1}), 'CO20') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOperator1}), 'C20') }) it('should revert depositing a collateral asset with amount equal to zero', async () => { @@ -1273,10 +1266,7 @@ contract( ] await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOwner1}) - await expectRevert( - controllerProxy.operate(actionArgs, {from: accountOwner1}), - 'MarginVault: invalid collateral amount', - ) + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'V7') }) it('should execute depositing collateral into vault in multiple actions', async () => { @@ -1306,14 +1296,14 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceBefore = new BigNumber(await usdc.balanceOf(accountOwner1)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await usdc.approve(marginPool.address, collateralToDeposit.multipliedBy(2), {from: accountOwner1}) await controllerProxy.operate(actionArgs, {from: accountOwner1}) const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -1364,7 +1354,7 @@ contract( ] await trx.approve(marginPool.address, collateralDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO21') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C21') }) }) @@ -1415,10 +1405,7 @@ contract( }, ] - await expectRevert( - controllerProxy.operate(actionArgs, {from: accountOwner1}), - 'MarginVault: invalid collateral asset index', - ) + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'V8') }) it('should revert withdrawing collateral asset from an invalid id', async () => { @@ -1439,14 +1426,14 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO35') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C35') }) it('should revert withdrawing collateral asset amount greater than the vault balance', async () => { const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) assert.isAbove(vaultCounter.toNumber(), 0, 'Account owner have no vault') - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) const collateralToWithdraw = new BigNumber(vaultBefore.collateralAmounts[0]).plus(1) const actionArgs = [ { @@ -1486,13 +1473,13 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) const receiverBalanceBefore = new BigNumber(await usdc.balanceOf(random)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await controllerProxy.operate(actionArgs, {from: accountOwner1}) const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const receiverBalanceAfter = new BigNumber(await usdc.balanceOf(random)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), @@ -1539,13 +1526,13 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) const receiverBalanceBefore = new BigNumber(await usdc.balanceOf(random)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await controllerProxy.operate(actionArgs, {from: accountOperator1}) const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const receiverBalanceAfter = new BigNumber(await usdc.balanceOf(random)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), @@ -1596,13 +1583,13 @@ contract( ] const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) const receiverBalanceBefore = new BigNumber(await usdc.balanceOf(accountOwner1)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await controllerProxy.operate(actionArgs, {from: accountOwner1}) const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const receiverBalanceAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), @@ -1628,7 +1615,7 @@ contract( const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) assert.isAbove(vaultCounter.toNumber(), 0, 'Account owner have no vault') - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) const collateralToWithdraw = new BigNumber(vaultBefore.collateralAmounts[0]) const actionArgs = [ @@ -1650,7 +1637,7 @@ contract( const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const receiverBalanceAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), @@ -1738,7 +1725,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: random}), 'CO6') + await expectRevert(controllerProxy.operate(actionArgs, {from: random}), 'C6') }) it('should revert minting using un-marginable collateral asset', async () => { @@ -1797,7 +1784,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO35') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C35') }) it('mint naked short otoken from owner', async () => { @@ -1832,7 +1819,7 @@ contract( const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceBefore = new BigNumber(await usdc.balanceOf(accountOwner1)) const senderShortBalanceBefore = new BigNumber(await shortOtoken.balanceOf(accountOwner1)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOwner1}) await controllerProxy.operate(actionArgs, {from: accountOwner1}) @@ -1840,7 +1827,7 @@ contract( const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) const senderShortBalanceAfter = new BigNumber(await shortOtoken.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -1915,7 +1902,7 @@ contract( const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceBefore = new BigNumber(await usdc.balanceOf(accountOperator1)) const senderShortBalanceBefore = new BigNumber(await shortOtoken.balanceOf(accountOperator1)) - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOperator1}) await controllerProxy.operate(actionArgs, {from: accountOperator1}) @@ -1923,7 +1910,7 @@ contract( const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const senderBalanceAfter = new BigNumber(await usdc.balanceOf(accountOperator1)) const senderShortBalanceAfter = new BigNumber(await shortOtoken.balanceOf(accountOperator1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -1970,7 +1957,7 @@ contract( const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) assert.isAbove(vaultCounter.toNumber(), 0, 'Account owner have no vault') - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const [netValue, isExcess] = await calculator.getExcessCollateral(vaultBefore[0], vaultBefore[1]) @@ -1994,7 +1981,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO14') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C14') }) it('should withdraw exceeded collateral from naked short position when net value > 0 ', async () => { @@ -2018,7 +2005,7 @@ contract( await usdc.approve(marginPool.address, excessCollateralToDeposit, {from: accountOwner1}) await controllerProxy.operate(firstActionArgs, {from: accountOwner1}) - const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) + const vaultBefore = await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter) const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) const withdrawerBalanceBefore = new BigNumber(await usdc.balanceOf(accountOwner1)) @@ -2045,7 +2032,7 @@ contract( await controllerProxy.operate(secondActionArgs, {from: accountOwner1}) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) const withdrawerBalanceAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) @@ -2147,7 +2134,7 @@ contract( ] await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOperator1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOperator1}), 'CO23') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOperator1}), 'C23') }) }) @@ -2203,7 +2190,7 @@ contract( data: ZERO_ADDR, }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner2}), 'CO14') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner2}), 'C14') }) it('should revert minting 1 wei of oToken with minimal strikePrice without putting collateral', async () => { @@ -2231,7 +2218,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner2}), 'CO14') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner2}), 'C14') }) }) }) @@ -2255,10 +2242,7 @@ contract( }, ] - await expectRevert( - controllerProxy.operate(actionArgs, {from: accountOwner1}), - 'MarginVault: invalid short otoken index', - ) + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'V2') }) it('should revert burning when there is no enough balance', async () => { @@ -2310,7 +2294,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: random}), 'CO6') + await expectRevert(controllerProxy.operate(actionArgs, {from: random}), 'C6') }) it('should revert minting short with invalid vault id', async () => { @@ -2330,7 +2314,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO35') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C35') }) it('should revert depositing long from an address that is not the msg.sender nor the owner account address', async () => { @@ -2350,14 +2334,14 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOperator1}), 'CO25') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOperator1}), 'C25') }) it('should burn short otoken when called from account operator', async () => { const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) assert.isAbove(vaultCounter.toNumber(), 0, 'Account owner have no vault') - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) const shortOtokenToBurn = new BigNumber(await shortOtoken.balanceOf(accountOperator1)) const actionArgs = [ @@ -2377,7 +2361,7 @@ contract( await controllerProxy.operate(actionArgs, {from: accountOperator1}) const sellerBalanceAfter = new BigNumber(await shortOtoken.balanceOf(accountOperator1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( sellerBalanceBefore.minus(sellerBalanceAfter).toString(), @@ -2405,7 +2389,7 @@ contract( const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) assert.isAbove(vaultCounter.toNumber(), 0, 'Account owner have no vault') - const vaultBefore = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultBefore = await controllerProxy.getVault(accountOwner1, vaultCounter) const shortOtokenToBurn = new BigNumber(vaultBefore.shortAmounts[0]) const actionArgs = [ @@ -2425,7 +2409,7 @@ contract( await controllerProxy.operate(actionArgs, {from: accountOwner1}) const sellerBalanceAfter = new BigNumber(await shortOtoken.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal( sellerBalanceBefore.minus(sellerBalanceAfter).toString(), @@ -2480,7 +2464,7 @@ contract( const senderShortBalanceBefore = new BigNumber(await shortOtoken.balanceOf(accountOwner1)) await controllerProxy.operate(actionArgs, {from: accountOwner1}) const senderShortBalanceAfter = new BigNumber(await shortOtoken.balanceOf(accountOwner1)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = await controllerProxy.getVault(accountOwner1, vaultCounter) assert.equal(vaultAfter.shortOtokens.length, 1, 'Vault short otoken array length mismatch') assert.equal(vaultAfter.shortOtokens[0], ZERO_ADDR) assert.equal( @@ -2592,7 +2576,7 @@ contract( 'Long otoken is not expired yet', ) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO26') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C26') }) it('should revert minting an expired short otoken', async () => { @@ -2625,7 +2609,7 @@ contract( ] await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOperator1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO24') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C24') }) it('should revert withdraw collateral from a vault with an expired short otoken', async () => { @@ -2646,7 +2630,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO22') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C22') }) }) }) @@ -2741,7 +2725,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: holder1}), 'CO27') + await expectRevert(controllerProxy.operate(actionArgs, {from: holder1}), 'C27') }) it('should revert exercising un-expired otoken', async () => { @@ -2761,7 +2745,7 @@ contract( assert.equal(await controllerProxy.hasExpired(shortOtoken.address), false, 'Short otoken has already expired') - await expectRevert(controllerProxy.operate(actionArgs, {from: holder1}), 'CO28') + await expectRevert(controllerProxy.operate(actionArgs, {from: holder1}), 'C28') }) it('should revert exercising after expiry, when underlying price is not finalized yet', async () => { @@ -2804,7 +2788,7 @@ contract( assert.equal(await controllerProxy.hasExpired(shortOtoken.address), true, 'Short otoken is not expired yet') - await expectRevert(controllerProxy.operate(actionArgs, {from: holder1}), 'CO29') + await expectRevert(controllerProxy.operate(actionArgs, {from: holder1}), 'C29') }) it('should revert exercising if cash value receiver address in equal to address zero', async () => { @@ -2831,10 +2815,7 @@ contract( assert.equal(await controllerProxy.hasExpired(shortOtoken.address), true, 'Short otoken is not expired yet') - await expectRevert( - controllerProxy.operate(actionArgs, {from: holder1}), - 'Actions: cannot redeem to an invalid account', - ) + await expectRevert(controllerProxy.operate(actionArgs, {from: holder1}), 'A14') }) it('should redeem after expiry + price is finalized', async () => { @@ -3038,7 +3019,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(redeemArgs, {from: holder1}), 'CO29') + await expectRevert(controllerProxy.operate(redeemArgs, {from: holder1}), 'C29') }) describe('Redeem multiple Otokens', () => { @@ -3299,7 +3280,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO30') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C30') }) it('should revert settling vault before expiry', async () => { @@ -3336,7 +3317,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO31') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C31') }) it('should revert settling an invalid vault', async () => { @@ -3354,7 +3335,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO35') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C35') }) it('should revert settling after expiry when price is not finalized', async () => { @@ -3391,7 +3372,7 @@ contract( assert.equal(await controllerProxy.hasExpired(shortOtoken.address), true, 'Short otoken is not expired yet') - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO29') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C29') }) it('should settle ITM otoken after expiry + price is finalized', async () => { @@ -3768,12 +3749,17 @@ contract( const collateral = await expiredOtoken.collateralAsset() const expiryTimestamp = await expiredOtoken.expiryTimestamp() - const expectedResutl = false + const expectedResult = false assert.equal( - await controllerProxy.isSettlementAllowed(underlying, strike, collateral, expiryTimestamp), - expectedResutl, + await controllerProxy.canSettleAssets(underlying, strike, collateral, expiryTimestamp), + expectedResult, 'Price is not finalized because dispute period is not over yet', ) + assert.equal( + await controllerProxy.isSettlementAllowed(expiredOtoken.address), + expectedResult, + 'Price is not finalized', + ) }) it('should return true when price is finalized', async () => { @@ -3800,10 +3786,15 @@ contract( const collateral = await expiredOtoken.collateralAsset() const expiryTimestamp = await expiredOtoken.expiryTimestamp() - const expectedResutl = true + const expectedResult = true + assert.equal( + await controllerProxy.canSettleAssets(underlying, strike, collateral, expiryTimestamp), + expectedResult, + 'Price is not finalized', + ) assert.equal( - await controllerProxy.isSettlementAllowed(underlying, strike, collateral, expiryTimestamp), - expectedResutl, + await controllerProxy.isSettlementAllowed(expiredOtoken.address), + expectedResult, 'Price is not finalized', ) }) @@ -3879,7 +3870,7 @@ contract( }) it('should revert activating call action restriction when it is already activated', async () => { - await expectRevert(controllerProxy.setCallRestriction(true, {from: owner}), 'CO9') + await expectRevert(controllerProxy.setCallRestriction(true, {from: owner}), 'C9') }) it('should revert calling any arbitrary address when call restriction is activated', async () => { @@ -3898,7 +3889,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO3') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C3') }) it('should call whitelisted callee address when restriction is activated', async () => { @@ -3932,7 +3923,7 @@ contract( }) it('should revert deactivating call action restriction when it is already deactivated', async () => { - await expectRevert(controllerProxy.setCallRestriction(false, {from: owner}), 'CO9') + await expectRevert(controllerProxy.setCallRestriction(false, {from: owner}), 'C9') }) }) @@ -3940,13 +3931,13 @@ contract( it('should update vault latest update timestamp', async () => { const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) const timestampBefore = new BigNumber( - (await controllerProxy.getVault(accountOwner1, vaultCounter.toNumber()))[2], + (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toNumber()))[2], ) await controllerProxy.sync(accountOwner1, vaultCounter.toNumber(), {from: random}) const timestampAfter = new BigNumber( - (await controllerProxy.getVault(accountOwner1, vaultCounter.toNumber()))[2], + (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toNumber()))[2], ) assert.isAbove( timestampAfter.toNumber(), @@ -3956,6 +3947,136 @@ contract( }) }) + describe('Interact with Otoken implementation v1.0.0', () => { + let shortOtokenV1: OtokenImplV1Instance + + before(async () => { + const expiryTime = new BigNumber(60 * 60 * 24) // after 1 day + + shortOtokenV1 = await OtokenImplV1.new() + // init otoken + await shortOtokenV1.init( + addressBook.address, + weth.address, + usdc.address, + usdc.address, + createTokenAmount(200), + new BigNumber(await time.latest()).plus(expiryTime), + true, + ) + // whitelist otoken to be used in the protocol + await whitelist.whitelistOtoken(shortOtokenV1.address, {from: owner}) + // open new vault, mint naked short, sell it to holder 1 + const collateralToDespoit = new BigNumber(await shortOtokenV1.strikePrice()).dividedBy(100) + const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)).plus(1) + const amountToMint = createTokenAmount(1) + const actionArgs = [ + { + actionType: ActionType.OpenVault, + owner: accountOwner1, + secondAddress: accountOwner1, + asset: ZERO_ADDR, + vaultId: vaultCounter.toNumber(), + amount: '0', + index: '0', + data: ZERO_ADDR, + }, + { + actionType: ActionType.DepositCollateral, + owner: accountOwner1, + secondAddress: accountOwner1, + asset: usdc.address, + vaultId: vaultCounter.toNumber(), + amount: collateralToDespoit.toNumber(), + index: '0', + data: ZERO_ADDR, + }, + { + actionType: ActionType.MintShortOption, + owner: accountOwner1, + secondAddress: accountOwner1, + asset: shortOtokenV1.address, + vaultId: vaultCounter.toNumber(), + amount: amountToMint, + index: '0', + data: ZERO_ADDR, + }, + ] + await usdc.approve(marginPool.address, collateralToDespoit, {from: accountOwner1}) + await controllerProxy.operate(actionArgs, {from: accountOwner1}) + + //transfer to holder + await shortOtokenV1.transfer(holder1, amountToMint, {from: accountOwner1}) + }) + + it('should settle v1 Otoken implementation', async () => { + // past time after expiry + await time.increase(60 * 61 * 24) // increase time with one hour in seconds + + const expiry = new BigNumber(await shortOtokenV1.expiryTimestamp()) + await oracle.setExpiryPriceFinalizedAllPeiodOver(weth.address, expiry, createTokenAmount(150), true) + await oracle.setExpiryPriceFinalizedAllPeiodOver(usdc.address, expiry, createTokenAmount(1), true) + const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) + const actionArgs = [ + { + actionType: ActionType.SettleVault, + owner: accountOwner1, + secondAddress: accountOwner1, + asset: shortOtokenV1.address, + vaultId: vaultCounter.toNumber(), + amount: '0', + index: '0', + data: ZERO_ADDR, + }, + ] + + const payout = createTokenAmount(150, usdcDecimals) + const marginPoolBalanceBefore = new BigNumber(await usdc.balanceOf(marginPool.address)) + const senderBalanceBefore = new BigNumber(await usdc.balanceOf(accountOwner1)) + const proceed = await controllerProxy.getProceed(accountOwner1, vaultCounter) + + assert.equal(payout, proceed.toString()) + + await controllerProxy.operate(actionArgs, {from: accountOwner1}) + + const marginPoolBalanceAfter = new BigNumber(await usdc.balanceOf(marginPool.address)) + const senderBalanceAfter = new BigNumber(await usdc.balanceOf(accountOwner1)) + + assert.equal( + marginPoolBalanceBefore.minus(marginPoolBalanceAfter).toString(), + payout.toString(), + 'Margin pool collateral asset balance mismatch', + ) + assert.equal( + senderBalanceAfter.minus(senderBalanceBefore).toString(), + payout.toString(), + 'Sender collateral asset balance mismatch', + ) + }) + + it('should redeem v1 Otoken implementation', async () => { + const redeemArgs = [ + { + actionType: ActionType.Redeem, + owner: ZERO_ADDR, + secondAddress: holder1, + asset: shortOtokenV1.address, + vaultId: '0', + amount: createTokenAmount(1), + index: '0', + data: ZERO_ADDR, + }, + ] + + const expectedPayout = createTokenAmount(50, usdcDecimals) + + const userBalanceBefore = new BigNumber(await usdc.balanceOf(holder1)) + await controllerProxy.operate(redeemArgs, {from: holder1}) + const userBalanceAfter = new BigNumber(await usdc.balanceOf(holder1)) + assert.equal(userBalanceAfter.minus(userBalanceBefore).toString(), expectedPayout) + }) + }) + describe('Pause mechanism', () => { let shortOtoken: MockOtokenInstance @@ -4015,35 +4136,28 @@ contract( await controllerProxy.operate(actionArgs, {from: accountOwner1}) }) - it('should revert set partialPauser address from non-owner', async () => { + it('should revert set pauser address from non-owner', async () => { await expectRevert( controllerProxy.setPartialPauser(partialPauser, {from: random}), 'Ownable: caller is not the owner', ) }) - it('should revert set partialPauser address to address zero', async () => { - await expectRevert(controllerProxy.setPartialPauser(ZERO_ADDR, {from: owner}), 'CO11') - }) - - it('should set partialPauser address', async () => { + it('should set pauser address', async () => { await controllerProxy.setPartialPauser(partialPauser, {from: owner}) - assert.equal(await controllerProxy.partialPauser(), partialPauser, 'partialPauser address mismatch') + assert.equal(await controllerProxy.partialPauser(), partialPauser, 'pauser address mismatch') }) - it('should revert set partialPauser address to the same previous address', async () => { - await expectRevert( - controllerProxy.setPartialPauser(await controllerProxy.partialPauser(), {from: owner}), - 'CO9', - ) + it('should revert set pauser address to the same previous address', async () => { + await expectRevert(controllerProxy.setPartialPauser(partialPauser, {from: owner}), 'C9') }) - it('should revert when pausing the system from address other than partialPauser', async () => { - await expectRevert(controllerProxy.setSystemPartiallyPaused(true, {from: random}), 'CO2') + it('should revert when pausing the system from address other than pauser', async () => { + await expectRevert(controllerProxy.setSystemPartiallyPaused(true, {from: random}), 'C2') }) - it('should revert partially un-pausing an already running paused system', async () => { - await expectRevert(controllerProxy.setSystemPartiallyPaused(false, {from: partialPauser}), 'CO9') + it('should revert partially un-pausing an already running system', async () => { + await expectRevert(controllerProxy.setSystemPartiallyPaused(false, {from: partialPauser}), 'C9') }) it('should pause system', async () => { @@ -4057,7 +4171,7 @@ contract( }) it('should revert partially pausing an already patially paused system', async () => { - await expectRevert(controllerProxy.setSystemPartiallyPaused(true, {from: partialPauser}), 'CO9') + await expectRevert(controllerProxy.setSystemPartiallyPaused(true, {from: partialPauser}), 'C9') }) it('should revert opening a vault when system is partially paused', async () => { @@ -4074,7 +4188,7 @@ contract( data: ZERO_ADDR, }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO4') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C4') }) it('should revert depositing collateral when system is partially paused', async () => { @@ -4093,7 +4207,7 @@ contract( }, ] await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO4') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C4') }) it('should revert minting short otoken when system is partially paused', async () => { @@ -4122,7 +4236,7 @@ contract( }, ] await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO4') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C4') }) it('should revert withdrawing collateral when system is partially paused', async () => { @@ -4140,7 +4254,7 @@ contract( data: ZERO_ADDR, }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO4') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C4') }) it('should revert burning short otoken when system is partially paused', async () => { @@ -4158,7 +4272,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO4') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C4') }) it('should settle vault when system is partially paused', async () => { @@ -4322,24 +4436,20 @@ contract( }) it('should revert set fullPauser address to address zero', async () => { - await expectRevert(controllerProxy.setFullPauser(ZERO_ADDR, {from: owner}), 'CO10') + await expectRevert(controllerProxy.setFullPauser(ZERO_ADDR, {from: owner}), 'C10') }) - it('should set fullPauser address', async () => { + it('should set fullPauser', async () => { await controllerProxy.setFullPauser(fullPauser, {from: owner}) - assert.equal(await controllerProxy.fullPauser(), fullPauser, 'fullPauser address mismatch') - }) - - it('should revert set fullPauser address to the same previous address', async () => { - await expectRevert(controllerProxy.setFullPauser(await controllerProxy.fullPauser(), {from: owner}), 'CO9') + assert.equal(await controllerProxy.fullPauser(), fullPauser, 'Full pauser wrong') }) - it('should revert when triggering full pause from address other than fullPauser', async () => { - await expectRevert(controllerProxy.setSystemFullyPaused(true, {from: random}), 'CO1') + it('should revert when triggering full pause from address other than pauser', async () => { + await expectRevert(controllerProxy.setSystemFullyPaused(true, {from: random}), 'C1') }) it('should revert fully un-pausing an already running system', async () => { - await expectRevert(controllerProxy.setSystemFullyPaused(false, {from: fullPauser}), 'CO9') + await expectRevert(controllerProxy.setSystemFullyPaused(false, {from: fullPauser}), 'C9') }) it('should trigger full pause', async () => { @@ -4353,7 +4463,7 @@ contract( }) it('should revert fully pausing an already fully paused system', async () => { - await expectRevert(controllerProxy.setSystemFullyPaused(true, {from: fullPauser}), 'CO9') + await expectRevert(controllerProxy.setSystemFullyPaused(true, {from: fullPauser}), 'C9') }) it('should revert opening a vault when system is in full pause state', async () => { @@ -4389,7 +4499,7 @@ contract( }, ] await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO5') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C5') }) it('should revert minting short otoken when system is in full pause state', async () => { @@ -4418,7 +4528,7 @@ contract( }, ] await usdc.approve(marginPool.address, collateralToDeposit, {from: accountOwner1}) - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO5') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C5') }) it('should revert withdrawing collateral when system is in full pause state', async () => { @@ -4436,7 +4546,7 @@ contract( data: ZERO_ADDR, }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO5') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C5') }) it('should revert burning short otoken when system is in full pause state', async () => { @@ -4454,7 +4564,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO5') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C5') }) it('should revert settling vault when system is in full pause state', async () => { @@ -4492,7 +4602,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO5') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C5') }) it('should revert redeem when system is in full pause state', async () => { @@ -4513,7 +4623,7 @@ contract( }, ] - await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'CO5') + await expectRevert(controllerProxy.operate(actionArgs, {from: accountOwner1}), 'C5') }) }) diff --git a/test/unit-tests/controllerNakedMargin.test.ts b/test/unit-tests/controllerNakedMargin.test.ts index 073e9c9f9..d7b18e9fb 100644 --- a/test/unit-tests/controllerNakedMargin.test.ts +++ b/test/unit-tests/controllerNakedMargin.test.ts @@ -255,7 +255,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] it('should revert settling an expired undercollateralized naked margin vault', async () => { const vaultCounter = new BigNumber(await controllerProxy.getAccountVaultCounter(accountOwner1)) - // settle the secont vault (with only long otoken in it) + // settle the second vault (with only long otoken in it) const settleArgs = [ { actionType: ActionType.SettleVault, @@ -269,7 +269,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] }, ] - await expectRevert(controllerProxy.operate(settleArgs, {from: accountOwner1}), 'CO32') + await expectRevert(controllerProxy.operate(settleArgs, {from: accountOwner1}), 'C32') }) }) @@ -365,7 +365,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] ) const latestVaultUpdateTimestamp = new BigNumber( - (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[2], + (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()))[2], ) assert.equal( @@ -397,7 +397,9 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] assert.equal(isLiquidatable[0], true, 'Vault liquidation state mismatch') assert.isTrue(new BigNumber(isLiquidatable[1]).isGreaterThan(0), 'Liquidation price is equal to zero') - const vaultBeforeLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultBeforeLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] const liquidateArgs = [ { @@ -418,7 +420,9 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] await controllerProxy.operate(liquidateArgs, {from: liquidator}) const liquidatorCollateralBalanceAfter = new BigNumber(await usdc.balanceOf(liquidator)) - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultAfterLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] const nakedMarginPoolAfter = new BigNumber(await controllerProxy.getNakedPoolBalance(usdc.address)) assert.equal( @@ -449,7 +453,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] }) it('should be able to withdraw remaining collateral', async () => { - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfterLiquidation = (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter))[0] const withdrawArgs = [ { @@ -577,7 +581,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] ) const latestVaultUpdateTimestamp = new BigNumber( - (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[2], + (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()))[2], ) assert.equal( @@ -609,7 +613,9 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] assert.equal(isLiquidatable[0], true, 'Vault liquidation state mismatch') assert.isTrue(new BigNumber(isLiquidatable[1]).isGreaterThan(0), 'Liquidation price is equal to zero') - const vaultBeforeLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultBeforeLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] const liquidateArgs = [ { @@ -630,7 +636,9 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] await controllerProxy.operate(liquidateArgs, {from: liquidator}) const liquidatorCollateralBalanceAfter = new BigNumber(await weth.balanceOf(liquidator)) - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultAfterLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] const nakedMarginPoolAfter = new BigNumber(await controllerProxy.getNakedPoolBalance(weth.address)) assert.equal( @@ -661,7 +669,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] }) it('should be able to withdraw remaining collateral', async () => { - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfterLiquidation = (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter))[0] const withdrawArgs = [ { @@ -780,7 +788,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] await controllerProxy.operate(mintArgs, {from: accountOwner1}) const latestVaultUpdateTimestamp = new BigNumber( - (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[2], + (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()))[2], ) assert.equal( @@ -813,7 +821,9 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] assert.equal(isLiquidatable[0], true, 'Vault liquidation state mismatch') assert.isTrue(new BigNumber(isLiquidatable[1]).isGreaterThan(0), 'Liquidation price is equal to zero') - const vaultBeforeLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultBeforeLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] const liquidateArgs = [ { @@ -833,7 +843,9 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] await controllerProxy.operate(liquidateArgs, {from: liquidator}) const liquidatorCollateralBalanceAfter = new BigNumber(await usdc.balanceOf(liquidator)) - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter.toString()))[0] + const vaultAfterLiquidation = ( + await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter.toString()) + )[0] assert.equal( vaultAfterLiquidation.shortAmounts[0].toString(), @@ -890,11 +902,11 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] }, ] - await expectRevert(controllerProxy.operate(liquidateArgs, {from: liquidator}), 'CO33') + await expectRevert(controllerProxy.operate(liquidateArgs, {from: liquidator}), 'C33') }) it('should be able to remove excess collateral after partially liquidating', async () => { - const vaultAfterLiquidation = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfterLiquidation = (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter))[0] const requiredVaultMargin = await calculator.getNakedMarginRequired( weth.address, @@ -959,7 +971,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] it('should revert setting collateral cap amount equal to zero', async () => { const wethCap = scaleNum(0, wethDecimals) - await expectRevert(controllerProxy.setNakedCap(weth.address, wethCap, {from: owner}), 'CO36') + await expectRevert(controllerProxy.setNakedCap(weth.address, wethCap, {from: owner}), 'C36') }) it('should revert depositing collateral in vault that that hit naked cap', async () => { @@ -990,7 +1002,7 @@ contract('Controller: naked margin', ([owner, accountOwner1, liquidator, random] }, ] await usdc.approve(marginPool.address, capAmount.toString(), {from: accountOwner1}) - await expectRevert(controllerProxy.operate(mintArgs, {from: accountOwner1}), 'CO37') + await expectRevert(controllerProxy.operate(mintArgs, {from: accountOwner1}), 'C37') }) }) }) diff --git a/test/unit-tests/marginVault.test.ts b/test/unit-tests/marginVault.test.ts index 4b87b3fc7..c293d5317 100644 --- a/test/unit-tests/marginVault.test.ts +++ b/test/unit-tests/marginVault.test.ts @@ -57,11 +57,7 @@ contract('MarginVault', ([deployer, controller]) => { describe('Add short', async () => { it('should revert if trying to add short otoken with index greater than short otoken array length', async () => { const vaultCounter = new BigNumber(0) - - await expectRevert( - marginVaultTester.testAddShort(vaultCounter, otoken.address, 10, 4), - 'MarginVault: invalid short otoken index', - ) + await expectRevert(marginVaultTester.testAddShort(vaultCounter, otoken.address, 10, 4), 'V2') }) it('should add short otokens', async () => { @@ -75,10 +71,7 @@ contract('MarginVault', ([deployer, controller]) => { it('should revert when adding 0 short', async () => { const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testAddShort(vaultCounter, otoken.address, 0, 0), - 'MarginVault: invalid short otoken amount', - ) + await expectRevert(marginVaultTester.testAddShort(vaultCounter, otoken.address, 0, 0), 'V1') }) it('should add a different short otokens to a different index', async () => { @@ -100,10 +93,7 @@ contract('MarginVault', ([deployer, controller]) => { it('should revert if trying to add wrong short otoken to an index', async () => { const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testAddShort(vaultCounter, otoken.address, 10, 1), - 'MarginVault: short otoken address mismatch', - ) + await expectRevert(marginVaultTester.testAddShort(vaultCounter, otoken.address, 10, 1), 'V3') }) }) @@ -144,10 +134,7 @@ contract('MarginVault', ([deployer, controller]) => { it('should revert when trying to remove wrong short otoken from an index', async () => { const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testRemoveShort(vaultCounter, otoken2.address, 1, 0), - 'MarginVault: short otoken address mismatch', - ) + await expectRevert(marginVaultTester.testRemoveShort(vaultCounter, otoken2.address, 1, 0), 'V3') }) it('should be able to add different short in the index of the old short otoken without increase short array length', async () => { @@ -169,10 +156,7 @@ contract('MarginVault', ([deployer, controller]) => { it('should revert if trying to add long otoken with index greater than long otoken array length', async () => { const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testAddLong(vaultCounter, otoken.address, 10, 4), - 'MarginVault: invalid long otoken index', - ) + await expectRevert(marginVaultTester.testAddLong(vaultCounter, otoken.address, 10, 4), 'V5') }) it('should add long otokens', async () => { @@ -210,10 +194,7 @@ contract('MarginVault', ([deployer, controller]) => { const amount = 10 const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testAddLong(vaultCounter, otoken.address, amount, index), - 'MarginVault: long otoken address mismatch', - ) + await expectRevert(marginVaultTester.testAddLong(vaultCounter, otoken.address, amount, index), 'V6') }) }) @@ -254,10 +235,7 @@ contract('MarginVault', ([deployer, controller]) => { it('should revert when trying to remove wrong long otoken from an index', async () => { const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testRemoveLong(vaultCounter, otoken2.address, 1, 0), - 'MarginVault: long otoken address mismatch', - ) + await expectRevert(marginVaultTester.testRemoveLong(vaultCounter, otoken2.address, 1, 0), 'V6') }) it('should be able to add different long in the index of the old long otoken without increase long array length', async () => { @@ -275,10 +253,7 @@ contract('MarginVault', ([deployer, controller]) => { it('should revert if trying to add collateral asset with index greater than collateral asset array length', async () => { const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testAddCollateral(vaultCounter, weth.address, 10, 4), - 'MarginVault: invalid collateral token index', - ) + await expectRevert(marginVaultTester.testAddCollateral(vaultCounter, weth.address, 10, 4), 'V8') }) it('should add weth collateral', async () => { @@ -323,10 +298,7 @@ contract('MarginVault', ([deployer, controller]) => { const index = 0 const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testAddCollateral(vaultCounter, usdc.address, changeAmt, index), - 'MarginVault: collateral token address mismatch', - ) + await expectRevert(marginVaultTester.testAddCollateral(vaultCounter, usdc.address, changeAmt, index), 'V9') }) it('should add some more usdc collateral', async () => { @@ -351,10 +323,7 @@ contract('MarginVault', ([deployer, controller]) => { const index = 1 const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testAddCollateral(vaultCounter, otoken.address, changeAmt, index), - 'MarginVault: collateral token address mismatch', - ) + await expectRevert(marginVaultTester.testAddCollateral(vaultCounter, otoken.address, changeAmt, index), 'V9') }) }) @@ -399,10 +368,7 @@ contract('MarginVault', ([deployer, controller]) => { it('should revert when trying to remove wrong collateral asset from an index', async () => { const vaultCounter = new BigNumber(0) - await expectRevert( - marginVaultTester.testRemoveCollateral(vaultCounter, weth.address, 1, 0), - 'MarginVault: collateral token address mismatch', - ) + await expectRevert(marginVaultTester.testRemoveCollateral(vaultCounter, weth.address, 1, 0), 'V9') }) it('should be able to add different collateral asset in the index of the old collateral asset without increase collateral array length', async () => { diff --git a/test/unit-tests/payableProxyController.test.ts b/test/unit-tests/payableProxyController.test.ts index 5813600c3..c7eb3a610 100644 --- a/test/unit-tests/payableProxyController.test.ts +++ b/test/unit-tests/payableProxyController.test.ts @@ -160,7 +160,7 @@ contract('PayableProxyController', ([owner, accountOwner1, holder1, random]) => }) const marginPoolBalanceAfter = new BigNumber(await weth.balanceOf(marginPool.address)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter))[0] assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(), @@ -216,7 +216,7 @@ contract('PayableProxyController', ([owner, accountOwner1, holder1, random]) => }) const marginPoolBalanceAfter = new BigNumber(await weth.balanceOf(marginPool.address)) - const vaultAfter = (await controllerProxy.getVault(accountOwner1, vaultCounter))[0] + const vaultAfter = (await controllerProxy.getVaultWithDetails(accountOwner1, vaultCounter))[0] assert.equal( marginPoolBalanceAfter.minus(marginPoolBalanceBefore).toString(),