Skip to content

Commit 0c5799b

Browse files
Fix rbate handling for case where reserve is feeAccounted but not entitledRebate (#1030)
* For split trade 50:50 with 2 reserves fee entitled. out of them one is entitled rebate. current: 1 entitled rebate reserve will recieve all rebate amount fix: entitled rebate reserve will recieve rebate amount according to its split in the trade Co-authored-by: Ilan Doron <[email protected]>
1 parent ed32f24 commit 0c5799b

File tree

3 files changed

+17
-22
lines changed

3 files changed

+17
-22
lines changed

contracts/sol6/KyberNetwork.sol

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ contract KyberNetwork is WithdrawableNoModifiers, Utils5, IKyberNetwork, Reentra
6262
/// @param networkFeeBps Network fee bps determined by kyberDao, or default value
6363
/// @param numEntitledRebateReserves No. of reserves that are eligible for rebates
6464
/// @param feeAccountedBps Proportion of this trade that fee is accounted to, in BPS. Up to 2 * BPS
65-
/// @param entitledRebateBps Proportion of reserves entitled for rebate, in BPS. Up to 2 * BPS
66-
/// @param rateWithNetworkFee src -> dest token rate, after accounting for only network fee
6765
struct TradeData {
6866
TradeInput input;
6967
ReservesData tokenToEth;
@@ -74,7 +72,6 @@ contract KyberNetwork is WithdrawableNoModifiers, Utils5, IKyberNetwork, Reentra
7472
uint256 networkFeeBps;
7573
uint256 numEntitledRebateReserves;
7674
uint256 feeAccountedBps; // what part of this trade is fee paying. for token -> token - up to 200%
77-
uint256 entitledRebateBps;
7875
}
7976

8077
struct TradeInput {
@@ -979,7 +976,7 @@ contract KyberNetwork is WithdrawableNoModifiers, Utils5, IKyberNetwork, Reentra
979976
rebatePercentBps,
980977
tradeData.tokenToEth,
981978
index,
982-
tradeData.entitledRebateBps
979+
tradeData.feeAccountedBps
983980
);
984981

985982
// eth -> token
@@ -988,7 +985,7 @@ contract KyberNetwork is WithdrawableNoModifiers, Utils5, IKyberNetwork, Reentra
988985
rebatePercentBps,
989986
tradeData.ethToToken,
990987
index,
991-
tradeData.entitledRebateBps
988+
tradeData.feeAccountedBps
992989
);
993990

994991
rebateWallets = kyberStorage.getRebateWalletsFromIds(rebateReserveIds);
@@ -999,14 +996,14 @@ contract KyberNetwork is WithdrawableNoModifiers, Utils5, IKyberNetwork, Reentra
999996
uint256[] memory rebatePercentBps,
1000997
ReservesData memory reservesData,
1001998
uint256 index,
1002-
uint256 entitledRebateBps
999+
uint256 feeAccountedBps
10031000
) internal pure returns (uint256) {
10041001
uint256 _index = index;
10051002

10061003
for (uint256 i = 0; i < reservesData.isEntitledRebateFlags.length; i++) {
10071004
if (reservesData.isEntitledRebateFlags[i]) {
10081005
rebateReserveIds[_index] = reservesData.ids[i];
1009-
rebatePercentBps[_index] = (reservesData.splitsBps[i] * BPS) / entitledRebateBps;
1006+
rebatePercentBps[_index] = (reservesData.splitsBps[i] * BPS) / feeAccountedBps;
10101007
_index++;
10111008
}
10121009
}
@@ -1130,7 +1127,6 @@ contract KyberNetwork is WithdrawableNoModifiers, Utils5, IKyberNetwork, Reentra
11301127
tradeData.feeAccountedBps += reservesData.splitsBps[i];
11311128

11321129
if (reservesData.isEntitledRebateFlags[i]) {
1133-
tradeData.entitledRebateBps += reservesData.splitsBps[i];
11341130
tradeData.numEntitledRebateReserves++;
11351131
}
11361132
}

solcOptimiserSettings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
module.exports = {
22
enabled: true,
3-
runs: 410
3+
runs: 430
44
}

test/sol6/kyberNetwork.js

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2399,7 +2399,7 @@ contract('KyberNetwork', function(accounts) {
23992399
});
24002400
});
24012401

2402-
describe("test fee handler integrations with 1 mock and 1 apr", async() => {
2402+
describe("test fee handler integrations with 1 mock and 1 fpr", async() => {
24032403
let platformFee = new BN(200);
24042404
let reserveIdToWallet = [];
24052405
let rebateWallets;
@@ -2461,22 +2461,17 @@ contract('KyberNetwork', function(accounts) {
24612461
platformFeeWei = tradeWei.mul(platfromFeeBps).div(BPS);
24622462
Helper.assertEqual(await feeHandler.feePerPlatformWallet(platformWallet), beforePlatformFee.add(platformFeeWei), "unexpected rebate value");
24632463
networkFeeWei = tradeWei.mul(networkFeeBps).div(BPS).mul(feeAccountedBps).div(BPS);
2464-
let hasRebate = false;
2464+
rebateWei = zeroBN;
24652465
for (const [rebateWallet, beforeBalance] of Object.entries(beforeRebate)) {
24662466
if (rebateWallet in rebatePerWallet) {
2467+
rebateWei = rebateWei.add(rebatePerWallet[rebateWallet]);
24672468
Helper.assertApproximate(await feeHandler.rebatePerWallet(rebateWallet), beforeBalance.add(rebatePerWallet[rebateWallet]), "unexpected rebate value");
2468-
hasRebate = true;
24692469
}else {
24702470
Helper.assertApproximate(await feeHandler.rebatePerWallet(rebateWallet), beforeBalance, "unexpected rebate value");
24712471
}
24722472
}
2473-
if (hasRebate) {
2474-
totalPayout = platformFeeWei.add(networkFeeWei.mul(rewardInBPS).div(BPS)).add(networkFeeWei.mul(rebateInBPS).div(BPS));
2475-
} else {
2476-
totalPayout = platformFeeWei.add(networkFeeWei.mul(rewardInBPS).div(BPS));
2477-
}
2473+
totalPayout = platformFeeWei.add(networkFeeWei.mul(rewardInBPS).div(BPS)).add(rebateWei);
24782474
Helper.assertApproximate(await feeHandler.totalPayoutBalance(), beforeTotalBalancePayout.add(totalPayout), "unexpected payout balance");
2479-
24802475
}
24812476

24822477
it("e2t trade. see fee updated in fee handler.", async() => {
@@ -2516,7 +2511,7 @@ contract('KyberNetwork', function(accounts) {
25162511
await assertFeeHandlerUpdate(tradeEventArgs.ethWeiValue, platformFee, BPS, rebatePerWallet);
25172512
});
25182513

2519-
it("should have rebate given only to rebate entitled reserve.", async() => {
2514+
it("check that reserve rebate amount is correct", async() => {
25202515
await storage.setFeeAccountedPerReserveType(true, true, true, true, true, true, {from: admin});
25212516
// set rebate entitled true for FPR
25222517
await storage.setEntitledRebatePerReserveType(true, false, false, false, false, false, {from: admin});
@@ -2532,11 +2527,15 @@ contract('KyberNetwork', function(accounts) {
25322527
srcToken.address, destToken.address, srcQty);
25332528
txResult = await network.tradeWithHintAndFee(networkProxy, srcToken.address, srcQty, destToken.address, taker,
25342529
maxDestAmt, minConversionRate, platformWallet, platformFee, hint, {from: networkProxy});
2530+
25352531
// assert first rebateWallet is received enitled rebate value
25362532
let tradeEventArgs = nwHelper.getTradeEventArgs(txResult);
2537-
let rebatePerWallet = {}
2538-
let expectedRebate = new BN(tradeEventArgs.ethWeiValue).mul(networkFeeBps).div(BPS).mul(new BN(2)).mul(rebateInBPS).div(BPS);
2539-
rebatePerWallet[rebateWallets[0]] = expectedRebate
2533+
let rebatePerWallet = {};
2534+
let feeAccountedBps = new BN(2).mul(BPS);
2535+
let entitledRebateBps = BPS;
2536+
let networkFeeWei = new BN(tradeEventArgs.ethWeiValue).mul(networkFeeBps).div(BPS).mul(new BN(2));
2537+
let expectedRebateWei = networkFeeWei.mul(entitledRebateBps).div(feeAccountedBps).mul(rebateInBPS).div(BPS);;
2538+
rebatePerWallet[rebateWallets[0]] = expectedRebateWei;
25402539
await assertFeeHandlerUpdate(tradeEventArgs.ethWeiValue, platformFee, BPS.mul(new BN(2)), rebatePerWallet);
25412540
// revert changes
25422541
await storage.setEntitledRebatePerReserveType(true, true, true, true, true, true, {from: admin});

0 commit comments

Comments
 (0)