Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V1.1 #91

Open
wants to merge 46 commits into
base: main
Choose a base branch
from
Open

V1.1 #91

Changes from 1 commit
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
23ddc6b
feat: add vault with delegations & recompose vault structure - wip
1kresh Feb 13, 2025
2d36736
chore: out files
1kresh Feb 13, 2025
0b9c229
feat: allow increase epoch duration
1kresh Feb 13, 2025
955f392
feat: first txn whitelisting
1kresh Feb 13, 2025
6b945af
feat: add flashloan
1kresh Feb 14, 2025
5f7de07
feat: add interfaces & tests
1kresh Feb 17, 2025
53c430d
fix: adjust migrations & encodeWithSelector -> encodeCall & v1.1.0 ->…
1kresh Feb 17, 2025
90677dd
chore: migration tests & votes fix
1kresh Feb 18, 2025
12dc2dc
fix: adjust migrations
1kresh Feb 18, 2025
3c79587
docs: add descriptions
1kresh Feb 18, 2025
d9ba6e7
feat: make epoch's increase auto-commit
1kresh Feb 18, 2025
a7b63b1
docs: add missing description
1kresh Feb 18, 2025
1f1e8ab
test: more coverage
1kresh Feb 23, 2025
4c06bed
refactor: simplify constructors
1kresh Feb 23, 2025
7a00ce5
feat: allow epoch duration set delay change
1kresh Feb 23, 2025
2bcd165
chore: sync out files
1kresh Feb 23, 2025
2c315c5
refactor: name error
1kresh Feb 24, 2025
2c6f46b
chore: sync out
1kresh Feb 24, 2025
22d32c7
fix: add exit window for small current epoch durations
1kresh Feb 24, 2025
608fa54
fix: adjust setEpochDuration
1kresh Feb 24, 2025
762081c
refactor: rename epoch vars
1kresh Feb 24, 2025
cf61075
fix: nullify fee when no receiver
1kresh Feb 24, 2025
9d2999a
Merge pull request #92 from symbioticfi/epochs-inc-auto
1kresh Feb 24, 2025
5c75584
refactor: reduce one delegate call step
1kresh Feb 24, 2025
6231135
feat: enable flashloan flag
1kresh Feb 25, 2025
3827590
refactor: flashloan -> flashLoan
1kresh Feb 25, 2025
7358a93
Merge pull request #93 from symbioticfi/reduce-delegate-calls
1kresh Feb 25, 2025
62d1a66
Merge branch 'v1.1.0' into flashloan-flag
1kresh Feb 25, 2025
16ed27d
Merge pull request #94 from symbioticfi/flashloan-flag
1kresh Feb 25, 2025
0868cc5
chore: add new vault version - wip
1kresh Feb 25, 2025
2b6244b
fix: possible reinitialization
1kresh Feb 25, 2025
6e1841f
chore: fix tests
1kresh Feb 25, 2025
e42a99c
chore: more tests
1kresh Feb 25, 2025
14e9c72
Merge pull request #95 from symbioticfi/new-version
1kresh Feb 25, 2025
9032060
fix: certora - FlashFee is rounding down
1kresh Feb 26, 2025
1b83769
fix: certora - The declaration of _Vault_init() in VaultImplementatio…
1kresh Feb 26, 2025
c1223a0
chore: add v1.1 deploy and migrate scripts
1kresh Feb 27, 2025
1644ecf
refactor: minor changes
1kresh Feb 27, 2025
b1c330f
Merge pull request #98 from symbioticfi/minors
1kresh Feb 27, 2025
e1d5e01
Merge branch 'v1.1.0' into certora-fixes
1kresh Feb 27, 2025
854744c
Merge branch 'certora-fixes' into v1.1-script
1kresh Feb 27, 2025
85fb759
Merge pull request #97 from symbioticfi/v1.1-script
1kresh Feb 27, 2025
8f0b940
chore: adjust script name
1kresh Feb 28, 2025
8963efd
fix: allow for donations in flash loans
1kresh Mar 6, 2025
c632876
test: cover fee-on-transfer flash loans
1kresh Mar 6, 2025
8109878
Merge pull request #99 from symbioticfi/certora-fixes3
1kresh Mar 6, 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
Prev Previous commit
Next Next commit
test: cover fee-on-transfer flash loans
1kresh committed Mar 6, 2025
commit c632876f8599fd83adf25f475b14eafc2f273c22
8 changes: 6 additions & 2 deletions test/mocks/ERC3156FlashBorrower.sol
Original file line number Diff line number Diff line change
@@ -34,9 +34,13 @@ contract ERC3156FlashBorrower is IERC3156FlashBorrower {
uint256 fee,
bytes calldata data
) external returns (bytes32) {
bool flag = abi.decode(data, (bool));
if (flag) {
(bool flag1, bool flag2) = abi.decode(data, (bool, bool));
if (flag1) {
IERC20(token).safeTransfer(msg.sender, amount + fee);

if (flag2) {
IERC20(token).safeTransfer(msg.sender, 2);
}
}

return RETURN_VALUE;
118 changes: 112 additions & 6 deletions test/vault/v1.1/Vault.t.sol
Original file line number Diff line number Diff line change
@@ -3863,7 +3863,7 @@ contract VaultTest is Test {

assertEq(vault.maxFlashLoan(address(collateral)), amount);

borrower.run(amount, vault.RETURN_VALUE(), abi.encode(true));
borrower.run(amount, vault.RETURN_VALUE(), abi.encode(true, false));

assertEq(collateral.balanceOf(address(vault)), amount);
assertEq(collateral.balanceOf(address(borrower)), amount - vault.flashFee(address(collateral), amount));
@@ -3876,7 +3876,113 @@ contract VaultTest is Test {

bytes32 RETURN_VALUE = vault.RETURN_VALUE();
vm.expectRevert(IVault.MaxLoanExceeded.selector);
borrower.run(amount, RETURN_VALUE, abi.encode(true));
borrower.run(amount, RETURN_VALUE, abi.encode(true, false));
}

function test_FlashLoanFeeOnTransfer(uint256 amount, uint256 feeRate) public {
amount = bound(amount, 2, 100 * 10 ** 18);
feeRate = bound(feeRate, 1, 1e9);

uint256 blockTimestamp = vm.getBlockTimestamp();
blockTimestamp = blockTimestamp + 1_720_700_948;
vm.warp(blockTimestamp);

address[] memory networkLimitSetRoleHolders = new address[](1);
networkLimitSetRoleHolders[0] = alice;
address[] memory operatorNetworkSharesSetRoleHolders = new address[](1);
operatorNetworkSharesSetRoleHolders[0] = alice;
(address vault_,,) = vaultConfigurator.create(
IVaultConfigurator.InitParams({
version: 3,
owner: alice,
vaultParams: abi.encode(
IVault.InitParams({
collateral: address(feeOnTransferCollateral),
burner: address(0xdEaD),
epochDuration: 1,
depositWhitelist: false,
isDepositLimit: false,
depositLimit: 0,
epochDurationSetEpochsDelay: 3,
flashLoanEnabled: true,
flashFeeRate: 0,
flashFeeReceiver: alice,
defaultAdminRoleHolder: alice,
depositWhitelistSetRoleHolder: alice,
depositorWhitelistRoleHolder: alice,
depositorsWhitelisted: new address[](0),
isDepositLimitSetRoleHolder: alice,
depositLimitSetRoleHolder: alice,
epochDurationSetRoleHolder: alice,
flashLoanEnabledSetRoleHolder: alice,
flashFeeRateSetRoleHolder: alice,
flashFeeReceiverSetRoleHolder: alice
})
),
delegatorIndex: 0,
delegatorParams: abi.encode(
INetworkRestakeDelegator.InitParams({
baseParams: IBaseDelegator.BaseParams({
defaultAdminRoleHolder: alice,
hook: address(0),
hookSetRoleHolder: alice
}),
networkLimitSetRoleHolders: networkLimitSetRoleHolders,
operatorNetworkSharesSetRoleHolders: operatorNetworkSharesSetRoleHolders
})
),
withSlasher: false,
slasherIndex: 0,
slasherParams: abi.encode(ISlasher.InitParams({baseParams: IBaseSlasher.BaseParams({isBurnerHook: false})}))
})
);

vault = VaultImplementation(vault_);

feeOnTransferCollateral.transfer(alice, amount + 1);
vm.startPrank(alice);
feeOnTransferCollateral.approve(address(vault), amount);
vault.deposit(alice, amount);
vm.stopPrank();

if (feeRate > 0) {
_setFlashFeeRate(alice, feeRate);
}

address receiver = address(0xdEaD);

_setFlashFeeReceiver(alice, receiver);

ERC3156FlashBorrower borrower = new ERC3156FlashBorrower(address(vault));

feeOnTransferCollateral.transfer(address(borrower), amount + 4);

assertEq(feeOnTransferCollateral.balanceOf(address(vault)), amount - 1);
assertEq(feeOnTransferCollateral.balanceOf(address(borrower)), amount + 3); // 1 is lost on receive, 1 on transferFrom, 1 on transfer
assertEq(feeOnTransferCollateral.balanceOf(address(receiver)), 0);

assertEq(vault.maxFlashLoan(address(feeOnTransferCollateral)), amount - 1);

borrower.run(amount - 1, vault.RETURN_VALUE(), abi.encode(true, true));

assertEq(feeOnTransferCollateral.balanceOf(address(vault)), amount - 1);
assertEq(
feeOnTransferCollateral.balanceOf(address(borrower)),
amount - vault.flashFee(address(feeOnTransferCollateral), amount - 1)
);
assertEq(
feeOnTransferCollateral.balanceOf(address(receiver)),
vault.flashFee(address(feeOnTransferCollateral), amount - 1) - 1
);

_grantFlashloanEnabledSetRole(alice, alice);
_setFlashloanEnabled(alice, false);

assertEq(vault.maxFlashLoan(address(feeOnTransferCollateral)), 0);

bytes32 RETURN_VALUE = vault.RETURN_VALUE();
vm.expectRevert(IVault.MaxLoanExceeded.selector);
borrower.run(amount, RETURN_VALUE, abi.encode(true, true));
}

function test_FlashLoanRevertTooLowFlashLoanValue(
@@ -3950,7 +4056,7 @@ contract VaultTest is Test {

bytes32 RETURN_VALUE = vault.RETURN_VALUE();
vm.expectRevert(IVault.TooLowFlashLoanValue.selector);
borrower.run(0, RETURN_VALUE, abi.encode(true));
borrower.run(0, RETURN_VALUE, abi.encode(true, false));
}

function test_FlashLoanRevert(uint256 amount, uint256 feeRate) public {
@@ -4025,7 +4131,7 @@ contract VaultTest is Test {

bytes32 RETURN_VALUE = vault.RETURN_VALUE();
vm.expectRevert();
borrower.run(amount, RETURN_VALUE, abi.encode(true));
borrower.run(amount, RETURN_VALUE, abi.encode(true, false));
}

function test_FlashLoanRevertMaxLoanExceeded(uint256 amount, uint256 feeRate) public {
@@ -4104,7 +4210,7 @@ contract VaultTest is Test {

bytes32 RETURN_VALUE = vault.RETURN_VALUE();
vm.expectRevert(IVault.MaxLoanExceeded.selector);
borrower.run(amount + 1, RETURN_VALUE, abi.encode(true));
borrower.run(amount + 1, RETURN_VALUE, abi.encode(true, false));
}

function test_FlashLoanRevertInvalidReceiver(uint256 amount, uint256 feeRate) public {
@@ -4182,7 +4288,7 @@ contract VaultTest is Test {
collateral.transfer(address(borrower), amount);

vm.expectRevert(IVault.InvalidReceiver.selector);
borrower.run(amount, bytes32(0), abi.encode(true));
borrower.run(amount, bytes32(0), abi.encode(true, false));
}

function test_FlashLoanRevertInvalidReturnAmount(uint256 amount, uint256 feeRate) public {