Skip to content

Commit 62f6b01

Browse files
JDawg287nafurotakar-trundasetupyoav-el-certora
authored
Merge pull request #33 from agglayer/staging
* back to master * Basic 4626 confs and spec * Dependencies setup updated * add initial conf and specs * no longer need typecheck * rework installation in ci * fix * work on setup * add loop * more setup and a bunch of dispatchers * more setup * add mock * integrate Jochen's stuff * use new name * use harness override instead of summary to avoid dispatching * use johns branch * remove old stuff, add some mocks * add initial conf and specs * fix * work on setup * add loop * more setup and a bunch of dispatchers * more setup * add mock * integrate Jochen's stuff * use harness override instead of summary to avoid dispatching * use johns branch * remove old stuff, add some mocks * add basic confs and specs * ignore error with bun i * set prover version * two loop iters * disable cache * Add IUSDTMock * Work on NativeConverterMock, some more stuff from auto-setup * loop iter for GenericCustomToken * dispatch to ILxLyBridgeMock in WETHNativeConverter * Dispatch to ILxLyBridgeMock in GenericNativeConverter * loop iter for WETH * disable confs that already work * undo, doesn't work * add something for GenericVbToken * brain setup * update from brain * Work on WETHNativeConverter setup(s) * add storage harness * add confs for generic native converter * fix * deal with permit * use release * work on the bridge * work more on bridge * work on bridge * use the same for both * add to gitignore * add initial vault bridge token configs * restructure * add some linking * rename * fixes * more fixes * 🤦 * add solc maps and prover versions * download all solc versions * add missing packages * other fixes * more * fix * signature of (re)initialize changed * deal with permit in GenericVaultBridgeToken * dispatch initializer, add missing stuff for permit * force transferFeeCalculator to zero * fix * fix call resolution in WETH * some more links * linking for VaultBridgeTokenInitializer * remove some files * add missing entry to solc_map * add permit, work on GenericCustomToken * add to solc_map * Add MigrationManager, move stuff around * fix stuff in vbti * add missing file * rename, add migration manager * also apply to other space * renamed * fixes for migration manager * some more * fixes to MigrationManager-generic * link USDT * reorder * optimistic_loop * remove bridge from GenericCustomToken * rework converters * more work * adapt ci * more * put migrationmanager into VbETH * more on initializer * fix * work on hook * work on initializer stuff * some more * fix * ... * more on VbETH * fixes * move bridge dispatching to snippet * add exit * move unresolved dispatches to snippet * use right token * more work on VbETH * work on token mock * fix * dummy * use beta * remove USDT transfer fees * MockVault -> TestVault * fixes * oh my * more fixes * work on prover versions * alpha * back to release * beta? * master * try to fix reinitialize * back to alpha * work on WETH * add sanity * back to beta * work on initializer * cleanup, work on migration manager * work on migration manager * make sanity rule nontrivial * back to master * add summary for external customToken() * more stuff * actually uses migration manager via the bridge * get rid of PermitMock * remove IUSDTMock * add vault bridge token part2 * add part2 conf and specs * missing solc_map * new signature * dummy * Basic 4626 confs and spec * Dependencies setup updated * dummy * More rules * add contract extensions, fix permits * cleanup * more * More rules, conf updated * they updated the addresses * use johns PR * remove obsolete stuff now that linking actually works * also link WETH in WETHNativeConverter.conf * still not working in bridge? * extend TokenMock * VaultMock and some more * two more dispatchers to bridge * oopsie * add missing constructor * better implementation of deposit * More rules * Fixes * remove bridge, fix setup * remove bridge * make sure permits don't havoc * some fixes * apply storage extension to initializer as well * fix * add returns * some fixes * add missing link for initializer * fix spec * more fixes * yeah * use VbETH * resolve decimals() * fix spec file * work on MigrationManager specs * dispatching in GVBT * add missing using * work on GVBT dispatching * better prover config for VbETH * more dispatching for MigrationManager * dispatch deposit * fix completeMigration dispatch * fix envfree error * try new struct links * more * oh my * More rules * More rules * Slippage turned off * View method added [MUNGING] * yml updated * yml * yml * yml * files merged * CI run * yml * yml * CI * Rules adjusted * Solvency rule * Rerunning with sanity * Switched to balance-guard via hooks * requires adjusted * CI * CI * Ci test * CI test * More rules * Removing callFunctionsWithReceiverAndOwner * CI * Using a local copy of TestVault * Switched to emptyFunc summary * Rebalance rule reworked * noActivityWhenPaused rule fixed * Cleanup * GenericVaultBridgeToken copied to mocks * cleanup * Added setup and rules for NativeConverter * Converter rules * Cleanup + comments * Cleanup * Ci fixed * Cleanup * Bug fixed * Typo fixed * new CI run * cleanup * Cleanup * Method moved to the harness instead of munging. * remappings removed * Changed to tun on master * build cache disabled * Update certora.yml * GitHub Action v2 * feat: add trigger on pull to staging --------- Signed-off-by: JDawg287 <sjcool420@hotmail.co.uk> Co-authored-by: Gereon Kremer <gereon.kremer@gmail.com> Co-authored-by: Otakar <Otakar@certora.com> Co-authored-by: setup <setup@ip-172-31-3-243.eu-central-1.compute.internal> Co-authored-by: yoav-el-certora <122207807+yoav-el-certora@users.noreply.github.com> Co-authored-by: Ondrej Kurák <ondrej@certora.com>
1 parent 542fa6c commit 62f6b01

31 files changed

Lines changed: 2380 additions & 1 deletion

.github/workflows/certora.yml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: Certora - Verification
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- staging
7+
8+
env:
9+
FOUNDRY_PROFILE: ci
10+
CONFIGS: |
11+
certora/confs/GenericVaultBridgeToken.conf
12+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/GenericVaultBridgeToken_invariants.spec --rule netCollectedYieldAccounted --rule netCollectedYieldLimited
13+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/GenericVaultBridgeToken_invariants.spec --rule minimumReservePercentageLimit --rule reserveBacked
14+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/GenericVaultBridgeToken_invariants.spec --rule vaultBridgeTokenSolvency --rule vaultBridgeTokenSolvency_simple
15+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/GenericVaultBridgeToken_invariants.spec --rule assetsMoreThanSupply --rule noSupplyIfNoAssets
16+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/GenericVaultBridgeToken_invariants.spec --rule zeroAllowanceOnAssets --rule zeroAllowanceOnShares
17+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/GenericVaultBridgeToken_allowedChanges.spec
18+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/GenericVaultBridgeToken_integrity.spec
19+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/GVBTBalances.spec
20+
certora/confs/GenericVaultBridgeToken.conf --verify GenericVaultBridgeToken:certora/specs/tokenMockBalances.spec
21+
certora/confs/GenericNativeConverter.conf
22+
certora/confs/MigrationManager-generic.conf --rule onMsgReceived_doesntAlwaysRevert
23+
jobs:
24+
check:
25+
runs-on: ubuntu-latest
26+
permissions:
27+
contents: read
28+
statuses: write
29+
pull-requests: write
30+
id-token: write
31+
steps:
32+
- name: checkout repository
33+
uses: actions/checkout@v4
34+
with:
35+
submodules: recursive
36+
37+
- name: install foundry
38+
uses: foundry-rs/foundry-toolchain@v1
39+
40+
- name: install bun
41+
uses: oven-sh/setup-bun@v2
42+
43+
- name: bun install
44+
run: |
45+
forge soldeer install
46+
bun install || true
47+
48+
- name: setup bridge repo
49+
run: |
50+
git clone https://github.com/0xPolygonHermez/zkevm-contracts.git
51+
cd zkevm-contracts/
52+
git checkout v10.1.0-rc.1
53+
npm install
54+
55+
- name: run configs
56+
uses: Certora/certora-run-action@v2
57+
with:
58+
cli-release: beta
59+
configurations: ${{ env.CONFIGS }}
60+
solc-versions: 0.8.28 0.8.29
61+
solc-remove-version-prefix: "0."
62+
job-name: "Verified Rules"
63+
certora-key: ${{ secrets.CERTORAKEY }}
64+
env:
65+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,9 @@ docs/
2121
coverage
2222
lcov.info
2323

24-
.DS_Store
24+
.DS_Store
25+
26+
# certora
27+
.certora_internal/
28+
zkevm-contracts/
29+
emv-*/*
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{
2+
"files": [
3+
"certora/harnesses/StorageExtension.sol",
4+
"certora/mocks/TokenMock.sol",
5+
"src/custom-tokens/GenericNativeConverter.sol",
6+
"src/custom-tokens/GenericCustomToken.sol",
7+
"src/MigrationManager.sol",
8+
"certora/mocks/ILxLyBridgeMock.sol",
9+
],
10+
"global_timeout": "7200",
11+
"loop_iter": "1",
12+
"msg": "GenericNativeConverter",
13+
"mutations": {
14+
"gambit": [
15+
{
16+
"filename": "src/custom-tokens/GenericNativeConverter.sol",
17+
"num_mutants": 5
18+
}
19+
]
20+
},
21+
"optimistic_hashing": true,
22+
"parametric_contracts": ["GenericNativeConverter"],
23+
"optimistic_loop": true,
24+
"packages": [
25+
"@types/bun=node_modules/@types/bun",
26+
"@0xpolygonhermez/zkevm-commonjs=node_modules/@0xpolygonhermez/zkevm-commonjs",
27+
"@openzeppelin-contracts-upgradeable=dependencies/@openzeppelin-contracts-upgradeable-5.1.0",
28+
"@openzeppelin-contracts=dependencies/@openzeppelin-contracts-5.1.0",
29+
"@openzeppelin/contracts=dependencies/@openzeppelin-contracts-5.1.0",
30+
"forge-std=dependencies/forge-std-1.9.4/src",
31+
// for zkmevm-contracts
32+
"@openzeppelin/contracts-upgradeable4=zkevm-contracts/node_modules/@openzeppelin/contracts-upgradeable4",
33+
"@openzeppelin/contracts-upgradeable5=zkevm-contracts/node_modules/@openzeppelin/contracts-upgradeable5",
34+
"@zkmcontractsv2=zkevm-contracts/contracts/v2",
35+
],
36+
"process": "emv",
37+
"prover_args": [
38+
"-smt_initialSplitDepth 4",
39+
"-depth 10",
40+
"-mediumTimeout 2"
41+
],
42+
"rule_sanity": "basic",
43+
"solc_map": {
44+
"StorageExtension": "solc8.29",
45+
"GenericNativeConverter": "solc8.29",
46+
"GenericCustomToken": "solc8.29",
47+
"MigrationManager": "solc8.29",
48+
"TokenMock": "solc8.28",
49+
"ILxLyBridgeMock": "solc8.29",
50+
},
51+
"solc_optimize": "200",
52+
"solc_via_ir": true,
53+
"storage_extension_harnesses": [
54+
"GenericNativeConverter=StorageExtension",
55+
],
56+
"struct_link": [
57+
"GenericNativeConverter:customToken=GenericCustomToken",
58+
"GenericNativeConverter:underlyingToken=TokenMock",
59+
],
60+
"server": "production",
61+
"verify": "GenericNativeConverter:certora/specs/GenericNativeConverter_invariants.spec"
62+
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
{
2+
"assert_autofinder_success": true,
3+
"contract_extensions": {
4+
"GenericVaultBridgeToken": [ {
5+
"extension": "VaultBridgeTokenPart2",
6+
"exclude": [ "rebalanceReserve",
7+
"allowance", "approve", "asset", "backingDifference",
8+
"balanceOf", "claimAndRedeem", "convertToAssets",
9+
"convertToShares", "decimals", "DEFAULT_ADMIN_ROLE", "deposit",
10+
"depositAndBridge", "depositWithPermit",
11+
"depositWithPermitAndBridge", "DOMAIN_SEPARATOR",
12+
"eip712Domain", "getRoleAdmin", "grantRole", "hasRole",
13+
"lxlyBridge", "lxlyId", "maxDeposit", "maxMint", "maxRedeem",
14+
"maxWithdraw", "migrationFeesFund", "migrationManager",
15+
"minimumReservePercentage", "minimumYieldVaultDeposit", "mint",
16+
"name", "nonces", "paused", "PAUSER_ROLE",
17+
"performReversibleYieldVaultDeposit", "permit",
18+
"previewDeposit", "previewMint", "previewRedeem",
19+
"previewWithdraw", "REBALANCER_ROLE", "redeem", "renounceRole",
20+
"reservedAssets", "reservePercentage", "revokeRole",
21+
"stakedAssets", "supportsInterface", "symbol", "totalAssets",
22+
"totalSupply", "transfer", "transferFrom", "underlyingToken",
23+
"version", "withdraw", "yield", "YIELD_COLLECTOR_ROLE",
24+
"yieldRecipient", "yieldVault",
25+
"yieldVaultMaximumSlippagePercentage",
26+
] },
27+
],
28+
"VaultBridgeTokenInitializer": [ {
29+
"extension": "VaultBridgeTokenPart2",
30+
"exclude": [ "rebalanceReserve",
31+
"allowance", "approve", "asset", "backingDifference",
32+
"balanceOf", "claimAndRedeem", "convertToAssets",
33+
"convertToShares", "decimals", "DEFAULT_ADMIN_ROLE", "deposit",
34+
"depositAndBridge", "depositWithPermit",
35+
"depositWithPermitAndBridge", "DOMAIN_SEPARATOR",
36+
"eip712Domain", "getRoleAdmin", "grantRole", "hasRole",
37+
"lxlyBridge", "lxlyId", "maxDeposit", "maxMint", "maxRedeem",
38+
"maxWithdraw", "migrationFeesFund", "migrationManager",
39+
"minimumReservePercentage", "minimumYieldVaultDeposit", "mint",
40+
"name", "nonces", "paused", "PAUSER_ROLE",
41+
"performReversibleYieldVaultDeposit", "permit",
42+
"previewDeposit", "previewMint", "previewRedeem",
43+
"previewWithdraw", "REBALANCER_ROLE", "redeem", "renounceRole",
44+
"reservedAssets", "reservePercentage", "revokeRole",
45+
"stakedAssets", "supportsInterface", "symbol", "totalAssets",
46+
"totalSupply", "transfer", "transferFrom", "underlyingToken",
47+
"version", "withdraw", "yield", "YIELD_COLLECTOR_ROLE",
48+
"yieldRecipient", "yieldVault",
49+
"yieldVaultMaximumSlippagePercentage",
50+
] },
51+
],
52+
},
53+
"contract_recursion_limit": "1",
54+
"disable_auto_cache_key_gen": true,
55+
"files": [
56+
"certora/harnesses/StorageExtension.sol",
57+
"certora/harnesses/GenericVaultBridgeToken.sol",
58+
"certora/mocks/ILxLyBridgeMock.sol",
59+
"certora/mocks/TokenMock.sol",
60+
"certora/mocks/VaultMock.sol",
61+
"src/VaultBridgeTokenInitializer.sol",
62+
"src/VaultBridgeTokenPart2.sol",
63+
],
64+
"server": "production",
65+
"global_timeout": "7200",
66+
"smt_timeout": "7200",
67+
"loop_iter": "2",
68+
"link": [
69+
"VaultMock:asset=TokenMock",
70+
],
71+
"msg": "GenericVaultBridgeToken",
72+
"mutations": {
73+
"gambit": [
74+
{
75+
"filename": "src/vault-bridge-tokens/GenericVaultBridgeToken.sol",
76+
"num_mutants": 5
77+
}
78+
]
79+
},
80+
"optimistic_contract_recursion": true,
81+
"optimistic_hashing": true,
82+
"optimistic_loop": true,
83+
"optimistic_summary_recursion": true,
84+
"packages": [
85+
"@types/bun=node_modules/@types/bun",
86+
"@0xpolygonhermez/zkevm-commonjs=node_modules/@0xpolygonhermez/zkevm-commonjs",
87+
"@openzeppelin-contracts-upgradeable=dependencies/@openzeppelin-contracts-upgradeable-5.1.0",
88+
"@openzeppelin-contracts=dependencies/@openzeppelin-contracts-5.1.0",
89+
"@openzeppelin/contracts=dependencies/@openzeppelin-contracts-5.1.0",
90+
"forge-std=dependencies/forge-std-1.9.4/src",
91+
// for zkmevm-contracts
92+
"@openzeppelin/contracts-upgradeable4=zkevm-contracts/node_modules/@openzeppelin/contracts-upgradeable4",
93+
"@openzeppelin/contracts-upgradeable5=zkevm-contracts/node_modules/@openzeppelin/contracts-upgradeable5",
94+
"@zkmcontractsv2=zkevm-contracts/contracts/v2",
95+
],
96+
"process": "emv",
97+
"prover_args": [
98+
"-maxDecompiledCommandCount 5000000",
99+
"-maxBlockCount 500000",
100+
],
101+
"rule_sanity": "basic",
102+
"prover_version": "master",
103+
"parametric_contracts": ["GenericVaultBridgeToken", "VaultBridgeTokenPart2"],
104+
"solc_map": {
105+
"StorageExtension": "solc8.29",
106+
"GenericVaultBridgeToken": "solc8.29",
107+
"MigrationManager": "solc8.29",
108+
"VaultBridgeTokenInitializer": "solc8.29",
109+
"VaultBridgeTokenPart2": "solc8.29",
110+
"ILxLyBridgeMock": "solc8.29",
111+
"VaultMock": "solc8.29",
112+
"TokenMock": "solc8.28",
113+
},
114+
"solc_optimize": "200",
115+
//"build_cache": true,
116+
"solc_via_ir": true,
117+
"storage_extension_harnesses": [
118+
"GenericVaultBridgeToken=StorageExtension",
119+
"VaultBridgeTokenInitializer=StorageExtension",
120+
],
121+
"struct_link": [
122+
"GenericVaultBridgeToken:lxlyBridge=ILxLyBridgeMock",
123+
"GenericVaultBridgeToken:underlyingToken=TokenMock",
124+
"GenericVaultBridgeToken:yieldVault=VaultMock",
125+
"GenericVaultBridgeToken:_vaultBridgeTokenPart2=VaultBridgeTokenPart2",
126+
"VaultBridgeTokenInitializer:underlyingToken=TokenMock",
127+
"VaultBridgeTokenInitializer:yieldVault=VaultMock",
128+
],
129+
"summary_recursion_limit": "2",
130+
"verify": "GenericVaultBridgeToken:certora/specs/GenericVaultBridgeToken_ERC4626.spec"
131+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"override_base_config": "certora/confs/base/MigrationManager.conf",
3+
"msg": "MigrationManager with GenericVaultBridgeToken",
4+
"struct_link": [
5+
"MigrationManager:underlyingToken=TokenMock",
6+
"MigrationManager:vbToken=GenericVaultBridgeToken",
7+
"GenericVaultBridgeToken:underlyingToken=TokenMock",
8+
"GenericVaultBridgeToken:yieldVault=VaultMock",
9+
"GenericVaultBridgeToken:_vaultBridgeTokenPart2=VaultBridgeTokenPart2",
10+
"VbETH:underlyingToken=TokenMock",
11+
"VbETH:yieldVault=VaultMock",
12+
"VbETH:_vaultBridgeTokenPart2=VaultBridgeTokenPart2",
13+
"VaultBridgeTokenPart2:underlyingToken=TokenMock",
14+
"VaultBridgeTokenPart2:yieldVault=VaultMock",
15+
],
16+
"verify": "MigrationManager:certora/specs/MigrationManager-generic.spec"
17+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
{
2+
"files": [
3+
"certora/harnesses/StorageExtension.sol",
4+
"certora/mocks/TokenMock.sol",
5+
"certora/mocks/VaultMock.sol",
6+
"src/MigrationManager.sol",
7+
"src/VaultBridgeTokenPart2.sol",
8+
"src/vault-bridge-tokens/GenericVaultBridgeToken.sol",
9+
"src/vault-bridge-tokens/vbETH/VbETH.sol",
10+
],
11+
"global_timeout": "7200",
12+
"loop_iter": "2",
13+
"msg": "sanity_MigrationManager",
14+
"optimistic_hashing": true,
15+
"optimistic_loop": true,
16+
"packages": [
17+
"@types/bun=node_modules/@types/bun",
18+
"@0xpolygonhermez/zkevm-commonjs=node_modules/@0xpolygonhermez/zkevm-commonjs",
19+
"@openzeppelin-contracts-upgradeable=dependencies/@openzeppelin-contracts-upgradeable-5.1.0",
20+
"@openzeppelin-contracts=dependencies/@openzeppelin-contracts-5.1.0",
21+
"@openzeppelin/contracts=dependencies/@openzeppelin-contracts-5.1.0",
22+
"forge-std=dependencies/forge-std-1.9.4/src",
23+
// for zkmevm-contracts
24+
"@openzeppelin/contracts-upgradeable4=zkevm-contracts/node_modules/@openzeppelin/contracts-upgradeable4",
25+
"@openzeppelin/contracts-upgradeable5=zkevm-contracts/node_modules/@openzeppelin/contracts-upgradeable5",
26+
"@zkmcontractsv2=zkevm-contracts/contracts/v2",
27+
],
28+
"process": "emv",
29+
"prover_args": [
30+
31+
],
32+
"rule_sanity": "basic",
33+
"solc_map": {
34+
"StorageExtension": "solc8.29",
35+
"MigrationManager": "solc8.29",
36+
"VaultBridgeTokenPart2": "solc8.29",
37+
"GenericVaultBridgeToken": "solc8.29",
38+
"VbETH": "solc8.29",
39+
"VaultMock": "solc8.29",
40+
"TokenMock": "solc8.28",
41+
},
42+
"solc_optimize": "200",
43+
"solc_via_ir": true,
44+
"server": "production",
45+
"storage_extension_harnesses": [
46+
"MigrationManager=StorageExtension",
47+
"GenericVaultBridgeToken=StorageExtension",
48+
"VbETH=StorageExtension",
49+
],
50+
"verify": "MigrationManager:certora/specs/setup/sanity_MigrationManager.spec"
51+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//
2+
pragma solidity 0.8.29;
3+
4+
// Main functionality.
5+
import {VaultBridgeToken} from "../../src/VaultBridgeToken.sol";
6+
7+
// Other functionality.
8+
import {IVersioned} from "../../src/etc/IVersioned.sol";
9+
10+
/// @title Generic Vault Bridge Token
11+
/// @dev This contract can be used to deploy vbTokens that do not require any customization.
12+
contract GenericVaultBridgeToken is VaultBridgeToken {
13+
constructor() {
14+
_disableInitializers();
15+
}
16+
17+
function initialize(address initializer_, VaultBridgeToken.InitializationParameters calldata initParams)
18+
external
19+
initializer
20+
{
21+
// Initialize the base implementation.
22+
__VaultBridgeToken_init(initializer_, initParams);
23+
}
24+
25+
// -----================= ::: INFO ::: =================-----
26+
27+
/// @inheritdoc IVersioned
28+
function version() external pure virtual returns (string memory) {
29+
return "0.5.0";
30+
}
31+
32+
// Harness methods
33+
function rebalanceReserve_harness(bool force, bool allowRebalanceDown) external
34+
{
35+
_rebalanceReserve(force, allowRebalanceDown);
36+
}
37+
38+
function simulateWithdraw_harness(uint256 assets, bool force) external returns (uint256)
39+
{
40+
return _simulateWithdraw(assets, force);
41+
}
42+
43+
function depositIntoYieldVault_harness(uint256 assets, bool exact) external returns (uint256)
44+
{
45+
return _depositIntoYieldVault(assets, exact);
46+
}
47+
48+
/// @notice Yield collected getter
49+
function getNetCollectedYield() public view returns (uint256) {
50+
VaultBridgeTokenStorage storage $ = _getVaultBridgeTokenStorage();
51+
return $._netCollectedYield;
52+
}
53+
}

0 commit comments

Comments
 (0)