Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
2c55f66
Setup
hieronx Apr 30, 2025
5498cb8
Add valuation
hieronx Apr 30, 2025
20deae2
Add comment
hieronx Apr 30, 2025
6052a5e
Add LTV
hieronx Apr 30, 2025
97eadce
Add comment
hieronx Apr 30, 2025
af46b67
Fix owner check
hieronx Apr 30, 2025
5a0da6a
Add holding creation
hieronx Apr 30, 2025
4130016
Format
hieronx Apr 30, 2025
96f991d
Add linear accrual, externalize 6909
hieronx May 1, 2025
735d2db
Fix warning
hieronx May 1, 2025
41d2b31
Change auth
hieronx May 1, 2025
4b7d0c3
Add update contract methods
hieronx May 2, 2025
43f336a
Setup NAVManager
hieronx May 5, 2025
32266da
Fix
hieronx May 5, 2025
acc84f0
Fix
hieronx May 5, 2025
f081b2e
Merge branch 'main' of github.com:centrifuge/protocol-v3 into nav-man…
hieronx May 5, 2025
f5467af
Remove loan manager code
hieronx May 5, 2025
25de08e
More removals
hieronx May 5, 2025
7290875
Merge branch 'spearbit-fixreview' of github.com:centrifuge/protocol-v…
hieronx May 28, 2025
b69fd5b
Start to adapt for multiple networks
hieronx Jun 4, 2025
755944b
Make it work
hieronx Jun 4, 2025
ad59f61
Merge branch 'post-electisec' into nav-manager
hieronx Jun 29, 2025
b88f835
Separate price calculations
hieronx Jun 29, 2025
8f8f60b
Asset/expense account shared across sc's
hieronx Jun 29, 2025
b392f30
Start adapting end to end tests
hieronx Jun 29, 2025
18243e9
Start to integrate price manager
hieronx Jun 29, 2025
4b8345f
Fix price with zero issuance
hieronx Jun 29, 2025
e494446
Fix tests
hieronx Jun 29, 2025
2f24461
Undo
hieronx Jun 29, 2025
128829d
Fix warnings
hieronx Jun 29, 2025
8245f74
Format
hieronx Jun 29, 2025
96f66c2
Fix import order
hieronx Jun 29, 2025
794e849
Merge branch 'post-electisec' of github.com:centrifuge/protocol-v3 in…
hieronx Jun 29, 2025
68c704a
Merge branch 'main' of github.com:centrifuge/protocol-v3 into nav-man…
hieronx Jul 2, 2025
adbea4c
Merge branch 'main' of github.com:centrifuge/protocol-v3 into nav-man…
hieronx Jul 3, 2025
0a5bf0e
Merge branch 'main' of github.com:centrifuge/protocol-v3 into nav-man…
hieronx Jul 6, 2025
4c4fc1b
Update hub diagram
hieronx Jul 6, 2025
dbfc3e1
Make it compile
hieronx Jul 6, 2025
4ca23ec
Merge branch 'main' of github.com:centrifuge/protocol-v3 into nav-man…
hieronx Jul 22, 2025
421e453
Fix end to end test compilation
hieronx Jul 22, 2025
64fbac1
Merge branch 'main' of github.com:centrifuge/protocol-v3 into nav-man…
hieronx Jul 27, 2025
8c2c95f
Add onTransfer
hieronx Jul 27, 2025
5fa5b03
Formatting
hieronx Aug 3, 2025
4d4064f
interfaces
onnovisser Sep 4, 2025
bfb9bae
Merge commit '6e006e84527a096f6d08a2a3ff301a175e816dcc' into nav-manager
onnovisser Sep 5, 2025
6e335cc
onTransfer + approve
onnovisser Sep 8, 2025
a9d4e6b
manager tests
onnovisser Sep 10, 2025
93b94fb
revert e2e changes
onnovisser Sep 11, 2025
95a1fb8
managers and callers
onnovisser Sep 11, 2025
f328ab4
fix e2e
onnovisser Sep 12, 2025
ff9089a
simplepricemanager test
onnovisser Sep 12, 2025
00a32f2
integration test
onnovisser Sep 12, 2025
f8accd5
remove scid
onnovisser Sep 12, 2025
20153ff
remove logs
onnovisser Sep 12, 2025
10140e0
Merge branch 'main' into nav-manager
onnovisser Sep 12, 2025
32d5dda
typo
onnovisser Sep 12, 2025
da397c5
format
onnovisser Sep 12, 2025
550fe0a
unused imports
onnovisser Sep 12, 2025
a860c8f
close gain/loss
onnovisser Sep 15, 2025
ba97ae8
comment
onnovisser Sep 15, 2025
5254e88
comment
onnovisser Sep 15, 2025
f4e01ac
Apply suggestions from code review
onnovisser Sep 15, 2025
ab10917
remove factories
onnovisser Sep 18, 2025
6724eff
split hub/spoke managers
onnovisser Sep 18, 2025
764dc88
comment
onnovisser Sep 18, 2025
88ea6b0
account id uint256
onnovisser Sep 19, 2025
18e62d1
remove comment
onnovisser Sep 22, 2025
77d043a
Merge commit 'ed9dc5beab9756e1c1fb44ee3fc127ce420db21b' into nav-manager
onnovisser Sep 24, 2025
732103b
gateway methods
onnovisser Sep 24, 2025
1988633
file
onnovisser Sep 24, 2025
0678fc1
immutable
onnovisser Sep 24, 2025
62728ff
gas savings
onnovisser Sep 24, 2025
f0a36af
Merge commit '2add77913022fafce88f9a9bc971352e3e4c6cd5' into nav-manager
onnovisser Sep 24, 2025
450b859
batchrequestmanasger changes
onnovisser Sep 25, 2025
8229069
Merge commit '0d6a054a4a552a186e0800392925dceb79aef553' into nav-manager
onnovisser Sep 25, 2025
0bab786
using crosschain batcher
onnovisser Sep 25, 2025
81eb1d5
cleanup
onnovisser Sep 26, 2025
8c34bee
add separate approve/issue methods
onnovisser Sep 29, 2025
0080e3a
event
onnovisser Sep 29, 2025
e5100d9
Merge commit 'e3726f7343828b6b8b47cbf6516cc5c398913137' into nav-manager
onnovisser Sep 29, 2025
a92f592
consts
onnovisser Sep 29, 2025
a5e583c
invalid share class
onnovisser Sep 29, 2025
a1f3c80
spelling
onnovisser Sep 29, 2025
41b2366
addNetwork + removeNetwork
onnovisser Sep 30, 2025
09429e3
split SimplePriceManager
onnovisser Sep 30, 2025
fd81467
remove setHoldingAccountId
onnovisser Sep 30, 2025
6eab680
make updateHoldingValue permissionless
onnovisser Sep 30, 2025
3d8ab8c
rename
onnovisser Oct 1, 2025
b0245e5
Merge commit 'bb2668a9f7f822b7600821e583e5e7a942959737' into nav-manager
onnovisser Oct 1, 2025
c7c03af
withBatch
onnovisser Oct 1, 2025
c409280
Merge commit '8117133f4bfa82165cbb4a3852f4d2ebe0e66ee4' into nav-manager
onnovisser Oct 1, 2025
f7060ef
move QueueManager
onnovisser Oct 1, 2025
e73d907
fix test
onnovisser Oct 1, 2025
3e614d9
cleanup
onnovisser Oct 1, 2025
b8f30c3
Apply suggestions from code review
onnovisser Oct 1, 2025
15d20ac
remove BatchSimplePriceManager
onnovisser Oct 1, 2025
e1a2d06
remove _onSync
onnovisser Oct 1, 2025
fdaed4c
organize
onnovisser Oct 1, 2025
33102f6
remove networks from struct
onnovisser Oct 1, 2025
3428511
Merge commit '2cf8b145e6fea6c86e2ebef9e9fa4f192dbbb500' into nav-manager
onnovisser Oct 1, 2025
46e0c40
re-add BatchSimplePriceManager
onnovisser Oct 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions docs/architecture/deployers.puml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ class SpokeDeployer
class AdaptersDeployer

class ValuationsDeployer
class HubManagersDeployer
class ExtendedHubDeployer

class ManagersDeployer
class SpokeManagersDeployer
class VaultsDeployer
class HooksDeployer
class ExtendedSpokeDeployer
Expand All @@ -32,14 +33,17 @@ HubDeployer -up-|> CommonDeployer
SpokeDeployer -up-|> CommonDeployer
AdaptersDeployer -up-|> CommonDeployer

HubManagersDeployer -up-|> HubDeployer
ValuationsDeployer -up-|> HubDeployer

ExtendedHubDeployer -up-|> HubManagersDeployer
ExtendedHubDeployer -up-|> ValuationsDeployer

ManagersDeployer -up-|> SpokeDeployer
SpokeManagersDeployer -up-|> SpokeDeployer
VaultsDeployer -up-|> SpokeDeployer
HooksDeployer -up-|> SpokeDeployer

ExtendedSpokeDeployer -up-|> ManagersDeployer
ExtendedSpokeDeployer -up-|> SpokeManagersDeployer
ExtendedSpokeDeployer -up-|> VaultsDeployer
ExtendedSpokeDeployer -up-|> HooksDeployer

Expand Down
12 changes: 11 additions & 1 deletion docs/architecture/hub.puml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ package common {
class Gateway
}

package managers {
class NAVManager
class SimplePriceManager
interface INAVHook
}

class Holdings
class HubRegistry
class ShareClassManager
Expand All @@ -34,7 +40,11 @@ Hub --> Accounting
Hub -up-> MessageDispatcher
Hub -up-> Gateway
Holdings --> IValuation
Holdings --> ISnapshotHook
Holdings -|> ISnapshotHook

NAVManager -|> ISnapshotHook
NAVManager -down-|> INAVHook
SimplePriceManager -up-|> INAVHook

Holdings --> HubRegistry
ShareClassManager --> HubRegistry
Expand Down
8 changes: 6 additions & 2 deletions script/ExtendedHubDeployer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,30 @@ pragma solidity 0.8.28;

import {CommonInput} from "./CommonDeployer.s.sol";
import {ValuationsDeployer, ValuationsActionBatcher} from "./ValuationsDeployer.s.sol";
import {HubManagersDeployer, HubManagersActionBatcher} from "./HubManagersDeployer.s.sol";

import "forge-std/Script.sol";

contract ExtendedHubActionBatcher is ValuationsActionBatcher {}
contract ExtendedHubActionBatcher is ValuationsActionBatcher, HubManagersActionBatcher {}

contract ExtendedHubDeployer is ValuationsDeployer {
contract ExtendedHubDeployer is ValuationsDeployer, HubManagersDeployer {
function deployExtendedHub(CommonInput memory input, ExtendedHubActionBatcher batcher) public {
_preDeployExtendedHub(input, batcher);
_postDeployExtendedHub(batcher);
}

function _preDeployExtendedHub(CommonInput memory input, ExtendedHubActionBatcher batcher) internal {
_preDeployValuations(input, batcher);
_preDeployHubManagers(input, batcher);
}

function _postDeployExtendedHub(ExtendedHubActionBatcher batcher) internal {
_postDeployValuations(batcher);
_postDeployHubManagers(batcher);
}

function removeExtendedHubDeployerAccess(ExtendedHubActionBatcher batcher) public {
removeValuationsDeployerAccess(batcher);
removeHubManagersDeployerAccess(batcher);
}
}
12 changes: 6 additions & 6 deletions script/ExtendedSpokeDeployer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ pragma solidity 0.8.28;
import {CommonInput} from "./CommonDeployer.s.sol";
import {HooksDeployer, HooksActionBatcher} from "./HooksDeployer.s.sol";
import {VaultsDeployer, VaultsActionBatcher} from "./VaultsDeployer.s.sol";
import {ManagersDeployer, ManagersActionBatcher} from "./ManagersDeployer.s.sol";
import {SpokeManagersDeployer, SpokeManagersActionBatcher} from "./SpokeManagersDeployer.s.sol";

import "forge-std/Script.sol";

contract ExtendedSpokeActionBatcher is VaultsActionBatcher, HooksActionBatcher, ManagersActionBatcher {}
contract ExtendedSpokeActionBatcher is VaultsActionBatcher, HooksActionBatcher, SpokeManagersActionBatcher {}

contract ExtendedSpokeDeployer is VaultsDeployer, HooksDeployer, ManagersDeployer {
contract ExtendedSpokeDeployer is VaultsDeployer, HooksDeployer, SpokeManagersDeployer {
function deployExtendedSpoke(CommonInput memory input, ExtendedSpokeActionBatcher batcher) public {
_preDeployExtendedSpoke(input, batcher);
_postDeployExtendedSpoke(batcher);
Expand All @@ -19,18 +19,18 @@ contract ExtendedSpokeDeployer is VaultsDeployer, HooksDeployer, ManagersDeploye
function _preDeployExtendedSpoke(CommonInput memory input, ExtendedSpokeActionBatcher batcher) internal {
_preDeployVaults(input, batcher);
_preDeployHooks(input, batcher);
_preDeployManagers(input, batcher);
_preDeploySpokeManagers(input, batcher);
}

function _postDeployExtendedSpoke(ExtendedSpokeActionBatcher batcher) internal {
_postDeployVaults(batcher);
_postDeployHooks(batcher);
_postDeployManagers(batcher);
_postDeploySpokeManagers(batcher);
}

function removeExtendedSpokeDeployerAccess(ExtendedSpokeActionBatcher batcher) public {
removeVaultsDeployerAccess(batcher);
removeHooksDeployerAccess(batcher);
removeManagersDeployerAccess(batcher);
removeSpokeManagersDeployerAccess(batcher);
}
}
8 changes: 8 additions & 0 deletions script/HubDeployer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ contract HubDeployer is CommonDeployer, HubConstants {
}

function _preDeployHub(CommonInput memory input, HubActionBatcher batcher) internal {
if (address(hub) != address(0)) {
return; // Already deployed. Make this method idempotent.
}

_preDeployCommon(input, batcher);

hubRegistry = HubRegistry(
Expand Down Expand Up @@ -173,6 +177,10 @@ contract HubDeployer is CommonDeployer, HubConstants {
}

function removeHubDeployerAccess(HubActionBatcher batcher) public {
if (hub.wards(address(batcher)) == 0) {
return; // Already removed. Make this method idempotent.
}

removeCommonDeployerAccess(batcher);
batcher.revokeHub(_hubReport());
}
Expand Down
82 changes: 82 additions & 0 deletions script/HubManagersDeployer.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

import {CommonInput} from "./CommonDeployer.s.sol";
import {HubDeployer, HubReport, HubActionBatcher} from "./HubDeployer.s.sol";

import {NAVManager} from "../src/managers/hub/NAVManager.sol";
import {SimplePriceManager} from "../src/managers/hub/SimplePriceManager.sol";

import "forge-std/Script.sol";

struct HubManagersReport {
HubReport hub;
NAVManager navManager;
SimplePriceManager simplePriceManager;
}

contract HubManagersActionBatcher is HubActionBatcher {
function engageManagers(HubManagersReport memory report) public onlyDeployer {
// Rely root
report.navManager.rely(address(report.hub.common.root));
report.simplePriceManager.rely(address(report.hub.common.root));

// Rely other
report.navManager.rely(address(report.hub.hub));
report.navManager.rely(address(report.hub.hubHandler));
report.navManager.rely(address(report.hub.holdings));
report.simplePriceManager.rely(address(report.navManager));
}

function revokeManagers(HubManagersReport memory report) public onlyDeployer {
report.navManager.deny(address(this));
report.simplePriceManager.deny(address(this));
}
}

contract HubManagersDeployer is HubDeployer {
NAVManager public navManager;
SimplePriceManager public simplePriceManager;

function deployHubManagers(CommonInput memory input, HubManagersActionBatcher batcher) public {
_preDeployHubManagers(input, batcher);
_postDeployHubManagers(batcher);
}

function _preDeployHubManagers(CommonInput memory input, HubManagersActionBatcher batcher) internal {
_preDeployHub(input, batcher);

navManager = NAVManager(
create3(
generateSalt("navManager"),
abi.encodePacked(type(NAVManager).creationCode, abi.encode(hub, address(batcher)))
)
);

simplePriceManager = SimplePriceManager(
create3(
generateSalt("simplePriceManager"),
abi.encodePacked(type(SimplePriceManager).creationCode, abi.encode(hub, address(batcher)))
)
);

batcher.engageManagers(_managersReport());

register("navManager", address(navManager));
register("simplePriceManager", address(simplePriceManager));
}

function _postDeployHubManagers(HubManagersActionBatcher batcher) internal {
_postDeployHub(batcher);
}

function removeHubManagersDeployerAccess(HubManagersActionBatcher batcher) public {
removeHubDeployerAccess(batcher);

batcher.revokeManagers(_managersReport());
}

function _managersReport() internal view returns (HubManagersReport memory) {
return HubManagersReport(_hubReport(), navManager, simplePriceManager);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ pragma solidity 0.8.28;
import {CommonInput} from "./CommonDeployer.s.sol";
import {SpokeDeployer, SpokeReport, SpokeActionBatcher} from "./SpokeDeployer.s.sol";

import {QueueManager} from "../src/managers/QueueManager.sol";
import {VaultDecoder} from "../src/managers/decoders/VaultDecoder.sol";
import {CircleDecoder} from "../src/managers/decoders/CircleDecoder.sol";
import {OnOfframpManagerFactory} from "../src/managers/OnOfframpManager.sol";
import {MerkleProofManagerFactory} from "../src/managers/MerkleProofManager.sol";
import {QueueManager} from "../src/managers/spoke/QueueManager.sol";
import {VaultDecoder} from "../src/managers/spoke/decoders/VaultDecoder.sol";
import {CircleDecoder} from "../src/managers/spoke/decoders/CircleDecoder.sol";
import {OnOfframpManagerFactory} from "../src/managers/spoke/OnOfframpManager.sol";
import {MerkleProofManagerFactory} from "../src/managers/spoke/MerkleProofManager.sol";

struct ManagersReport {
struct SpokeManagersReport {
SpokeReport spoke;
QueueManager queueManager;
OnOfframpManagerFactory onOfframpManagerFactory;
Expand All @@ -19,33 +19,33 @@ struct ManagersReport {
CircleDecoder circleDecoder;
}

contract ManagersActionBatcher is SpokeActionBatcher {
function engageManagers(ManagersReport memory report) public onlyDeployer {
contract SpokeManagersActionBatcher is SpokeActionBatcher {
function engageManagers(SpokeManagersReport memory report) public onlyDeployer {
// rely QueueManager on Gateway
report.spoke.common.gateway.rely(address(report.queueManager));

// rely Root
report.queueManager.rely(address(report.spoke.common.root));
}

function revokeManagers(ManagersReport memory report) public onlyDeployer {
function revokeManagers(SpokeManagersReport memory report) public onlyDeployer {
report.queueManager.deny(address(this));
}
}

contract ManagersDeployer is SpokeDeployer {
contract SpokeManagersDeployer is SpokeDeployer {
QueueManager public queueManager;
OnOfframpManagerFactory public onOfframpManagerFactory;
MerkleProofManagerFactory public merkleProofManagerFactory;
VaultDecoder public vaultDecoder;
CircleDecoder public circleDecoder;

function deployManagers(CommonInput memory input, ManagersActionBatcher batcher) public {
_preDeployManagers(input, batcher);
_postDeployManagers(batcher);
function deploySpokeManagers(CommonInput memory input, SpokeManagersActionBatcher batcher) public {
_preDeploySpokeManagers(input, batcher);
_postDeploySpokeManagers(batcher);
}

function _preDeployManagers(CommonInput memory input, ManagersActionBatcher batcher) internal {
function _preDeploySpokeManagers(CommonInput memory input, SpokeManagersActionBatcher batcher) internal {
_preDeploySpoke(input, batcher);

queueManager = QueueManager(
Expand Down Expand Up @@ -79,7 +79,7 @@ contract ManagersDeployer is SpokeDeployer {
circleDecoder =
CircleDecoder(create3(generateSalt("circleDecoder"), abi.encodePacked(type(CircleDecoder).creationCode)));

batcher.engageManagers(_managersReport());
batcher.engageManagers(_spokeManagersReport());

register("queueManager", address(queueManager));
register("onOfframpManagerFactory", address(onOfframpManagerFactory));
Expand All @@ -88,18 +88,18 @@ contract ManagersDeployer is SpokeDeployer {
register("circleDecoder", address(circleDecoder));
}

function _postDeployManagers(ManagersActionBatcher batcher) internal {
function _postDeploySpokeManagers(SpokeManagersActionBatcher batcher) internal {
_postDeploySpoke(batcher);
}

function removeManagersDeployerAccess(ManagersActionBatcher batcher) public {
function removeSpokeManagersDeployerAccess(SpokeManagersActionBatcher batcher) public {
removeSpokeDeployerAccess(batcher);

batcher.revokeManagers(_managersReport());
batcher.revokeManagers(_spokeManagersReport());
}

function _managersReport() internal view returns (ManagersReport memory) {
return ManagersReport(
function _spokeManagersReport() internal view returns (SpokeManagersReport memory) {
return SpokeManagersReport(
_spokeReport(),
queueManager,
onOfframpManagerFactory,
Expand Down
2 changes: 1 addition & 1 deletion script/utils/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ import {Auth} from "../misc/Auth.sol";
// Before
import {CommonInput} from "script/CommonDeployer.s.sol";

// After (from script/ManagersDeployer.s.sol)
// After (from script/SpokeManagersDeployer.s.sol)
import {CommonInput} from "./CommonDeployer.s.sol";
```

Expand Down
20 changes: 17 additions & 3 deletions src/common/types/AccountId.sol
Original file line number Diff line number Diff line change
@@ -1,14 +1,28 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

type AccountId is uint32;
import {AssetId} from "./AssetId.sol";

function raw(AccountId accountId_) pure returns (uint32) {
type AccountId is uint256;

function raw(AccountId accountId_) pure returns (uint256) {
return AccountId.unwrap(accountId_);
}

function neq(AccountId a, AccountId b) pure returns (bool) {
return AccountId.unwrap(a) != AccountId.unwrap(b);
}

using {raw, neq as !=} for AccountId global;
function isNull(AccountId accountId) pure returns (bool) {
return AccountId.unwrap(accountId) == 0;
}

function withCentrifugeId(uint16 centrifugeId, uint16 index) pure returns (AccountId) {
return AccountId.wrap((uint256(centrifugeId) << 16) | uint256(index));
}

function withAssetId(AssetId assetId, uint16 index) pure returns (AccountId) {
return AccountId.wrap((uint256(assetId.raw()) << 16) | uint256(index));
}

using {raw, neq as !=, isNull} for AccountId global;
10 changes: 7 additions & 3 deletions src/common/types/ShareClassId.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ function isNull(ShareClassId scId) pure returns (bool) {
return ShareClassId.unwrap(scId) == 0;
}

function index(ShareClassId scId) pure returns (uint32) {
return uint32(uint128(ShareClassId.unwrap(scId)));
}

function equals(ShareClassId left, ShareClassId right) pure returns (bool) {
return ShareClassId.unwrap(left) == ShareClassId.unwrap(right);
}
Expand All @@ -17,8 +21,8 @@ function raw(ShareClassId scId) pure returns (bytes16) {
return ShareClassId.unwrap(scId);
}

function newShareClassId(PoolId poolId, uint32 index) pure returns (ShareClassId scId) {
return ShareClassId.wrap(bytes16((uint128(PoolId.unwrap(poolId)) << 64) + index));
function newShareClassId(PoolId poolId, uint32 index_) pure returns (ShareClassId scId) {
return ShareClassId.wrap(bytes16((uint128(PoolId.unwrap(poolId)) << 64) + index_));
}

using {isNull, raw, equals as ==} for ShareClassId global;
using {isNull, index, raw, equals as ==} for ShareClassId global;
Loading
Loading