Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
57d7874
removed usdc tests from health checks
yudilevi Nov 14, 2023
4d3070b
updated named accounts
yudilevi Mar 8, 2024
ab7c4ad
fix health tests
ivanzhelyazkov Aug 27, 2024
077e3b0
switch ci tests to github runners
ivanzhelyazkov Aug 27, 2024
a2a0553
minor fix
ivanzhelyazkov Aug 27, 2024
3db58bb
add tenderly config to ci
ivanzhelyazkov Aug 27, 2024
a4188c8
Merge pull request #492 from bancorprotocol/fix-health-tests
ivanzhelyazkov Aug 28, 2024
b74f5d6
add fee exemption whitelist - contracts
ivanzhelyazkov Oct 15, 2024
d023342
add fee exemption whitelist - tests
ivanzhelyazkov Oct 15, 2024
4b92c2a
add fee exemption whitelist - deployment scripts
ivanzhelyazkov Oct 15, 2024
02f3f55
whitelist - minor fixes
ivanzhelyazkov Oct 17, 2024
507a74d
remove multi-whitelist method
ivanzhelyazkov Oct 18, 2024
60fa652
Merge pull request #493 from bancorprotocol/add-fee-exemption-whitelist
ivanzhelyazkov Oct 18, 2024
201bd04
fix fork creation
ivanzhelyazkov Oct 28, 2024
c8941b4
simplify health tests
ivanzhelyazkov Oct 28, 2024
ce67d19
minor fork fixes
ivanzhelyazkov Oct 28, 2024
9091834
fix deploy:prepare
ivanzhelyazkov Oct 28, 2024
01daf3b
update lockfile
ivanzhelyazkov Oct 28, 2024
b170c6b
fix formatting
ivanzhelyazkov Oct 28, 2024
fb784e4
fix ci workflow files
ivanzhelyazkov Oct 28, 2024
be4144b
Merge pull request #494 from bancorprotocol/fork-creation-fix
ivanzhelyazkov Oct 29, 2024
42b03db
updated mainnet artifacts
yudilevi Oct 30, 2024
bab0ce1
fix health tests
ivanzhelyazkov Dec 5, 2024
e927cb4
Merge pull request #495 from bancorprotocol/fix-health-tests
ivanzhelyazkov Dec 6, 2024
67b751f
add v2.1 liquidity protection upgrade script
ivanzhelyazkov Jul 27, 2026
01bdeaa
update contracts-solidity npm version
ivanzhelyazkov Jul 29, 2026
2fd299d
minor fix
ivanzhelyazkov Jul 29, 2026
8ff05f7
minor fixes
ivanzhelyazkov Jul 29, 2026
324bd5a
Merge pull request #496 from bancorprotocol/add-upgrade-script-liquid…
ivanzhelyazkov Jul 29, 2026
eb8523b
minor fixes
ivanzhelyazkov Jul 29, 2026
93823d6
Merge pull request #497 from bancorprotocol/minor-fixes
ivanzhelyazkov Jul 29, 2026
97d7905
updated mainnet artifacts
yudilevi Jul 29, 2026
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
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
test:
name: Test

runs-on: [self-hosted, CI]
runs-on: ubuntu-latest
timeout-minutes: 600

steps:
Expand All @@ -22,12 +22,12 @@ jobs:
access_token: ${{ github.token }}

- name: Check out the repository
uses: actions/checkout@v2
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v2
uses: actions/setup-node@v4
with:
node-version: '16'
node-version: '20'

- name: Get yarn cache directory path
id: yarn-cache-dir-path
Expand Down
10 changes: 4 additions & 6 deletions .github/workflows/health.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,16 @@ jobs:
test:
name: Health Checks

runs-on: [self-hosted, HEALTH]
timeout-minutes: 600
runs-on: ubuntu-latest

steps:
- name: Check out the repository
uses: actions/checkout@v2
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v2
uses: actions/setup-node@v4
with:
node-version: '16'
node-version: '20'

- name: Get yarn cache directory path
id: yarn-cache-dir-path
Expand Down Expand Up @@ -50,4 +49,3 @@ jobs:
TENDERLY_TEST_PROJECT: v3-temp-forks
TENDERLY_USERNAME: bancor
TENDERLY_ACCESS_KEY: ${{ secrets.TENDERLY_ACCESS_KEY }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
6 changes: 3 additions & 3 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
should-run: ${{ steps.should-run.outputs.should-run }}

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4

- name: Check the latest commit
id: should-run
Expand Down Expand Up @@ -44,9 +44,9 @@ jobs:
uses: actions/checkout@v2

- name: Set up Node.js
uses: actions/setup-node@v2
uses: actions/setup-node@v4
with:
node-version: '16'
node-version: '20'

- name: Get yarn cache directory path
id: yarn-cache-dir-path
Expand Down
2 changes: 0 additions & 2 deletions contracts/helpers/TestBancorNetwork.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ contract TestBancorNetwork is BancorNetwork, TestTime {
IMasterVault initMasterVault,
IExternalProtectionVault initExternalProtectionVault,
IPoolToken initBNTPoolToken,
address bancorArbitrage,
address carbonPOL
)
BancorNetwork(
Expand All @@ -41,7 +40,6 @@ contract TestBancorNetwork is BancorNetwork, TestTime {
initMasterVault,
initExternalProtectionVault,
initBNTPoolToken,
bancorArbitrage,
carbonPOL
)
{}
Expand Down
132 changes: 103 additions & 29 deletions contracts/network/BancorNetwork.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import {
DoesNotExist,
InvalidToken,
InvalidPool,
NotEmpty
NotEmpty,
AccessDenied
} from "../utility/Utils.sol";

import { ROLE_ASSET_MANAGER } from "../vaults/interfaces/IVault.sol";
Expand Down Expand Up @@ -119,9 +120,6 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
// the BNT pool token
IPoolToken internal immutable _bntPoolToken;

// the Bancor arbitrage contract
address internal immutable _bancorArbitrage;

// the carbon POL contract
address internal immutable _carbonPOL;

Expand Down Expand Up @@ -156,8 +154,11 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
// min network fee amount that can be burned
uint256 private _minNetworkFeeBurn;

// a set of addresses which are exempt from trading / flashloan fees
EnumerableSetUpgradeable.AddressSet private _feeExemptionWhitelist;

// upgrade forward-compatibility storage gap
uint256[MAX_GAP - 12] private __gap;
uint256[MAX_GAP - 14] private __gap;

/**
* @dev triggered when a new pool collection is added
Expand Down Expand Up @@ -236,6 +237,16 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
*/
event MinNetworkFeeBurnUpdated(uint256 oldMinNetworkFeeBurn, uint256 newMinNetworkFeeBurn);

/**
* @dev triggered when an address gets added to the fee exemption whitelist
*/
event AddressAddedToWhitelist(address indexed addr);

/**
* @dev triggered when an address gets removed from the fee exemption whitelist
*/
event AddressRemovedFromWhitelist(address indexed addr);

/**
* @dev a "virtual" constructor that is only used to set immutable state variables
*/
Expand All @@ -246,7 +257,6 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
IMasterVault initMasterVault,
IExternalProtectionVault initExternalProtectionVault,
IPoolToken initBNTPoolToken,
address bancorArbitrage,
address carbonPOL
)
validAddress(address(initBNTGovernance))
Expand All @@ -255,7 +265,6 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
validAddress(address(initMasterVault))
validAddress(address(initExternalProtectionVault))
validAddress(address(initBNTPoolToken))
validAddress(address(bancorArbitrage))
validAddress(address(carbonPOL))
{
_bntGovernance = initBNTGovernance;
Expand All @@ -267,7 +276,6 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
_masterVault = initMasterVault;
_externalProtectionVault = initExternalProtectionVault;
_bntPoolToken = initBNTPoolToken;
_bancorArbitrage = bancorArbitrage;
_carbonPOL = carbonPOL;
}

Expand Down Expand Up @@ -341,13 +349,25 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
}
}

modifier onlyWhitelisted(address addr) {
_onlyWhitelisted(addr);

_;
}

function _onlyWhitelisted(address addr) internal view {
if (!_feeExemptionWhitelist.contains(addr)) {
revert AccessDenied();
}
}

receive() external payable {}

/**
* @inheritdoc Upgradeable
*/
function version() public pure override(IVersioned, Upgradeable) returns (uint16) {
return 10;
return 11;
}

/**
Expand Down Expand Up @@ -655,7 +675,8 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
minReturnAmount,
deadline,
beneficiary,
msg.sender
msg.sender,
false
);
}

Expand All @@ -678,7 +699,8 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
maxSourceAmount,
deadline,
beneficiary,
msg.sender
msg.sender,
false
);
}

Expand All @@ -692,7 +714,7 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
uint256 minReturnAmount,
uint256 deadline,
address beneficiary
) external payable whenNotPaused only(_bancorArbitrage) returns (uint256) {
) external payable whenNotPaused onlyWhitelisted(msg.sender) returns (uint256) {
return
_tradeBySourceAmount(
sourceToken,
Expand All @@ -701,7 +723,8 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
minReturnAmount,
deadline,
beneficiary,
msg.sender
msg.sender,
true
);
}

Expand All @@ -715,7 +738,7 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
uint256 maxSourceAmount,
uint256 deadline,
address beneficiary
) external payable whenNotPaused only(_bancorArbitrage) returns (uint256) {
) external payable whenNotPaused onlyWhitelisted(msg.sender) returns (uint256) {
return
_tradeByTargetAmount(
sourceToken,
Expand All @@ -724,7 +747,8 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
maxSourceAmount,
deadline,
beneficiary,
msg.sender
msg.sender,
true
);
}

Expand All @@ -749,8 +773,8 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
}

uint256 feeAmount;
if (msg.sender == _bancorArbitrage) {
// exempt arb contract from fees
if (_feeExemptionWhitelist.contains(msg.sender)) {
// exempt from fees
feeAmount = 0;
} else {
feeAmount = MathEx.mulDivF(amount, _networkSettings.flashLoanFeePPM(token), PPM_RESOLUTION);
Expand Down Expand Up @@ -878,6 +902,51 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
_depositingEnabled = status;
}

/**
* @inheritdoc IBancorNetwork
*/
function feeExemptionWhitelist() external view returns (address[] memory) {
uint256 length = _feeExemptionWhitelist.length();
address[] memory list = new address[](length);
for (uint256 i = 0; i < length; ++i) {
list[i] = _feeExemptionWhitelist.at(i);
}
return list;
}

/**
* @dev adds an address to the fee exemption whitelist
*
* requirements:
*
* - the caller must be the admin of the contract
*/
function addToWhitelist(address addr) external onlyAdmin {
_addToWhitelist(addr);
}

/**
* @dev removes an address from the fee exemption whitelist
*
* requirements:
*
* - the caller must be the admin of the contract
*/
function removeFromWhitelist(address addr) external onlyAdmin {
if (!_feeExemptionWhitelist.remove(addr)) {
revert DoesNotExist();
}

emit AddressRemovedFromWhitelist(addr);
}

/**
* @inheritdoc IBancorNetwork
*/
function isWhitelisted(address addr) external view returns (bool) {
return _feeExemptionWhitelist.contains(addr);
}

/**
* @dev returns the POL rewards ppm
*/
Expand Down Expand Up @@ -934,6 +1003,17 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
emit MinNetworkFeeBurnUpdated(oldMinNetworkFeeBurn, newMinNetworkFeeBurn);
}

/**
* @dev adds an address to the fee exemption whitelist
*/
function _addToWhitelist(address addr) private validExternalAddress(addr) {
if (!_feeExemptionWhitelist.add(addr)) {
revert AlreadyExists();
}

emit AddressAddedToWhitelist(addr);
}

/**
* @dev generates context ID for a deposit request
*/
Expand Down Expand Up @@ -1119,13 +1199,10 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
uint256 minReturnAmount,
uint256 deadline,
address beneficiary,
address sender
address sender,
bool ignoreFees
) private returns (uint256) {
_verifyTradeParams(sourceToken, targetToken, sourceAmount, minReturnAmount, deadline);
bool _ignoreFees = false;
if (sender == _bancorArbitrage) {
_ignoreFees = true;
}

return
_trade(
Expand All @@ -1134,7 +1211,7 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
bySourceAmount: true,
amount: sourceAmount,
limit: minReturnAmount,
ignoreFees: _ignoreFees
ignoreFees: ignoreFees
}),
TraderInfo({ trader: sender, beneficiary: beneficiary }),
deadline
Expand All @@ -1151,13 +1228,10 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
uint256 maxSourceAmount,
uint256 deadline,
address beneficiary,
address sender
address sender,
bool ignoreFees
) private returns (uint256) {
_verifyTradeParams(sourceToken, targetToken, targetAmount, maxSourceAmount, deadline);
bool _ignoreFees = false;
if (sender == _bancorArbitrage) {
_ignoreFees = true;
}

return
_trade(
Expand All @@ -1166,7 +1240,7 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, ReentrancyGuardUpgradeabl
bySourceAmount: false,
amount: targetAmount,
limit: maxSourceAmount,
ignoreFees: _ignoreFees
ignoreFees: ignoreFees
}),
TraderInfo({ trader: sender, beneficiary: beneficiary }),
deadline
Expand Down
Loading
Loading