From c034e007d8e7295331b45fdd7b7825fce9efea6d Mon Sep 17 00:00:00 2001 From: asardon Date: Fri, 24 Jan 2025 18:06:36 +0100 Subject: [PATCH] update to match current EP struct pattern; update method calls to use {name: arg,...} pattern --- contracts/enzyme-adapter/IMysoPosition.sol | 19 ++ contracts/enzyme-adapter/MysoPositionLib.sol | 233 ++++++++++-------- .../enzyme-adapter/MysoPositionParser.sol | 82 +++--- test/enzyme-adapter/Test.ts | 118 ++++----- 4 files changed, 257 insertions(+), 195 deletions(-) diff --git a/contracts/enzyme-adapter/IMysoPosition.sol b/contracts/enzyme-adapter/IMysoPosition.sol index 381d7d3..c5c6ad0 100644 --- a/contracts/enzyme-adapter/IMysoPosition.sol +++ b/contracts/enzyme-adapter/IMysoPosition.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.24; import {IExternalPosition} from "./IExternalPosition.sol"; +import {DataTypes} from "../DataTypes.sol"; interface IMysoPosition is IExternalPosition { event EscrowCreated( @@ -28,4 +29,22 @@ interface IMysoPosition is IExternalPosition { CloseAndSweepEscrow, WithdrawStuckTokens } + + struct CreateEscrowByTakingQuoteActionArgs { + DataTypes.RFQInitialization rfqInitialization; + } + + struct CreateEscrowByStartingAuctionActionArgs { + DataTypes.AuctionInitialization auctionInitialization; + } + + struct CloseAndSweepEscrowActionArgs { + address[] escrows; + } + + struct WithdrawStuckTokensActionArgs { + address[] escrows; + address[] tokens; + uint256[] amounts; + } } diff --git a/contracts/enzyme-adapter/MysoPositionLib.sol b/contracts/enzyme-adapter/MysoPositionLib.sol index 1b545f2..3411fb5 100644 --- a/contracts/enzyme-adapter/MysoPositionLib.sol +++ b/contracts/enzyme-adapter/MysoPositionLib.sol @@ -69,13 +69,33 @@ contract MysoPositionLib is IMysoPosition { ); if (actionId == uint256(Actions.CreateEscrowByTakingQuote)) { - __createEscrowByTakingQuote(actionArgs); + __createEscrowByTakingQuote({ + actionArgs: abi.decode( + actionArgs, + (CreateEscrowByTakingQuoteActionArgs) + ) + }); } else if (actionId == uint256(Actions.CreateEscrowByStartingAuction)) { - __createEscrowByStartingAuction(actionArgs); + __createEscrowByStartingAuction({ + actionArgs: abi.decode( + actionArgs, + (CreateEscrowByStartingAuctionActionArgs) + ) + }); } else if (actionId == uint256(Actions.CloseAndSweepEscrow)) { - __closeAndSweepEscrows(actionArgs); + __closeAndSweepEscrows({ + actionArgs: abi.decode( + actionArgs, + (CloseAndSweepEscrowActionArgs) + ) + }); } else if (actionId == uint256(Actions.WithdrawStuckTokens)) { - __withdrawStuckTokens(actionArgs); + __withdrawStuckTokens({ + actionArgs: abi.decode( + actionArgs, + (WithdrawStuckTokensActionArgs) + ) + }); } else { revert("receiveCallFromVault: Invalid actionId"); } @@ -83,65 +103,68 @@ contract MysoPositionLib is IMysoPosition { /// @notice Creates an escrow by taking a quote and writing an option /// @param actionArgs Encoded arguments containing RFQ initialization data - function __createEscrowByTakingQuote(bytes memory actionArgs) private { - DataTypes.RFQInitialization memory rfqInitialization = abi.decode( - actionArgs, - (DataTypes.RFQInitialization) - ); - + function __createEscrowByTakingQuote( + CreateEscrowByTakingQuoteActionArgs memory actionArgs + ) private { // @dev: approve router to pull notional amount from this contract // note: given notional amount is assumed to have been sent prior to this call - IERC20Metadata(rfqInitialization.optionInfo.underlyingToken).approve( - MYSO_ROUTER, - rfqInitialization.optionInfo.notional - ); + IERC20Metadata(actionArgs.rfqInitialization.optionInfo.underlyingToken) + .approve({ + spender: MYSO_ROUTER, + value: actionArgs.rfqInitialization.optionInfo.notional + }); // @dev: set External Position (EP) as escrow owner - IRouter(MYSO_ROUTER).takeQuote( - address(this), - rfqInitialization, - address(0) - ); + IRouter(MYSO_ROUTER).takeQuote({ + escrowOwner: address(this), + rfqInitialization: actionArgs.rfqInitialization, + distPartner: address(0) + }); // @dev: keep track of escrows and number of open/unsettled escrows - _addLatestEscrow( - rfqInitialization.optionInfo.underlyingToken, - rfqInitialization.optionInfo.notional, - false - ); + _addLatestEscrow({ + underlyingToken: actionArgs + .rfqInitialization + .optionInfo + .underlyingToken, + underlyingAmount: actionArgs.rfqInitialization.optionInfo.notional, + isAuction: false + }); } /// @notice Creates a escrow by starting new auction to write an option /// @param actionArgs Encoded arguments containing auction initialization data - function __createEscrowByStartingAuction(bytes memory actionArgs) private { - DataTypes.AuctionInitialization memory auctionInitialization = abi - .decode(actionArgs, (DataTypes.AuctionInitialization)); - + function __createEscrowByStartingAuction( + CreateEscrowByStartingAuctionActionArgs memory actionArgs + ) private { // @dev: approve router to pull notional amount from this contract // note: given notional amount is assumed to have been sent prior to this call - IERC20Metadata(auctionInitialization.underlyingToken).approve( - MYSO_ROUTER, - auctionInitialization.notional - ); + IERC20Metadata(actionArgs.auctionInitialization.underlyingToken) + .approve({ + spender: MYSO_ROUTER, + value: actionArgs.auctionInitialization.notional + }); // @dev: set External Position (EP) as escrow owner - IRouter(MYSO_ROUTER).createAuction( - address(this), - auctionInitialization, - address(0) - ); + IRouter(MYSO_ROUTER).createAuction({ + escrowOwner: address(this), + auctionInitialization: actionArgs.auctionInitialization, + distPartner: address(0) + }); // @dev: keep track of escrows and number of open/unsettled escrows - _addLatestEscrow( - auctionInitialization.underlyingToken, - auctionInitialization.notional, - true - ); + _addLatestEscrow({ + underlyingToken: actionArgs.auctionInitialization.underlyingToken, + underlyingAmount: actionArgs.auctionInitialization.notional, + isAuction: true + }); } /// @notice Close open escrows and sweeps any related balances /// @param actionArgs Encoded arguments containing escrows to close and sweep - function __closeAndSweepEscrows(bytes memory actionArgs) private { + function __closeAndSweepEscrows( + CloseAndSweepEscrowActionArgs memory actionArgs + ) private { // @dev: vault manager needs to close escrows individually // note: high level there are three cases to consider: // a) cancel auction: vault manager cancels auction before any match @@ -162,13 +185,11 @@ contract MysoPositionLib is IMysoPosition { // c.iii) borrow without repay: trading firm borrowed (part of) underlying but // didn't repay before expiry - address[] memory escrows = abi.decode(actionArgs, (address[])); - require( - escrows.length > 0, + actionArgs.escrows.length > 0, "__closeAndSweepEscrows: Input array must not be empty" ); - for (uint256 i = 0; i < escrows.length; i++) { + for (uint256 i = 0; i < actionArgs.escrows.length; i++) { // @dev: retrieve relevant token addresses for sweeping ( address underlyingToken, @@ -178,40 +199,41 @@ contract MysoPositionLib is IMysoPosition { , , - ) = Escrow(escrows[i]).optionInfo(); + ) = Escrow(actionArgs.escrows[i]).optionInfo(); uint256 underlyingTokenBalance = IERC20Metadata(underlyingToken) - .balanceOf(escrows[i]); + .balanceOf({account: actionArgs.escrows[i]}); // check case a) - unmatched auction (option not minted yet) - bool isOptionMinted = Escrow(escrows[i]).optionMinted(); + bool isOptionMinted = Escrow(actionArgs.escrows[i]).optionMinted(); if (!isOptionMinted) { // mark as settled and sweep underlying tokens; // settlement tokens can be skipped - _markAsClosedAndSweepEscrow( - escrows[i], - underlyingToken, - underlyingTokenBalance, - settlementToken, - 0 - ); + _markAsClosedAndSweepEscrow({ + escrow: actionArgs.escrows[i], + underlyingToken: underlyingToken, + underlyingTokenBalance: underlyingTokenBalance, + settlementToken: settlementToken, + settlementTokenBalance: 0 + }); continue; } // check case b) - full exercise iff: // option token supply == 0 and total borrows == 0 - uint256 optionTokenSupply = IERC20Metadata(escrows[i]) + uint256 optionTokenSupply = IERC20Metadata(actionArgs.escrows[i]) .totalSupply(); - uint256 totalBorrowed = Escrow(escrows[i]).totalBorrowed(); + uint256 totalBorrowed = Escrow(actionArgs.escrows[i]) + .totalBorrowed(); if (optionTokenSupply == 0 && totalBorrowed == 0) { // mark as settled; no sweeping needed as conversion amount // must've been sent to escrow.owner / vault manager already - _markAsClosedAndSweepEscrow( - escrows[i], - underlyingToken, - 0, - settlementToken, - 0 - ); + _markAsClosedAndSweepEscrow({ + escrow: actionArgs.escrows[i], + underlyingToken: underlyingToken, + underlyingTokenBalance: 0, + settlementToken: settlementToken, + settlementTokenBalance: 0 + }); continue; } @@ -219,47 +241,48 @@ contract MysoPositionLib is IMysoPosition { // need to check if option already expired; otherwise revert as // we cannot withdraw yet uint256 settlementTokenBalance = IERC20Metadata(settlementToken) - .balanceOf(escrows[i]); + .balanceOf(actionArgs.escrows[i]); require( block.timestamp > expiry, "__closeAndSweepEscrow: Option hasn't expired yet" ); - _markAsClosedAndSweepEscrow( - escrows[i], - underlyingToken, - underlyingTokenBalance, - settlementToken, - settlementTokenBalance - ); + _markAsClosedAndSweepEscrow({ + escrow: actionArgs.escrows[i], + underlyingToken: underlyingToken, + underlyingTokenBalance: underlyingTokenBalance, + settlementToken: settlementToken, + settlementTokenBalance: settlementTokenBalance + }); } } /// @notice Withdraws potentially stuck tokens from escrows /// @param actionArgs Encoded arguments containing escrow addresses, token addresses, and amounts - function __withdrawStuckTokens(bytes memory actionArgs) private { + function __withdrawStuckTokens( + WithdrawStuckTokensActionArgs memory actionArgs + ) private { // @dev: allow vault manager to withdraw generic coins if needed // note: generic withdrawing will not mark given escrows as closed, // in which case getManagedAssets() will continue to fail if given // escrows are not explicitly closed via __closeAndSweepEscrow() - ( - address[] memory escrows, - address[] memory tokens, - uint256[] memory amounts - ) = abi.decode(actionArgs, (address[], address[], uint256[])); - require( - escrows.length == tokens.length && tokens.length == amounts.length, + actionArgs.escrows.length == actionArgs.tokens.length && + actionArgs.tokens.length == actionArgs.amounts.length, "__withdraw: Input arrays must have the same length" ); - for (uint256 i = 0; i < escrows.length; i++) { - IRouter(MYSO_ROUTER).withdraw( - escrows[i], - msg.sender, - tokens[i], - amounts[i] + for (uint256 i = 0; i < actionArgs.escrows.length; i++) { + IRouter(MYSO_ROUTER).withdraw({ + escrow: actionArgs.escrows[i], + to: msg.sender, + token: actionArgs.tokens[i], + amount: actionArgs.amounts[i] + }); + emit WithdrawFromEscrow( + actionArgs.escrows[i], + actionArgs.tokens[i], + actionArgs.amounts[i] ); - emit WithdrawFromEscrow(escrows[i], tokens[i], amounts[i]); } } @@ -352,10 +375,10 @@ contract MysoPositionLib is IMysoPosition { // @dev: increment number of open escrows _numOpenEscrows += 1; // get latest escrow and push to internal list - address[] memory newEscrowAddr = IRouter(MYSO_ROUTER).getEscrows( - numEscrows - 1, - 1 - ); + address[] memory newEscrowAddr = IRouter(MYSO_ROUTER).getEscrows({ + from: numEscrows - 1, + numElements: 1 + }); _escrows.push(newEscrowAddr[0]); emit EscrowCreated( @@ -385,22 +408,22 @@ contract MysoPositionLib is IMysoPosition { // sweep any underlying token balances if (underlyingTokenBalance > 0) { - IRouter(MYSO_ROUTER).withdraw( - escrow, - msg.sender, - underlyingToken, - underlyingTokenBalance - ); + IRouter(MYSO_ROUTER).withdraw({ + escrow: escrow, + to: msg.sender, + token: underlyingToken, + amount: underlyingTokenBalance + }); } // sweep any settlement token balances if (settlementTokenBalance > 0) { - IRouter(MYSO_ROUTER).withdraw( - escrow, - msg.sender, - settlementToken, - settlementTokenBalance - ); + IRouter(MYSO_ROUTER).withdraw({ + escrow: escrow, + to: msg.sender, + token: settlementToken, + amount: settlementTokenBalance + }); } emit EscrowClosedAndSweeped( escrow, diff --git a/contracts/enzyme-adapter/MysoPositionParser.sol b/contracts/enzyme-adapter/MysoPositionParser.sol index 772e856..af683b4 100644 --- a/contracts/enzyme-adapter/MysoPositionParser.sol +++ b/contracts/enzyme-adapter/MysoPositionParser.sol @@ -39,9 +39,15 @@ contract MysoPositionParser is IExternalPositionParser { _actionId == uint256(IMysoPosition.Actions.CreateEscrowByTakingQuote) ) { - (assetsToSend_, amountsToSend_) = __decodeCreateEscrowByTakingQuote( - _encodedActionArgs - ); + ( + assetsToSend_, + amountsToSend_ + ) = __decodeCreateEscrowByTakingQuote({ + _actionArgs: abi.decode( + _encodedActionArgs, + (IMysoPosition.CreateEscrowByTakingQuoteActionArgs) + ) + }); } else if ( _actionId == uint256(IMysoPosition.Actions.CreateEscrowByStartingAuction) @@ -49,15 +55,30 @@ contract MysoPositionParser is IExternalPositionParser { ( assetsToSend_, amountsToSend_ - ) = __decodeCreateEscrowByStartingAuction(_encodedActionArgs); + ) = __decodeCreateEscrowByStartingAuction({ + _actionArgs: abi.decode( + _encodedActionArgs, + (IMysoPosition.CreateEscrowByStartingAuctionActionArgs) + ) + }); } else if ( _actionId == uint256(IMysoPosition.Actions.CloseAndSweepEscrow) ) { - assetsToReceive_ = __decodeCloseAndSweepEscrows(_encodedActionArgs); + assetsToReceive_ = __decodeCloseAndSweepEscrows({ + _actionArgs: abi.decode( + _encodedActionArgs, + (IMysoPosition.CloseAndSweepEscrowActionArgs) + ) + }); } else if ( _actionId == uint256(IMysoPosition.Actions.WithdrawStuckTokens) ) { - assetsToReceive_ = __decodeWithdrawStuckTokens(_encodedActionArgs); + assetsToReceive_ = __decodeWithdrawStuckTokens({ + _actionArgs: abi.decode( + _encodedActionArgs, + (IMysoPosition.WithdrawStuckTokensActionArgs) + ) + }); } else { revert("parseAssetsForAction: Invalid actionId"); } @@ -72,11 +93,9 @@ contract MysoPositionParser is IExternalPositionParser { ) external override returns (bytes memory) {} function __decodeCloseAndSweepEscrows( - bytes memory _actionArgs + IMysoPosition.CloseAndSweepEscrowActionArgs memory _actionArgs ) internal view returns (address[] memory assetsToReceive_) { - address[] memory escrows = abi.decode(_actionArgs, (address[])); - - for (uint256 i = 0; i < escrows.length; i++) { + for (uint256 i = 0; i < _actionArgs.escrows.length; i++) { // @dev: retrieve relevant token addresses for sweeping ( address underlyingToken, @@ -86,59 +105,52 @@ contract MysoPositionParser is IExternalPositionParser { , , - ) = Escrow(escrows[i]).optionInfo(); + ) = Escrow(_actionArgs.escrows[i]).optionInfo(); // @dev: ensure uniqueness using AddressArrayLib - assetsToReceive_ = assetsToReceive_.addUniqueItem(underlyingToken); - assetsToReceive_ = assetsToReceive_.addUniqueItem(settlementToken); + assetsToReceive_ = assetsToReceive_.addUniqueItem({ + _itemToAdd: underlyingToken + }); + assetsToReceive_ = assetsToReceive_.addUniqueItem({ + _itemToAdd: settlementToken + }); } return assetsToReceive_; } function __decodeCreateEscrowByTakingQuote( - bytes memory _actionArgs + IMysoPosition.CreateEscrowByTakingQuoteActionArgs memory _actionArgs ) internal pure returns (address[] memory, uint256[] memory) { address[] memory assets_ = new address[](1); uint256[] memory amounts_ = new uint256[](1); - DataTypes.AuctionInitialization memory auctionInitialization = abi - .decode(_actionArgs, (DataTypes.AuctionInitialization)); - // @dev: asset to be sent is the underlying token and amount // the given notional - assets_[0] = auctionInitialization.underlyingToken; - amounts_[0] = auctionInitialization.notional; + assets_[0] = _actionArgs.rfqInitialization.optionInfo.underlyingToken; + amounts_[0] = _actionArgs.rfqInitialization.optionInfo.notional; return (assets_, amounts_); } function __decodeCreateEscrowByStartingAuction( - bytes memory _actionArgs + IMysoPosition.CreateEscrowByStartingAuctionActionArgs memory _actionArgs ) internal pure returns (address[] memory, uint256[] memory) { address[] memory assets_ = new address[](1); uint256[] memory amounts_ = new uint256[](1); - DataTypes.RFQInitialization memory rfqInitialization = abi.decode( - _actionArgs, - (DataTypes.RFQInitialization) - ); - // @dev: asset to be sent is the underlying token and amount // the given notional - assets_[0] = rfqInitialization.optionInfo.underlyingToken; - amounts_[0] = rfqInitialization.optionInfo.notional; + assets_[0] = _actionArgs.auctionInitialization.underlyingToken; + amounts_[0] = _actionArgs.auctionInitialization.notional; return (assets_, amounts_); } function __decodeWithdrawStuckTokens( - bytes memory _actionArgs + IMysoPosition.WithdrawStuckTokensActionArgs memory _actionArgs ) internal pure returns (address[] memory assetsToReceive_) { - (, address[] memory tokens, ) = abi.decode( - _actionArgs, - (address[], address[], uint256[]) - ); - - for (uint256 i = 0; i < tokens.length; i++) { + for (uint256 i = 0; i < _actionArgs.tokens.length; i++) { // @dev: retrieve unique assets - assetsToReceive_ = assetsToReceive_.addUniqueItem(tokens[i]); + assetsToReceive_ = assetsToReceive_.addUniqueItem({ + _itemToAdd: _actionArgs.tokens[i] + }); } } } diff --git a/test/enzyme-adapter/Test.ts b/test/enzyme-adapter/Test.ts index 0d360f4..a072fdc 100644 --- a/test/enzyme-adapter/Test.ts +++ b/test/enzyme-adapter/Test.ts @@ -29,33 +29,37 @@ export function encodeRFQInitialization( // Define the ABI structure for the RFQInitialization struct const rfqAbi = [ - "tuple((address,uint48,address,uint48,uint128,uint128,(uint64,address,bool,bool,address)),(uint128,uint256,bytes,address))", + "tuple(((address,uint48,address,uint48,uint128,uint128,(uint64,address,bool,bool,address)),(uint128,uint256,bytes,address)))", ]; // Encode the struct values const encodedRfqInitialization = abiCoder.encode(rfqAbi, [ [ [ - rfqInitialization.optionInfo.underlyingToken, - rfqInitialization.optionInfo.expiry, - rfqInitialization.optionInfo.settlementToken, - rfqInitialization.optionInfo.earliestExercise, - rfqInitialization.optionInfo.notional, - rfqInitialization.optionInfo.strike, [ - rfqInitialization.optionInfo.advancedSettings.borrowCap, - rfqInitialization.optionInfo.advancedSettings.oracle, - rfqInitialization.optionInfo.advancedSettings - .premiumTokenIsUnderlying, - rfqInitialization.optionInfo.advancedSettings.votingDelegationAllowed, - rfqInitialization.optionInfo.advancedSettings.allowedDelegateRegistry, + rfqInitialization.optionInfo.underlyingToken, + rfqInitialization.optionInfo.expiry, + rfqInitialization.optionInfo.settlementToken, + rfqInitialization.optionInfo.earliestExercise, + rfqInitialization.optionInfo.notional, + rfqInitialization.optionInfo.strike, + [ + rfqInitialization.optionInfo.advancedSettings.borrowCap, + rfqInitialization.optionInfo.advancedSettings.oracle, + rfqInitialization.optionInfo.advancedSettings + .premiumTokenIsUnderlying, + rfqInitialization.optionInfo.advancedSettings + .votingDelegationAllowed, + rfqInitialization.optionInfo.advancedSettings + .allowedDelegateRegistry, + ], + ], + [ + rfqInitialization.rfqQuote.premium, + rfqInitialization.rfqQuote.validUntil, + rfqInitialization.rfqQuote.signature, + rfqInitialization.rfqQuote.eip1271Maker, ], - ], - [ - rfqInitialization.rfqQuote.premium, - rfqInitialization.rfqQuote.validUntil, - rfqInitialization.rfqQuote.signature, - rfqInitialization.rfqQuote.eip1271Maker, ], ], ]); @@ -115,30 +119,32 @@ describe("Router Contract", function () { const abiCoder = new ethers.AbiCoder(); const actionArgs = abiCoder.encode( [ - "tuple(address,address,uint256,(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,address,bool,bool,address))", + "tuple((address,address,uint256,(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,address,bool,bool,address)))", ], [ [ - auctionInitialization.underlyingToken, - auctionInitialization.settlementToken, - auctionInitialization.notional, - [ - auctionInitialization.auctionParams.relStrike, - auctionInitialization.auctionParams.tenor, - auctionInitialization.auctionParams.earliestExerciseTenor, - auctionInitialization.auctionParams.decayStartTime, - auctionInitialization.auctionParams.decayDuration, - auctionInitialization.auctionParams.relPremiumStart, - auctionInitialization.auctionParams.relPremiumFloor, - auctionInitialization.auctionParams.minSpot, - auctionInitialization.auctionParams.maxSpot, - ], [ - auctionInitialization.advancedSettings.borrowCap, - auctionInitialization.advancedSettings.oracle, - auctionInitialization.advancedSettings.premiumTokenIsUnderlying, - auctionInitialization.advancedSettings.votingDelegationAllowed, - auctionInitialization.advancedSettings.allowedDelegateRegistry, + auctionInitialization.underlyingToken, + auctionInitialization.settlementToken, + auctionInitialization.notional, + [ + auctionInitialization.auctionParams.relStrike, + auctionInitialization.auctionParams.tenor, + auctionInitialization.auctionParams.earliestExerciseTenor, + auctionInitialization.auctionParams.decayStartTime, + auctionInitialization.auctionParams.decayDuration, + auctionInitialization.auctionParams.relPremiumStart, + auctionInitialization.auctionParams.relPremiumFloor, + auctionInitialization.auctionParams.minSpot, + auctionInitialization.auctionParams.maxSpot, + ], + [ + auctionInitialization.advancedSettings.borrowCap, + auctionInitialization.advancedSettings.oracle, + auctionInitialization.advancedSettings.premiumTokenIsUnderlying, + auctionInitialization.advancedSettings.votingDelegationAllowed, + auctionInitialization.advancedSettings.allowedDelegateRegistry, + ], ], ], ] @@ -179,11 +185,13 @@ describe("Router Contract", function () { // Prepare withdraw action arguments const withdrawActionArgs = abiCoder.encode( - ["address[]", "address[]", "uint256[]"], + ["tuple(address[],address[],uint256[])"], [ - [escrows[0]], // Escrow address - [underlyingToken.target], // Token address - [auctionInitialization.notional], // Withdrawal amount + [ + [escrows[0]], // Escrow address + [underlyingToken.target], // Token address + [auctionInitialization.notional], // Withdrawal amount + ], ] ); @@ -213,8 +221,8 @@ describe("Router Contract", function () { // Prepare close and sweep action arguments const closeAndSweepActionArgs = abiCoder.encode( - ["address[]"], - [[escrows[0]]] + ["tuple(address[])"], + [[[escrows[0]]]] ); const closeAndSweepActionData = abiCoder.encode( @@ -297,8 +305,8 @@ describe("Router Contract", function () { // Prepare close and sweep action arguments const abiCoder = new ethers.AbiCoder(); const closeAndSweepActionArgs = abiCoder.encode( - ["address[]"], - [[escrows[0]]] + ["tuple(address[])"], + [[[escrows[0]]]] ); const closeAndSweepActionData = abiCoder.encode( ["uint256", "bytes"], @@ -394,8 +402,8 @@ describe("Router Contract", function () { // Check in case of 100% exercise vault manager can close and sweep prior to expiry const abiCoder = new ethers.AbiCoder(); const closeAndSweepActionArgs = abiCoder.encode( - ["address[]"], - [[escrows[0]]] + ["tuple(address[])"], + [[[escrows[0]]]] ); const closeAndSweepActionData = abiCoder.encode( ["uint256", "bytes"], @@ -476,8 +484,8 @@ describe("Router Contract", function () { // Check in case of partial exercise vault manager cannot close and sweep prior to expiry const abiCoder = new ethers.AbiCoder(); const closeAndSweepActionArgs = abiCoder.encode( - ["address[]"], - [[escrows[0]]] + ["tuple(address[])"], + [[[escrows[0]]]] ); const closeAndSweepActionData = abiCoder.encode( ["uint256", "bytes"], @@ -573,8 +581,8 @@ describe("Router Contract", function () { // Check in case of borrow vault manager cannot close and sweep prior to expiry const abiCoder = new ethers.AbiCoder(); const closeAndSweepActionArgs = abiCoder.encode( - ["address[]"], - [[escrows[0]]] + ["tuple(address[])"], + [[[escrows[0]]]] ); const closeAndSweepActionData = abiCoder.encode( ["uint256", "bytes"], @@ -675,8 +683,8 @@ describe("Router Contract", function () { // Check in case of borrow vault manager cannot close and sweep prior to expiry const abiCoder = new ethers.AbiCoder(); const closeAndSweepActionArgs = abiCoder.encode( - ["address[]"], - [[escrows[0]]] + ["tuple(address[])"], + [[[escrows[0]]]] ); const closeAndSweepActionData = abiCoder.encode( ["uint256", "bytes"],