Repository: centrifuge/protocol-v3
Pull request #277: feat: Legacy vault mapping
Author: login: mustermeiszer
Created: 2025-04-21T22:37:42Z | Merged: 2025-04-22T11:50:20Z

The idea is simple

* Adapter is a Centrifuge V2 `IInvestmentManager` for the legacy vaults
* Adapter is a Centrifuge V3 `IAsyncVault` for the system

![image](https://github.com/user-attachments/assets/32dffd53-1a4a-4981-b2f0-12bd67f9a916)

As seen in graphic, the `LegacyVaultAdapter` implements the old `IInvestmentManager` interface and forwards all relevant calls to the new system, exchanging the vault address with `address(this)`. Furthermore, the adapter inherets the `AsyncVault` and is simply a normal vault for the new system. 

This approach has the following advantages
* System does not need to know about the adapter 
  &rarr; Exception: we can NOT deploy the vault normally but need to migrate it to the `PoolManager` storage with a spell
  &rarr; Link and unlink work as expected
* Existing users of the old vaults can seamlessly migrate if needed
* Existing users of the old vaults can still use the full `IInvestmentManager` interface if integrations rely on that
* UI does not need to have exception cases for any vaults


Diff:
diff --git a/snapshots/AsyncVault.json b/snapshots/AsyncVault.json
index f8bc0cc85..a9fda17b6 100644
--- a/snapshots/AsyncVault.json
+++ b/snapshots/AsyncVault.json
@@ -1,4 +1,4 @@
 {
-  "fulfillDepositRequest": "914943",
-  "requestDeposit": "473163"
+  "fulfillDepositRequest": "914318",
+  "requestDeposit": "471545"
 }
\ No newline at end of file
diff --git a/snapshots/VaultRouter.json b/snapshots/VaultRouter.json
index 966f134b3..8d6f51683 100644
--- a/snapshots/VaultRouter.json
+++ b/snapshots/VaultRouter.json
@@ -1,7 +1,7 @@
 {
-  "claimDeposit": "1147703",
+  "claimDeposit": "1147166",
   "enable": "60953",
   "lockDepositRequest": "92339",
-  "requestDeposit": "594301",
-  "requestRedeem": "2105596"
+  "requestDeposit": "592683",
+  "requestRedeem": "2101718"
 }
\ No newline at end of file
diff --git a/src/vaults/AsyncRequests.sol b/src/vaults/AsyncRequests.sol
index 78c5e1fa9..22ad2dfbc 100644
--- a/src/vaults/AsyncRequests.sol
+++ b/src/vaults/AsyncRequests.sol
@@ -112,8 +112,8 @@ contract AsyncRequests is BaseInvestmentManager, IAsyncRequests {
     function _processDepositRequest(address vaultAddr, uint128 assets, address controller) internal returns (bool) {
         IAsyncVault vault_ = IAsyncVault(vaultAddr);
         VaultDetails memory vaultDetails = poolManager.vaultDetails(vaultAddr);
-        uint64 poolId = mapPoolId(vault_.poolId());
-        bytes16 scId = vault_.trancheId();
+        uint64 poolId = vault_.poolId();
+        bytes16 scId = vault_.scId();
 
         require(poolManager.isLinked(poolId, scId, vaultDetails.asset, vaultAddr), AssetNotAllowed());
 
@@ -144,10 +144,7 @@ contract AsyncRequests is BaseInvestmentManager, IAsyncRequests {
         IAsyncVault vault_ = IAsyncVault(vaultAddr);
 
         // You cannot redeem using a disallowed asset, instead another vault will have to be used
-        require(
-            poolManager.isLinked(mapPoolId(vault_.poolId()), vault_.trancheId(), vault_.asset(), vaultAddr),
-            AssetNotAllowed()
-        );
+        require(poolManager.isLinked(vault_.poolId(), vault_.scId(), vault_.asset(), vaultAddr), AssetNotAllowed());
 
         require(
             _canTransfer(vaultAddr, owner, address(escrow), shares)
@@ -171,8 +168,8 @@ contract AsyncRequests is BaseInvestmentManager, IAsyncRequests {
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault_));
 
         sender.sendRedeemRequest(
-            PoolId.wrap(mapPoolId(vault_.poolId())),
-            ShareClassId.wrap(vault_.trancheId()),
+            PoolId.wrap(vault_.poolId()),
+            ShareClassId.wrap(vault_.scId()),
             controller.toBytes32(),
             vaultDetails.assetId,
             shares
@@ -193,10 +190,7 @@ contract AsyncRequests is BaseInvestmentManager, IAsyncRequests {
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault_));
 
         sender.sendCancelDepositRequest(
-            PoolId.wrap(mapPoolId(vault_.poolId())),
-            ShareClassId.wrap(vault_.trancheId()),
-            controller.toBytes32(),
-            vaultDetails.assetId
+            PoolId.wrap(vault_.poolId()), ShareClassId.wrap(vault_.scId()), controller.toBytes32(), vaultDetails.assetId
         );
     }
 
@@ -214,10 +208,7 @@ contract AsyncRequests is BaseInvestmentManager, IAsyncRequests {
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault_));
 
         sender.sendCancelRedeemRequest(
-            PoolId.wrap(mapPoolId(vault_.poolId())),
-            ShareClassId.wrap(vault_.trancheId()),
-            controller.toBytes32(),
-            vaultDetails.assetId
+            PoolId.wrap(vault_.poolId()), ShareClassId.wrap(vault_.scId()), controller.toBytes32(), vaultDetails.assetId
         );
     }
 
@@ -465,8 +456,8 @@ contract AsyncRequests is BaseInvestmentManager, IAsyncRequests {
         VaultDetails memory vaultDetails = poolManager.vaultDetails(vaultAddr);
 
         IAsyncVault vault_ = IAsyncVault(vaultAddr);
-        uint64 poolId = mapPoolId(vault_.poolId());
-        bytes16 scId = vault_.trancheId();
+        uint64 poolId = vault_.poolId();
+        bytes16 scId = vault_.scId();
 
         Prices memory prices =
             sharePriceProvider.prices(poolId, scId, vaultDetails.assetId, vaultDetails.asset, vaultDetails.tokenId);
diff --git a/src/vaults/BaseInvestmentManager.sol b/src/vaults/BaseInvestmentManager.sol
index 47aad892b..92c11c3c0 100644
--- a/src/vaults/BaseInvestmentManager.sol
+++ b/src/vaults/BaseInvestmentManager.sol
@@ -43,7 +43,7 @@ abstract contract BaseInvestmentManager is Auth, Recoverable, IBaseInvestmentMan
         IBaseVault vault_ = IBaseVault(vaultAddr);
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault_));
         (D18 priceAssetPerShare,) =
-            poolManager.priceAssetPerShare(mapPoolId(vault_.poolId()), vault_.trancheId(), vaultDetails.assetId, false);
+            poolManager.priceAssetPerShare(vault_.poolId(), vault_.scId(), vaultDetails.assetId, false);
 
         return _convertToShares(vault_, vaultDetails, priceAssetPerShare, assets, MathLib.Rounding.Down);
     }
@@ -53,7 +53,7 @@ abstract contract BaseInvestmentManager is Auth, Recoverable, IBaseInvestmentMan
         IBaseVault vault_ = IBaseVault(vaultAddr);
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault_));
         (D18 priceAssetPerShare,) =
-            poolManager.priceAssetPerShare(mapPoolId(vault_.poolId()), vault_.trancheId(), vaultDetails.assetId, false);
+            poolManager.priceAssetPerShare(vault_.poolId(), vault_.scId(), vaultDetails.assetId, false);
 
         return _convertToAssets(vault_, vaultDetails, priceAssetPerShare, shares, MathLib.Rounding.Down);
     }
@@ -63,15 +63,7 @@ abstract contract BaseInvestmentManager is Auth, Recoverable, IBaseInvestmentMan
         IBaseVault vault_ = IBaseVault(vaultAddr);
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault_));
 
-        (, lastUpdated) =
-            poolManager.priceAssetPerShare(mapPoolId(vault_.poolId()), vault_.trancheId(), vaultDetails.assetId, false);
-    }
-
-    function mapPoolId(uint64 poolId) public pure returns (uint64 mappedPoolId) {
-        // TODO: update v2CentrifugeId and add all pools before deployment
-        uint16 v2CentrifugeId = 1;
-        if (poolId == 4139607887) return newPoolId(v2CentrifugeId, 1).raw();
-        return poolId;
+        (, lastUpdated) = poolManager.priceAssetPerShare(vault_.poolId(), vault_.scId(), vaultDetails.assetId, false);
     }
 
     function _convertToShares(
diff --git a/src/vaults/BaseVaults.sol b/src/vaults/BaseVaults.sol
index aa96edd1e..914bf8b23 100644
--- a/src/vaults/BaseVaults.sol
+++ b/src/vaults/BaseVaults.sol
@@ -31,12 +31,11 @@ abstract contract BaseVault is Auth, Recoverable, IBaseVault {
     /// @inheritdoc IBaseVault
     uint64 public immutable poolId;
     /// @inheritdoc IBaseVault
-    bytes16 public immutable trancheId;
+    bytes16 public immutable scId;
 
     /// @inheritdoc IERC7575
     address public immutable asset;
-    /// @dev NOTE: Should never be used in production in any external contract as there will be old vaults without this
-    /// storage. Instead, refer to poolManager.vaultDetails(vault).
+
     uint256 internal immutable tokenId;
 
     /// @inheritdoc IERC7575
@@ -70,7 +69,7 @@ abstract contract BaseVault is Auth, Recoverable, IBaseVault {
         address manager_
     ) Auth(msg.sender) {
         poolId = poolId_;
-        trancheId = scId_;
+        scId = scId_;
         asset = asset_;
         tokenId = tokenId_;
         share = token_;
diff --git a/src/vaults/SyncRequests.sol b/src/vaults/SyncRequests.sol
index c95a8a56e..fecec4228 100644
--- a/src/vaults/SyncRequests.sol
+++ b/src/vaults/SyncRequests.sol
@@ -246,7 +246,7 @@ contract SyncRequests is BaseInvestmentManager, ISyncRequests {
         IBaseVault vault_ = IBaseVault(vaultAddr);
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault_));
         D18 priceAssetPerShare_ = _priceAssetPerShare(
-            vault_.poolId(), vault_.trancheId(), vaultDetails.assetId, vault_.asset(), vaultDetails.tokenId
+            vault_.poolId(), vault_.scId(), vaultDetails.assetId, vault_.asset(), vaultDetails.tokenId
         );
 
         return super._convertToShares(vault_, vaultDetails, priceAssetPerShare_, assets, MathLib.Rounding.Down);
@@ -263,7 +263,7 @@ contract SyncRequests is BaseInvestmentManager, ISyncRequests {
         IBaseVault vault_ = IBaseVault(vaultAddr);
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault_));
         D18 priceAssetPerShare_ = _priceAssetPerShare(
-            vault_.poolId(), vault_.trancheId(), vaultDetails.assetId, vault_.asset(), vaultDetails.tokenId
+            vault_.poolId(), vault_.scId(), vaultDetails.assetId, vault_.asset(), vaultDetails.tokenId
         );
 
         return super._convertToAssets(vault_, vaultDetails, priceAssetPerShare_, shares, MathLib.Rounding.Up);
@@ -301,7 +301,7 @@ contract SyncRequests is BaseInvestmentManager, ISyncRequests {
     function _issueShares(address vaultAddr, uint128 shares, address receiver, uint128 depositAssetAmount) internal {
         SyncDepositVault vault_ = SyncDepositVault(vaultAddr);
         uint64 poolId_ = vault_.poolId();
-        bytes16 scId_ = vault_.trancheId();
+        bytes16 scId_ = vault_.scId();
         VaultDetails memory vaultDetails = poolManager.vaultDetails(vaultAddr);
 
         PoolId poolId = PoolId.wrap(poolId_);
diff --git a/src/vaults/interfaces/IERC7540.sol b/src/vaults/interfaces/IERC7540.sol
index 403770bff..f58f1566c 100644
--- a/src/vaults/interfaces/IERC7540.sol
+++ b/src/vaults/interfaces/IERC7540.sol
@@ -299,8 +299,7 @@ interface IBaseVault is IERC7540Operator, IERC7741, IERC7714, IERC7575, IRecover
     function poolId() external view returns (uint64);
 
     /// @notice Identifier of the share class of the Centrifuge pool
-    /// @dev    IMPORTANT: Name is trancheId to be backwards compatible
-    function trancheId() external view returns (bytes16);
+    function scId() external view returns (bytes16);
 
     /// @notice Set msg.sender as operator of owner, to `approved` status
     /// @dev    MUST be called by endorsed sender
diff --git a/src/vaults/legacy/LegacyVaultAdapter.sol b/src/vaults/legacy/LegacyVaultAdapter.sol
new file mode 100644
index 000000000..0ecd80014
--- /dev/null
+++ b/src/vaults/legacy/LegacyVaultAdapter.sol
@@ -0,0 +1,207 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.28;
+
+import {IERC7540} from "src/vaults/legacy/interfaces/IERC7540.sol";
+import {IInvestmentManager} from "src/vaults/legacy/interfaces/IInvestmentManager.sol";
+import {ILegacyVaultAdapter} from "src/vaults/legacy/interfaces/ILegacyVaultAdapter.sol";
+import {AsyncVault} from "src/vaults/AsyncVault.sol";
+
+/// @title  LegacyVaultAdapter
+/// @notice An adapter connecting legacy ERC-7540 vaults from Centrifuge V2 to Centrifuge V3.
+///
+/// @dev This adapter acts as an `IInvestmentManager` for a single legacy `IERC7540` vault from Centrifuge V2. At the
+/// same time it acts like a new `IAsyncVault` for the `IAsyncRequests` manager of Centrifuge V3. The adapter needs to
+/// be deployed per legacy vault and allows a seamless interaction between Centrifuge V2 vaults and Centrifuge V3
+/// infrastructure. Thereby, allowing to migrate existing vaults to the new system.
+contract LegacyVaultAdapter is AsyncVault, ILegacyVaultAdapter, IInvestmentManager {
+    // No TokenId in legacy
+    uint256 constant LEGACY_TOKEN_ID = 0;
+
+    uint64 public immutable legacyPoolId;
+    bytes16 public immutable legacyTrancheId;
+    IERC7540 public immutable legacyVault;
+
+    constructor(
+        IERC7540 legacyVault_,
+        uint64 poolId,
+        uint64 legacyPoolId_,
+        bytes16 scId,
+        bytes16 legacyTrancheId_,
+        address asset,
+        address token,
+        address root,
+        address manager
+    ) AsyncVault(poolId, scId, asset, LEGACY_TOKEN_ID, token, root, manager) {
+        require(legacyVault_.poolId() == legacyPoolId_, NotLegacyPoolId(legacyPoolId_, legacyVault_.poolId()));
+        require(
+            legacyVault_.trancheId() == legacyTrancheId_, NotLegacyTrancheId(legacyTrancheId_, legacyVault_.trancheId())
+        );
+        require(legacyVault_.asset() == asset, NotLegacyAsset(asset, legacyVault_.asset()));
+        require(legacyVault_.share() == token, NotLegacyShare(token, legacyVault_.share()));
+
+        legacyPoolId = legacyPoolId_;
+        legacyTrancheId = legacyTrancheId_;
+        legacyVault = legacyVault_;
+    }
+
+    /// @dev Check if the msg.sende_r is the legacyVault
+    modifier legacy() {
+        require(msg.sender == address(legacyVault), NotLegacyVault(msg.sender, address(legacyVault)));
+        _;
+    }
+
+    // --- IInvestmentManager impl ---
+    function escrow() public pure returns (address) {
+        // TODO: actually use the `IEscrowProvider` from the manager?
+        return address(0);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function requestDeposit(address, /* vault */ uint256 assets, address receiver, address owner, address source)
+        public
+        legacy
+        returns (bool)
+    {
+        return asyncManager().requestDeposit(address(this), assets, receiver, owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function requestRedeem(address, /* vault */ uint256 shares, address receiver, address owner, address source)
+        public
+        legacy
+        returns (bool)
+    {
+        return asyncManager().requestRedeem(address(this), shares, receiver, owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function cancelDepositRequest(address, /* vault */ address owner, address source) public legacy {
+        return asyncManager().cancelDepositRequest(address(this), owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function cancelRedeemRequest(address, /* vault */ address owner, address source) public legacy {
+        return asyncManager().cancelRedeemRequest(address(this), owner, source);
+    }
+
+    // --- IInvestmentManager - View functions ---
+    /// @inheritdoc IInvestmentManager
+    function convertToShares(address, /* vault */ uint256 _assets) public view returns (uint256 shares) {
+        shares = manager.convertToShares(address(this), _assets);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function convertToAssets(address, /* vault */ uint256 _shares) public view returns (uint256 assets) {
+        assets = manager.convertToAssets(address(this), _shares);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxDeposit(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().maxDeposit(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxMint(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().maxMint(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxWithdraw(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().maxWithdraw(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxRedeem(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().maxRedeem(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingDepositRequest(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().pendingDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingRedeemRequest(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().pendingRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingCancelDepositRequest(address, /* vault */ address user) public view returns (bool isPending) {
+        isPending = asyncManager().pendingCancelDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingCancelRedeemRequest(address, /* vault */ address user) public view returns (bool isPending) {
+        isPending = asyncManager().pendingCancelRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimableCancelDepositRequest(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().claimableCancelDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimableCancelRedeemRequest(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().claimableCancelRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function priceLastUpdated(address /* vault */ ) public view returns (uint64 lastUpdated) {
+        lastUpdated = manager.priceLastUpdated(address(this));
+    }
+
+    // --- IInvestmentManager - Vault claim functions ---
+    /// @inheritdoc IInvestmentManager
+    function deposit(address, /* vault */ uint256 assets, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 shares)
+    {
+        shares = asyncManager().deposit(address(this), assets, receiver, owner);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function mint(address, /* vault */ uint256 shares, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 assets)
+    {
+        assets = asyncManager().mint(address(this), shares, receiver, owner);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function redeem(address, /* vault */ uint256 shares, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 assets)
+    {
+        assets = asyncManager().redeem(address(this), shares, receiver, owner);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function withdraw(address, /* vault */ uint256 assets, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 shares)
+    {
+        shares = asyncManager().withdraw(address(this), assets, receiver, owner);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimCancelDepositRequest(address, /* vault */ address receiver, address owner)
+        public
+        legacy
+        returns (uint256 assets)
+    {
+        assets = asyncManager().claimCancelDepositRequest(address(this), receiver, owner);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimCancelRedeemRequest(address, /* vault */ address receiver, address owner)
+        public
+        legacy
+        returns (uint256 shares)
+    {
+        shares = asyncManager().claimCancelRedeemRequest(address(this), receiver, owner);
+    }
+}
diff --git a/src/vaults/legacy/interfaces/IERC7540.sol b/src/vaults/legacy/interfaces/IERC7540.sol
new file mode 100644
index 000000000..4c3c18379
--- /dev/null
+++ b/src/vaults/legacy/interfaces/IERC7540.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: AGPL-3.0-only
+pragma solidity >=0.5.0;
+
+/// @notice A stripped down version of the Centrifuge V2 ERC-7540 vault.
+///
+/// @dev This interface is needed to ensure adapters for legacy vaults are provided with the expected interface.
+interface IERC7540 {
+    /// @notice Documentation see Centrifuge V2 repository.
+    function poolId() external view returns (uint64);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function trancheId() external view returns (bytes16);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function asset() external view returns (address);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function share() external view returns (address);
+}
diff --git a/src/vaults/legacy/interfaces/IInvestmentManager.sol b/src/vaults/legacy/interfaces/IInvestmentManager.sol
new file mode 100644
index 000000000..0b4814278
--- /dev/null
+++ b/src/vaults/legacy/interfaces/IInvestmentManager.sol
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: AGPL-3.0-only
+pragma solidity >=0.5.0;
+
+/// @notice A stripped down version of the Centrifuge V2 investment manager.
+///
+/// @dev This interface is needed to ensure adapters for legacy vaults are provided with the expected interface.
+interface IInvestmentManager {
+    /// @notice Documentation see Centrifuge V2 repository.
+    function escrow() external view returns (address);
+
+    // --- Outgoing message handling ---
+    /// @notice Documentation see Centrifuge V2 repository.
+    function requestDeposit(address vault, uint256 assets, address receiver, address owner, address source)
+        external
+        returns (bool);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function requestRedeem(address vault, uint256 shares, address receiver, address, /* owner */ address source)
+        external
+        returns (bool);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function cancelDepositRequest(address vault, address owner, address source) external;
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function cancelRedeemRequest(address vault, address owner, address source) external;
+
+    // --- View functions ---
+    /// @notice Documentation see Centrifuge V2 repository.
+    function convertToShares(address vault, uint256 _assets) external view returns (uint256 shares);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function convertToAssets(address vault, uint256 _shares) external view returns (uint256 assets);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function maxDeposit(address vault, address user) external view returns (uint256);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function maxMint(address vault, address user) external view returns (uint256 shares);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function maxWithdraw(address vault, address user) external view returns (uint256 assets);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function maxRedeem(address vault, address user) external view returns (uint256 shares);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function pendingDepositRequest(address vault, address user) external view returns (uint256 assets);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function pendingRedeemRequest(address vault, address user) external view returns (uint256 shares);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function pendingCancelDepositRequest(address vault, address user) external view returns (bool isPending);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function pendingCancelRedeemRequest(address vault, address user) external view returns (bool isPending);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function claimableCancelDepositRequest(address vault, address user) external view returns (uint256 assets);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function claimableCancelRedeemRequest(address vault, address user) external view returns (uint256 shares);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function priceLastUpdated(address vault) external view returns (uint64 lastUpdated);
+
+    // --- Vault claim functions ---
+    /// @notice Documentation see Centrifuge V2 repository.
+    function deposit(address vault, uint256 assets, address receiver, address owner)
+        external
+        returns (uint256 shares);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function mint(address vault, uint256 shares, address receiver, address owner) external returns (uint256 assets);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function redeem(address vault, uint256 shares, address receiver, address owner) external returns (uint256 assets);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function withdraw(address vault, uint256 assets, address receiver, address owner)
+        external
+        returns (uint256 shares);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function claimCancelDepositRequest(address vault, address receiver, address owner)
+        external
+        returns (uint256 assets);
+
+    /// @notice Documentation see Centrifuge V2 repository.
+    function claimCancelRedeemRequest(address vault, address receiver, address owner)
+        external
+        returns (uint256 shares);
+}
diff --git a/src/vaults/legacy/interfaces/ILegacyVaultAdapter.sol b/src/vaults/legacy/interfaces/ILegacyVaultAdapter.sol
new file mode 100644
index 000000000..d4b5d26e9
--- /dev/null
+++ b/src/vaults/legacy/interfaces/ILegacyVaultAdapter.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity >=0.5.0;
+
+interface ILegacyVaultAdapter {
+    error NotLegacyVault(address sender, address legacyVault);
+    error NotLegacyPoolId(uint64 providedPoolId, uint64 legacyPoolId);
+    error NotLegacyTrancheId(bytes16 providedTrancheId, bytes16 legacyTrancheId);
+    error NotLegacyAsset(address providedAsset, address legacyAsset);
+    error NotLegacyShare(address providedShare, address legacyShare);
+}
diff --git a/test/hooks/integration/FreelyTransferable.t.sol b/test/hooks/integration/FreelyTransferable.t.sol
index 73185e381..c5a401216 100644
--- a/test/hooks/integration/FreelyTransferable.t.sol
+++ b/test/hooks/integration/FreelyTransferable.t.sol
@@ -18,9 +18,7 @@ contract RedeemTest is BaseTest {
         FreelyTransferable hook = FreelyTransferable(freelyTransferable);
         IShareToken shareToken = IShareToken(address(vault.share()));
 
-        centrifugeChain.updatePricePoolPerShare(
-            vault.poolId(), vault.trancheId(), defaultPrice, uint64(block.timestamp)
-        );
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), defaultPrice, uint64(block.timestamp));
 
         // Anyone can deposit
         address investor = makeAddr("Investor");
@@ -34,7 +32,7 @@ contract RedeemTest is BaseTest {
         vm.stopPrank();
 
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
         );
 
         vm.prank(investor);
@@ -50,7 +48,7 @@ contract RedeemTest is BaseTest {
         vm.prank(investor);
         vault.requestRedeem(amount / 2, investor, investor);
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
         (isMember,) = hook.isMember(address(shareToken), investor);
         assertEq(isMember, true);
 
@@ -59,7 +57,7 @@ contract RedeemTest is BaseTest {
         uint128 fulfillment = uint128(amount / 2);
 
         centrifugeChain.isFulfilledRedeemRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(investor)), assetId, fulfillment, fulfillment
+            vault.poolId(), vault.scId(), bytes32(bytes20(investor)), assetId, fulfillment, fulfillment
         );
 
         vm.prank(investor);
diff --git a/test/vaults/BaseTest.sol b/test/vaults/BaseTest.sol
index 6afbfcf2a..13575ab7a 100644
--- a/test/vaults/BaseTest.sol
+++ b/test/vaults/BaseTest.sol
@@ -229,14 +229,14 @@ contract BaseTest is VaultsDeployer, Test {
     function deposit(address _vault, address _investor, uint256 amount, bool claimDeposit) public {
         AsyncVault vault = AsyncVault(_vault);
         erc20.mint(_investor, amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), _investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), _investor, type(uint64).max);
         vm.startPrank(_investor);
         erc20.approve(_vault, amount); // add allowance
         vault.requestDeposit(amount, _investor, _investor);
         // trigger executed collectInvest
         uint128 assetId = poolManager.assetToId(address(erc20), erc20TokenId);
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(_investor)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(_investor)), assetId, uint128(amount), uint128(amount)
         );
 
         if (claimDeposit) {
diff --git a/test/vaults/integration/Burn.t.sol b/test/vaults/integration/Burn.t.sol
index 0c9cfb90a..94776e905 100644
--- a/test/vaults/integration/Burn.t.sol
+++ b/test/vaults/integration/Burn.t.sol
@@ -15,7 +15,7 @@ contract BurnTest is BaseTest {
         IShareToken shareToken = IShareToken(address(vault.share()));
         root.relyContract(address(shareToken), self); // give self auth permissions
         // add investor as member
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
 
         shareToken.mint(investor, amount);
         root.denyContract(address(shareToken), self); // remove auth permissions from self
diff --git a/test/vaults/integration/Deposit.t.sol b/test/vaults/integration/Deposit.t.sol
index a362d87cc..f3769e3b2 100644
--- a/test/vaults/integration/Deposit.t.sol
+++ b/test/vaults/integration/Deposit.t.sol
@@ -41,7 +41,7 @@ contract DepositTest is BaseTest {
         (, address vault_, uint128 assetId) = deploySimpleVault(VaultKind.Async);
         AsyncVault vault = AsyncVault(vault_);
         IShareToken shareToken = IShareToken(address(vault.share()));
-        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.trancheId(), price, uint64(block.timestamp));
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), price, uint64(block.timestamp));
 
         erc20.mint(self, amount);
 
@@ -50,7 +50,7 @@ contract DepositTest is BaseTest {
         vault.requestDeposit(amount, self, self);
 
         assertEq(vault.isPermissioned(self), false);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); // add user as member
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max); // add user as member
         assertEq(vault.isPermissioned(self), true);
 
         // will fail - user not member: can not receive share class
@@ -72,7 +72,7 @@ contract DepositTest is BaseTest {
         // will fail - cannot fulfill if there is no pending request
         uint128 shares = uint128((amount * 10 ** 18) / price); // sharePrice = 2$
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         vm.expectRevert(IAsyncRequests.NoPendingRequest.selector);
         asyncRequests.fulfillDepositRequest(
             PoolId.wrap(poolId), ShareClassId.wrap(scId), self, AssetId.wrap(assetId), uint128(amount), shares
@@ -104,7 +104,7 @@ contract DepositTest is BaseTest {
             vm.startSnapshotGas("AsyncVault", "fulfillDepositRequest");
         }
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(self)), assetId, uint128(amount), shares
+            vault.poolId(), vault.scId(), bytes32(bytes20(self)), assetId, uint128(amount), shares
         );
         if (snap) {
             vm.stopSnapshotGas();
@@ -119,11 +119,11 @@ contract DepositTest is BaseTest {
         assertEq(shareToken.balanceOf(address(escrow)), shares);
 
         // check maxDeposit and maxMint are 0 for non-members
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, uint64(block.timestamp));
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, uint64(block.timestamp));
         vm.warp(block.timestamp + 1);
         assertEq(vault.maxDeposit(self), 0);
         assertEq(vault.maxMint(self), 0);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
 
         vm.assume(randomUser != self);
         // deposit 50% of the amount
@@ -183,11 +183,11 @@ contract DepositTest is BaseTest {
             VaultKind.Async, SHARE_TOKEN_DECIMALS, restrictedTransfers, bytes16(bytes("1")), address(asset), 0, 0
         );
         AsyncVault vault = AsyncVault(vault_);
-        centrifugeChain.updatePricePoolPerShare(poolId, vault.trancheId(), 1000000000000000000, uint64(block.timestamp));
+        centrifugeChain.updatePricePoolPerShare(poolId, vault.scId(), 1000000000000000000, uint64(block.timestamp));
 
         // invest
         uint256 investmentAmount = 100000000; // 100 * 10**6
-        centrifugeChain.updateMember(poolId, vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(poolId, vault.scId(), self, type(uint64).max);
         asset.approve(vault_, investmentAmount);
         asset.mint(self, investmentAmount);
         vault.requestDeposit(investmentAmount, self, self);
@@ -196,7 +196,7 @@ contract DepositTest is BaseTest {
         uint128 assets = 50000000; // 50 * 10**6
         uint128 firstSharePayout = 35714285714285714285; // 50 * 10**18 / 1.4, rounded down
         centrifugeChain.isFulfilledDepositRequest(
-            poolId, vault.trancheId(), bytes32(bytes20(self)), assetId, assets, firstSharePayout
+            poolId, vault.scId(), bytes32(bytes20(self)), assetId, assets, firstSharePayout
         );
 
         (,, uint256 depositPrice,,,,,,,) = asyncRequests.investments(address(vault), self);
@@ -205,7 +205,7 @@ contract DepositTest is BaseTest {
         // second trigger executed collectInvest of the second 50% at a price of 1.2
         uint128 secondSharePayout = 41666666666666666666; // 50 * 10**18 / 1.2, rounded down
         centrifugeChain.isFulfilledDepositRequest(
-            poolId, vault.trancheId(), bytes32(bytes20(self)), assetId, assets, secondSharePayout
+            poolId, vault.scId(), bytes32(bytes20(self)), assetId, assets, secondSharePayout
         );
 
         (,, depositPrice,,,,,,,) = asyncRequests.investments(address(vault), self);
@@ -229,7 +229,7 @@ contract DepositTest is BaseTest {
     // users
 
     //     // fund user & request deposit
-    //     centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, uint64(block.timestamp));
+    //     centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, uint64(block.timestamp));
     //     erc20.mint(self, totalAmount);
     //     erc20.approve(address(vault), totalAmount);
     //     vault.requestDeposit(totalAmount, self, self);
@@ -241,7 +241,7 @@ contract DepositTest is BaseTest {
     //     // Gateway returns randomly generated values for amount of share class tokens and asset
     //     centrifugeChain.isFulfilledDepositRequest(
     //         vault.poolId(),
-    //         vault.trancheId(),
+    //         vault.scId(),
     //         bytes32(bytes20(self)),
     //         defaultAssetId,
     //         uint128(totalAmount),
@@ -289,7 +289,7 @@ contract DepositTest is BaseTest {
     // users
 
     //     // fund user & request deposit
-    //     centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, uint64(block.timestamp));
+    //     centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, uint64(block.timestamp));
     //     erc20.mint(self, totalAmount);
     //     erc20.approve(address(vault), totalAmount);
     //     vault.requestDeposit(totalAmount, self, self);
@@ -301,7 +301,7 @@ contract DepositTest is BaseTest {
     //     // Gateway returns randomly generated values for amount of share class tokens and asset
     //     centrifugeChain.isFulfilledDepositRequest(
     //         vault.poolId(),
-    //         vault.trancheId(),
+    //         vault.scId(),
     //         bytes32(bytes20(self)),
     //         defaultAssetId,
     //         uint128(totalAmount),
@@ -334,10 +334,10 @@ contract DepositTest is BaseTest {
         AsyncVault vault = AsyncVault(vault_);
         IShareToken shareToken = IShareToken(address(vault.share()));
 
-        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.trancheId(), price, uint64(block.timestamp));
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), price, uint64(block.timestamp));
         erc20.mint(self, amount);
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); // add user as member
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max); // add user as member
         erc20.approve(vault_, amount); // add allowance
         vault.requestDeposit(amount, self, self);
 
@@ -345,7 +345,7 @@ contract DepositTest is BaseTest {
         uint128 shares = uint128(amount * 10 ** 18 / price); // sharePrice = 2$
         assertApproxEqAbs(shares, amount / 2, 2);
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(self)), assetId, uint128(amount), shares
+            vault.poolId(), vault.scId(), bytes32(bytes20(self)), assetId, uint128(amount), shares
         );
 
         // assert deposit & mint values adjusted
@@ -361,7 +361,7 @@ contract DepositTest is BaseTest {
         vm.expectRevert(IHook.TransferBlocked.selector);
         vault.mint(amount / 2, receiver); // mint half the amount
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), receiver, type(uint64).max); // add receiver
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), receiver, type(uint64).max); // add receiver
             // member
 
         // success
@@ -385,10 +385,10 @@ contract DepositTest is BaseTest {
         AsyncVault vault = AsyncVault(vault_);
         IShareToken shareToken = IShareToken(address(vault.share()));
 
-        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.trancheId(), price, uint64(block.timestamp));
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), price, uint64(block.timestamp));
 
         erc20.mint(self, amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); // add user as member
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max); // add user as member
         erc20.approve(vault_, amount); // add allowance
         vault.requestDeposit(amount, self, self);
 
@@ -396,7 +396,7 @@ contract DepositTest is BaseTest {
         uint128 sharePayout = uint128(amount * 10 ** 18 / price); // sharePrice = 2$
         assertApproxEqAbs(sharePayout, amount / 2, 2);
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(self)), assetId, uint128(amount), sharePayout
+            vault.poolId(), vault.scId(), bytes32(bytes20(self)), assetId, uint128(amount), sharePayout
         );
 
         // assert deposit & mint values adjusted
@@ -405,7 +405,7 @@ contract DepositTest is BaseTest {
         // assert share class tokens minted
         assertEq(shareToken.balanceOf(address(escrow)), sharePayout);
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), receiver, type(uint64).max); // add receiver
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), receiver, type(uint64).max); // add receiver
 
         address router = makeAddr("router");
 
@@ -440,11 +440,11 @@ contract DepositTest is BaseTest {
             VaultKind.Async, SHARE_TOKEN_DECIMALS, restrictedTransfers, bytes16(bytes("1")), address(asset), 0, 0
         );
         AsyncVault vault = AsyncVault(vault_);
-        centrifugeChain.updatePricePoolPerShare(poolId, vault.trancheId(), 1000000000000000000, uint64(block.timestamp));
+        centrifugeChain.updatePricePoolPerShare(poolId, vault.scId(), 1000000000000000000, uint64(block.timestamp));
 
         // invest
         uint256 investmentAmount = 100000000; // 100 * 10**6
-        centrifugeChain.updateMember(poolId, vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(poolId, vault.scId(), self, type(uint64).max);
         asset.approve(vault_, investmentAmount);
         asset.mint(self, investmentAmount);
         vault.requestDeposit(investmentAmount, self, self);
@@ -453,7 +453,7 @@ contract DepositTest is BaseTest {
         uint128 assets = 50000000; // 50 * 10**6
         uint128 firstSharePayout = 41666666666666666666; // 50 * 10**18 / 1.2, rounded down
         centrifugeChain.isFulfilledDepositRequest(
-            poolId, vault.trancheId(), bytes32(bytes20(self)), assetId, assets, firstSharePayout
+            poolId, vault.scId(), bytes32(bytes20(self)), assetId, assets, firstSharePayout
         );
 
         // assert deposit & mint values adjusted
@@ -468,7 +468,7 @@ contract DepositTest is BaseTest {
         assets = 50000000; // 50 * 10**6
         uint128 secondSharePayout = 35714285714285714285; // 50 * 10**18 / 1.4, rounded down
         centrifugeChain.isFulfilledDepositRequest(
-            poolId, vault.trancheId(), bytes32(bytes20(self)), assetId, assets, secondSharePayout
+            poolId, vault.scId(), bytes32(bytes20(self)), assetId, assets, secondSharePayout
         );
 
         // collect the share class tokens
@@ -487,7 +487,7 @@ contract DepositTest is BaseTest {
         asset.mint(address(escrow), assets - investmentAmount);
 
         centrifugeChain.isFulfilledRedeemRequest(
-            poolId, vault.trancheId(), bytes32(bytes20(self)), assetId, assets, firstSharePayout + secondSharePayout
+            poolId, vault.scId(), bytes32(bytes20(self)), assetId, assets, firstSharePayout + secondSharePayout
         );
 
         // redeem price should now be ~1.5*10**18.
@@ -648,7 +648,7 @@ contract DepositTest is BaseTest {
         (, address vault_, uint128 assetId) = deploySimpleVault(VaultKind.Async);
         AsyncVault vault = AsyncVault(vault_);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         centrifugeChain.updatePricePoolPerShare(poolId, scId, price, uint64(block.timestamp));
         erc20.mint(self, amount);
         erc20.approve(vault_, amount);
@@ -669,7 +669,7 @@ contract DepositTest is BaseTest {
 
         MessageLib.CancelDepositRequest memory m = adapter1.values_bytes("send").deserializeCancelDepositRequest();
         assertEq(m.poolId, vault.poolId());
-        assertEq(m.scId, vault.trancheId());
+        assertEq(m.scId, vault.scId());
         assertEq(m.investor, bytes32(bytes20(self)));
         assertEq(m.assetId, assetId);
 
@@ -686,7 +686,7 @@ contract DepositTest is BaseTest {
         erc20.burn(self, amount);
 
         centrifugeChain.isFulfilledCancelDepositRequest(
-            vault.poolId(), vault.trancheId(), self.toBytes32(), assetId, uint128(amount)
+            vault.poolId(), vault.scId(), self.toBytes32(), assetId, uint128(amount)
         );
         assertEq(erc20.balanceOf(address(escrow)), amount);
         assertEq(erc20.balanceOf(self), 0);
@@ -748,7 +748,7 @@ contract DepositTest is BaseTest {
         assertEq(shareToken.balanceOf(investor), 0);
 
         erc20.mint(investor, amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max); // add user as
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max); // add user as
 
         vm.startPrank(investor);
         erc20.approve(vault_, amount);
@@ -756,7 +756,7 @@ contract DepositTest is BaseTest {
         vm.stopPrank();
 
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), investor.toBytes32(), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), investor.toBytes32(), assetId, uint128(amount), uint128(amount)
         );
         vm.expectRevert(IAsyncRequests.ExceedsMaxDeposit.selector);
         vault.deposit(amount, investor);
diff --git a/test/vaults/integration/Mint.t.sol b/test/vaults/integration/Mint.t.sol
index 01e948244..d50f5a6cd 100644
--- a/test/vaults/integration/Mint.t.sol
+++ b/test/vaults/integration/Mint.t.sol
@@ -21,7 +21,7 @@ contract MintTest is BaseTest {
         root.relyContract(address(shareToken), self); // give self auth permissions
         vm.expectRevert(IHook.TransferBlocked.selector);
         shareToken.mint(investor, amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
 
         // success
         shareToken.mint(investor, amount);
diff --git a/test/vaults/integration/Operator.t.sol b/test/vaults/integration/Operator.t.sol
index 20159f97c..3bd44230c 100644
--- a/test/vaults/integration/Operator.t.sol
+++ b/test/vaults/integration/Operator.t.sol
@@ -18,11 +18,11 @@ contract OperatorTest is BaseTest {
         AsyncVault vault = AsyncVault(vault_);
         IShareToken shareToken = IShareToken(address(vault.share()));
 
-        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.trancheId(), price, uint64(block.timestamp));
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), price, uint64(block.timestamp));
 
         erc20.mint(investor, amount);
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
         vm.prank(investor);
         erc20.approve(vault_, amount);
 
@@ -45,7 +45,7 @@ contract OperatorTest is BaseTest {
         assertEq(vault.pendingDepositRequest(0, operator), 0);
 
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
         );
 
         vm.prank(operator);
@@ -72,11 +72,11 @@ contract OperatorTest is BaseTest {
         address operator = makeAddr("operator");
         AsyncVault vault = AsyncVault(vault_);
 
-        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.trancheId(), price, uint64(block.timestamp));
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), price, uint64(block.timestamp));
 
         erc20.mint(controller, amount);
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), controller, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), controller, type(uint64).max);
         vm.prank(controller);
         erc20.approve(vault_, amount);
 
@@ -150,9 +150,7 @@ contract OperatorTest is BaseTest {
         AsyncVault vault = AsyncVault(vault_);
 
         deposit(vault_, investor, amount); // deposit funds first
-        centrifugeChain.updatePricePoolPerShare(
-            vault.poolId(), vault.trancheId(), defaultPrice, uint64(block.timestamp)
-        );
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), defaultPrice, uint64(block.timestamp));
 
         vm.prank(operator);
         vm.expectRevert(IERC20.InsufficientAllowance.selector);
@@ -169,7 +167,7 @@ contract OperatorTest is BaseTest {
         assertEq(vault.pendingRedeemRequest(0, operator), 0);
 
         centrifugeChain.isFulfilledRedeemRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
         );
 
         vm.prank(operator);
@@ -197,11 +195,11 @@ contract OperatorTest is BaseTest {
         address operator = makeAddr("operator");
         AsyncVault vault = AsyncVault(vault_);
 
-        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.trancheId(), price, uint64(block.timestamp));
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), price, uint64(block.timestamp));
 
         erc20.mint(controller, amount);
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), controller, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), controller, type(uint64).max);
         vm.prank(controller);
         erc20.approve(vault_, amount);
 
diff --git a/test/vaults/integration/PoolManager.t.sol b/test/vaults/integration/PoolManager.t.sol
index f28b6fe03..42ec9151e 100644
--- a/test/vaults/integration/PoolManager.t.sol
+++ b/test/vaults/integration/PoolManager.t.sol
@@ -266,25 +266,25 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
         // fund this account with amount
         poolManager.updateRestriction(
             PoolId.wrap(vault.poolId()),
-            ShareClassId.wrap(vault.trancheId()),
+            ShareClassId.wrap(vault.scId()),
             MessageLib.UpdateRestrictionMember(address(this).toBytes32(), validUntil).serialize()
         );
 
         poolManager.handleTransferShares(
-            PoolId.wrap(vault.poolId()), ShareClassId.wrap(vault.trancheId()), address(this), amount
+            PoolId.wrap(vault.poolId()), ShareClassId.wrap(vault.scId()), address(this), amount
         );
         assertEq(shareToken.balanceOf(address(this)), amount); // Verify the address(this) has the expected amount
 
         poolManager.updateRestriction(
             PoolId.wrap(vault.poolId()),
-            ShareClassId.wrap(vault.trancheId()),
+            ShareClassId.wrap(vault.scId()),
             MessageLib.UpdateRestrictionMember(address(uint160(OTHER_CHAIN_ID)).toBytes32(), type(uint64).max).serialize(
             )
         );
 
         // fails for invalid share class token
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         vm.expectRevert(IPoolManager.UnknownToken.selector);
         poolManager.transferShares{value: defaultGas}(OTHER_CHAIN_ID, poolId + 1, scId, centChainAddress, amount);
 
@@ -304,7 +304,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
         (, address vault_,) = deploySimpleVault(VaultKind.Async);
         AsyncVault vault = AsyncVault(vault_);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
 
         IShareToken shareToken = IShareToken(address(vault.share()));
 
@@ -335,12 +335,12 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
 
         poolManager.updateRestriction(
             PoolId.wrap(vault.poolId()),
-            ShareClassId.wrap(vault.trancheId()),
+            ShareClassId.wrap(vault.scId()),
             MessageLib.UpdateRestrictionMember(destinationAddress.toBytes32(), validUntil).serialize()
         );
         poolManager.updateRestriction(
             PoolId.wrap(vault.poolId()),
-            ShareClassId.wrap(vault.trancheId()),
+            ShareClassId.wrap(vault.scId()),
             MessageLib.UpdateRestrictionMember(address(this).toBytes32(), validUntil).serialize()
         );
         assertTrue(shareToken.checkTransferRestriction(address(0), address(this), 0));
@@ -348,20 +348,20 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
 
         // Fund this address with samount
         poolManager.handleTransferShares(
-            PoolId.wrap(vault.poolId()), ShareClassId.wrap(vault.trancheId()), address(this), amount
+            PoolId.wrap(vault.poolId()), ShareClassId.wrap(vault.scId()), address(this), amount
         );
         assertEq(shareToken.balanceOf(address(this)), amount);
 
         poolManager.updateRestriction(
             PoolId.wrap(vault.poolId()),
-            ShareClassId.wrap(vault.trancheId()),
+            ShareClassId.wrap(vault.scId()),
             MessageLib.UpdateRestrictionMember(address(uint160(OTHER_CHAIN_ID)).toBytes32(), type(uint64).max).serialize(
             )
         );
 
         // fails for invalid share class token
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         vm.expectRevert(IPoolManager.UnknownToken.selector);
         poolManager.transferShares{value: defaultGas}(
             OTHER_CHAIN_ID, poolId + 1, scId, destinationAddress.toBytes32(), amount
@@ -369,7 +369,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
 
         // Transfer amount from this address to destinationAddress
         poolManager.transferShares{value: defaultGas}(
-            OTHER_CHAIN_ID, vault.poolId(), vault.trancheId(), destinationAddress.toBytes32(), amount
+            OTHER_CHAIN_ID, vault.poolId(), vault.scId(), destinationAddress.toBytes32(), amount
         );
         assertEq(shareToken.balanceOf(address(this)), 0);
     }
@@ -381,7 +381,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
         IShareToken shareToken = IShareToken(address(AsyncVault(vault_).share()));
 
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         IRestrictedTransfers hook = IRestrictedTransfers(shareToken.hook());
         vm.expectRevert(IAuth.NotAuthorized.selector);
         vm.prank(randomUser);
@@ -413,7 +413,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
         (, address vault_,) = deploySimpleVault(VaultKind.Async);
         AsyncVault vault = AsyncVault(vault_);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         IShareToken shareToken = IShareToken(address(AsyncVault(vault_).share()));
         uint64 validUntil = uint64(block.timestamp + 7 days);
         address secondUser = makeAddr("secondUser");
@@ -484,7 +484,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
         (, address vault_,) = deploySimpleVault(VaultKind.Async);
         AsyncVault vault = AsyncVault(vault_);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         IShareToken shareToken = IShareToken(address(AsyncVault(vault_).share()));
 
         string memory updatedTokenName = "newName";
@@ -520,7 +520,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
         (, address vault_,) = deploySimpleVault(VaultKind.Async);
         AsyncVault vault = AsyncVault(vault_);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         IShareToken shareToken = IShareToken(address(AsyncVault(vault_).share()));
 
         address newHook = makeAddr("NewHook");
@@ -545,7 +545,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
         (, address vault_,) = deploySimpleVault(VaultKind.Async);
         AsyncVault vault = AsyncVault(vault_);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         IShareToken shareToken = IShareToken(address(AsyncVault(vault_).share()));
 
         bytes memory update = MessageLib.UpdateRestrictionFreeze(makeAddr("User").toBytes32()).serialize();
@@ -643,7 +643,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
 
         AsyncVault oldVault = AsyncVault(oldVault_);
         uint64 poolId = oldVault.poolId();
-        bytes16 scId = oldVault.trancheId();
+        bytes16 scId = oldVault.scId();
         address asset = address(oldVault.asset());
 
         AsyncVaultFactory newVaultFactory = new AsyncVaultFactory(address(root), address(asyncRequests), address(this));
@@ -675,12 +675,12 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
 
         poolManager.updateRestriction(
             PoolId.wrap(vault.poolId()),
-            ShareClassId.wrap(vault.trancheId()),
+            ShareClassId.wrap(vault.scId()),
             MessageLib.UpdateRestrictionMember(destinationAddress.toBytes32(), validUntil).serialize()
         );
         poolManager.updateRestriction(
             PoolId.wrap(vault.poolId()),
-            ShareClassId.wrap(vault.trancheId()),
+            ShareClassId.wrap(vault.scId()),
             MessageLib.UpdateRestrictionMember(address(this).toBytes32(), validUntil).serialize()
         );
 
@@ -689,13 +689,13 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
 
         // Fund this address with amount
         poolManager.handleTransferShares(
-            PoolId.wrap(vault.poolId()), ShareClassId.wrap(vault.trancheId()), address(this), amount
+            PoolId.wrap(vault.poolId()), ShareClassId.wrap(vault.scId()), address(this), amount
         );
         assertEq(shareToken.balanceOf(address(this)), amount);
 
         // fails for invalid share class token
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
 
         poolManager.updateRestriction(
             PoolId.wrap(poolId),
@@ -711,7 +711,7 @@ contract PoolManagerTest is BaseTest, PoolManagerTestHelper {
 
         poolManager.updateRestriction(
             PoolId.wrap(vault.poolId()),
-            ShareClassId.wrap(vault.trancheId()),
+            ShareClassId.wrap(vault.scId()),
             MessageLib.UpdateRestrictionMember(address(uint160(OTHER_CHAIN_ID)).toBytes32(), type(uint64).max).serialize(
             )
         );
@@ -787,7 +787,7 @@ contract PoolManagerDeployVaultTest is BaseTest, PoolManagerTestHelper {
             assertEq(address(vault.manager()), address(asyncRequests), "investment manager mismatch");
             assertEq(vault.asset(), asset, "asset mismatch");
             assertEq(vault.poolId(), poolId, "poolId mismatch");
-            assertEq(vault.trancheId(), scId, "scId mismatch");
+            assertEq(vault.scId(), scId, "scId mismatch");
             assertEq(address(vault.share()), token_, "share class token mismatch");
 
             assertEq(vault.wards(address(asyncRequests)), 1);
diff --git a/test/vaults/integration/Redeem.t.sol b/test/vaults/integration/Redeem.t.sol
index fc523198e..fe0c3c657 100644
--- a/test/vaults/integration/Redeem.t.sol
+++ b/test/vaults/integration/Redeem.t.sol
@@ -25,30 +25,28 @@ contract RedeemTest is BaseTest {
         IShareToken shareToken = IShareToken(address(vault.share()));
 
         deposit(vault_, self, amount); // deposit funds first
-        centrifugeChain.updatePricePoolPerShare(
-            vault.poolId(), vault.trancheId(), defaultPrice, uint64(block.timestamp)
-        );
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), defaultPrice, uint64(block.timestamp));
 
         // will fail - zero deposit not allowed
         vm.expectRevert(IAsyncRequests.ZeroAmountNotAllowed.selector);
         vault.requestRedeem(0, self, self);
 
         // will fail - investment asset not allowed
-        centrifugeChain.unlinkVault(vault.poolId(), vault.trancheId(), vault_);
+        centrifugeChain.unlinkVault(vault.poolId(), vault.scId(), vault_);
         vm.expectRevert(IAuth.NotAuthorized.selector);
         vault.requestRedeem(amount, address(this), address(this));
 
         // will fail - cannot fulfill if there is no pending redeem request
         uint128 assets = uint128((amount * 10 ** 18) / defaultPrice);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         vm.expectRevert(IAsyncRequests.NoPendingRequest.selector);
         asyncRequests.fulfillRedeemRequest(
             PoolId.wrap(poolId), ShareClassId.wrap(scId), self, AssetId.wrap(assetId), assets, uint128(amount)
         );
 
         // success
-        centrifugeChain.linkVault(vault.poolId(), vault.trancheId(), vault_);
+        centrifugeChain.linkVault(vault.poolId(), vault.scId(), vault_);
         vault.requestRedeem(amount, address(this), address(this));
         assertEq(shareToken.balanceOf(address(escrow)), amount);
         assertEq(vault.pendingRedeemRequest(0, self), amount);
@@ -60,7 +58,7 @@ contract RedeemTest is BaseTest {
 
         // trigger executed collectRedeem
         centrifugeChain.isFulfilledRedeemRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(self)), assetId, assets, uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(self)), assetId, assets, uint128(amount)
         );
 
         // assert withdraw & redeem values adjusted
@@ -75,7 +73,7 @@ contract RedeemTest is BaseTest {
         vault.redeem(amount / 2, self, self); // redeem half the amount to own wallet
 
         // can also redeem to another user on the memberlist
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
         vault.redeem(amount / 2, investor, self); // redeem half the amount to investor wallet
 
         assertEq(shareToken.balanceOf(self), 0);
@@ -102,9 +100,7 @@ contract RedeemTest is BaseTest {
         IShareToken shareToken = IShareToken(address(vault.share()));
 
         deposit(vault_, self, amount); // deposit funds first
-        centrifugeChain.updatePricePoolPerShare(
-            vault.poolId(), vault.trancheId(), defaultPrice, uint64(block.timestamp)
-        );
+        centrifugeChain.updatePricePoolPerShare(vault.poolId(), vault.scId(), defaultPrice, uint64(block.timestamp));
 
         vault.requestRedeem(amount, address(this), address(this));
         assertEq(shareToken.balanceOf(address(escrow)), amount);
@@ -113,7 +109,7 @@ contract RedeemTest is BaseTest {
         // trigger executed collectRedeem
         uint128 assets = uint128((amount * 10 ** 18) / defaultPrice);
         centrifugeChain.isFulfilledRedeemRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(self)), assetId, assets, uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(self)), assetId, assets, uint128(amount)
         );
 
         // assert withdraw & redeem values adjusted
@@ -126,7 +122,7 @@ contract RedeemTest is BaseTest {
         vault.withdraw(amount / 2, self, self); // redeem half the amount to own wallet
 
         // can also withdraw to another user on the memberlist
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
         vault.withdraw(amount / 2, investor, self); // redeem half the amount to investor wallet
 
         assertTrue(shareToken.balanceOf(self) <= 1);
@@ -178,11 +174,11 @@ contract RedeemTest is BaseTest {
         vault.requestRedeem(amount, address(this), address(this));
 
         // will fail - user not member
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, uint64(block.timestamp));
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, uint64(block.timestamp));
         vm.warp(block.timestamp + 1);
         vm.expectRevert(IAsyncRequests.TransferNotAllowed.selector);
         vault.cancelRedeemRequest(0, self);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
 
         assertEq(shareToken.balanceOf(address(escrow)), amount);
         assertEq(shareToken.balanceOf(self), amount);
@@ -192,7 +188,7 @@ contract RedeemTest is BaseTest {
 
         MessageLib.CancelRedeemRequest memory m = adapter1.values_bytes("send").deserializeCancelRedeemRequest();
         assertEq(m.poolId, vault.poolId());
-        assertEq(m.scId, vault.trancheId());
+        assertEq(m.scId, vault.scId());
         assertEq(m.investor, bytes32(bytes20(self)));
         assertEq(m.assetId, assetId);
 
@@ -206,7 +202,7 @@ contract RedeemTest is BaseTest {
         vault.requestRedeem(amount, address(this), address(this));
 
         centrifugeChain.isFulfilledCancelRedeemRequest(
-            vault.poolId(), vault.trancheId(), self.toBytes32(), assetId, uint128(amount)
+            vault.poolId(), vault.scId(), self.toBytes32(), assetId, uint128(amount)
         );
 
         assertEq(shareToken.balanceOf(address(escrow)), amount);
@@ -227,7 +223,7 @@ contract RedeemTest is BaseTest {
         deposit(vault_, investor, amount, false); // request and execute deposit, but don't claim
         assertEq(vault.maxMint(investor), amount);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
 
         vm.prank(investor);
         vault.mint(amount / 2, investor); // investor mints half of the amount
@@ -261,7 +257,7 @@ contract RedeemTest is BaseTest {
         assertEq(vault.maxMint(investor), 0);
 
         centrifugeChain.isFulfilledRedeemRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
         );
 
         vm.expectRevert(IAsyncRequests.ExceedsMaxRedeem.selector);
@@ -279,7 +275,7 @@ contract RedeemTest is BaseTest {
         deposit(vault_, investor, amount, false); // request and execute deposit, but don't claim
         assertEq(vault.maxMint(investor), amount);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
 
         vm.prank(investor);
         vault.mint(amount, investor); // investor mints half of the amount
@@ -314,7 +310,7 @@ contract RedeemTest is BaseTest {
         deposit(vault_, investor, amount, false); // request and execute deposit, but don't claim
         assertEq(vault.maxMint(investor), amount);
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
 
         // Fail - Redeem amount too big
         vm.expectRevert(IERC20.InsufficientBalance.selector);
@@ -342,7 +338,7 @@ contract RedeemTest is BaseTest {
         assertEq(vault.maxMint(investor), 0);
 
         centrifugeChain.isFulfilledRedeemRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(investor)), assetId, uint128(amount), uint128(amount)
         );
 
         vm.expectRevert(IAsyncRequests.ExceedsMaxRedeem.selector);
@@ -355,7 +351,7 @@ contract RedeemTest is BaseTest {
         AsyncVault vault = AsyncVault(vault_);
         IShareToken shareToken = IShareToken(address(vault.share()));
         uint64 poolId = vault.poolId();
-        bytes16 scId = vault.trancheId();
+        bytes16 scId = vault.scId();
         ERC20 asset = ERC20(address(vault.asset()));
         centrifugeChain.updatePricePoolPerShare(poolId, scId, 1000000000000000000, uint64(block.timestamp));
 
diff --git a/test/vaults/integration/SyncDeposit.t.sol b/test/vaults/integration/SyncDeposit.t.sol
index adb54925a..45358c3ee 100644
--- a/test/vaults/integration/SyncDeposit.t.sol
+++ b/test/vaults/integration/SyncDeposit.t.sol
@@ -35,10 +35,10 @@ contract SyncDepositTestHelper is BaseTest {
         syncVault = SyncDepositVault(syncVault_);
 
         centrifugeChain.updatePricePoolPerShare(
-            syncVault.poolId(), syncVault.trancheId(), pricePoolPerShare.inner(), uint64(block.timestamp)
+            syncVault.poolId(), syncVault.scId(), pricePoolPerShare.inner(), uint64(block.timestamp)
         );
         centrifugeChain.updatePricePoolPerAsset(
-            syncVault.poolId(), syncVault.trancheId(), assetId, pricePoolPerAsset.inner(), uint64(block.timestamp)
+            syncVault.poolId(), syncVault.scId(), assetId, pricePoolPerAsset.inner(), uint64(block.timestamp)
         );
     }
 
@@ -46,7 +46,7 @@ contract SyncDepositTestHelper is BaseTest {
         internal
     {
         PoolId poolId = PoolId.wrap(vault.poolId());
-        ShareClassId scId = ShareClassId.wrap(vault.trancheId());
+        ShareClassId scId = ShareClassId.wrap(vault.scId());
         uint64 timestamp = uint64(block.timestamp);
         uint128 depositAssetAmount = vault.previewMint(shares).toUint128();
         VaultDetails memory vaultDetails = poolManager.vaultDetails(address(vault));
@@ -92,7 +92,7 @@ contract SyncDepositTest is SyncDepositTestHelper {
 
         // Retrieve async vault
         address asyncVault_ =
-            syncVault.asyncRedeemManager().vaultByAssetId(syncVault.poolId(), syncVault.trancheId(), assetId);
+            syncVault.asyncRedeemManager().vaultByAssetId(syncVault.poolId(), syncVault.scId(), assetId);
         assertNotEq(address(syncVault), address(0), "Failed to retrieve async vault");
         AsyncVault asyncVault = AsyncVault(asyncVault_);
 
@@ -114,18 +114,16 @@ contract SyncDepositTest is SyncDepositTestHelper {
         syncVault.deposit(amount, self);
 
         assertEq(syncVault.isPermissioned(self), false);
-        centrifugeChain.updateMember(syncVault.poolId(), syncVault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(syncVault.poolId(), syncVault.scId(), self, type(uint64).max);
         assertEq(syncVault.isPermissioned(self), true);
 
         // Will fail - above max reserve
-        centrifugeChain.updateMaxReserve(
-            syncVault.poolId(), syncVault.trancheId(), address(syncVault), uint128(amount / 2)
-        );
+        centrifugeChain.updateMaxReserve(syncVault.poolId(), syncVault.scId(), address(syncVault), uint128(amount / 2));
 
         vm.expectRevert(ISyncRequests.ExceedsMaxReserve.selector);
         syncVault.deposit(amount, self);
 
-        centrifugeChain.updateMaxReserve(syncVault.poolId(), syncVault.trancheId(), address(syncVault), uint128(amount));
+        centrifugeChain.updateMaxReserve(syncVault.poolId(), syncVault.scId(), address(syncVault), uint128(amount));
 
         _assertDepositEvents(syncVault, shares.toUint128(), pricePoolPerShare, priceAssetPerShare);
         syncVault.deposit(amount, self);
diff --git a/test/vaults/integration/SyncRequests.t.sol b/test/vaults/integration/SyncRequests.t.sol
index 00104eec7..98d5cbd90 100644
--- a/test/vaults/integration/SyncRequests.t.sol
+++ b/test/vaults/integration/SyncRequests.t.sol
@@ -34,18 +34,18 @@ contract SyncRequestsBaseTest is BaseTest {
         syncVault = SyncDepositVault(syncVault_);
 
         centrifugeChain.updatePricePoolPerShare(
-            syncVault.poolId(), syncVault.trancheId(), pricePoolPerShare.inner(), uint64(block.timestamp)
+            syncVault.poolId(), syncVault.scId(), pricePoolPerShare.inner(), uint64(block.timestamp)
         );
         centrifugeChain.updatePricePoolPerAsset(
-            syncVault.poolId(), syncVault.trancheId(), assetId, pricePoolPerAsset.inner(), uint64(block.timestamp)
+            syncVault.poolId(), syncVault.scId(), assetId, pricePoolPerAsset.inner(), uint64(block.timestamp)
         );
     }
 
     function _setValuation(SyncDepositVault vault, address valuation_, uint256 tokenId) internal {
         vm.expectEmit();
-        emit ISyncRequests.SetValuation(vault.poolId(), vault.trancheId(), vault.asset(), tokenId, valuation_);
-        syncRequests.setValuation(vault.poolId(), vault.trancheId(), vault.asset(), tokenId, valuation_);
-        assertEq(address(syncRequests.valuation(vault.poolId(), vault.trancheId(), vault.asset(), tokenId)), valuation_);
+        emit ISyncRequests.SetValuation(vault.poolId(), vault.scId(), vault.asset(), tokenId, valuation_);
+        syncRequests.setValuation(vault.poolId(), vault.scId(), vault.asset(), tokenId, valuation_);
+        assertEq(address(syncRequests.valuation(vault.poolId(), vault.scId(), vault.asset(), tokenId)), valuation_);
     }
 }
 
@@ -150,8 +150,7 @@ contract SyncRequestsPrices is SyncRequestsBaseTest {
 
         (SyncDepositVault syncVault, uint128 assetId) = _deploySyncDepositVault(pricePoolPerShare, pricePoolPerAsset);
 
-        Prices memory prices =
-            syncRequests.prices(syncVault.poolId(), syncVault.trancheId(), assetId, syncVault.asset(), 0);
+        Prices memory prices = syncRequests.prices(syncVault.poolId(), syncVault.scId(), assetId, syncVault.asset(), 0);
         assertEq(prices.assetPerShare.inner(), priceAssetPerShare.inner(), "priceAssetPerShare mismatch");
         assertEq(prices.poolPerShare.inner(), pricePoolPerShare.inner(), "pricePoolPerShare mismatch");
         assertEq(prices.poolPerAsset.inner(), pricePoolPerAsset.inner(), "pricePoolPerAsset mismatch");
@@ -175,8 +174,8 @@ contract SyncRequestsUpdateValuation is SyncRequestsBaseTest {
         D18 priceAssetPerShare = d18(2e18);
 
         (SyncDepositVault syncVault, uint128 assetId) = _deploySyncDepositVault(pricePoolPerShare, pricePoolPerAsset);
-        address shareToken = poolManager.shareToken(syncVault.poolId(), syncVault.trancheId());
-        D18 pricePre = syncRequests.priceAssetPerShare(syncVault.poolId(), syncVault.trancheId(), assetId);
+        address shareToken = poolManager.shareToken(syncVault.poolId(), syncVault.scId());
+        D18 pricePre = syncRequests.priceAssetPerShare(syncVault.poolId(), syncVault.scId(), assetId);
 
         _setValuation(syncVault, valuation_, 0);
 
@@ -193,9 +192,8 @@ contract SyncRequestsUpdateValuation is SyncRequestsBaseTest {
             abi.encode(assetPerShareAmount)
         );
 
-        Prices memory prices =
-            syncRequests.prices(syncVault.poolId(), syncVault.trancheId(), assetId, syncVault.asset(), 0);
-        D18 pricePost = syncRequests.priceAssetPerShare(syncVault.poolId(), syncVault.trancheId(), assetId);
+        Prices memory prices = syncRequests.prices(syncVault.poolId(), syncVault.scId(), assetId, syncVault.asset(), 0);
+        D18 pricePost = syncRequests.priceAssetPerShare(syncVault.poolId(), syncVault.scId(), assetId);
         assertEq(prices.assetPerShare.inner(), priceAssetPerShare.inner(), "priceAssetPerShare mismatch");
         assertEq(prices.assetPerShare.inner(), pricePost.inner(), "priceAssetPerShare vs pricePost mismatch");
         assertNotEq(prices.assetPerShare.inner(), pricePre.inner());
@@ -215,8 +213,8 @@ contract SyncRequestsUpdateValuation is SyncRequestsBaseTest {
         uint128 multiplier = uint128(bound(multiplier_, 2, 10));
 
         (SyncDepositVault syncVault, uint128 assetId) = _deploySyncDepositVault(pricePoolPerShare, pricePoolPerAsset);
-        address shareToken = poolManager.shareToken(syncVault.poolId(), syncVault.trancheId());
-        D18 pricePre = syncRequests.priceAssetPerShare(syncVault.poolId(), syncVault.trancheId(), assetId);
+        address shareToken = poolManager.shareToken(syncVault.poolId(), syncVault.scId());
+        D18 pricePre = syncRequests.priceAssetPerShare(syncVault.poolId(), syncVault.scId(), assetId);
 
         _setValuation(syncVault, valuation_, 0);
 
@@ -234,9 +232,8 @@ contract SyncRequestsUpdateValuation is SyncRequestsBaseTest {
             abi.encode(assetPerShareAmount)
         );
 
-        Prices memory prices =
-            syncRequests.prices(syncVault.poolId(), syncVault.trancheId(), assetId, syncVault.asset(), 0);
-        D18 pricePost = syncRequests.priceAssetPerShare(syncVault.poolId(), syncVault.trancheId(), assetId);
+        Prices memory prices = syncRequests.prices(syncVault.poolId(), syncVault.scId(), assetId, syncVault.asset(), 0);
+        D18 pricePost = syncRequests.priceAssetPerShare(syncVault.poolId(), syncVault.scId(), assetId);
         assertEq(
             prices.assetPerShare.inner(), priceAssetPerShare.inner(), "assetPerShare vs priceAssetPerShare mismatch"
         );
@@ -252,7 +249,7 @@ contract SyncRequestsUpdateValuation is SyncRequestsBaseTest {
         D18 priceAssetPerShare = d18(2e18);
 
         (SyncDepositVault syncVault,) = _deploySyncDepositVault(pricePoolPerShare, pricePoolPerAsset);
-        address shareToken = poolManager.shareToken(syncVault.poolId(), syncVault.trancheId());
+        address shareToken = poolManager.shareToken(syncVault.poolId(), syncVault.scId());
         _setValuation(syncVault, valuation_, 0);
 
         // Mock valuation
@@ -278,7 +275,7 @@ contract SyncRequestsUpdateValuation is SyncRequestsBaseTest {
         D18 priceAssetPerShare = pricePoolPerShare / pricePoolPerAsset;
 
         (SyncDepositVault syncVault,) = _deploySyncDepositVault(pricePoolPerShare, pricePoolPerAsset);
-        address shareToken = poolManager.shareToken(syncVault.poolId(), syncVault.trancheId());
+        address shareToken = poolManager.shareToken(syncVault.poolId(), syncVault.scId());
         _setValuation(syncVault, valuation_, 0);
 
         // Mock valuation
diff --git a/test/vaults/integration/VaultRouter.t.sol b/test/vaults/integration/VaultRouter.t.sol
index 62b397dd8..7da1b3aaf 100644
--- a/test/vaults/integration/VaultRouter.t.sol
+++ b/test/vaults/integration/VaultRouter.t.sol
@@ -54,7 +54,7 @@ contract VaultRouterTest is BaseTest {
         vaultRouter.enable(vault_);
         vm.expectRevert(IAsyncRequests.TransferNotAllowed.selector);
         vaultRouter.requestDeposit{value: 1 wei}(vault_, amount, self, self);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
 
         uint256 gas = estimateGas() + GAS_BUFFER;
 
@@ -152,7 +152,7 @@ contract VaultRouterTest is BaseTest {
 
         erc20.mint(self, amount);
         erc20.approve(address(vaultRouter), amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         vaultRouter.enableLockDepositRequest(vault_, amount);
 
         uint256 fuel = estimateGas();
@@ -200,7 +200,7 @@ contract VaultRouterTest is BaseTest {
         vm.label(vault_, "vault");
         erc20.mint(self, amount);
         erc20.approve(vault_, amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         if (snap) {
             vm.startSnapshotGas("VaultRouter", "enable");
         }
@@ -350,7 +350,7 @@ contract VaultRouterTest is BaseTest {
 
         erc20.mint(self, amount);
         erc20.approve(address(vaultRouter), amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         vaultRouter.enable(address(vault_));
         if (snap) {
             vm.startSnapshotGas("VaultRouter", "lockDepositRequest");
@@ -384,7 +384,7 @@ contract VaultRouterTest is BaseTest {
         vm.label(vault_, "vault");
         erc20.mint(self, amount);
         erc20.approve(vault_, amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         vaultRouter.enable(vault_);
 
         uint256 fuel = estimateGas();
@@ -452,7 +452,7 @@ contract VaultRouterTest is BaseTest {
 
         address investor = makeAddr("investor");
         vm.deal(investor, 10 ether);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
 
         erc20.mint(investor, amount);
         vm.startPrank(investor);
@@ -488,7 +488,7 @@ contract VaultRouterTest is BaseTest {
         vm.label(vault_, "vault");
 
         address investor = makeAddr("investor");
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
         vaultRouter.enable(vault_);
 
         erc20.mint(investor, amount);
@@ -518,7 +518,7 @@ contract VaultRouterTest is BaseTest {
         vm.label(vault_, "vault");
 
         address investor = makeAddr("investor");
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
         vaultRouter.enable(vault_);
 
         erc20.mint(investor, amount);
@@ -558,7 +558,7 @@ contract VaultRouterTest is BaseTest {
         uint256 fuel = 2 * estimateGas();
 
         // Anyone else can execute the request and claim the deposit
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), investor, type(uint64).max);
         vaultRouter.executeLockedDepositRequest{value: fuel}(vault_, investor);
         (uint128 sharePayout) = fulfillDepositRequest(vault, assetId, amount, investor);
 
@@ -676,7 +676,7 @@ contract VaultRouterTest is BaseTest {
 
         erc20.mint(self, amount);
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         erc20.approve(vault_, amount);
         vaultRouter.enable(vault_);
 
@@ -707,7 +707,7 @@ contract VaultRouterTest is BaseTest {
         assertApproxEqAbs(sharePayout, amount / 2, 2);
 
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(user)), assetId, uint128(amount), sharePayout
+            vault.poolId(), vault.scId(), bytes32(bytes20(user)), assetId, uint128(amount), sharePayout
         );
     }
 
@@ -720,7 +720,7 @@ contract VaultRouterTest is BaseTest {
         assertApproxEqAbs(assetPayout, amount * 2, 2);
 
         centrifugeChain.isFulfilledRedeemRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(user)), assetId, assetPayout, uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(user)), assetId, assetPayout, uint128(amount)
         );
     }
 
@@ -747,8 +747,8 @@ contract VaultRouterTest is BaseTest {
         erc20X.approve(address(vault1_), amount1);
         erc20Y.approve(address(vault2_), amount2);
 
-        centrifugeChain.updateMember(vault1.poolId(), vault1.trancheId(), self, type(uint64).max);
-        centrifugeChain.updateMember(vault2.poolId(), vault2.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault1.poolId(), vault1.scId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault2.poolId(), vault2.scId(), self, type(uint64).max);
     }
 
     function testReentrancyCheck(uint256 amount) public {
diff --git a/test/vaults/unit/AsyncVault.t.sol b/test/vaults/unit/AsyncVault.t.sol
index 0752bc166..8c48b5815 100644
--- a/test/vaults/unit/AsyncVault.t.sol
+++ b/test/vaults/unit/AsyncVault.t.sol
@@ -20,7 +20,7 @@ contract AsyncVaultTest is BaseTest {
         // values set correctly
         assertEq(address(vault.manager()), address(asyncRequests));
         assertEq(vault.asset(), address(erc20));
-        assertEq(vault.trancheId(), scId);
+        assertEq(vault.scId(), scId);
         address token = poolManager.shareToken(poolId, scId);
         assertEq(address(vault.share()), token);
 
diff --git a/test/vaults/unit/VaultRouter.t.sol b/test/vaults/unit/VaultRouter.t.sol
index 24bb921b6..8a50584d4 100644
--- a/test/vaults/unit/VaultRouter.t.sol
+++ b/test/vaults/unit/VaultRouter.t.sol
@@ -52,7 +52,7 @@ contract VaultRouterTest is BaseTest {
         AsyncVault vault = AsyncVault(vault_);
         vm.label(vault_, "vault");
 
-        assertEq(vaultRouter.getVault(vault.poolId(), vault.trancheId(), address(erc20)), vault_);
+        assertEq(vaultRouter.getVault(vault.poolId(), vault.scId(), address(erc20)), vault_);
     }
 
     function testRequestDeposit() public {
@@ -62,7 +62,7 @@ contract VaultRouterTest is BaseTest {
         uint256 amount = 100 * 10 ** 18;
         erc20.mint(self, amount);
         erc20.approve(address(vault_), amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         uint256 gas = estimateGas();
 
         vm.expectRevert(IAsyncVault.InvalidOwner.selector);
@@ -136,7 +136,7 @@ contract VaultRouterTest is BaseTest {
         vm.expectRevert(IAsyncRequests.NoPendingRequest.selector);
         vaultRouter.cancelDepositRequest{value: fuel}(vault_);
 
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         vaultRouter.executeLockedDepositRequest{value: fuel}(vault_, self);
         assertEq(vault.pendingDepositRequest(0, self), amount);
 
@@ -156,7 +156,7 @@ contract VaultRouterTest is BaseTest {
 
         erc20.mint(self, amount);
         erc20.approve(address(vault_), amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
 
         uint256 gas = estimateGas() + GAS_BUFFER;
         vaultRouter.enable(vault_);
@@ -167,7 +167,7 @@ contract VaultRouterTest is BaseTest {
         assertEq(vault.pendingCancelDepositRequest(0, self), true);
         assertEq(erc20.balanceOf(address(escrow)), amount);
         centrifugeChain.isFulfilledCancelDepositRequest(
-            vault.poolId(), vault.trancheId(), self.toBytes32(), assetId, uint128(amount)
+            vault.poolId(), vault.scId(), self.toBytes32(), assetId, uint128(amount)
         );
         assertEq(vault.claimableCancelDepositRequest(0, self), amount);
 
@@ -192,13 +192,13 @@ contract VaultRouterTest is BaseTest {
         uint256 amount = 100 * 10 ** 18;
         erc20.mint(self, amount);
         erc20.approve(address(vault_), amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         uint256 gas = estimateGas();
         vaultRouter.enable(vault_);
         vaultRouter.requestDeposit{value: gas}(vault_, amount, self, self);
         IERC20 share = IERC20(address(vault.share()));
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(self)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(self)), assetId, uint128(amount), uint128(amount)
         );
         vault.deposit(amount, self, self);
         assertEq(share.balanceOf(address(self)), amount);
@@ -221,13 +221,13 @@ contract VaultRouterTest is BaseTest {
         uint256 amount = 100 * 10 ** 18;
         erc20.mint(self, amount);
         erc20.approve(address(vault_), amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         uint256 gas = estimateGas();
         vaultRouter.enable(vault_);
         vaultRouter.requestDeposit{value: gas}(vault_, amount, self, self);
         IERC20 share = IERC20(address(vault.share()));
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(self)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(self)), assetId, uint128(amount), uint128(amount)
         );
         vault.deposit(amount, self, self);
         assertEq(share.balanceOf(address(self)), amount);
@@ -254,13 +254,13 @@ contract VaultRouterTest is BaseTest {
         uint256 amount = 100 * 10 ** 18;
         erc20.mint(self, amount);
         erc20.approve(address(vault_), amount);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
         uint256 gas = estimateGas() + GAS_BUFFER;
         vaultRouter.enable(vault_);
         vaultRouter.requestDeposit{value: gas}(vault_, amount, self, self);
         IERC20 share = IERC20(address(vault.share()));
         centrifugeChain.isFulfilledDepositRequest(
-            vault.poolId(), vault.trancheId(), bytes32(bytes20(self)), assetId, uint128(amount), uint128(amount)
+            vault.poolId(), vault.scId(), bytes32(bytes20(self)), assetId, uint128(amount), uint128(amount)
         );
         vault.deposit(amount, self, self);
         assertEq(share.balanceOf(address(self)), amount);
@@ -275,7 +275,7 @@ contract VaultRouterTest is BaseTest {
         assertEq(vault.pendingCancelRedeemRequest(0, self), true);
 
         centrifugeChain.isFulfilledCancelRedeemRequest(
-            vault.poolId(), vault.trancheId(), self.toBytes32(), assetId, uint128(amount)
+            vault.poolId(), vault.scId(), self.toBytes32(), assetId, uint128(amount)
         );
 
         address sender = makeAddr("maliciousUser");
@@ -409,7 +409,7 @@ contract VaultRouterTest is BaseTest {
 
         vm.expectRevert(IAsyncRequests.TransferNotAllowed.selector);
         vaultRouter.executeLockedDepositRequest{value: gasLimit}(vault_, self);
-        centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max);
+        centrifugeChain.updateMember(vault.poolId(), vault.scId(), self, type(uint64).max);
 
         canUserExecute = vaultRouter.hasPermissions(vault_, self);
         assertTrue(canUserExecute);


Reviews:
user: login: lemunozm
body: LGTM! Just a CR, IIUC
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T10:58:36Z
user: login: lemunozm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T10:59:54Z
user: login: mustermeiszer
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T11:05:40Z
user: login: lemunozm
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T11:17:38Z
user: login: lemunozm
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T11:29:20Z
user: login: lemunozm
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T11:45:12Z

Review comments:
diff_hunk: @@ -35,18 +35,18 @@ contract SyncDepositTestHelper is BaseTest {
         syncVault = SyncDepositVault(syncVault_);
 
         centrifugeChain.updatePricePoolPerShare(
-            syncVault.poolId(), syncVault.trancheId(), pricePoolPerShare.inner(), uint64(block.timestamp)
+            syncVault.poolId(), syncVault.scId(), pricePoolPerShare.inner(), uint64(block.timestamp)
         );
         centrifugeChain.updatePricePoolPerAsset(
-            syncVault.poolId(), syncVault.trancheId(), assetId, pricePoolPerAsset.inner(), uint64(block.timestamp)
+            syncVault.poolId(), syncVault.scId(), assetId, pricePoolPerAsset.inner(), uint64(block.timestamp)
         );
     }
 
     function _assertDepositEvents(SyncDepositVault vault, uint128 shares, D18 pricePoolPerShare, D18 priceAssetPerShare)
         internal
     {
         PoolId poolId = PoolId.wrap(vault.poolId());
-        ShareClassId scId = ShareClassId.wrap(vault.trancheId());
path: test/vaults/integration/SyncDeposit.t.sol
user: login: lemunozm
body: Thanks for the renaming
created_at: 2025-04-22T10:53:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,205 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.28;
+
+import {IERC7540} from "src/vaults/legacy/interfaces/IERC7540.sol";
+import {IInvestmentManager} from "src/vaults/legacy/interfaces/IInvestmentManager.sol";
+import {ILegacyVaultAdapter} from "src/vaults/legacy/interfaces/ILegacyVaultAdapter.sol";
+import {AsyncVault} from "src/vaults/AsyncVault.sol";
+
+/// @title  LegacyVaultAdapter
+/// @notice An adapter connecting legacy ERC-7540 vaults from Centrifuge V2 to Centrifuge V3.
+///
+/// @dev This adapter acts as an `IInvestmentManager` for a single legacy `IERC7540` vault from Centrifuge V2. At the
+/// same time it acts like a new `IAsyncVault` for the `IAsyncRequests` manager of Centrifuge V3. The adapter needs to
+/// be deployed per legacy vault and allows a seamless interaction between Centrifuge V2 vaults and Centrifuge V3
+/// infrastructure. Thereby, allowing to migrate existing vaults to the new system.
+contract LegacyVaultAdapter is AsyncVault, ILegacyVaultAdapter, IInvestmentManager {
+    // No TokenId in legacy
+    uint256 constant LEGACY_TOKEN_ID = 0;
+
+    uint64 public immutable legacyPoolId;
+    bytes16 public immutable legacyTrancheId;
+    IERC7540 public immutable legacyVault;
+
+    constructor(
+        IERC7540 legacyVault_,
+        uint64 poolId,
+        uint64 legacyPoolId_,
+        bytes16 scId,
+        bytes16 legacyTrancheId_,
+        address asset,
+        address token,
+        address root,
+        address manager
+    ) AsyncVault(poolId, scId, asset, LEGACY_TOKEN_ID, token, root, manager) {
+        require(legacyVault_.poolId() == legacyPoolId_, NotLegacyPoolId(legacyPoolId_, legacyVault_.poolId()));
+        require(legacyVault_.trancheId() == legacyTrancheId_, NotLegacyscId(legacyTrancheId_, legacyVault_.trancheId()));
+        require(legacyVault_.asset() == asset, NotLegacyAsset(asset, legacyVault_.asset()));
+        require(legacyVault_.share() == token, NotLegacyShare(token, legacyVault_.share()));
+
+        legacyPoolId = legacyPoolId_;
+        legacyTrancheId = legacyTrancheId_;
+        legacyVault = legacyVault_;
+    }
+
+    /// @dev Check if the msg.sende_r is the legacyVault
+    modifier legacy() {
+        require(msg.sender == address(legacyVault), NotLegacyVault(msg.sender, address(legacyVault)));
+        _;
+    }
+
+    // --- IInvestmentManager impl ---
+    function escrow() public pure returns (address) {
+        // TODO: actually use the `IEscrowProvider` from the manager?
+        return address(0);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function requestDeposit(address, /* vault */ uint256 assets, address receiver, address owner, address source)
+        public
+        legacy
+        returns (bool)
+    {
+        return asyncManager().requestDeposit(address(this), assets, receiver, owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function requestRedeem(address, /* vault */ uint256 shares, address receiver, address owner, address source)
+        public
+        legacy
+        returns (bool)
+    {
+        return asyncManager().requestRedeem(address(this), shares, receiver, owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function cancelDepositRequest(address, /* vault */ address owner, address source) public legacy {
+        return asyncManager().cancelDepositRequest(address(this), owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function cancelRedeemRequest(address, /* vault */ address owner, address source) public legacy {
+        return asyncManager().cancelRedeemRequest(address(this), owner, source);
+    }
+
+    // --- IInvestmentManager - View functions ---
+    /// @inheritdoc IInvestmentManager
+    function convertToShares(address, /* vault */ uint256 _assets) public view returns (uint256 shares) {
+        shares = manager.convertToShares(address(this), _assets);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function convertToAssets(address, /* vault */ uint256 _shares) public view returns (uint256 assets) {
+        assets = manager.convertToAssets(address(this), _shares);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxDeposit(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().maxDeposit(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxMint(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().maxMint(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxWithdraw(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().maxWithdraw(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxRedeem(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().maxRedeem(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingDepositRequest(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().pendingDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingRedeemRequest(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().pendingRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingCancelDepositRequest(address, /* vault */ address user) public view returns (bool isPending) {
+        isPending = asyncManager().pendingCancelDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingCancelRedeemRequest(address, /* vault */ address user) public view returns (bool isPending) {
+        isPending = asyncManager().pendingCancelRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimableCancelDepositRequest(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().claimableCancelDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimableCancelRedeemRequest(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().claimableCancelRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function priceLastUpdated(address /* vault */ ) public view returns (uint64 lastUpdated) {
+        lastUpdated = manager.priceLastUpdated(address(this));
+    }
+
+    // --- IInvestmentManager - Vault claim functions ---
+    /// @inheritdoc IInvestmentManager
+    function deposit(address, /* vault */ uint256 assets, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 shares)
+    {
+        shares = asyncManager().deposit(address(this), assets, receiver, owner);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function mint(address, /* vault */ uint256 shares, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 assets)
+    {
+        assets = asyncManager().mint(address(this), shares, receiver, owner);
path: src/vaults/legacy/LegacyVaultAdapter.sol
user: login: lemunozm
body: Should not be the vault?

```suggestion
        assets = asyncManager().mint(vault, shares, receiver, owner);
```


created_at: 2025-04-22T10:58:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,205 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.28;
+
+import {IERC7540} from "src/vaults/legacy/interfaces/IERC7540.sol";
+import {IInvestmentManager} from "src/vaults/legacy/interfaces/IInvestmentManager.sol";
+import {ILegacyVaultAdapter} from "src/vaults/legacy/interfaces/ILegacyVaultAdapter.sol";
+import {AsyncVault} from "src/vaults/AsyncVault.sol";
+
+/// @title  LegacyVaultAdapter
+/// @notice An adapter connecting legacy ERC-7540 vaults from Centrifuge V2 to Centrifuge V3.
+///
+/// @dev This adapter acts as an `IInvestmentManager` for a single legacy `IERC7540` vault from Centrifuge V2. At the
+/// same time it acts like a new `IAsyncVault` for the `IAsyncRequests` manager of Centrifuge V3. The adapter needs to
+/// be deployed per legacy vault and allows a seamless interaction between Centrifuge V2 vaults and Centrifuge V3
+/// infrastructure. Thereby, allowing to migrate existing vaults to the new system.
+contract LegacyVaultAdapter is AsyncVault, ILegacyVaultAdapter, IInvestmentManager {
+    // No TokenId in legacy
+    uint256 constant LEGACY_TOKEN_ID = 0;
+
+    uint64 public immutable legacyPoolId;
+    bytes16 public immutable legacyTrancheId;
+    IERC7540 public immutable legacyVault;
+
+    constructor(
+        IERC7540 legacyVault_,
+        uint64 poolId,
+        uint64 legacyPoolId_,
+        bytes16 scId,
+        bytes16 legacyTrancheId_,
+        address asset,
+        address token,
+        address root,
+        address manager
+    ) AsyncVault(poolId, scId, asset, LEGACY_TOKEN_ID, token, root, manager) {
+        require(legacyVault_.poolId() == legacyPoolId_, NotLegacyPoolId(legacyPoolId_, legacyVault_.poolId()));
+        require(legacyVault_.trancheId() == legacyTrancheId_, NotLegacyscId(legacyTrancheId_, legacyVault_.trancheId()));
+        require(legacyVault_.asset() == asset, NotLegacyAsset(asset, legacyVault_.asset()));
+        require(legacyVault_.share() == token, NotLegacyShare(token, legacyVault_.share()));
+
+        legacyPoolId = legacyPoolId_;
+        legacyTrancheId = legacyTrancheId_;
+        legacyVault = legacyVault_;
+    }
+
+    /// @dev Check if the msg.sende_r is the legacyVault
+    modifier legacy() {
+        require(msg.sender == address(legacyVault), NotLegacyVault(msg.sender, address(legacyVault)));
+        _;
+    }
+
+    // --- IInvestmentManager impl ---
+    function escrow() public pure returns (address) {
+        // TODO: actually use the `IEscrowProvider` from the manager?
+        return address(0);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function requestDeposit(address, /* vault */ uint256 assets, address receiver, address owner, address source)
+        public
+        legacy
+        returns (bool)
+    {
+        return asyncManager().requestDeposit(address(this), assets, receiver, owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function requestRedeem(address, /* vault */ uint256 shares, address receiver, address owner, address source)
+        public
+        legacy
+        returns (bool)
+    {
+        return asyncManager().requestRedeem(address(this), shares, receiver, owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function cancelDepositRequest(address, /* vault */ address owner, address source) public legacy {
+        return asyncManager().cancelDepositRequest(address(this), owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function cancelRedeemRequest(address, /* vault */ address owner, address source) public legacy {
+        return asyncManager().cancelRedeemRequest(address(this), owner, source);
+    }
+
+    // --- IInvestmentManager - View functions ---
+    /// @inheritdoc IInvestmentManager
+    function convertToShares(address, /* vault */ uint256 _assets) public view returns (uint256 shares) {
+        shares = manager.convertToShares(address(this), _assets);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function convertToAssets(address, /* vault */ uint256 _shares) public view returns (uint256 assets) {
+        assets = manager.convertToAssets(address(this), _shares);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxDeposit(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().maxDeposit(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxMint(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().maxMint(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxWithdraw(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().maxWithdraw(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxRedeem(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().maxRedeem(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingDepositRequest(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().pendingDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingRedeemRequest(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().pendingRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingCancelDepositRequest(address, /* vault */ address user) public view returns (bool isPending) {
+        isPending = asyncManager().pendingCancelDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingCancelRedeemRequest(address, /* vault */ address user) public view returns (bool isPending) {
+        isPending = asyncManager().pendingCancelRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimableCancelDepositRequest(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().claimableCancelDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimableCancelRedeemRequest(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().claimableCancelRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function priceLastUpdated(address /* vault */ ) public view returns (uint64 lastUpdated) {
+        lastUpdated = manager.priceLastUpdated(address(this));
+    }
+
+    // --- IInvestmentManager - Vault claim functions ---
+    /// @inheritdoc IInvestmentManager
+    function deposit(address, /* vault */ uint256 assets, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 shares)
+    {
+        shares = asyncManager().deposit(address(this), assets, receiver, owner);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function mint(address, /* vault */ uint256 shares, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 assets)
+    {
+        assets = asyncManager().mint(address(this), shares, receiver, owner);
path: src/vaults/legacy/LegacyVaultAdapter.sol
user: login: lemunozm
body: Ahh, unless you want to forward to the async manager the adapter address to be able to later handle it. Then it's not a CR
created_at: 2025-04-22T10:59:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,205 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.28;
+
+import {IERC7540} from "src/vaults/legacy/interfaces/IERC7540.sol";
+import {IInvestmentManager} from "src/vaults/legacy/interfaces/IInvestmentManager.sol";
+import {ILegacyVaultAdapter} from "src/vaults/legacy/interfaces/ILegacyVaultAdapter.sol";
+import {AsyncVault} from "src/vaults/AsyncVault.sol";
+
+/// @title  LegacyVaultAdapter
+/// @notice An adapter connecting legacy ERC-7540 vaults from Centrifuge V2 to Centrifuge V3.
+///
+/// @dev This adapter acts as an `IInvestmentManager` for a single legacy `IERC7540` vault from Centrifuge V2. At the
+/// same time it acts like a new `IAsyncVault` for the `IAsyncRequests` manager of Centrifuge V3. The adapter needs to
+/// be deployed per legacy vault and allows a seamless interaction between Centrifuge V2 vaults and Centrifuge V3
+/// infrastructure. Thereby, allowing to migrate existing vaults to the new system.
+contract LegacyVaultAdapter is AsyncVault, ILegacyVaultAdapter, IInvestmentManager {
+    // No TokenId in legacy
+    uint256 constant LEGACY_TOKEN_ID = 0;
+
+    uint64 public immutable legacyPoolId;
+    bytes16 public immutable legacyTrancheId;
+    IERC7540 public immutable legacyVault;
+
+    constructor(
+        IERC7540 legacyVault_,
+        uint64 poolId,
+        uint64 legacyPoolId_,
+        bytes16 scId,
+        bytes16 legacyTrancheId_,
+        address asset,
+        address token,
+        address root,
+        address manager
+    ) AsyncVault(poolId, scId, asset, LEGACY_TOKEN_ID, token, root, manager) {
+        require(legacyVault_.poolId() == legacyPoolId_, NotLegacyPoolId(legacyPoolId_, legacyVault_.poolId()));
+        require(legacyVault_.trancheId() == legacyTrancheId_, NotLegacyscId(legacyTrancheId_, legacyVault_.trancheId()));
+        require(legacyVault_.asset() == asset, NotLegacyAsset(asset, legacyVault_.asset()));
+        require(legacyVault_.share() == token, NotLegacyShare(token, legacyVault_.share()));
+
+        legacyPoolId = legacyPoolId_;
+        legacyTrancheId = legacyTrancheId_;
+        legacyVault = legacyVault_;
+    }
+
+    /// @dev Check if the msg.sende_r is the legacyVault
+    modifier legacy() {
+        require(msg.sender == address(legacyVault), NotLegacyVault(msg.sender, address(legacyVault)));
+        _;
+    }
+
+    // --- IInvestmentManager impl ---
+    function escrow() public pure returns (address) {
+        // TODO: actually use the `IEscrowProvider` from the manager?
+        return address(0);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function requestDeposit(address, /* vault */ uint256 assets, address receiver, address owner, address source)
+        public
+        legacy
+        returns (bool)
+    {
+        return asyncManager().requestDeposit(address(this), assets, receiver, owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function requestRedeem(address, /* vault */ uint256 shares, address receiver, address owner, address source)
+        public
+        legacy
+        returns (bool)
+    {
+        return asyncManager().requestRedeem(address(this), shares, receiver, owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function cancelDepositRequest(address, /* vault */ address owner, address source) public legacy {
+        return asyncManager().cancelDepositRequest(address(this), owner, source);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function cancelRedeemRequest(address, /* vault */ address owner, address source) public legacy {
+        return asyncManager().cancelRedeemRequest(address(this), owner, source);
+    }
+
+    // --- IInvestmentManager - View functions ---
+    /// @inheritdoc IInvestmentManager
+    function convertToShares(address, /* vault */ uint256 _assets) public view returns (uint256 shares) {
+        shares = manager.convertToShares(address(this), _assets);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function convertToAssets(address, /* vault */ uint256 _shares) public view returns (uint256 assets) {
+        assets = manager.convertToAssets(address(this), _shares);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxDeposit(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().maxDeposit(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxMint(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().maxMint(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxWithdraw(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().maxWithdraw(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function maxRedeem(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().maxRedeem(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingDepositRequest(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().pendingDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingRedeemRequest(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().pendingRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingCancelDepositRequest(address, /* vault */ address user) public view returns (bool isPending) {
+        isPending = asyncManager().pendingCancelDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function pendingCancelRedeemRequest(address, /* vault */ address user) public view returns (bool isPending) {
+        isPending = asyncManager().pendingCancelRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimableCancelDepositRequest(address, /* vault */ address user) public view returns (uint256 assets) {
+        assets = asyncManager().claimableCancelDepositRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function claimableCancelRedeemRequest(address, /* vault */ address user) public view returns (uint256 shares) {
+        shares = asyncManager().claimableCancelRedeemRequest(address(this), user);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function priceLastUpdated(address /* vault */ ) public view returns (uint64 lastUpdated) {
+        lastUpdated = manager.priceLastUpdated(address(this));
+    }
+
+    // --- IInvestmentManager - Vault claim functions ---
+    /// @inheritdoc IInvestmentManager
+    function deposit(address, /* vault */ uint256 assets, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 shares)
+    {
+        shares = asyncManager().deposit(address(this), assets, receiver, owner);
+    }
+
+    /// @inheritdoc IInvestmentManager
+    function mint(address, /* vault */ uint256 shares, address receiver, address owner)
+        public
+        legacy
+        returns (uint256 assets)
+    {
+        assets = asyncManager().mint(address(this), shares, receiver, owner);
path: src/vaults/legacy/LegacyVaultAdapter.sol
user: login: mustermeiszer
body: ```
    /// @inheritdoc IDepositManager
    function mint(address vaultAddr, uint256 shares, address receiver, address controller)
        public
        auth
        returns (uint256 assets)
    {
        AsyncInvestmentState storage state = investments[vaultAddr][controller];
        uint128 shares_ = shares.toUint128();
        _processDeposit(state, shares_, shares_, vaultAddr, receiver);

        assets = uint256(_calculateAssets(vaultAddr, shares_, state.depositPrice, MathLib.Rounding.Down));
    }
```

Luckily, there is never a token transfer between manager and vault. Always, between manager and escrow. Hence, we can shadow the legacy vault address completely from the new system through the adapter.
created_at: 2025-04-22T11:05:40Z
author_association: CONTRIBUTOR

PR comments:
user: login: mustermeiszer
created_at: 2025-04-22T10:09:10Z
body: @hieronx the only open question for me would be whether we want to overrie the the `callback` functions of the vaults and call both into the legacy AND the new vault? 
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-22T11:47:50Z
body: Coverage after merging <b>feat/legacy-vault-mapping</b> into <b>main</b> will be<table><tbody><tr><th>89.99%</th></tr></tbody></table>

<details><summary>Coverage Report</summary><table><tbody><tr><th>File</th><th>Stmts</th><th>Branches</th><th>Funcs</th><th>Lines</th><th>Uncovered Lines</th></tr><tr><td colspan='6'><b>src/common</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/AxelarAdapter.sol'>AxelarAdapter.sol</a></td><td><b>91.11%</b></td><td><b>83.33%</b></td><td>100%</td><td><b>92.86%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/AxelarAdapter.sol#L40-L41'>40&ndash;41</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/AxelarAdapter.sol#L47-L48'>47&ndash;48</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/GasService.sol'>GasService.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Gateway.sol'>Gateway.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol'>Guardian.sol</a></td><td><b>66.67%</b></td><td><b>41.67%</b></td><td><b>73.33%</b></td><td><b>71.79%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L100'>100</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L104'>104</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L119'>119</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L119-L120'>119&ndash;120</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L32'>32</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L32'>32</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L43-L44'>43&ndash;44</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L44-L46'>44&ndash;46</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L78-L79'>78&ndash;79</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L83-L84'>83&ndash;84</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L88'>88</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Guardian.sol#L96'>96</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol'>MessageDispatcher.sol</a></td><td><b>55.56%</b></td><td><b>38.33%</b></td><td><b>75%</b></td><td><b>59.66%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L122-L123'>122&ndash;123</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L139-L140'>139&ndash;140</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L164-L165'>164&ndash;165</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L192-L193'>192&ndash;193</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L212'>212</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L219'>219</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L219'>219</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L219-L220'>219&ndash;220</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L224'>224</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L238'>238</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L245'>245</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L245'>245</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L245-L246'>245&ndash;246</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L248'>248</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L262'>262</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L266'>266</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L266'>266</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L266-L267'>266&ndash;267</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L269'>269</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L284-L285'>284&ndash;285</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L300-L301'>300&ndash;301</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L317-L318'>317&ndash;318</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L333-L334'>333&ndash;334</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L334'>334</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L334-L335'>334&ndash;335</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L337'>337</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L342-L343'>342&ndash;343</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L343'>343</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L343-L344'>343&ndash;344</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L346'>346</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L351'>351</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L359'>359</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L359'>359</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L359-L360'>359&ndash;360</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L364'>364</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L373'>373</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L377'>377</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L377'>377</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L377-L378'>377&ndash;378</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L380'>380</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L393'>393</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L396'>396</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L409-L410'>409&ndash;410</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L425-L426'>425&ndash;426</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L446-L447'>446&ndash;447</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L467-L468'>467&ndash;468</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L487-L488'>487&ndash;488</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L512-L513'>512&ndash;513</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L540-L541'>540&ndash;541</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L541'>541</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L541-L542'>541&ndash;542</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L544'>544</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L564-L565'>564&ndash;565</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L63-L67'>63&ndash;67</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageDispatcher.sol#L98-L99'>98&ndash;99</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol'>MessageProcessor.sol</a></td><td><b>78.79%</b></td><td><b>76.32%</b></td><td>100%</td><td><b>79.31%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L109-L111'>109&ndash;111</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L114-L119'>114&ndash;119</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L140-L142'>140&ndash;142</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L145-L147'>145&ndash;147</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L198-L199'>198&ndash;199</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L201'>201</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L201'>201</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L201-L202'>201&ndash;202</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L211'>211</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L220-L222'>220&ndash;222</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L222'>222</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L222-L223'>222&ndash;223</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L231'>231</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L271'>271</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L54-L59'>54&ndash;59</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L71-L73'>71&ndash;73</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/MessageProcessor.sol#L80-L82'>80&ndash;82</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Root.sol'>Root.sol</a></td><td><b>98.48%</b></td><td><b>91.67%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/Root.sol#L34'>34</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/TokenRecoverer.sol'>TokenRecoverer.sol</a></td><td><b>84.62%</b></td><td><b>50%</b></td><td>100%</td><td><b>88.89%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/TokenRecoverer.sol#L25-L26'>25&ndash;26</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/WormholeAdapter.sol'>WormholeAdapter.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/common/libraries</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol'>MessageLib.sol</a></td><td><b>88.54%</b></td><td><b>52.94%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L1015'>1015</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L1058'>1058</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L1089'>1089</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L1115'>1115</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L1148'>1148</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L1188'>1188</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L130'>130</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L172'>172</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L191'>191</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L208'>208</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L225'>225</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L246'>246</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L270'>270</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L287'>287</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L310'>310</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L351'>351</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L381'>381</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L411'>411</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L437'>437</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L457'>457</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L481'>481</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L509'>509</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L531'>531</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L553'>553</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L574'>574</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L605'>605</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L632'>632</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L655'>655</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L677'>677</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L700'>700</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L723'>723</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L745'>745</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L772'>772</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L798'>798</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L823'>823</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L854'>854</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L889'>889</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L923'>923</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L956'>956</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageLib.sol#L985'>985</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageProofLib.sol'>MessageProofLib.sol</a></td><td><b>88.89%</b></td><td><b>50%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/common/libraries/MessageProofLib.sol#L14'>14</a></td></tr><tr><td colspan='6'><b>src/hooks</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol'>FreelyTransferable.sol</a></td><td><b>55.17%</b></td><td><b>30%</b></td><td><b>63.64%</b></td><td><b>62.50%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L103'>103</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L106'>106</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L106'>106</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L106-L109'>106&ndash;109</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L109'>109</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L109-L111'>109&ndash;111</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L113'>113</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L118-L119'>118&ndash;119</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L119'>119</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L119-L120'>119&ndash;120</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L120'>120</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L120'>120</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L122-L123'>122&ndash;123</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L125'>125</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L129-L131'>129&ndash;131</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L133'>133</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L137'>137</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L143-L145'>143&ndash;145</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L51'>51</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L74'>74</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L76'>76</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L80'>80</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/FreelyTransferable.sol#L82'>82</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hooks/RestrictedTransfers.sol'>RestrictedTransfers.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/hub</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Accounting.sol'>Accounting.sol</a></td><td><b>93.18%</b></td><td>100%</td><td><b>91.67%</b></td><td><b>90.91%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Accounting.sol#L61-L63'>61&ndash;63</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Accounting.sol#L66-L67'>66&ndash;67</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Holdings.sol'>Holdings.sol</a></td><td><b>99.07%</b></td><td><b>96.67%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Holdings.sol#L165'>165</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol'>Hub.sol</a></td><td><b>74.74%</b></td><td><b>31.82%</b></td><td>100%</td><td><b>78.95%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L117-L118'>117&ndash;118</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L136-L137'>136&ndash;137</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L207'>207</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L276'>276</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L276'>276</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L276'>276</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L278-L279'>278&ndash;279</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L292'>292</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L322'>322</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L348-L349'>348&ndash;349</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L349'>349</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L349'>349</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L354-L356'>354&ndash;356</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L358'>358</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L365'>365</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L367'>367</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L369'>369</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L369'>369</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L369-L370'>369&ndash;370</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L370'>370</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L370-L371'>370&ndash;371</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L374'>374</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L378-L379'>378&ndash;379</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L381'>381</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L381-L382'>381&ndash;382</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L382'>382</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L382-L383'>382&ndash;383</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L387'>387</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L392'>392</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L395'>395</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L401'>401</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L411'>411</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L421'>421</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L435'>435</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L442'>442</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L444'>444</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L446'>446</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L484'>484</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L487'>487</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L487-L488'>487&ndash;488</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L496'>496</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L499'>499</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L499-L500'>499&ndash;500</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L560'>560</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L66-L67'>66&ndash;67</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L67'>67</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L67-L68'>67&ndash;68</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L68'>68</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L68-L69'>68&ndash;69</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L69'>69</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L69-L70'>69&ndash;70</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L70'>70</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L70-L71'>70&ndash;71</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L71'>71</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/Hub.sol#L71-L72'>71&ndash;72</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/HubRegistry.sol'>HubRegistry.sol</a></td><td><b>94.29%</b></td><td><b>81.82%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/HubRegistry.sol#L29'>29</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/HubRegistry.sol#L44'>44</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/HubRegistry.sol#L93'>93</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/HubRegistry.sol#L99'>99</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/ShareClassManager.sol'>ShareClassManager.sol</a></td><td><b>99.19%</b></td><td><b>98.85%</b></td><td><b>97.06%</b></td><td><b>99.60%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/ShareClassManager.sol#L537'>537</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/hub/ShareClassManager.sol#L554'>554</a></td></tr><tr><td colspan='6'><b>src/misc</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/Auth.sol'>Auth.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/BaseValuation.sol'>BaseValuation.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/ERC20.sol'>ERC20.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/IdentityValuation.sol'>IdentityValuation.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/Multicall.sol'>Multicall.sol</a></td><td><b>83.33%</b></td><td><b>33.33%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/Multicall.sol#L17'>17</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/Multicall.sol#L17'>17</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/Recoverable.sol'>Recoverable.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/ReentrancyProtection.sol'>ReentrancyProtection.sol</a></td><td><b>90%</b></td><td><b>75%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/ReentrancyProtection.sol#L24'>24</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/TransientValuation.sol'>TransientValuation.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/misc/libraries</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/ArrayLib.sol'>ArrayLib.sol</a></td><td><b>95.83%</b></td><td><b>75%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/ArrayLib.sol#L26'>26</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BitmapLib.sol'>BitmapLib.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol'>BytesLib.sol</a></td><td><b>89.62%</b></td><td><b>54.17%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L102'>102</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L113'>113</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L124'>124</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L135'>135</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L146'>146</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L157'>157</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L168'>168</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L17'>17</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L179'>179</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L75'>75</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/BytesLib.sol#L80'>80</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/CastLib.sol'>CastLib.sol</a></td><td><b>93.75%</b></td><td><b>62.50%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/CastLib.sol#L10'>10</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/CastLib.sol#L19'>19</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/CastLib.sol#L43'>43</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/ConversionLib.sol'>ConversionLib.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/EIP712Lib.sol'>EIP712Lib.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol'>MathLib.sol</a></td><td><b>73.74%</b></td><td><b>68.42%</b></td><td>100%</td><td><b>71.83%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L100'>100</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L108'>108</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L111'>111</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L114'>114</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L117'>117</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L121'>121</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L126'>126</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L131-L136'>131&ndash;136</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L142-L143'>142&ndash;143</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L33-L34'>33&ndash;34</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L43'>43</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L45'>45</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L47'>47</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L49'>49</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L51'>51</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L86'>86</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L93'>93</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L96'>96</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/MathLib.sol#L99'>99</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/SafeTransferLib.sol'>SafeTransferLib.sol</a></td><td><b>96.97%</b></td><td><b>92.86%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/SafeTransferLib.sol#L59'>59</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/SignatureLib.sol'>SignatureLib.sol</a></td><td><b>95.24%</b></td><td><b>80%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/SignatureLib.sol#L17'>17</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/StringLib.sol'>StringLib.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/TransientArrayLib.sol'>TransientArrayLib.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/TransientBytesLib.sol'>TransientBytesLib.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/TransientStorageLib.sol'>TransientStorageLib.sol</a></td><td><b>73.68%</b></td><td>100%</td><td><b>80%</b></td><td><b>71.43%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/TransientStorageLib.sol#L24'>24</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/TransientStorageLib.sol#L26'>26</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/TransientStorageLib.sol#L6'>6</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/misc/libraries/TransientStorageLib.sol#L8'>8</a></td></tr><tr><td colspan='6'><b>src/vaults</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol'>AsyncRequests.sol</a></td><td><b>95.44%</b></td><td><b>82.61%</b></td><td>100%</td><td><b>99.59%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L118'>118</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L147'>147</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L301'>301</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L332'>332</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L337'>337</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L390'>390</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L436'>436</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L442'>442</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L488'>488</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L492'>492</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L497'>497</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L500'>500</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L515'>515</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L74-L75'>74&ndash;75</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncRequests.sol#L88-L89'>88&ndash;89</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncVault.sol'>AsyncVault.sol</a></td><td><b>93.67%</b></td><td><b>75%</b></td><td><b>94.12%</b></td><td><b>96.30%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncVault.sol#L141'>141</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncVault.sol#L44'>44</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncVault.sol#L48'>48</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/AsyncVault.sol#L51'>51</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol'>BalanceSheet.sol</a></td><td><b>81.48%</b></td><td><b>81.25%</b></td><td><b>77.78%</b></td><td><b>82.43%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L129'>129</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L137'>137</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L139'>139</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L143'>143</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L151-L152'>151&ndash;152</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L156'>156</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L160'>160</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L164'>164</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L168'>168</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L215'>215</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L218'>218</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L238'>238</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L241'>241</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L67'>67</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BalanceSheet.sol#L78'>78</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseInvestmentManager.sol'>BaseInvestmentManager.sol</a></td><td><b>80.56%</b></td><td><b>0%</b></td><td><b>85.71%</b></td><td><b>85.19%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseInvestmentManager.sol#L34-L35'>34&ndash;35</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseInvestmentManager.sol#L35'>35</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseInvestmentManager.sol#L35-L37'>35&ndash;37</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseVaults.sol'>BaseVaults.sol</a></td><td><b>94.97%</b></td><td><b>80.77%</b></td><td><b>97.56%</b></td><td><b>96.97%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseVaults.sol#L126'>126</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseVaults.sol#L139'>139</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseVaults.sol#L218'>218</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseVaults.sol#L226'>226</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseVaults.sol#L226'>226</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/BaseVaults.sol#L367-L370'>367&ndash;370</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol'>Escrow.sol</a></td><td><b>87.23%</b></td><td><b>78.26%</b></td><td>100%</td><td><b>88.71%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol#L100'>100</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol#L104-L105'>104&ndash;105</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol#L105'>105</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol#L105'>105</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol#L56'>56</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol#L56'>56</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol#L56-L58'>56&ndash;58</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/Escrow.sol#L60-L61'>60&ndash;61</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol'>PoolManager.sol</a></td><td><b>90.17%</b></td><td><b>81.52%</b></td><td>100%</td><td><b>92.24%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L118'>118</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L118'>118</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L120'>120</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L120'>120</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L120'>120</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L261'>261</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L312'>312</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L315'>315</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L327'>327</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L329'>329</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L332'>332</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L335'>335</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L335'>335</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L335-L337'>335&ndash;337</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L339-L340'>339&ndash;340</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L340'>340</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L340'>340</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L342-L345'>342&ndash;345</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L345'>345</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L345-L347'>345&ndash;347</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L349'>349</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L351-L352'>351&ndash;352</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L354'>354</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L446'>446</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L483'>483</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/PoolManager.sol#L499'>499</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncDepositVault.sol'>SyncDepositVault.sol</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol'>SyncRequests.sol</a></td><td><b>77.91%</b></td><td><b>62.50%</b></td><td><b>90.48%</b></td><td><b>79.83%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L101-L102'>101&ndash;102</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L126-L127'>126&ndash;127</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L129'>129</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L129'>129</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L129-L130'>129&ndash;130</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L130'>130</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L130'>130</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L132'>132</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L134-L135'>134&ndash;135</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L137-L139'>137&ndash;139</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L141-L142'>141&ndash;142</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L142-L143'>142&ndash;143</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L154'>154</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L156'>156</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L165'>165</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L182'>182</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L225-L226'>225&ndash;226</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L234'>234</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L72-L73'>72&ndash;73</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L75'>75</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L75'>75</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L75-L76'>75&ndash;76</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L78'>78</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L83'>83</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/SyncRequests.sol#L88'>88</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/VaultRouter.sol'>VaultRouter.sol</a></td><td><b>88.60%</b></td><td><b>59.52%</b></td><td>100%</td><td><b>96%</b></td><td><a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/VaultRouter.sol#L107'>107</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/VaultRouter.sol#L113'>113</a>, <a href='https://github.com/centrifuge/protocol-v3/blob/223b73d9d9d9fcca8e404bdaa198605cf4c40598/src/vaults/VaultRouter.sol#L116'>116</a>, <a h
author_association: NONE